diff options
Diffstat (limited to 'arch/arm/mach-mmp')
56 files changed, 3307 insertions, 1006 deletions
diff --git a/arch/arm/mach-mmp/Kconfig b/arch/arm/mach-mmp/Kconfig index 0711d3b620a..ebdba87b967 100644 --- a/arch/arm/mach-mmp/Kconfig +++ b/arch/arm/mach-mmp/Kconfig @@ -37,25 +37,38 @@ config MACH_TTC_DKB  	  Say 'Y' here if you want to support the Marvell PXA910-based  	  TTC_DKB Development Board. +config MACH_BROWNSTONE +	bool "Marvell's Brownstone Development Platform" +	depends on !CPU_MOHAWK +	select CPU_MMP2 +	help +	  Say 'Y' here if you want to support the Marvell MMP2-based +	  Brown Development Platform. +	  MMP2-based board can't be co-existed with PXA168-based & +	  PXA910-based development board. Since MMP2 is compatible to +	  ARMv7 architecture. +  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  	  Flint Development Platform.  	  MMP2-based board can't be co-existed with PXA168-based &  	  PXA910-based development board. Since MMP2 is compatible to -	  ARMv6 architecture. +	  ARMv7 architecture.  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  	  Jasper Development Platform.  	  MMP2-based board can't be co-existed with PXA168-based &  	  PXA910-based development board. Since MMP2 is compatible to -	  ARMv6 architecture. +	  ARMv7 architecture.  config MACH_TETON_BGA  	bool "Marvell's PXA168 Teton BGA Development Board" @@ -64,24 +77,66 @@ config MACH_TETON_BGA  	  Say 'Y' here if you want to support the Marvell PXA168-based  	  Teton BGA Development Board. +config MACH_GPLUGD +	bool "Marvell's PXA168 GuruPlug Display (gplugD) Board" +	select CPU_PXA168 +	help +	  Say 'Y' here if you want to support the Marvell PXA168-based +	  GuruPlug Display (gplugD) Board + +config MACH_MMP_DT +	bool "Support MMP (ARMv5) platforms from device tree" +	select CPU_PXA168 +	select CPU_PXA910 +	select USE_OF +	select PINCTRL +	select PINCTRL_SINGLE +	help +	  Include support for Marvell MMP2 based platforms using +	  the device tree. Needn't select any other machine while +	  MACH_MMP_DT is enabled. + +config MACH_MMP2_DT +	bool "Support MMP2 (ARMv7) platforms from device tree" +	depends on !CPU_MOHAWK +	select CPU_MMP2 +	select USE_OF +	select PINCTRL +	select PINCTRL_SINGLE +	help +	  Include support for Marvell MMP2 based platforms using +	  the device tree. +  endmenu  config CPU_PXA168  	bool +	select COMMON_CLK  	select CPU_MOHAWK  	help  	  Select code specific to PXA168  config CPU_PXA910  	bool +	select COMMON_CLK  	select CPU_MOHAWK  	help  	  Select code specific to PXA910  config CPU_MMP2  	bool -	select CPU_V6 -	select CPU_32v6K +	select COMMON_CLK +	select CPU_PJ4  	help -	  Select code specific to MMP2. MMP2 is ARMv6 compatible. +	  Select code specific to MMP2. MMP2 is ARMv7 compatible. + +config USB_EHCI_MV_U2O +        bool "EHCI support for PXA USB OTG controller" +	depends on USB_EHCI_MV +	help +	  Enables support for OTG controller which can be switched to host mode. + +config MMP_SRAM +	bool +  endif diff --git a/arch/arm/mach-mmp/Makefile b/arch/arm/mach-mmp/Makefile index 751cdbf733c..98f0f6388e4 100644 --- a/arch/arm/mach-mmp/Makefile +++ b/arch/arm/mach-mmp/Makefile @@ -2,12 +2,24 @@  # Makefile for Marvell's PXA168 processors line  # -obj-y				+= common.o clock.o devices.o time.o +obj-y				+= common.o devices.o time.o  # SoC support -obj-$(CONFIG_CPU_PXA168)	+= pxa168.o irq-pxa168.o -obj-$(CONFIG_CPU_PXA910)	+= pxa910.o irq-pxa168.o -obj-$(CONFIG_CPU_MMP2)		+= mmp2.o irq-mmp2.o +obj-$(CONFIG_CPU_PXA168)	+= pxa168.o +obj-$(CONFIG_CPU_PXA910)	+= pxa910.o +obj-$(CONFIG_CPU_MMP2)		+= mmp2.o +obj-$(CONFIG_MMP_SRAM)		+= sram.o + +ifeq ($(CONFIG_COMMON_CLK), ) +obj-y				+= clock.o +obj-$(CONFIG_CPU_PXA168)	+= clock-pxa168.o +obj-$(CONFIG_CPU_PXA910)	+= clock-pxa910.o +obj-$(CONFIG_CPU_MMP2)		+= clock-mmp2.o +endif +ifeq ($(CONFIG_PM),y) +obj-$(CONFIG_CPU_PXA910)	+= pm-pxa910.o +obj-$(CONFIG_CPU_MMP2)		+= pm-mmp2.o +endif  # board support  obj-$(CONFIG_MACH_ASPENITE)	+= aspenite.o @@ -15,6 +27,10 @@ obj-$(CONFIG_MACH_ZYLONITE2)	+= aspenite.o  obj-$(CONFIG_MACH_AVENGERS_LITE)+= avengers_lite.o  obj-$(CONFIG_MACH_TAVOREVB)	+= tavorevb.o  obj-$(CONFIG_MACH_TTC_DKB)	+= ttc_dkb.o +obj-$(CONFIG_MACH_BROWNSTONE)	+= brownstone.o  obj-$(CONFIG_MACH_FLINT)	+= flint.o  obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o +obj-$(CONFIG_MACH_MMP_DT)	+= mmp-dt.o +obj-$(CONFIG_MACH_MMP2_DT)	+= mmp2-dt.o  obj-$(CONFIG_MACH_TETON_BGA)	+= teton_bga.o +obj-$(CONFIG_MACH_GPLUGD)	+= gplugd.o diff --git a/arch/arm/mach-mmp/Makefile.boot b/arch/arm/mach-mmp/Makefile.boot index 574a4aa8321..5edf03e2bee 100644 --- a/arch/arm/mach-mmp/Makefile.boot +++ b/arch/arm/mach-mmp/Makefile.boot @@ -1 +1 @@ -   zreladdr-y	:= 0x00008000 +   zreladdr-y	+= 0x00008000 diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 06b5fa853c9..7e0248582ef 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c @@ -8,7 +8,8 @@   *  it under the terms of the GNU General Public License version 2 as   *  publishhed by the Free Software Foundation.   */ - +#include <linux/gpio.h> +#include <linux/gpio-pxa.h>  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/platform_device.h> @@ -17,16 +18,17 @@  #include <linux/mtd/partitions.h>  #include <linux/mtd/nand.h>  #include <linux/interrupt.h> +#include <linux/platform_data/mv_usb.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <mach/addr-map.h>  #include <mach/mfp-pxa168.h>  #include <mach/pxa168.h> -#include <mach/gpio.h> +#include <mach/irqs.h>  #include <video/pxa168fb.h>  #include <linux/input.h> -#include <plat/pxa27x_keypad.h> +#include <linux/platform_data/keypad-pxa27x.h>  #include "common.h" @@ -109,6 +111,10 @@ static unsigned long common_pin_config[] __initdata = {  	GPIO121_KP_MKIN4,  }; +static struct pxa_gpio_platform_data pxa168_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; +  static struct smc91x_platdata smc91x_info = {  	.flags	= SMC91X_USE_16BIT | SMC91X_NOWAIT,  }; @@ -120,8 +126,8 @@ static struct resource smc91x_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= gpio_to_irq(27), -		.end	= gpio_to_irq(27), +		.start	= MMP_GPIO_TO_IRQ(27), +		.end	= MMP_GPIO_TO_IRQ(27),  		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,  	}  }; @@ -160,15 +166,16 @@ static struct mtd_partition aspenite_nand_partitions[] = {  	}, {  		.name		= "filesystem",  		.offset		= MTDPART_OFS_APPEND, -		.size		= SZ_48M, +		.size		= SZ_32M + SZ_16M,  		.mask_flags	= 0,  	}  };  static struct pxa3xx_nand_platform_data aspenite_nand_info = {  	.enable_arbiter	= 1, -	.parts		= aspenite_nand_partitions, -	.nr_parts	= ARRAY_SIZE(aspenite_nand_partitions), +	.num_cs = 1, +	.parts[0]	= aspenite_nand_partitions, +	.nr_parts[0]	= ARRAY_SIZE(aspenite_nand_partitions),  };  static struct i2c_board_info aspenite_i2c_info[] __initdata = { @@ -203,7 +210,7 @@ struct pxa168fb_mach_info aspenite_lcd_info = {  	.invert_pixclock	= 0,  }; -static unsigned int aspenite_matrix_key_map[] = { +static const unsigned int aspenite_matrix_key_map[] = {  	KEY(0, 6, KEY_UP),	/* SW 4 */  	KEY(0, 7, KEY_DOWN),	/* SW 5 */  	KEY(1, 6, KEY_LEFT),	/* SW 6 */ @@ -212,14 +219,27 @@ static unsigned int aspenite_matrix_key_map[] = {  	KEY(4, 7, KEY_ESC),	/* SW 9 */  }; +static struct matrix_keymap_data aspenite_matrix_keymap_data = { +	.keymap			= aspenite_matrix_key_map, +	.keymap_size		= ARRAY_SIZE(aspenite_matrix_key_map), +}; +  static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = {  	.matrix_key_rows	= 5,  	.matrix_key_cols	= 8, -	.matrix_key_map		= aspenite_matrix_key_map, -	.matrix_key_map_size	= ARRAY_SIZE(aspenite_matrix_key_map), +	.matrix_keymap_data	= &aspenite_matrix_keymap_data,  	.debounce_interval	= 30,  }; +#if IS_ENABLED(CONFIG_USB_EHCI_MV) +static struct mv_usb_platform_data pxa168_sph_pdata = { +	.mode           = MV_USB_MODE_HOST, +	.phy_init	= pxa_usb_phy_init, +	.phy_deinit	= pxa_usb_phy_deinit, +	.set_vbus	= NULL, +}; +#endif +  static void __init common_init(void)  {  	mfp_config(ARRAY_AND_SIZE(common_pin_config)); @@ -231,23 +251,32 @@ static void __init common_init(void)  	pxa168_add_nand(&aspenite_nand_info);  	pxa168_add_fb(&aspenite_lcd_info);  	pxa168_add_keypad(&aspenite_keypad_info); +	platform_device_add_data(&pxa168_device_gpio, &pxa168_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&pxa168_device_gpio);  	/* off-chip devices */  	platform_device_register(&smc91x_device); + +#if IS_ENABLED(CONFIG_USB_EHCI_MV) +	pxa168_add_usb_host(&pxa168_sph_pdata); +#endif  }  MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")  	.map_io		= mmp_map_io, -	.nr_irqs	= IRQ_BOARD_START, +	.nr_irqs	= MMP_NR_IRQS,  	.init_irq       = pxa168_init_irq, -	.timer          = &pxa168_timer, +	.init_time	= pxa168_timer_init,  	.init_machine   = common_init, +	.restart	= pxa168_restart,  MACHINE_END  MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform")  	.map_io		= mmp_map_io, -	.nr_irqs	= IRQ_BOARD_START, +	.nr_irqs	= MMP_NR_IRQS,  	.init_irq       = pxa168_init_irq, -	.timer          = &pxa168_timer, +	.init_time	= pxa168_timer_init,  	.init_machine   = common_init, +	.restart	= pxa168_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/avengers_lite.c b/arch/arm/mach-mmp/avengers_lite.c index 39f0878d64a..a451a0f4d51 100644 --- a/arch/arm/mach-mmp/avengers_lite.c +++ b/arch/arm/mach-mmp/avengers_lite.c @@ -12,6 +12,7 @@  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/gpio-pxa.h>  #include <linux/platform_device.h>  #include <asm/mach-types.h> @@ -32,17 +33,26 @@ static unsigned long avengers_lite_pin_config_V16F[] __initdata = {  	GPIO89_UART2_RXD,  }; +static struct pxa_gpio_platform_data pxa168_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; +  static void __init avengers_lite_init(void)  {  	mfp_config(ARRAY_AND_SIZE(avengers_lite_pin_config_V16F));  	/* on-chip devices */  	pxa168_add_uart(2); +	platform_device_add_data(&pxa168_device_gpio, &pxa168_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&pxa168_device_gpio);  }  MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform")  	.map_io		= mmp_map_io, +	.nr_irqs	= MMP_NR_IRQS,  	.init_irq       = pxa168_init_irq, -	.timer          = &pxa168_timer, +	.init_time	= pxa168_timer_init,  	.init_machine   = avengers_lite_init, +	.restart	= pxa168_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c new file mode 100644 index 00000000000..ac25544b8cd --- /dev/null +++ b/arch/arm/mach-mmp/brownstone.c @@ -0,0 +1,231 @@ +/* + *  linux/arch/arm/mach-mmp/brownstone.c + * + *  Support for the Marvell Brownstone Development Platform. + * + *  Copyright (C) 2009-2010 Marvell International Ltd. + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License version 2 as + *  publishhed by the Free Software Foundation. + */ + +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/io.h> +#include <linux/gpio-pxa.h> +#include <linux/regulator/machine.h> +#include <linux/regulator/max8649.h> +#include <linux/regulator/fixed.h> +#include <linux/mfd/max8925.h> + +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <mach/addr-map.h> +#include <mach/mfp-mmp2.h> +#include <mach/mmp2.h> +#include <mach/irqs.h> + +#include "common.h" + +#define BROWNSTONE_NR_IRQS	(MMP_NR_IRQS + 40) + +#define GPIO_5V_ENABLE		(89) + +static unsigned long brownstone_pin_config[] __initdata = { +	/* UART1 */ +	GPIO29_UART1_RXD, +	GPIO30_UART1_TXD, + +	/* UART3 */ +	GPIO51_UART3_RXD, +	GPIO52_UART3_TXD, + +	/* DFI */ +	GPIO168_DFI_D0, +	GPIO167_DFI_D1, +	GPIO166_DFI_D2, +	GPIO165_DFI_D3, +	GPIO107_DFI_D4, +	GPIO106_DFI_D5, +	GPIO105_DFI_D6, +	GPIO104_DFI_D7, +	GPIO111_DFI_D8, +	GPIO164_DFI_D9, +	GPIO163_DFI_D10, +	GPIO162_DFI_D11, +	GPIO161_DFI_D12, +	GPIO110_DFI_D13, +	GPIO109_DFI_D14, +	GPIO108_DFI_D15, +	GPIO143_ND_nCS0, +	GPIO144_ND_nCS1, +	GPIO147_ND_nWE, +	GPIO148_ND_nRE, +	GPIO150_ND_ALE, +	GPIO149_ND_CLE, +	GPIO112_ND_RDY0, +	GPIO160_ND_RDY1, + +	/* PMIC */ +	PMIC_PMIC_INT | MFP_LPM_EDGE_FALL, + +	/* MMC0 */ +	GPIO131_MMC1_DAT3 | MFP_PULL_HIGH, +	GPIO132_MMC1_DAT2 | MFP_PULL_HIGH, +	GPIO133_MMC1_DAT1 | MFP_PULL_HIGH, +	GPIO134_MMC1_DAT0 | MFP_PULL_HIGH, +	GPIO136_MMC1_CMD | MFP_PULL_HIGH, +	GPIO139_MMC1_CLK, +	GPIO140_MMC1_CD | MFP_PULL_LOW, +	GPIO141_MMC1_WP | MFP_PULL_LOW, + +	/* MMC1 */ +	GPIO37_MMC2_DAT3 | MFP_PULL_HIGH, +	GPIO38_MMC2_DAT2 | MFP_PULL_HIGH, +	GPIO39_MMC2_DAT1 | MFP_PULL_HIGH, +	GPIO40_MMC2_DAT0 | MFP_PULL_HIGH, +	GPIO41_MMC2_CMD | MFP_PULL_HIGH, +	GPIO42_MMC2_CLK, + +	/* MMC2 */ +	GPIO165_MMC3_DAT7 | MFP_PULL_HIGH, +	GPIO162_MMC3_DAT6 | MFP_PULL_HIGH, +	GPIO166_MMC3_DAT5 | MFP_PULL_HIGH, +	GPIO163_MMC3_DAT4 | MFP_PULL_HIGH, +	GPIO167_MMC3_DAT3 | MFP_PULL_HIGH, +	GPIO164_MMC3_DAT2 | MFP_PULL_HIGH, +	GPIO168_MMC3_DAT1 | MFP_PULL_HIGH, +	GPIO111_MMC3_DAT0 | MFP_PULL_HIGH, +	GPIO112_MMC3_CMD | MFP_PULL_HIGH, +	GPIO151_MMC3_CLK, + +	/* 5V regulator */ +	GPIO89_GPIO, +}; + +static struct pxa_gpio_platform_data mmp2_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; + +static struct regulator_consumer_supply max8649_supply[] = { +	REGULATOR_SUPPLY("vcc_core", NULL), +}; + +static struct regulator_init_data max8649_init_data = { +	.constraints	= { +		.name		= "vcc_core range", +		.min_uV		= 1150000, +		.max_uV		= 1280000, +		.always_on	= 1, +		.boot_on	= 1, +		.valid_ops_mask	= REGULATOR_CHANGE_VOLTAGE, +	}, +	.num_consumer_supplies	= 1, +	.consumer_supplies	= &max8649_supply[0], +}; + +static struct max8649_platform_data brownstone_max8649_info = { +	.mode		= 2,	/* VID1 = 1, VID0 = 0 */ +	.extclk		= 0, +	.ramp_timing	= MAX8649_RAMP_32MV, +	.regulator	= &max8649_init_data, +}; + +static struct regulator_consumer_supply brownstone_v_5vp_supplies[] = { +	REGULATOR_SUPPLY("v_5vp", NULL), +}; + +static struct regulator_init_data brownstone_v_5vp_data = { +	.constraints	= { +		.valid_ops_mask		= REGULATOR_CHANGE_STATUS, +	}, +	.num_consumer_supplies	= ARRAY_SIZE(brownstone_v_5vp_supplies), +	.consumer_supplies	= brownstone_v_5vp_supplies, +}; + +static struct fixed_voltage_config brownstone_v_5vp = { +	.supply_name		= "v_5vp", +	.microvolts		= 5000000, +	.gpio			= GPIO_5V_ENABLE, +	.enable_high		= 1, +	.enabled_at_boot	= 1, +	.init_data		= &brownstone_v_5vp_data, +}; + +static struct platform_device brownstone_v_5vp_device = { +	.name		= "reg-fixed-voltage", +	.id		= 1, +	.dev = { +		.platform_data = &brownstone_v_5vp, +	}, +}; + +static struct max8925_platform_data brownstone_max8925_info = { +	.irq_base		= MMP_NR_IRQS, +}; + +static struct i2c_board_info brownstone_twsi1_info[] = { +	[0] = { +		.type		= "max8649", +		.addr		= 0x60, +		.platform_data	= &brownstone_max8649_info, +	}, +	[1] = { +		.type		= "max8925", +		.addr		= 0x3c, +		.irq		= IRQ_MMP2_PMIC, +		.platform_data	= &brownstone_max8925_info, +	}, +}; + +static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = { +	.clk_delay_cycles = 0x1f, +}; + +static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = { +	.clk_delay_cycles = 0x1f, +	.flags = PXA_FLAG_CARD_PERMANENT +		| PXA_FLAG_SD_8_BIT_CAPABLE_SLOT, +}; + +static struct sram_platdata mmp2_asram_platdata = { +	.pool_name	= "asram", +	.granularity	= SRAM_GRANULARITY, +}; + +static struct sram_platdata mmp2_isram_platdata = { +	.pool_name	= "isram", +	.granularity	= SRAM_GRANULARITY, +}; + +static void __init brownstone_init(void) +{ +	mfp_config(ARRAY_AND_SIZE(brownstone_pin_config)); + +	/* on-chip devices */ +	mmp2_add_uart(1); +	mmp2_add_uart(3); +	platform_device_add_data(&mmp2_device_gpio, &mmp2_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&mmp2_device_gpio); +	mmp2_add_twsi(1, NULL, ARRAY_AND_SIZE(brownstone_twsi1_info)); +	mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */ +	mmp2_add_sdhost(2, &mmp2_sdh_platdata_mmc2); /* eMMC */ +	mmp2_add_asram(&mmp2_asram_platdata); +	mmp2_add_isram(&mmp2_isram_platdata); + +	/* enable 5v regulator */ +	platform_device_register(&brownstone_v_5vp_device); +} + +MACHINE_START(BROWNSTONE, "Brownstone Development Platform") +	/* Maintainer: Haojian Zhuang <haojian.zhuang@marvell.com> */ +	.map_io		= mmp_map_io, +	.nr_irqs	= BROWNSTONE_NR_IRQS, +	.init_irq	= mmp2_init_irq, +	.init_time	= mmp2_timer_init, +	.init_machine	= brownstone_init, +	.restart	= mmp_restart, +MACHINE_END diff --git a/arch/arm/mach-mmp/clock-mmp2.c b/arch/arm/mach-mmp/clock-mmp2.c new file mode 100644 index 00000000000..53d77cbd600 --- /dev/null +++ b/arch/arm/mach-mmp/clock-mmp2.c @@ -0,0 +1,111 @@ +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/list.h> +#include <linux/io.h> +#include <linux/clk.h> + +#include <mach/addr-map.h> + +#include "common.h" +#include "clock.h" + +/* + * APB Clock register offsets for MMP2 + */ +#define APBC_RTC	APBC_REG(0x000) +#define APBC_TWSI1	APBC_REG(0x004) +#define APBC_TWSI2	APBC_REG(0x008) +#define APBC_TWSI3	APBC_REG(0x00c) +#define APBC_TWSI4	APBC_REG(0x010) +#define APBC_KPC	APBC_REG(0x018) +#define APBC_UART1	APBC_REG(0x02c) +#define APBC_UART2	APBC_REG(0x030) +#define APBC_UART3	APBC_REG(0x034) +#define APBC_GPIO	APBC_REG(0x038) +#define APBC_PWM0	APBC_REG(0x03c) +#define APBC_PWM1	APBC_REG(0x040) +#define APBC_PWM2	APBC_REG(0x044) +#define APBC_PWM3	APBC_REG(0x048) +#define APBC_SSP0	APBC_REG(0x04c) +#define APBC_SSP1	APBC_REG(0x050) +#define APBC_SSP2	APBC_REG(0x054) +#define APBC_SSP3	APBC_REG(0x058) +#define APBC_SSP4	APBC_REG(0x05c) +#define APBC_SSP5	APBC_REG(0x060) +#define APBC_TWSI5	APBC_REG(0x07c) +#define APBC_TWSI6	APBC_REG(0x080) +#define APBC_UART4	APBC_REG(0x088) + +#define APMU_USB	APMU_REG(0x05c) +#define APMU_NAND	APMU_REG(0x060) +#define APMU_SDH0	APMU_REG(0x054) +#define APMU_SDH1	APMU_REG(0x058) +#define APMU_SDH2	APMU_REG(0x0e8) +#define APMU_SDH3	APMU_REG(0x0ec) + +static void sdhc_clk_enable(struct clk *clk) +{ +	uint32_t clk_rst; + +	clk_rst  =  __raw_readl(clk->clk_rst); +	clk_rst |= clk->enable_val; +	__raw_writel(clk_rst, clk->clk_rst); +} + +static void sdhc_clk_disable(struct clk *clk) +{ +	uint32_t clk_rst; + +	clk_rst  =  __raw_readl(clk->clk_rst); +	clk_rst &= ~clk->enable_val; +	__raw_writel(clk_rst, clk->clk_rst); +} + +struct clkops sdhc_clk_ops = { +	.enable		= sdhc_clk_enable, +	.disable	= sdhc_clk_disable, +}; + +/* APB peripheral clocks */ +static APBC_CLK(uart1, UART1, 1, 26000000); +static APBC_CLK(uart2, UART2, 1, 26000000); +static APBC_CLK(uart3, UART3, 1, 26000000); +static APBC_CLK(uart4, UART4, 1, 26000000); +static APBC_CLK(twsi1, TWSI1, 0, 26000000); +static APBC_CLK(twsi2, TWSI2, 0, 26000000); +static APBC_CLK(twsi3, TWSI3, 0, 26000000); +static APBC_CLK(twsi4, TWSI4, 0, 26000000); +static APBC_CLK(twsi5, TWSI5, 0, 26000000); +static APBC_CLK(twsi6, TWSI6, 0, 26000000); +static APBC_CLK(gpio, GPIO, 0, 26000000); + +static APMU_CLK(nand, NAND, 0xbf, 100000000); +static APMU_CLK_OPS(sdh0, SDH0, 0x1b, 200000000, &sdhc_clk_ops); +static APMU_CLK_OPS(sdh1, SDH1, 0x1b, 200000000, &sdhc_clk_ops); +static APMU_CLK_OPS(sdh2, SDH2, 0x1b, 200000000, &sdhc_clk_ops); +static APMU_CLK_OPS(sdh3, SDH3, 0x1b, 200000000, &sdhc_clk_ops); + +static struct clk_lookup mmp2_clkregs[] = { +	INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL), +	INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL), +	INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL), +	INIT_CLKREG(&clk_uart4, "pxa2xx-uart.3", NULL), +	INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.0", NULL), +	INIT_CLKREG(&clk_twsi2, "pxa2xx-i2c.1", NULL), +	INIT_CLKREG(&clk_twsi3, "pxa2xx-i2c.2", NULL), +	INIT_CLKREG(&clk_twsi4, "pxa2xx-i2c.3", NULL), +	INIT_CLKREG(&clk_twsi5, "pxa2xx-i2c.4", NULL), +	INIT_CLKREG(&clk_twsi6, "pxa2xx-i2c.5", NULL), +	INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), +	INIT_CLKREG(&clk_gpio, "mmp2-gpio", NULL), +	INIT_CLKREG(&clk_sdh0, "sdhci-pxav3.0", "PXA-SDHCLK"), +	INIT_CLKREG(&clk_sdh1, "sdhci-pxav3.1", "PXA-SDHCLK"), +	INIT_CLKREG(&clk_sdh2, "sdhci-pxav3.2", "PXA-SDHCLK"), +	INIT_CLKREG(&clk_sdh3, "sdhci-pxav3.3", "PXA-SDHCLK"), +}; + +void __init mmp2_clk_init(void) +{ +	clkdev_add_table(ARRAY_AND_SIZE(mmp2_clkregs)); +} diff --git a/arch/arm/mach-mmp/clock-pxa168.c b/arch/arm/mach-mmp/clock-pxa168.c new file mode 100644 index 00000000000..c572f219ae2 --- /dev/null +++ b/arch/arm/mach-mmp/clock-pxa168.c @@ -0,0 +1,91 @@ +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/list.h> +#include <linux/io.h> +#include <linux/clk.h> + +#include <mach/addr-map.h> + +#include "common.h" +#include "clock.h" + +/* + * APB clock register offsets for PXA168 + */ +#define APBC_UART1	APBC_REG(0x000) +#define APBC_UART2	APBC_REG(0x004) +#define APBC_GPIO	APBC_REG(0x008) +#define APBC_PWM1	APBC_REG(0x00c) +#define APBC_PWM2	APBC_REG(0x010) +#define APBC_PWM3	APBC_REG(0x014) +#define APBC_PWM4	APBC_REG(0x018) +#define APBC_RTC	APBC_REG(0x028) +#define APBC_TWSI0	APBC_REG(0x02c) +#define APBC_KPC	APBC_REG(0x030) +#define APBC_TWSI1	APBC_REG(0x06c) +#define APBC_UART3	APBC_REG(0x070) +#define APBC_SSP1	APBC_REG(0x81c) +#define APBC_SSP2	APBC_REG(0x820) +#define APBC_SSP3	APBC_REG(0x84c) +#define APBC_SSP4	APBC_REG(0x858) +#define APBC_SSP5	APBC_REG(0x85c) + +#define APMU_NAND	APMU_REG(0x060) +#define APMU_LCD	APMU_REG(0x04c) +#define APMU_ETH	APMU_REG(0x0fc) +#define APMU_USB	APMU_REG(0x05c) + +/* APB peripheral clocks */ +static APBC_CLK(uart1, UART1, 1, 14745600); +static APBC_CLK(uart2, UART2, 1, 14745600); +static APBC_CLK(uart3, UART3, 1, 14745600); +static APBC_CLK(twsi0, TWSI0, 1, 33000000); +static APBC_CLK(twsi1, TWSI1, 1, 33000000); +static APBC_CLK(pwm1, PWM1, 1, 13000000); +static APBC_CLK(pwm2, PWM2, 1, 13000000); +static APBC_CLK(pwm3, PWM3, 1, 13000000); +static APBC_CLK(pwm4, PWM4, 1, 13000000); +static APBC_CLK(ssp1, SSP1, 4, 0); +static APBC_CLK(ssp2, SSP2, 4, 0); +static APBC_CLK(ssp3, SSP3, 4, 0); +static APBC_CLK(ssp4, SSP4, 4, 0); +static APBC_CLK(ssp5, SSP5, 4, 0); +static APBC_CLK(gpio, GPIO, 0, 13000000); +static APBC_CLK(keypad, KPC, 0, 32000); +static APBC_CLK(rtc, RTC, 8, 32768); + +static APMU_CLK(nand, NAND, 0x19b, 156000000); +static APMU_CLK(lcd, LCD, 0x7f, 312000000); +static APMU_CLK(eth, ETH, 0x09, 0); +static APMU_CLK(usb, USB, 0x12, 0); + +/* device and clock bindings */ +static struct clk_lookup pxa168_clkregs[] = { +	INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL), +	INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL), +	INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL), +	INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL), +	INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL), +	INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL), +	INIT_CLKREG(&clk_pwm2, "pxa168-pwm.1", NULL), +	INIT_CLKREG(&clk_pwm3, "pxa168-pwm.2", NULL), +	INIT_CLKREG(&clk_pwm4, "pxa168-pwm.3", NULL), +	INIT_CLKREG(&clk_ssp1, "pxa168-ssp.0", NULL), +	INIT_CLKREG(&clk_ssp2, "pxa168-ssp.1", NULL), +	INIT_CLKREG(&clk_ssp3, "pxa168-ssp.2", NULL), +	INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), +	INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), +	INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), +	INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), +	INIT_CLKREG(&clk_gpio, "mmp-gpio", NULL), +	INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL), +	INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"), +	INIT_CLKREG(&clk_usb, NULL, "PXA168-USBCLK"), +	INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL), +}; + +void __init pxa168_clk_init(void) +{ +	clkdev_add_table(ARRAY_AND_SIZE(pxa168_clkregs)); +} diff --git a/arch/arm/mach-mmp/clock-pxa910.c b/arch/arm/mach-mmp/clock-pxa910.c new file mode 100644 index 00000000000..379e1df61c7 --- /dev/null +++ b/arch/arm/mach-mmp/clock-pxa910.c @@ -0,0 +1,67 @@ +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/list.h> +#include <linux/io.h> +#include <linux/clk.h> + +#include <mach/addr-map.h> + +#include "common.h" +#include "clock.h" + +/* + * APB Clock register offsets for PXA910 + */ +#define APBC_UART0	APBC_REG(0x000) +#define APBC_UART1	APBC_REG(0x004) +#define APBC_GPIO	APBC_REG(0x008) +#define APBC_PWM1	APBC_REG(0x00c) +#define APBC_PWM2	APBC_REG(0x010) +#define APBC_PWM3	APBC_REG(0x014) +#define APBC_PWM4	APBC_REG(0x018) +#define APBC_SSP1	APBC_REG(0x01c) +#define APBC_SSP2	APBC_REG(0x020) +#define APBC_RTC	APBC_REG(0x028) +#define APBC_TWSI0	APBC_REG(0x02c) +#define APBC_KPC	APBC_REG(0x030) +#define APBC_SSP3	APBC_REG(0x04c) +#define APBC_TWSI1	APBC_REG(0x06c) + +#define APMU_NAND	APMU_REG(0x060) +#define APMU_USB	APMU_REG(0x05c) + +static APBC_CLK(uart1, UART0, 1, 14745600); +static APBC_CLK(uart2, UART1, 1, 14745600); +static APBC_CLK(twsi0, TWSI0, 1, 33000000); +static APBC_CLK(twsi1, TWSI1, 1, 33000000); +static APBC_CLK(pwm1, PWM1, 1, 13000000); +static APBC_CLK(pwm2, PWM2, 1, 13000000); +static APBC_CLK(pwm3, PWM3, 1, 13000000); +static APBC_CLK(pwm4, PWM4, 1, 13000000); +static APBC_CLK(gpio, GPIO, 0, 13000000); +static APBC_CLK(rtc, RTC, 8, 32768); + +static APMU_CLK(nand, NAND, 0x19b, 156000000); +static APMU_CLK(u2o, USB, 0x1b, 480000000); + +/* device and clock bindings */ +static struct clk_lookup pxa910_clkregs[] = { +	INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL), +	INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL), +	INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL), +	INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL), +	INIT_CLKREG(&clk_pwm1, "pxa910-pwm.0", NULL), +	INIT_CLKREG(&clk_pwm2, "pxa910-pwm.1", NULL), +	INIT_CLKREG(&clk_pwm3, "pxa910-pwm.2", NULL), +	INIT_CLKREG(&clk_pwm4, "pxa910-pwm.3", NULL), +	INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), +	INIT_CLKREG(&clk_gpio, "mmp-gpio", NULL), +	INIT_CLKREG(&clk_u2o, NULL, "U2OCLK"), +	INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL), +}; + +void __init pxa910_clk_init(void) +{ +	clkdev_add_table(ARRAY_AND_SIZE(pxa910_clkregs)); +} diff --git a/arch/arm/mach-mmp/clock.c b/arch/arm/mach-mmp/clock.c index 886e05648f0..7c6f95f2914 100644 --- a/arch/arm/mach-mmp/clock.c +++ b/arch/arm/mach-mmp/clock.c @@ -88,3 +88,18 @@ unsigned long clk_get_rate(struct clk *clk)  	return rate;  }  EXPORT_SYMBOL(clk_get_rate); + +int clk_set_rate(struct clk *clk, unsigned long rate) +{ +	unsigned long flags; +	int ret = -EINVAL; + +	if (clk->ops->setrate) { +		spin_lock_irqsave(&clocks_lock, flags); +		ret = clk->ops->setrate(clk, rate); +		spin_unlock_irqrestore(&clocks_lock, flags); +	} + +	return ret; +} +EXPORT_SYMBOL(clk_set_rate); diff --git a/arch/arm/mach-mmp/clock.h b/arch/arm/mach-mmp/clock.h index 016ae94691c..149b30cd146 100644 --- a/arch/arm/mach-mmp/clock.h +++ b/arch/arm/mach-mmp/clock.h @@ -6,12 +6,13 @@   *  published by the Free Software Foundation.   */ -#include <asm/clkdev.h> +#include <linux/clkdev.h>  struct clkops {  	void			(*enable)(struct clk *);  	void			(*disable)(struct clk *);  	unsigned long		(*getrate)(struct clk *); +	int			(*setrate)(struct clk *, unsigned long);  };  struct clk { @@ -29,7 +30,7 @@ extern struct clkops apmu_clk_ops;  #define APBC_CLK(_name, _reg, _fnclksel, _rate)			\  struct clk clk_##_name = {					\ -		.clk_rst	= (void __iomem *)APBC_##_reg,	\ +		.clk_rst	= APBC_##_reg,			\  		.fnclksel	= _fnclksel,			\  		.rate		= _rate,			\  		.ops		= &apbc_clk_ops,		\ @@ -37,7 +38,7 @@ struct clk clk_##_name = {					\  #define APBC_CLK_OPS(_name, _reg, _fnclksel, _rate, _ops)	\  struct clk clk_##_name = {					\ -		.clk_rst	= (void __iomem *)APBC_##_reg,	\ +		.clk_rst	= APBC_##_reg,			\  		.fnclksel	= _fnclksel,			\  		.rate		= _rate,			\  		.ops		= _ops,				\ @@ -45,7 +46,7 @@ struct clk clk_##_name = {					\  #define APMU_CLK(_name, _reg, _eval, _rate)			\  struct clk clk_##_name = {					\ -		.clk_rst	= (void __iomem *)APMU_##_reg,	\ +		.clk_rst	= APMU_##_reg,			\  		.enable_val	= _eval,			\  		.rate		= _rate,			\  		.ops		= &apmu_clk_ops,		\ @@ -53,7 +54,7 @@ struct clk clk_##_name = {					\  #define APMU_CLK_OPS(_name, _reg, _eval, _rate, _ops)		\  struct clk clk_##_name = {					\ -		.clk_rst	= (void __iomem *)APMU_##_reg,	\ +		.clk_rst	= APMU_##_reg,			\  		.enable_val	= _eval,			\  		.rate		= _rate,			\  		.ops		= _ops,				\ diff --git a/arch/arm/mach-mmp/common.c b/arch/arm/mach-mmp/common.c index 0ec0ca80bb3..c03b4ab582d 100644 --- a/arch/arm/mach-mmp/common.c +++ b/arch/arm/mach-mmp/common.c @@ -14,6 +14,7 @@  #include <asm/page.h>  #include <asm/mach/map.h> +#include <asm/system_misc.h>  #include <mach/addr-map.h>  #include <mach/cputype.h> @@ -27,12 +28,12 @@ EXPORT_SYMBOL(mmp_chip_id);  static struct map_desc standard_io_desc[] __initdata = {  	{  		.pfn		= __phys_to_pfn(APB_PHYS_BASE), -		.virtual	= APB_VIRT_BASE, +		.virtual	= (unsigned long)APB_VIRT_BASE,  		.length		= APB_PHYS_SIZE,  		.type		= MT_DEVICE,  	}, {  		.pfn		= __phys_to_pfn(AXI_PHYS_BASE), -		.virtual	= AXI_VIRT_BASE, +		.virtual	= (unsigned long)AXI_VIRT_BASE,  		.length		= AXI_PHYS_SIZE,  		.type		= MT_DEVICE,  	}, @@ -45,3 +46,8 @@ void __init mmp_map_io(void)  	/* this is early, initialize mmp_chip_id here */  	mmp_chip_id = __raw_readl(MMP_CHIPID);  } + +void mmp_restart(enum reboot_mode mode, const char *cmd) +{ +	soft_restart(0); +} diff --git a/arch/arm/mach-mmp/common.h b/arch/arm/mach-mmp/common.h index ec8d65ded25..cf445bae6d7 100644 --- a/arch/arm/mach-mmp/common.h +++ b/arch/arm/mach-mmp/common.h @@ -1,8 +1,10 @@ +#include <linux/reboot.h>  #define ARRAY_AND_SIZE(x)	(x), ARRAY_SIZE(x) -struct sys_timer; -  extern void timer_init(int irq); -extern void __init icu_init_irq(void);  extern void __init mmp_map_io(void); +extern void mmp_restart(enum reboot_mode, const char *); +extern void __init pxa168_clk_init(void); +extern void __init pxa910_clk_init(void); +extern void __init mmp2_clk_init(void); diff --git a/arch/arm/mach-mmp/devices.c b/arch/arm/mach-mmp/devices.c index 191d9dea873..2bcb766af05 100644 --- a/arch/arm/mach-mmp/devices.c +++ b/arch/arm/mach-mmp/devices.c @@ -9,9 +9,13 @@  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h> +#include <linux/delay.h>  #include <asm/irq.h> +#include <mach/irqs.h>  #include <mach/devices.h> +#include <mach/cputype.h> +#include <mach/regs-usb.h>  int __init pxa_register_device(struct pxa_device_desc *desc,  				void *data, size_t size) @@ -67,3 +71,281 @@ int __init pxa_register_device(struct pxa_device_desc *desc,  	return platform_device_add(pdev);  } + +#if IS_ENABLED(CONFIG_USB) || IS_ENABLED(CONFIG_USB_GADGET) + +/***************************************************************************** + * The registers read/write routines + *****************************************************************************/ + +static unsigned int u2o_get(void __iomem *base, unsigned int offset) +{ +	return readl_relaxed(base + offset); +} + +static void u2o_set(void __iomem *base, unsigned int offset, +		unsigned int value) +{ +	u32 reg; + +	reg = readl_relaxed(base + offset); +	reg |= value; +	writel_relaxed(reg, base + offset); +	readl_relaxed(base + offset); +} + +static void u2o_clear(void __iomem *base, unsigned int offset, +		unsigned int value) +{ +	u32 reg; + +	reg = readl_relaxed(base + offset); +	reg &= ~value; +	writel_relaxed(reg, base + offset); +	readl_relaxed(base + offset); +} + +static void u2o_write(void __iomem *base, unsigned int offset, +		unsigned int value) +{ +	writel_relaxed(value, base + offset); +	readl_relaxed(base + offset); +} + +#if IS_ENABLED(CONFIG_USB_MV_UDC) || IS_ENABLED(CONFIG_USB_EHCI_MV) + +#if IS_ENABLED(CONFIG_CPU_PXA910) || IS_ENABLED(CONFIG_CPU_PXA168) + +static DEFINE_MUTEX(phy_lock); +static int phy_init_cnt; + +static int usb_phy_init_internal(void __iomem *base) +{ +	int loops; + +	pr_info("Init usb phy!!!\n"); + +	/* Initialize the USB PHY power */ +	if (cpu_is_pxa910()) { +		u2o_set(base, UTMI_CTRL, (1<<UTMI_CTRL_INPKT_DELAY_SOF_SHIFT) +			| (1<<UTMI_CTRL_PU_REF_SHIFT)); +	} + +	u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT); +	u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT); + +	/* UTMI_PLL settings */ +	u2o_clear(base, UTMI_PLL, UTMI_PLL_PLLVDD18_MASK +		| UTMI_PLL_PLLVDD12_MASK | UTMI_PLL_PLLCALI12_MASK +		| UTMI_PLL_FBDIV_MASK | UTMI_PLL_REFDIV_MASK +		| UTMI_PLL_ICP_MASK | UTMI_PLL_KVCO_MASK); + +	u2o_set(base, UTMI_PLL, 0xee<<UTMI_PLL_FBDIV_SHIFT +		| 0xb<<UTMI_PLL_REFDIV_SHIFT | 3<<UTMI_PLL_PLLVDD18_SHIFT +		| 3<<UTMI_PLL_PLLVDD12_SHIFT | 3<<UTMI_PLL_PLLCALI12_SHIFT +		| 1<<UTMI_PLL_ICP_SHIFT | 3<<UTMI_PLL_KVCO_SHIFT); + +	/* UTMI_TX */ +	u2o_clear(base, UTMI_TX, UTMI_TX_REG_EXT_FS_RCAL_EN_MASK +		| UTMI_TX_TXVDD12_MASK | UTMI_TX_CK60_PHSEL_MASK +		| UTMI_TX_IMPCAL_VTH_MASK | UTMI_TX_REG_EXT_FS_RCAL_MASK +		| UTMI_TX_AMP_MASK); +	u2o_set(base, UTMI_TX, 3<<UTMI_TX_TXVDD12_SHIFT +		| 4<<UTMI_TX_CK60_PHSEL_SHIFT | 4<<UTMI_TX_IMPCAL_VTH_SHIFT +		| 8<<UTMI_TX_REG_EXT_FS_RCAL_SHIFT | 3<<UTMI_TX_AMP_SHIFT); + +	/* UTMI_RX */ +	u2o_clear(base, UTMI_RX, UTMI_RX_SQ_THRESH_MASK +		| UTMI_REG_SQ_LENGTH_MASK); +	u2o_set(base, UTMI_RX, 7<<UTMI_RX_SQ_THRESH_SHIFT +		| 2<<UTMI_REG_SQ_LENGTH_SHIFT); + +	/* UTMI_IVREF */ +	if (cpu_is_pxa168()) +		/* fixing Microsoft Altair board interface with NEC hub issue - +		 * Set UTMI_IVREF from 0x4a3 to 0x4bf */ +		u2o_write(base, UTMI_IVREF, 0x4bf); + +	/* toggle VCOCAL_START bit of UTMI_PLL */ +	udelay(200); +	u2o_set(base, UTMI_PLL, VCOCAL_START); +	udelay(40); +	u2o_clear(base, UTMI_PLL, VCOCAL_START); + +	/* toggle REG_RCAL_START bit of UTMI_TX */ +	udelay(400); +	u2o_set(base, UTMI_TX, REG_RCAL_START); +	udelay(40); +	u2o_clear(base, UTMI_TX, REG_RCAL_START); +	udelay(400); + +	/* Make sure PHY PLL is ready */ +	loops = 0; +	while ((u2o_get(base, UTMI_PLL) & PLL_READY) == 0) { +		mdelay(1); +		loops++; +		if (loops > 100) { +			printk(KERN_WARNING "calibrate timeout, UTMI_PLL %x\n", +				u2o_get(base, UTMI_PLL)); +			break; +		} +	} + +	if (cpu_is_pxa168()) { +		u2o_set(base, UTMI_RESERVE, 1 << 5); +		/* Turn on UTMI PHY OTG extension */ +		u2o_write(base, UTMI_OTG_ADDON, 1); +	} + +	return 0; +} + +static int usb_phy_deinit_internal(void __iomem *base) +{ +	pr_info("Deinit usb phy!!!\n"); + +	if (cpu_is_pxa168()) +		u2o_clear(base, UTMI_OTG_ADDON, UTMI_OTG_ADDON_OTG_ON); + +	u2o_clear(base, UTMI_CTRL, UTMI_CTRL_RXBUF_PDWN); +	u2o_clear(base, UTMI_CTRL, UTMI_CTRL_TXBUF_PDWN); +	u2o_clear(base, UTMI_CTRL, UTMI_CTRL_USB_CLK_EN); +	u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT); +	u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT); + +	return 0; +} + +int pxa_usb_phy_init(void __iomem *phy_reg) +{ +	mutex_lock(&phy_lock); +	if (phy_init_cnt++ == 0) +		usb_phy_init_internal(phy_reg); +	mutex_unlock(&phy_lock); +	return 0; +} + +void pxa_usb_phy_deinit(void __iomem *phy_reg) +{ +	WARN_ON(phy_init_cnt == 0); + +	mutex_lock(&phy_lock); +	if (--phy_init_cnt == 0) +		usb_phy_deinit_internal(phy_reg); +	mutex_unlock(&phy_lock); +} +#endif +#endif +#endif + +#if IS_ENABLED(CONFIG_USB_SUPPORT) +static u64 usb_dma_mask = ~(u32)0; + +#if IS_ENABLED(CONFIG_USB_MV_UDC) +struct resource pxa168_u2o_resources[] = { +	/* regbase */ +	[0] = { +		.start	= PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET, +		.end	= PXA168_U2O_REGBASE + USB_REG_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "capregs", +	}, +	/* phybase */ +	[1] = { +		.start	= PXA168_U2O_PHYBASE, +		.end	= PXA168_U2O_PHYBASE + USB_PHY_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "phyregs", +	}, +	[2] = { +		.start	= IRQ_PXA168_USB1, +		.end	= IRQ_PXA168_USB1, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +struct platform_device pxa168_device_u2o = { +	.name		= "mv-udc", +	.id		= -1, +	.resource	= pxa168_u2o_resources, +	.num_resources	= ARRAY_SIZE(pxa168_u2o_resources), +	.dev		=  { +		.dma_mask	= &usb_dma_mask, +		.coherent_dma_mask = 0xffffffff, +	} +}; +#endif /* CONFIG_USB_MV_UDC */ + +#if IS_ENABLED(CONFIG_USB_EHCI_MV_U2O) +struct resource pxa168_u2oehci_resources[] = { +	/* regbase */ +	[0] = { +		.start	= PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET, +		.end	= PXA168_U2O_REGBASE + USB_REG_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "capregs", +	}, +	/* phybase */ +	[1] = { +		.start	= PXA168_U2O_PHYBASE, +		.end	= PXA168_U2O_PHYBASE + USB_PHY_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "phyregs", +	}, +	[2] = { +		.start	= IRQ_PXA168_USB1, +		.end	= IRQ_PXA168_USB1, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +struct platform_device pxa168_device_u2oehci = { +	.name		= "pxa-u2oehci", +	.id		= -1, +	.dev		= { +		.dma_mask		= &usb_dma_mask, +		.coherent_dma_mask	= 0xffffffff, +	}, + +	.num_resources	= ARRAY_SIZE(pxa168_u2oehci_resources), +	.resource	= pxa168_u2oehci_resources, +}; +#endif + +#if IS_ENABLED(CONFIG_USB_MV_OTG) +struct resource pxa168_u2ootg_resources[] = { +	/* regbase */ +	[0] = { +		.start	= PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET, +		.end	= PXA168_U2O_REGBASE + USB_REG_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "capregs", +	}, +	/* phybase */ +	[1] = { +		.start	= PXA168_U2O_PHYBASE, +		.end	= PXA168_U2O_PHYBASE + USB_PHY_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "phyregs", +	}, +	[2] = { +		.start	= IRQ_PXA168_USB1, +		.end	= IRQ_PXA168_USB1, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +struct platform_device pxa168_device_u2ootg = { +	.name		= "mv-otg", +	.id		= -1, +	.dev  = { +		.dma_mask          = &usb_dma_mask, +		.coherent_dma_mask = 0xffffffff, +	}, + +	.num_resources	= ARRAY_SIZE(pxa168_u2ootg_resources), +	.resource      = pxa168_u2ootg_resources, +}; +#endif /* CONFIG_USB_MV_OTG */ + +#endif diff --git a/arch/arm/mach-mmp/flint.c b/arch/arm/mach-mmp/flint.c index bdeb6db4d49..6291c33d83e 100644 --- a/arch/arm/mach-mmp/flint.c +++ b/arch/arm/mach-mmp/flint.c @@ -16,6 +16,7 @@  #include <linux/smc91x.h>  #include <linux/io.h>  #include <linux/gpio.h> +#include <linux/gpio-pxa.h>  #include <linux/interrupt.h>  #include <asm/mach-types.h> @@ -23,10 +24,11 @@  #include <mach/addr-map.h>  #include <mach/mfp-mmp2.h>  #include <mach/mmp2.h> +#include <mach/irqs.h>  #include "common.h" -#define FLINT_NR_IRQS	(IRQ_BOARD_START + 48) +#define FLINT_NR_IRQS	(MMP_NR_IRQS + 48)  static unsigned long flint_pin_config[] __initdata = {  	/* UART1 */ @@ -47,7 +49,7 @@ static unsigned long flint_pin_config[] __initdata = {  	GPIO113_SMC_RDY,  	/*Ethernet*/ -	GPIO155_GPIO155, +	GPIO155_GPIO,  	/* DFI */  	GPIO168_DFI_D0, @@ -76,6 +78,10 @@ static unsigned long flint_pin_config[] __initdata = {  	GPIO160_ND_RDY1,  }; +static struct pxa_gpio_platform_data mmp2_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; +  static struct smc91x_platdata flint_smc91x_info = {  	.flags  = SMC91X_USE_16BIT | SMC91X_NOWAIT,  }; @@ -87,8 +93,8 @@ static struct resource smc91x_resources[] = {  		.flags  = IORESOURCE_MEM,  	},  	[1] = { -		.start  = gpio_to_irq(155), -		.end    = gpio_to_irq(155), +		.start  = MMP_GPIO_TO_IRQ(155), +		.end    = MMP_GPIO_TO_IRQ(155),  		.flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,  	}  }; @@ -110,6 +116,9 @@ static void __init flint_init(void)  	/* on-chip devices */  	mmp2_add_uart(1);  	mmp2_add_uart(2); +	platform_device_add_data(&mmp2_device_gpio, &mmp2_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&mmp2_device_gpio);  	/* off-chip devices */  	platform_device_register(&smc91x_device); @@ -119,6 +128,7 @@ MACHINE_START(FLINT, "Flint Development Platform")  	.map_io		= mmp_map_io,  	.nr_irqs	= FLINT_NR_IRQS,  	.init_irq       = mmp2_init_irq, -	.timer          = &mmp2_timer, +	.init_time	= mmp2_timer_init,  	.init_machine   = flint_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/gplugd.c b/arch/arm/mach-mmp/gplugd.c new file mode 100644 index 00000000000..d81b2475e67 --- /dev/null +++ b/arch/arm/mach-mmp/gplugd.c @@ -0,0 +1,208 @@ +/* + *  linux/arch/arm/mach-mmp/gplugd.c + * + *  Support for the Marvell PXA168-based GuruPlug Display (gplugD) Platform. + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License version 2 as + *  publishhed by the Free Software Foundation. + */ + +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/gpio.h> +#include <linux/gpio-pxa.h> + +#include <asm/mach/arch.h> +#include <asm/mach-types.h> + +#include <mach/irqs.h> +#include <mach/pxa168.h> +#include <mach/mfp-pxa168.h> + +#include "common.h" + +static unsigned long gplugd_pin_config[] __initdata = { +	/* UART3 */ +	GPIO8_UART3_TXD, +	GPIO9_UART3_RXD, +	GPIO1O_UART3_CTS, +	GPIO11_UART3_RTS, + +	/* USB OTG PEN */ +	GPIO18_GPIO, + +	/* MMC2 */ +	GPIO28_MMC2_CMD, +	GPIO29_MMC2_CLK, +	GPIO30_MMC2_DAT0, +	GPIO31_MMC2_DAT1, +	GPIO32_MMC2_DAT2, +	GPIO33_MMC2_DAT3, + +	/* LCD & HDMI clock selection GPIO: 0: 74.176MHz, 1: 74.25 MHz */ +	GPIO35_GPIO, +	GPIO36_GPIO, /* CEC Interrupt */ + +	/* MMC1 */ +	GPIO43_MMC1_CLK, +	GPIO49_MMC1_CMD, +	GPIO41_MMC1_DAT0, +	GPIO40_MMC1_DAT1, +	GPIO52_MMC1_DAT2, +	GPIO51_MMC1_DAT3, +	GPIO53_MMC1_CD, + +	/* LCD */ +	GPIO56_LCD_FCLK_RD, +	GPIO57_LCD_LCLK_A0, +	GPIO58_LCD_PCLK_WR, +	GPIO59_LCD_DENA_BIAS, +	GPIO60_LCD_DD0, +	GPIO61_LCD_DD1, +	GPIO62_LCD_DD2, +	GPIO63_LCD_DD3, +	GPIO64_LCD_DD4, +	GPIO65_LCD_DD5, +	GPIO66_LCD_DD6, +	GPIO67_LCD_DD7, +	GPIO68_LCD_DD8, +	GPIO69_LCD_DD9, +	GPIO70_LCD_DD10, +	GPIO71_LCD_DD11, +	GPIO72_LCD_DD12, +	GPIO73_LCD_DD13, +	GPIO74_LCD_DD14, +	GPIO75_LCD_DD15, +	GPIO76_LCD_DD16, +	GPIO77_LCD_DD17, +	GPIO78_LCD_DD18, +	GPIO79_LCD_DD19, +	GPIO80_LCD_DD20, +	GPIO81_LCD_DD21, +	GPIO82_LCD_DD22, +	GPIO83_LCD_DD23, + +	/* GPIO */ +	GPIO84_GPIO, +	GPIO85_GPIO, + +	/* Fast-Ethernet*/ +	GPIO86_TX_CLK, +	GPIO87_TX_EN, +	GPIO88_TX_DQ3, +	GPIO89_TX_DQ2, +	GPIO90_TX_DQ1, +	GPIO91_TX_DQ0, +	GPIO92_MII_CRS, +	GPIO93_MII_COL, +	GPIO94_RX_CLK, +	GPIO95_RX_ER, +	GPIO96_RX_DQ3, +	GPIO97_RX_DQ2, +	GPIO98_RX_DQ1, +	GPIO99_RX_DQ0, +	GPIO100_MII_MDC, +	GPIO101_MII_MDIO, +	GPIO103_RX_DV, +	GPIO104_GPIO,     /* Reset PHY */ + +	/* RTC interrupt */ +	GPIO102_GPIO, + +	/* I2C */ +	GPIO105_CI2C_SDA, +	GPIO106_CI2C_SCL, + +	/* SPI NOR Flash on SSP2 */ +	GPIO107_SSP2_RXD, +	GPIO108_SSP2_TXD, +	GPIO110_GPIO,     /* SPI_CSn */ +	GPIO111_SSP2_CLK, + +	/* Select JTAG */ +	GPIO109_GPIO, + +	/* I2S */ +	GPIO114_I2S_FRM, +	GPIO115_I2S_BCLK, +	GPIO116_I2S_TXD +}; + +static struct pxa_gpio_platform_data pxa168_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; + +static struct i2c_board_info gplugd_i2c_board_info[] = { +	{ +		.type = "isl1208", +		.addr = 0x6F, +	} +}; + +/* Bring PHY out of reset by setting GPIO 104 */ +static int gplugd_eth_init(void) +{ +	if (unlikely(gpio_request(104, "ETH_RESET_N"))) { +		printk(KERN_ERR "Can't get hold of GPIO 104 to bring Ethernet " +				"PHY out of reset\n"); +		return -EIO; +	} + +	gpio_direction_output(104, 1); +	gpio_free(104); +	return 0; +} + +struct pxa168_eth_platform_data gplugd_eth_platform_data = { +	.port_number = 0, +	.phy_addr    = 0, +	.speed       = 0, /* Autonagotiation */ +	.init        = gplugd_eth_init, +}; + +static void __init select_disp_freq(void) +{ +	/* set GPIO 35 & clear GPIO 85 to set LCD External Clock to 74.25 MHz */ +	if (unlikely(gpio_request(35, "DISP_FREQ_SEL"))) { +		printk(KERN_ERR "Can't get hold of GPIO 35 to select display " +				"frequency\n"); +	} else { +		gpio_direction_output(35, 1); +		gpio_free(35); +	} + +	if (unlikely(gpio_request(85, "DISP_FREQ_SEL_2"))) { +		printk(KERN_ERR "Can't get hold of GPIO 85 to select display " +				"frequency\n"); +	} else { +		gpio_direction_output(85, 0); +		gpio_free(85); +	} +} + +static void __init gplugd_init(void) +{ +	mfp_config(ARRAY_AND_SIZE(gplugd_pin_config)); + +	select_disp_freq(); + +	/* on-chip devices */ +	pxa168_add_uart(3); +	pxa168_add_ssp(1); +	pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(gplugd_i2c_board_info)); +	platform_device_add_data(&pxa168_device_gpio, &pxa168_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&pxa168_device_gpio); + +	pxa168_add_eth(&gplugd_eth_platform_data); +} + +MACHINE_START(GPLUGD, "PXA168-based GuruPlug Display (gplugD) Platform") +	.map_io		= mmp_map_io, +	.nr_irqs	= MMP_NR_IRQS, +	.init_irq       = pxa168_init_irq, +	.init_time	= pxa168_timer_init, +	.init_machine   = gplugd_init, +	.restart	= pxa168_restart, +MACHINE_END diff --git a/arch/arm/mach-mmp/include/mach/addr-map.h b/arch/arm/mach-mmp/include/mach/addr-map.h index 3254089a644..f88a44c0ef9 100644 --- a/arch/arm/mach-mmp/include/mach/addr-map.h +++ b/arch/arm/mach-mmp/include/mach/addr-map.h @@ -18,11 +18,11 @@   * peripherals on APB, let's count it into the ABP mapping area.   */  #define APB_PHYS_BASE		0xd4000000 -#define APB_VIRT_BASE		0xfe000000 +#define APB_VIRT_BASE		IOMEM(0xfe000000)  #define APB_PHYS_SIZE		0x00200000  #define AXI_PHYS_BASE		0xd4200000 -#define AXI_VIRT_BASE		0xfe200000 +#define AXI_VIRT_BASE		IOMEM(0xfe200000)  #define AXI_PHYS_SIZE		0x00200000  /* Static Memory Controller - Chip Select 0 and 1 */ @@ -31,4 +31,16 @@  #define SMC_CS1_PHYS_BASE	0x90000000  #define SMC_CS1_PHYS_SIZE	0x10000000 +#define APMU_VIRT_BASE		(AXI_VIRT_BASE + 0x82800) +#define APMU_REG(x)		(APMU_VIRT_BASE + (x)) + +#define APBC_VIRT_BASE		(APB_VIRT_BASE + 0x015000) +#define APBC_REG(x)		(APBC_VIRT_BASE + (x)) + +#define MPMU_VIRT_BASE		(APB_VIRT_BASE + 0x50000) +#define MPMU_REG(x)		(MPMU_VIRT_BASE + (x)) + +#define CIU_VIRT_BASE		(AXI_VIRT_BASE + 0x82c00) +#define CIU_REG(x)		(CIU_VIRT_BASE + (x)) +  #endif /* __ASM_MACH_ADDR_MAP_H */ diff --git a/arch/arm/mach-mmp/include/mach/clkdev.h b/arch/arm/mach-mmp/include/mach/clkdev.h deleted file mode 100644 index 2fb354e54e0..00000000000 --- a/arch/arm/mach-mmp/include/mach/clkdev.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __ASM_MACH_CLKDEV_H -#define __ASM_MACH_CLKDEV_H - -#define __clk_get(clk) ({ 1; }) -#define __clk_put(clk) do { } while (0) - -#endif /* __ASM_MACH_CLKDEV_H */ diff --git a/arch/arm/mach-mmp/include/mach/debug-macro.S b/arch/arm/mach-mmp/include/mach/debug-macro.S deleted file mode 100644 index 7e2ebd3efc7..00000000000 --- a/arch/arm/mach-mmp/include/mach/debug-macro.S +++ /dev/null @@ -1,22 +0,0 @@ -/* arch/arm/mach-mmp/include/mach/debug-macro.S - * - * Debugging macro include header - * - *  Copied from arch/arm/mach-pxa/include/mach/debug.S - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <mach/addr-map.h> - -		.macro	addruart, rp, rv -		ldr	\rp, =APB_PHYS_BASE		@ physical -		ldr	\rv, =APB_VIRT_BASE		@ virtual -		orr	\rp, \rp, #0x00017000 -		orr	\rv, \rv, #0x00017000 -		.endm - -#define UART_SHIFT	2 -#include <asm/hardware/debug-8250.S> diff --git a/arch/arm/mach-mmp/include/mach/devices.h b/arch/arm/mach-mmp/include/mach/devices.h index d0ec7dae88e..21217ef11b6 100644 --- a/arch/arm/mach-mmp/include/mach/devices.h +++ b/arch/arm/mach-mmp/include/mach/devices.h @@ -50,4 +50,7 @@ struct pxa_device_desc mmp2_device_##_name __initdata = {		\  }  extern int pxa_register_device(struct pxa_device_desc *, void *, size_t); +extern int pxa_usb_phy_init(void __iomem *phy_reg); +extern void pxa_usb_phy_deinit(void __iomem *phy_reg); +  #endif /* __MACH_DEVICE_H */ diff --git a/arch/arm/mach-mmp/include/mach/entry-macro.S b/arch/arm/mach-mmp/include/mach/entry-macro.S deleted file mode 100644 index c42d9d4e892..00000000000 --- a/arch/arm/mach-mmp/include/mach/entry-macro.S +++ /dev/null @@ -1,30 +0,0 @@ -/* - * linux/arch/arm/mach-mmp/include/mach/entry-macro.S - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <mach/regs-icu.h> - -	.macro	disable_fiq -	.endm - -	.macro	arch_ret_to_user, tmp1, tmp2 -	.endm - -	.macro	get_irqnr_preamble, base, tmp -	mrc	p15, 0, \tmp, c0, c0, 0		@ CPUID -	and	\tmp, \tmp, #0xff00 -	cmp	\tmp, #0x5800 -	ldr	\base, =ICU_VIRT_BASE -	addne	\base, \base, #0x10c		@ PJ1 AP INT SEL register -	addeq	\base, \base, #0x104		@ PJ4 IRQ SEL register -	.endm - -	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp -	ldr	\tmp, [\base, #0] -	and	\irqnr, \tmp, #0x3f -	tst	\tmp, #(1 << 6) -	.endm diff --git a/arch/arm/mach-mmp/include/mach/gpio.h b/arch/arm/mach-mmp/include/mach/gpio.h deleted file mode 100644 index ee8b02ed801..00000000000 --- a/arch/arm/mach-mmp/include/mach/gpio.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __ASM_MACH_GPIO_H -#define __ASM_MACH_GPIO_H - -#include <mach/addr-map.h> -#include <mach/irqs.h> -#include <asm-generic/gpio.h> - -#define GPIO_REGS_VIRT	(APB_VIRT_BASE + 0x19000) - -#define BANK_OFF(n)	(((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2)) -#define GPIO_REG(x)	(*((volatile u32 *)(GPIO_REGS_VIRT + (x)))) - -#define NR_BUILTIN_GPIO	(192) - -#define gpio_to_bank(gpio)	((gpio) >> 5) -#define gpio_to_irq(gpio)	(IRQ_GPIO_START + (gpio)) -#define irq_to_gpio(irq)	((irq) - IRQ_GPIO_START) - - -#define __gpio_is_inverted(gpio)	(0) -#define __gpio_is_occupied(gpio)	(0) - -/* NOTE: these macros are defined here to make optimization of - * gpio_{get,set}_value() to work when 'gpio' is a constant. - * Usage of these macros otherwise is no longer recommended, - * use generic GPIO API whenever possible. - */ -#define GPIO_bit(gpio)	(1 << ((gpio) & 0x1f)) - -#define GPLR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x00) -#define GPDR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x0c) -#define GPSR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x18) -#define GPCR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x24) - -#include <plat/gpio.h> -#endif /* __ASM_MACH_GPIO_H */ diff --git a/arch/arm/mach-mmp/include/mach/io.h b/arch/arm/mach-mmp/include/mach/io.h deleted file mode 100644 index e7adf3d012c..00000000000 --- a/arch/arm/mach-mmp/include/mach/io.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * linux/arch/arm/mach-mmp/include/mach/io.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_MACH_IO_H -#define __ASM_MACH_IO_H - -#define IO_SPACE_LIMIT 0xffffffff - -/* - * We don't actually have real ISA nor PCI buses, but there is so many - * drivers out there that might just work if we fake them... - */ -#define __io(a)		__typesafe_io(a) -#define __mem_pci(a)	(a) - -#endif /* __ASM_MACH_IO_H */ diff --git a/arch/arm/mach-mmp/include/mach/irqs.h b/arch/arm/mach-mmp/include/mach/irqs.h index a09d328e2dd..fb492a50a81 100644 --- a/arch/arm/mach-mmp/include/mach/irqs.h +++ b/arch/arm/mach-mmp/include/mach/irqs.h @@ -125,7 +125,7 @@  #define IRQ_MMP2_RTC_MUX		5  #define IRQ_MMP2_TWSI1			7  #define IRQ_MMP2_GPU			8 -#define IRQ_MMP2_KEYPAD			9 +#define IRQ_MMP2_KEYPAD_MUX		9  #define IRQ_MMP2_ROTARY			10  #define IRQ_MMP2_TRACKBALL		11  #define IRQ_MMP2_ONEWIRE		12 @@ -163,11 +163,11 @@  #define IRQ_MMP2_DMA_FIQ		47  #define IRQ_MMP2_DMA_RIQ		48  #define IRQ_MMP2_GPIO			49 -#define IRQ_MMP2_SSP_MUX		51 +#define IRQ_MMP2_MIPI_HSI1_MUX		51  #define IRQ_MMP2_MMC2			52  #define IRQ_MMP2_MMC3			53  #define IRQ_MMP2_MMC4			54 -#define IRQ_MMP2_MIPI_HSI		55 +#define IRQ_MMP2_MIPI_HSI0_MUX		55  #define IRQ_MMP2_MSP			58  #define IRQ_MMP2_MIPI_SLIM_DMA		59  #define IRQ_MMP2_PJ4_FREQ_CHG		60 @@ -186,8 +186,14 @@  #define IRQ_MMP2_RTC_ALARM		(IRQ_MMP2_RTC_BASE + 0)  #define IRQ_MMP2_RTC			(IRQ_MMP2_RTC_BASE + 1) +/* secondary interrupt of INT #9 */ +#define IRQ_MMP2_KEYPAD_BASE		(IRQ_MMP2_RTC_BASE + 2) +#define IRQ_MMP2_KPC			(IRQ_MMP2_KEYPAD_BASE + 0) +#define IRQ_MMP2_ROTORY			(IRQ_MMP2_KEYPAD_BASE + 1) +#define IRQ_MMP2_TBALL			(IRQ_MMP2_KEYPAD_BASE + 2) +  /* secondary interrupt of INT #17 */ -#define IRQ_MMP2_TWSI_BASE		(IRQ_MMP2_RTC_BASE + 2) +#define IRQ_MMP2_TWSI_BASE		(IRQ_MMP2_KEYPAD_BASE + 3)  #define IRQ_MMP2_TWSI2			(IRQ_MMP2_TWSI_BASE + 0)  #define IRQ_MMP2_TWSI3			(IRQ_MMP2_TWSI_BASE + 1)  #define IRQ_MMP2_TWSI4			(IRQ_MMP2_TWSI_BASE + 2) @@ -212,18 +218,22 @@  #define IRQ_MMP2_COMMRX			(IRQ_MMP2_MISC_BASE + 14)  /* secondary interrupt of INT #51 */ -#define IRQ_MMP2_SSP_BASE		(IRQ_MMP2_MISC_BASE + 15) -#define IRQ_MMP2_SSP1_SRDY		(IRQ_MMP2_SSP_BASE + 0) -#define IRQ_MMP2_SSP3_SRDY		(IRQ_MMP2_SSP_BASE + 1) +#define IRQ_MMP2_MIPI_HSI1_BASE		(IRQ_MMP2_MISC_BASE + 15) +#define IRQ_MMP2_HSI1_CAWAKE		(IRQ_MMP2_MIPI_HSI1_BASE + 0) +#define IRQ_MMP2_MIPI_HSI_INT1		(IRQ_MMP2_MIPI_HSI1_BASE + 1) -#define IRQ_MMP2_MUX_END		(IRQ_MMP2_SSP_BASE + 2) +/* secondary interrupt of INT #55 */ +#define IRQ_MMP2_MIPI_HSI0_BASE		(IRQ_MMP2_MIPI_HSI1_BASE + 2) +#define IRQ_MMP2_HSI0_CAWAKE		(IRQ_MMP2_MIPI_HSI0_BASE + 0) +#define IRQ_MMP2_MIPI_HSI_INT0		(IRQ_MMP2_MIPI_HSI0_BASE + 1) -#define IRQ_GPIO_START			128 -#define IRQ_GPIO_NUM			192 -#define IRQ_GPIO(x)			(IRQ_GPIO_START + (x)) +#define IRQ_MMP2_MUX_END		(IRQ_MMP2_MIPI_HSI0_BASE + 2) -#define IRQ_BOARD_START			(IRQ_GPIO_START + IRQ_GPIO_NUM) +#define IRQ_GPIO_START			128 +#define MMP_NR_BUILTIN_GPIO		192 +#define MMP_GPIO_TO_IRQ(gpio)		(IRQ_GPIO_START + (gpio)) -#define NR_IRQS				(IRQ_BOARD_START) +#define IRQ_BOARD_START			(IRQ_GPIO_START + MMP_NR_BUILTIN_GPIO) +#define MMP_NR_IRQS			IRQ_BOARD_START  #endif /* __ASM_MACH_IRQS_H */ diff --git a/arch/arm/mach-mmp/include/mach/memory.h b/arch/arm/mach-mmp/include/mach/memory.h deleted file mode 100644 index bdb21d70714..00000000000 --- a/arch/arm/mach-mmp/include/mach/memory.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * linux/arch/arm/mach-mmp/include/mach/memory.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_MACH_MEMORY_H -#define __ASM_MACH_MEMORY_H - -#define PHYS_OFFSET	UL(0x00000000) - -#endif /* __ASM_MACH_MEMORY_H */ diff --git a/arch/arm/mach-mmp/include/mach/mfp-mmp2.h b/arch/arm/mach-mmp/include/mach/mfp-mmp2.h index 761c2dacc07..4ad38629c3f 100644 --- a/arch/arm/mach-mmp/include/mach/mfp-mmp2.h +++ b/arch/arm/mach-mmp/include/mach/mfp-mmp2.h @@ -6,178 +6,178 @@  #define MFP_DRIVE_VERY_SLOW	(0x0 << 13)  #define MFP_DRIVE_SLOW		(0x2 << 13)  #define MFP_DRIVE_MEDIUM	(0x4 << 13) -#define MFP_DRIVE_FAST		(0x8 << 13) +#define MFP_DRIVE_FAST		(0x6 << 13)  /* GPIO */ -#define GPIO0_GPIO0		MFP_CFG(GPIO0, AF0) -#define GPIO1_GPIO1		MFP_CFG(GPIO1, AF0) -#define GPIO2_GPIO2		MFP_CFG(GPIO2, AF0) -#define GPIO3_GPIO3		MFP_CFG(GPIO3, AF0) -#define GPIO4_GPIO4		MFP_CFG(GPIO4, AF0) -#define GPIO5_GPIO5		MFP_CFG(GPIO5, AF0) -#define GPIO6_GPIO6		MFP_CFG(GPIO6, AF0) -#define GPIO7_GPIO7		MFP_CFG(GPIO7, AF0) -#define GPIO8_GPIO8		MFP_CFG(GPIO8, AF0) -#define GPIO9_GPIO9		MFP_CFG(GPIO9, AF0) -#define GPIO10_GPIO10		MFP_CFG(GPIO10, AF0) -#define GPIO11_GPIO11		MFP_CFG(GPIO11, AF0) -#define GPIO12_GPIO12		MFP_CFG(GPIO12, AF0) -#define GPIO13_GPIO13		MFP_CFG(GPIO13, AF0) -#define GPIO14_GPIO14		MFP_CFG(GPIO14, AF0) -#define GPIO15_GPIO15		MFP_CFG(GPIO15, AF0) -#define GPIO16_GPIO16		MFP_CFG(GPIO16, AF0) -#define GPIO17_GPIO17		MFP_CFG(GPIO17, AF0) -#define GPIO18_GPIO18		MFP_CFG(GPIO18, AF0) -#define GPIO19_GPIO19		MFP_CFG(GPIO19, AF0) -#define GPIO20_GPIO20		MFP_CFG(GPIO20, AF0) -#define GPIO21_GPIO21		MFP_CFG(GPIO21, AF0) -#define GPIO22_GPIO22		MFP_CFG(GPIO22, AF0) -#define GPIO23_GPIO23		MFP_CFG(GPIO23, AF0) -#define GPIO24_GPIO24		MFP_CFG(GPIO24, AF0) -#define GPIO25_GPIO25		MFP_CFG(GPIO25, AF0) -#define GPIO26_GPIO26		MFP_CFG(GPIO26, AF0) -#define GPIO27_GPIO27		MFP_CFG(GPIO27, AF0) -#define GPIO28_GPIO28		MFP_CFG(GPIO28, AF0) -#define GPIO29_GPIO29		MFP_CFG(GPIO29, AF0) -#define GPIO30_GPIO30		MFP_CFG(GPIO30, AF0) -#define GPIO31_GPIO31		MFP_CFG(GPIO31, AF0) -#define GPIO32_GPIO32		MFP_CFG(GPIO32, AF0) -#define GPIO33_GPIO33		MFP_CFG(GPIO33, AF0) -#define GPIO34_GPIO34		MFP_CFG(GPIO34, AF0) -#define GPIO35_GPIO35		MFP_CFG(GPIO35, AF0) -#define GPIO36_GPIO36		MFP_CFG(GPIO36, AF0) -#define GPIO37_GPIO37		MFP_CFG(GPIO37, AF0) -#define GPIO38_GPIO38		MFP_CFG(GPIO38, AF0) -#define GPIO39_GPIO39		MFP_CFG(GPIO39, AF0) -#define GPIO40_GPIO40		MFP_CFG(GPIO40, AF0) -#define GPIO41_GPIO41		MFP_CFG(GPIO41, AF0) -#define GPIO42_GPIO42		MFP_CFG(GPIO42, AF0) -#define GPIO43_GPIO43		MFP_CFG(GPIO43, AF0) -#define GPIO44_GPIO44		MFP_CFG(GPIO44, AF0) -#define GPIO45_GPIO45		MFP_CFG(GPIO45, AF0) -#define GPIO46_GPIO46		MFP_CFG(GPIO46, AF0) -#define GPIO47_GPIO47		MFP_CFG(GPIO47, AF0) -#define GPIO48_GPIO48		MFP_CFG(GPIO48, AF0) -#define GPIO49_GPIO49		MFP_CFG(GPIO49, AF0) -#define GPIO50_GPIO50		MFP_CFG(GPIO50, AF0) -#define GPIO51_GPIO51		MFP_CFG(GPIO51, AF0) -#define GPIO52_GPIO52		MFP_CFG(GPIO52, AF0) -#define GPIO53_GPIO53		MFP_CFG(GPIO53, AF0) -#define GPIO54_GPIO54		MFP_CFG(GPIO54, AF0) -#define GPIO55_GPIO55		MFP_CFG(GPIO55, AF0) -#define GPIO56_GPIO56		MFP_CFG(GPIO56, AF0) -#define GPIO57_GPIO57		MFP_CFG(GPIO57, AF0) -#define GPIO58_GPIO58		MFP_CFG(GPIO58, AF0) -#define GPIO59_GPIO59		MFP_CFG(GPIO59, AF0) -#define GPIO60_GPIO60		MFP_CFG(GPIO60, AF0) -#define GPIO61_GPIO61		MFP_CFG(GPIO61, AF0) -#define GPIO62_GPIO62		MFP_CFG(GPIO62, AF0) -#define GPIO63_GPIO63		MFP_CFG(GPIO63, AF0) -#define GPIO64_GPIO64		MFP_CFG(GPIO64, AF0) -#define GPIO65_GPIO65		MFP_CFG(GPIO65, AF0) -#define GPIO66_GPIO66		MFP_CFG(GPIO66, AF0) -#define GPIO67_GPIO67		MFP_CFG(GPIO67, AF0) -#define GPIO68_GPIO68		MFP_CFG(GPIO68, AF0) -#define GPIO69_GPIO69		MFP_CFG(GPIO69, AF0) -#define GPIO70_GPIO70		MFP_CFG(GPIO70, AF0) -#define GPIO71_GPIO71		MFP_CFG(GPIO71, AF0) -#define GPIO72_GPIO72		MFP_CFG(GPIO72, AF0) -#define GPIO73_GPIO73		MFP_CFG(GPIO73, AF0) -#define GPIO74_GPIO74		MFP_CFG(GPIO74, AF0) -#define GPIO75_GPIO75		MFP_CFG(GPIO75, AF0) -#define GPIO76_GPIO76		MFP_CFG(GPIO76, AF0) -#define GPIO77_GPIO77		MFP_CFG(GPIO77, AF0) -#define GPIO78_GPIO78		MFP_CFG(GPIO78, AF0) -#define GPIO79_GPIO79		MFP_CFG(GPIO79, AF0) -#define GPIO80_GPIO80		MFP_CFG(GPIO80, AF0) -#define GPIO81_GPIO81		MFP_CFG(GPIO81, AF0) -#define GPIO82_GPIO82		MFP_CFG(GPIO82, AF0) -#define GPIO83_GPIO83		MFP_CFG(GPIO83, AF0) -#define GPIO84_GPIO84		MFP_CFG(GPIO84, AF0) -#define GPIO85_GPIO85		MFP_CFG(GPIO85, AF0) -#define GPIO86_GPIO86		MFP_CFG(GPIO86, AF0) -#define GPIO87_GPIO87		MFP_CFG(GPIO87, AF0) -#define GPIO88_GPIO88		MFP_CFG(GPIO88, AF0) -#define GPIO89_GPIO89		MFP_CFG(GPIO89, AF0) -#define GPIO90_GPIO90		MFP_CFG(GPIO90, AF0) -#define GPIO91_GPIO91		MFP_CFG(GPIO91, AF0) -#define GPIO92_GPIO92		MFP_CFG(GPIO92, AF0) -#define GPIO93_GPIO93		MFP_CFG(GPIO93, AF0) -#define GPIO94_GPIO94		MFP_CFG(GPIO94, AF0) -#define GPIO95_GPIO95		MFP_CFG(GPIO95, AF0) -#define GPIO96_GPIO96		MFP_CFG(GPIO96, AF0) -#define GPIO97_GPIO97		MFP_CFG(GPIO97, AF0) -#define GPIO98_GPIO98		MFP_CFG(GPIO98, AF0) -#define GPIO99_GPIO99		MFP_CFG(GPIO99, AF0) -#define GPIO100_GPIO100		MFP_CFG(GPIO100, AF0) -#define GPIO101_GPIO101		MFP_CFG(GPIO101, AF0) -#define GPIO102_GPIO102		MFP_CFG(GPIO102, AF1) -#define GPIO103_GPIO103		MFP_CFG(GPIO103, AF1) -#define GPIO104_GPIO104		MFP_CFG(GPIO104, AF1) -#define GPIO105_GPIO105		MFP_CFG(GPIO105, AF1) -#define GPIO106_GPIO106		MFP_CFG(GPIO106, AF1) -#define GPIO107_GPIO107		MFP_CFG(GPIO107, AF1) -#define GPIO108_GPIO108		MFP_CFG(GPIO108, AF1) -#define GPIO109_GPIO109		MFP_CFG(GPIO109, AF1) -#define GPIO110_GPIO110		MFP_CFG(GPIO110, AF1) -#define GPIO111_GPIO111		MFP_CFG(GPIO111, AF1) -#define GPIO112_GPIO112		MFP_CFG(GPIO112, AF1) -#define GPIO113_GPIO113		MFP_CFG(GPIO113, AF1) -#define GPIO114_GPIO114		MFP_CFG(GPIO114, AF0) -#define GPIO115_GPIO115		MFP_CFG(GPIO115, AF0) -#define GPIO116_GPIO116		MFP_CFG(GPIO116, AF0) -#define GPIO117_GPIO117		MFP_CFG(GPIO117, AF0) -#define GPIO118_GPIO118		MFP_CFG(GPIO118, AF0) -#define GPIO119_GPIO119		MFP_CFG(GPIO119, AF0) -#define GPIO120_GPIO120		MFP_CFG(GPIO120, AF0) -#define GPIO121_GPIO121		MFP_CFG(GPIO121, AF0) -#define GPIO122_GPIO122		MFP_CFG(GPIO122, AF0) -#define GPIO123_GPIO123		MFP_CFG(GPIO123, AF0) -#define GPIO124_GPIO124		MFP_CFG(GPIO124, AF0) -#define GPIO125_GPIO125		MFP_CFG(GPIO125, AF0) -#define GPIO126_GPIO126		MFP_CFG(GPIO126, AF0) -#define GPIO127_GPIO127		MFP_CFG(GPIO127, AF0) -#define GPIO128_GPIO128		MFP_CFG(GPIO128, AF0) -#define GPIO129_GPIO129		MFP_CFG(GPIO129, AF0) -#define GPIO130_GPIO130		MFP_CFG(GPIO130, AF0) -#define GPIO131_GPIO131		MFP_CFG(GPIO131, AF0) -#define GPIO132_GPIO132		MFP_CFG(GPIO132, AF0) -#define GPIO133_GPIO133		MFP_CFG(GPIO133, AF0) -#define GPIO134_GPIO134		MFP_CFG(GPIO134, AF0) -#define GPIO135_GPIO135		MFP_CFG(GPIO135, AF0) -#define GPIO136_GPIO136		MFP_CFG(GPIO136, AF0) -#define GPIO137_GPIO137		MFP_CFG(GPIO137, AF0) -#define GPIO138_GPIO138		MFP_CFG(GPIO138, AF0) -#define GPIO139_GPIO139		MFP_CFG(GPIO139, AF0) -#define GPIO140_GPIO140		MFP_CFG(GPIO140, AF0) -#define GPIO141_GPIO141		MFP_CFG(GPIO141, AF0) -#define GPIO142_GPIO142		MFP_CFG(GPIO142, AF1) -#define GPIO143_GPIO143		MFP_CFG(GPIO143, AF1) -#define GPIO144_GPIO144		MFP_CFG(GPIO144, AF1) -#define GPIO145_GPIO145		MFP_CFG(GPIO145, AF1) -#define GPIO146_GPIO146		MFP_CFG(GPIO146, AF1) -#define GPIO147_GPIO147		MFP_CFG(GPIO147, AF1) -#define GPIO148_GPIO148		MFP_CFG(GPIO148, AF1) -#define GPIO149_GPIO149		MFP_CFG(GPIO149, AF1) -#define GPIO150_GPIO150		MFP_CFG(GPIO150, AF1) -#define GPIO151_GPIO151		MFP_CFG(GPIO151, AF1) -#define GPIO152_GPIO152		MFP_CFG(GPIO152, AF1) -#define GPIO153_GPIO153		MFP_CFG(GPIO153, AF1) -#define GPIO154_GPIO154		MFP_CFG(GPIO154, AF1) -#define GPIO155_GPIO155		MFP_CFG(GPIO155, AF1) -#define GPIO156_GPIO156		MFP_CFG(GPIO156, AF1) -#define GPIO157_GPIO157		MFP_CFG(GPIO157, AF1) -#define GPIO158_GPIO158		MFP_CFG(GPIO158, AF1) -#define GPIO159_GPIO159		MFP_CFG(GPIO159, AF1) -#define GPIO160_GPIO160		MFP_CFG(GPIO160, AF1) -#define GPIO161_GPIO161		MFP_CFG(GPIO161, AF1) -#define GPIO162_GPIO162		MFP_CFG(GPIO162, AF1) -#define GPIO163_GPIO163		MFP_CFG(GPIO163, AF1) -#define GPIO164_GPIO164		MFP_CFG(GPIO164, AF1) -#define GPIO165_GPIO165		MFP_CFG(GPIO165, AF1) -#define GPIO166_GPIO166		MFP_CFG(GPIO166, AF1) -#define GPIO167_GPIO167		MFP_CFG(GPIO167, AF1) -#define GPIO168_GPIO168		MFP_CFG(GPIO168, AF1) +#define GPIO0_GPIO	MFP_CFG(GPIO0, AF0) +#define GPIO1_GPIO	MFP_CFG(GPIO1, AF0) +#define GPIO2_GPIO	MFP_CFG(GPIO2, AF0) +#define GPIO3_GPIO	MFP_CFG(GPIO3, AF0) +#define GPIO4_GPIO	MFP_CFG(GPIO4, AF0) +#define GPIO5_GPIO	MFP_CFG(GPIO5, AF0) +#define GPIO6_GPIO	MFP_CFG(GPIO6, AF0) +#define GPIO7_GPIO	MFP_CFG(GPIO7, AF0) +#define GPIO8_GPIO	MFP_CFG(GPIO8, AF0) +#define GPIO9_GPIO	MFP_CFG(GPIO9, AF0) +#define GPIO10_GPIO	MFP_CFG(GPIO10, AF0) +#define GPIO11_GPIO	MFP_CFG(GPIO11, AF0) +#define GPIO12_GPIO	MFP_CFG(GPIO12, AF0) +#define GPIO13_GPIO	MFP_CFG(GPIO13, AF0) +#define GPIO14_GPIO	MFP_CFG(GPIO14, AF0) +#define GPIO15_GPIO	MFP_CFG(GPIO15, AF0) +#define GPIO16_GPIO	MFP_CFG(GPIO16, AF0) +#define GPIO17_GPIO	MFP_CFG(GPIO17, AF0) +#define GPIO18_GPIO	MFP_CFG(GPIO18, AF0) +#define GPIO19_GPIO	MFP_CFG(GPIO19, AF0) +#define GPIO20_GPIO	MFP_CFG(GPIO20, AF0) +#define GPIO21_GPIO	MFP_CFG(GPIO21, AF0) +#define GPIO22_GPIO	MFP_CFG(GPIO22, AF0) +#define GPIO23_GPIO	MFP_CFG(GPIO23, AF0) +#define GPIO24_GPIO	MFP_CFG(GPIO24, AF0) +#define GPIO25_GPIO	MFP_CFG(GPIO25, AF0) +#define GPIO26_GPIO	MFP_CFG(GPIO26, AF0) +#define GPIO27_GPIO	MFP_CFG(GPIO27, AF0) +#define GPIO28_GPIO	MFP_CFG(GPIO28, AF0) +#define GPIO29_GPIO	MFP_CFG(GPIO29, AF0) +#define GPIO30_GPIO	MFP_CFG(GPIO30, AF0) +#define GPIO31_GPIO	MFP_CFG(GPIO31, AF0) +#define GPIO32_GPIO	MFP_CFG(GPIO32, AF0) +#define GPIO33_GPIO	MFP_CFG(GPIO33, AF0) +#define GPIO34_GPIO	MFP_CFG(GPIO34, AF0) +#define GPIO35_GPIO	MFP_CFG(GPIO35, AF0) +#define GPIO36_GPIO	MFP_CFG(GPIO36, AF0) +#define GPIO37_GPIO	MFP_CFG(GPIO37, AF0) +#define GPIO38_GPIO	MFP_CFG(GPIO38, AF0) +#define GPIO39_GPIO	MFP_CFG(GPIO39, AF0) +#define GPIO40_GPIO	MFP_CFG(GPIO40, AF0) +#define GPIO41_GPIO	MFP_CFG(GPIO41, AF0) +#define GPIO42_GPIO	MFP_CFG(GPIO42, AF0) +#define GPIO43_GPIO	MFP_CFG(GPIO43, AF0) +#define GPIO44_GPIO	MFP_CFG(GPIO44, AF0) +#define GPIO45_GPIO	MFP_CFG(GPIO45, AF0) +#define GPIO46_GPIO	MFP_CFG(GPIO46, AF0) +#define GPIO47_GPIO	MFP_CFG(GPIO47, AF0) +#define GPIO48_GPIO	MFP_CFG(GPIO48, AF0) +#define GPIO49_GPIO	MFP_CFG(GPIO49, AF0) +#define GPIO50_GPIO	MFP_CFG(GPIO50, AF0) +#define GPIO51_GPIO	MFP_CFG(GPIO51, AF0) +#define GPIO52_GPIO	MFP_CFG(GPIO52, AF0) +#define GPIO53_GPIO	MFP_CFG(GPIO53, AF0) +#define GPIO54_GPIO	MFP_CFG(GPIO54, AF0) +#define GPIO55_GPIO	MFP_CFG(GPIO55, AF0) +#define GPIO56_GPIO	MFP_CFG(GPIO56, AF0) +#define GPIO57_GPIO	MFP_CFG(GPIO57, AF0) +#define GPIO58_GPIO	MFP_CFG(GPIO58, AF0) +#define GPIO59_GPIO	MFP_CFG(GPIO59, AF0) +#define GPIO60_GPIO	MFP_CFG(GPIO60, AF0) +#define GPIO61_GPIO	MFP_CFG(GPIO61, AF0) +#define GPIO62_GPIO	MFP_CFG(GPIO62, AF0) +#define GPIO63_GPIO	MFP_CFG(GPIO63, AF0) +#define GPIO64_GPIO	MFP_CFG(GPIO64, AF0) +#define GPIO65_GPIO	MFP_CFG(GPIO65, AF0) +#define GPIO66_GPIO	MFP_CFG(GPIO66, AF0) +#define GPIO67_GPIO	MFP_CFG(GPIO67, AF0) +#define GPIO68_GPIO	MFP_CFG(GPIO68, AF0) +#define GPIO69_GPIO	MFP_CFG(GPIO69, AF0) +#define GPIO70_GPIO	MFP_CFG(GPIO70, AF0) +#define GPIO71_GPIO	MFP_CFG(GPIO71, AF0) +#define GPIO72_GPIO	MFP_CFG(GPIO72, AF0) +#define GPIO73_GPIO	MFP_CFG(GPIO73, AF0) +#define GPIO74_GPIO	MFP_CFG(GPIO74, AF0) +#define GPIO75_GPIO	MFP_CFG(GPIO75, AF0) +#define GPIO76_GPIO	MFP_CFG(GPIO76, AF0) +#define GPIO77_GPIO	MFP_CFG(GPIO77, AF0) +#define GPIO78_GPIO	MFP_CFG(GPIO78, AF0) +#define GPIO79_GPIO	MFP_CFG(GPIO79, AF0) +#define GPIO80_GPIO	MFP_CFG(GPIO80, AF0) +#define GPIO81_GPIO	MFP_CFG(GPIO81, AF0) +#define GPIO82_GPIO	MFP_CFG(GPIO82, AF0) +#define GPIO83_GPIO	MFP_CFG(GPIO83, AF0) +#define GPIO84_GPIO	MFP_CFG(GPIO84, AF0) +#define GPIO85_GPIO	MFP_CFG(GPIO85, AF0) +#define GPIO86_GPIO	MFP_CFG(GPIO86, AF0) +#define GPIO87_GPIO	MFP_CFG(GPIO87, AF0) +#define GPIO88_GPIO	MFP_CFG(GPIO88, AF0) +#define GPIO89_GPIO	MFP_CFG(GPIO89, AF0) +#define GPIO90_GPIO	MFP_CFG(GPIO90, AF0) +#define GPIO91_GPIO	MFP_CFG(GPIO91, AF0) +#define GPIO92_GPIO	MFP_CFG(GPIO92, AF0) +#define GPIO93_GPIO	MFP_CFG(GPIO93, AF0) +#define GPIO94_GPIO	MFP_CFG(GPIO94, AF0) +#define GPIO95_GPIO	MFP_CFG(GPIO95, AF0) +#define GPIO96_GPIO	MFP_CFG(GPIO96, AF0) +#define GPIO97_GPIO	MFP_CFG(GPIO97, AF0) +#define GPIO98_GPIO	MFP_CFG(GPIO98, AF0) +#define GPIO99_GPIO	MFP_CFG(GPIO99, AF0) +#define GPIO100_GPIO	MFP_CFG(GPIO100, AF0) +#define GPIO101_GPIO	MFP_CFG(GPIO101, AF0) +#define GPIO102_GPIO	MFP_CFG(GPIO102, AF1) +#define GPIO103_GPIO	MFP_CFG(GPIO103, AF1) +#define GPIO104_GPIO	MFP_CFG(GPIO104, AF1) +#define GPIO105_GPIO	MFP_CFG(GPIO105, AF1) +#define GPIO106_GPIO	MFP_CFG(GPIO106, AF1) +#define GPIO107_GPIO	MFP_CFG(GPIO107, AF1) +#define GPIO108_GPIO	MFP_CFG(GPIO108, AF1) +#define GPIO109_GPIO	MFP_CFG(GPIO109, AF1) +#define GPIO110_GPIO	MFP_CFG(GPIO110, AF1) +#define GPIO111_GPIO	MFP_CFG(GPIO111, AF1) +#define GPIO112_GPIO	MFP_CFG(GPIO112, AF1) +#define GPIO113_GPIO	MFP_CFG(GPIO113, AF1) +#define GPIO114_GPIO	MFP_CFG(GPIO114, AF0) +#define GPIO115_GPIO	MFP_CFG(GPIO115, AF0) +#define GPIO116_GPIO	MFP_CFG(GPIO116, AF0) +#define GPIO117_GPIO	MFP_CFG(GPIO117, AF0) +#define GPIO118_GPIO	MFP_CFG(GPIO118, AF0) +#define GPIO119_GPIO	MFP_CFG(GPIO119, AF0) +#define GPIO120_GPIO	MFP_CFG(GPIO120, AF0) +#define GPIO121_GPIO	MFP_CFG(GPIO121, AF0) +#define GPIO122_GPIO	MFP_CFG(GPIO122, AF0) +#define GPIO123_GPIO	MFP_CFG(GPIO123, AF0) +#define GPIO124_GPIO	MFP_CFG(GPIO124, AF0) +#define GPIO125_GPIO	MFP_CFG(GPIO125, AF0) +#define GPIO126_GPIO	MFP_CFG(GPIO126, AF0) +#define GPIO127_GPIO	MFP_CFG(GPIO127, AF0) +#define GPIO128_GPIO	MFP_CFG(GPIO128, AF0) +#define GPIO129_GPIO	MFP_CFG(GPIO129, AF0) +#define GPIO130_GPIO	MFP_CFG(GPIO130, AF0) +#define GPIO131_GPIO	MFP_CFG(GPIO131, AF0) +#define GPIO132_GPIO	MFP_CFG(GPIO132, AF0) +#define GPIO133_GPIO	MFP_CFG(GPIO133, AF0) +#define GPIO134_GPIO	MFP_CFG(GPIO134, AF0) +#define GPIO135_GPIO	MFP_CFG(GPIO135, AF0) +#define GPIO136_GPIO	MFP_CFG(GPIO136, AF0) +#define GPIO137_GPIO	MFP_CFG(GPIO137, AF0) +#define GPIO138_GPIO	MFP_CFG(GPIO138, AF0) +#define GPIO139_GPIO	MFP_CFG(GPIO139, AF0) +#define GPIO140_GPIO	MFP_CFG(GPIO140, AF0) +#define GPIO141_GPIO	MFP_CFG(GPIO141, AF0) +#define GPIO142_GPIO	MFP_CFG(GPIO142, AF1) +#define GPIO143_GPIO	MFP_CFG(GPIO143, AF1) +#define GPIO144_GPIO	MFP_CFG(GPIO144, AF1) +#define GPIO145_GPIO	MFP_CFG(GPIO145, AF1) +#define GPIO146_GPIO	MFP_CFG(GPIO146, AF1) +#define GPIO147_GPIO	MFP_CFG(GPIO147, AF1) +#define GPIO148_GPIO	MFP_CFG(GPIO148, AF1) +#define GPIO149_GPIO	MFP_CFG(GPIO149, AF1) +#define GPIO150_GPIO	MFP_CFG(GPIO150, AF1) +#define GPIO151_GPIO	MFP_CFG(GPIO151, AF1) +#define GPIO152_GPIO	MFP_CFG(GPIO152, AF1) +#define GPIO153_GPIO	MFP_CFG(GPIO153, AF1) +#define GPIO154_GPIO	MFP_CFG(GPIO154, AF1) +#define GPIO155_GPIO	MFP_CFG(GPIO155, AF1) +#define GPIO156_GPIO	MFP_CFG(GPIO156, AF1) +#define GPIO157_GPIO	MFP_CFG(GPIO157, AF1) +#define GPIO158_GPIO	MFP_CFG(GPIO158, AF1) +#define GPIO159_GPIO	MFP_CFG(GPIO159, AF1) +#define GPIO160_GPIO	MFP_CFG(GPIO160, AF1) +#define GPIO161_GPIO	MFP_CFG(GPIO161, AF1) +#define GPIO162_GPIO	MFP_CFG(GPIO162, AF1) +#define GPIO163_GPIO	MFP_CFG(GPIO163, AF1) +#define GPIO164_GPIO	MFP_CFG(GPIO164, AF1) +#define GPIO165_GPIO	MFP_CFG(GPIO165, AF1) +#define GPIO166_GPIO	MFP_CFG(GPIO166, AF1) +#define GPIO167_GPIO	MFP_CFG(GPIO167, AF1) +#define GPIO168_GPIO	MFP_CFG(GPIO168, AF1)  /* DFI */  #define GPIO108_DFI_D15		MFP_CFG(GPIO108, AF0) diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h index 4621067c772..92aaa3c19d6 100644 --- a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h +++ b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h @@ -8,6 +8,15 @@  #define MFP_DRIVE_MEDIUM	(0x2 << 13)  #define MFP_DRIVE_FAST		(0x3 << 13) +#undef MFP_CFG +#undef MFP_CFG_DRV + +#define MFP_CFG(pin, af)		\ +	(MFP_LPM_INPUT | MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_DRIVE_MEDIUM) + +#define MFP_CFG_DRV(pin, af, drv)	\ +	(MFP_LPM_INPUT | MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_DRIVE_##drv) +  /* GPIO */  #define GPIO0_GPIO		MFP_CFG(GPIO0, AF5)  #define GPIO1_GPIO		MFP_CFG(GPIO1, AF5) @@ -194,6 +203,10 @@  #define GPIO33_CF_nCD2		MFP_CFG(GPIO33, AF3)  /* UART */ +#define GPIO8_UART3_TXD		MFP_CFG(GPIO8, AF2) +#define GPIO9_UART3_RXD		MFP_CFG(GPIO9, AF2) +#define GPIO1O_UART3_CTS	MFP_CFG(GPIO10, AF2) +#define GPIO11_UART3_RTS	MFP_CFG(GPIO11, AF2)  #define GPIO88_UART2_TXD	MFP_CFG(GPIO88, AF2)  #define GPIO89_UART2_RXD	MFP_CFG(GPIO89, AF2)  #define GPIO107_UART1_TXD	MFP_CFG_DRV(GPIO107, AF1, FAST) @@ -223,6 +236,22 @@  #define GPIO53_MMC1_CD		MFP_CFG(GPIO53, AF1)  #define GPIO46_MMC1_WP		MFP_CFG(GPIO46, AF1) +/* MMC2 */ +#define	GPIO28_MMC2_CMD		MFP_CFG_DRV(GPIO28, AF6, FAST) +#define	GPIO29_MMC2_CLK		MFP_CFG_DRV(GPIO29, AF6, FAST) +#define	GPIO30_MMC2_DAT0	MFP_CFG_DRV(GPIO30, AF6, FAST) +#define	GPIO31_MMC2_DAT1	MFP_CFG_DRV(GPIO31, AF6, FAST) +#define	GPIO32_MMC2_DAT2	MFP_CFG_DRV(GPIO32, AF6, FAST) +#define	GPIO33_MMC2_DAT3	MFP_CFG_DRV(GPIO33, AF6, FAST) + +/* MMC4 */ +#define GPIO125_MMC4_DAT3       MFP_CFG_DRV(GPIO125, AF7, FAST) +#define GPIO126_MMC4_DAT2       MFP_CFG_DRV(GPIO126, AF7, FAST) +#define GPIO127_MMC4_DAT1       MFP_CFG_DRV(GPIO127, AF7, FAST) +#define GPIO0_2_MMC4_DAT0       MFP_CFG_DRV(GPIO0_2, AF7, FAST) +#define GPIO1_2_MMC4_CMD        MFP_CFG_DRV(GPIO1_2, AF7, FAST) +#define GPIO2_2_MMC4_CLK        MFP_CFG_DRV(GPIO2_2, AF7, FAST) +  /* LCD */  #define GPIO84_LCD_CS		MFP_CFG(GPIO84, AF1)  #define GPIO60_LCD_DD0		MFP_CFG(GPIO60, AF1) @@ -260,11 +289,12 @@  #define GPIO106_CI2C_SCL	MFP_CFG(GPIO106, AF1)  /* I2S */ -#define GPIO113_I2S_MCLK	MFP_CFG(GPIO113,AF6) -#define GPIO114_I2S_FRM		MFP_CFG(GPIO114,AF1) -#define GPIO115_I2S_BCLK	MFP_CFG(GPIO115,AF1) -#define GPIO116_I2S_RXD		MFP_CFG(GPIO116,AF2) -#define GPIO117_I2S_TXD		MFP_CFG(GPIO117,AF2) +#define GPIO113_I2S_MCLK	MFP_CFG(GPIO113, AF6) +#define GPIO114_I2S_FRM		MFP_CFG(GPIO114, AF1) +#define GPIO115_I2S_BCLK	MFP_CFG(GPIO115, AF1) +#define GPIO116_I2S_RXD		MFP_CFG(GPIO116, AF2) +#define GPIO116_I2S_TXD         MFP_CFG(GPIO116, AF1) +#define GPIO117_I2S_TXD		MFP_CFG(GPIO117, AF2)  /* PWM */  #define GPIO96_PWM3_OUT		MFP_CFG(GPIO96, AF1) @@ -296,4 +326,29 @@  #define GPIO112_KP_MKOUT6       MFP_CFG(GPIO112, AF7)  #define GPIO121_KP_MKIN4        MFP_CFG(GPIO121, AF7) +/* Fast Ethernet */ +#define GPIO86_TX_CLK		MFP_CFG(GPIO86, AF5) +#define GPIO87_TX_EN		MFP_CFG(GPIO87, AF5) +#define GPIO88_TX_DQ3		MFP_CFG(GPIO88, AF5) +#define GPIO89_TX_DQ2		MFP_CFG(GPIO89, AF5) +#define GPIO90_TX_DQ1		MFP_CFG(GPIO90, AF5) +#define GPIO91_TX_DQ0		MFP_CFG(GPIO91, AF5) +#define GPIO92_MII_CRS		MFP_CFG(GPIO92, AF5) +#define GPIO93_MII_COL		MFP_CFG(GPIO93, AF5) +#define GPIO94_RX_CLK		MFP_CFG(GPIO94, AF5) +#define GPIO95_RX_ER		MFP_CFG(GPIO95, AF5) +#define GPIO96_RX_DQ3		MFP_CFG(GPIO96, AF5) +#define GPIO97_RX_DQ2		MFP_CFG(GPIO97, AF5) +#define GPIO98_RX_DQ1		MFP_CFG(GPIO98, AF5) +#define GPIO99_RX_DQ0		MFP_CFG(GPIO99, AF5) +#define GPIO100_MII_MDC		MFP_CFG(GPIO100, AF5) +#define GPIO101_MII_MDIO	MFP_CFG(GPIO101, AF5) +#define GPIO103_RX_DV		MFP_CFG(GPIO103, AF5) + +/* SSP2 */ +#define GPIO107_SSP2_RXD	MFP_CFG(GPIO107, AF4) +#define GPIO108_SSP2_TXD	MFP_CFG(GPIO108, AF4) +#define GPIO111_SSP2_CLK	MFP_CFG(GPIO111, AF4) +#define GPIO112_SSP2_FRM	MFP_CFG(GPIO112, AF4) +  #endif /* __ASM_MACH_MFP_PXA168_H */ diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa910.h b/arch/arm/mach-mmp/include/mach/mfp-pxa910.h index 7e8a80f25dd..fbd7ee8e489 100644 --- a/arch/arm/mach-mmp/include/mach/mfp-pxa910.h +++ b/arch/arm/mach-mmp/include/mach/mfp-pxa910.h @@ -6,7 +6,7 @@  #define MFP_DRIVE_VERY_SLOW	(0x0 << 13)  #define MFP_DRIVE_SLOW		(0x2 << 13)  #define MFP_DRIVE_MEDIUM	(0x4 << 13) -#define MFP_DRIVE_FAST		(0x8 << 13) +#define MFP_DRIVE_FAST		(0x6 << 13)  /* UART2 */  #define GPIO47_UART2_RXD	MFP_CFG(GPIO47, AF6) diff --git a/arch/arm/mach-mmp/include/mach/mmp2.h b/arch/arm/mach-mmp/include/mach/mmp2.h index dbba6e8a60c..0764f4ecec8 100644 --- a/arch/arm/mach-mmp/include/mach/mmp2.h +++ b/arch/arm/mach-mmp/include/mach/mmp2.h @@ -1,16 +1,17 @@  #ifndef __ASM_MACH_MMP2_H  #define __ASM_MACH_MMP2_H -struct sys_timer; +#include <linux/platform_data/pxa_sdhci.h> -extern struct sys_timer mmp2_timer; +extern void mmp2_timer_init(void);  extern void __init mmp2_init_icu(void);  extern void __init mmp2_init_irq(void);  extern void mmp2_clear_pmic_int(void);  #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h>  #include <mach/devices.h> -#include <plat/i2c.h> +#include <linux/platform_data/dma-mmp_tdma.h>  extern struct pxa_device_desc mmp2_device_uart1;  extern struct pxa_device_desc mmp2_device_uart2; @@ -22,6 +23,14 @@ extern struct pxa_device_desc mmp2_device_twsi3;  extern struct pxa_device_desc mmp2_device_twsi4;  extern struct pxa_device_desc mmp2_device_twsi5;  extern struct pxa_device_desc mmp2_device_twsi6; +extern struct pxa_device_desc mmp2_device_sdh0; +extern struct pxa_device_desc mmp2_device_sdh1; +extern struct pxa_device_desc mmp2_device_sdh2; +extern struct pxa_device_desc mmp2_device_sdh3; +extern struct pxa_device_desc mmp2_device_asram; +extern struct pxa_device_desc mmp2_device_isram; + +extern struct platform_device mmp2_device_gpio;  static inline int mmp2_add_uart(int id)  { @@ -63,5 +72,31 @@ static inline int mmp2_add_twsi(int id, struct i2c_pxa_platform_data *data,  	return pxa_register_device(d, data, sizeof(*data));  } +static inline int mmp2_add_sdhost(int id, struct sdhci_pxa_platdata *data) +{ +	struct pxa_device_desc *d = NULL; + +	switch (id) { +	case 0: d = &mmp2_device_sdh0; break; +	case 1: d = &mmp2_device_sdh1; break; +	case 2: d = &mmp2_device_sdh2; break; +	case 3: d = &mmp2_device_sdh3; break; +	default: +		return -EINVAL; +	} + +	return pxa_register_device(d, data, sizeof(*data)); +} + +static inline int mmp2_add_asram(struct sram_platdata *data) +{ +	return pxa_register_device(&mmp2_device_asram, data, sizeof(*data)); +} + +static inline int mmp2_add_isram(struct sram_platdata *data) +{ +	return pxa_register_device(&mmp2_device_isram, data, sizeof(*data)); +} +  #endif /* __ASM_MACH_MMP2_H */ diff --git a/arch/arm/mach-mmp/include/mach/pm-mmp2.h b/arch/arm/mach-mmp/include/mach/pm-mmp2.h new file mode 100644 index 00000000000..98bd66ce800 --- /dev/null +++ b/arch/arm/mach-mmp/include/mach/pm-mmp2.h @@ -0,0 +1,61 @@ +/* + * MMP2 Power Management Routines + * + * This software program is licensed subject to the GNU General Public License + * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html + * + * (C) Copyright 2010 Marvell International Ltd. + * All Rights Reserved + */ + +#ifndef __MMP2_PM_H__ +#define __MMP2_PM_H__ + +#include <mach/addr-map.h> + +#define APMU_PJ_IDLE_CFG			APMU_REG(0x018) +#define APMU_PJ_IDLE_CFG_PJ_IDLE		(1 << 1) +#define APMU_PJ_IDLE_CFG_PJ_PWRDWN		(1 << 5) +#define APMU_PJ_IDLE_CFG_PWR_SW(x)		((x) << 16) +#define APMU_PJ_IDLE_CFG_L2_PWR_SW		(1 << 19) +#define APMU_PJ_IDLE_CFG_ISO_MODE_CNTRL_MASK	(3 << 28) + +#define APMU_SRAM_PWR_DWN			APMU_REG(0x08c) + +#define MPMU_SCCR				MPMU_REG(0x038) +#define MPMU_PCR_PJ				MPMU_REG(0x1000) +#define MPMU_PCR_PJ_AXISD			(1 << 31) +#define MPMU_PCR_PJ_SLPEN			(1 << 29) +#define MPMU_PCR_PJ_SPSD			(1 << 28) +#define MPMU_PCR_PJ_DDRCORSD			(1 << 27) +#define MPMU_PCR_PJ_APBSD			(1 << 26) +#define MPMU_PCR_PJ_INTCLR			(1 << 24) +#define MPMU_PCR_PJ_SLPWP0			(1 << 23) +#define MPMU_PCR_PJ_SLPWP1			(1 << 22) +#define MPMU_PCR_PJ_SLPWP2			(1 << 21) +#define MPMU_PCR_PJ_SLPWP3			(1 << 20) +#define MPMU_PCR_PJ_VCTCXOSD			(1 << 19) +#define MPMU_PCR_PJ_SLPWP4			(1 << 18) +#define MPMU_PCR_PJ_SLPWP5			(1 << 17) +#define MPMU_PCR_PJ_SLPWP6			(1 << 16) +#define MPMU_PCR_PJ_SLPWP7			(1 << 15) + +#define MPMU_PLL2_CTRL1				MPMU_REG(0x0414) +#define MPMU_CGR_PJ				MPMU_REG(0x1024) +#define MPMU_WUCRM_PJ				MPMU_REG(0x104c) +#define MPMU_WUCRM_PJ_WAKEUP(x)			(1 << (x)) +#define MPMU_WUCRM_PJ_RTC_ALARM			(1 << 17) + +enum { +	POWER_MODE_ACTIVE = 0, +	POWER_MODE_CORE_INTIDLE, +	POWER_MODE_CORE_EXTIDLE, +	POWER_MODE_APPS_IDLE, +	POWER_MODE_APPS_SLEEP, +	POWER_MODE_CHIP_SLEEP, +	POWER_MODE_SYS_SLEEP, +}; + +extern void mmp2_pm_enter_lowpower_mode(int state); +extern int mmp2_set_wake(struct irq_data *d, unsigned int on); +#endif diff --git a/arch/arm/mach-mmp/include/mach/pm-pxa910.h b/arch/arm/mach-mmp/include/mach/pm-pxa910.h new file mode 100644 index 00000000000..8cac8ab5253 --- /dev/null +++ b/arch/arm/mach-mmp/include/mach/pm-pxa910.h @@ -0,0 +1,77 @@ +/* + * PXA910 Power Management Routines + * + * This software program is licensed subject to the GNU General Public License + * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html + * + * (C) Copyright 2009 Marvell International Ltd. + * All Rights Reserved + */ + +#ifndef __PXA910_PM_H__ +#define __PXA910_PM_H__ + +#define APMU_MOH_IDLE_CFG			APMU_REG(0x0018) +#define APMU_MOH_IDLE_CFG_MOH_IDLE		(1 << 1) +#define APMU_MOH_IDLE_CFG_MOH_PWRDWN		(1 << 5) +#define APMU_MOH_IDLE_CFG_MOH_SRAM_PWRDWN	(1 << 6) +#define APMU_MOH_IDLE_CFG_MOH_PWR_SW(x)		(((x) & 0x3) << 16) +#define APMU_MOH_IDLE_CFG_MOH_L2_PWR_SW(x)	(((x) & 0x3) << 18) +#define APMU_MOH_IDLE_CFG_MOH_DIS_MC_SW_REQ	(1 << 21) +#define APMU_MOH_IDLE_CFG_MOH_MC_WAKE_EN	(1 << 20) + +#define APMU_SQU_CLK_GATE_CTRL			APMU_REG(0x001c) +#define APMU_MC_HW_SLP_TYPE			APMU_REG(0x00b0) + +#define MPMU_FCCR				MPMU_REG(0x0008) +#define MPMU_APCR				MPMU_REG(0x1000) +#define MPMU_APCR_AXISD				(1 << 31) +#define MPMU_APCR_DSPSD				(1 << 30) +#define MPMU_APCR_SLPEN				(1 << 29) +#define MPMU_APCR_DTCMSD			(1 << 28) +#define MPMU_APCR_DDRCORSD			(1 << 27) +#define MPMU_APCR_APBSD				(1 << 26) +#define MPMU_APCR_BBSD				(1 << 25) +#define MPMU_APCR_SLPWP0			(1 << 23) +#define MPMU_APCR_SLPWP1			(1 << 22) +#define MPMU_APCR_SLPWP2			(1 << 21) +#define MPMU_APCR_SLPWP3			(1 << 20) +#define MPMU_APCR_VCTCXOSD			(1 << 19) +#define MPMU_APCR_SLPWP4			(1 << 18) +#define MPMU_APCR_SLPWP5			(1 << 17) +#define MPMU_APCR_SLPWP6			(1 << 16) +#define MPMU_APCR_SLPWP7			(1 << 15) +#define MPMU_APCR_MSASLPEN			(1 << 14) +#define MPMU_APCR_STBYEN			(1 << 13) + +#define MPMU_AWUCRM				MPMU_REG(0x104c) +#define MPMU_AWUCRM_AP_ASYNC_INT		(1 << 25) +#define MPMU_AWUCRM_AP_FULL_IDLE		(1 << 24) +#define MPMU_AWUCRM_SDH1			(1 << 23) +#define MPMU_AWUCRM_SDH2			(1 << 22) +#define MPMU_AWUCRM_KEYPRESS			(1 << 21) +#define MPMU_AWUCRM_TRACKBALL			(1 << 20) +#define MPMU_AWUCRM_NEWROTARY			(1 << 19) +#define MPMU_AWUCRM_RTC_ALARM			(1 << 17) +#define MPMU_AWUCRM_AP2_TIMER_3			(1 << 13) +#define MPMU_AWUCRM_AP2_TIMER_2			(1 << 12) +#define MPMU_AWUCRM_AP2_TIMER_1			(1 << 11) +#define MPMU_AWUCRM_AP1_TIMER_3			(1 << 10) +#define MPMU_AWUCRM_AP1_TIMER_2			(1 << 9) +#define MPMU_AWUCRM_AP1_TIMER_1			(1 << 8) +#define MPMU_AWUCRM_WAKEUP(x)			(1 << ((x) & 0x7)) + +enum { +	POWER_MODE_ACTIVE = 0, +	POWER_MODE_CORE_INTIDLE, +	POWER_MODE_CORE_EXTIDLE, +	POWER_MODE_APPS_IDLE, +	POWER_MODE_APPS_SLEEP, +	POWER_MODE_SYS_SLEEP, +	POWER_MODE_HIBERNATE, +	POWER_MODE_UDR, +}; + +extern int pxa910_set_wake(struct irq_data *data, unsigned int on); + +#endif diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h index 1801e420623..a83ba7cb525 100644 --- a/arch/arm/mach-mmp/include/mach/pxa168.h +++ b/arch/arm/mach-mmp/include/mach/pxa168.h @@ -1,22 +1,27 @@  #ifndef __ASM_MACH_PXA168_H  #define __ASM_MACH_PXA168_H -struct sys_timer; +#include <linux/reboot.h> -extern struct sys_timer pxa168_timer; +extern void pxa168_timer_init(void); +extern void __init icu_init_irq(void);  extern void __init pxa168_init_irq(void); +extern void pxa168_restart(enum reboot_mode, const char *);  extern void pxa168_clear_keypad_wakeup(void);  #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h>  #include <mach/devices.h> -#include <plat/i2c.h> -#include <plat/pxa3xx_nand.h> +#include <linux/platform_data/mtd-nand-pxa3xx.h>  #include <video/pxa168fb.h> -#include <plat/pxa27x_keypad.h> +#include <linux/platform_data/keypad-pxa27x.h>  #include <mach/cputype.h> +#include <linux/pxa168_eth.h> +#include <linux/platform_data/mv_usb.h>  extern struct pxa_device_desc pxa168_device_uart1;  extern struct pxa_device_desc pxa168_device_uart2; +extern struct pxa_device_desc pxa168_device_uart3;  extern struct pxa_device_desc pxa168_device_twsi0;  extern struct pxa_device_desc pxa168_device_twsi1;  extern struct pxa_device_desc pxa168_device_pwm1; @@ -31,6 +36,13 @@ extern struct pxa_device_desc pxa168_device_ssp5;  extern struct pxa_device_desc pxa168_device_nand;  extern struct pxa_device_desc pxa168_device_fb;  extern struct pxa_device_desc pxa168_device_keypad; +extern struct pxa_device_desc pxa168_device_eth; + +/* pdata can be NULL */ +extern int __init pxa168_add_usb_host(struct mv_usb_platform_data *pdata); + + +extern struct platform_device pxa168_device_gpio;  static inline int pxa168_add_uart(int id)  { @@ -39,6 +51,7 @@ static inline int pxa168_add_uart(int id)  	switch (id) {  	case 1: d = &pxa168_device_uart1; break;  	case 2: d = &pxa168_device_uart2; break; +	case 3: d = &pxa168_device_uart3; break;  	}  	if (d == NULL) @@ -117,4 +130,8 @@ static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)  	return pxa_register_device(&pxa168_device_keypad, data, sizeof(*data));  } +static inline int pxa168_add_eth(struct pxa168_eth_platform_data *data) +{ +	return pxa_register_device(&pxa168_device_eth, data, sizeof(*data)); +}  #endif /* __ASM_MACH_PXA168_H */ diff --git a/arch/arm/mach-mmp/include/mach/pxa910.h b/arch/arm/mach-mmp/include/mach/pxa910.h index f13c49d6f8d..92253203f5b 100644 --- a/arch/arm/mach-mmp/include/mach/pxa910.h +++ b/arch/arm/mach-mmp/include/mach/pxa910.h @@ -1,15 +1,15 @@  #ifndef __ASM_MACH_PXA910_H  #define __ASM_MACH_PXA910_H -struct sys_timer; - -extern struct sys_timer pxa910_timer; +extern void pxa910_timer_init(void); +extern void __init icu_init_irq(void);  extern void __init pxa910_init_irq(void);  #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h>  #include <mach/devices.h> -#include <plat/i2c.h> -#include <plat/pxa3xx_nand.h> +#include <linux/platform_data/mtd-nand-pxa3xx.h> +#include <video/mmp_disp.h>  extern struct pxa_device_desc pxa910_device_uart1;  extern struct pxa_device_desc pxa910_device_uart2; @@ -20,6 +20,14 @@ extern struct pxa_device_desc pxa910_device_pwm2;  extern struct pxa_device_desc pxa910_device_pwm3;  extern struct pxa_device_desc pxa910_device_pwm4;  extern struct pxa_device_desc pxa910_device_nand; +extern struct platform_device pxa168_device_u2o; +extern struct platform_device pxa168_device_u2ootg; +extern struct platform_device pxa168_device_u2oehci; +extern struct pxa_device_desc pxa910_device_disp; +extern struct pxa_device_desc pxa910_device_fb; +extern struct pxa_device_desc pxa910_device_panel; +extern struct platform_device pxa910_device_gpio; +extern struct platform_device pxa910_device_rtc;  static inline int pxa910_add_uart(int id)  { diff --git a/arch/arm/mach-mmp/include/mach/regs-apbc.h b/arch/arm/mach-mmp/include/mach/regs-apbc.h index 1a96585336b..ddc812f4034 100644 --- a/arch/arm/mach-mmp/include/mach/regs-apbc.h +++ b/arch/arm/mach-mmp/include/mach/regs-apbc.h @@ -13,103 +13,6 @@  #include <mach/addr-map.h> -#define APBC_VIRT_BASE	(APB_VIRT_BASE + 0x015000) -#define APBC_REG(x)	(APBC_VIRT_BASE + (x)) - -/* - * APB clock register offsets for PXA168 - */ -#define APBC_PXA168_UART1	APBC_REG(0x000) -#define APBC_PXA168_UART2	APBC_REG(0x004) -#define APBC_PXA168_GPIO	APBC_REG(0x008) -#define APBC_PXA168_PWM1	APBC_REG(0x00c) -#define APBC_PXA168_PWM2	APBC_REG(0x010) -#define APBC_PXA168_PWM3	APBC_REG(0x014) -#define APBC_PXA168_PWM4	APBC_REG(0x018) -#define APBC_PXA168_RTC		APBC_REG(0x028) -#define APBC_PXA168_TWSI0	APBC_REG(0x02c) -#define APBC_PXA168_KPC		APBC_REG(0x030) -#define APBC_PXA168_TIMERS	APBC_REG(0x034) -#define APBC_PXA168_AIB		APBC_REG(0x03c) -#define APBC_PXA168_SW_JTAG	APBC_REG(0x040) -#define APBC_PXA168_ONEWIRE	APBC_REG(0x048) -#define APBC_PXA168_ASFAR	APBC_REG(0x050) -#define APBC_PXA168_ASSAR	APBC_REG(0x054) -#define APBC_PXA168_TWSI1	APBC_REG(0x06c) -#define APBC_PXA168_UART3	APBC_REG(0x070) -#define APBC_PXA168_AC97	APBC_REG(0x084) -#define APBC_PXA168_SSP1	APBC_REG(0x81c) -#define APBC_PXA168_SSP2	APBC_REG(0x820) -#define APBC_PXA168_SSP3	APBC_REG(0x84c) -#define APBC_PXA168_SSP4	APBC_REG(0x858) -#define APBC_PXA168_SSP5	APBC_REG(0x85c) - -/* - * APB Clock register offsets for PXA910 - */ -#define APBC_PXA910_UART0	APBC_REG(0x000) -#define APBC_PXA910_UART1	APBC_REG(0x004) -#define APBC_PXA910_GPIO	APBC_REG(0x008) -#define APBC_PXA910_PWM1	APBC_REG(0x00c) -#define APBC_PXA910_PWM2	APBC_REG(0x010) -#define APBC_PXA910_PWM3	APBC_REG(0x014) -#define APBC_PXA910_PWM4	APBC_REG(0x018) -#define APBC_PXA910_SSP1	APBC_REG(0x01c) -#define APBC_PXA910_SSP2	APBC_REG(0x020) -#define APBC_PXA910_IPC		APBC_REG(0x024) -#define APBC_PXA910_TWSI0	APBC_REG(0x02c) -#define APBC_PXA910_KPC		APBC_REG(0x030) -#define APBC_PXA910_TIMERS	APBC_REG(0x034) -#define APBC_PXA910_TBROT	APBC_REG(0x038) -#define APBC_PXA910_AIB		APBC_REG(0x03c) -#define APBC_PXA910_SW_JTAG	APBC_REG(0x040) -#define APBC_PXA910_TIMERS1	APBC_REG(0x044) -#define APBC_PXA910_ONEWIRE	APBC_REG(0x048) -#define APBC_PXA910_SSP3	APBC_REG(0x04c) -#define APBC_PXA910_ASFAR	APBC_REG(0x050) -#define APBC_PXA910_ASSAR	APBC_REG(0x054) - -/* - * APB Clock register offsets for MMP2 - */ -#define APBC_MMP2_RTC		APBC_REG(0x000) -#define APBC_MMP2_TWSI1		APBC_REG(0x004) -#define APBC_MMP2_TWSI2		APBC_REG(0x008) -#define APBC_MMP2_TWSI3		APBC_REG(0x00c) -#define APBC_MMP2_TWSI4		APBC_REG(0x010) -#define APBC_MMP2_ONEWIRE	APBC_REG(0x014) -#define APBC_MMP2_KPC		APBC_REG(0x018) -#define APBC_MMP2_TB_ROTARY	APBC_REG(0x01c) -#define APBC_MMP2_SW_JTAG	APBC_REG(0x020) -#define APBC_MMP2_TIMERS	APBC_REG(0x024) -#define APBC_MMP2_UART1		APBC_REG(0x02c) -#define APBC_MMP2_UART2		APBC_REG(0x030) -#define APBC_MMP2_UART3		APBC_REG(0x034) -#define APBC_MMP2_GPIO		APBC_REG(0x038) -#define APBC_MMP2_PWM0		APBC_REG(0x03c) -#define APBC_MMP2_PWM1		APBC_REG(0x040) -#define APBC_MMP2_PWM2		APBC_REG(0x044) -#define APBC_MMP2_PWM3		APBC_REG(0x048) -#define APBC_MMP2_SSP0		APBC_REG(0x04c) -#define APBC_MMP2_SSP1		APBC_REG(0x050) -#define APBC_MMP2_SSP2		APBC_REG(0x054) -#define APBC_MMP2_SSP3		APBC_REG(0x058) -#define APBC_MMP2_SSP4		APBC_REG(0x05c) -#define APBC_MMP2_SSP5		APBC_REG(0x060) -#define APBC_MMP2_AIB		APBC_REG(0x064) -#define APBC_MMP2_ASFAR		APBC_REG(0x068) -#define APBC_MMP2_ASSAR		APBC_REG(0x06c) -#define APBC_MMP2_USIM		APBC_REG(0x070) -#define APBC_MMP2_MPMU		APBC_REG(0x074) -#define APBC_MMP2_IPC		APBC_REG(0x078) -#define APBC_MMP2_TWSI5		APBC_REG(0x07c) -#define APBC_MMP2_TWSI6		APBC_REG(0x080) -#define APBC_MMP2_TWSI_INTSTS	APBC_REG(0x084) -#define APBC_MMP2_UART4		APBC_REG(0x088) -#define APBC_MMP2_RIPC		APBC_REG(0x08c) -#define APBC_MMP2_THSENS1	APBC_REG(0x090)	/* Thermal Sensor */ -#define APBC_MMP2_THSENS_INTSTS	APBC_REG(0x0a4) -  /* Common APB clock register bit definitions */  #define APBC_APBCLK	(1 << 0)  /* APB Bus Clock Enable */  #define APBC_FNCLK	(1 << 1)  /* Functional Clock Enable */ diff --git a/arch/arm/mach-mmp/include/mach/regs-apmu.h b/arch/arm/mach-mmp/include/mach/regs-apmu.h index ac4702357a6..93c8d0e29bb 100644 --- a/arch/arm/mach-mmp/include/mach/regs-apmu.h +++ b/arch/arm/mach-mmp/include/mach/regs-apmu.h @@ -13,21 +13,6 @@  #include <mach/addr-map.h> -#define APMU_VIRT_BASE	(AXI_VIRT_BASE + 0x82800) -#define APMU_REG(x)	(APMU_VIRT_BASE + (x)) - -/* Clock Reset Control */ -#define APMU_IRE	APMU_REG(0x048) -#define APMU_LCD	APMU_REG(0x04c) -#define APMU_CCIC	APMU_REG(0x050) -#define APMU_SDH0	APMU_REG(0x054) -#define APMU_SDH1	APMU_REG(0x058) -#define APMU_USB	APMU_REG(0x05c) -#define APMU_NAND	APMU_REG(0x060) -#define APMU_DMA	APMU_REG(0x064) -#define APMU_GEU	APMU_REG(0x068) -#define APMU_BUS	APMU_REG(0x06c) -  #define APMU_FNCLK_EN	(1 << 4)  #define APMU_AXICLK_EN	(1 << 3)  #define APMU_FNRST_DIS	(1 << 1) diff --git a/arch/arm/mach-mmp/include/mach/regs-rtc.h b/arch/arm/mach-mmp/include/mach/regs-rtc.h new file mode 100644 index 00000000000..5bff886a394 --- /dev/null +++ b/arch/arm/mach-mmp/include/mach/regs-rtc.h @@ -0,0 +1,23 @@ +#ifndef __ASM_MACH_REGS_RTC_H +#define __ASM_MACH_REGS_RTC_H + +#include <mach/addr-map.h> + +#define RTC_VIRT_BASE	(APB_VIRT_BASE + 0x10000) +#define RTC_REG(x)	(*((volatile u32 __iomem *)(RTC_VIRT_BASE + (x)))) + +/* + * Real Time Clock + */ + +#define RCNR		RTC_REG(0x00)	/* RTC Count Register */ +#define RTAR		RTC_REG(0x04)	/* RTC Alarm Register */ +#define RTSR		RTC_REG(0x08)	/* RTC Status Register */ +#define RTTR		RTC_REG(0x0C)	/* RTC Timer Trim Register */ + +#define RTSR_HZE	(1 << 3)	/* HZ interrupt enable */ +#define RTSR_ALE	(1 << 2)	/* RTC alarm interrupt enable */ +#define RTSR_HZ		(1 << 1)	/* HZ rising-edge detected */ +#define RTSR_AL		(1 << 0)	/* RTC alarm detected */ + +#endif /* __ASM_MACH_REGS_RTC_H */ diff --git a/arch/arm/mach-mmp/include/mach/regs-usb.h b/arch/arm/mach-mmp/include/mach/regs-usb.h new file mode 100644 index 00000000000..b047bf48750 --- /dev/null +++ b/arch/arm/mach-mmp/include/mach/regs-usb.h @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2011 Marvell International Ltd. All rights reserved. + * + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version. + */ + +#ifndef __ASM_ARCH_REGS_USB_H +#define __ASM_ARCH_REGS_USB_H + +#define PXA168_U2O_REGBASE	(0xd4208000) +#define PXA168_U2O_PHYBASE	(0xd4207000) + +#define PXA168_U2H_REGBASE      (0xd4209000) +#define PXA168_U2H_PHYBASE      (0xd4206000) + +#define MMP3_HSIC1_REGBASE	(0xf0001000) +#define MMP3_HSIC1_PHYBASE	(0xf0001800) + +#define MMP3_HSIC2_REGBASE	(0xf0002000) +#define MMP3_HSIC2_PHYBASE	(0xf0002800) + +#define MMP3_FSIC_REGBASE	(0xf0003000) +#define MMP3_FSIC_PHYBASE	(0xf0003800) + + +#define USB_REG_RANGE		(0x1ff) +#define USB_PHY_RANGE		(0xff) + +/* registers */ +#define U2x_CAPREGS_OFFSET       0x100 + +/* phy regs */ +#define UTMI_REVISION		0x0 +#define UTMI_CTRL		0x4 +#define UTMI_PLL		0x8 +#define UTMI_TX			0xc +#define UTMI_RX			0x10 +#define UTMI_IVREF		0x14 +#define UTMI_T0			0x18 +#define UTMI_T1			0x1c +#define UTMI_T2			0x20 +#define UTMI_T3			0x24 +#define UTMI_T4			0x28 +#define UTMI_T5			0x2c +#define UTMI_RESERVE		0x30 +#define UTMI_USB_INT		0x34 +#define UTMI_DBG_CTL		0x38 +#define UTMI_OTG_ADDON		0x3c + +/* For UTMICTRL Register */ +#define UTMI_CTRL_USB_CLK_EN                    (1 << 31) +/* pxa168 */ +#define UTMI_CTRL_SUSPEND_SET1                  (1 << 30) +#define UTMI_CTRL_SUSPEND_SET2                  (1 << 29) +#define UTMI_CTRL_RXBUF_PDWN                    (1 << 24) +#define UTMI_CTRL_TXBUF_PDWN                    (1 << 11) + +#define UTMI_CTRL_INPKT_DELAY_SHIFT             30 +#define UTMI_CTRL_INPKT_DELAY_SOF_SHIFT		28 +#define UTMI_CTRL_PU_REF_SHIFT			20 +#define UTMI_CTRL_ARC_PULLDN_SHIFT              12 +#define UTMI_CTRL_PLL_PWR_UP_SHIFT              1 +#define UTMI_CTRL_PWR_UP_SHIFT                  0 + +/* For UTMI_PLL Register */ +#define UTMI_PLL_PLLCALI12_SHIFT		29 +#define UTMI_PLL_PLLCALI12_MASK			(0x3 << 29) + +#define UTMI_PLL_PLLVDD18_SHIFT			27 +#define UTMI_PLL_PLLVDD18_MASK			(0x3 << 27) + +#define UTMI_PLL_PLLVDD12_SHIFT			25 +#define UTMI_PLL_PLLVDD12_MASK			(0x3 << 25) + +#define UTMI_PLL_CLK_BLK_EN_SHIFT               24 +#define CLK_BLK_EN                              (0x1 << 24) +#define PLL_READY                               (0x1 << 23) +#define KVCO_EXT                                (0x1 << 22) +#define VCOCAL_START                            (0x1 << 21) + +#define UTMI_PLL_KVCO_SHIFT			15 +#define UTMI_PLL_KVCO_MASK                      (0x7 << 15) + +#define UTMI_PLL_ICP_SHIFT			12 +#define UTMI_PLL_ICP_MASK                       (0x7 << 12) + +#define UTMI_PLL_FBDIV_SHIFT                    4 +#define UTMI_PLL_FBDIV_MASK                     (0xFF << 4) + +#define UTMI_PLL_REFDIV_SHIFT                   0 +#define UTMI_PLL_REFDIV_MASK                    (0xF << 0) + +/* For UTMI_TX Register */ +#define UTMI_TX_REG_EXT_FS_RCAL_SHIFT		27 +#define UTMI_TX_REG_EXT_FS_RCAL_MASK		(0xf << 27) + +#define UTMI_TX_REG_EXT_FS_RCAL_EN_SHIFT	26 +#define UTMI_TX_REG_EXT_FS_RCAL_EN_MASK		(0x1 << 26) + +#define UTMI_TX_TXVDD12_SHIFT                   22 +#define UTMI_TX_TXVDD12_MASK                    (0x3 << 22) + +#define UTMI_TX_CK60_PHSEL_SHIFT                17 +#define UTMI_TX_CK60_PHSEL_MASK                 (0xf << 17) + +#define UTMI_TX_IMPCAL_VTH_SHIFT                14 +#define UTMI_TX_IMPCAL_VTH_MASK                 (0x7 << 14) + +#define REG_RCAL_START                          (0x1 << 12) + +#define UTMI_TX_LOW_VDD_EN_SHIFT                11 + +#define UTMI_TX_AMP_SHIFT			0 +#define UTMI_TX_AMP_MASK			(0x7 << 0) + +/* For UTMI_RX Register */ +#define UTMI_REG_SQ_LENGTH_SHIFT                15 +#define UTMI_REG_SQ_LENGTH_MASK                 (0x3 << 15) + +#define UTMI_RX_SQ_THRESH_SHIFT                 4 +#define UTMI_RX_SQ_THRESH_MASK                  (0xf << 4) + +#define UTMI_OTG_ADDON_OTG_ON			(1 << 0) + +/* For MMP3 USB Phy */ +#define USB2_PLL_REG0		0x4 +#define USB2_PLL_REG1		0x8 +#define USB2_TX_REG0		0x10 +#define USB2_TX_REG1		0x14 +#define USB2_TX_REG2		0x18 +#define USB2_RX_REG0		0x20 +#define USB2_RX_REG1		0x24 +#define USB2_RX_REG2		0x28 +#define USB2_ANA_REG0		0x30 +#define USB2_ANA_REG1		0x34 +#define USB2_ANA_REG2		0x38 +#define USB2_DIG_REG0		0x3C +#define USB2_DIG_REG1		0x40 +#define USB2_DIG_REG2		0x44 +#define USB2_DIG_REG3		0x48 +#define USB2_TEST_REG0		0x4C +#define USB2_TEST_REG1		0x50 +#define USB2_TEST_REG2		0x54 +#define USB2_CHARGER_REG0	0x58 +#define USB2_OTG_REG0		0x5C +#define USB2_PHY_MON0		0x60 +#define USB2_RESETVE_REG0	0x64 +#define USB2_ICID_REG0		0x78 +#define USB2_ICID_REG1		0x7C + +/* USB2_PLL_REG0 */ +/* This is for Ax stepping */ +#define USB2_PLL_FBDIV_SHIFT_MMP3		0 +#define USB2_PLL_FBDIV_MASK_MMP3		(0xFF << 0) + +#define USB2_PLL_REFDIV_SHIFT_MMP3		8 +#define USB2_PLL_REFDIV_MASK_MMP3		(0xF << 8) + +#define USB2_PLL_VDD12_SHIFT_MMP3		12 +#define USB2_PLL_VDD18_SHIFT_MMP3		14 + +/* This is for B0 stepping */ +#define USB2_PLL_FBDIV_SHIFT_MMP3_B0		0 +#define USB2_PLL_REFDIV_SHIFT_MMP3_B0		9 +#define USB2_PLL_VDD18_SHIFT_MMP3_B0		14 +#define USB2_PLL_FBDIV_MASK_MMP3_B0		0x01FF +#define USB2_PLL_REFDIV_MASK_MMP3_B0		0x3E00 + +#define USB2_PLL_CAL12_SHIFT_MMP3		0 +#define USB2_PLL_CALI12_MASK_MMP3		(0x3 << 0) + +#define USB2_PLL_VCOCAL_START_SHIFT_MMP3	2 + +#define USB2_PLL_KVCO_SHIFT_MMP3		4 +#define USB2_PLL_KVCO_MASK_MMP3			(0x7<<4) + +#define USB2_PLL_ICP_SHIFT_MMP3			8 +#define USB2_PLL_ICP_MASK_MMP3			(0x7<<8) + +#define USB2_PLL_LOCK_BYPASS_SHIFT_MMP3		12 + +#define USB2_PLL_PU_PLL_SHIFT_MMP3		13 +#define USB2_PLL_PU_PLL_MASK			(0x1 << 13) + +#define USB2_PLL_READY_MASK_MMP3		(0x1 << 15) + +/* USB2_TX_REG0 */ +#define USB2_TX_IMPCAL_VTH_SHIFT_MMP3		8 +#define USB2_TX_IMPCAL_VTH_MASK_MMP3		(0x7 << 8) + +#define USB2_TX_RCAL_START_SHIFT_MMP3		13 + +/* USB2_TX_REG1 */ +#define USB2_TX_CK60_PHSEL_SHIFT_MMP3		0 +#define USB2_TX_CK60_PHSEL_MASK_MMP3		(0xf << 0) + +#define USB2_TX_AMP_SHIFT_MMP3			4 +#define USB2_TX_AMP_MASK_MMP3			(0x7 << 4) + +#define USB2_TX_VDD12_SHIFT_MMP3		8 +#define USB2_TX_VDD12_MASK_MMP3			(0x3 << 8) + +/* USB2_TX_REG2 */ +#define USB2_TX_DRV_SLEWRATE_SHIFT		10 + +/* USB2_RX_REG0 */ +#define USB2_RX_SQ_THRESH_SHIFT_MMP3		4 +#define USB2_RX_SQ_THRESH_MASK_MMP3		(0xf << 4) + +#define USB2_RX_SQ_LENGTH_SHIFT_MMP3		10 +#define USB2_RX_SQ_LENGTH_MASK_MMP3		(0x3 << 10) + +/* USB2_ANA_REG1*/ +#define USB2_ANA_PU_ANA_SHIFT_MMP3		14 + +/* USB2_OTG_REG0 */ +#define USB2_OTG_PU_OTG_SHIFT_MMP3		3 + +/* fsic registers */ +#define FSIC_MISC			0x4 +#define FSIC_INT			0x28 +#define FSIC_CTRL			0x30 + +/* HSIC registers */ +#define HSIC_PAD_CTRL			0x4 + +#define HSIC_CTRL			0x8 +#define HSIC_CTRL_HSIC_ENABLE		(1<<7) +#define HSIC_CTRL_PLL_BYPASS		(1<<4) + +#define TEST_GRP_0			0xc +#define TEST_GRP_1			0x10 + +#define HSIC_INT			0x14 +#define HSIC_INT_READY_INT_EN		(1<<10) +#define HSIC_INT_CONNECT_INT_EN		(1<<9) +#define HSIC_INT_CORE_INT_EN		(1<<8) +#define HSIC_INT_HS_READY		(1<<2) +#define HSIC_INT_CONNECT		(1<<1) +#define HSIC_INT_CORE			(1<<0) + +#define HSIC_CONFIG			0x18 +#define USBHSIC_CTRL			0x20 + +#define HSIC_USB_CTRL			0x28 +#define HSIC_USB_CTRL_CLKEN		1 +#define	HSIC_USB_CLK_PHY		0x0 +#define HSIC_USB_CLK_PMU		0x1 + +#endif /* __ASM_ARCH_PXA_U2O_H */ diff --git a/arch/arm/mach-mmp/include/mach/system.h b/arch/arm/mach-mmp/include/mach/system.h deleted file mode 100644 index 1a8a25edb1b..00000000000 --- a/arch/arm/mach-mmp/include/mach/system.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * linux/arch/arm/mach-mmp/include/mach/system.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_MACH_SYSTEM_H -#define __ASM_MACH_SYSTEM_H - -#include <mach/cputype.h> - -static inline void arch_idle(void) -{ -	cpu_do_idle(); -} - -static inline void arch_reset(char mode, const char *cmd) -{ -	if (cpu_is_pxa168()) -		cpu_reset(0xffff0000); -	else -		cpu_reset(0); -} -#endif /* __ASM_MACH_SYSTEM_H */ diff --git a/arch/arm/mach-mmp/include/mach/timex.h b/arch/arm/mach-mmp/include/mach/timex.h deleted file mode 100644 index 70c9f1d88c0..00000000000 --- a/arch/arm/mach-mmp/include/mach/timex.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * linux/arch/arm/mach-mmp/include/mach/timex.h - * - * 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. - */ - -#ifdef CONFIG_CPU_MMP2 -#define CLOCK_TICK_RATE		6500000 -#else -#define CLOCK_TICK_RATE		3250000 -#endif diff --git a/arch/arm/mach-mmp/include/mach/uncompress.h b/arch/arm/mach-mmp/include/mach/uncompress.h index 85bd8a2d84b..8890fa8fa77 100644 --- a/arch/arm/mach-mmp/include/mach/uncompress.h +++ b/arch/arm/mach-mmp/include/mach/uncompress.h @@ -14,7 +14,7 @@  #define UART2_BASE	(APB_PHYS_BASE + 0x17000)  #define UART3_BASE	(APB_PHYS_BASE + 0x18000) -static volatile unsigned long *UART; +volatile unsigned long *UART;  static inline void putc(char c)  { @@ -43,9 +43,3 @@ static inline void arch_decomp_setup(void)  	if (machine_is_avengers_lite())  		UART = (unsigned long *)UART3_BASE;  } - -/* - * nothing to do - */ - -#define arch_decomp_wdog() diff --git a/arch/arm/mach-mmp/include/mach/vmalloc.h b/arch/arm/mach-mmp/include/mach/vmalloc.h deleted file mode 100644 index 1d0bac003ad..00000000000 --- a/arch/arm/mach-mmp/include/mach/vmalloc.h +++ /dev/null @@ -1,5 +0,0 @@ -/* - * linux/arch/arm/mach-mmp/include/mach/vmalloc.h - */ - -#define VMALLOC_END	0xfe000000UL diff --git a/arch/arm/mach-mmp/irq-mmp2.c b/arch/arm/mach-mmp/irq-mmp2.c deleted file mode 100644 index 01342be91c3..00000000000 --- a/arch/arm/mach-mmp/irq-mmp2.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - *  linux/arch/arm/mach-mmp/irq-mmp2.c - * - *  Generic IRQ handling, GPIO IRQ demultiplexing, etc. - * - *  Author:	Haojian Zhuang <haojian.zhuang@marvell.com> - *  Copyright:	Marvell International Ltd. - * - *  This program is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License version 2 as - *  published by the Free Software Foundation. - */ - -#include <linux/init.h> -#include <linux/irq.h> -#include <linux/io.h> - -#include <mach/regs-icu.h> -#include <mach/mmp2.h> - -#include "common.h" - -static void icu_mask_irq(unsigned int irq) -{ -	uint32_t r = __raw_readl(ICU_INT_CONF(irq)); - -	r &= ~ICU_INT_ROUTE_PJ4_IRQ; -	__raw_writel(r, ICU_INT_CONF(irq)); -} - -static void icu_unmask_irq(unsigned int irq) -{ -	uint32_t r = __raw_readl(ICU_INT_CONF(irq)); - -	r |= ICU_INT_ROUTE_PJ4_IRQ; -	__raw_writel(r, ICU_INT_CONF(irq)); -} - -static struct irq_chip icu_irq_chip = { -	.name		= "icu_irq", -	.mask		= icu_mask_irq, -	.mask_ack	= icu_mask_irq, -	.unmask		= icu_unmask_irq, -}; - -static void pmic_irq_ack(unsigned int irq) -{ -	if (irq == IRQ_MMP2_PMIC) -		mmp2_clear_pmic_int(); -} - -#define SECOND_IRQ_MASK(_name_, irq_base, prefix)			\ -static void _name_##_mask_irq(unsigned int irq)				\ -{									\ -	uint32_t r;							\ -	r = __raw_readl(prefix##_MASK) | (1 << (irq - irq_base));	\ -	__raw_writel(r, prefix##_MASK);					\ -} - -#define SECOND_IRQ_UNMASK(_name_, irq_base, prefix)			\ -static void _name_##_unmask_irq(unsigned int irq)			\ -{									\ -	uint32_t r;							\ -	r = __raw_readl(prefix##_MASK) & ~(1 << (irq - irq_base));	\ -	__raw_writel(r, prefix##_MASK);					\ -} - -#define SECOND_IRQ_DEMUX(_name_, irq_base, prefix)			\ -static void _name_##_irq_demux(unsigned int irq, struct irq_desc *desc)	\ -{									\ -	unsigned long status, mask, n;					\ -	mask = __raw_readl(prefix##_MASK);				\ -	while (1) {							\ -		status = __raw_readl(prefix##_STATUS) & ~mask;		\ -		if (status == 0)					\ -			break;						\ -		n = find_first_bit(&status, BITS_PER_LONG);		\ -		while (n < BITS_PER_LONG) {				\ -			generic_handle_irq(irq_base + n);		\ -			n = find_next_bit(&status, BITS_PER_LONG, n+1);	\ -		}							\ -	}								\ -} - -#define SECOND_IRQ_CHIP(_name_, irq_base, prefix)			\ -SECOND_IRQ_MASK(_name_, irq_base, prefix)				\ -SECOND_IRQ_UNMASK(_name_, irq_base, prefix)				\ -SECOND_IRQ_DEMUX(_name_, irq_base, prefix)				\ -static struct irq_chip _name_##_irq_chip = {				\ -	.name		= #_name_,					\ -	.mask		= _name_##_mask_irq,				\ -	.unmask		= _name_##_unmask_irq,				\ -} - -SECOND_IRQ_CHIP(pmic, IRQ_MMP2_PMIC_BASE, MMP2_ICU_INT4); -SECOND_IRQ_CHIP(rtc,  IRQ_MMP2_RTC_BASE,  MMP2_ICU_INT5); -SECOND_IRQ_CHIP(twsi, IRQ_MMP2_TWSI_BASE, MMP2_ICU_INT17); -SECOND_IRQ_CHIP(misc, IRQ_MMP2_MISC_BASE, MMP2_ICU_INT35); -SECOND_IRQ_CHIP(ssp,  IRQ_MMP2_SSP_BASE,  MMP2_ICU_INT51); - -static void init_mux_irq(struct irq_chip *chip, int start, int num) -{ -	int irq; - -	for (irq = start; num > 0; irq++, num--) { -		/* mask and clear the IRQ */ -		chip->mask(irq); -		if (chip->ack) -			chip->ack(irq); - -		set_irq_chip(irq, chip); -		set_irq_flags(irq, IRQF_VALID); -		set_irq_handler(irq, handle_level_irq); -	} -} - -void __init mmp2_init_icu(void) -{ -	int irq; - -	for (irq = 0; irq < IRQ_MMP2_MUX_BASE; irq++) { -		icu_mask_irq(irq); -		set_irq_chip(irq, &icu_irq_chip); -		set_irq_flags(irq, IRQF_VALID); - -		switch (irq) { -		case IRQ_MMP2_PMIC_MUX: -		case IRQ_MMP2_RTC_MUX: -		case IRQ_MMP2_TWSI_MUX: -		case IRQ_MMP2_MISC_MUX: -		case IRQ_MMP2_SSP_MUX: -			break; -		default: -			set_irq_handler(irq, handle_level_irq); -			break; -		} -	} - -	/* NOTE: IRQ_MMP2_PMIC requires the PMIC MFPR register -	 * to be written to clear the interrupt -	 */ -	pmic_irq_chip.ack = pmic_irq_ack; - -	init_mux_irq(&pmic_irq_chip, IRQ_MMP2_PMIC_BASE, 2); -	init_mux_irq(&rtc_irq_chip, IRQ_MMP2_RTC_BASE, 2); -	init_mux_irq(&twsi_irq_chip, IRQ_MMP2_TWSI_BASE, 5); -	init_mux_irq(&misc_irq_chip, IRQ_MMP2_MISC_BASE, 15); -	init_mux_irq(&ssp_irq_chip, IRQ_MMP2_SSP_BASE, 2); - -	set_irq_chained_handler(IRQ_MMP2_PMIC_MUX, pmic_irq_demux); -	set_irq_chained_handler(IRQ_MMP2_RTC_MUX, rtc_irq_demux); -	set_irq_chained_handler(IRQ_MMP2_TWSI_MUX, twsi_irq_demux); -	set_irq_chained_handler(IRQ_MMP2_MISC_MUX, misc_irq_demux); -	set_irq_chained_handler(IRQ_MMP2_SSP_MUX, ssp_irq_demux); -} diff --git a/arch/arm/mach-mmp/irq-pxa168.c b/arch/arm/mach-mmp/irq-pxa168.c deleted file mode 100644 index 52ff2f065eb..00000000000 --- a/arch/arm/mach-mmp/irq-pxa168.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - *  linux/arch/arm/mach-mmp/irq.c - * - *  Generic IRQ handling, GPIO IRQ demultiplexing, etc. - * - *  Author:	Bin Yang <bin.yang@marvell.com> - *  Created:	Sep 30, 2008 - *  Copyright:	Marvell International Ltd. - * - *  This program is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License version 2 as - *  published by the Free Software Foundation. - */ - -#include <linux/init.h> -#include <linux/irq.h> -#include <linux/io.h> - -#include <mach/regs-icu.h> - -#include "common.h" - -#define IRQ_ROUTE_TO_AP		(ICU_INT_CONF_AP_INT | ICU_INT_CONF_IRQ) - -#define PRIORITY_DEFAULT	0x1 -#define PRIORITY_NONE		0x0	/* means IRQ disabled */ - -static void icu_mask_irq(unsigned int irq) -{ -	__raw_writel(PRIORITY_NONE, ICU_INT_CONF(irq)); -} - -static void icu_unmask_irq(unsigned int irq) -{ -	__raw_writel(IRQ_ROUTE_TO_AP | PRIORITY_DEFAULT, ICU_INT_CONF(irq)); -} - -static struct irq_chip icu_irq_chip = { -	.name	= "icu_irq", -	.ack	= icu_mask_irq, -	.mask	= icu_mask_irq, -	.unmask	= icu_unmask_irq, -}; - -void __init icu_init_irq(void) -{ -	int irq; - -	for (irq = 0; irq < 64; irq++) { -		icu_mask_irq(irq); -		set_irq_chip(irq, &icu_irq_chip); -		set_irq_handler(irq, handle_level_irq); -		set_irq_flags(irq, IRQF_VALID); -	} -} diff --git a/arch/arm/mach-mmp/jasper.c b/arch/arm/mach-mmp/jasper.c index 2a684fa5077..0e9e5c05b37 100644 --- a/arch/arm/mach-mmp/jasper.c +++ b/arch/arm/mach-mmp/jasper.c @@ -12,14 +12,15 @@  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/gpio-pxa.h>  #include <linux/platform_device.h>  #include <linux/io.h> -#include <linux/gpio.h>  #include <linux/regulator/machine.h>  #include <linux/regulator/max8649.h>  #include <linux/mfd/max8925.h>  #include <linux/interrupt.h> +#include <mach/irqs.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <mach/addr-map.h> @@ -28,7 +29,7 @@  #include "common.h" -#define JASPER_NR_IRQS		(IRQ_BOARD_START + 48) +#define JASPER_NR_IRQS		(MMP_NR_IRQS + 48)  static unsigned long jasper_pin_config[] __initdata = {  	/* UART1 */ @@ -67,6 +68,40 @@ static unsigned long jasper_pin_config[] __initdata = {  	/* PMIC */  	PMIC_PMIC_INT | MFP_LPM_EDGE_FALL, + +	/* MMC1 */ +	GPIO131_MMC1_DAT3, +	GPIO132_MMC1_DAT2, +	GPIO133_MMC1_DAT1, +	GPIO134_MMC1_DAT0, +	GPIO136_MMC1_CMD, +	GPIO139_MMC1_CLK, +	GPIO140_MMC1_CD, +	GPIO141_MMC1_WP, + +	/* MMC2 */ +	GPIO37_MMC2_DAT3, +	GPIO38_MMC2_DAT2, +	GPIO39_MMC2_DAT1, +	GPIO40_MMC2_DAT0, +	GPIO41_MMC2_CMD, +	GPIO42_MMC2_CLK, + +	/* MMC3 */ +	GPIO165_MMC3_DAT7, +	GPIO162_MMC3_DAT6, +	GPIO166_MMC3_DAT5, +	GPIO163_MMC3_DAT4, +	GPIO167_MMC3_DAT3, +	GPIO164_MMC3_DAT2, +	GPIO168_MMC3_DAT1, +	GPIO111_MMC3_DAT0, +	GPIO112_MMC3_CMD, +	GPIO151_MMC3_CLK, +}; + +static struct pxa_gpio_platform_data mmp2_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0),  };  static struct regulator_consumer_supply max8649_supply[] = { @@ -106,7 +141,7 @@ static struct max8925_power_pdata jasper_power_data = {  static struct max8925_platform_data jasper_max8925_info = {  	.backlight		= &jasper_backlight_data,  	.power			= &jasper_power_data, -	.irq_base		= IRQ_BOARD_START, +	.irq_base		= MMP_NR_IRQS,  };  static struct i2c_board_info jasper_twsi1_info[] = { @@ -123,6 +158,10 @@ static struct i2c_board_info jasper_twsi1_info[] = {  	},  }; +static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = { +	.clk_delay_cycles = 0x1f, +}; +  static void __init jasper_init(void)  {  	mfp_config(ARRAY_AND_SIZE(jasper_pin_config)); @@ -131,6 +170,10 @@ static void __init jasper_init(void)  	mmp2_add_uart(1);  	mmp2_add_uart(3);  	mmp2_add_twsi(1, NULL, ARRAY_AND_SIZE(jasper_twsi1_info)); +	platform_device_add_data(&mmp2_device_gpio, &mmp2_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&mmp2_device_gpio); +	mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */  	regulator_has_full_constraints();  } @@ -139,6 +182,7 @@ MACHINE_START(MARVELL_JASPER, "Jasper Development Platform")  	.map_io		= mmp_map_io,  	.nr_irqs	= JASPER_NR_IRQS,  	.init_irq       = mmp2_init_irq, -	.timer          = &mmp2_timer, +	.init_time	= mmp2_timer_init,  	.init_machine   = jasper_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/mmp-dt.c b/arch/arm/mach-mmp/mmp-dt.c new file mode 100644 index 00000000000..cca529ceecb --- /dev/null +++ b/arch/arm/mach-mmp/mmp-dt.c @@ -0,0 +1,73 @@ +/* + *  linux/arch/arm/mach-mmp/mmp-dt.c + * + *  Copyright (C) 2012 Marvell Technology Group Ltd. + *  Author: Haojian Zhuang <haojian.zhuang@marvell.com> + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License version 2 as + *  publishhed by the Free Software Foundation. + */ + +#include <linux/irqchip.h> +#include <linux/of_platform.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> + +#include "common.h" + +extern void __init mmp_dt_init_timer(void); + +static const struct of_dev_auxdata pxa168_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4017000, "pxa2xx-uart.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4018000, "pxa2xx-uart.1", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4026000, "pxa2xx-uart.2", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4011000, "pxa2xx-i2c.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4025000, "pxa2xx-i2c.1", NULL), +	OF_DEV_AUXDATA("marvell,mmp-gpio", 0xd4019000, "mmp-gpio", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL), +	{} +}; + +static const struct of_dev_auxdata pxa910_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4017000, "pxa2xx-uart.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4018000, "pxa2xx-uart.1", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4036000, "pxa2xx-uart.2", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4011000, "pxa2xx-i2c.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4037000, "pxa2xx-i2c.1", NULL), +	OF_DEV_AUXDATA("marvell,mmp-gpio", 0xd4019000, "mmp-gpio", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL), +	{} +}; + +static void __init pxa168_dt_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, +			     pxa168_auxdata_lookup, NULL); +} + +static void __init pxa910_dt_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, +			     pxa910_auxdata_lookup, NULL); +} + +static const char *mmp_dt_board_compat[] __initdata = { +	"mrvl,pxa168-aspenite", +	"mrvl,pxa910-dkb", +	NULL, +}; + +DT_MACHINE_START(PXA168_DT, "Marvell PXA168 (Device Tree Support)") +	.map_io		= mmp_map_io, +	.init_time	= mmp_dt_init_timer, +	.init_machine	= pxa168_dt_init, +	.dt_compat	= mmp_dt_board_compat, +MACHINE_END + +DT_MACHINE_START(PXA910_DT, "Marvell PXA910 (Device Tree Support)") +	.map_io		= mmp_map_io, +	.init_time	= mmp_dt_init_timer, +	.init_machine	= pxa910_dt_init, +	.dt_compat	= mmp_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-mmp/mmp2-dt.c b/arch/arm/mach-mmp/mmp2-dt.c new file mode 100644 index 00000000000..023cb453f15 --- /dev/null +++ b/arch/arm/mach-mmp/mmp2-dt.c @@ -0,0 +1,50 @@ +/* + *  linux/arch/arm/mach-mmp/mmp2-dt.c + * + *  Copyright (C) 2012 Marvell Technology Group Ltd. + *  Author: Haojian Zhuang <haojian.zhuang@marvell.com> + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License version 2 as + *  publishhed by the Free Software Foundation. + */ + +#include <linux/io.h> +#include <linux/irqchip.h> +#include <linux/of_platform.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> + +#include "common.h" + +extern void __init mmp_dt_init_timer(void); + +static const struct of_dev_auxdata mmp2_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4030000, "pxa2xx-uart.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4017000, "pxa2xx-uart.1", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4018000, "pxa2xx-uart.2", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4016000, "pxa2xx-uart.3", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4011000, "pxa2xx-i2c.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4025000, "pxa2xx-i2c.1", NULL), +	OF_DEV_AUXDATA("marvell,mmp-gpio", 0xd4019000, "mmp2-gpio", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL), +	{} +}; + +static void __init mmp2_dt_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, +			     mmp2_auxdata_lookup, NULL); +} + +static const char *mmp2_dt_board_compat[] __initdata = { +	"mrvl,mmp2-brownstone", +	NULL, +}; + +DT_MACHINE_START(MMP2_DT, "Marvell MMP2 (Device Tree Support)") +	.map_io		= mmp_map_io, +	.init_time	= mmp_dt_init_timer, +	.init_machine	= mmp2_dt_init, +	.dt_compat	= mmp2_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-mmp/mmp2.c b/arch/arm/mach-mmp/mmp2.c index daf3993349f..a70b5530bd4 100644 --- a/arch/arm/mach-mmp/mmp2.c +++ b/arch/arm/mach-mmp/mmp2.c @@ -9,33 +9,31 @@   * 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/io.h> +#include <linux/irq.h> +#include <linux/irqchip/mmp.h> +#include <linux/platform_device.h>  #include <asm/hardware/cache-tauros2.h>  #include <asm/mach/time.h>  #include <mach/addr-map.h>  #include <mach/regs-apbc.h> -#include <mach/regs-apmu.h>  #include <mach/cputype.h>  #include <mach/irqs.h>  #include <mach/dma.h>  #include <mach/mfp.h> -#include <mach/gpio.h>  #include <mach/devices.h>  #include <mach/mmp2.h> +#include <mach/pm-mmp2.h>  #include "common.h" -#include "clock.h"  #define MFPR_VIRT_BASE	(APB_VIRT_BASE + 0x1e000) -#define APMASK(i)	(GPIO_REGS_VIRT + BANK_OFF(i) + 0x9c) -  static struct mfp_addr_map mmp2_addr_map[] __initdata = {  	MFP_ADDR_X(GPIO0, GPIO58, 0x54), @@ -87,7 +85,8 @@ static struct mfp_addr_map mmp2_addr_map[] __initdata = {  void mmp2_clear_pmic_int(void)  { -	unsigned long mfpr_pmic, data; +	void __iomem *mfpr_pmic; +	unsigned long data;  	mfpr_pmic = APB_VIRT_BASE + 0x1e000 + 0x2c4;  	data = __raw_readl(mfpr_pmic); @@ -95,91 +94,48 @@ void mmp2_clear_pmic_int(void)  	__raw_writel(data, mfpr_pmic);  } -static void __init mmp2_init_gpio(void) -{ -	int i; - -	/* enable GPIO clock */ -	__raw_writel(APBC_APBCLK | APBC_FNCLK, APBC_MMP2_GPIO); - -	/* unmask GPIO edge detection for all 6 banks -- APMASKx */ -	for (i = 0; i < 6; i++) -		__raw_writel(0xffffffff, APMASK(i)); - -	pxa_init_gpio(IRQ_MMP2_GPIO, 0, 167, NULL); -} -  void __init mmp2_init_irq(void)  {  	mmp2_init_icu(); -	mmp2_init_gpio(); +#ifdef CONFIG_PM +	icu_irq_chip.irq_set_wake = mmp2_set_wake; +#endif  } -/* APB peripheral clocks */ -static APBC_CLK(uart1, MMP2_UART1, 1, 26000000); -static APBC_CLK(uart2, MMP2_UART2, 1, 26000000); -static APBC_CLK(uart3, MMP2_UART3, 1, 26000000); -static APBC_CLK(uart4, MMP2_UART4, 1, 26000000); -static APBC_CLK(twsi1, MMP2_TWSI1, 0, 26000000); -static APBC_CLK(twsi2, MMP2_TWSI2, 0, 26000000); -static APBC_CLK(twsi3, MMP2_TWSI3, 0, 26000000); -static APBC_CLK(twsi4, MMP2_TWSI4, 0, 26000000); -static APBC_CLK(twsi5, MMP2_TWSI5, 0, 26000000); -static APBC_CLK(twsi6, MMP2_TWSI6, 0, 26000000); -static APBC_CLK(rtc, MMP2_RTC, 0, 32768); - -static APMU_CLK(nand, NAND, 0xbf, 100000000); - -static struct clk_lookup mmp2_clkregs[] = { -	INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL), -	INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL), -	INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL), -	INIT_CLKREG(&clk_uart4, "pxa2xx-uart.3", NULL), -	INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.0", NULL), -	INIT_CLKREG(&clk_twsi2, "pxa2xx-i2c.1", NULL), -	INIT_CLKREG(&clk_twsi3, "pxa2xx-i2c.2", NULL), -	INIT_CLKREG(&clk_twsi4, "pxa2xx-i2c.3", NULL), -	INIT_CLKREG(&clk_twsi5, "pxa2xx-i2c.4", NULL), -	INIT_CLKREG(&clk_twsi6, "pxa2xx-i2c.5", NULL), -	INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), -}; -  static int __init mmp2_init(void)  {  	if (cpu_is_mmp2()) {  #ifdef CONFIG_CACHE_TAUROS2 -		tauros2_init(); +		tauros2_init(0);  #endif  		mfp_init_base(MFPR_VIRT_BASE);  		mfp_init_addr(mmp2_addr_map);  		pxa_init_dma(IRQ_MMP2_DMA_RIQ, 16); -		clkdev_add_table(ARRAY_AND_SIZE(mmp2_clkregs)); +		mmp2_clk_init();  	}  	return 0;  }  postcore_initcall(mmp2_init); -static void __init mmp2_timer_init(void) +#define APBC_TIMERS	APBC_REG(0x024) + +void __init mmp2_timer_init(void)  {  	unsigned long clk_rst; -	__raw_writel(APBC_APBCLK | APBC_RST, APBC_MMP2_TIMERS); +	__raw_writel(APBC_APBCLK | APBC_RST, APBC_TIMERS);  	/*  	 * enable bus/functional clock, enable 6.5MHz (divider 4),  	 * release reset  	 */  	clk_rst = APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(1); -	__raw_writel(clk_rst, APBC_MMP2_TIMERS); +	__raw_writel(clk_rst, APBC_TIMERS);  	timer_init(IRQ_MMP2_TIMER1);  } -struct sys_timer mmp2_timer = { -	.init	= mmp2_timer_init, -}; -  /* on-chip devices */  MMP2_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4030000, 0x30, 4, 5);  MMP2_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4017000, 0x30, 20, 21); @@ -192,4 +148,30 @@ MMP2_DEVICE(twsi4, "pxa2xx-i2c", 3, TWSI4, 0xd4033000, 0x70);  MMP2_DEVICE(twsi5, "pxa2xx-i2c", 4, TWSI5, 0xd4033800, 0x70);  MMP2_DEVICE(twsi6, "pxa2xx-i2c", 5, TWSI6, 0xd4034000, 0x70);  MMP2_DEVICE(nand, "pxa3xx-nand", -1, NAND, 0xd4283000, 0x100, 28, 29); +MMP2_DEVICE(sdh0, "sdhci-pxav3", 0, MMC, 0xd4280000, 0x120); +MMP2_DEVICE(sdh1, "sdhci-pxav3", 1, MMC2, 0xd4280800, 0x120); +MMP2_DEVICE(sdh2, "sdhci-pxav3", 2, MMC3, 0xd4281000, 0x120); +MMP2_DEVICE(sdh3, "sdhci-pxav3", 3, MMC4, 0xd4281800, 0x120); +MMP2_DEVICE(asram, "asram", -1, NONE, 0xe0000000, 0x4000); +/* 0xd1000000 ~ 0xd101ffff is reserved for secure processor */ +MMP2_DEVICE(isram, "isram", -1, NONE, 0xd1020000, 0x18000); + +struct resource mmp2_resource_gpio[] = { +	{ +		.start	= 0xd4019000, +		.end	= 0xd4019fff, +		.flags	= IORESOURCE_MEM, +	}, { +		.start	= IRQ_MMP2_GPIO, +		.end	= IRQ_MMP2_GPIO, +		.name	= "gpio_mux", +		.flags	= IORESOURCE_IRQ, +	}, +}; +struct platform_device mmp2_device_gpio = { +	.name		= "mmp2-gpio", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(mmp2_resource_gpio), +	.resource	= mmp2_resource_gpio, +}; diff --git a/arch/arm/mach-mmp/pm-mmp2.c b/arch/arm/mach-mmp/pm-mmp2.c new file mode 100644 index 00000000000..43b1a516957 --- /dev/null +++ b/arch/arm/mach-mmp/pm-mmp2.c @@ -0,0 +1,250 @@ +/* + * MMP2 Power Management Routines + * + * This software program is licensed subject to the GNU General Public License + * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html + * + * (C) Copyright 2012 Marvell International Ltd. + * All Rights Reserved + */ + +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/err.h> +#include <linux/time.h> +#include <linux/delay.h> +#include <linux/suspend.h> +#include <linux/irq.h> +#include <linux/io.h> +#include <linux/interrupt.h> +#include <asm/mach-types.h> +#include <mach/hardware.h> +#include <mach/cputype.h> +#include <mach/addr-map.h> +#include <mach/pm-mmp2.h> +#include <mach/regs-icu.h> +#include <mach/irqs.h> + +int mmp2_set_wake(struct irq_data *d, unsigned int on) +{ +	unsigned long data = 0; +	int irq = d->irq; + +	/* enable wakeup sources */ +	switch (irq) { +	case IRQ_MMP2_RTC: +	case IRQ_MMP2_RTC_ALARM: +		data = MPMU_WUCRM_PJ_WAKEUP(4) | MPMU_WUCRM_PJ_RTC_ALARM; +		break; +	case IRQ_MMP2_PMIC: +		data = MPMU_WUCRM_PJ_WAKEUP(7); +		break; +	case IRQ_MMP2_MMC2: +		/* mmc use WAKEUP2, same as GPIO wakeup source */ +		data = MPMU_WUCRM_PJ_WAKEUP(2); +		break; +	} +	if (on) { +		if (data) { +			data |= __raw_readl(MPMU_WUCRM_PJ); +			__raw_writel(data, MPMU_WUCRM_PJ); +		} +	} else { +		if (data) { +			data = ~data & __raw_readl(MPMU_WUCRM_PJ); +			__raw_writel(data, MPMU_WUCRM_PJ); +		} +	} +	return 0; +} + +static void pm_scu_clk_disable(void) +{ +	unsigned int val; + +	/* close AXI fabric clock gate */ +	__raw_writel(0x0, CIU_REG(0x64)); +	__raw_writel(0x0, CIU_REG(0x68)); + +	/* close MCB master clock gate */ +	val = __raw_readl(CIU_REG(0x1c)); +	val |= 0xf0; +	__raw_writel(val, CIU_REG(0x1c)); + +	return ; +} + +static void pm_scu_clk_enable(void) +{ +	unsigned int val; + +	/* open AXI fabric clock gate */ +	__raw_writel(0x03003003, CIU_REG(0x64)); +	__raw_writel(0x00303030, CIU_REG(0x68)); + +	/* open MCB master clock gate */ +	val = __raw_readl(CIU_REG(0x1c)); +	val &= ~(0xf0); +	__raw_writel(val, CIU_REG(0x1c)); + +	return ; +} + +static void pm_mpmu_clk_disable(void) +{ +	/* +	 * disable clocks in MPMU_CGR_PJ register +	 * except clock for APMU_PLL1, APMU_PLL1_2 and AP_26M +	 */ +	__raw_writel(0x0000a010, MPMU_CGR_PJ); +} + +static void pm_mpmu_clk_enable(void) +{ +	unsigned int val; + +	__raw_writel(0xdffefffe, MPMU_CGR_PJ); +	val = __raw_readl(MPMU_PLL2_CTRL1); +	val |= (1 << 29); +	__raw_writel(val, MPMU_PLL2_CTRL1); + +	return ; +} + +void mmp2_pm_enter_lowpower_mode(int state) +{ +	uint32_t idle_cfg, apcr; + +	idle_cfg = __raw_readl(APMU_PJ_IDLE_CFG); +	apcr = __raw_readl(MPMU_PCR_PJ); +	apcr &= ~(MPMU_PCR_PJ_SLPEN | MPMU_PCR_PJ_DDRCORSD | MPMU_PCR_PJ_APBSD +		 | MPMU_PCR_PJ_AXISD | MPMU_PCR_PJ_VCTCXOSD | (1 << 13)); +	idle_cfg &= ~APMU_PJ_IDLE_CFG_PJ_IDLE; + +	switch (state) { +	case POWER_MODE_SYS_SLEEP: +		apcr |= MPMU_PCR_PJ_SLPEN;		/* set the SLPEN bit */ +		apcr |= MPMU_PCR_PJ_VCTCXOSD;		/* set VCTCXOSD */ +		/* fall through */ +	case POWER_MODE_CHIP_SLEEP: +		apcr |= MPMU_PCR_PJ_SLPEN; +		/* fall through */ +	case POWER_MODE_APPS_SLEEP: +		apcr |= MPMU_PCR_PJ_APBSD;		/* set APBSD */ +		/* fall through */ +	case POWER_MODE_APPS_IDLE: +		apcr |= MPMU_PCR_PJ_AXISD;		/* set AXISDD bit */ +		apcr |= MPMU_PCR_PJ_DDRCORSD;		/* set DDRCORSD bit */ +		idle_cfg |= APMU_PJ_IDLE_CFG_PJ_PWRDWN;	/* PJ power down */ +		apcr |= MPMU_PCR_PJ_SPSD; +		/* fall through */ +	case POWER_MODE_CORE_EXTIDLE: +		idle_cfg |= APMU_PJ_IDLE_CFG_PJ_IDLE;	/* set the IDLE bit */ +		idle_cfg &= ~APMU_PJ_IDLE_CFG_ISO_MODE_CNTRL_MASK; +		idle_cfg |= APMU_PJ_IDLE_CFG_PWR_SW(3) +			| APMU_PJ_IDLE_CFG_L2_PWR_SW; +		break; +	case POWER_MODE_CORE_INTIDLE: +		apcr &= ~MPMU_PCR_PJ_SPSD; +		break; +	} + +	/* set reserve bits */ +	apcr |= (1 << 30) | (1 << 25); + +	/* finally write the registers back */ +	__raw_writel(idle_cfg, APMU_PJ_IDLE_CFG); +	__raw_writel(apcr, MPMU_PCR_PJ);	/* 0xfe086000 */ +} + +static int mmp2_pm_enter(suspend_state_t state) +{ +	int temp; + +	temp = __raw_readl(MMP2_ICU_INT4_MASK); +	if (temp & (1 << 1)) { +		printk(KERN_ERR "%s: PMIC interrupt is handling\n", __func__); +		return -EAGAIN; +	} + +	temp = __raw_readl(APMU_SRAM_PWR_DWN); +	temp |= ((1 << 19) | (1 << 18)); +	__raw_writel(temp, APMU_SRAM_PWR_DWN); +	pm_mpmu_clk_disable(); +	pm_scu_clk_disable(); + +	printk(KERN_INFO "%s: before suspend\n", __func__); +	cpu_do_idle(); +	printk(KERN_INFO "%s: after suspend\n", __func__); + +	pm_mpmu_clk_enable();		/* enable clocks in MPMU */ +	pm_scu_clk_enable();		/* enable clocks in SCU */ + +	return 0; +} + +/* + * Called after processes are frozen, but before we shut down devices. + */ +static int mmp2_pm_prepare(void) +{ +	mmp2_pm_enter_lowpower_mode(POWER_MODE_SYS_SLEEP); + +	return 0; +} + +/* + * Called after devices are re-setup, but before processes are thawed. + */ +static void mmp2_pm_finish(void) +{ +	mmp2_pm_enter_lowpower_mode(POWER_MODE_CORE_INTIDLE); +} + +static int mmp2_pm_valid(suspend_state_t state) +{ +	return ((state == PM_SUSPEND_STANDBY) || (state == PM_SUSPEND_MEM)); +} + +/* + * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk. + */ +static const struct platform_suspend_ops mmp2_pm_ops = { +	.valid		= mmp2_pm_valid, +	.prepare	= mmp2_pm_prepare, +	.enter		= mmp2_pm_enter, +	.finish		= mmp2_pm_finish, +}; + +static int __init mmp2_pm_init(void) +{ +	uint32_t apcr; + +	if (!cpu_is_mmp2()) +		return -EIO; + +	suspend_set_ops(&mmp2_pm_ops); + +	/* +	 * Set bit 0, Slow clock Select 32K clock input instead of VCXO +	 * VCXO is chosen by default, which would be disabled in suspend +	 */ +	__raw_writel(0x5, MPMU_SCCR); + +	/* +	 * Clear bit 23 of CIU_CPU_CONF +	 * direct PJ4 to DDR access through Memory Controller slow queue +	 * fast queue has issue and cause lcd will flick +	 */ +	__raw_writel(__raw_readl(CIU_REG(0x8)) & ~(0x1 << 23), CIU_REG(0x8)); + +	/* Clear default low power control bit */ +	apcr = __raw_readl(MPMU_PCR_PJ); +	apcr &= ~(MPMU_PCR_PJ_SLPEN | MPMU_PCR_PJ_DDRCORSD +			| MPMU_PCR_PJ_APBSD | MPMU_PCR_PJ_AXISD | 1 << 13); +	__raw_writel(apcr, MPMU_PCR_PJ); + +	return 0; +} + +late_initcall(mmp2_pm_init); diff --git a/arch/arm/mach-mmp/pm-pxa910.c b/arch/arm/mach-mmp/pm-pxa910.c new file mode 100644 index 00000000000..04c9daf9f8d --- /dev/null +++ b/arch/arm/mach-mmp/pm-pxa910.c @@ -0,0 +1,273 @@ +/* + * PXA910 Power Management Routines + * + * This software program is licensed subject to the GNU General Public License + * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html + * + * (C) Copyright 2009 Marvell International Ltd. + * All Rights Reserved + */ + +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/err.h> +#include <linux/time.h> +#include <linux/delay.h> +#include <linux/suspend.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/irq.h> +#include <asm/mach-types.h> +#include <mach/hardware.h> +#include <mach/cputype.h> +#include <mach/addr-map.h> +#include <mach/pm-pxa910.h> +#include <mach/regs-icu.h> +#include <mach/irqs.h> + +int pxa910_set_wake(struct irq_data *data, unsigned int on) +{ +	uint32_t awucrm = 0, apcr = 0; +	int irq = data->irq; + +	/* setting wakeup sources */ +	switch (irq) { +	/* wakeup line 2 */ +	case IRQ_PXA910_AP_GPIO: +		awucrm = MPMU_AWUCRM_WAKEUP(2); +		apcr |= MPMU_APCR_SLPWP2; +		break; +	/* wakeup line 3 */ +	case IRQ_PXA910_KEYPAD: +		awucrm = MPMU_AWUCRM_WAKEUP(3) | MPMU_AWUCRM_KEYPRESS; +		apcr |= MPMU_APCR_SLPWP3; +		break; +	case IRQ_PXA910_ROTARY: +		awucrm = MPMU_AWUCRM_WAKEUP(3) | MPMU_AWUCRM_NEWROTARY; +		apcr |= MPMU_APCR_SLPWP3; +		break; +	case IRQ_PXA910_TRACKBALL: +		awucrm = MPMU_AWUCRM_WAKEUP(3) | MPMU_AWUCRM_TRACKBALL; +		apcr |= MPMU_APCR_SLPWP3; +		break; +	/* wakeup line 4 */ +	case IRQ_PXA910_AP1_TIMER1: +		awucrm = MPMU_AWUCRM_WAKEUP(4) | MPMU_AWUCRM_AP1_TIMER_1; +		apcr |= MPMU_APCR_SLPWP4; +		break; +	case IRQ_PXA910_AP1_TIMER2: +		awucrm = MPMU_AWUCRM_WAKEUP(4) | MPMU_AWUCRM_AP1_TIMER_2; +		apcr |= MPMU_APCR_SLPWP4; +		break; +	case IRQ_PXA910_AP1_TIMER3: +		awucrm = MPMU_AWUCRM_WAKEUP(4) | MPMU_AWUCRM_AP1_TIMER_3; +		apcr |= MPMU_APCR_SLPWP4; +		break; +	case IRQ_PXA910_AP2_TIMER1: +		awucrm = MPMU_AWUCRM_WAKEUP(4) | MPMU_AWUCRM_AP2_TIMER_1; +		apcr |= MPMU_APCR_SLPWP4; +		break; +	case IRQ_PXA910_AP2_TIMER2: +		awucrm = MPMU_AWUCRM_WAKEUP(4) | MPMU_AWUCRM_AP2_TIMER_2; +		apcr |= MPMU_APCR_SLPWP4; +		break; +	case IRQ_PXA910_AP2_TIMER3: +		awucrm = MPMU_AWUCRM_WAKEUP(4) | MPMU_AWUCRM_AP2_TIMER_3; +		apcr |= MPMU_APCR_SLPWP4; +		break; +	case IRQ_PXA910_RTC_ALARM: +		awucrm = MPMU_AWUCRM_WAKEUP(4) | MPMU_AWUCRM_RTC_ALARM; +		apcr |= MPMU_APCR_SLPWP4; +		break; +	/* wakeup line 5 */ +	case IRQ_PXA910_USB1: +	case IRQ_PXA910_USB2: +		awucrm = MPMU_AWUCRM_WAKEUP(5); +		apcr |= MPMU_APCR_SLPWP5; +		break; +	/* wakeup line 6 */ +	case IRQ_PXA910_MMC: +		awucrm = MPMU_AWUCRM_WAKEUP(6) +			| MPMU_AWUCRM_SDH1 +			| MPMU_AWUCRM_SDH2; +		apcr |= MPMU_APCR_SLPWP6; +		break; +	/* wakeup line 7 */ +	case IRQ_PXA910_PMIC_INT: +		awucrm = MPMU_AWUCRM_WAKEUP(7); +		apcr |= MPMU_APCR_SLPWP7; +		break; +	default: +		if (irq >= IRQ_GPIO_START && irq < IRQ_BOARD_START) { +			awucrm = MPMU_AWUCRM_WAKEUP(2); +			apcr |= MPMU_APCR_SLPWP2; +		} else { +			/* FIXME: This should return a proper error code ! */ +			printk(KERN_ERR "Error: no defined wake up source irq: %d\n", +				irq); +		} +	} + +	if (on) { +		if (awucrm) { +			awucrm |= __raw_readl(MPMU_AWUCRM); +			__raw_writel(awucrm, MPMU_AWUCRM); +		} +		if (apcr) { +			apcr = ~apcr & __raw_readl(MPMU_APCR); +			__raw_writel(apcr, MPMU_APCR); +		} +	} else { +		if (awucrm) { +			awucrm = ~awucrm & __raw_readl(MPMU_AWUCRM); +			__raw_writel(awucrm, MPMU_AWUCRM); +		} +		if (apcr) { +			apcr |= __raw_readl(MPMU_APCR); +			__raw_writel(apcr, MPMU_APCR); +		} +	} +	return 0; +} + +void pxa910_pm_enter_lowpower_mode(int state) +{ +	uint32_t idle_cfg, apcr; + +	idle_cfg = __raw_readl(APMU_MOH_IDLE_CFG); +	apcr = __raw_readl(MPMU_APCR); + +	apcr &= ~(MPMU_APCR_DDRCORSD | MPMU_APCR_APBSD | MPMU_APCR_AXISD +		| MPMU_APCR_VCTCXOSD | MPMU_APCR_STBYEN); +	idle_cfg &= ~(APMU_MOH_IDLE_CFG_MOH_IDLE +		| APMU_MOH_IDLE_CFG_MOH_PWRDWN); + +	switch (state) { +	case POWER_MODE_UDR: +		/* only shutdown APB in UDR */ +		apcr |= MPMU_APCR_STBYEN | MPMU_APCR_APBSD; +		/* fall through */ +	case POWER_MODE_SYS_SLEEP: +		apcr |= MPMU_APCR_SLPEN;		/* set the SLPEN bit */ +		apcr |= MPMU_APCR_VCTCXOSD;		/* set VCTCXOSD */ +		/* fall through */ +	case POWER_MODE_APPS_SLEEP: +		apcr |= MPMU_APCR_DDRCORSD;		/* set DDRCORSD */ +		/* fall through */ +	case POWER_MODE_APPS_IDLE: +		apcr |= MPMU_APCR_AXISD;		/* set AXISDD bit */ +		/* fall through */ +	case POWER_MODE_CORE_EXTIDLE: +		idle_cfg |= APMU_MOH_IDLE_CFG_MOH_IDLE; +		idle_cfg |= APMU_MOH_IDLE_CFG_MOH_PWRDWN; +		idle_cfg |= APMU_MOH_IDLE_CFG_MOH_PWR_SW(3) +			| APMU_MOH_IDLE_CFG_MOH_L2_PWR_SW(3); +		/* fall through */ +	case POWER_MODE_CORE_INTIDLE: +		break; +	} + +	/* program the memory controller hardware sleep type and auto wakeup */ +	idle_cfg |= APMU_MOH_IDLE_CFG_MOH_DIS_MC_SW_REQ; +	idle_cfg |= APMU_MOH_IDLE_CFG_MOH_MC_WAKE_EN; +	__raw_writel(0x0, APMU_MC_HW_SLP_TYPE);		/* auto refresh */ + +	/* set DSPSD, DTCMSD, BBSD, MSASLPEN */ +	apcr |= MPMU_APCR_DSPSD | MPMU_APCR_DTCMSD | MPMU_APCR_BBSD +		| MPMU_APCR_MSASLPEN; + +	/*always set SLEPEN bit mainly for MSA*/ +	apcr |= MPMU_APCR_SLPEN; + +	/* finally write the registers back */ +	__raw_writel(idle_cfg, APMU_MOH_IDLE_CFG); +	__raw_writel(apcr, MPMU_APCR); + +} + +static int pxa910_pm_enter(suspend_state_t state) +{ +	unsigned int idle_cfg, reg = 0; + +	/*pmic thread not completed,exit;otherwise system can't be waked up*/ +	reg = __raw_readl(ICU_INT_CONF(IRQ_PXA910_PMIC_INT)); +	if ((reg & 0x3) == 0) +		return -EAGAIN; + +	idle_cfg = __raw_readl(APMU_MOH_IDLE_CFG); +	idle_cfg |= APMU_MOH_IDLE_CFG_MOH_PWRDWN +		| APMU_MOH_IDLE_CFG_MOH_SRAM_PWRDWN; +	__raw_writel(idle_cfg, APMU_MOH_IDLE_CFG); + +	/* disable L2 */ +	outer_disable(); +	/* wait for l2 idle */ +	while (!(readl(CIU_REG(0x8)) & (1 << 16))) +		udelay(1); + +	cpu_do_idle(); + +	/* enable L2 */ +	outer_resume(); +	/* wait for l2 idle */ +	while (!(readl(CIU_REG(0x8)) & (1 << 16))) +		udelay(1); + +	idle_cfg = __raw_readl(APMU_MOH_IDLE_CFG); +	idle_cfg &= ~(APMU_MOH_IDLE_CFG_MOH_PWRDWN +		| APMU_MOH_IDLE_CFG_MOH_SRAM_PWRDWN); +	__raw_writel(idle_cfg, APMU_MOH_IDLE_CFG); + +	return 0; +} + +/* + * Called after processes are frozen, but before we shut down devices. + */ +static int pxa910_pm_prepare(void) +{ +	pxa910_pm_enter_lowpower_mode(POWER_MODE_UDR); +	return 0; +} + +/* + * Called after devices are re-setup, but before processes are thawed. + */ +static void pxa910_pm_finish(void) +{ +	pxa910_pm_enter_lowpower_mode(POWER_MODE_CORE_INTIDLE); +} + +static int pxa910_pm_valid(suspend_state_t state) +{ +	return ((state == PM_SUSPEND_STANDBY) || (state == PM_SUSPEND_MEM)); +} + +static const struct platform_suspend_ops pxa910_pm_ops = { +	.valid		= pxa910_pm_valid, +	.prepare	= pxa910_pm_prepare, +	.enter		= pxa910_pm_enter, +	.finish		= pxa910_pm_finish, +}; + +static int __init pxa910_pm_init(void) +{ +	uint32_t awucrm = 0; + +	if (!cpu_is_pxa910()) +		return -EIO; + +	suspend_set_ops(&pxa910_pm_ops); + +	/* Set the following bits for MMP3 playback with VCTXO on */ +	__raw_writel(__raw_readl(APMU_SQU_CLK_GATE_CTRL) | (1 << 30), +		APMU_SQU_CLK_GATE_CTRL); +	__raw_writel(__raw_readl(MPMU_FCCR) | (1 << 28), MPMU_FCCR); + +	awucrm |= MPMU_AWUCRM_AP_ASYNC_INT | MPMU_AWUCRM_AP_FULL_IDLE; +	__raw_writel(awucrm, MPMU_AWUCRM); + +	return 0; +} + +late_initcall(pxa910_pm_init); diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index 72b4e763158..144e997624c 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c @@ -7,24 +7,28 @@   * 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/list.h>  #include <linux/io.h>  #include <linux/clk.h> +#include <linux/platform_device.h> +#include <linux/platform_data/mv_usb.h>  #include <asm/mach/time.h> -#include <mach/addr-map.h> +#include <asm/system_misc.h>  #include <mach/cputype.h> +#include <mach/addr-map.h>  #include <mach/regs-apbc.h>  #include <mach/regs-apmu.h>  #include <mach/irqs.h> -#include <mach/gpio.h>  #include <mach/dma.h>  #include <mach/devices.h>  #include <mach/mfp.h> +#include <linux/dma-mapping.h> +#include <mach/pxa168.h> +#include <mach/regs-usb.h>  #include "common.h"  #include "clock.h" @@ -41,74 +45,18 @@ static struct mfp_addr_map pxa168_mfp_addr_map[] __initdata =  	MFP_ADDR_END,  }; -#define APMASK(i)	(GPIO_REGS_VIRT + BANK_OFF(i) + 0x09c) - -static void __init pxa168_init_gpio(void) -{ -	int i; - -	/* enable GPIO clock */ -	__raw_writel(APBC_APBCLK | APBC_FNCLK, APBC_PXA168_GPIO); - -	/* unmask GPIO edge detection for all 4 banks - APMASKx */ -	for (i = 0; i < 4; i++) -		__raw_writel(0xffffffff, APMASK(i)); - -	pxa_init_gpio(IRQ_PXA168_GPIOX, 0, 127, NULL); -} -  void __init pxa168_init_irq(void)  {  	icu_init_irq(); -	pxa168_init_gpio();  } -/* APB peripheral clocks */ -static APBC_CLK(uart1, PXA168_UART1, 1, 14745600); -static APBC_CLK(uart2, PXA168_UART2, 1, 14745600); -static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000); -static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000); -static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000); -static APBC_CLK(pwm2, PXA168_PWM2, 1, 13000000); -static APBC_CLK(pwm3, PXA168_PWM3, 1, 13000000); -static APBC_CLK(pwm4, PXA168_PWM4, 1, 13000000); -static APBC_CLK(ssp1, PXA168_SSP1, 4, 0); -static APBC_CLK(ssp2, PXA168_SSP2, 4, 0); -static APBC_CLK(ssp3, PXA168_SSP3, 4, 0); -static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); -static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); -static APBC_CLK(keypad, PXA168_KPC, 0, 32000); - -static APMU_CLK(nand, NAND, 0x01db, 208000000); -static APMU_CLK(lcd, LCD, 0x7f, 312000000); - -/* device and clock bindings */ -static struct clk_lookup pxa168_clkregs[] = { -	INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL), -	INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL), -	INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL), -	INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL), -	INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL), -	INIT_CLKREG(&clk_pwm2, "pxa168-pwm.1", NULL), -	INIT_CLKREG(&clk_pwm3, "pxa168-pwm.2", NULL), -	INIT_CLKREG(&clk_pwm4, "pxa168-pwm.3", NULL), -	INIT_CLKREG(&clk_ssp1, "pxa168-ssp.0", NULL), -	INIT_CLKREG(&clk_ssp2, "pxa168-ssp.1", NULL), -	INIT_CLKREG(&clk_ssp3, "pxa168-ssp.2", NULL), -	INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), -	INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), -	INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), -	INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), -	INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL), -}; -  static int __init pxa168_init(void)  {  	if (cpu_is_pxa168()) {  		mfp_init_base(MFPR_VIRT_BASE);  		mfp_init_addr(pxa168_mfp_addr_map);  		pxa_init_dma(IRQ_PXA168_DMA_INT0, 32); -		clkdev_add_table(ARRAY_AND_SIZE(pxa168_clkregs)); +		pxa168_clk_init();  	}  	return 0; @@ -117,25 +65,22 @@ postcore_initcall(pxa168_init);  /* system timer - clock enabled, 3.25MHz */  #define TIMER_CLK_RST	(APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(3)) +#define APBC_TIMERS	APBC_REG(0x34) -static void __init pxa168_timer_init(void) +void __init pxa168_timer_init(void)  {  	/* this is early, we have to initialize the CCU registers by  	 * ourselves instead of using clk_* API. Clock rate is defined  	 * by APBC_TIMERS_CLK_RST (3.25MHz) and enabled free-running  	 */ -	__raw_writel(APBC_APBCLK | APBC_RST, APBC_PXA168_TIMERS); +	__raw_writel(APBC_APBCLK | APBC_RST, APBC_TIMERS);  	/* 3.25MHz, bus/functional clock enabled, release reset */ -	__raw_writel(TIMER_CLK_RST, APBC_PXA168_TIMERS); +	__raw_writel(TIMER_CLK_RST, APBC_TIMERS);  	timer_init(IRQ_PXA168_TIMER1);  } -struct sys_timer pxa168_timer = { -	.init	= pxa168_timer_init, -}; -  void pxa168_clear_keypad_wakeup(void)  {  	uint32_t val; @@ -149,6 +94,7 @@ void pxa168_clear_keypad_wakeup(void)  /* on-chip devices */  PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22);  PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24); +PXA168_DEVICE(uart3, "pxa2xx-uart", 2, UART3, 0xd4026000, 0x30, 23, 24);  PXA168_DEVICE(twsi0, "pxa2xx-i2c", 0, TWSI0, 0xd4011000, 0x28);  PXA168_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28);  PXA168_DEVICE(pwm1, "pxa168-pwm", 0, NONE, 0xd401a000, 0x10); @@ -163,3 +109,70 @@ PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);  PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);  PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);  PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c); +PXA168_DEVICE(eth, "pxa168-eth", -1, MFU, 0xc0800000, 0x0fff); + +struct resource pxa168_resource_gpio[] = { +	{ +		.start	= 0xd4019000, +		.end	= 0xd4019fff, +		.flags	= IORESOURCE_MEM, +	}, { +		.start	= IRQ_PXA168_GPIOX, +		.end	= IRQ_PXA168_GPIOX, +		.name	= "gpio_mux", +		.flags	= IORESOURCE_IRQ, +	}, +}; + +struct platform_device pxa168_device_gpio = { +	.name		= "mmp-gpio", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(pxa168_resource_gpio), +	.resource	= pxa168_resource_gpio, +}; + +struct resource pxa168_usb_host_resources[] = { +	/* USB Host conroller register base */ +	[0] = { +		.start	= PXA168_U2H_REGBASE + U2x_CAPREGS_OFFSET, +		.end	= PXA168_U2H_REGBASE + USB_REG_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "capregs", +	}, +	/* USB PHY register base */ +	[1] = { +		.start	= PXA168_U2H_PHYBASE, +		.end	= PXA168_U2H_PHYBASE + USB_PHY_RANGE, +		.flags	= IORESOURCE_MEM, +		.name	= "phyregs", +	}, +	[2] = { +		.start	= IRQ_PXA168_USB2, +		.end	= IRQ_PXA168_USB2, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static u64 pxa168_usb_host_dmamask = DMA_BIT_MASK(32); +struct platform_device pxa168_device_usb_host = { +	.name = "pxa-sph", +	.id   = -1, +	.dev  = { +		.dma_mask = &pxa168_usb_host_dmamask, +		.coherent_dma_mask = DMA_BIT_MASK(32), +	}, + +	.num_resources = ARRAY_SIZE(pxa168_usb_host_resources), +	.resource      = pxa168_usb_host_resources, +}; + +int __init pxa168_add_usb_host(struct mv_usb_platform_data *pdata) +{ +	pxa168_device_usb_host.dev.platform_data = pdata; +	return platform_device_register(&pxa168_device_usb_host); +} + +void pxa168_restart(enum reboot_mode mode, const char *cmd) +{ +	soft_restart(0xffff0000); +} diff --git a/arch/arm/mach-mmp/pxa910.c b/arch/arm/mach-mmp/pxa910.c index 46f2d69bef3..eb57ee19684 100644 --- a/arch/arm/mach-mmp/pxa910.c +++ b/arch/arm/mach-mmp/pxa910.c @@ -7,26 +7,28 @@   * 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/list.h>  #include <linux/io.h> +#include <linux/irq.h> +#include <linux/irqchip/mmp.h> +#include <linux/platform_device.h> +#include <asm/hardware/cache-tauros2.h>  #include <asm/mach/time.h>  #include <mach/addr-map.h>  #include <mach/regs-apbc.h> -#include <mach/regs-apmu.h>  #include <mach/cputype.h>  #include <mach/irqs.h> -#include <mach/gpio.h>  #include <mach/dma.h>  #include <mach/mfp.h>  #include <mach/devices.h> +#include <mach/pm-pxa910.h> +#include <mach/pxa910.h>  #include "common.h" -#include "clock.h"  #define MFPR_VIRT_BASE	(APB_VIRT_BASE + 0x1e000) @@ -78,60 +80,24 @@ static struct mfp_addr_map pxa910_mfp_addr_map[] __initdata =  	MFP_ADDR_END,  }; -#define APMASK(i)	(GPIO_REGS_VIRT + BANK_OFF(i) + 0x09c) - -static void __init pxa910_init_gpio(void) -{ -	int i; - -	/* enable GPIO clock */ -	__raw_writel(APBC_APBCLK | APBC_FNCLK, APBC_PXA910_GPIO); - -	/* unmask GPIO edge detection for all 4 banks - APMASKx */ -	for (i = 0; i < 4; i++) -		__raw_writel(0xffffffff, APMASK(i)); - -	pxa_init_gpio(IRQ_PXA910_AP_GPIO, 0, 127, NULL); -} -  void __init pxa910_init_irq(void)  {  	icu_init_irq(); -	pxa910_init_gpio(); +#ifdef CONFIG_PM +	icu_irq_chip.irq_set_wake = pxa910_set_wake; +#endif  } -/* APB peripheral clocks */ -static APBC_CLK(uart1, PXA910_UART0, 1, 14745600); -static APBC_CLK(uart2, PXA910_UART1, 1, 14745600); -static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000); -static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000); -static APBC_CLK(pwm1, PXA910_PWM1, 1, 13000000); -static APBC_CLK(pwm2, PXA910_PWM2, 1, 13000000); -static APBC_CLK(pwm3, PXA910_PWM3, 1, 13000000); -static APBC_CLK(pwm4, PXA910_PWM4, 1, 13000000); - -static APMU_CLK(nand, NAND, 0x01db, 208000000); - -/* device and clock bindings */ -static struct clk_lookup pxa910_clkregs[] = { -	INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL), -	INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL), -	INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL), -	INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL), -	INIT_CLKREG(&clk_pwm1, "pxa910-pwm.0", NULL), -	INIT_CLKREG(&clk_pwm2, "pxa910-pwm.1", NULL), -	INIT_CLKREG(&clk_pwm3, "pxa910-pwm.2", NULL), -	INIT_CLKREG(&clk_pwm4, "pxa910-pwm.3", NULL), -	INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), -}; -  static int __init pxa910_init(void)  {  	if (cpu_is_pxa910()) { +#ifdef CONFIG_CACHE_TAUROS2 +		tauros2_init(0); +#endif  		mfp_init_base(MFPR_VIRT_BASE);  		mfp_init_addr(pxa910_mfp_addr_map);  		pxa_init_dma(IRQ_PXA910_DMA_INT0, 32); -		clkdev_add_table(ARRAY_AND_SIZE(pxa910_clkregs)); +		pxa910_clk_init();  	}  	return 0; @@ -140,20 +106,17 @@ postcore_initcall(pxa910_init);  /* system timer - clock enabled, 3.25MHz */  #define TIMER_CLK_RST	(APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(3)) +#define APBC_TIMERS	APBC_REG(0x34) -static void __init pxa910_timer_init(void) +void __init pxa910_timer_init(void)  {  	/* reset and configure */ -	__raw_writel(APBC_APBCLK | APBC_RST, APBC_PXA910_TIMERS); -	__raw_writel(TIMER_CLK_RST, APBC_PXA910_TIMERS); +	__raw_writel(APBC_APBCLK | APBC_RST, APBC_TIMERS); +	__raw_writel(TIMER_CLK_RST, APBC_TIMERS);  	timer_init(IRQ_PXA910_AP1_TIMER1);  } -struct sys_timer pxa910_timer = { -	.init	= pxa910_timer_init, -}; -  /* on-chip devices */  /* NOTE: there are totally 3 UARTs on PXA910: @@ -178,3 +141,51 @@ PXA910_DEVICE(pwm2, "pxa910-pwm", 1, NONE, 0xd401a400, 0x10);  PXA910_DEVICE(pwm3, "pxa910-pwm", 2, NONE, 0xd401a800, 0x10);  PXA910_DEVICE(pwm4, "pxa910-pwm", 3, NONE, 0xd401ac00, 0x10);  PXA910_DEVICE(nand, "pxa3xx-nand", -1, NAND, 0xd4283000, 0x80, 97, 99); +PXA910_DEVICE(disp, "mmp-disp", 0, LCD, 0xd420b000, 0x1ec); +PXA910_DEVICE(fb, "mmp-fb", -1, NONE, 0, 0); +PXA910_DEVICE(panel, "tpo-hvga", -1, NONE, 0, 0); + +struct resource pxa910_resource_gpio[] = { +	{ +		.start	= 0xd4019000, +		.end	= 0xd4019fff, +		.flags	= IORESOURCE_MEM, +	}, { +		.start	= IRQ_PXA910_AP_GPIO, +		.end	= IRQ_PXA910_AP_GPIO, +		.name	= "gpio_mux", +		.flags	= IORESOURCE_IRQ, +	}, +}; + +struct platform_device pxa910_device_gpio = { +	.name		= "mmp-gpio", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(pxa910_resource_gpio), +	.resource	= pxa910_resource_gpio, +}; + +static struct resource pxa910_resource_rtc[] = { +	{ +		.start	= 0xd4010000, +		.end	= 0xd401003f, +		.flags	= IORESOURCE_MEM, +	}, { +		.start	= IRQ_PXA910_RTC_INT, +		.end	= IRQ_PXA910_RTC_INT, +		.name	= "rtc 1Hz", +		.flags	= IORESOURCE_IRQ, +	}, { +		.start	= IRQ_PXA910_RTC_ALARM, +		.end	= IRQ_PXA910_RTC_ALARM, +		.name	= "rtc alarm", +		.flags	= IORESOURCE_IRQ, +	}, +}; + +struct platform_device pxa910_device_rtc = { +	.name		= "sa1100-rtc", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(pxa910_resource_rtc), +	.resource	= pxa910_resource_rtc, +}; diff --git a/arch/arm/mach-mmp/sram.c b/arch/arm/mach-mmp/sram.c new file mode 100644 index 00000000000..bf5e64906e6 --- /dev/null +++ b/arch/arm/mach-mmp/sram.c @@ -0,0 +1,168 @@ +/* + *  linux/arch/arm/mach-mmp/sram.c + * + *  based on mach-davinci/sram.c - DaVinci simple SRAM allocator + * + *  Copyright (c) 2011 Marvell Semiconductors Inc. + *  All Rights Reserved + * + *  Add for mmp sram support - Leo Yan <leoy@marvell.com> + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License version 2 as + *  published by the Free Software Foundation. + * + */ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/io.h> +#include <linux/err.h> +#include <linux/slab.h> +#include <linux/genalloc.h> + +#include <linux/platform_data/dma-mmp_tdma.h> + +struct sram_bank_info { +	char *pool_name; +	struct gen_pool *gpool; +	int granularity; + +	phys_addr_t sram_phys; +	void __iomem *sram_virt; +	u32 sram_size; + +	struct list_head node; +}; + +static DEFINE_MUTEX(sram_lock); +static LIST_HEAD(sram_bank_list); + +struct gen_pool *sram_get_gpool(char *pool_name) +{ +	struct sram_bank_info *info = NULL; + +	if (!pool_name) +		return NULL; + +	mutex_lock(&sram_lock); + +	list_for_each_entry(info, &sram_bank_list, node) +		if (!strcmp(pool_name, info->pool_name)) +			break; + +	mutex_unlock(&sram_lock); + +	if (&info->node == &sram_bank_list) +		return NULL; + +	return info->gpool; +} +EXPORT_SYMBOL(sram_get_gpool); + +static int sram_probe(struct platform_device *pdev) +{ +	struct sram_platdata *pdata = pdev->dev.platform_data; +	struct sram_bank_info *info; +	struct resource *res; +	int ret = 0; + +	if (!pdata || !pdata->pool_name) +		return -ENODEV; + +	info = kzalloc(sizeof(*info), GFP_KERNEL); +	if (!info) +		return -ENOMEM; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (res == NULL) { +		dev_err(&pdev->dev, "no memory resource defined\n"); +		ret = -ENODEV; +		goto out; +	} + +	if (!resource_size(res)) +		return 0; + +	info->sram_phys   = (phys_addr_t)res->start; +	info->sram_size   = resource_size(res); +	info->sram_virt   = ioremap(info->sram_phys, info->sram_size); +	info->pool_name	  = kstrdup(pdata->pool_name, GFP_KERNEL); +	info->granularity = pdata->granularity; + +	info->gpool = gen_pool_create(ilog2(info->granularity), -1); +	if (!info->gpool) { +		dev_err(&pdev->dev, "create pool failed\n"); +		ret = -ENOMEM; +		goto create_pool_err; +	} + +	ret = gen_pool_add_virt(info->gpool, (unsigned long)info->sram_virt, +				info->sram_phys, info->sram_size, -1); +	if (ret < 0) { +		dev_err(&pdev->dev, "add new chunk failed\n"); +		ret = -ENOMEM; +		goto add_chunk_err; +	} + +	mutex_lock(&sram_lock); +	list_add(&info->node, &sram_bank_list); +	mutex_unlock(&sram_lock); + +	platform_set_drvdata(pdev, info); + +	dev_info(&pdev->dev, "initialized\n"); +	return 0; + +add_chunk_err: +	gen_pool_destroy(info->gpool); +create_pool_err: +	iounmap(info->sram_virt); +	kfree(info->pool_name); +out: +	kfree(info); +	return ret; +} + +static int sram_remove(struct platform_device *pdev) +{ +	struct sram_bank_info *info; + +	info = platform_get_drvdata(pdev); +	if (info == NULL) +		return -ENODEV; + +	mutex_lock(&sram_lock); +	list_del(&info->node); +	mutex_unlock(&sram_lock); + +	gen_pool_destroy(info->gpool); +	iounmap(info->sram_virt); +	kfree(info->pool_name); +	kfree(info); +	return 0; +} + +static const struct platform_device_id sram_id_table[] = { +	{ "asram", MMP_ASRAM }, +	{ "isram", MMP_ISRAM }, +	{ } +}; + +static struct platform_driver sram_driver = { +	.probe		= sram_probe, +	.remove		= sram_remove, +	.driver		= { +		.name	= "mmp-sram", +	}, +	.id_table	= sram_id_table, +}; + +static int __init sram_init(void) +{ +	return platform_driver_register(&sram_driver); +} +core_initcall(sram_init); + +MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c index c296b75c445..cdfc9bfee1a 100644 --- a/arch/arm/mach-mmp/tavorevb.c +++ b/arch/arm/mach-mmp/tavorevb.c @@ -7,7 +7,8 @@   *  it under the terms of the GNU General Public License version 2 as   *  publishhed by the Free Software Foundation.   */ - +#include <linux/gpio.h> +#include <linux/gpio-pxa.h>  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/platform_device.h> @@ -18,7 +19,7 @@  #include <mach/addr-map.h>  #include <mach/mfp-pxa910.h>  #include <mach/pxa910.h> -#include <mach/gpio.h> +#include <mach/irqs.h>  #include "common.h" @@ -60,6 +61,10 @@ static unsigned long tavorevb_pin_config[] __initdata = {  	DF_RDY0_DF_RDY0,  }; +static struct pxa_gpio_platform_data pxa910_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; +  static struct smc91x_platdata tavorevb_smc91x_info = {  	.flags	= SMC91X_USE_16BIT | SMC91X_NOWAIT,  }; @@ -71,8 +76,8 @@ static struct resource smc91x_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= gpio_to_irq(80), -		.end	= gpio_to_irq(80), +		.start	= MMP_GPIO_TO_IRQ(80), +		.end	= MMP_GPIO_TO_IRQ(80),  		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,  	}  }; @@ -93,6 +98,9 @@ static void __init tavorevb_init(void)  	/* on-chip devices */  	pxa910_add_uart(1); +	platform_device_add_data(&pxa910_device_gpio, &pxa910_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&pxa910_device_gpio);  	/* off-chip devices */  	platform_device_register(&smc91x_device); @@ -100,7 +108,9 @@ static void __init tavorevb_init(void)  MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)")  	.map_io		= mmp_map_io, +	.nr_irqs	= MMP_NR_IRQS,  	.init_irq       = pxa910_init_irq, -	.timer          = &pxa910_timer, +	.init_time	= pxa910_timer_init,  	.init_machine   = tavorevb_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/teton_bga.c b/arch/arm/mach-mmp/teton_bga.c index bbe4727b96c..6aa53fb29d2 100644 --- a/arch/arm/mach-mmp/teton_bga.c +++ b/arch/arm/mach-mmp/teton_bga.c @@ -16,8 +16,9 @@  #include <linux/kernel.h>  #include <linux/platform_device.h>  #include <linux/gpio.h> +#include <linux/gpio-pxa.h>  #include <linux/input.h> -#include <plat/pxa27x_keypad.h> +#include <linux/platform_data/keypad-pxa27x.h>  #include <linux/i2c.h>  #include <asm/mach-types.h> @@ -26,6 +27,7 @@  #include <mach/mfp-pxa168.h>  #include <mach/pxa168.h>  #include <mach/teton_bga.h> +#include <mach/irqs.h>  #include "common.h" @@ -48,6 +50,10 @@ static unsigned long teton_bga_pin_config[] __initdata = {  	GPIO78_GPIO,  }; +static struct pxa_gpio_platform_data pxa168_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; +  static unsigned int teton_bga_matrix_key_map[] = {  	KEY(0, 6, KEY_ESC),  	KEY(0, 7, KEY_ENTER), @@ -55,18 +61,22 @@ static unsigned int teton_bga_matrix_key_map[] = {  	KEY(1, 7, KEY_RIGHT),  }; +static struct matrix_keymap_data teton_bga_matrix_keymap_data = { +	.keymap			= teton_bga_matrix_key_map, +	.keymap_size		= ARRAY_SIZE(teton_bga_matrix_key_map), +}; +  static struct pxa27x_keypad_platform_data teton_bga_keypad_info __initdata = {  	.matrix_key_rows        = 2,  	.matrix_key_cols        = 8, -	.matrix_key_map         = teton_bga_matrix_key_map, -	.matrix_key_map_size    = ARRAY_SIZE(teton_bga_matrix_key_map), +	.matrix_keymap_data	= &teton_bga_matrix_keymap_data,  	.debounce_interval      = 30,  };  static struct i2c_board_info teton_bga_i2c_info[] __initdata = {  	{  		I2C_BOARD_INFO("ds1337", 0x68), -		.irq = gpio_to_irq(RTC_INT_GPIO) +		.irq = MMP_GPIO_TO_IRQ(RTC_INT_GPIO)  	},  }; @@ -78,12 +88,16 @@ static void __init teton_bga_init(void)  	pxa168_add_uart(1);  	pxa168_add_keypad(&teton_bga_keypad_info);  	pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(teton_bga_i2c_info)); +	platform_device_add_data(&pxa168_device_gpio, &pxa168_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data)); +	platform_device_register(&pxa168_device_gpio);  }  MACHINE_START(TETON_BGA, "PXA168-based Teton BGA Development Platform")  	.map_io		= mmp_map_io, -	.nr_irqs	= IRQ_BOARD_START, +	.nr_irqs	= MMP_NR_IRQS,  	.init_irq       = pxa168_init_irq, -	.timer          = &pxa168_timer, +	.init_time	= pxa168_timer_init,  	.init_machine   = teton_bga_init, +	.restart	= pxa168_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/time.c b/arch/arm/mach-mmp/time.c index 66528193f93..2756351dbb3 100644 --- a/arch/arm/mach-mmp/time.c +++ b/arch/arm/mach-mmp/time.c @@ -9,7 +9,7 @@   *   2008-04-11: Jason Chagas <Jason.chagas@marvell.com>   *   2008-10-08: Bin Yang <bin.yang@marvell.com>   * - * The timers module actually includes three timers, each timer with upto + * The timers module actually includes three timers, each timer with up to   * three match comparators. Timer #0 is used here in free-running mode as   * the clock source, and match comparator #1 used as clock event device.   * @@ -25,8 +25,10 @@  #include <linux/io.h>  #include <linux/irq.h> -#include <linux/sched.h> -#include <linux/cnt32_to_63.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/sched_clock.h>  #include <mach/addr-map.h>  #include <mach/regs-timers.h> @@ -37,28 +39,18 @@  #include "clock.h" +#ifdef CONFIG_CPU_MMP2 +#define MMP_CLOCK_FREQ		6500000 +#else +#define MMP_CLOCK_FREQ		3250000 +#endif +  #define TIMERS_VIRT_BASE	TIMERS1_VIRT_BASE  #define MAX_DELTA		(0xfffffffe)  #define MIN_DELTA		(16) -#define TCR2NS_SCALE_FACTOR	10 - -static unsigned long tcr2ns_scale; - -static void __init set_tcr2ns_scale(unsigned long tcr_rate) -{ -	unsigned long long v = 1000000000ULL << TCR2NS_SCALE_FACTOR; -	do_div(v, tcr_rate); -	tcr2ns_scale = v; -	/* -	 * We want an even value to automatically clear the top bit -	 * returned by cnt32_to_63() without an additional run time -	 * instruction. So if the LSB is 1 then round it up. -	 */ -	if (tcr2ns_scale & 1) -		tcr2ns_scale++; -} +static void __iomem *mmp_timer_base = TIMERS_VIRT_BASE;  /*   * FIXME: the timer needs some delay to stablize the counter capture @@ -67,46 +59,68 @@ static inline uint32_t timer_read(void)  {  	int delay = 100; -	__raw_writel(1, TIMERS_VIRT_BASE + TMR_CVWR(0)); +	__raw_writel(1, mmp_timer_base + TMR_CVWR(1));  	while (delay--)  		cpu_relax(); -	return __raw_readl(TIMERS_VIRT_BASE + TMR_CVWR(0)); +	return __raw_readl(mmp_timer_base + TMR_CVWR(1));  } -unsigned long long sched_clock(void) +static u64 notrace mmp_read_sched_clock(void)  { -	unsigned long long v = cnt32_to_63(timer_read()); -	return (v * tcr2ns_scale) >> TCR2NS_SCALE_FACTOR; +	return timer_read();  }  static irqreturn_t timer_interrupt(int irq, void *dev_id)  {  	struct clock_event_device *c = dev_id; -	/* disable and clear pending interrupt status */ -	__raw_writel(0x0, TIMERS_VIRT_BASE + TMR_IER(0)); -	__raw_writel(0x1, TIMERS_VIRT_BASE + TMR_ICR(0)); +	/* +	 * Clear pending interrupt status. +	 */ +	__raw_writel(0x01, mmp_timer_base + TMR_ICR(0)); + +	/* +	 * Disable timer 0. +	 */ +	__raw_writel(0x02, mmp_timer_base + TMR_CER); +  	c->event_handler(c); +  	return IRQ_HANDLED;  }  static int timer_set_next_event(unsigned long delta,  				struct clock_event_device *dev)  { -	unsigned long flags, next; +	unsigned long flags;  	local_irq_save(flags); -	/* clear pending interrupt status and enable */ -	__raw_writel(0x01, TIMERS_VIRT_BASE + TMR_ICR(0)); -	__raw_writel(0x01, TIMERS_VIRT_BASE + TMR_IER(0)); +	/* +	 * Disable timer 0. +	 */ +	__raw_writel(0x02, mmp_timer_base + TMR_CER); -	next = timer_read() + delta; -	__raw_writel(next, TIMERS_VIRT_BASE + TMR_TN_MM(0, 0)); +	/* +	 * Clear and enable timer match 0 interrupt. +	 */ +	__raw_writel(0x01, mmp_timer_base + TMR_ICR(0)); +	__raw_writel(0x01, mmp_timer_base + TMR_IER(0)); + +	/* +	 * Setup new clockevent timer value. +	 */ +	__raw_writel(delta - 1, mmp_timer_base + TMR_TN_MM(0, 0)); + +	/* +	 * Enable timer 0. +	 */ +	__raw_writel(0x03, mmp_timer_base + TMR_CER);  	local_irq_restore(flags); +  	return 0;  } @@ -121,7 +135,7 @@ static void timer_set_mode(enum clock_event_mode mode,  	case CLOCK_EVT_MODE_UNUSED:  	case CLOCK_EVT_MODE_SHUTDOWN:  		/* disable the matching interrupt */ -		__raw_writel(0x00, TIMERS_VIRT_BASE + TMR_IER(0)); +		__raw_writel(0x00, mmp_timer_base + TMR_IER(0));  		break;  	case CLOCK_EVT_MODE_RESUME:  	case CLOCK_EVT_MODE_PERIODIC: @@ -133,7 +147,6 @@ static void timer_set_mode(enum clock_event_mode mode,  static struct clock_event_device ckevt = {  	.name		= "clockevent",  	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.rating		= 200,  	.set_next_event	= timer_set_next_event,  	.set_mode	= timer_set_mode, @@ -146,7 +159,6 @@ static cycle_t clksrc_read(struct clocksource *cs)  static struct clocksource cksrc = {  	.name		= "clocksource", -	.shift		= 20,  	.rating		= 200,  	.read		= clksrc_read,  	.mask		= CLOCKSOURCE_MASK(32), @@ -155,29 +167,32 @@ static struct clocksource cksrc = {  static void __init timer_config(void)  { -	uint32_t ccr = __raw_readl(TIMERS_VIRT_BASE + TMR_CCR); -	uint32_t cer = __raw_readl(TIMERS_VIRT_BASE + TMR_CER); -	uint32_t cmr = __raw_readl(TIMERS_VIRT_BASE + TMR_CMR); +	uint32_t ccr = __raw_readl(mmp_timer_base + TMR_CCR); + +	__raw_writel(0x0, mmp_timer_base + TMR_CER); /* disable */ -	__raw_writel(cer & ~0x1, TIMERS_VIRT_BASE + TMR_CER); /* disable */ +	ccr &= (cpu_is_mmp2()) ? (TMR_CCR_CS_0(0) | TMR_CCR_CS_1(0)) : +		(TMR_CCR_CS_0(3) | TMR_CCR_CS_1(3)); +	__raw_writel(ccr, mmp_timer_base + TMR_CCR); -	ccr &= (cpu_is_mmp2()) ? TMR_CCR_CS_0(0) : TMR_CCR_CS_0(3); -	__raw_writel(ccr, TIMERS_VIRT_BASE + TMR_CCR); +	/* set timer 0 to periodic mode, and timer 1 to free-running mode */ +	__raw_writel(0x2, mmp_timer_base + TMR_CMR); -	/* free-running mode */ -	__raw_writel(cmr | 0x01, TIMERS_VIRT_BASE + TMR_CMR); +	__raw_writel(0x1, mmp_timer_base + TMR_PLCR(0)); /* periodic */ +	__raw_writel(0x7, mmp_timer_base + TMR_ICR(0));  /* clear status */ +	__raw_writel(0x0, mmp_timer_base + TMR_IER(0)); -	__raw_writel(0x0, TIMERS_VIRT_BASE + TMR_PLCR(0)); /* free-running */ -	__raw_writel(0x7, TIMERS_VIRT_BASE + TMR_ICR(0));  /* clear status */ -	__raw_writel(0x0, TIMERS_VIRT_BASE + TMR_IER(0)); +	__raw_writel(0x0, mmp_timer_base + TMR_PLCR(1)); /* free-running */ +	__raw_writel(0x7, mmp_timer_base + TMR_ICR(1));  /* clear status */ +	__raw_writel(0x0, mmp_timer_base + TMR_IER(1)); -	/* enable timer counter */ -	__raw_writel(cer | 0x01, TIMERS_VIRT_BASE + TMR_CER); +	/* enable timer 1 counter */ +	__raw_writel(0x2, mmp_timer_base + TMR_CER);  }  static struct irqaction timer_irq = {  	.name		= "timer", -	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, +	.flags		= IRQF_TIMER | IRQF_IRQPOLL,  	.handler	= timer_interrupt,  	.dev_id		= &ckevt,  }; @@ -186,17 +201,47 @@ void __init timer_init(int irq)  {  	timer_config(); -	set_tcr2ns_scale(CLOCK_TICK_RATE); +	sched_clock_register(mmp_read_sched_clock, 32, MMP_CLOCK_FREQ); -	ckevt.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, ckevt.shift); -	ckevt.max_delta_ns = clockevent_delta2ns(MAX_DELTA, &ckevt); -	ckevt.min_delta_ns = clockevent_delta2ns(MIN_DELTA, &ckevt);  	ckevt.cpumask = cpumask_of(0); -	cksrc.mult = clocksource_hz2mult(CLOCK_TICK_RATE, cksrc.shift); -  	setup_irq(irq, &timer_irq); -	clocksource_register(&cksrc); -	clockevents_register_device(&ckevt); +	clocksource_register_hz(&cksrc, MMP_CLOCK_FREQ); +	clockevents_config_and_register(&ckevt, MMP_CLOCK_FREQ, +					MIN_DELTA, MAX_DELTA); +} + +#ifdef CONFIG_OF +static struct of_device_id mmp_timer_dt_ids[] = { +	{ .compatible = "mrvl,mmp-timer", }, +	{} +}; + +void __init mmp_dt_init_timer(void) +{ +	struct device_node *np; +	int irq, ret; + +	np = of_find_matching_node(NULL, mmp_timer_dt_ids); +	if (!np) { +		ret = -ENODEV; +		goto out; +	} + +	irq = irq_of_parse_and_map(np, 0); +	if (!irq) { +		ret = -EINVAL; +		goto out; +	} +	mmp_timer_base = of_iomap(np, 0); +	if (!mmp_timer_base) { +		ret = -ENOMEM; +		goto out; +	} +	timer_init(irq); +	return; +out: +	pr_err("Failed to get timer from device tree with error:%d\n", ret);  } +#endif diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c index e411039ea59..ac4af81de3e 100644 --- a/arch/arm/mach-mmp/ttc_dkb.c +++ b/arch/arm/mach-mmp/ttc_dkb.c @@ -15,6 +15,13 @@  #include <linux/mtd/partitions.h>  #include <linux/mtd/onenand.h>  #include <linux/interrupt.h> +#include <linux/platform_data/pca953x.h> +#include <linux/gpio.h> +#include <linux/gpio-pxa.h> +#include <linux/mfd/88pm860x.h> +#include <linux/platform_data/mv_usb.h> +#include <linux/spi/spi.h> +#include <linux/delay.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -22,10 +29,22 @@  #include <mach/addr-map.h>  #include <mach/mfp-pxa910.h>  #include <mach/pxa910.h> +#include <mach/irqs.h> +#include <mach/regs-usb.h>  #include "common.h" -#define TTCDKB_NR_IRQS		(IRQ_BOARD_START + 24) +#define TTCDKB_GPIO_EXT0(x)	(MMP_NR_BUILTIN_GPIO + ((x < 0) ? 0 :	\ +				((x < 16) ? x : 15))) +#define TTCDKB_GPIO_EXT1(x)	(MMP_NR_BUILTIN_GPIO + 16 + ((x < 0) ? 0 : \ +				((x < 16) ? x : 15))) + +/* + * 16 board interrupts -- MAX7312 GPIO expander + * 16 board interrupts -- PCA9575 GPIO expander + * 24 board interrupts -- 88PM860x PMIC + */ +#define TTCDKB_NR_IRQS		(MMP_NR_IRQS + 16 + 16 + 24)  static unsigned long ttc_dkb_pin_config[] __initdata = {  	/* UART2 */ @@ -57,6 +76,10 @@ static unsigned long ttc_dkb_pin_config[] __initdata = {  	DF_RDY0_DF_RDY0,  }; +static struct pxa_gpio_platform_data pxa910_gpio_pdata = { +	.irq_base	= MMP_GPIO_TO_IRQ(0), +}; +  static struct mtd_partition ttc_dkb_onenand_partitions[] = {  	{  		.name		= "bootloader", @@ -81,7 +104,7 @@ static struct mtd_partition ttc_dkb_onenand_partitions[] = {  	}, {  		.name		= "filesystem",  		.offset		= MTDPART_OFS_APPEND, -		.size		= SZ_48M, +		.size		= SZ_32M + SZ_16M,  		.mask_flags	= 0,  	}  }; @@ -110,24 +133,183 @@ static struct platform_device ttc_dkb_device_onenand = {  };  static struct platform_device *ttc_dkb_devices[] = { +	&pxa910_device_gpio, +	&pxa910_device_rtc,  	&ttc_dkb_device_onenand,  }; +static struct pca953x_platform_data max7312_data[] = { +	{ +		.gpio_base	= TTCDKB_GPIO_EXT0(0), +		.irq_base	= MMP_NR_IRQS, +	}, +}; + +static struct pm860x_platform_data ttc_dkb_pm8607_info = { +	.irq_base       = IRQ_BOARD_START, +}; + +static struct i2c_board_info ttc_dkb_i2c_info[] = { +	{ +		.type           = "88PM860x", +		.addr           = 0x34, +		.platform_data  = &ttc_dkb_pm8607_info, +		.irq            = IRQ_PXA910_PMIC_INT, +	}, +	{ +		.type		= "max7312", +		.addr		= 0x23, +		.irq		= MMP_GPIO_TO_IRQ(80), +		.platform_data	= &max7312_data, +	}, +}; + +#if IS_ENABLED(CONFIG_USB_SUPPORT) +#if IS_ENABLED(CONFIG_USB_MV_UDC) || IS_ENABLED(CONFIG_USB_EHCI_MV_U2O) + +static struct mv_usb_platform_data ttc_usb_pdata = { +	.vbus		= NULL, +	.mode		= MV_USB_MODE_OTG, +	.otg_force_a_bus_req = 1, +	.phy_init	= pxa_usb_phy_init, +	.phy_deinit	= pxa_usb_phy_deinit, +	.set_vbus	= NULL, +}; +#endif +#endif + +#if IS_ENABLED(CONFIG_MTD_NAND_PXA3xx) +static struct pxa3xx_nand_platform_data dkb_nand_info = { +	.enable_arbiter = 1, +	.num_cs = 1, +}; +#endif + +#if IS_ENABLED(CONFIG_MMP_DISP) +/* path config */ +#define CFG_IOPADMODE(iopad)   (iopad)  /* 0x0 ~ 0xd */ +#define SCLK_SOURCE_SELECT(x)  (x << 30) /* 0x0 ~ 0x3 */ +/* link config */ +#define CFG_DUMBMODE(mode)     (mode << 28) /* 0x0 ~ 0x6*/ +static struct mmp_mach_path_config dkb_disp_config[] = { +	[0] = { +		.name = "mmp-parallel", +		.overlay_num = 2, +		.output_type = PATH_OUT_PARALLEL, +		.path_config = CFG_IOPADMODE(0x1) +			| SCLK_SOURCE_SELECT(0x1), +		.link_config = CFG_DUMBMODE(0x2), +	}, +}; + +static struct mmp_mach_plat_info dkb_disp_info = { +	.name = "mmp-disp", +	.clk_name = "disp0", +	.path_num = 1, +	.paths = dkb_disp_config, +}; + +static struct mmp_buffer_driver_mach_info dkb_fb_info = { +	.name = "mmp-fb", +	.path_name = "mmp-parallel", +	.overlay_id = 0, +	.dmafetch_id = 1, +	.default_pixfmt = PIXFMT_RGB565, +}; + +static void dkb_tpo_panel_power(int on) +{ +	int err; +	u32 spi_reset = mfp_to_gpio(MFP_PIN_GPIO106); + +	if (on) { +		err = gpio_request(spi_reset, "TPO_LCD_SPI_RESET"); +		if (err) { +			pr_err("failed to request GPIO for TPO LCD RESET\n"); +			return; +		} +		gpio_direction_output(spi_reset, 0); +		udelay(100); +		gpio_set_value(spi_reset, 1); +		gpio_free(spi_reset); +	} else { +		err = gpio_request(spi_reset, "TPO_LCD_SPI_RESET"); +		if (err) { +			pr_err("failed to request LCD RESET gpio\n"); +			return; +		} +		gpio_set_value(spi_reset, 0); +		gpio_free(spi_reset); +	} +} + +static struct mmp_mach_panel_info dkb_tpo_panel_info = { +	.name = "tpo-hvga", +	.plat_path_name = "mmp-parallel", +	.plat_set_onoff = dkb_tpo_panel_power, +}; + +static struct spi_board_info spi_board_info[] __initdata = { +	{ +		.modalias       = "tpo-hvga", +		.platform_data  = &dkb_tpo_panel_info, +		.bus_num        = 5, +	} +}; + +static void __init add_disp(void) +{ +	pxa_register_device(&pxa910_device_disp, +		&dkb_disp_info, sizeof(dkb_disp_info)); +	spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); +	pxa_register_device(&pxa910_device_fb, +		&dkb_fb_info, sizeof(dkb_fb_info)); +	pxa_register_device(&pxa910_device_panel, +		&dkb_tpo_panel_info, sizeof(dkb_tpo_panel_info)); +} +#endif +  static void __init ttc_dkb_init(void)  {  	mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config));  	/* on-chip devices */  	pxa910_add_uart(1); +#if IS_ENABLED(CONFIG_MTD_NAND_PXA3xx) +	pxa910_add_nand(&dkb_nand_info); +#endif  	/* off-chip devices */ +	pxa910_add_twsi(0, NULL, ARRAY_AND_SIZE(ttc_dkb_i2c_info)); +	platform_device_add_data(&pxa910_device_gpio, &pxa910_gpio_pdata, +				 sizeof(struct pxa_gpio_platform_data));  	platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices)); + +#if IS_ENABLED(CONFIG_USB_MV_UDC) +	pxa168_device_u2o.dev.platform_data = &ttc_usb_pdata; +	platform_device_register(&pxa168_device_u2o); +#endif + +#if IS_ENABLED(CONFIG_USB_EHCI_MV_U2O) +	pxa168_device_u2oehci.dev.platform_data = &ttc_usb_pdata; +	platform_device_register(&pxa168_device_u2oehci); +#endif + +#if IS_ENABLED(CONFIG_USB_MV_OTG) +	pxa168_device_u2ootg.dev.platform_data = &ttc_usb_pdata; +	platform_device_register(&pxa168_device_u2ootg); +#endif + +#if IS_ENABLED(CONFIG_MMP_DISP) +	add_disp(); +#endif  }  MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")  	.map_io		= mmp_map_io,  	.nr_irqs	= TTCDKB_NR_IRQS,  	.init_irq       = pxa910_init_irq, -	.timer          = &pxa910_timer, +	.init_time	= pxa910_timer_init,  	.init_machine   = ttc_dkb_init, +	.restart	= mmp_restart,  MACHINE_END  | 
