diff options
Diffstat (limited to 'arch/arm/mach-ux500')
57 files changed, 2264 insertions, 6025 deletions
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 2dd44a0b461..699e8601dbf 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig @@ -1,34 +1,69 @@ -if ARCH_U8500 - -config UX500_SOC_COMMON -	bool -	default y +menuconfig ARCH_U8500 +	bool "ST-Ericsson U8500 Series" if ARCH_MULTI_V7 +	depends on MMU +	select AB8500_CORE +	select ABX500_CORE +	select ARCH_REQUIRE_GPIOLIB +	select ARM_AMBA +	select ARM_ERRATA_754322 +	select ARM_ERRATA_764369 if SMP  	select ARM_GIC -	select HAS_MTU -	select NOMADIK_GPIO +	select CACHE_L2X0 +	select CLKSRC_NOMADIK_MTU +	select HAVE_ARM_SCU if SMP +	select HAVE_ARM_TWD if SMP +	select PINCTRL +	select PINCTRL_ABX500 +	select PINCTRL_NOMADIK +	select PL310_ERRATA_753970 if CACHE_L2X0 +	help +	  Support for ST-Ericsson's Ux500 architecture + +if ARCH_U8500  config UX500_SOC_DB8500  	bool +	select MFD_DB8500_PRCMU +	select PINCTRL_DB8500 +	select PINCTRL_DB8540 +	select PINCTRL_AB8500 +	select PINCTRL_AB8505 +	select PINCTRL_AB9540 +	select PINCTRL_AB8540 +	select REGULATOR +	select REGULATOR_DB8500_PRCMU -config UX500_SOC_DB5500 -	bool +config MACH_MOP500 +	bool "U8500 Development platform, MOP500 versions" +	select I2C +	select I2C_NOMADIK +	select REGULATOR +	select REGULATOR_FIXED_VOLTAGE +	select SOC_BUS +	select UX500_SOC_DB8500 +	help +	  Include support for the MOP500 development platform. -choice -	prompt "Ux500 target platform" -	default MACH_U8500_MOP +config MACH_HREFV60 +	bool "U8500 Development platform, HREFv60 version" +	select MACH_MOP500 +	help +	  Include support for the HREFv60 new development platform. +	  Includes HREFv70, v71 etc. -config MACH_U8500_MOP -	bool "U8500 Development platform" -	select UX500_SOC_DB8500 +config MACH_SNOWBALL +	bool "U8500 Snowball platform" +	select MACH_MOP500  	help -	  Include support for the mop500 development platform. +	  Include support for the snowball development platform. -config MACH_U5500 -	bool "U5500 Development platform" -	select UX500_SOC_DB5500 +config UX500_AUTO_PLATFORM +	def_bool y +	select MACH_MOP500  	help -	  Include support for the U5500 development platform. -endchoice +	  At least one platform needs to be selected in order to build +	  a working kernel. If everything else is disabled, this +	  automatically enables MACH_MOP500.  config UX500_DEBUG_UART  	int "Ux500 UART to use for low-level debug" @@ -37,18 +72,4 @@ config UX500_DEBUG_UART  	  Choose the UART on which kernel low-level debug messages should be  	  output. -config U5500_MODEM_IRQ -	bool "Modem IRQ support" -	depends on MACH_U5500 -	default y -	help -	  Add support for handling IRQ:s from modem side - -config U5500_MBOX -	bool "Mailbox support" -	depends on MACH_U5500 && U5500_MODEM_IRQ -	default y -	help -	  Add support for U5500 mailbox communication with modem side -  endif diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile index 9e27a84433c..9741de956b3 100644 --- a/arch/arm/mach-ux500/Makefile +++ b/arch/arm/mach-ux500/Makefile @@ -2,14 +2,12 @@  # Makefile for the linux kernel, U8500 machine.  # -obj-y				:= clock.o cpu.o devices.o -obj-$(CONFIG_UX500_SOC_DB5500)	+= cpu-db5500.o devices-db5500.o -obj-$(CONFIG_UX500_SOC_DB8500)	+= cpu-db8500.o devices-db8500.o prcmu.o -obj-$(CONFIG_MACH_U8500_MOP)	+= board-mop500.o board-mop500-sdi.o -obj-$(CONFIG_MACH_U5500)	+= board-u5500.o +obj-y				:= cpu.o id.o timer.o pm.o +obj-$(CONFIG_CACHE_L2X0)	+= cache-l2x0.o +obj-$(CONFIG_UX500_SOC_DB8500)	+= cpu-db8500.o +obj-$(CONFIG_MACH_MOP500)	+= board-mop500-regulators.o \ +				board-mop500-audio.o  obj-$(CONFIG_SMP)		+= platsmp.o headsmp.o  obj-$(CONFIG_HOTPLUG_CPU)	+= hotplug.o -obj-$(CONFIG_LOCAL_TIMERS)	+= localtimer.o -obj-$(CONFIG_REGULATOR_AB8500)	+= board-mop500-regulators.o -obj-$(CONFIG_U5500_MODEM_IRQ)	+= modem_irq.o -obj-$(CONFIG_U5500_MBOX)	+= mbox.o + +CFLAGS_hotplug.o		+= -march=armv7-a diff --git a/arch/arm/mach-ux500/Makefile.boot b/arch/arm/mach-ux500/Makefile.boot index c7e75acfe6c..760a0efe758 100644 --- a/arch/arm/mach-ux500/Makefile.boot +++ b/arch/arm/mach-ux500/Makefile.boot @@ -1,4 +1,3 @@ -   zreladdr-y	:= 0x00008000 +   zreladdr-y	+= 0x00008000  params_phys-y	:= 0x00000100  initrd_phys-y	:= 0x00800000 - diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c new file mode 100644 index 00000000000..b2a0899e745 --- /dev/null +++ b/arch/arm/mach-ux500/board-mop500-audio.c @@ -0,0 +1,77 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * License terms: GNU General Public License (GPL), version 2 + */ + +#include <linux/platform_device.h> +#include <linux/init.h> +#include <linux/gpio.h> +#include <linux/platform_data/dma-ste-dma40.h> + +#include <linux/platform_data/asoc-ux500-msp.h> + +#include "ste-dma40-db8500.h" +#include "board-mop500.h" + +static struct stedma40_chan_cfg msp0_dma_rx = { +	.high_priority = true, +	.dir = DMA_DEV_TO_MEM, +	.dev_type = DB8500_DMA_DEV31_MSP0_SLIM0_CH0, +}; + +static struct stedma40_chan_cfg msp0_dma_tx = { +	.high_priority = true, +	.dir = DMA_MEM_TO_DEV, +	.dev_type = DB8500_DMA_DEV31_MSP0_SLIM0_CH0, +}; + +struct msp_i2s_platform_data msp0_platform_data = { +	.id = 0, +	.msp_i2s_dma_rx = &msp0_dma_rx, +	.msp_i2s_dma_tx = &msp0_dma_tx, +}; + +static struct stedma40_chan_cfg msp1_dma_rx = { +	.high_priority = true, +	.dir = DMA_DEV_TO_MEM, +	.dev_type = DB8500_DMA_DEV30_MSP3, +}; + +static struct stedma40_chan_cfg msp1_dma_tx = { +	.high_priority = true, +	.dir = DMA_MEM_TO_DEV, +	.dev_type = DB8500_DMA_DEV30_MSP1, +}; + +struct msp_i2s_platform_data msp1_platform_data = { +	.id = 1, +	.msp_i2s_dma_rx = NULL, +	.msp_i2s_dma_tx = &msp1_dma_tx, +}; + +static struct stedma40_chan_cfg msp2_dma_rx = { +	.high_priority = true, +	.dir = DMA_DEV_TO_MEM, +	.dev_type = DB8500_DMA_DEV14_MSP2, +}; + +static struct stedma40_chan_cfg msp2_dma_tx = { +	.high_priority = true, +	.dir = DMA_MEM_TO_DEV, +	.dev_type = DB8500_DMA_DEV14_MSP2, +	.use_fixed_channel = true, +	.phy_channel = 1, +}; + +struct msp_i2s_platform_data msp2_platform_data = { +	.id = 2, +	.msp_i2s_dma_rx = &msp2_dma_rx, +	.msp_i2s_dma_tx = &msp2_dma_tx, +}; + +struct msp_i2s_platform_data msp3_platform_data = { +	.id		= 3, +	.msp_i2s_dma_rx	= &msp1_dma_rx, +	.msp_i2s_dma_tx	= NULL, +}; diff --git a/arch/arm/mach-ux500/board-mop500-regulators.c b/arch/arm/mach-ux500/board-mop500-regulators.c index 1187f1fc2e5..a4e139aa244 100644 --- a/arch/arm/mach-ux500/board-mop500-regulators.c +++ b/arch/arm/mach-ux500/board-mop500-regulators.c @@ -3,99 +3,1063 @@   *   * License Terms: GNU General Public License v2   * - * Author: Sundar Iyer <sundar.iyer@stericsson.com> + * Authors: Sundar Iyer <sundar.iyer@stericsson.com> + *          Bengt Jonsson <bengt.g.jonsson@stericsson.com> + *          Daniel Willerud <daniel.willerud@stericsson.com>   *   * MOP500 board specific initialization for regulators   */  #include <linux/kernel.h>  #include <linux/regulator/machine.h> +#include <linux/regulator/ab8500.h> +#include "board-mop500-regulators.h" +#include "id.h" -/* supplies to the display/camera */ -static struct regulator_init_data ab8500_vaux1_regulator = { -	.constraints = { -		.name = "V-DISPLAY", -		.min_uV = 2500000, -		.max_uV = 2900000, -		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE| -					REGULATOR_CHANGE_STATUS, -	}, +static struct regulator_consumer_supply gpio_en_3v3_consumers[] = { +       REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),  }; -/* supplies to the on-board eMMC */ -static struct regulator_init_data ab8500_vaux2_regulator = { -	.constraints = { -		.name = "V-eMMC1", -		.min_uV = 1100000, -		.max_uV = 3300000, -		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE| -					REGULATOR_CHANGE_STATUS, -	}, +struct regulator_init_data gpio_en_3v3_regulator = { +       .constraints = { +               .name = "EN-3V3", +               .min_uV = 3300000, +               .max_uV = 3300000, +               .valid_ops_mask = REGULATOR_CHANGE_STATUS, +       }, +       .num_consumer_supplies = ARRAY_SIZE(gpio_en_3v3_consumers), +       .consumer_supplies = gpio_en_3v3_consumers,  }; -/* supply for VAUX3, supplies to SDcard slots */ -static struct regulator_init_data ab8500_vaux3_regulator = { -	.constraints = { -		.name = "V-MMC-SD", -		.min_uV = 1100000, -		.max_uV = 3300000, -		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE| -					REGULATOR_CHANGE_STATUS, -	}, +/* + * TPS61052 regulator + */ +static struct regulator_consumer_supply tps61052_vaudio_consumers[] = { +	/* +	 * Boost converter supply to raise voltage on audio speaker, this +	 * is actually connected to three pins, VInVhfL (left amplifier) +	 * VInVhfR (right amplifier) and VIntDClassInt - all three must +	 * be connected to the same voltage. +	 */ +	REGULATOR_SUPPLY("vintdclassint", "ab8500-codec.0"),  }; -/* supply for tvout, gpadc, TVOUT LDO */ -static struct regulator_init_data ab8500_vtvout_init = { +struct regulator_init_data tps61052_regulator = {  	.constraints = { -		.name = "V-TVOUT", +		.name = "vaudio-hf", +		.min_uV = 4500000, +		.max_uV = 4500000,  		.valid_ops_mask = REGULATOR_CHANGE_STATUS,  	}, +	.num_consumer_supplies = ARRAY_SIZE(tps61052_vaudio_consumers), +	.consumer_supplies = tps61052_vaudio_consumers,  }; -/* supply for ab8500-vaudio, VAUDIO LDO */ -static struct regulator_init_data ab8500_vaudio_init = { -	.constraints = { -		.name = "V-AUD", -		.valid_ops_mask = REGULATOR_CHANGE_STATUS, -	}, +static struct regulator_consumer_supply ab8500_vaux1_consumers[] = { +	/* Main display, u8500 R3 uib */ +	REGULATOR_SUPPLY("vddi", "mcde_disp_sony_acx424akp.0"), +	/* Main display, u8500 uib and ST uib */ +	REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.0"), +	/* Secondary display, ST uib */ +	REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.1"), +	/* SFH7741 proximity sensor */ +	REGULATOR_SUPPLY("vcc", "gpio-keys.0"), +	/* BH1780GLS ambient light sensor */ +	REGULATOR_SUPPLY("vcc", "2-0029"), +	/* lsm303dlh accelerometer */ +	REGULATOR_SUPPLY("vdd", "2-0018"), +	/* lsm303dlhc accelerometer */ +	REGULATOR_SUPPLY("vdd", "2-0019"), +	/* lsm303dlh magnetometer */ +	REGULATOR_SUPPLY("vdd", "2-001e"), +	/* Rohm BU21013 Touchscreen devices */ +	REGULATOR_SUPPLY("avdd", "3-005c"), +	REGULATOR_SUPPLY("avdd", "3-005d"), +	/* Synaptics RMI4 Touchscreen device */ +	REGULATOR_SUPPLY("vdd", "3-004b"), +	/* L3G4200D Gyroscope device */ +	REGULATOR_SUPPLY("vdd", "2-0068"), +	/* Ambient light sensor device */ +	REGULATOR_SUPPLY("vdd", "3-0029"), +	/* Pressure sensor device */ +	REGULATOR_SUPPLY("vdd", "2-005c"), +	/* Cypress TrueTouch Touchscreen device */ +	REGULATOR_SUPPLY("vcpin", "spi8.0"), +	/* Camera device */ +	REGULATOR_SUPPLY("vaux12v5", "mmio_camera"),  }; -/* supply for v-anamic1 VAMic1-LDO */ -static struct regulator_init_data ab8500_vamic1_init = { -	.constraints = { -		.name = "V-AMIC1", -		.valid_ops_mask = REGULATOR_CHANGE_STATUS, -	}, +static struct regulator_consumer_supply ab8500_vaux2_consumers[] = { +	/* On-board eMMC power */ +	REGULATOR_SUPPLY("vmmc", "sdi4"), +	/* AB8500 audio codec */ +	REGULATOR_SUPPLY("vcc-N2158", "ab8500-codec.0"), +	/* AB8500 accessory detect 1 */ +	REGULATOR_SUPPLY("vcc-N2158", "ab8500-acc-det.0"), +	/* AB8500 Tv-out device */ +	REGULATOR_SUPPLY("vcc-N2158", "mcde_tv_ab8500.4"), +	/* AV8100 HDMI device */ +	REGULATOR_SUPPLY("vcc-N2158", "av8100_hdmi.3"),  }; -/* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */ -static struct regulator_init_data ab8500_vamic2_init = { -	.constraints = { -		.name = "V-AMIC2", -		.valid_ops_mask = REGULATOR_CHANGE_STATUS, -	}, +static struct regulator_consumer_supply ab8500_vaux3_consumers[] = { +	REGULATOR_SUPPLY("v-SD-STM", "stm"), +	/* External MMC slot power */ +	REGULATOR_SUPPLY("vmmc", "sdi0"),  }; -/* supply for v-dmic, VDMIC LDO */ -static struct regulator_init_data ab8500_vdmic_init = { -	.constraints = { -		.name = "V-DMIC", -		.valid_ops_mask = REGULATOR_CHANGE_STATUS, +static struct regulator_consumer_supply ab8505_vaux4_consumers[] = { +}; + +static struct regulator_consumer_supply ab8505_vaux5_consumers[] = { +}; + +static struct regulator_consumer_supply ab8505_vaux6_consumers[] = { +}; + +static struct regulator_consumer_supply ab8505_vaux8_consumers[] = { +	/* AB8500 audio codec device */ +	REGULATOR_SUPPLY("v-aux8", NULL), +}; + +static struct regulator_consumer_supply ab8505_vadc_consumers[] = { +	/* Internal general-purpose ADC */ +	REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"), +	/* ADC for charger */ +	REGULATOR_SUPPLY("vddadc", "ab8500-charger.0"), +}; + +static struct regulator_consumer_supply ab8500_vtvout_consumers[] = { +	/* TV-out DENC supply */ +	REGULATOR_SUPPLY("vtvout", "ab8500-denc.0"), +	/* Internal general-purpose ADC */ +	REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"), +	/* ADC for charger */ +	REGULATOR_SUPPLY("vddadc", "ab8500-charger.0"), +	/* AB8500 Tv-out device */ +	REGULATOR_SUPPLY("vtvout", "mcde_tv_ab8500.4"), +}; + +static struct regulator_consumer_supply ab8500_vaud_consumers[] = { +	/* AB8500 audio-codec main supply */ +	REGULATOR_SUPPLY("vaud", "ab8500-codec.0"), +}; + +static struct regulator_consumer_supply ab8500_vamic1_consumers[] = { +	/* AB8500 audio-codec Mic1 supply */ +	REGULATOR_SUPPLY("vamic1", "ab8500-codec.0"), +}; + +static struct regulator_consumer_supply ab8500_vamic2_consumers[] = { +	/* AB8500 audio-codec Mic2 supply */ +	REGULATOR_SUPPLY("vamic2", "ab8500-codec.0"), +}; + +static struct regulator_consumer_supply ab8500_vdmic_consumers[] = { +	/* AB8500 audio-codec DMic supply */ +	REGULATOR_SUPPLY("vdmic", "ab8500-codec.0"), +}; + +static struct regulator_consumer_supply ab8500_vintcore_consumers[] = { +	/* SoC core supply, no device */ +	REGULATOR_SUPPLY("v-intcore", NULL), +	/* USB Transceiver */ +	REGULATOR_SUPPLY("vddulpivio18", "ab8500-usb.0"), +	/* Handled by abx500 clk driver */ +	REGULATOR_SUPPLY("v-intcore", "abx500-clk.0"), +}; + +static struct regulator_consumer_supply ab8505_usb_consumers[] = { +	/* HS USB OTG physical interface */ +	REGULATOR_SUPPLY("v-ape", NULL), +}; + +static struct regulator_consumer_supply ab8500_vana_consumers[] = { +	/* DB8500 DSI */ +	REGULATOR_SUPPLY("vdddsi1v2", "mcde"), +	REGULATOR_SUPPLY("vdddsi1v2", "b2r2_core"), +	REGULATOR_SUPPLY("vdddsi1v2", "b2r2_1_core"), +	REGULATOR_SUPPLY("vdddsi1v2", "dsilink.0"), +	REGULATOR_SUPPLY("vdddsi1v2", "dsilink.1"), +	REGULATOR_SUPPLY("vdddsi1v2", "dsilink.2"), +	/* DB8500 CSI */ +	REGULATOR_SUPPLY("vddcsi1v2", "mmio_camera"), +}; + +/* ab8500 regulator register initialization */ +static struct ab8500_regulator_reg_init ab8500_reg_init[] = { +	/* +	 * VanaRequestCtrl          = HP/LP depending on VxRequest +	 * VextSupply1RequestCtrl   = HP/LP depending on VxRequest +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL2,       0xf0, 0x00), +	/* +	 * VextSupply2RequestCtrl   = HP/LP depending on VxRequest +	 * VextSupply3RequestCtrl   = HP/LP depending on VxRequest +	 * Vaux1RequestCtrl         = HP/LP depending on VxRequest +	 * Vaux2RequestCtrl         = HP/LP depending on VxRequest +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL3,       0xff, 0x00), +	/* +	 * Vaux3RequestCtrl         = HP/LP depending on VxRequest +	 * SwHPReq                  = Control through SWValid disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL4,       0x07, 0x00), +	/* +	 * VanaSysClkReq1HPValid    = disabled +	 * Vaux1SysClkReq1HPValid   = disabled +	 * Vaux2SysClkReq1HPValid   = disabled +	 * Vaux3SysClkReq1HPValid   = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID1, 0xe8, 0x00), +	/* +	 * VextSupply1SysClkReq1HPValid = disabled +	 * VextSupply2SysClkReq1HPValid = disabled +	 * VextSupply3SysClkReq1HPValid = SysClkReq1 controlled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID2, 0x70, 0x40), +	/* +	 * VanaHwHPReq1Valid        = disabled +	 * Vaux1HwHPreq1Valid       = disabled +	 * Vaux2HwHPReq1Valid       = disabled +	 * Vaux3HwHPReqValid        = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID1,     0xe8, 0x00), +	/* +	 * VextSupply1HwHPReq1Valid = disabled +	 * VextSupply2HwHPReq1Valid = disabled +	 * VextSupply3HwHPReq1Valid = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID2,     0x07, 0x00), +	/* +	 * VanaHwHPReq2Valid        = disabled +	 * Vaux1HwHPReq2Valid       = disabled +	 * Vaux2HwHPReq2Valid       = disabled +	 * Vaux3HwHPReq2Valid       = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID1,     0xe8, 0x00), +	/* +	 * VextSupply1HwHPReq2Valid = disabled +	 * VextSupply2HwHPReq2Valid = disabled +	 * VextSupply3HwHPReq2Valid = HWReq2 controlled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID2,     0x07, 0x04), +	/* +	 * VanaSwHPReqValid         = disabled +	 * Vaux1SwHPReqValid        = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID1,      0xa0, 0x00), +	/* +	 * Vaux2SwHPReqValid        = disabled +	 * Vaux3SwHPReqValid        = disabled +	 * VextSupply1SwHPReqValid  = disabled +	 * VextSupply2SwHPReqValid  = disabled +	 * VextSupply3SwHPReqValid  = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID2,      0x1f, 0x00), +	/* +	 * SysClkReq2Valid1         = SysClkReq2 controlled +	 * SysClkReq3Valid1         = disabled +	 * SysClkReq4Valid1         = SysClkReq4 controlled +	 * SysClkReq5Valid1         = disabled +	 * SysClkReq6Valid1         = SysClkReq6 controlled +	 * SysClkReq7Valid1         = disabled +	 * SysClkReq8Valid1         = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID1,    0xfe, 0x2a), +	/* +	 * SysClkReq2Valid2         = disabled +	 * SysClkReq3Valid2         = disabled +	 * SysClkReq4Valid2         = disabled +	 * SysClkReq5Valid2         = disabled +	 * SysClkReq6Valid2         = SysClkReq6 controlled +	 * SysClkReq7Valid2         = disabled +	 * SysClkReq8Valid2         = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID2,    0xfe, 0x20), +	/* +	 * VTVoutEna                = disabled +	 * Vintcore12Ena            = disabled +	 * Vintcore12Sel            = 1.25 V +	 * Vintcore12LP             = inactive (HP) +	 * VTVoutLP                 = inactive (HP) +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUMISC1,              0xfe, 0x10), +	/* +	 * VaudioEna                = disabled +	 * VdmicEna                 = disabled +	 * Vamic1Ena                = disabled +	 * Vamic2Ena                = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VAUDIOSUPPLY,           0x1e, 0x00), +	/* +	 * Vamic1_dzout             = high-Z when Vamic1 is disabled +	 * Vamic2_dzout             = high-Z when Vamic2 is disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUCTRL1VAMIC,         0x03, 0x00), +	/* +	 * VPll                     = Hw controlled (NOTE! PRCMU bits) +	 * VanaRegu                 = force off +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VPLLVANAREGU,           0x0f, 0x02), +	/* +	 * VrefDDREna               = disabled +	 * VrefDDRSleepMode         = inactive (no pulldown) +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VREFDDR,                0x03, 0x00), +	/* +	 * VextSupply1Regu          = force LP +	 * VextSupply2Regu          = force OFF +	 * VextSupply3Regu          = force HP (-> STBB2=LP and TPS=LP) +	 * ExtSupply2Bypass         = ExtSupply12LPn ball is 0 when Ena is 0 +	 * ExtSupply3Bypass         = ExtSupply3LPn ball is 0 when Ena is 0 +	 */ +	INIT_REGULATOR_REGISTER(AB8500_EXTSUPPLYREGU,          0xff, 0x13), +	/* +	 * Vaux1Regu                = force HP +	 * Vaux2Regu                = force off +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VAUX12REGU,             0x0f, 0x01), +	/* +	 * Vaux3Regu                = force off +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3REGU,          0x03, 0x00), +	/* +	 * Vaux1Sel                 = 2.8 V +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VAUX1SEL,               0x0f, 0x0C), +	/* +	 * Vaux2Sel                 = 2.9 V +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VAUX2SEL,               0x0f, 0x0d), +	/* +	 * Vaux3Sel                 = 2.91 V +	 */ +	INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3SEL,           0x07, 0x07), +	/* +	 * VextSupply12LP           = disabled (no LP) +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUCTRL2SPARE,         0x01, 0x00), +	/* +	 * Vaux1Disch               = short discharge time +	 * Vaux2Disch               = short discharge time +	 * Vaux3Disch               = short discharge time +	 * Vintcore12Disch          = short discharge time +	 * VTVoutDisch              = short discharge time +	 * VaudioDisch              = short discharge time +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH,          0xfc, 0x00), +	/* +	 * VanaDisch                = short discharge time +	 * VdmicPullDownEna         = pulldown disabled when Vdmic is disabled +	 * VdmicDisch               = short discharge time +	 */ +	INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH2,         0x16, 0x00), +}; + +/* AB8500 regulators */ +static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { +	/* supplies to the display/camera */ +	[AB8500_LDO_AUX1] = { +		.supply_regulator = "ab8500-ext-supply3", +		.constraints = { +			.name = "V-DISPLAY", +			.min_uV = 2800000, +			.max_uV = 3300000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS, +			.boot_on = 1, /* display is on at boot */ +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers), +		.consumer_supplies = ab8500_vaux1_consumers, +	}, +	/* supplies to the on-board eMMC */ +	[AB8500_LDO_AUX2] = { +		.supply_regulator = "ab8500-ext-supply3", +		.constraints = { +			.name = "V-eMMC1", +			.min_uV = 1100000, +			.max_uV = 3300000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers), +		.consumer_supplies = ab8500_vaux2_consumers, +	}, +	/* supply for VAUX3, supplies to SDcard slots */ +	[AB8500_LDO_AUX3] = { +		.supply_regulator = "ab8500-ext-supply3", +		.constraints = { +			.name = "V-MMC-SD", +			.min_uV = 1100000, +			.max_uV = 3300000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers), +		.consumer_supplies = ab8500_vaux3_consumers, +	}, +	/* supply for tvout, gpadc, TVOUT LDO */ +	[AB8500_LDO_TVOUT] = { +		.constraints = { +			.name = "V-TVOUT", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vtvout_consumers), +		.consumer_supplies = ab8500_vtvout_consumers, +	}, +	/* supply for ab8500-vaudio, VAUDIO LDO */ +	[AB8500_LDO_AUDIO] = { +		.constraints = { +			.name = "V-AUD", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaud_consumers), +		.consumer_supplies = ab8500_vaud_consumers, +	}, +	/* supply for v-anamic1 VAMic1-LDO */ +	[AB8500_LDO_ANAMIC1] = { +		.constraints = { +			.name = "V-AMIC1", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers), +		.consumer_supplies = ab8500_vamic1_consumers, +	}, +	/* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */ +	[AB8500_LDO_ANAMIC2] = { +		.constraints = { +			.name = "V-AMIC2", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers), +		.consumer_supplies = ab8500_vamic2_consumers, +	}, +	/* supply for v-dmic, VDMIC LDO */ +	[AB8500_LDO_DMIC] = { +		.constraints = { +			.name = "V-DMIC", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vdmic_consumers), +		.consumer_supplies = ab8500_vdmic_consumers, +	}, +	/* supply for v-intcore12, VINTCORE12 LDO */ +	[AB8500_LDO_INTCORE] = { +		.constraints = { +			.name = "V-INTCORE", +			.min_uV = 1250000, +			.max_uV = 1350000, +			.input_uV = 1800000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE | +					  REGULATOR_CHANGE_DRMS, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers), +		.consumer_supplies = ab8500_vintcore_consumers, +	}, +	/* supply for U8500 CSI-DSI, VANA LDO */ +	[AB8500_LDO_ANA] = { +		.constraints = { +			.name = "V-CSI-DSI", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers), +		.consumer_supplies = ab8500_vana_consumers,  	},  }; -/* supply for v-intcore12, VINTCORE12 LDO */ -static struct regulator_init_data ab8500_vintcore_init = { -	.constraints = { -		.name = "V-INTCORE", -		.valid_ops_mask = REGULATOR_CHANGE_STATUS, +/* supply for VextSupply3 */ +static struct regulator_consumer_supply ab8500_ext_supply3_consumers[] = { +	/* SIM supply for 3 V SIM cards */ +	REGULATOR_SUPPLY("vinvsim", "sim-detect.0"), +}; + +/* extended configuration for VextSupply2, only used for HREFP_V20 boards */ +static struct ab8500_ext_regulator_cfg ab8500_ext_supply2 = { +	.hwreq = true, +}; + +/* + * AB8500 external regulators + */ +static struct regulator_init_data ab8500_ext_regulators[] = { +	/* fixed Vbat supplies VSMPS1_EXT_1V8 */ +	[AB8500_EXT_SUPPLY1] = { +		.constraints = { +			.name = "ab8500-ext-supply1", +			.min_uV = 1800000, +			.max_uV = 1800000, +			.initial_mode = REGULATOR_MODE_IDLE, +			.boot_on = 1, +			.always_on = 1, +		}, +	}, +	/* fixed Vbat supplies VSMPS2_EXT_1V36 and VSMPS5_EXT_1V15 */ +	[AB8500_EXT_SUPPLY2] = { +		.constraints = { +			.name = "ab8500-ext-supply2", +			.min_uV = 1360000, +			.max_uV = 1360000, +		}, +	}, +	/* fixed Vbat supplies VSMPS3_EXT_3V4 and VSMPS4_EXT_3V4 */ +	[AB8500_EXT_SUPPLY3] = { +		.constraints = { +			.name = "ab8500-ext-supply3", +			.min_uV = 3400000, +			.max_uV = 3400000, +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +			.boot_on = 1, +		}, +		.num_consumer_supplies = +			ARRAY_SIZE(ab8500_ext_supply3_consumers), +		.consumer_supplies = ab8500_ext_supply3_consumers,  	},  }; -/* supply for U8500 CSI/DSI, VANA LDO */ -static struct regulator_init_data ab8500_vana_init = { -	.constraints = { -		.name = "V-CSI/DSI", -		.valid_ops_mask = REGULATOR_CHANGE_STATUS, +/* ab8505 regulator register initialization */ +static struct ab8500_regulator_reg_init ab8505_reg_init[] = { +	/* +	 * VarmRequestCtrl +	 * VsmpsCRequestCtrl +	 * VsmpsARequestCtrl +	 * VsmpsBRequestCtrl +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL1,       0x00, 0x00), +	/* +	 * VsafeRequestCtrl +	 * VpllRequestCtrl +	 * VanaRequestCtrl          = HP/LP depending on VxRequest +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL2,       0x30, 0x00), +	/* +	 * Vaux1RequestCtrl         = HP/LP depending on VxRequest +	 * Vaux2RequestCtrl         = HP/LP depending on VxRequest +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL3,       0xf0, 0x00), +	/* +	 * Vaux3RequestCtrl         = HP/LP depending on VxRequest +	 * SwHPReq                  = Control through SWValid disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL4,       0x07, 0x00), +	/* +	 * VsmpsASysClkReq1HPValid +	 * VsmpsBSysClkReq1HPValid +	 * VsafeSysClkReq1HPValid +	 * VanaSysClkReq1HPValid    = disabled +	 * VpllSysClkReq1HPValid +	 * Vaux1SysClkReq1HPValid   = disabled +	 * Vaux2SysClkReq1HPValid   = disabled +	 * Vaux3SysClkReq1HPValid   = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQ1HPVALID1, 0xe8, 0x00), +	/* +	 * VsmpsCSysClkReq1HPValid +	 * VarmSysClkReq1HPValid +	 * VbbSysClkReq1HPValid +	 * VsmpsMSysClkReq1HPValid +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQ1HPVALID2, 0x00, 0x00), +	/* +	 * VsmpsAHwHPReq1Valid +	 * VsmpsBHwHPReq1Valid +	 * VsafeHwHPReq1Valid +	 * VanaHwHPReq1Valid        = disabled +	 * VpllHwHPReq1Valid +	 * Vaux1HwHPreq1Valid       = disabled +	 * Vaux2HwHPReq1Valid       = disabled +	 * Vaux3HwHPReqValid        = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ1VALID1,     0xe8, 0x00), +	/* +	 * VsmpsMHwHPReq1Valid +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ1VALID2,     0x00, 0x00), +	/* +	 * VsmpsAHwHPReq2Valid +	 * VsmpsBHwHPReq2Valid +	 * VsafeHwHPReq2Valid +	 * VanaHwHPReq2Valid        = disabled +	 * VpllHwHPReq2Valid +	 * Vaux1HwHPReq2Valid       = disabled +	 * Vaux2HwHPReq2Valid       = disabled +	 * Vaux3HwHPReq2Valid       = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ2VALID1,     0xe8, 0x00), +	/* +	 * VsmpsMHwHPReq2Valid +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ2VALID2,     0x00, 0x00), +	/** +	 * VsmpsCSwHPReqValid +	 * VarmSwHPReqValid +	 * VsmpsASwHPReqValid +	 * VsmpsBSwHPReqValid +	 * VsafeSwHPReqValid +	 * VanaSwHPReqValid +	 * VanaSwHPReqValid         = disabled +	 * VpllSwHPReqValid +	 * Vaux1SwHPReqValid        = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUSWHPREQVALID1,      0xa0, 0x00), +	/* +	 * Vaux2SwHPReqValid        = disabled +	 * Vaux3SwHPReqValid        = disabled +	 * VsmpsMSwHPReqValid +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUSWHPREQVALID2,      0x03, 0x00), +	/* +	 * SysClkReq2Valid1         = SysClkReq2 controlled +	 * SysClkReq3Valid1         = disabled +	 * SysClkReq4Valid1         = SysClkReq4 controlled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQVALID1,    0x0e, 0x0a), +	/* +	 * SysClkReq2Valid2         = disabled +	 * SysClkReq3Valid2         = disabled +	 * SysClkReq4Valid2         = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQVALID2,    0x0e, 0x00), +	/* +	 * Vaux4SwHPReqValid +	 * Vaux4HwHPReq2Valid +	 * Vaux4HwHPReq1Valid +	 * Vaux4SysClkReq1HPValid +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUVAUX4REQVALID,    0x00, 0x00), +	/* +	 * VadcEna                  = disabled +	 * VintCore12Ena            = disabled +	 * VintCore12Sel            = 1.25 V +	 * VintCore12LP             = inactive (HP) +	 * VadcLP                   = inactive (HP) +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUMISC1,              0xfe, 0x10), +	/* +	 * VaudioEna                = disabled +	 * Vaux8Ena                 = disabled +	 * Vamic1Ena                = disabled +	 * Vamic2Ena                = disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VAUDIOSUPPLY,           0x1e, 0x00), +	/* +	 * Vamic1_dzout             = high-Z when Vamic1 is disabled +	 * Vamic2_dzout             = high-Z when Vamic2 is disabled +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUCTRL1VAMIC,         0x03, 0x00), +	/* +	 * VsmpsARegu +	 * VsmpsASelCtrl +	 * VsmpsAAutoMode +	 * VsmpsAPWMMode +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSAREGU,    0x00, 0x00), +	/* +	 * VsmpsBRegu +	 * VsmpsBSelCtrl +	 * VsmpsBAutoMode +	 * VsmpsBPWMMode +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSBREGU,    0x00, 0x00), +	/* +	 * VsafeRegu +	 * VsafeSelCtrl +	 * VsafeAutoMode +	 * VsafePWMMode +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSAFEREGU,    0x00, 0x00), +	/* +	 * VPll                     = Hw controlled (NOTE! PRCMU bits) +	 * VanaRegu                 = force off +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VPLLVANAREGU,           0x0f, 0x02), +	/* +	 * VextSupply1Regu          = force OFF (OTP_ExtSupply12LPnPolarity 1) +	 * VextSupply2Regu          = force OFF (OTP_ExtSupply12LPnPolarity 1) +	 * VextSupply3Regu          = force OFF (OTP_ExtSupply3LPnPolarity 0) +	 * ExtSupply2Bypass         = ExtSupply12LPn ball is 0 when Ena is 0 +	 * ExtSupply3Bypass         = ExtSupply3LPn ball is 0 when Ena is 0 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_EXTSUPPLYREGU,          0xff, 0x30), +	/* +	 * Vaux1Regu                = force HP +	 * Vaux2Regu                = force off +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VAUX12REGU,             0x0f, 0x01), +	/* +	 * Vaux3Regu                = force off +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VRF1VAUX3REGU,          0x03, 0x00), +	/* +	 * VsmpsASel1 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSASEL1,    0x00, 0x00), +	/* +	 * VsmpsASel2 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSASEL2,    0x00, 0x00), +	/* +	 * VsmpsASel3 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSASEL3,    0x00, 0x00), +	/* +	 * VsmpsBSel1 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSBSEL1,    0x00, 0x00), +	/* +	 * VsmpsBSel2 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSBSEL2,    0x00, 0x00), +	/* +	 * VsmpsBSel3 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSMPSBSEL3,    0x00, 0x00), +	/* +	 * VsafeSel1 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSAFESEL1,    0x00, 0x00), +	/* +	 * VsafeSel2 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSAFESEL2,    0x00, 0x00), +	/* +	 * VsafeSel3 +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VSAFESEL3,    0x00, 0x00), +	/* +	 * Vaux1Sel                 = 2.8 V +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VAUX1SEL,               0x0f, 0x0C), +	/* +	 * Vaux2Sel                 = 2.9 V +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VAUX2SEL,               0x0f, 0x0d), +	/* +	 * Vaux3Sel                 = 2.91 V +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VRF1VAUX3SEL,           0x07, 0x07), +	/* +	 * Vaux4RequestCtrl +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VAUX4REQCTRL,    0x00, 0x00), +	/* +	 * Vaux4Regu +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VAUX4REGU,    0x00, 0x00), +	/* +	 * Vaux4Sel +	 */ +	INIT_REGULATOR_REGISTER(AB8505_VAUX4SEL,    0x00, 0x00), +	/* +	 * Vaux1Disch               = short discharge time +	 * Vaux2Disch               = short discharge time +	 * Vaux3Disch               = short discharge time +	 * Vintcore12Disch          = short discharge time +	 * VTVoutDisch              = short discharge time +	 * VaudioDisch              = short discharge time +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUCTRLDISCH,          0xfc, 0x00), +	/* +	 * VanaDisch                = short discharge time +	 * Vaux8PullDownEna         = pulldown disabled when Vaux8 is disabled +	 * Vaux8Disch               = short discharge time +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUCTRLDISCH2,         0x16, 0x00), +	/* +	 * Vaux4Disch               = short discharge time +	 */ +	INIT_REGULATOR_REGISTER(AB8505_REGUCTRLDISCH3,         0x01, 0x00), +	/* +	 * Vaux5Sel +	 * Vaux5LP +	 * Vaux5Ena +	 * Vaux5Disch +	 * Vaux5DisSfst +	 * Vaux5DisPulld +	 */ +	INIT_REGULATOR_REGISTER(AB8505_CTRLVAUX5,              0x00, 0x00), +	/* +	 * Vaux6Sel +	 * Vaux6LP +	 * Vaux6Ena +	 * Vaux6DisPulld +	 */ +	INIT_REGULATOR_REGISTER(AB8505_CTRLVAUX6,              0x00, 0x00), +}; + +struct regulator_init_data ab8505_regulators[AB8505_NUM_REGULATORS] = { +	/* supplies to the display/camera */ +	[AB8505_LDO_AUX1] = { +		.constraints = { +			.name = "V-DISPLAY", +			.min_uV = 2800000, +			.max_uV = 3300000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS, +			.boot_on = 1, /* display is on at boot */ +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers), +		.consumer_supplies = ab8500_vaux1_consumers, +	}, +	/* supplies to the on-board eMMC */ +	[AB8505_LDO_AUX2] = { +		.constraints = { +			.name = "V-eMMC1", +			.min_uV = 1100000, +			.max_uV = 3300000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers), +		.consumer_supplies = ab8500_vaux2_consumers, +	}, +	/* supply for VAUX3, supplies to SDcard slots */ +	[AB8505_LDO_AUX3] = { +		.constraints = { +			.name = "V-MMC-SD", +			.min_uV = 1100000, +			.max_uV = 3300000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers), +		.consumer_supplies = ab8500_vaux3_consumers, +	}, +	/* supply for VAUX4, supplies to NFC and standalone secure element */ +	[AB8505_LDO_AUX4] = { +		.constraints = { +			.name = "V-NFC-SE", +			.min_uV = 1100000, +			.max_uV = 3300000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8505_vaux4_consumers), +		.consumer_supplies = ab8505_vaux4_consumers, +	}, +	/* supply for VAUX5, supplies to TBD */ +	[AB8505_LDO_AUX5] = { +		.constraints = { +			.name = "V-AUX5", +			.min_uV = 1050000, +			.max_uV = 2790000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8505_vaux5_consumers), +		.consumer_supplies = ab8505_vaux5_consumers, +	}, +	/* supply for VAUX6, supplies to TBD */ +	[AB8505_LDO_AUX6] = { +		.constraints = { +			.name = "V-AUX6", +			.min_uV = 1050000, +			.max_uV = 2790000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8505_vaux6_consumers), +		.consumer_supplies = ab8505_vaux6_consumers,  	}, +	/* supply for gpadc, ADC LDO */ +	[AB8505_LDO_ADC] = { +		.constraints = { +			.name = "V-ADC", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8505_vadc_consumers), +		.consumer_supplies = ab8505_vadc_consumers, +	}, +	/* supply for ab8500-vaudio, VAUDIO LDO */ +	[AB8505_LDO_AUDIO] = { +		.constraints = { +			.name = "V-AUD", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaud_consumers), +		.consumer_supplies = ab8500_vaud_consumers, +	}, +	/* supply for v-anamic1 VAMic1-LDO */ +	[AB8505_LDO_ANAMIC1] = { +		.constraints = { +			.name = "V-AMIC1", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers), +		.consumer_supplies = ab8500_vamic1_consumers, +	}, +	/* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */ +	[AB8505_LDO_ANAMIC2] = { +		.constraints = { +			.name = "V-AMIC2", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers), +		.consumer_supplies = ab8500_vamic2_consumers, +	}, +	/* supply for v-aux8, VAUX8 LDO */ +	[AB8505_LDO_AUX8] = { +		.constraints = { +			.name = "V-AUX8", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8505_vaux8_consumers), +		.consumer_supplies = ab8505_vaux8_consumers, +	}, +	/* supply for v-intcore12, VINTCORE12 LDO */ +	[AB8505_LDO_INTCORE] = { +		.constraints = { +			.name = "V-INTCORE", +			.min_uV = 1250000, +			.max_uV = 1350000, +			.input_uV = 1800000, +			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | +					  REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE | +					  REGULATOR_CHANGE_DRMS, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers), +		.consumer_supplies = ab8500_vintcore_consumers, +	}, +	/* supply for LDO USB */ +	[AB8505_LDO_USB] = { +		.constraints = { +			.name = "V-USB", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS | +					  REGULATOR_CHANGE_MODE, +			.valid_modes_mask = REGULATOR_MODE_NORMAL | +					    REGULATOR_MODE_IDLE, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8505_usb_consumers), +		.consumer_supplies = ab8505_usb_consumers, +	}, +	/* supply for U8500 CSI-DSI, VANA LDO */ +	[AB8505_LDO_ANA] = { +		.constraints = { +			.name = "V-CSI-DSI", +			.valid_ops_mask = REGULATOR_CHANGE_STATUS, +		}, +		.num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers), +		.consumer_supplies = ab8500_vana_consumers, +	}, +}; + +struct ab8500_regulator_platform_data ab8500_regulator_plat_data = { +	.reg_init               = ab8500_reg_init, +	.num_reg_init           = ARRAY_SIZE(ab8500_reg_init), +	.regulator              = ab8500_regulators, +	.num_regulator          = ARRAY_SIZE(ab8500_regulators), +	.ext_regulator          = ab8500_ext_regulators, +	.num_ext_regulator      = ARRAY_SIZE(ab8500_ext_regulators), +}; + +struct ab8500_regulator_platform_data ab8505_regulator_plat_data = { +	.reg_init               = ab8505_reg_init, +	.num_reg_init           = ARRAY_SIZE(ab8505_reg_init), +	.regulator              = ab8505_regulators, +	.num_regulator          = ARRAY_SIZE(ab8505_regulators),  }; +static void ab8500_modify_reg_init(int id, u8 mask, u8 value) +{ +	int i; + +	if (cpu_is_u8520()) { +		for (i = ARRAY_SIZE(ab8505_reg_init) - 1; i >= 0; i--) { +			if (ab8505_reg_init[i].id == id) { +				u8 initval = ab8505_reg_init[i].value; +				initval = (initval & ~mask) | (value & mask); +				ab8505_reg_init[i].value = initval; + +				BUG_ON(mask & ~ab8505_reg_init[i].mask); +				return; +			} +		} +	} else { +		for (i = ARRAY_SIZE(ab8500_reg_init) - 1; i >= 0; i--) { +			if (ab8500_reg_init[i].id == id) { +				u8 initval = ab8500_reg_init[i].value; +				initval = (initval & ~mask) | (value & mask); +				ab8500_reg_init[i].value = initval; + +				BUG_ON(mask & ~ab8500_reg_init[i].mask); +				return; +			} +		} +	} + +	BUG_ON(1); +} + +void mop500_regulator_init(void) +{ +	struct regulator_init_data *regulator; + +	/* +	 * Temporarily turn on Vaux2 on 8520 machine +	 */ +	if (cpu_is_u8520()) { +		/* Vaux2 initialized to be on */ +		ab8500_modify_reg_init(AB8505_VAUX12REGU, 0x0f, 0x05); +	} + +	/* +	 * Handle AB8500_EXT_SUPPLY2 on HREFP_V20_V50 boards (do it for +	 * all HREFP_V20 boards) +	 */ +	if (cpu_is_u8500v20()) { +		/* VextSupply2RequestCtrl =  HP/OFF depending on VxRequest */ +		ab8500_modify_reg_init(AB8500_REGUREQUESTCTRL3, 0x01, 0x01); + +		/* VextSupply2SysClkReq1HPValid = SysClkReq1 controlled */ +		ab8500_modify_reg_init(AB8500_REGUSYSCLKREQ1HPVALID2, +			0x20, 0x20); + +		/* VextSupply2 = force HP at initialization */ +		ab8500_modify_reg_init(AB8500_EXTSUPPLYREGU, 0x0c, 0x04); + +		/* enable VextSupply2 during platform active */ +		regulator = &ab8500_ext_regulators[AB8500_EXT_SUPPLY2]; +		regulator->constraints.always_on = 1; + +		/* disable VextSupply2 in suspend */ +		regulator = &ab8500_ext_regulators[AB8500_EXT_SUPPLY2]; +		regulator->constraints.state_mem.disabled = 1; +		regulator->constraints.state_standby.disabled = 1; + +		/* enable VextSupply2 HW control (used in suspend) */ +		regulator->driver_data = (void *)&ab8500_ext_supply2; +	} +} diff --git a/arch/arm/mach-ux500/board-mop500-regulators.h b/arch/arm/mach-ux500/board-mop500-regulators.h new file mode 100644 index 00000000000..9bece38fe93 --- /dev/null +++ b/arch/arm/mach-ux500/board-mop500-regulators.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * License Terms: GNU General Public License v2 + * + * Author: Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson + * + * MOP500 board specific initialization for regulators + */ + +#ifndef __BOARD_MOP500_REGULATORS_H +#define __BOARD_MOP500_REGULATORS_H + +#include <linux/regulator/machine.h> +#include <linux/regulator/ab8500.h> + +extern struct ab8500_regulator_platform_data ab8500_regulator_plat_data; +extern struct ab8500_regulator_platform_data ab8505_regulator_plat_data; +extern struct regulator_init_data tps61052_regulator; +extern struct regulator_init_data gpio_en_3v3_regulator; + +void mop500_regulator_init(void); + +#endif diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c deleted file mode 100644 index bac995665b5..00000000000 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Hanumath Prasad <hanumath.prasad@stericsson.com> - * License terms: GNU General Public License (GPL) version 2 - */ - -#include <linux/kernel.h> -#include <linux/gpio.h> -#include <linux/amba/bus.h> -#include <linux/amba/mmci.h> -#include <linux/mmc/host.h> -#include <linux/platform_device.h> - -#include <plat/pincfg.h> -#include <mach/devices.h> -#include <mach/hardware.h> - -#include "pins-db8500.h" -#include "board-mop500.h" - -static pin_cfg_t mop500_sdi_pins[] = { -	/* SDI4 (on-board eMMC) */ -	GPIO197_MC4_DAT3, -	GPIO198_MC4_DAT2, -	GPIO199_MC4_DAT1, -	GPIO200_MC4_DAT0, -	GPIO201_MC4_CMD, -	GPIO202_MC4_FBCLK, -	GPIO203_MC4_CLK, -	GPIO204_MC4_DAT7, -	GPIO205_MC4_DAT6, -	GPIO206_MC4_DAT5, -	GPIO207_MC4_DAT4, -}; - -static pin_cfg_t mop500_sdi2_pins[] = { -	/* SDI2 (POP eMMC) */ -	GPIO128_MC2_CLK, -	GPIO129_MC2_CMD, -	GPIO130_MC2_FBCLK, -	GPIO131_MC2_DAT0, -	GPIO132_MC2_DAT1, -	GPIO133_MC2_DAT2, -	GPIO134_MC2_DAT3, -	GPIO135_MC2_DAT4, -	GPIO136_MC2_DAT5, -	GPIO137_MC2_DAT6, -	GPIO138_MC2_DAT7, -}; - -/* - * SDI 2 (POP eMMC, not on DB8500ed) - */ - -static struct mmci_platform_data mop500_sdi2_data = { -	.ocr_mask	= MMC_VDD_165_195, -	.f_max		= 100000000, -	.capabilities	= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, -	.gpio_cd	= -1, -	.gpio_wp	= -1, -}; - -/* - * SDI 4 (on-board eMMC) - */ - -static struct mmci_platform_data mop500_sdi4_data = { -	.ocr_mask	= MMC_VDD_29_30, -	.f_max		= 100000000, -	.capabilities	= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA | -			  MMC_CAP_MMC_HIGHSPEED, -	.gpio_cd	= -1, -	.gpio_wp	= -1, -}; - -void mop500_sdi_init(void) -{ -	nmk_config_pins(mop500_sdi_pins, ARRAY_SIZE(mop500_sdi_pins)); - -	u8500_sdi2_device.dev.platform_data = &mop500_sdi2_data; -	u8500_sdi4_device.dev.platform_data = &mop500_sdi4_data; - -	if (!cpu_is_u8500ed()) { -		nmk_config_pins(mop500_sdi2_pins, ARRAY_SIZE(mop500_sdi2_pins)); -		amba_device_register(&u8500_sdi2_device, &iomem_resource); -	} - -	/* On-board eMMC */ -	amba_device_register(&u8500_sdi4_device, &iomem_resource); -} diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c deleted file mode 100644 index cac83a69488..00000000000 --- a/arch/arm/mach-ux500/board-mop500.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (C) 2008-2009 ST-Ericsson - * - * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.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/kernel.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/platform_device.h> -#include <linux/io.h> -#include <linux/gpio.h> -#include <linux/amba/bus.h> -#include <linux/amba/pl022.h> -#include <linux/spi/spi.h> -#include <linux/mfd/ab8500.h> -#include <linux/input/matrix_keypad.h> - -#include <asm/mach-types.h> -#include <asm/mach/arch.h> - -#include <plat/pincfg.h> -#include <plat/i2c.h> -#include <plat/ske.h> - -#include <mach/hardware.h> -#include <mach/setup.h> -#include <mach/devices.h> -#include <mach/irqs.h> - -#include "pins-db8500.h" -#include "board-mop500.h" - -static pin_cfg_t mop500_pins[] = { -	/* SSP0 */ -	GPIO143_SSP0_CLK, -	GPIO144_SSP0_FRM, -	GPIO145_SSP0_RXD, -	GPIO146_SSP0_TXD, - -	/* I2C */ -	GPIO147_I2C0_SCL, -	GPIO148_I2C0_SDA, -	GPIO16_I2C1_SCL, -	GPIO17_I2C1_SDA, -	GPIO10_I2C2_SDA, -	GPIO11_I2C2_SCL, -	GPIO229_I2C3_SDA, -	GPIO230_I2C3_SCL, - -	/* SKE keypad */ -	GPIO153_KP_I7, -	GPIO154_KP_I6, -	GPIO155_KP_I5, -	GPIO156_KP_I4, -	GPIO157_KP_O7, -	GPIO158_KP_O6, -	GPIO159_KP_O5, -	GPIO160_KP_O4, -	GPIO161_KP_I3, -	GPIO162_KP_I2, -	GPIO163_KP_I1, -	GPIO164_KP_I0, -	GPIO165_KP_O3, -	GPIO166_KP_O2, -	GPIO167_KP_O1, -	GPIO168_KP_O0, -}; - -static void ab4500_spi_cs_control(u32 command) -{ -	/* set the FRM signal, which is CS  - TODO */ -} - -struct pl022_config_chip ab4500_chip_info = { -	.com_mode = INTERRUPT_TRANSFER, -	.iface = SSP_INTERFACE_MOTOROLA_SPI, -	/* we can act as master only */ -	.hierarchy = SSP_MASTER, -	.slave_tx_disable = 0, -	.rx_lev_trig = SSP_RX_1_OR_MORE_ELEM, -	.tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC, -	.cs_control = ab4500_spi_cs_control, -}; - -static struct ab8500_platform_data ab8500_platdata = { -	.irq_base	= MOP500_AB8500_IRQ_BASE, -}; - -static struct resource ab8500_resources[] = { -	[0] = { -		.start = IRQ_AB8500, -		.end = IRQ_AB8500, -		.flags = IORESOURCE_IRQ -	} -}; - -struct platform_device ab8500_device = { -	.name = "ab8500-i2c", -	.id = 0, -	.dev = { -		.platform_data = &ab8500_platdata, -	}, -	.num_resources = 1, -	.resource = ab8500_resources, -}; - -static struct spi_board_info ab8500_spi_devices[] = { -	{ -		.modalias = "ab8500-spi", -		.controller_data = &ab4500_chip_info, -		.platform_data = &ab8500_platdata, -		.max_speed_hz = 12000000, -		.bus_num = 0, -		.chip_select = 0, -		.mode = SPI_MODE_3, -		.irq = IRQ_DB8500_AB8500, -	}, -}; - -static struct pl022_ssp_controller ssp0_platform_data = { -	.bus_id = 0, -	/* pl022 not yet supports dma */ -	.enable_dma = 0, -	/* on this platform, gpio 31,142,144,214 & -	 * 224 are connected as chip selects -	 */ -	.num_chipselect = 5, -}; - -#define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, _sm) \ -static struct nmk_i2c_controller u8500_i2c##id##_data = { \ -	/*				\ -	 * slave data setup time, which is	\ -	 * 250 ns,100ns,10ns which is 14,6,2	\ -	 * respectively for a 48 Mhz	\ -	 * i2c clock			\ -	 */				\ -	.slsu		= _slsu,	\ -	/* Tx FIFO threshold */		\ -	.tft		= _tft,		\ -	/* Rx FIFO threshold */		\ -	.rft		= _rft,		\ -	/* std. mode operation */	\ -	.clk_freq	= clk,		\ -	.sm		= _sm,		\ -} - -/* - * The board uses 4 i2c controllers, initialize all of - * them with slave data setup time of 250 ns, - * Tx & Rx FIFO threshold values as 1 and standard - * mode of operation - */ -U8500_I2C_CONTROLLER(0, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD); -U8500_I2C_CONTROLLER(1, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD); -U8500_I2C_CONTROLLER(2,	0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD); -U8500_I2C_CONTROLLER(3,	0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD); - -static struct amba_device *amba_devs[] __initdata = { -	&ux500_uart0_device, -	&ux500_uart1_device, -	&ux500_uart2_device, -	&u8500_ssp0_device, -}; - -static const unsigned int ux500_keymap[] = { -	KEY(2, 5, KEY_END), -	KEY(4, 1, KEY_POWER), -	KEY(3, 5, KEY_VOLUMEDOWN), -	KEY(1, 3, KEY_3), -	KEY(5, 2, KEY_RIGHT), -	KEY(5, 0, KEY_9), - -	KEY(0, 5, KEY_MENU), -	KEY(7, 6, KEY_ENTER), -	KEY(4, 5, KEY_0), -	KEY(6, 7, KEY_2), -	KEY(3, 4, KEY_UP), -	KEY(3, 3, KEY_DOWN), - -	KEY(6, 4, KEY_SEND), -	KEY(6, 2, KEY_BACK), -	KEY(4, 2, KEY_VOLUMEUP), -	KEY(5, 5, KEY_1), -	KEY(4, 3, KEY_LEFT), -	KEY(3, 2, KEY_7), -}; - -static const struct matrix_keymap_data ux500_keymap_data = { -	.keymap         = ux500_keymap, -	.keymap_size    = ARRAY_SIZE(ux500_keymap), -}; - -/* - * Nomadik SKE keypad - */ -#define ROW_PIN_I0      164 -#define ROW_PIN_I1      163 -#define ROW_PIN_I2      162 -#define ROW_PIN_I3      161 -#define ROW_PIN_I4      156 -#define ROW_PIN_I5      155 -#define ROW_PIN_I6      154 -#define ROW_PIN_I7      153 -#define COL_PIN_O0      168 -#define COL_PIN_O1      167 -#define COL_PIN_O2      166 -#define COL_PIN_O3      165 -#define COL_PIN_O4      160 -#define COL_PIN_O5      159 -#define COL_PIN_O6      158 -#define COL_PIN_O7      157 - -#define SKE_KPD_MAX_ROWS        8 -#define SKE_KPD_MAX_COLS        8 - -static int ske_kp_rows[] = { -	ROW_PIN_I0, ROW_PIN_I1, ROW_PIN_I2, ROW_PIN_I3, -	ROW_PIN_I4, ROW_PIN_I5, ROW_PIN_I6, ROW_PIN_I7, -}; - -/* - * ske_set_gpio_row: request and set gpio rows - */ -static int ske_set_gpio_row(int gpio) -{ -	int ret; - -	ret = gpio_request(gpio, "ske-kp"); -	if (ret < 0) { -		pr_err("ske_set_gpio_row: gpio request failed\n"); -		return ret; -	} - -	ret = gpio_direction_output(gpio, 1); -	if (ret < 0) { -		pr_err("ske_set_gpio_row: gpio direction failed\n"); -		gpio_free(gpio); -	} - -	return ret; -} - -/* - * ske_kp_init - enable the gpio configuration - */ -static int ske_kp_init(void) -{ -	int ret, i; - -	for (i = 0; i < SKE_KPD_MAX_ROWS; i++) { -		ret = ske_set_gpio_row(ske_kp_rows[i]); -		if (ret < 0) { -			pr_err("ske_kp_init: failed init\n"); -			return ret; -		} -	} - -	return 0; -} - -static struct ske_keypad_platform_data ske_keypad_board = { -	.init           = ske_kp_init, -	.keymap_data    = &ux500_keymap_data, -	.no_autorepeat  = true, -	.krow           = SKE_KPD_MAX_ROWS,     /* 8x8 matrix */ -	.kcol           = SKE_KPD_MAX_COLS, -	.debounce_ms    = 40,                   /* in millsecs */ -}; - - - -/* add any platform devices here - TODO */ -static struct platform_device *platform_devs[] __initdata = { -	&u8500_i2c0_device, -	&ux500_i2c1_device, -	&ux500_i2c2_device, -	&ux500_i2c3_device, -	&ux500_ske_keypad_device, -}; - -static void __init u8500_init_machine(void) -{ -	int i; - -	u8500_init_devices(); - -	nmk_config_pins(mop500_pins, ARRAY_SIZE(mop500_pins)); - -	u8500_i2c0_device.dev.platform_data = &u8500_i2c0_data; -	ux500_i2c1_device.dev.platform_data = &u8500_i2c1_data; -	ux500_i2c2_device.dev.platform_data = &u8500_i2c2_data; -	ux500_i2c3_device.dev.platform_data = &u8500_i2c3_data; -	ux500_ske_keypad_device.dev.platform_data = &ske_keypad_board; - -	u8500_ssp0_device.dev.platform_data = &ssp0_platform_data; - -	/* Register the active AMBA devices on this board */ -	for (i = 0; i < ARRAY_SIZE(amba_devs); i++) -		amba_device_register(amba_devs[i], &iomem_resource); - -	platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); - -	mop500_sdi_init(); - -	/* If HW is early drop (ED) or V1.0 then use SPI to access AB8500 */ -	if (cpu_is_u8500ed() || cpu_is_u8500v10()) -		spi_register_board_info(ab8500_spi_devices, -			ARRAY_SIZE(ab8500_spi_devices)); -	else /* If HW is v.1.1 or later use I2C to access AB8500 */ -		platform_device_register(&ab8500_device); -} - -MACHINE_START(U8500, "ST-Ericsson MOP500 platform") -	/* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */ -	.boot_params	= 0x100, -	.map_io		= u8500_map_io, -	.init_irq	= ux500_init_irq, -	/* we re-use nomadik timer here */ -	.timer		= &ux500_timer, -	.init_machine	= u8500_init_machine, -MACHINE_END diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h index 2d240322fa6..7c7b0adca58 100644 --- a/arch/arm/mach-ux500/board-mop500.h +++ b/arch/arm/mach-ux500/board-mop500.h @@ -7,6 +7,11 @@  #ifndef __BOARD_MOP500_H  #define __BOARD_MOP500_H -extern void mop500_sdi_init(void); +#include <linux/platform_data/asoc-ux500-msp.h> + +extern struct msp_i2s_platform_data msp0_platform_data; +extern struct msp_i2s_platform_data msp1_platform_data; +extern struct msp_i2s_platform_data msp2_platform_data; +extern struct msp_i2s_platform_data msp3_platform_data;  #endif diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c deleted file mode 100644 index 1ca094a45e7..00000000000 --- a/arch/arm/mach-ux500/board-u5500.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * License terms: GNU General Public License (GPL) version 2 - */ - -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/amba/bus.h> -#include <linux/gpio.h> - -#include <asm/mach/arch.h> -#include <asm/mach-types.h> - -#include <mach/hardware.h> -#include <mach/devices.h> -#include <mach/setup.h> - -static struct amba_device *amba_board_devs[] __initdata = { -	&ux500_uart0_device, -	&ux500_uart1_device, -	&ux500_uart2_device, -}; - -static void __init u5500_init_machine(void) -{ -	u5500_init_devices(); - -	amba_add_devices(amba_board_devs, ARRAY_SIZE(amba_board_devs)); -} - -MACHINE_START(U8500, "ST-Ericsson U5500 Platform") -	.boot_params	= 0x00000100, -	.map_io		= u5500_map_io, -	.init_irq	= ux500_init_irq, -	.timer		= &ux500_timer, -	.init_machine	= u5500_init_machine, -MACHINE_END diff --git a/arch/arm/mach-ux500/cache-l2x0.c b/arch/arm/mach-ux500/cache-l2x0.c new file mode 100644 index 00000000000..842ebedbdd1 --- /dev/null +++ b/arch/arm/mach-ux500/cache-l2x0.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * + * License terms: GNU General Public License (GPL) version 2 + */ + +#include <linux/io.h> +#include <linux/of.h> + +#include <asm/cacheflush.h> +#include <asm/hardware/cache-l2x0.h> + +#include "db8500-regs.h" +#include "id.h" + +static void __iomem *l2x0_base; + +static int __init ux500_l2x0_unlock(void) +{ +	int i; + +	/* +	 * Unlock Data and Instruction Lock if locked. Ux500 U-Boot versions +	 * apparently locks both caches before jumping to the kernel. The +	 * l2x0 core will not touch the unlock registers if the l2x0 is +	 * already enabled, so we do it right here instead. The PL310 has +	 * 8 sets of registers, one per possible CPU. +	 */ +	for (i = 0; i < 8; i++) { +		writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE + +			       i * L2X0_LOCKDOWN_STRIDE); +		writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_I_BASE + +			       i * L2X0_LOCKDOWN_STRIDE); +	} +	return 0; +} + +static void ux500_l2c310_write_sec(unsigned long val, unsigned reg) +{ +	/* +	 * We can't write to secure registers as we are in non-secure +	 * mode, until we have some SMI service available. +	 */ +} + +static int __init ux500_l2x0_init(void) +{ +	if (cpu_is_u8500_family() || cpu_is_ux540_family()) +		l2x0_base = __io_address(U8500_L2CC_BASE); +	else +		/* Non-Ux500 platform */ +		return -ENODEV; + +	/* Unlock before init */ +	ux500_l2x0_unlock(); + +	outer_cache.write_sec = ux500_l2c310_write_sec; + +	if (of_have_populated_dt()) +		l2x0_of_init(0, ~0); +	else +		l2x0_init(l2x0_base, 0, ~0); + +	return 0; +} + +early_initcall(ux500_l2x0_init); diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c deleted file mode 100644 index 1675047daf2..00000000000 --- a/arch/arm/mach-ux500/clock.c +++ /dev/null @@ -1,622 +0,0 @@ -/* - *  Copyright (C) 2009 ST-Ericsson - *  Copyright (C) 2009 STMicroelectronics - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/list.h> -#include <linux/errno.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/io.h> - -#include <asm/clkdev.h> - -#include <plat/mtu.h> -#include <mach/hardware.h> -#include "clock.h" - -#define PRCC_PCKEN		0x00 -#define PRCC_PCKDIS		0x04 -#define PRCC_KCKEN		0x08 -#define PRCC_KCKDIS		0x0C - -#define PRCM_YYCLKEN0_MGT_SET	0x510 -#define PRCM_YYCLKEN1_MGT_SET	0x514 -#define PRCM_YYCLKEN0_MGT_CLR	0x518 -#define PRCM_YYCLKEN1_MGT_CLR	0x51C -#define PRCM_YYCLKEN0_MGT_VAL	0x520 -#define PRCM_YYCLKEN1_MGT_VAL	0x524 - -#define PRCM_SVAMMDSPCLK_MGT	0x008 -#define PRCM_SIAMMDSPCLK_MGT	0x00C -#define PRCM_SGACLK_MGT		0x014 -#define PRCM_UARTCLK_MGT	0x018 -#define PRCM_MSP02CLK_MGT	0x01C -#define PRCM_MSP1CLK_MGT	0x288 -#define PRCM_I2CCLK_MGT		0x020 -#define PRCM_SDMMCCLK_MGT	0x024 -#define PRCM_SLIMCLK_MGT	0x028 -#define PRCM_PER1CLK_MGT	0x02C -#define PRCM_PER2CLK_MGT	0x030 -#define PRCM_PER3CLK_MGT	0x034 -#define PRCM_PER5CLK_MGT	0x038 -#define PRCM_PER6CLK_MGT	0x03C -#define PRCM_PER7CLK_MGT	0x040 -#define PRCM_LCDCLK_MGT		0x044 -#define PRCM_BMLCLK_MGT		0x04C -#define PRCM_HSITXCLK_MGT	0x050 -#define PRCM_HSIRXCLK_MGT	0x054 -#define PRCM_HDMICLK_MGT	0x058 -#define PRCM_APEATCLK_MGT	0x05C -#define PRCM_APETRACECLK_MGT	0x060 -#define PRCM_MCDECLK_MGT	0x064 -#define PRCM_IPI2CCLK_MGT	0x068 -#define PRCM_DSIALTCLK_MGT	0x06C -#define PRCM_DMACLK_MGT		0x074 -#define PRCM_B2R2CLK_MGT	0x078 -#define PRCM_TVCLK_MGT		0x07C -#define PRCM_TCR		0x1C8 -#define PRCM_TCR_STOPPED	(1 << 16) -#define PRCM_TCR_DOZE_MODE	(1 << 17) -#define PRCM_UNIPROCLK_MGT	0x278 -#define PRCM_SSPCLK_MGT		0x280 -#define PRCM_RNGCLK_MGT		0x284 -#define PRCM_UICCCLK_MGT	0x27C - -#define PRCM_MGT_ENABLE		(1 << 8) - -static DEFINE_SPINLOCK(clocks_lock); - -static void __clk_enable(struct clk *clk) -{ -	if (clk->enabled++ == 0) { -		if (clk->parent_cluster) -			__clk_enable(clk->parent_cluster); - -		if (clk->parent_periph) -			__clk_enable(clk->parent_periph); - -		if (clk->ops && clk->ops->enable) -			clk->ops->enable(clk); -	} -} - -int clk_enable(struct clk *clk) -{ -	unsigned long flags; - -	spin_lock_irqsave(&clocks_lock, flags); -	__clk_enable(clk); -	spin_unlock_irqrestore(&clocks_lock, flags); - -	return 0; -} -EXPORT_SYMBOL(clk_enable); - -static void __clk_disable(struct clk *clk) -{ -	if (--clk->enabled == 0) { -		if (clk->ops && clk->ops->disable) -			clk->ops->disable(clk); - -		if (clk->parent_periph) -			__clk_disable(clk->parent_periph); - -		if (clk->parent_cluster) -			__clk_disable(clk->parent_cluster); -	} -} - -void clk_disable(struct clk *clk) -{ -	unsigned long flags; - -	WARN_ON(!clk->enabled); - -	spin_lock_irqsave(&clocks_lock, flags); -	__clk_disable(clk); -	spin_unlock_irqrestore(&clocks_lock, flags); -} -EXPORT_SYMBOL(clk_disable); - -/* - * The MTU has a separate, rather complex muxing setup - * with alternative parents (peripheral cluster or - * ULP or fixed 32768 Hz) depending on settings - */ -static unsigned long clk_mtu_get_rate(struct clk *clk) -{ -	void __iomem *addr = __io_address(UX500_PRCMU_BASE) -		+ PRCM_TCR; -	u32 tcr = readl(addr); -	int mtu = (int) clk->data; -	/* -	 * One of these is selected eventually -	 * TODO: Replace the constant with a reference -	 * to the ULP source once this is modeled. -	 */ -	unsigned long clk32k = 32768; -	unsigned long mturate; -	unsigned long retclk; - -	/* Get the rate from the parent as a default */ -	if (clk->parent_periph) -		mturate = clk_get_rate(clk->parent_periph); -	else if (clk->parent_cluster) -		mturate = clk_get_rate(clk->parent_cluster); -	else -		/* We need to be connected SOMEWHERE */ -		BUG(); - -	/* -	 * Are we in doze mode? -	 * In this mode the parent peripheral or the fixed 32768 Hz -	 * clock is fed into the block. -	 */ -	if (!(tcr & PRCM_TCR_DOZE_MODE)) { -		/* -		 * Here we're using the clock input from the APE ULP -		 * clock domain. But first: are the timers stopped? -		 */ -		if (tcr & PRCM_TCR_STOPPED) { -			clk32k = 0; -			mturate = 0; -		} else { -			/* Else default mode: 0 and 2.4 MHz */ -			clk32k = 0; -			if (cpu_is_u5500()) -				/* DB5500 divides by 8 */ -				mturate /= 8; -			else if (cpu_is_u8500ed()) { -				/* -				 * This clocking setting must not be used -				 * in the ED chip, it is simply not -				 * connected anywhere! -				 */ -				mturate = 0; -				BUG(); -			} else -				/* -				 * In this mode the ulp38m4 clock is divided -				 * by a factor 16, on the DB8500 typically -				 * 38400000 / 16 ~ 2.4 MHz. -				 * TODO: Replace the constant with a reference -				 * to the ULP source once this is modeled. -				 */ -				mturate = 38400000 / 16; -		} -	} - -	/* Return the clock selected for this MTU */ -	if (tcr & (1 << mtu)) -		retclk = clk32k; -	else -		retclk = mturate; - -	pr_info("MTU%d clock rate: %lu Hz\n", mtu, retclk); -	return retclk; -} - -unsigned long clk_get_rate(struct clk *clk) -{ -	unsigned long rate; - -	/* -	 * If there is a custom getrate callback for this clock, -	 * it will take precedence. -	 */ -	if (clk->get_rate) -		return clk->get_rate(clk); - -	if (clk->ops && clk->ops->get_rate) -		return clk->ops->get_rate(clk); - -	rate = clk->rate; -	if (!rate) { -		if (clk->parent_periph) -			rate = clk_get_rate(clk->parent_periph); -		else if (clk->parent_cluster) -			rate = clk_get_rate(clk->parent_cluster); -	} - -	return rate; -} -EXPORT_SYMBOL(clk_get_rate); - -long clk_round_rate(struct clk *clk, unsigned long rate) -{ -	/*TODO*/ -	return rate; -} -EXPORT_SYMBOL(clk_round_rate); - -int clk_set_rate(struct clk *clk, unsigned long rate) -{ -	clk->rate = rate; -	return 0; -} -EXPORT_SYMBOL(clk_set_rate); - -static void clk_prcmu_enable(struct clk *clk) -{ -	void __iomem *cg_set_reg = __io_address(U8500_PRCMU_BASE) -				   + PRCM_YYCLKEN0_MGT_SET + clk->prcmu_cg_off; - -	writel(1 << clk->prcmu_cg_bit, cg_set_reg); -} - -static void clk_prcmu_disable(struct clk *clk) -{ -	void __iomem *cg_clr_reg = __io_address(U8500_PRCMU_BASE) -				   + PRCM_YYCLKEN0_MGT_CLR + clk->prcmu_cg_off; - -	writel(1 << clk->prcmu_cg_bit, cg_clr_reg); -} - -/* ED doesn't have the combined set/clr registers */ -static void clk_prcmu_ed_enable(struct clk *clk) -{ -	void __iomem *addr = __io_address(U8500_PRCMU_BASE) -			     + clk->prcmu_cg_mgt; - -	writel(readl(addr) | PRCM_MGT_ENABLE, addr); -} - -static void clk_prcmu_ed_disable(struct clk *clk) -{ -	void __iomem *addr = __io_address(U8500_PRCMU_BASE) -			     + clk->prcmu_cg_mgt; - -	writel(readl(addr) & ~PRCM_MGT_ENABLE, addr); -} - -static struct clkops clk_prcmu_ops = { -	.enable = clk_prcmu_enable, -	.disable = clk_prcmu_disable, -}; - -static unsigned int clkrst_base[] = { -	[1] = U8500_CLKRST1_BASE, -	[2] = U8500_CLKRST2_BASE, -	[3] = U8500_CLKRST3_BASE, -	[5] = U8500_CLKRST5_BASE, -	[6] = U8500_CLKRST6_BASE, -	[7] = U8500_CLKRST7_BASE_ED, -}; - -static void clk_prcc_enable(struct clk *clk) -{ -	void __iomem *addr = __io_address(clkrst_base[clk->cluster]); - -	if (clk->prcc_kernel != -1) -		writel(1 << clk->prcc_kernel, addr + PRCC_KCKEN); - -	if (clk->prcc_bus != -1) -		writel(1 << clk->prcc_bus, addr + PRCC_PCKEN); -} - -static void clk_prcc_disable(struct clk *clk) -{ -	void __iomem *addr = __io_address(clkrst_base[clk->cluster]); - -	if (clk->prcc_bus != -1) -		writel(1 << clk->prcc_bus, addr + PRCC_PCKDIS); - -	if (clk->prcc_kernel != -1) -		writel(1 << clk->prcc_kernel, addr + PRCC_KCKDIS); -} - -static struct clkops clk_prcc_ops = { -	.enable = clk_prcc_enable, -	.disable = clk_prcc_disable, -}; - -static struct clk clk_32khz = { -	.rate = 32000, -}; - -/* - * PRCMU level clock gating - */ - -/* Bank 0 */ -static DEFINE_PRCMU_CLK(svaclk,		0x0, 2, SVAMMDSPCLK); -static DEFINE_PRCMU_CLK(siaclk,		0x0, 3, SIAMMDSPCLK); -static DEFINE_PRCMU_CLK(sgaclk,		0x0, 4, SGACLK); -static DEFINE_PRCMU_CLK_RATE(uartclk,	0x0, 5, UARTCLK, 38400000); -static DEFINE_PRCMU_CLK(msp02clk,	0x0, 6, MSP02CLK); -static DEFINE_PRCMU_CLK(msp1clk,	0x0, 7, MSP1CLK); /* v1 */ -static DEFINE_PRCMU_CLK_RATE(i2cclk,	0x0, 8, I2CCLK, 48000000); -static DEFINE_PRCMU_CLK_RATE(sdmmcclk,	0x0, 9, SDMMCCLK, 50000000); -static DEFINE_PRCMU_CLK(slimclk,	0x0, 10, SLIMCLK); -static DEFINE_PRCMU_CLK(per1clk,	0x0, 11, PER1CLK); -static DEFINE_PRCMU_CLK(per2clk,	0x0, 12, PER2CLK); -static DEFINE_PRCMU_CLK(per3clk,	0x0, 13, PER3CLK); -static DEFINE_PRCMU_CLK(per5clk,	0x0, 14, PER5CLK); -static DEFINE_PRCMU_CLK_RATE(per6clk,	0x0, 15, PER6CLK, 133330000); -static DEFINE_PRCMU_CLK_RATE(per7clk,	0x0, 16, PER7CLK, 100000000); -static DEFINE_PRCMU_CLK(lcdclk,		0x0, 17, LCDCLK); -static DEFINE_PRCMU_CLK(bmlclk,		0x0, 18, BMLCLK); -static DEFINE_PRCMU_CLK(hsitxclk,	0x0, 19, HSITXCLK); -static DEFINE_PRCMU_CLK(hsirxclk,	0x0, 20, HSIRXCLK); -static DEFINE_PRCMU_CLK(hdmiclk,	0x0, 21, HDMICLK); -static DEFINE_PRCMU_CLK(apeatclk,	0x0, 22, APEATCLK); -static DEFINE_PRCMU_CLK(apetraceclk,	0x0, 23, APETRACECLK); -static DEFINE_PRCMU_CLK(mcdeclk,	0x0, 24, MCDECLK); -static DEFINE_PRCMU_CLK(ipi2clk,	0x0, 25, IPI2CCLK); -static DEFINE_PRCMU_CLK(dsialtclk,	0x0, 26, DSIALTCLK); /* v1 */ -static DEFINE_PRCMU_CLK(dmaclk,		0x0, 27, DMACLK); -static DEFINE_PRCMU_CLK(b2r2clk,	0x0, 28, B2R2CLK); -static DEFINE_PRCMU_CLK(tvclk,		0x0, 29, TVCLK); -static DEFINE_PRCMU_CLK(uniproclk,	0x0, 30, UNIPROCLK); /* v1 */ -static DEFINE_PRCMU_CLK_RATE(sspclk,	0x0, 31, SSPCLK, 48000000); /* v1 */ - -/* Bank 1 */ -static DEFINE_PRCMU_CLK(rngclk,		0x4, 0, RNGCLK); /* v1 */ -static DEFINE_PRCMU_CLK(uiccclk,	0x4, 1, UICCCLK); /* v1 */ - -/* - * PRCC level clock gating - * Format: per#, clk, PCKEN bit, KCKEN bit, parent - */ - -/* Peripheral Cluster #1 */ -static DEFINE_PRCC_CLK(1, i2c4, 	10, 9, &clk_i2cclk); -static DEFINE_PRCC_CLK(1, gpio0,	9, -1, NULL); -static DEFINE_PRCC_CLK(1, slimbus0, 	8,  8, &clk_slimclk); -static DEFINE_PRCC_CLK(1, spi3_ed, 	7,  7, NULL); -static DEFINE_PRCC_CLK(1, spi3_v1, 	7, -1, NULL); -static DEFINE_PRCC_CLK(1, i2c2, 	6,  6, &clk_i2cclk); -static DEFINE_PRCC_CLK(1, sdi0,		5,  5, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(1, msp1_ed, 	4,  4, &clk_msp02clk); -static DEFINE_PRCC_CLK(1, msp1_v1, 	4,  4, &clk_msp1clk); -static DEFINE_PRCC_CLK(1, msp0, 	3,  3, &clk_msp02clk); -static DEFINE_PRCC_CLK(1, i2c1, 	2,  2, &clk_i2cclk); -static DEFINE_PRCC_CLK(1, uart1, 	1,  1, &clk_uartclk); -static DEFINE_PRCC_CLK(1, uart0, 	0,  0, &clk_uartclk); - -/* Peripheral Cluster #2 */ - -static DEFINE_PRCC_CLK(2, gpio1_ed,	12, -1, NULL); -static DEFINE_PRCC_CLK(2, ssitx_ed, 	11, -1, NULL); -static DEFINE_PRCC_CLK(2, ssirx_ed, 	10, -1, NULL); -static DEFINE_PRCC_CLK(2, spi0_ed, 	 9, -1, NULL); -static DEFINE_PRCC_CLK(2, sdi3_ed, 	 8,  6, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(2, sdi1_ed, 	 7,  5, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(2, msp2_ed, 	 6,  4, &clk_msp02clk); -static DEFINE_PRCC_CLK(2, sdi4_ed, 	 4,  2, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(2, pwl_ed,	 3,  1, NULL); -static DEFINE_PRCC_CLK(2, spi1_ed, 	 2, -1, NULL); -static DEFINE_PRCC_CLK(2, spi2_ed, 	 1, -1, NULL); -static DEFINE_PRCC_CLK(2, i2c3_ed, 	 0,  0, &clk_i2cclk); - -static DEFINE_PRCC_CLK(2, gpio1_v1,	11, -1, NULL); -static DEFINE_PRCC_CLK(2, ssitx_v1, 	10,  7, NULL); -static DEFINE_PRCC_CLK(2, ssirx_v1, 	 9,  6, NULL); -static DEFINE_PRCC_CLK(2, spi0_v1, 	 8, -1, NULL); -static DEFINE_PRCC_CLK(2, sdi3_v1, 	 7,  5, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(2, sdi1_v1, 	 6,  4, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(2, msp2_v1, 	 5,  3, &clk_msp02clk); -static DEFINE_PRCC_CLK(2, sdi4_v1, 	 4,  2, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(2, pwl_v1,	 3,  1, NULL); -static DEFINE_PRCC_CLK(2, spi1_v1, 	 2, -1, NULL); -static DEFINE_PRCC_CLK(2, spi2_v1, 	 1, -1, NULL); -static DEFINE_PRCC_CLK(2, i2c3_v1, 	 0,  0, &clk_i2cclk); - -/* Peripheral Cluster #3 */ -static DEFINE_PRCC_CLK(3, gpio2, 	8, -1, NULL); -static DEFINE_PRCC_CLK(3, sdi5, 	7,  7, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(3, uart2, 	6,  6, &clk_uartclk); -static DEFINE_PRCC_CLK(3, ske, 		5,  5, &clk_32khz); -static DEFINE_PRCC_CLK(3, sdi2, 	4,  4, &clk_sdmmcclk); -static DEFINE_PRCC_CLK(3, i2c0, 	3,  3, &clk_i2cclk); -static DEFINE_PRCC_CLK(3, ssp1_ed, 	2,  2, &clk_i2cclk); -static DEFINE_PRCC_CLK(3, ssp0_ed, 	1,  1, &clk_i2cclk); -static DEFINE_PRCC_CLK(3, ssp1_v1, 	2,  2, &clk_sspclk); -static DEFINE_PRCC_CLK(3, ssp0_v1, 	1,  1, &clk_sspclk); -static DEFINE_PRCC_CLK(3, fsmc, 	0, -1, NULL); - -/* Peripheral Cluster #4 is in the always on domain */ - -/* Peripheral Cluster #5 */ -static DEFINE_PRCC_CLK(5, gpio3, 	1, -1, NULL); -static DEFINE_PRCC_CLK(5, usb_ed, 	0,  0, &clk_i2cclk); -static DEFINE_PRCC_CLK(5, usb_v1, 	0,  0, NULL); - -/* Peripheral Cluster #6 */ - -/* MTU ID in data */ -static DEFINE_PRCC_CLK_CUSTOM(6, mtu1_v1, 8, -1, NULL, clk_mtu_get_rate, 1); -static DEFINE_PRCC_CLK_CUSTOM(6, mtu0_v1, 7, -1, NULL, clk_mtu_get_rate, 0); -static DEFINE_PRCC_CLK(6, cfgreg_v1, 	6,  6, NULL); -static DEFINE_PRCC_CLK(6, dmc_ed, 	6,  6, NULL); -static DEFINE_PRCC_CLK(6, hash1, 	5, -1, NULL); -static DEFINE_PRCC_CLK(6, unipro_v1, 	4,  1, &clk_uniproclk); -static DEFINE_PRCC_CLK(6, cryp1_ed, 	4, -1, NULL); -static DEFINE_PRCC_CLK(6, pka, 		3, -1, NULL); -static DEFINE_PRCC_CLK(6, hash0, 	2, -1, NULL); -static DEFINE_PRCC_CLK(6, cryp0, 	1, -1, NULL); -static DEFINE_PRCC_CLK(6, rng_ed, 	0,  0, &clk_i2cclk); -static DEFINE_PRCC_CLK(6, rng_v1, 	0,  0, &clk_rngclk); - -/* Peripheral Cluster #7 */ - -static DEFINE_PRCC_CLK(7, tzpc0_ed, 	4, -1, NULL); -/* MTU ID in data */ -static DEFINE_PRCC_CLK_CUSTOM(7, mtu1_ed, 3, -1, NULL, clk_mtu_get_rate, 1); -static DEFINE_PRCC_CLK_CUSTOM(7, mtu0_ed, 2, -1, NULL, clk_mtu_get_rate, 0); -static DEFINE_PRCC_CLK(7, wdg_ed, 	1, -1, NULL); -static DEFINE_PRCC_CLK(7, cfgreg_ed, 	0, -1, NULL); - -static struct clk clk_dummy_apb_pclk; - -static struct clk_lookup u8500_common_clks[] = { -	CLK(dummy_apb_pclk, NULL,	"apb_pclk"), - -	/* Peripheral Cluster #1 */ -	CLK(gpio0,	"gpio.0",	NULL), -	CLK(gpio0,	"gpio.1",	NULL), -	CLK(slimbus0,	"slimbus0",	NULL), -	CLK(i2c2,	"nmk-i2c.2",	NULL), -	CLK(sdi0,	"sdi0",		NULL), -	CLK(msp0,	"msp0",		NULL), -	CLK(i2c1,	"nmk-i2c.1",	NULL), -	CLK(uart1,	"uart1",	NULL), -	CLK(uart0,	"uart0",	NULL), - -	/* Peripheral Cluster #3 */ -	CLK(gpio2,	"gpio.2",	NULL), -	CLK(gpio2,	"gpio.3",	NULL), -	CLK(gpio2,	"gpio.4",	NULL), -	CLK(gpio2,	"gpio.5",	NULL), -	CLK(sdi5,	"sdi5",		NULL), -	CLK(uart2,	"uart2",	NULL), -	CLK(ske,	"ske",		NULL), -	CLK(ske,	"nmk-ske-keypad",	NULL), -	CLK(sdi2,	"sdi2",		NULL), -	CLK(i2c0,	"nmk-i2c.0",	NULL), -	CLK(fsmc,	"fsmc",		NULL), - -	/* Peripheral Cluster #5 */ -	CLK(gpio3,	"gpio.8",	NULL), - -	/* Peripheral Cluster #6 */ -	CLK(hash1,	"hash1",	NULL), -	CLK(pka,	"pka",		NULL), -	CLK(hash0,	"hash0",	NULL), -	CLK(cryp0,	"cryp0",	NULL), - -	/* PRCMU level clock gating */ - -	/* Bank 0 */ -	CLK(svaclk,	"sva",		NULL), -	CLK(siaclk,	"sia",		NULL), -	CLK(sgaclk,	"sga",		NULL), -	CLK(slimclk,	"slim",		NULL), -	CLK(lcdclk,	"lcd",		NULL), -	CLK(bmlclk,	"bml",		NULL), -	CLK(hsitxclk,	"stm-hsi.0",	NULL), -	CLK(hsirxclk,	"stm-hsi.1",	NULL), -	CLK(hdmiclk,	"hdmi",		NULL), -	CLK(apeatclk,	"apeat",	NULL), -	CLK(apetraceclk,	"apetrace",	NULL), -	CLK(mcdeclk,	"mcde",		NULL), -	CLK(ipi2clk,	"ipi2",		NULL), -	CLK(dmaclk,	"dma40.0",	NULL), -	CLK(b2r2clk,	"b2r2",		NULL), -	CLK(tvclk,	"tv",		NULL), -}; - -static struct clk_lookup u8500_ed_clks[] = { -	/* Peripheral Cluster #1 */ -	CLK(spi3_ed,	"spi3",		NULL), -	CLK(msp1_ed,	"msp1",		NULL), - -	/* Peripheral Cluster #2 */ -	CLK(gpio1_ed,	"gpio.6",	NULL), -	CLK(gpio1_ed,	"gpio.7",	NULL), -	CLK(ssitx_ed,	"ssitx",	NULL), -	CLK(ssirx_ed,	"ssirx",	NULL), -	CLK(spi0_ed,	"spi0",		NULL), -	CLK(sdi3_ed,	"sdi3",		NULL), -	CLK(sdi1_ed,	"sdi1",		NULL), -	CLK(msp2_ed,	"msp2",		NULL), -	CLK(sdi4_ed,	"sdi4",		NULL), -	CLK(pwl_ed,	"pwl",		NULL), -	CLK(spi1_ed,	"spi1",		NULL), -	CLK(spi2_ed,	"spi2",		NULL), -	CLK(i2c3_ed,	"nmk-i2c.3",	NULL), - -	/* Peripheral Cluster #3 */ -	CLK(ssp1_ed,	"ssp1",		NULL), -	CLK(ssp0_ed,	"ssp0",		NULL), - -	/* Peripheral Cluster #5 */ -	CLK(usb_ed,	"musb_hdrc.0",	"usb"), - -	/* Peripheral Cluster #6 */ -	CLK(dmc_ed,	"dmc",		NULL), -	CLK(cryp1_ed,	"cryp1",	NULL), -	CLK(rng_ed,	"rng",		NULL), - -	/* Peripheral Cluster #7 */ -	CLK(tzpc0_ed,	"tzpc0",	NULL), -	CLK(mtu1_ed,	"mtu1",		NULL), -	CLK(mtu0_ed,	"mtu0",		NULL), -	CLK(wdg_ed,	"wdg",		NULL), -	CLK(cfgreg_ed,	"cfgreg",	NULL), -}; - -static struct clk_lookup u8500_v1_clks[] = { -	/* Peripheral Cluster #1 */ -	CLK(i2c4,	"nmk-i2c.4", 	NULL), -	CLK(spi3_v1,	"spi3",		NULL), -	CLK(msp1_v1,	"msp1",		NULL), - -	/* Peripheral Cluster #2 */ -	CLK(gpio1_v1,	"gpio.6",	NULL), -	CLK(gpio1_v1,	"gpio.7",	NULL), -	CLK(ssitx_v1,	"ssitx",	NULL), -	CLK(ssirx_v1,	"ssirx",	NULL), -	CLK(spi0_v1,	"spi0",		NULL), -	CLK(sdi3_v1,	"sdi3",		NULL), -	CLK(sdi1_v1,	"sdi1",		NULL), -	CLK(msp2_v1,	"msp2",		NULL), -	CLK(sdi4_v1,	"sdi4",		NULL), -	CLK(pwl_v1,	"pwl",		NULL), -	CLK(spi1_v1,	"spi1",		NULL), -	CLK(spi2_v1,	"spi2",		NULL), -	CLK(i2c3_v1,	"nmk-i2c.3",	NULL), - -	/* Peripheral Cluster #3 */ -	CLK(ssp1_v1,	"ssp1",		NULL), -	CLK(ssp0_v1,	"ssp0",		NULL), - -	/* Peripheral Cluster #5 */ -	CLK(usb_v1,	"musb_hdrc.0",	"usb"), - -	/* Peripheral Cluster #6 */ -	CLK(mtu1_v1,	"mtu1",		NULL), -	CLK(mtu0_v1,	"mtu0",		NULL), -	CLK(cfgreg_v1,	"cfgreg",	NULL), -	CLK(hash1,	"hash1",	NULL), -	CLK(unipro_v1,	"unipro",	NULL), -	CLK(rng_v1,	"rng",		NULL), - -	/* PRCMU level clock gating */ - -	/* Bank 0 */ -	CLK(uniproclk,	"uniproclk",	NULL), -	CLK(dsialtclk,	"dsialt",	NULL), - -	/* Bank 1 */ -	CLK(rngclk,	"rng",		NULL), -	CLK(uiccclk,	"uicc",		NULL), -}; - -int __init clk_init(void) -{ -	if (cpu_is_u8500ed()) { -		clk_prcmu_ops.enable = clk_prcmu_ed_enable; -		clk_prcmu_ops.disable = clk_prcmu_ed_disable; -		clk_per6clk.rate = 100000000; -	} else if (cpu_is_u5500()) { -		/* Clock tree for U5500 not implemented yet */ -		clk_prcc_ops.enable = clk_prcc_ops.disable = NULL; -		clk_prcmu_ops.enable = clk_prcmu_ops.disable = NULL; -		clk_per6clk.rate = 26000000; -	} - -	clkdev_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks)); -	if (cpu_is_u8500ed()) -		clkdev_add_table(u8500_ed_clks, ARRAY_SIZE(u8500_ed_clks)); -	else -		clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks)); - -	return 0; -} diff --git a/arch/arm/mach-ux500/clock.h b/arch/arm/mach-ux500/clock.h deleted file mode 100644 index a0580250152..00000000000 --- a/arch/arm/mach-ux500/clock.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - *  Copyright (C) 2010 ST-Ericsson - *  Copyright (C) 2009 STMicroelectronics - * - * 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. - */ - -/** - * struct clkops - ux500 clock operations - * @enable:	function to enable the clock - * @disable:	function to disable the clock - * @get_rate:	function to get the current clock rate - * - * This structure contains function pointers to functions that will be used to - * control the clock.  All of these functions are optional.  If get_rate is - * NULL, the rate in the struct clk will be used. - */ -struct clkops { -	void (*enable) (struct clk *); -	void (*disable) (struct clk *); -	unsigned long (*get_rate) (struct clk *); -}; - -/** - * struct clk - ux500 clock structure - * @ops:		pointer to clkops struct used to control this clock - * @name:		name, for debugging - * @enabled:		refcount. positive if enabled, zero if disabled - * @get_rate:		custom callback for getting the clock rate - * @data:		custom per-clock data for example for the get_rate - *			callback - * @rate:		fixed rate for clocks which don't implement - * 			ops->getrate - * @prcmu_cg_off:	address offset of the combined enable/disable register - * 			(used on u8500v1) - * @prcmu_cg_bit:	bit in the combined enable/disable register (used on - * 			u8500v1) - * @prcmu_cg_mgt:	address of the enable/disable register (used on - * 			u8500ed) - * @cluster:		peripheral cluster number - * @prcc_bus:		bit for the bus clock in the peripheral's CLKRST - * @prcc_kernel:	bit for the kernel clock in the peripheral's CLKRST. - * 			-1 if no kernel clock exists. - * @parent_cluster:	pointer to parent's cluster clk struct - * @parent_periph:	pointer to parent's peripheral clk struct - * - * Peripherals are organised into clusters, and each cluster has an associated - * bus clock.  Some peripherals also have a parent peripheral clock. - * - * In order to enable a clock for a peripheral, we need to enable: - * 	(1) the parent cluster (bus) clock at the PRCMU level - * 	(2) the parent peripheral clock (if any) at the PRCMU level - * 	(3) the peripheral's bus & kernel clock at the PRCC level - * - * (1) and (2) are handled by defining clk structs (DEFINE_PRCMU_CLK) for each - * of the cluster and peripheral clocks, and hooking these as the parents of - * the individual peripheral clocks. - * - * (3) is handled by specifying the bits in the PRCC control registers required - * to enable these clocks and modifying them in the ->enable and - * ->disable callbacks of the peripheral clocks (DEFINE_PRCC_CLK). - * - * This structure describes both the PRCMU-level clocks and PRCC-level clocks. - * The prcmu_* fields are only used for the PRCMU clocks, and the cluster, - * prcc, and parent pointers are only used for the PRCC-level clocks. - */ -struct clk { -	const struct clkops	*ops; -	const char 		*name; -	unsigned int		enabled; -	unsigned long		(*get_rate)(struct clk *); -	void			*data; - -	unsigned long		rate; -	struct list_head	list; - -	/* These three are only for PRCMU clks */ - -	unsigned int		prcmu_cg_off; -	unsigned int		prcmu_cg_bit; -	unsigned int		prcmu_cg_mgt; - -	/* The rest are only for PRCC clks */ - -	int			cluster; -	unsigned int		prcc_bus; -	unsigned int		prcc_kernel; - -	struct clk		*parent_cluster; -	struct clk		*parent_periph; -}; - -#define DEFINE_PRCMU_CLK(_name, _cg_off, _cg_bit, _reg)		\ -struct clk clk_##_name = {					\ -		.name		= #_name,			\ -		.ops    	= &clk_prcmu_ops, 		\ -		.prcmu_cg_off	= _cg_off, 			\ -		.prcmu_cg_bit	= _cg_bit,			\ -		.prcmu_cg_mgt	= PRCM_##_reg##_MGT		\ -	} - -#define DEFINE_PRCMU_CLK_RATE(_name, _cg_off, _cg_bit, _reg, _rate)	\ -struct clk clk_##_name = {						\ -		.name		= #_name,				\ -		.ops    	= &clk_prcmu_ops, 			\ -		.prcmu_cg_off	= _cg_off, 				\ -		.prcmu_cg_bit	= _cg_bit,				\ -		.rate		= _rate,				\ -		.prcmu_cg_mgt	= PRCM_##_reg##_MGT			\ -	} - -#define DEFINE_PRCC_CLK(_pclust, _name, _bus_en, _kernel_en, _kernclk)	\ -struct clk clk_##_name = {						\ -		.name		= #_name,				\ -		.ops    	= &clk_prcc_ops, 			\ -		.cluster 	= _pclust,				\ -		.prcc_bus 	= _bus_en, 				\ -		.prcc_kernel 	= _kernel_en, 				\ -		.parent_cluster = &clk_per##_pclust##clk,		\ -		.parent_periph 	= _kernclk				\ -	} - -#define DEFINE_PRCC_CLK_CUSTOM(_pclust, _name, _bus_en, _kernel_en, _kernclk, _callback, _data) \ -struct clk clk_##_name = {						\ -		.name		= #_name,				\ -		.ops		= &clk_prcc_ops,			\ -		.cluster	= _pclust,				\ -		.prcc_bus	= _bus_en,				\ -		.prcc_kernel	= _kernel_en,				\ -		.parent_cluster = &clk_per##_pclust##clk,		\ -		.parent_periph	= _kernclk,				\ -		.get_rate	= _callback,				\ -		.data		= (void *) _data			\ -	} - - -#define CLK(_clk, _devname, _conname)			\ -	{						\ -		.clk	= &clk_##_clk,			\ -		.dev_id	= _devname,			\ -		.con_id = _conname,			\ -	} - -int __init clk_db8500_ed_fixup(void); -int __init clk_init(void); diff --git a/arch/arm/mach-ux500/cpu-db5500.c b/arch/arm/mach-ux500/cpu-db5500.c deleted file mode 100644 index 2f87075e9d6..00000000000 --- a/arch/arm/mach-ux500/cpu-db5500.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * License terms: GNU General Public License (GPL) version 2 - */ - -#include <linux/platform_device.h> -#include <linux/amba/bus.h> -#include <linux/io.h> - -#include <asm/mach/map.h> - -#include <mach/hardware.h> -#include <mach/devices.h> -#include <mach/setup.h> -#include <mach/irqs.h> - -static struct map_desc u5500_io_desc[] __initdata = { -	__IO_DEV_DESC(U5500_GPIO0_BASE, SZ_4K), -	__IO_DEV_DESC(U5500_GPIO1_BASE, SZ_4K), -	__IO_DEV_DESC(U5500_GPIO2_BASE, SZ_4K), -	__IO_DEV_DESC(U5500_GPIO3_BASE, SZ_4K), -	__IO_DEV_DESC(U5500_GPIO4_BASE, SZ_4K), -	__IO_DEV_DESC(U5500_PRCMU_BASE, SZ_4K), -}; - -static struct resource mbox0_resources[] = { -	{ -		.name = "mbox_peer", -		.start = U5500_MBOX0_PEER_START, -		.end = U5500_MBOX0_PEER_END, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.name = "mbox_local", -		.start = U5500_MBOX0_LOCAL_START, -		.end = U5500_MBOX0_LOCAL_END, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.name = "mbox_irq", -		.start = MBOX_PAIR0_VIRT_IRQ, -		.end = MBOX_PAIR0_VIRT_IRQ, -		.flags = IORESOURCE_IRQ, -	} -}; - -static struct resource mbox1_resources[] = { -	{ -		.name = "mbox_peer", -		.start = U5500_MBOX1_PEER_START, -		.end = U5500_MBOX1_PEER_END, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.name = "mbox_local", -		.start = U5500_MBOX1_LOCAL_START, -		.end = U5500_MBOX1_LOCAL_END, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.name = "mbox_irq", -		.start = MBOX_PAIR1_VIRT_IRQ, -		.end = MBOX_PAIR1_VIRT_IRQ, -		.flags = IORESOURCE_IRQ, -	} -}; - -static struct resource mbox2_resources[] = { -	{ -		.name = "mbox_peer", -		.start = U5500_MBOX2_PEER_START, -		.end = U5500_MBOX2_PEER_END, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.name = "mbox_local", -		.start = U5500_MBOX2_LOCAL_START, -		.end = U5500_MBOX2_LOCAL_END, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.name = "mbox_irq", -		.start = MBOX_PAIR2_VIRT_IRQ, -		.end = MBOX_PAIR2_VIRT_IRQ, -		.flags = IORESOURCE_IRQ, -	} -}; - -static struct platform_device mbox0_device = { -	.id = 0, -	.name = "mbox", -	.resource = mbox0_resources, -	.num_resources = ARRAY_SIZE(mbox0_resources), -}; - -static struct platform_device mbox1_device = { -	.id = 1, -	.name = "mbox", -	.resource = mbox1_resources, -	.num_resources = ARRAY_SIZE(mbox1_resources), -}; - -static struct platform_device mbox2_device = { -	.id = 2, -	.name = "mbox", -	.resource = mbox2_resources, -	.num_resources = ARRAY_SIZE(mbox2_resources), -}; - -static struct platform_device *u5500_platform_devs[] __initdata = { -	&u5500_gpio_devs[0], -	&u5500_gpio_devs[1], -	&u5500_gpio_devs[2], -	&u5500_gpio_devs[3], -	&u5500_gpio_devs[4], -	&u5500_gpio_devs[5], -	&u5500_gpio_devs[6], -	&u5500_gpio_devs[7], -	&mbox0_device, -	&mbox1_device, -	&mbox2_device, -}; - -void __init u5500_map_io(void) -{ -	ux500_map_io(); - -	iotable_init(u5500_io_desc, ARRAY_SIZE(u5500_io_desc)); -} - -void __init u5500_init_devices(void) -{ -	ux500_init_devices(); - -	platform_add_devices(u5500_platform_devs, -			     ARRAY_SIZE(u5500_platform_devs)); -} diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 4acab7544b3..fa308f07fae 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -1,5 +1,5 @@  /* - * Copyright (C) 2008-2009 ST-Ericsson + * Copyright (C) 2008-2009 ST-Ericsson SA   *   * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>   * @@ -12,153 +12,201 @@  #include <linux/init.h>  #include <linux/device.h>  #include <linux/amba/bus.h> +#include <linux/interrupt.h>  #include <linux/irq.h> -#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/io.h> - +#include <linux/mfd/abx500/ab8500.h> +#include <linux/mfd/dbx500-prcmu.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/regulator/machine.h> +#include <linux/random.h> + +#include <asm/pmu.h>  #include <asm/mach/map.h> -#include <mach/hardware.h> -#include <mach/setup.h> -#include <mach/devices.h> - -static struct platform_device *platform_devs[] __initdata = { -	&u8500_gpio_devs[0], -	&u8500_gpio_devs[1], -	&u8500_gpio_devs[2], -	&u8500_gpio_devs[3], -	&u8500_gpio_devs[4], -	&u8500_gpio_devs[5], -	&u8500_gpio_devs[6], -	&u8500_gpio_devs[7], -	&u8500_gpio_devs[8], -	&u8500_dma40_device, + +#include "setup.h" + +#include "board-mop500-regulators.h" +#include "board-mop500.h" +#include "db8500-regs.h" +#include "id.h" + +struct ab8500_platform_data ab8500_platdata = { +	.regulator	= &ab8500_regulator_plat_data, +}; + +struct prcmu_pdata db8500_prcmu_pdata = { +	.ab_platdata	= &ab8500_platdata, +	.version_offset	= DB8500_PRCMU_FW_VERSION_OFFSET, +	.legacy_offset	= DB8500_PRCMU_LEGACY_OFFSET,  };  /* minimum static i/o mapping required to boot U8500 platforms */ -static struct map_desc u8500_io_desc[] __initdata = { -	__IO_DEV_DESC(U8500_PRCMU_BASE, SZ_4K), -	__IO_DEV_DESC(U8500_PRCMU_TCDM_BASE, SZ_4K), +static struct map_desc u8500_uart_io_desc[] __initdata = { +	__IO_DEV_DESC(U8500_UART0_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_UART2_BASE, SZ_4K), +}; +/*  U8500 and U9540 common io_desc */ +static struct map_desc u8500_common_io_desc[] __initdata = { +	/* SCU base also covers GIC CPU BASE and TWD with its 4K page */ +	__IO_DEV_DESC(U8500_SCU_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_GIC_DIST_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_L2CC_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_MTU0_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_BACKUPRAM0_BASE, SZ_8K), + +	__IO_DEV_DESC(U8500_CLKRST1_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_CLKRST2_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_CLKRST3_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_CLKRST5_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_CLKRST6_BASE, SZ_4K), +  	__IO_DEV_DESC(U8500_GPIO0_BASE, SZ_4K),  	__IO_DEV_DESC(U8500_GPIO1_BASE, SZ_4K),  	__IO_DEV_DESC(U8500_GPIO2_BASE, SZ_4K),  	__IO_DEV_DESC(U8500_GPIO3_BASE, SZ_4K), -	__MEM_DEV_DESC(U8500_BOOT_ROM_BASE, SZ_1M),  }; -static struct map_desc u8500ed_io_desc[] __initdata = { -	__IO_DEV_DESC(U8500_MTU0_BASE_ED, SZ_4K), -	__IO_DEV_DESC(U8500_CLKRST7_BASE_ED, SZ_8K), -}; +/* U8500 IO map specific description */ +static struct map_desc u8500_io_desc[] __initdata = { +	__IO_DEV_DESC(U8500_PRCMU_BASE, SZ_4K), +	__IO_DEV_DESC(U8500_PRCMU_TCDM_BASE, SZ_4K), -static struct map_desc u8500v1_io_desc[] __initdata = { -	__IO_DEV_DESC(U8500_MTU0_BASE, SZ_4K),  }; -/* - * Functions to differentiate between later ASICs - * We look into the end of the ROM to locate the hardcoded ASIC ID. - * This is only needed to differentiate between minor revisions and - * process variants of an ASIC, the major revisions are encoded in - * the cpuid. - */ -#define U8500_ASIC_ID_LOC_ED_V1	(U8500_BOOT_ROM_BASE + 0x1FFF4) -#define U8500_ASIC_ID_LOC_V2	(U8500_BOOT_ROM_BASE + 0x1DBF4) -#define U8500_ASIC_REV_ED	0x01 -#define U8500_ASIC_REV_V10	0xA0 -#define U8500_ASIC_REV_V11	0xA1 -#define U8500_ASIC_REV_V20	0xB0 - -/** - * struct db8500_asic_id - fields of the ASIC ID - * @process: the manufacturing process, 0x40 is 40 nm - *  0x00 is "standard" - * @partnumber: hithereto 0x8500 for DB8500 - * @revision: version code in the series - * This field definion is not formally defined but makes - * sense. - */ -struct db8500_asic_id { -	u8 process; -	u16 partnumber; -	u8 revision; +/* U9540 IO map specific description */ +static struct map_desc u9540_io_desc[] __initdata = { +	__IO_DEV_DESC(U8500_PRCMU_BASE, SZ_4K + SZ_8K), +	__IO_DEV_DESC(U8500_PRCMU_TCDM_BASE, SZ_4K + SZ_8K),  }; -/* This isn't going to change at runtime */ -static struct db8500_asic_id db8500_id; - -static void __init get_db8500_asic_id(void) +void __init u8500_map_io(void)  { -	u32 asicid; +	/* +	 * Map the UARTs early so that the DEBUG_LL stuff continues to work. +	 */ +	iotable_init(u8500_uart_io_desc, ARRAY_SIZE(u8500_uart_io_desc)); -	if (cpu_is_u8500v1() || cpu_is_u8500ed()) -		asicid = readl(__io_address(U8500_ASIC_ID_LOC_ED_V1)); -	else if (cpu_is_u8500v2()) -		asicid = readl(__io_address(U8500_ASIC_ID_LOC_V2)); -	else -		BUG(); +	ux500_map_io(); -	db8500_id.process = (asicid >> 24); -	db8500_id.partnumber = (asicid >> 16) & 0xFFFFU; -	db8500_id.revision = asicid & 0xFFU; -} +	iotable_init(u8500_common_io_desc, ARRAY_SIZE(u8500_common_io_desc)); -bool cpu_is_u8500v10(void) -{ -	return (db8500_id.revision == U8500_ASIC_REV_V10); +	if (cpu_is_ux540_family()) +		iotable_init(u9540_io_desc, ARRAY_SIZE(u9540_io_desc)); +	else +		iotable_init(u8500_io_desc, ARRAY_SIZE(u8500_io_desc));  } -bool cpu_is_u8500v11(void) +/* + * The PMU IRQ lines of two cores are wired together into a single interrupt. + * Bounce the interrupt to the other core if it's not ours. + */ +static irqreturn_t db8500_pmu_handler(int irq, void *dev, irq_handler_t handler)  { -	return (db8500_id.revision == U8500_ASIC_REV_V11); +	irqreturn_t ret = handler(irq, dev); +	int other = !smp_processor_id(); + +	if (ret == IRQ_NONE && cpu_online(other)) +		irq_set_affinity(irq, cpumask_of(other)); + +	/* +	 * We should be able to get away with the amount of IRQ_NONEs we give, +	 * while still having the spurious IRQ detection code kick in if the +	 * interrupt really starts hitting spuriously. +	 */ +	return ret;  } -bool cpu_is_u8500v20(void) +struct arm_pmu_platdata db8500_pmu_platdata = { +	.handle_irq		= db8500_pmu_handler, +}; + +static const char *db8500_read_soc_id(void)  { -	return (db8500_id.revision == U8500_ASIC_REV_V20); +	void __iomem *uid = __io_address(U8500_BB_UID_BASE); + +	/* Throw these device-specific numbers into the entropy pool */ +	add_device_randomness(uid, 0x14); +	return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x", +			 readl((u32 *)uid+0), +			 readl((u32 *)uid+1), readl((u32 *)uid+2), +			 readl((u32 *)uid+3), readl((u32 *)uid+4));  } -void __init u8500_map_io(void) +static struct device * __init db8500_soc_device_init(void)  { -	ux500_map_io(); - -	iotable_init(u8500_io_desc, ARRAY_SIZE(u8500_io_desc)); - -	if (cpu_is_u8500ed()) -		iotable_init(u8500ed_io_desc, ARRAY_SIZE(u8500ed_io_desc)); -	else -		iotable_init(u8500v1_io_desc, ARRAY_SIZE(u8500v1_io_desc)); +	const char *soc_id = db8500_read_soc_id(); -	/* Read out the ASIC ID as early as we can */ -	get_db8500_asic_id(); +	return ux500_soc_device_init(soc_id);  } -/* - * This function is called from the board init - */ -void __init u8500_init_devices(void) -{ -	/* Display some ASIC boilerplate */ -	pr_info("DB8500: process: %02x, revision ID: 0x%02x\n", -		db8500_id.process, db8500_id.revision); -	if (cpu_is_u8500ed()) -		pr_info("DB8500: Early Drop (ED)\n"); -	else if (cpu_is_u8500v10()) -		pr_info("DB8500: version 1.0\n"); -	else if (cpu_is_u8500v11()) -		pr_info("DB8500: version 1.1\n"); -	else if (cpu_is_u8500v20()) -		pr_info("DB8500: version 2.0\n"); -	else -		pr_warning("ASIC: UNKNOWN SILICON VERSION!\n"); +static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { +	/* Requires call-back bindings. */ +	OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), +	/* Requires DMA bindings. */ +	OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000, +		       "ux500-msp-i2s.0", &msp0_platform_data), +	OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000, +		       "ux500-msp-i2s.1", &msp1_platform_data), +	OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80117000, +		       "ux500-msp-i2s.2", &msp2_platform_data), +	OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000, +		       "ux500-msp-i2s.3", &msp3_platform_data), +	/* Requires non-DT:able platform data. */ +	OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", +			&db8500_prcmu_pdata), +	OF_DEV_AUXDATA("stericsson,ux500-cryp", 0xa03cb000, "cryp1", NULL), +	OF_DEV_AUXDATA("stericsson,ux500-hash", 0xa03c2000, "hash1", NULL), +	OF_DEV_AUXDATA("stericsson,snd-soc-mop500", 0, "snd-soc-mop500.0", +			NULL), +	{}, +}; -	ux500_init_devices(); +static struct of_dev_auxdata u8540_auxdata_lookup[] __initdata = { +	OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", +			&db8500_prcmu_pdata), +	{}, +}; -	if (cpu_is_u8500ed()) -		dma40_u8500ed_fixup(); +static const struct of_device_id u8500_local_bus_nodes[] = { +	/* only create devices below soc node */ +	{ .compatible = "stericsson,db8500", }, +	{ .compatible = "stericsson,db8500-prcmu", }, +	{ .compatible = "simple-bus"}, +	{ }, +}; -	/* Register the platform devices */ -	platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); +static void __init u8500_init_machine(void) +{ +	struct device *parent = db8500_soc_device_init(); -	return ; +	/* automatically probe child nodes of dbx5x0 devices */ +	if (of_machine_is_compatible("st-ericsson,u8540")) +		of_platform_populate(NULL, u8500_local_bus_nodes, +				     u8540_auxdata_lookup, parent); +	else +		of_platform_populate(NULL, u8500_local_bus_nodes, +				     u8500_auxdata_lookup, parent);  } + +static const char * stericsson_dt_platform_compat[] = { +	"st-ericsson,u8500", +	"st-ericsson,u8540", +	"st-ericsson,u9500", +	"st-ericsson,u9540", +	NULL, +}; + +DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)") +	.smp            = smp_ops(ux500_smp_ops), +	.map_io		= u8500_map_io, +	.init_irq	= ux500_init_irq, +	/* we re-use nomadik timer here */ +	.init_time	= ux500_timer_init, +	.init_machine	= u8500_init_machine, +	.init_late	= NULL, +	.dt_compat      = stericsson_dt_platform_compat, +	.restart        = ux500_restart, +MACHINE_END diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c index 73fb1a551ec..db16b5a04ad 100644 --- a/arch/arm/mach-ux500/cpu.c +++ b/arch/arm/mach-ux500/cpu.c @@ -2,149 +2,152 @@   * Copyright (C) ST-Ericsson SA 2010   *   * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson + * Author: Lee Jones <lee.jones@linaro.org> for ST-Ericsson   * License terms: GNU General Public License (GPL) version 2   */  #include <linux/platform_device.h> -#include <linux/amba/bus.h>  #include <linux/io.h> -#include <linux/clk.h> +#include <linux/mfd/dbx500-prcmu.h> +#include <linux/clksrc-dbx500-prcmu.h> +#include <linux/sys_soc.h> +#include <linux/err.h> +#include <linux/slab.h> +#include <linux/stat.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/irq.h> +#include <linux/irqchip.h> +#include <linux/irqchip/arm-gic.h> +#include <linux/platform_data/clk-ux500.h> +#include <linux/platform_data/arm-ux500-pm.h> -#include <asm/cacheflush.h> -#include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/mach/map.h> -#include <asm/localtimer.h> -#include <plat/mtu.h> -#include <mach/hardware.h> -#include <mach/setup.h> -#include <mach/devices.h> +#include "setup.h" -#include "clock.h" +#include "board-mop500.h" +#include "db8500-regs.h" +#include "id.h" -static struct map_desc ux500_io_desc[] __initdata = { -	__IO_DEV_DESC(UX500_UART0_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_UART2_BASE, SZ_4K), - -	__IO_DEV_DESC(UX500_GIC_CPU_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_GIC_DIST_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_L2CC_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_TWD_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_SCU_BASE, SZ_4K), - -	__IO_DEV_DESC(UX500_CLKRST1_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_CLKRST2_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_CLKRST3_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_CLKRST5_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_CLKRST6_BASE, SZ_4K), - -	__IO_DEV_DESC(UX500_MTU0_BASE, SZ_4K), -	__IO_DEV_DESC(UX500_MTU1_BASE, SZ_4K), - -	__IO_DEV_DESC(UX500_BACKUPRAM0_BASE, SZ_8K), -}; - -static struct amba_device *ux500_amba_devs[] __initdata = { -	&ux500_pl031_device, -}; - -void __init ux500_map_io(void) +void ux500_restart(enum reboot_mode mode, const char *cmd)  { -	iotable_init(ux500_io_desc, ARRAY_SIZE(ux500_io_desc)); -} +	local_irq_disable(); +	local_fiq_disable(); -void __init ux500_init_devices(void) -{ -	amba_add_devices(ux500_amba_devs, ARRAY_SIZE(ux500_amba_devs)); +	prcmu_system_reset(0);  } +/* + * FIXME: Should we set up the GPIO domain here? + * + * The problem is that we cannot put the interrupt resources into the platform + * device until the irqdomain has been added. Right now, we set the GIC interrupt + * domain from init_irq(), then load the gpio driver from + * core_initcall(nmk_gpio_init) and add the platform devices from + * arch_initcall(customize_machine). + * + * This feels fragile because it depends on the gpio device getting probed + * _before_ any device uses the gpio interrupts. +*/  void __init ux500_init_irq(void)  { -	gic_dist_init(0, __io_address(UX500_GIC_DIST_BASE), 29); -	gic_cpu_init(0, __io_address(UX500_GIC_CPU_BASE)); +	gic_arch_extn.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND; +	irqchip_init();  	/*  	 * Init clocks here so that they are available for system timer  	 * initialization.  	 */ -	clk_init(); +	if (cpu_is_u8500_family()) { +		prcmu_early_init(U8500_PRCMU_BASE, SZ_8K - 1); +		ux500_pm_init(U8500_PRCMU_BASE, SZ_8K - 1); + +		u8500_of_clk_init(U8500_CLKRST1_BASE, +				  U8500_CLKRST2_BASE, +				  U8500_CLKRST3_BASE, +				  U8500_CLKRST5_BASE, +				  U8500_CLKRST6_BASE); +	} else if (cpu_is_u9540()) { +		prcmu_early_init(U8500_PRCMU_BASE, SZ_8K - 1); +		ux500_pm_init(U8500_PRCMU_BASE, SZ_8K - 1); +		u9540_clk_init(U8500_CLKRST1_BASE, U8500_CLKRST2_BASE, +			       U8500_CLKRST3_BASE, U8500_CLKRST5_BASE, +			       U8500_CLKRST6_BASE); +	} else if (cpu_is_u8540()) { +		prcmu_early_init(U8500_PRCMU_BASE, SZ_8K + SZ_4K - 1); +		ux500_pm_init(U8500_PRCMU_BASE, SZ_8K + SZ_4K - 1); +		u8540_clk_init(U8500_CLKRST1_BASE, U8500_CLKRST2_BASE, +			       U8500_CLKRST3_BASE, U8500_CLKRST5_BASE, +			       U8500_CLKRST6_BASE); +	}  } -#ifdef CONFIG_CACHE_L2X0 -static inline void ux500_cache_wait(void __iomem *reg, unsigned long mask) +static const char * __init ux500_get_machine(void)  { -	/* wait for the operation to complete */ -	while (readl(reg) & mask) -		; +	return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber());  } -static inline void ux500_cache_sync(void) +static const char * __init ux500_get_family(void)  { -	void __iomem *base = __io_address(UX500_L2CC_BASE); -	writel(0, base + L2X0_CACHE_SYNC); -	ux500_cache_wait(base + L2X0_CACHE_SYNC, 1); +	return kasprintf(GFP_KERNEL, "ux500");  } -/* - * The L2 cache cannot be turned off in the non-secure world. - * Dummy until a secure service is in place. - */ -static void ux500_l2x0_disable(void) +static const char * __init ux500_get_revision(void)  { +	unsigned int rev = dbx500_revision(); + +	if (rev == 0x01) +		return kasprintf(GFP_KERNEL, "%s", "ED"); +	else if (rev >= 0xA0) +		return kasprintf(GFP_KERNEL, "%d.%d", +				 (rev >> 4) - 0xA + 1, rev & 0xf); + +	return kasprintf(GFP_KERNEL, "%s", "Unknown");  } -/* - * This is only called when doing a kexec, just after turning off the L2 - * and L1 cache, and it is surrounded by a spinlock in the generic version. - * However, we're not really turning off the L2 cache right now and the - * PL310 does not support exclusive accesses (used to implement the spinlock). - * So, the invalidation needs to be done without the spinlock. - */ -static void ux500_l2x0_inv_all(void) +static ssize_t ux500_get_process(struct device *dev, +					struct device_attribute *attr, +					char *buf)  { -	void __iomem *l2x0_base = __io_address(UX500_L2CC_BASE); -	uint32_t l2x0_way_mask = (1<<16) - 1;	/* Bitmask of active ways */ +	if (dbx500_id.process == 0x00) +		return sprintf(buf, "Standard\n"); + +	return sprintf(buf, "%02xnm\n", dbx500_id.process); +} -	/* invalidate all ways */ -	writel(l2x0_way_mask, l2x0_base + L2X0_INV_WAY); -	ux500_cache_wait(l2x0_base + L2X0_INV_WAY, l2x0_way_mask); -	ux500_cache_sync(); +static void __init soc_info_populate(struct soc_device_attribute *soc_dev_attr, +				     const char *soc_id) +{ +	soc_dev_attr->soc_id   = soc_id; +	soc_dev_attr->machine  = ux500_get_machine(); +	soc_dev_attr->family   = ux500_get_family(); +	soc_dev_attr->revision = ux500_get_revision();  } -static int ux500_l2x0_init(void) +struct device_attribute ux500_soc_attr = +	__ATTR(process,  S_IRUGO, ux500_get_process,  NULL); + +struct device * __init ux500_soc_device_init(const char *soc_id)  { -	void __iomem *l2x0_base; +	struct device *parent; +	struct soc_device *soc_dev; +	struct soc_device_attribute *soc_dev_attr; -	l2x0_base = __io_address(UX500_L2CC_BASE); +	soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); +	if (!soc_dev_attr) +		return ERR_PTR(-ENOMEM); -	/* 64KB way size, 8 way associativity, force WA */ -	l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); +	soc_info_populate(soc_dev_attr, soc_id); -	/* Override invalidate function */ -	outer_cache.disable = ux500_l2x0_disable; -	outer_cache.inv_all = ux500_l2x0_inv_all; +	soc_dev = soc_device_register(soc_dev_attr); +	if (IS_ERR(soc_dev)) { +	        kfree(soc_dev_attr); +		return NULL; +	} -	return 0; -} -early_initcall(ux500_l2x0_init); -#endif +	parent = soc_device_to_device(soc_dev); +	device_create_file(parent, &ux500_soc_attr); -static void __init ux500_timer_init(void) -{ -#ifdef CONFIG_LOCAL_TIMERS -	/* Setup the local timer base */ -	twd_base = __io_address(UX500_TWD_BASE); -#endif -	/* Setup the MTU base */ -	if (cpu_is_u8500ed()) -		mtu_base = __io_address(U8500_MTU0_BASE_ED); -	else -		mtu_base = __io_address(UX500_MTU0_BASE); - -	nmdk_timer_init(); +	return parent;  } - -struct sys_timer ux500_timer = { -	.init	= ux500_timer_init, -}; diff --git a/arch/arm/mach-ux500/include/mach/db8500-regs.h b/arch/arm/mach-ux500/db8500-regs.h index f07d0986409..27399553c84 100644 --- a/arch/arm/mach-ux500/include/mach/db8500-regs.h +++ b/arch/arm/mach-ux500/db8500-regs.h @@ -15,9 +15,16 @@  #define U8500_ESRAM_BANK2	(U8500_ESRAM_BANK1 + U8500_ESRAM_BANK_SIZE)  #define U8500_ESRAM_BANK3	(U8500_ESRAM_BANK2 + U8500_ESRAM_BANK_SIZE)  #define U8500_ESRAM_BANK4	(U8500_ESRAM_BANK3 + U8500_ESRAM_BANK_SIZE) -/* Use bank 4 for DMA LCPA */ -#define U8500_DMA_LCPA_BASE	U8500_ESRAM_BANK4 -#define U8500_DMA_LCPA_BASE_ED	(U8500_ESRAM_BANK4 + 0x4000) +/* + * on V1 DMA uses 4KB for logical parameters position is right after the 64KB + * reserved for security + */ +#define U8500_ESRAM_DMA_LCPA_OFFSET     0x10000 + +#define U8500_DMA_LCPA_BASE    (U8500_ESRAM_BANK0 + U8500_ESRAM_DMA_LCPA_OFFSET) + +/* This address fulfills the 256k alignment requirement of the lcla base */ +#define U8500_DMA_LCLA_BASE	U8500_ESRAM_BANK4  #define U8500_PER3_BASE		0x80000000  #define U8500_STM_BASE		0x80100000 @@ -27,20 +34,26 @@  #define U8500_B2R2_BASE		0x80130000  #define U8500_HSEM_BASE		0x80140000  #define U8500_PER4_BASE		0x80150000 +#define U8500_TPIU_BASE		0x80190000  #define U8500_ICN_BASE		0x81000000  #define U8500_BOOT_ROM_BASE	0x90000000 +/* ASIC ID is at 0xbf4 offset within this region */ +#define U8500_ASIC_ID_BASE	0x9001D000 + +#define U9540_BOOT_ROM_BASE	0xFFFE0000 +/* ASIC ID is at 0xbf4 offset within this region */ +#define U9540_ASIC_ID_BASE	0xFFFFD000  #define U8500_PER6_BASE		0xa03c0000 +#define U8500_PER7_BASE		0xa03d0000  #define U8500_PER5_BASE		0xa03e0000 -#define U8500_PER7_BASE_ED	0xa03d0000  #define U8500_SVA_BASE		0xa0100000  #define U8500_SIA_BASE		0xa0200000  #define U8500_SGA_BASE		0xa0300000  #define U8500_MCDE_BASE		0xa0350000 -#define U8500_DMA_BASE_ED	0xa0362000  #define U8500_DMA_BASE		0x801C0000	/* v1 */  #define U8500_SBAG_BASE		0xa0390000 @@ -58,32 +71,27 @@  #define U8500_GPIO2_BASE	(U8500_PER2_BASE + 0xE000)  #define U8500_GPIO3_BASE	(U8500_PER5_BASE + 0x1E000) -/* per7 base addressess */ -#define U8500_CR_BASE_ED	(U8500_PER7_BASE_ED + 0x8000) -#define U8500_MTU0_BASE_ED	(U8500_PER7_BASE_ED + 0xa000) -#define U8500_MTU1_BASE_ED	(U8500_PER7_BASE_ED + 0xb000) -#define U8500_TZPC0_BASE_ED	(U8500_PER7_BASE_ED + 0xc000) -#define U8500_CLKRST7_BASE_ED	(U8500_PER7_BASE_ED + 0xf000) -  #define U8500_UART0_BASE	(U8500_PER1_BASE + 0x0000)  #define U8500_UART1_BASE	(U8500_PER1_BASE + 0x1000) -/* per6 base addressess */ +/* per6 base addresses */  #define U8500_RNG_BASE		(U8500_PER6_BASE + 0x0000) -#define U8500_PKA_BASE		(U8500_PER6_BASE + 0x1000) -#define U8500_PKAM_BASE		(U8500_PER6_BASE + 0x2000) +#define U8500_HASH0_BASE        (U8500_PER6_BASE + 0x1000) +#define U8500_HASH1_BASE        (U8500_PER6_BASE + 0x2000) +#define U8500_PKA_BASE		(U8500_PER6_BASE + 0x4000) +#define U8500_PKAM_BASE		(U8500_PER6_BASE + 0x5100)  #define U8500_MTU0_BASE		(U8500_PER6_BASE + 0x6000) /* v1 */  #define U8500_MTU1_BASE		(U8500_PER6_BASE + 0x7000) /* v1 */  #define U8500_CR_BASE		(U8500_PER6_BASE + 0x8000) /* v1 */ -#define U8500_CRYPTO0_BASE	(U8500_PER6_BASE + 0xa000) -#define U8500_CRYPTO1_BASE	(U8500_PER6_BASE + 0xb000) +#define U8500_CRYP0_BASE	(U8500_PER6_BASE + 0xa000) +#define U8500_CRYP1_BASE	(U8500_PER6_BASE + 0xb000)  #define U8500_CLKRST6_BASE	(U8500_PER6_BASE + 0xf000) -/* per5 base addressess */ +/* per5 base addresses */  #define U8500_USBOTG_BASE	(U8500_PER5_BASE + 0x00000)  #define U8500_CLKRST5_BASE	(U8500_PER5_BASE + 0x1f000) -/* per4 base addressess */ +/* per4 base addresses */  #define U8500_BACKUPRAM0_BASE	(U8500_PER4_BASE + 0x00000)  #define U8500_BACKUPRAM1_BASE	(U8500_PER4_BASE + 0x01000)  #define U8500_RTT0_BASE		(U8500_PER4_BASE + 0x02000) @@ -92,7 +100,11 @@  #define U8500_SCR_BASE		(U8500_PER4_BASE + 0x05000)  #define U8500_DMC_BASE		(U8500_PER4_BASE + 0x06000)  #define U8500_PRCMU_BASE	(U8500_PER4_BASE + 0x07000) -#define U8500_PRCMU_TCDM_BASE	(U8500_PER4_BASE + 0x0f000) +#define U9540_DMC1_BASE		(U8500_PER4_BASE + 0x0A000) +#define U8500_PRCMU_TCDM_BASE	(U8500_PER4_BASE + 0x68000) +#define U8500_PRCMU_TCPM_BASE   (U8500_PER4_BASE + 0x60000) +#define U8500_PRCMU_TIMER_3_BASE (U8500_PER4_BASE + 0x07338) +#define U8500_PRCMU_TIMER_4_BASE (U8500_PER4_BASE + 0x07450)  /* per3 base addresses */  #define U8500_FSMC_BASE		(U8500_PER3_BASE + 0x0000) @@ -105,7 +117,7 @@  #define U8500_SDI5_BASE		(U8500_PER3_BASE + 0x8000)  #define U8500_CLKRST3_BASE	(U8500_PER3_BASE + 0xf000) -/* per2 base addressess */ +/* per2 base addresses */  #define U8500_I2C3_BASE		(U8500_PER2_BASE + 0x0000)  #define U8500_SPI2_BASE		(U8500_PER2_BASE + 0x1000)  #define U8500_SPI1_BASE		(U8500_PER2_BASE + 0x2000) @@ -123,6 +135,7 @@  #define U8500_I2C1_BASE		(U8500_PER1_BASE + 0x2000)  #define U8500_MSP0_BASE		(U8500_PER1_BASE + 0x3000)  #define U8500_MSP1_BASE		(U8500_PER1_BASE + 0x4000) +#define U8500_MSP3_BASE		(U8500_PER1_BASE + 0x5000)  #define U8500_SDI0_BASE		(U8500_PER1_BASE + 0x6000)  #define U8500_I2C2_BASE		(U8500_PER1_BASE + 0x8000)  #define U8500_SPI3_BASE		(U8500_PER1_BASE + 0x9000) @@ -142,4 +155,46 @@  #define U8500_GPIOBANK7_BASE	(U8500_GPIO2_BASE + 0x80)  #define U8500_GPIOBANK8_BASE	U8500_GPIO3_BASE +#define U8500_MCDE_SIZE		0x1000 +#define U8500_DSI_LINK_SIZE	0x1000 +#define U8500_DSI_LINK1_BASE	(U8500_MCDE_BASE + U8500_MCDE_SIZE) +#define U8500_DSI_LINK2_BASE	(U8500_DSI_LINK1_BASE + U8500_DSI_LINK_SIZE) +#define U8500_DSI_LINK3_BASE	(U8500_DSI_LINK2_BASE + U8500_DSI_LINK_SIZE) +#define U8500_DSI_LINK_COUNT	0x3 + +/* Modem and APE physical addresses */ +#define U8500_MODEM_BASE	0xe000000 +#define U8500_APE_BASE		0x6000000 + +/* SoC identification number information */ +#define U8500_BB_UID_BASE      (U8500_BACKUPRAM1_BASE + 0xFC0) + +/* Offsets to specific addresses in some IP blocks for DMA */ +#define MSP_TX_RX_REG_OFFSET	0 +#define CRYP1_RX_REG_OFFSET	0x10 +#define CRYP1_TX_REG_OFFSET	0x8 +#define HASH1_TX_REG_OFFSET	0x4 + +/* + * Macros to get at IO space when running virtually + * We dont map all the peripherals, let ioremap do + * this for us. We map only very basic peripherals here. + */ +#define U8500_IO_VIRTUAL	0xf0000000 +#define U8500_IO_PHYSICAL	0xa0000000 +/* This is where we map in the ROM to check ASIC IDs */ +#define UX500_VIRT_ROM		IOMEM(0xf0000000) + +/* This macro is used in assembly, so no cast */ +#define IO_ADDRESS(x)           \ +	(((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + U8500_IO_VIRTUAL) + +/* typesafe io address */ +#define __io_address(n)		IOMEM(IO_ADDRESS(n)) + +/* Used by some plat-nomadik code */ +#define io_p2v(n)		__io_address(n) + +#define ARRAY_AND_SIZE(x)	(x), ARRAY_SIZE(x) +  #endif diff --git a/arch/arm/mach-ux500/devices-db5500.c b/arch/arm/mach-ux500/devices-db5500.c deleted file mode 100644 index 33e5b56bebb..00000000000 --- a/arch/arm/mach-ux500/devices-db5500.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * License terms: GNU General Public License (GPL) version 2 - */ - -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/gpio.h> - -#include <mach/hardware.h> -#include <mach/devices.h> - -static struct nmk_gpio_platform_data u5500_gpio_data[] = { -	GPIO_DATA("GPIO-0-31", 0), -	GPIO_DATA("GPIO-32-63", 32), /* 36..63 not routed to pin */ -	GPIO_DATA("GPIO-64-95", 64), /* 83..95 not routed to pin */ -	GPIO_DATA("GPIO-96-127", 96), /* 102..127 not routed to pin */ -	GPIO_DATA("GPIO-128-159", 128), /* 149..159 not routed to pin */ -	GPIO_DATA("GPIO-160-191", 160), -	GPIO_DATA("GPIO-192-223", 192), -	GPIO_DATA("GPIO-224-255", 224), /* 228..255 not routed to pin */ -}; - -static struct resource u5500_gpio_resources[] = { -	GPIO_RESOURCE(0), -	GPIO_RESOURCE(1), -	GPIO_RESOURCE(2), -	GPIO_RESOURCE(3), -	GPIO_RESOURCE(4), -	GPIO_RESOURCE(5), -	GPIO_RESOURCE(6), -	GPIO_RESOURCE(7), -}; - -struct platform_device u5500_gpio_devs[] = { -	GPIO_DEVICE(0), -	GPIO_DEVICE(1), -	GPIO_DEVICE(2), -	GPIO_DEVICE(3), -	GPIO_DEVICE(4), -	GPIO_DEVICE(5), -	GPIO_DEVICE(6), -	GPIO_DEVICE(7), -}; diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c deleted file mode 100644 index 4a94be3304b..00000000000 --- a/arch/arm/mach-ux500/devices-db8500.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * License terms: GNU General Public License (GPL) version 2 - */ - -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/gpio.h> -#include <linux/amba/bus.h> - -#include <plat/ste_dma40.h> - -#include <mach/hardware.h> -#include <mach/setup.h> - -#include "ste-dma40-db8500.h" - -static struct nmk_gpio_platform_data u8500_gpio_data[] = { -	GPIO_DATA("GPIO-0-31", 0), -	GPIO_DATA("GPIO-32-63", 32), /* 37..63 not routed to pin */ -	GPIO_DATA("GPIO-64-95", 64), -	GPIO_DATA("GPIO-96-127", 96), /* 98..127 not routed to pin */ -	GPIO_DATA("GPIO-128-159", 128), -	GPIO_DATA("GPIO-160-191", 160), /* 172..191 not routed to pin */ -	GPIO_DATA("GPIO-192-223", 192), -	GPIO_DATA("GPIO-224-255", 224), /* 231..255 not routed to pin */ -	GPIO_DATA("GPIO-256-288", 256), /* 268..288 not routed to pin */ -}; - -static struct resource u8500_gpio_resources[] = { -	GPIO_RESOURCE(0), -	GPIO_RESOURCE(1), -	GPIO_RESOURCE(2), -	GPIO_RESOURCE(3), -	GPIO_RESOURCE(4), -	GPIO_RESOURCE(5), -	GPIO_RESOURCE(6), -	GPIO_RESOURCE(7), -	GPIO_RESOURCE(8), -}; - -struct platform_device u8500_gpio_devs[] = { -	GPIO_DEVICE(0), -	GPIO_DEVICE(1), -	GPIO_DEVICE(2), -	GPIO_DEVICE(3), -	GPIO_DEVICE(4), -	GPIO_DEVICE(5), -	GPIO_DEVICE(6), -	GPIO_DEVICE(7), -	GPIO_DEVICE(8), -}; - -struct amba_device u8500_ssp0_device = { -	.dev = { -		.coherent_dma_mask = ~0, -		.init_name = "ssp0", -	}, -	.res = { -		.start = U8500_SSP0_BASE, -		.end   = U8500_SSP0_BASE + SZ_4K - 1, -		.flags = IORESOURCE_MEM, -	}, -	.irq = {IRQ_DB8500_SSP0, NO_IRQ }, -	/* ST-Ericsson modified id */ -	.periphid = SSP_PER_ID, -}; - -static struct resource u8500_i2c0_resources[] = { -	[0] = { -		.start	= U8500_I2C0_BASE, -		.end	= U8500_I2C0_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= IRQ_DB8500_I2C0, -		.end	= IRQ_DB8500_I2C0, -		.flags	= IORESOURCE_IRQ, -	} -}; - -struct platform_device u8500_i2c0_device = { -	.name		= "nmk-i2c", -	.id		= 0, -	.resource	= u8500_i2c0_resources, -	.num_resources	= ARRAY_SIZE(u8500_i2c0_resources), -}; - -static struct resource u8500_i2c4_resources[] = { -	[0] = { -		.start	= U8500_I2C4_BASE, -		.end	= U8500_I2C4_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= IRQ_DB8500_I2C4, -		.end	= IRQ_DB8500_I2C4, -		.flags	= IORESOURCE_IRQ, -	} -}; - -struct platform_device u8500_i2c4_device = { -	.name		= "nmk-i2c", -	.id		= 4, -	.resource	= u8500_i2c4_resources, -	.num_resources	= ARRAY_SIZE(u8500_i2c4_resources), -}; - -/* - * SD/MMC - */ - -struct amba_device u8500_sdi0_device = { -	.dev		= { -		.init_name = "sdi0", -	}, -	.res		= { -		.start	= U8500_SDI0_BASE, -		.end	= U8500_SDI0_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	.irq		= {IRQ_DB8500_SDMMC0, NO_IRQ}, -}; - -struct amba_device u8500_sdi1_device = { -	.dev		= { -		.init_name = "sdi1", -	}, -	.res		= { -		.start	= U8500_SDI1_BASE, -		.end	= U8500_SDI1_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	.irq		= {IRQ_DB8500_SDMMC1, NO_IRQ}, -}; - -struct amba_device u8500_sdi2_device = { -	.dev		= { -		.init_name = "sdi2", -	}, -	.res		= { -		.start	= U8500_SDI2_BASE, -		.end	= U8500_SDI2_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	.irq		= {IRQ_DB8500_SDMMC2, NO_IRQ}, -}; - -struct amba_device u8500_sdi3_device = { -	.dev		= { -		.init_name = "sdi3", -	}, -	.res		= { -		.start	= U8500_SDI3_BASE, -		.end	= U8500_SDI3_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	.irq		= {IRQ_DB8500_SDMMC3, NO_IRQ}, -}; - -struct amba_device u8500_sdi4_device = { -	.dev		= { -		.init_name = "sdi4", -	}, -	.res		= { -		.start	= U8500_SDI4_BASE, -		.end	= U8500_SDI4_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	.irq		= {IRQ_DB8500_SDMMC4, NO_IRQ}, -}; - -struct amba_device u8500_sdi5_device = { -	.dev		= { -		.init_name = "sdi5", -	}, -	.res		= { -		.start	= U8500_SDI5_BASE, -		.end	= U8500_SDI5_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	.irq		= {IRQ_DB8500_SDMMC5, NO_IRQ}, -}; - -static struct resource dma40_resources[] = { -	[0] = { -		.start = U8500_DMA_BASE, -		.end   = U8500_DMA_BASE + SZ_4K - 1, -		.flags = IORESOURCE_MEM, -		.name  = "base", -	}, -	[1] = { -		.start = U8500_DMA_LCPA_BASE, -		.end   = U8500_DMA_LCPA_BASE + 2 * SZ_1K - 1, -		.flags = IORESOURCE_MEM, -		.name  = "lcpa", -	}, -	[2] = { -		.start = IRQ_DB8500_DMA, -		.end   = IRQ_DB8500_DMA, -		.flags = IORESOURCE_IRQ, -	} -}; - -/* Default configuration for physcial memcpy */ -struct stedma40_chan_cfg dma40_memcpy_conf_phy = { -	.mode = STEDMA40_MODE_PHYSICAL, -	.dir = STEDMA40_MEM_TO_MEM, - -	.src_info.data_width = STEDMA40_BYTE_WIDTH, -	.src_info.psize = STEDMA40_PSIZE_PHY_1, -	.src_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, - -	.dst_info.data_width = STEDMA40_BYTE_WIDTH, -	.dst_info.psize = STEDMA40_PSIZE_PHY_1, -	.dst_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, -}; -/* Default configuration for logical memcpy */ -struct stedma40_chan_cfg dma40_memcpy_conf_log = { -	.dir = STEDMA40_MEM_TO_MEM, - -	.src_info.data_width = STEDMA40_BYTE_WIDTH, -	.src_info.psize = STEDMA40_PSIZE_LOG_1, -	.src_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, - -	.dst_info.data_width = STEDMA40_BYTE_WIDTH, -	.dst_info.psize = STEDMA40_PSIZE_LOG_1, -	.dst_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, -}; - -/* - * Mapping between destination event lines and physical device address. - * The event line is tied to a device and therefor the address is constant. - */ -static const dma_addr_t dma40_tx_map[DB8500_DMA_NR_DEV]; - -/* Mapping between source event lines and physical device address */ -static const dma_addr_t dma40_rx_map[DB8500_DMA_NR_DEV]; - -/* Reserved event lines for memcpy only */ -static int dma40_memcpy_event[] = { -	DB8500_DMA_MEMCPY_TX_0, -	DB8500_DMA_MEMCPY_TX_1, -	DB8500_DMA_MEMCPY_TX_2, -	DB8500_DMA_MEMCPY_TX_3, -	DB8500_DMA_MEMCPY_TX_4, -	DB8500_DMA_MEMCPY_TX_5, -}; - -static struct stedma40_platform_data dma40_plat_data = { -	.dev_len = DB8500_DMA_NR_DEV, -	.dev_rx = dma40_rx_map, -	.dev_tx = dma40_tx_map, -	.memcpy = dma40_memcpy_event, -	.memcpy_len = ARRAY_SIZE(dma40_memcpy_event), -	.memcpy_conf_phy = &dma40_memcpy_conf_phy, -	.memcpy_conf_log = &dma40_memcpy_conf_log, -	.disabled_channels = {-1}, -}; - -struct platform_device u8500_dma40_device = { -	.dev = { -		.platform_data = &dma40_plat_data, -	}, -	.name = "dma40", -	.id = 0, -	.num_resources = ARRAY_SIZE(dma40_resources), -	.resource = dma40_resources -}; - -void dma40_u8500ed_fixup(void) -{ -	dma40_plat_data.memcpy = NULL; -	dma40_plat_data.memcpy_len = 0; -	dma40_resources[0].start = U8500_DMA_BASE_ED; -	dma40_resources[0].end = U8500_DMA_BASE_ED + SZ_4K - 1; -	dma40_resources[1].start = U8500_DMA_LCPA_BASE_ED; -	dma40_resources[1].end = U8500_DMA_LCPA_BASE_ED + 2 * SZ_1K - 1; -} - -struct resource keypad_resources[] = { -	[0] = { -		.start = U8500_SKE_BASE, -		.end = U8500_SKE_BASE + SZ_4K - 1, -		.flags = IORESOURCE_MEM, -	}, -	[1] = { -		.start = IRQ_DB8500_KB, -		.end = IRQ_DB8500_KB, -		.flags = IORESOURCE_IRQ, -	}, -}; - -struct platform_device ux500_ske_keypad_device = { -	.name = "nmk-ske-keypad", -	.id = -1, -	.num_resources = ARRAY_SIZE(keypad_resources), -	.resource = keypad_resources, -}; diff --git a/arch/arm/mach-ux500/devices.c b/arch/arm/mach-ux500/devices.c deleted file mode 100644 index 8a268893cb7..00000000000 --- a/arch/arm/mach-ux500/devices.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * License terms: GNU General Public License (GPL) version 2 - */ - -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/amba/bus.h> - -#include <mach/hardware.h> -#include <mach/setup.h> - -#define __MEM_4K_RESOURCE(x) \ -	.res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM} - -struct amba_device ux500_pl031_device = { -	.dev = { -		.init_name = "pl031", -	}, -	.res = { -		.start	= UX500_RTC_BASE, -		.end	= UX500_RTC_BASE + SZ_4K - 1, -		.flags	= IORESOURCE_MEM, -	}, -	.irq = {IRQ_RTC_RTT, NO_IRQ}, -}; - -struct amba_device ux500_uart0_device = { -	.dev = { .init_name = "uart0" }, -	__MEM_4K_RESOURCE(UX500_UART0_BASE), -	.irq = {IRQ_UART0, NO_IRQ}, -}; - -struct amba_device ux500_uart1_device = { -	.dev = { .init_name = "uart1" }, -	__MEM_4K_RESOURCE(UX500_UART1_BASE), -	.irq = {IRQ_UART1, NO_IRQ}, -}; - -struct amba_device ux500_uart2_device = { -	.dev = { .init_name = "uart2" }, -	__MEM_4K_RESOURCE(UX500_UART2_BASE), -	.irq = {IRQ_UART2, NO_IRQ}, -}; - -#define UX500_I2C_RESOURCES(id, size)				\ -static struct resource ux500_i2c##id##_resources[] = {		\ -	[0] = {							\ -		.start	= UX500_I2C##id##_BASE,			\ -		.end	= UX500_I2C##id##_BASE + size - 1,	\ -		.flags	= IORESOURCE_MEM,			\ -	},							\ -	[1] = {							\ -		.start	= IRQ_I2C##id,				\ -		.end	= IRQ_I2C##id,				\ -		.flags	= IORESOURCE_IRQ			\ -	}							\ -} - -UX500_I2C_RESOURCES(1, SZ_4K); -UX500_I2C_RESOURCES(2, SZ_4K); -UX500_I2C_RESOURCES(3, SZ_4K); - -#define UX500_I2C_PDEVICE(cid)					\ -struct platform_device ux500_i2c##cid##_device = {		\ -	.name		= "nmk-i2c",				\ -	.id		= cid,					\ -	.num_resources	= 2,					\ -	.resource	= ux500_i2c##cid##_resources,		\ -} - -UX500_I2C_PDEVICE(1); -UX500_I2C_PDEVICE(2); -UX500_I2C_PDEVICE(3); - -void __init amba_add_devices(struct amba_device *devs[], int num) -{ -	int i; - -	for (i = 0; i < num; i++) { -		struct amba_device *d = devs[i]; -		amba_device_register(d, &iomem_resource); -	} -} diff --git a/arch/arm/mach-ux500/headsmp.S b/arch/arm/mach-ux500/headsmp.S index a6be2cdf2b2..9cdea049485 100644 --- a/arch/arm/mach-ux500/headsmp.S +++ b/arch/arm/mach-ux500/headsmp.S @@ -11,8 +11,6 @@  #include <linux/linkage.h>  #include <linux/init.h> -	__INIT -  /*   * U8500 specific entry point for secondary CPUs.   */ @@ -23,7 +21,6 @@ ENTRY(u8500_secondary_startup)  	ldmia	r4, {r5, r6}  	sub	r4, r4, r5  	add	r6, r6, r4 -	dsb  pen:	ldr	r7, [r6]  	cmp	r7, r0  	bne	pen @@ -33,6 +30,8 @@ pen:	ldr	r7, [r6]  	 * should now contain the SVC stack for this core  	 */  	b	secondary_startup +ENDPROC(u8500_secondary_startup) +	.align 2  1:	.long	.  	.long	pen_release diff --git a/arch/arm/mach-ux500/hotplug.c b/arch/arm/mach-ux500/hotplug.c index b782a03024b..2bc00b085e3 100644 --- a/arch/arm/mach-ux500/hotplug.c +++ b/arch/arm/mach-ux500/hotplug.c @@ -11,23 +11,23 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/smp.h> -#include <linux/completion.h> -#include <asm/cacheflush.h> +#include <asm/smp_plat.h> -extern volatile int pen_release; +#include "setup.h" -static DECLARE_COMPLETION(cpu_killed); - -static inline void platform_do_lowpower(unsigned int cpu) +/* + * platform-specific code to shutdown a CPU + * + * Called with IRQs disabled + */ +void __ref ux500_cpu_die(unsigned int cpu)  { -	flush_cache_all(); - -	/* we put the platform to just WFI */ +	/* directly enter low power state, skipping secure registers */  	for (;;) {  		__asm__ __volatile__("dsb\n\t" "wfi\n\t"  				: : : "memory"); -		if (pen_release == cpu) { +		if (pen_release == cpu_logical_map(cpu)) {  			/*  			 * OK, proper wakeup, we're done  			 */ @@ -35,41 +35,3 @@ static inline void platform_do_lowpower(unsigned int cpu)  		}  	}  } - -int platform_cpu_kill(unsigned int cpu) -{ -	return wait_for_completion_timeout(&cpu_killed, 5000); -} - -/* - * platform-specific code to shutdown a CPU - * - * Called with IRQs disabled - */ -void platform_cpu_die(unsigned int cpu) -{ -#ifdef DEBUG -	unsigned int this_cpu = hard_smp_processor_id(); - -	if (cpu != this_cpu) { -		printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n", -			   this_cpu, cpu); -		BUG(); -	} -#endif - -	printk(KERN_NOTICE "CPU%u: shutdown\n", cpu); -	complete(&cpu_killed); - -	/* directly enter low power state, skipping secure registers */ -	platform_do_lowpower(cpu); -} - -int platform_cpu_disable(unsigned int cpu) -{ -	/* -	 * we don't allow CPU 0 to be shutdown (it is still too special -	 * e.g. clock tick interrupts) -	 */ -	return cpu == 0 ? -EPERM : 0; -} diff --git a/arch/arm/mach-ux500/id.c b/arch/arm/mach-ux500/id.c new file mode 100644 index 00000000000..392f2fdb37d --- /dev/null +++ b/arch/arm/mach-ux500/id.c @@ -0,0 +1,116 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson + * License terms: GNU General Public License (GPL) version 2 + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/io.h> + +#include <asm/cputype.h> +#include <asm/tlbflush.h> +#include <asm/cacheflush.h> +#include <asm/mach/map.h> + +#include "setup.h" + +#include "db8500-regs.h" +#include "id.h" + +struct dbx500_asic_id dbx500_id; + +static unsigned int __init ux500_read_asicid(phys_addr_t addr) +{ +	phys_addr_t base = addr & ~0xfff; +	struct map_desc desc = { +		.virtual	= (unsigned long)UX500_VIRT_ROM, +		.pfn		= __phys_to_pfn(base), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}; + +	iotable_init(&desc, 1); + +	/* As in devicemaps_init() */ +	local_flush_tlb_all(); +	flush_cache_all(); + +	return readl(UX500_VIRT_ROM + (addr & 0xfff)); +} + +static void ux500_print_soc_info(unsigned int asicid) +{ +	unsigned int rev = dbx500_revision(); + +	pr_info("DB%4x ", dbx500_partnumber()); + +	if (rev == 0x01) +		pr_cont("Early Drop"); +	else if (rev >= 0xA0) +		pr_cont("v%d.%d" , (rev >> 4) - 0xA + 1, rev & 0xf); +	else +		pr_cont("Unknown"); + +	pr_cont(" [%#010x]\n", asicid); +} + +static unsigned int partnumber(unsigned int asicid) +{ +	return (asicid >> 8) & 0xffff; +} + +/* + * SOC		MIDR		ASICID ADDRESS		ASICID VALUE + * DB8500ed	0x410fc090	0x9001FFF4		0x00850001 + * DB8500v1	0x411fc091	0x9001FFF4		0x008500A0 + * DB8500v1.1	0x411fc091	0x9001FFF4		0x008500A1 + * DB8500v2	0x412fc091	0x9001DBF4		0x008500B0 + * DB8520v2.2	0x412fc091	0x9001DBF4		0x008500B2 + * DB5500v1	0x412fc091	0x9001FFF4		0x005500A0 + * DB9540	0x413fc090	0xFFFFDBF4		0x009540xx + */ + +void __init ux500_map_io(void) +{ +	unsigned int cpuid = read_cpuid_id(); +	unsigned int asicid = 0; +	phys_addr_t addr = 0; + +	switch (cpuid) { +	case 0x410fc090: /* DB8500ed */ +	case 0x411fc091: /* DB8500v1 */ +		addr = 0x9001FFF4; +		break; + +	case 0x412fc091: /* DB8520 / DB8500v2 / DB5500v1 */ +		asicid = ux500_read_asicid(0x9001DBF4); +		if (partnumber(asicid) == 0x8500 || +		    partnumber(asicid) == 0x8520) +			/* DB8500v2 */ +			break; + +		/* DB5500v1 */ +		addr = 0x9001FFF4; +		break; + +	case 0x413fc090: /* DB9540 */ +		addr = 0xFFFFDBF4; +		break; +	} + +	if (addr) +		asicid = ux500_read_asicid(addr); + +	if (!asicid) { +		pr_err("Unable to identify SoC\n"); +		ux500_unknown_soc(); +	} + +	dbx500_id.process = asicid >> 24; +	dbx500_id.partnumber = partnumber(asicid); +	dbx500_id.revision = asicid & 0xff; + +	ux500_print_soc_info(asicid); +} diff --git a/arch/arm/mach-ux500/id.h b/arch/arm/mach-ux500/id.h new file mode 100644 index 00000000000..bcc58a8cccb --- /dev/null +++ b/arch/arm/mach-ux500/id.h @@ -0,0 +1,144 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson + * License terms: GNU General Public License (GPL) version 2 + */ + +#ifndef __MACH_UX500_ID +#define __MACH_UX500_ID + +/** + * struct dbx500_asic_id - fields of the ASIC ID + * @process: the manufacturing process, 0x40 is 40 nm 0x00 is "standard" + * @partnumber: hithereto 0x8500 for DB8500 + * @revision: version code in the series + */ +struct dbx500_asic_id { +	u16	partnumber; +	u8	revision; +	u8	process; +}; + +extern struct dbx500_asic_id dbx500_id; + +static inline unsigned int __attribute_const__ dbx500_partnumber(void) +{ +	return dbx500_id.partnumber; +} + +static inline unsigned int __attribute_const__ dbx500_revision(void) +{ +	return dbx500_id.revision; +} + +/* + * SOCs + */ + +static inline bool __attribute_const__ cpu_is_u8500(void) +{ +	return dbx500_partnumber() == 0x8500; +} + +static inline bool __attribute_const__ cpu_is_u8520(void) +{ +	return dbx500_partnumber() == 0x8520; +} + +static inline bool cpu_is_u8500_family(void) +{ +	return cpu_is_u8500() || cpu_is_u8520(); +} + +static inline bool __attribute_const__ cpu_is_u9540(void) +{ +	return dbx500_partnumber() == 0x9540; +} + +static inline bool __attribute_const__ cpu_is_u8540(void) +{ +	return dbx500_partnumber() == 0x8540; +} + +static inline bool __attribute_const__ cpu_is_u8580(void) +{ +	return dbx500_partnumber() == 0x8580; +} + +static inline bool cpu_is_ux540_family(void) +{ +	return cpu_is_u9540() || cpu_is_u8540() || cpu_is_u8580(); +} + +/* + * 8500 revisions + */ + +static inline bool __attribute_const__ cpu_is_u8500ed(void) +{ +	return cpu_is_u8500() && dbx500_revision() == 0x00; +} + +static inline bool __attribute_const__ cpu_is_u8500v1(void) +{ +	return cpu_is_u8500() && (dbx500_revision() & 0xf0) == 0xA0; +} + +static inline bool __attribute_const__ cpu_is_u8500v10(void) +{ +	return cpu_is_u8500() && dbx500_revision() == 0xA0; +} + +static inline bool __attribute_const__ cpu_is_u8500v11(void) +{ +	return cpu_is_u8500() && dbx500_revision() == 0xA1; +} + +static inline bool __attribute_const__ cpu_is_u8500v2(void) +{ +	return cpu_is_u8500() && ((dbx500_revision() & 0xf0) == 0xB0); +} + +static inline bool cpu_is_u8500v20(void) +{ +	return cpu_is_u8500() && (dbx500_revision() == 0xB0); +} + +static inline bool cpu_is_u8500v21(void) +{ +	return cpu_is_u8500() && (dbx500_revision() == 0xB1); +} + +static inline bool cpu_is_u8500v22(void) +{ +	return cpu_is_u8500() && (dbx500_revision() == 0xB2); +} + +static inline bool cpu_is_u8500v20_or_later(void) +{ +	return (cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11()); +} + +/* + * 8540 revisions + */ + +static inline bool __attribute_const__ cpu_is_u8540v10(void) +{ +	return cpu_is_u8540() && dbx500_revision() == 0xA0; +} + +static inline bool __attribute_const__ cpu_is_u8580v10(void) +{ +	return cpu_is_u8580() && dbx500_revision() == 0xA0; +} + +static inline bool ux500_is_svp(void) +{ +	return false; +} + +#define ux500_unknown_soc()	BUG() + +#endif diff --git a/arch/arm/mach-ux500/include/mach/clkdev.h b/arch/arm/mach-ux500/include/mach/clkdev.h deleted file mode 100644 index 04b37a89801..00000000000 --- a/arch/arm/mach-ux500/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 diff --git a/arch/arm/mach-ux500/include/mach/db5500-regs.h b/arch/arm/mach-ux500/include/mach/db5500-regs.h deleted file mode 100644 index 3eafc0e24ba..00000000000 --- a/arch/arm/mach-ux500/include/mach/db5500-regs.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * License terms: GNU General Public License (GPL) version 2 - */ - -#ifndef __MACH_DB5500_REGS_H -#define __MACH_DB5500_REGS_H - -#define U5500_PER1_BASE		0xA0020000 -#define U5500_PER2_BASE		0xA0010000 -#define U5500_PER3_BASE		0x80140000 -#define U5500_PER4_BASE		0x80150000 -#define U5500_PER5_BASE		0x80100000 -#define U5500_PER6_BASE		0x80120000 - -#define U5500_GIC_DIST_BASE	0xA0411000 -#define U5500_GIC_CPU_BASE	0xA0410100 -#define U5500_DMA_BASE		0x90030000 -#define U5500_MCDE_BASE		0xA0400000 -#define U5500_MODEM_BASE	0xB0000000 -#define U5500_L2CC_BASE		0xA0412000 -#define U5500_SCU_BASE		0xA0410000 -#define U5500_DSI1_BASE		0xA0401000 -#define U5500_DSI2_BASE		0xA0402000 -#define U5500_SIA_BASE		0xA0100000 -#define U5500_SVA_BASE		0x80200000 -#define U5500_HSEM_BASE		0xA0000000 -#define U5500_NAND0_BASE	0x60000000 -#define U5500_NAND1_BASE	0x70000000 -#define U5500_TWD_BASE		0xa0410600 -#define U5500_B2R2_BASE		0xa0200000 - -#define U5500_FSMC_BASE		(U5500_PER1_BASE + 0x0000) -#define U5500_SDI0_BASE		(U5500_PER1_BASE + 0x1000) -#define U5500_SDI2_BASE		(U5500_PER1_BASE + 0x2000) -#define U5500_UART0_BASE	(U5500_PER1_BASE + 0x3000) -#define U5500_I2C1_BASE		(U5500_PER1_BASE + 0x4000) -#define U5500_MSP0_BASE		(U5500_PER1_BASE + 0x5000) -#define U5500_GPIO0_BASE	(U5500_PER1_BASE + 0xE000) -#define U5500_CLKRST1_BASE	(U5500_PER1_BASE + 0xF000) - -#define U5500_USBOTG_BASE	(U5500_PER2_BASE + 0x0000) -#define U5500_GPIO1_BASE	(U5500_PER2_BASE + 0xE000) -#define U5500_CLKRST2_BASE	(U5500_PER2_BASE + 0xF000) - -#define U5500_KEYPAD_BASE	(U5500_PER3_BASE + 0x0000) -#define U5500_PWM_BASE		(U5500_PER3_BASE + 0x1000) -#define U5500_GPIO3_BASE	(U5500_PER3_BASE + 0xE000) -#define U5500_CLKRST3_BASE	(U5500_PER3_BASE + 0xF000) - -#define U5500_BACKUPRAM0_BASE	(U5500_PER4_BASE + 0x0000) -#define U5500_BACKUPRAM1_BASE	(U5500_PER4_BASE + 0x1000) -#define U5500_RTT0_BASE		(U5500_PER4_BASE + 0x2000) -#define U5500_RTT1_BASE		(U5500_PER4_BASE + 0x3000) -#define U5500_RTC_BASE		(U5500_PER4_BASE + 0x4000) -#define U5500_SCR_BASE		(U5500_PER4_BASE + 0x5000) -#define U5500_DMC_BASE		(U5500_PER4_BASE + 0x6000) -#define U5500_PRCMU_BASE	(U5500_PER4_BASE + 0x7000) -#define U5500_MSP1_BASE		(U5500_PER4_BASE + 0x9000) -#define U5500_GPIO2_BASE	(U5500_PER4_BASE + 0xA000) -#define U5500_CDETECT_BASE	(U5500_PER4_BASE + 0xF000) - -#define U5500_SPI0_BASE		(U5500_PER5_BASE + 0x0000) -#define U5500_SPI1_BASE		(U5500_PER5_BASE + 0x1000) -#define U5500_SPI2_BASE		(U5500_PER5_BASE + 0x2000) -#define U5500_SPI3_BASE		(U5500_PER5_BASE + 0x3000) -#define U5500_UART1_BASE	(U5500_PER5_BASE + 0x4000) -#define U5500_UART2_BASE	(U5500_PER5_BASE + 0x5000) -#define U5500_UART3_BASE	(U5500_PER5_BASE + 0x6000) -#define U5500_SDI1_BASE		(U5500_PER5_BASE + 0x7000) -#define U5500_SDI3_BASE		(U5500_PER5_BASE + 0x8000) -#define U5500_SDI4_BASE		(U5500_PER5_BASE + 0x9000) -#define U5500_I2C2_BASE		(U5500_PER5_BASE + 0xA000) -#define U5500_I2C3_BASE		(U5500_PER5_BASE + 0xB000) -#define U5500_MSP2_BASE		(U5500_PER5_BASE + 0xC000) -#define U5500_IRDA_BASE		(U5500_PER5_BASE + 0xD000) -#define U5500_IRRC_BASE		(U5500_PER5_BASE + 0x10000) -#define U5500_GPIO4_BASE	(U5500_PER5_BASE + 0x1E000) -#define U5500_CLKRST5_BASE	(U5500_PER5_BASE + 0x1F000) - -#define U5500_RNG_BASE		(U5500_PER6_BASE + 0x0000) -#define U5500_HASH0_BASE	(U5500_PER6_BASE + 0x1000) -#define U5500_HASH1_BASE	(U5500_PER6_BASE + 0x2000) -#define U5500_PKA_BASE		(U5500_PER6_BASE + 0x4000) -#define U5500_PKAM_BASE		(U5500_PER6_BASE + 0x5000) -#define U5500_MTU0_BASE		(U5500_PER6_BASE + 0x6000) -#define U5500_MTU1_BASE		(U5500_PER6_BASE + 0x7000) -#define U5500_CR_BASE		(U5500_PER6_BASE + 0x8000) -#define U5500_CRYP0_BASE	(U5500_PER6_BASE + 0xA000) -#define U5500_CRYP1_BASE	(U5500_PER6_BASE + 0xB000) -#define U5500_CLKRST6_BASE	(U5500_PER6_BASE + 0xF000) - -#define U5500_GPIOBANK0_BASE	U5500_GPIO0_BASE -#define U5500_GPIOBANK1_BASE	(U5500_GPIO0_BASE + 0x80) -#define U5500_GPIOBANK2_BASE	U5500_GPIO1_BASE -#define U5500_GPIOBANK3_BASE	U5500_GPIO2_BASE -#define U5500_GPIOBANK4_BASE	U5500_GPIO3_BASE -#define U5500_GPIOBANK5_BASE	U5500_GPIO4_BASE -#define U5500_GPIOBANK6_BASE	(U5500_GPIO4_BASE + 0x80) -#define U5500_GPIOBANK7_BASE	(U5500_GPIO4_BASE + 0x100) - -#define U5500_MBOX_BASE		(U5500_MODEM_BASE + 0xFFD1000) -#define U5500_MBOX0_PEER_START	(U5500_MBOX_BASE + 0x40) -#define U5500_MBOX0_PEER_END	(U5500_MBOX_BASE + 0x5F) -#define U5500_MBOX0_LOCAL_START	(U5500_MBOX_BASE + 0x60) -#define U5500_MBOX0_LOCAL_END	(U5500_MBOX_BASE + 0x7F) -#define U5500_MBOX1_PEER_START	(U5500_MBOX_BASE + 0x80) -#define U5500_MBOX1_PEER_END	(U5500_MBOX_BASE + 0x9F) -#define U5500_MBOX1_LOCAL_START	(U5500_MBOX_BASE + 0xA0) -#define U5500_MBOX1_LOCAL_END	(U5500_MBOX_BASE + 0xBF) -#define U5500_MBOX2_PEER_START	(U5500_MBOX_BASE + 0x00) -#define U5500_MBOX2_PEER_END	(U5500_MBOX_BASE + 0x1F) -#define U5500_MBOX2_LOCAL_START	(U5500_MBOX_BASE + 0x20) -#define U5500_MBOX2_LOCAL_END	(U5500_MBOX_BASE + 0x3F) - -#endif diff --git a/arch/arm/mach-ux500/include/mach/debug-macro.S b/arch/arm/mach-ux500/include/mach/debug-macro.S deleted file mode 100644 index be7c0f14e31..00000000000 --- a/arch/arm/mach-ux500/include/mach/debug-macro.S +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Debugging macro include header - * - *  Copyright (C) 2009 ST-Ericsson - * - * 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/hardware.h> - -#if CONFIG_UX500_DEBUG_UART > 2 -#error Invalid Ux500 debug UART -#endif - -#define __UX500_UART(n)	UX500_UART##n##_BASE -#define UX500_UART(n)	__UX500_UART(n) -#define UART_BASE	UX500_UART(CONFIG_UX500_DEBUG_UART) - -	.macro	addruart, rp, rv -	ldr	\rp, =UART_BASE				@ no, physical address -	ldr	\rv, =IO_ADDRESS(UART_BASE)		@ yes, virtual address -	.endm - -#include <asm/hardware/debug-pl01x.S> diff --git a/arch/arm/mach-ux500/include/mach/devices.h b/arch/arm/mach-ux500/include/mach/devices.h deleted file mode 100644 index b91a4d1211a..00000000000 --- a/arch/arm/mach-ux500/include/mach/devices.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * License terms: GNU General Public License (GPL) version 2 - */ - -#ifndef __ASM_ARCH_DEVICES_H__ -#define __ASM_ARCH_DEVICES_H__ - -struct platform_device; -struct amba_device; - -extern struct platform_device u5500_gpio_devs[]; -extern struct platform_device u8500_gpio_devs[]; - -extern struct amba_device ux500_pl031_device; -extern struct amba_device u8500_ssp0_device; -extern struct amba_device ux500_uart0_device; -extern struct amba_device ux500_uart1_device; -extern struct amba_device ux500_uart2_device; - -extern struct platform_device ux500_i2c1_device; -extern struct platform_device ux500_i2c2_device; -extern struct platform_device ux500_i2c3_device; - -extern struct platform_device u8500_i2c0_device; -extern struct platform_device u8500_i2c4_device; -extern struct platform_device u8500_dma40_device; -extern struct platform_device ux500_ske_keypad_device; - -extern struct amba_device u8500_sdi0_device; -extern struct amba_device u8500_sdi1_device; -extern struct amba_device u8500_sdi2_device; -extern struct amba_device u8500_sdi3_device; -extern struct amba_device u8500_sdi4_device; -extern struct amba_device u8500_sdi5_device; - -void dma40_u8500ed_fixup(void); - -#endif diff --git a/arch/arm/mach-ux500/include/mach/entry-macro.S b/arch/arm/mach-ux500/include/mach/entry-macro.S deleted file mode 100644 index 60ea88db828..00000000000 --- a/arch/arm/mach-ux500/include/mach/entry-macro.S +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Low-level IRQ helper macros for U8500 platforms - * - * Copyright (C) 2009 ST-Ericsson. - * - * This file is a copy of ARM Realview platform. - *	-just satisfied checkpatch script. - * - * This file is licensed under  the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ -#include <mach/hardware.h> -#include <asm/hardware/gic.h> - -		.macro	disable_fiq -		.endm - -		.macro  get_irqnr_preamble, base, tmp -		ldr     \base, =IO_ADDRESS(UX500_GIC_CPU_BASE) -		.endm - -		.macro  arch_ret_to_user, tmp1, tmp2 -		.endm - -		/* -		 * The interrupt numbering scheme is defined in the -		 * interrupt controller spec.  To wit: -		 * -		 * Interrupts 0-15 are IPI -		 * 16-28 are reserved -		 * 29-31 are local.  We allow 30 to be used for the watchdog. -		 * 32-1020 are global -		 * 1021-1022 are reserved -		 * 1023 is "spurious" (no interrupt) -		 * -		 * For now, we ignore all local interrupts so only return an -		 * interrupt if it's between 30 and 1020. The test_for_ipi -		 * routine below will pick up on IPIs. -		 * -		 * A simple read from the controller will tell us the number -		 * of the highest priority enabled interrupt. We then just -		 * need to check whether it is in the valid range for an -		 * IRQ (30-1020 inclusive). -		 */ - -		.macro  get_irqnr_and_base, irqnr, irqstat, base, tmp - -		/* bits 12-10 = src CPU, 9-0 = int # */ -		ldr     \irqstat, [\base, #GIC_CPU_INTACK] - -		ldr	\tmp, =1021 - -		bic     \irqnr, \irqstat, #0x1c00 - -		cmp     \irqnr, #29 -		cmpcc	\irqnr, \irqnr -		cmpne	\irqnr, \tmp -		cmpcs	\irqnr, \irqnr - -		.endm - -		/* We assume that irqstat (the raw value of the IRQ -		 * acknowledge register) is preserved from the macro above. -		 * If there is an IPI, we immediately signal end of -		 * interrupt on the controller, since this requires the -		 * original irqstat value which we won't easily be able -		 * to recreate later. -		 */ - -		.macro test_for_ipi, irqnr, irqstat, base, tmp -		bic	\irqnr, \irqstat, #0x1c00 -		cmp	\irqnr, #16 -		strcc	\irqstat, [\base, #GIC_CPU_EOI] -		cmpcs	\irqnr, \irqnr -		.endm - -		/* As above, this assumes that irqstat and base -		 * are preserved.. -		 */ - -		.macro test_for_ltirq, irqnr, irqstat, base, tmp -		bic	\irqnr, \irqstat, #0x1c00 -		mov 	\tmp, #0 -		cmp	\irqnr, #29 -		moveq	\tmp, #1 -		streq	\irqstat, [\base, #GIC_CPU_EOI] -		cmp	\tmp, #0 -		.endm diff --git a/arch/arm/mach-ux500/include/mach/gpio.h b/arch/arm/mach-ux500/include/mach/gpio.h deleted file mode 100644 index d548a622e7d..00000000000 --- a/arch/arm/mach-ux500/include/mach/gpio.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef __ASM_ARCH_GPIO_H -#define __ASM_ARCH_GPIO_H - -/* - * 288 (#267 is the highest one actually hooked up) onchip GPIOs, plus enough - * room for a couple of GPIO expanders. - */ -#define ARCH_NR_GPIOS	350 - -#include <plat/gpio.h> - -#define __GPIO_RESOURCE(soc, block)					\ -	{								\ -		.start	= soc##_GPIOBANK##block##_BASE,			\ -		.end	= soc##_GPIOBANK##block##_BASE + 127,		\ -		.flags	= IORESOURCE_MEM,				\ -	},								\ -	{								\ -		.start	= IRQ_GPIO##block,				\ -		.end	= IRQ_GPIO##block,				\ -		.flags	= IORESOURCE_IRQ,				\ -	} - -#define __GPIO_DEVICE(soc, block)					\ -	{								\ -		.name		= "gpio",				\ -		.id		= block,				\ -		.num_resources	= 2,					\ -		.resource	= &soc##_gpio_resources[block * 2],	\ -		.dev = {						\ -			.platform_data = &soc##_gpio_data[block],	\ -		},							\ -	} - -#define GPIO_DATA(_name, first)						\ -	{								\ -		.name		= _name,				\ -		.first_gpio	= first,				\ -		.first_irq	= NOMADIK_GPIO_TO_IRQ(first),		\ -	} - -#ifdef CONFIG_UX500_SOC_DB8500 -#define GPIO_RESOURCE(block)	__GPIO_RESOURCE(U8500, block) -#define GPIO_DEVICE(block)	__GPIO_DEVICE(u8500, block) -#elif defined(CONFIG_UX500_SOC_DB5500) -#define GPIO_RESOURCE(block)	__GPIO_RESOURCE(U5500, block) -#define GPIO_DEVICE(block)	__GPIO_DEVICE(u5500, block) -#endif - -#endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-ux500/include/mach/hardware.h b/arch/arm/mach-ux500/include/mach/hardware.h deleted file mode 100644 index 32e883a8f2a..00000000000 --- a/arch/arm/mach-ux500/include/mach/hardware.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2009 ST-Ericsson. - * - * U8500 hardware definitions - * - * This file is licensed under  the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ -#ifndef __MACH_HARDWARE_H -#define __MACH_HARDWARE_H - -/* macros to get at IO space when running virtually - * We dont map all the peripherals, let ioremap do - * this for us. We map only very basic peripherals here. - */ -#define U8500_IO_VIRTUAL	0xf0000000 -#define U8500_IO_PHYSICAL	0xa0000000 - -/* this macro is used in assembly, so no cast */ -#define IO_ADDRESS(x)           \ -	(((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + U8500_IO_VIRTUAL) - -/* typesafe io address */ -#define __io_address(n)		__io(IO_ADDRESS(n)) -/* used by some plat-nomadik code */ -#define io_p2v(n)		__io_address(n) - -#include <mach/db8500-regs.h> -#include <mach/db5500-regs.h> - -#ifdef CONFIG_UX500_SOC_DB8500 -#define UX500(periph)		U8500_##periph##_BASE -#elif defined(CONFIG_UX500_SOC_DB5500) -#define UX500(periph)		U5500_##periph##_BASE -#endif - -#define UX500_BACKUPRAM0_BASE	UX500(BACKUPRAM0) -#define UX500_BACKUPRAM1_BASE	UX500(BACKUPRAM1) -#define UX500_B2R2_BASE		UX500(B2R2) - -#define UX500_CLKRST1_BASE	UX500(CLKRST1) -#define UX500_CLKRST2_BASE	UX500(CLKRST2) -#define UX500_CLKRST3_BASE	UX500(CLKRST3) -#define UX500_CLKRST5_BASE	UX500(CLKRST5) -#define UX500_CLKRST6_BASE	UX500(CLKRST6) - -#define UX500_DMA_BASE		UX500(DMA) -#define UX500_FSMC_BASE		UX500(FSMC) - -#define UX500_GIC_CPU_BASE	UX500(GIC_CPU) -#define UX500_GIC_DIST_BASE	UX500(GIC_DIST) - -#define UX500_I2C1_BASE		UX500(I2C1) -#define UX500_I2C2_BASE		UX500(I2C2) -#define UX500_I2C3_BASE		UX500(I2C3) - -#define UX500_L2CC_BASE		UX500(L2CC) -#define UX500_MCDE_BASE		UX500(MCDE) -#define UX500_MTU0_BASE		UX500(MTU0) -#define UX500_MTU1_BASE		UX500(MTU1) -#define UX500_PRCMU_BASE	UX500(PRCMU) - -#define UX500_RNG_BASE		UX500(RNG) -#define UX500_RTC_BASE		UX500(RTC) - -#define UX500_SCU_BASE		UX500(SCU) - -#define UX500_SDI0_BASE		UX500(SDI0) -#define UX500_SDI1_BASE		UX500(SDI1) -#define UX500_SDI2_BASE		UX500(SDI2) -#define UX500_SDI3_BASE		UX500(SDI3) -#define UX500_SDI4_BASE		UX500(SDI4) - -#define UX500_SPI0_BASE		UX500(SPI0) -#define UX500_SPI1_BASE		UX500(SPI1) -#define UX500_SPI2_BASE		UX500(SPI2) -#define UX500_SPI3_BASE		UX500(SPI3) - -#define UX500_SIA_BASE		UX500(SIA) -#define UX500_SVA_BASE		UX500(SVA) - -#define UX500_TWD_BASE		UX500(TWD) - -#define UX500_UART0_BASE	UX500(UART0) -#define UX500_UART1_BASE	UX500(UART1) -#define UX500_UART2_BASE	UX500(UART2) - -#define UX500_USBOTG_BASE	UX500(USBOTG) - -/* ST-Ericsson modified pl022 id */ -#define SSP_PER_ID		0x01080022 - -#ifndef __ASSEMBLY__ - -#include <asm/cputype.h> - -static inline bool cpu_is_u8500(void) -{ -#ifdef CONFIG_UX500_SOC_DB8500 -	return 1; -#else -	return 0; -#endif -} - -#define CPUID_DB8500ED	0x410fc090 -#define CPUID_DB8500V1	0x411fc091 -#define CPUID_DB8500V2	0x412fc091 - -static inline bool cpu_is_u8500ed(void) -{ -	return cpu_is_u8500() && (read_cpuid_id() == CPUID_DB8500ED); -} - -static inline bool cpu_is_u8500v1(void) -{ -	return cpu_is_u8500() && (read_cpuid_id() == CPUID_DB8500V1); -} - -static inline bool cpu_is_u8500v2(void) -{ -	return cpu_is_u8500() && (read_cpuid_id() == CPUID_DB8500V2); -} - -#ifdef CONFIG_UX500_SOC_DB8500 -bool cpu_is_u8500v10(void); -bool cpu_is_u8500v11(void); -bool cpu_is_u8500v20(void); -#else -static inline bool cpu_is_u8500v10(void) { return false; } -static inline bool cpu_is_u8500v11(void) { return false; } -static inline bool cpu_is_u8500v20(void) { return false; } -#endif - -static inline bool cpu_is_u5500(void) -{ -#ifdef CONFIG_UX500_SOC_DB5500 -	return 1; -#else -	return 0; -#endif -} - -#endif - -#endif				/* __MACH_HARDWARE_H */ diff --git a/arch/arm/mach-ux500/include/mach/io.h b/arch/arm/mach-ux500/include/mach/io.h deleted file mode 100644 index 1cf3f44ce5b..00000000000 --- a/arch/arm/mach-ux500/include/mach/io.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * arch/arm/mach-u8500/include/mach/io.h - * - * Copyright (C) 1997-1999 Russell King - * - * Modifications: - *  06-12-1997	RMK	Created. - *  07-04-1999	RMK	Major cleanup - */ -#ifndef __ASM_ARM_ARCH_IO_H -#define __ASM_ARM_ARCH_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 diff --git a/arch/arm/mach-ux500/include/mach/irqs-board-mop500.h b/arch/arm/mach-ux500/include/mach/irqs-board-mop500.h deleted file mode 100644 index cca4f705601..00000000000 --- a/arch/arm/mach-ux500/include/mach/irqs-board-mop500.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> - * License terms: GNU General Public License (GPL) version 2 - */ - -#ifndef __MACH_IRQS_BOARD_MOP500_H -#define __MACH_IRQS_BOARD_MOP500_H - -#define AB8500_NR_IRQS			104 - -#define MOP500_AB8500_IRQ_BASE		IRQ_BOARD_START -#define MOP500_AB8500_IRQ_END		(MOP500_AB8500_IRQ_BASE \ -					 + AB8500_NR_IRQS) -#define MOP500_IRQ_END			MOP500_AB8500_IRQ_END - -#if MOP500_IRQ_END > IRQ_BOARD_END -#undef IRQ_BOARD_END -#define IRQ_BOARD_END	MOP500_IRQ_END -#endif - -#endif diff --git a/arch/arm/mach-ux500/include/mach/irqs-db5500.h b/arch/arm/mach-ux500/include/mach/irqs-db5500.h deleted file mode 100644 index bfa123dbec3..00000000000 --- a/arch/arm/mach-ux500/include/mach/irqs-db5500.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> - * License terms: GNU General Public License (GPL) version 2 - */ - -#ifndef __MACH_IRQS_DB5500_H -#define __MACH_IRQS_DB5500_H - -#define IRQ_DB5500_MTU0			(IRQ_SHPI_START + 4) -#define IRQ_DB5500_SPI2			(IRQ_SHPI_START + 6) -#define IRQ_DB5500_PMU0			(IRQ_SHPI_START + 7) -#define IRQ_DB5500_SPI0			(IRQ_SHPI_START + 8) -#define IRQ_DB5500_RTT			(IRQ_SHPI_START + 9) -#define IRQ_DB5500_PKA			(IRQ_SHPI_START + 10) -#define IRQ_DB5500_UART0		(IRQ_SHPI_START + 11) -#define IRQ_DB5500_I2C3			(IRQ_SHPI_START + 12) -#define IRQ_DB5500_L2CC			(IRQ_SHPI_START + 13) -#define IRQ_DB5500_MSP0			(IRQ_SHPI_START + 14) -#define IRQ_DB5500_CRYP1		(IRQ_SHPI_START + 15) -#define IRQ_DB5500_PMU1			(IRQ_SHPI_START + 16) -#define IRQ_DB5500_MTU1			(IRQ_SHPI_START + 17) -#define IRQ_DB5500_RTC			(IRQ_SHPI_START + 18) -#define IRQ_DB5500_UART1		(IRQ_SHPI_START + 19) -#define IRQ_DB5500_USB_WAKEUP		(IRQ_SHPI_START + 20) -#define IRQ_DB5500_I2C0			(IRQ_SHPI_START + 21) -#define IRQ_DB5500_I2C1			(IRQ_SHPI_START + 22) -#define IRQ_DB5500_USBOTG		(IRQ_SHPI_START + 23) -#define IRQ_DB5500_DMA_SECURE		(IRQ_SHPI_START + 24) -#define IRQ_DB5500_DMA			(IRQ_SHPI_START + 25) -#define IRQ_DB5500_UART2		(IRQ_SHPI_START + 26) -#define IRQ_DB5500_ICN_PMU1		(IRQ_SHPI_START + 27) -#define IRQ_DB5500_ICN_PMU2		(IRQ_SHPI_START + 28) -#define IRQ_DB5500_UART3		(IRQ_SHPI_START + 29) -#define IRQ_DB5500_SPI3			(IRQ_SHPI_START + 30) -#define IRQ_DB5500_SDMMC4		(IRQ_SHPI_START + 31) -#define IRQ_DB5500_IRRC			(IRQ_SHPI_START + 33) -#define IRQ_DB5500_IRDA_FT		(IRQ_SHPI_START + 34) -#define IRQ_DB5500_IRDA_SD		(IRQ_SHPI_START + 35) -#define IRQ_DB5500_IRDA_FI		(IRQ_SHPI_START + 36) -#define IRQ_DB5500_IRDA_FD		(IRQ_SHPI_START + 37) -#define IRQ_DB5500_FSMC_CODEREADY	(IRQ_SHPI_START + 38) -#define IRQ_DB5500_FSMC_NANDWAIT	(IRQ_SHPI_START + 39) -#define IRQ_DB5500_AB5500		(IRQ_SHPI_START + 40) -#define IRQ_DB5500_SDMMC2		(IRQ_SHPI_START + 41) -#define IRQ_DB5500_SIA			(IRQ_SHPI_START + 42) -#define IRQ_DB5500_SIA2			(IRQ_SHPI_START + 43) -#define IRQ_DB5500_HVA			(IRQ_SHPI_START + 44) -#define IRQ_DB5500_HVA2			(IRQ_SHPI_START + 45) -#define IRQ_DB5500_PRCMU0		(IRQ_SHPI_START + 46) -#define IRQ_DB5500_PRCMU1		(IRQ_SHPI_START + 47) -#define IRQ_DB5500_DISP			(IRQ_SHPI_START + 48) -#define IRQ_DB5500_SDMMC1		(IRQ_SHPI_START + 50) -#define IRQ_DB5500_MSP1			(IRQ_SHPI_START + 52) -#define IRQ_DB5500_KBD			(IRQ_SHPI_START + 53) -#define IRQ_DB5500_I2C2			(IRQ_SHPI_START + 55) -#define IRQ_DB5500_B2R2			(IRQ_SHPI_START + 56) -#define IRQ_DB5500_CRYP0		(IRQ_SHPI_START + 57) -#define IRQ_DB5500_SDMMC3		(IRQ_SHPI_START + 59) -#define IRQ_DB5500_SDMMC0		(IRQ_SHPI_START + 60) -#define IRQ_DB5500_HSEM			(IRQ_SHPI_START + 61) -#define IRQ_DB5500_SBAG			(IRQ_SHPI_START + 63) -#define IRQ_DB5500_MODEM		(IRQ_SHPI_START + 65) -#define IRQ_DB5500_SPI1			(IRQ_SHPI_START + 96) -#define IRQ_DB5500_MSP2			(IRQ_SHPI_START + 98) -#define IRQ_DB5500_SRPTIMER		(IRQ_SHPI_START + 101) -#define IRQ_DB5500_CTI0			(IRQ_SHPI_START + 108) -#define IRQ_DB5500_CTI1			(IRQ_SHPI_START + 109) -#define IRQ_DB5500_ICN_ERR		(IRQ_SHPI_START + 110) -#define IRQ_DB5500_MALI_PPMMU		(IRQ_SHPI_START + 112) -#define IRQ_DB5500_MALI_PP		(IRQ_SHPI_START + 113) -#define IRQ_DB5500_MALI_GPMMU		(IRQ_SHPI_START + 114) -#define IRQ_DB5500_MALI_GP		(IRQ_SHPI_START + 115) -#define IRQ_DB5500_MALI			(IRQ_SHPI_START + 116) -#define IRQ_DB5500_PRCMU_SEM		(IRQ_SHPI_START + 118) -#define IRQ_DB5500_GPIO0		(IRQ_SHPI_START + 119) -#define IRQ_DB5500_GPIO1		(IRQ_SHPI_START + 120) -#define IRQ_DB5500_GPIO2		(IRQ_SHPI_START + 121) -#define IRQ_DB5500_GPIO3		(IRQ_SHPI_START + 122) -#define IRQ_DB5500_GPIO4		(IRQ_SHPI_START + 123) -#define IRQ_DB5500_GPIO5		(IRQ_SHPI_START + 124) -#define IRQ_DB5500_GPIO6		(IRQ_SHPI_START + 125) -#define IRQ_DB5500_GPIO7		(IRQ_SHPI_START + 126) - -#endif diff --git a/arch/arm/mach-ux500/include/mach/irqs-db8500.h b/arch/arm/mach-ux500/include/mach/irqs-db8500.h deleted file mode 100644 index 8b5d9f0a163..00000000000 --- a/arch/arm/mach-ux500/include/mach/irqs-db8500.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> - * License terms: GNU General Public License (GPL) version 2 - */ - -#ifndef __MACH_IRQS_DB8500_H -#define __MACH_IRQS_DB8500_H - -#define IRQ_DB8500_MTU0			(IRQ_SHPI_START + 4) -#define IRQ_DB8500_SPI2			(IRQ_SHPI_START + 6) -#define IRQ_DB8500_PMU			(IRQ_SHPI_START + 7) -#define IRQ_DB8500_SPI0			(IRQ_SHPI_START + 8) -#define IRQ_DB8500_RTT			(IRQ_SHPI_START + 9) -#define IRQ_DB8500_PKA			(IRQ_SHPI_START + 10) -#define IRQ_DB8500_UART0		(IRQ_SHPI_START + 11) -#define IRQ_DB8500_I2C3			(IRQ_SHPI_START + 12) -#define IRQ_DB8500_L2CC			(IRQ_SHPI_START + 13) -#define IRQ_DB8500_SSP0			(IRQ_SHPI_START + 14) -#define IRQ_DB8500_CRYP1		(IRQ_SHPI_START + 15) -#define IRQ_DB8500_MSP1_RX		(IRQ_SHPI_START + 16) -#define IRQ_DB8500_MTU1			(IRQ_SHPI_START + 17) -#define IRQ_DB8500_RTC			(IRQ_SHPI_START + 18) -#define IRQ_DB8500_UART1		(IRQ_SHPI_START + 19) -#define IRQ_DB8500_USB_WAKEUP		(IRQ_SHPI_START + 20) -#define IRQ_DB8500_I2C0			(IRQ_SHPI_START + 21) -#define IRQ_DB8500_I2C1			(IRQ_SHPI_START + 22) -#define IRQ_DB8500_USBOTG		(IRQ_SHPI_START + 23) -#define IRQ_DB8500_DMA_SECURE		(IRQ_SHPI_START + 24) -#define IRQ_DB8500_DMA			(IRQ_SHPI_START + 25) -#define IRQ_DB8500_UART2		(IRQ_SHPI_START + 26) -#define IRQ_DB8500_ICN_PMU1		(IRQ_SHPI_START + 27) -#define IRQ_DB8500_ICN_PMU2		(IRQ_SHPI_START + 28) -#define IRQ_DB8500_HSIR_EXCEP		(IRQ_SHPI_START + 29) -#define IRQ_DB8500_MSP0			(IRQ_SHPI_START + 31) -#define IRQ_DB8500_HSIR_CH0_OVRRUN	(IRQ_SHPI_START + 32) -#define IRQ_DB8500_HSIR_CH1_OVRRUN	(IRQ_SHPI_START + 33) -#define IRQ_DB8500_HSIR_CH2_OVRRUN	(IRQ_SHPI_START + 34) -#define IRQ_DB8500_HSIR_CH3_OVRRUN	(IRQ_SHPI_START + 35) -#define IRQ_DB8500_HSIR_CH4_OVRRUN	(IRQ_SHPI_START + 36) -#define IRQ_DB8500_HSIR_CH5_OVRRUN	(IRQ_SHPI_START + 37) -#define IRQ_DB8500_HSIR_CH6_OVRRUN	(IRQ_SHPI_START + 38) -#define IRQ_DB8500_HSIR_CH7_OVRRUN	(IRQ_SHPI_START + 39) -#define IRQ_DB8500_AB8500		(IRQ_SHPI_START + 40) -#define IRQ_DB8500_SDMMC2		(IRQ_SHPI_START + 41) -#define IRQ_DB8500_SIA			(IRQ_SHPI_START + 42) -#define IRQ_DB8500_SIA2			(IRQ_SHPI_START + 43) -#define IRQ_DB8500_SVA			(IRQ_SHPI_START + 44) -#define IRQ_DB8500_SVA2			(IRQ_SHPI_START + 45) -#define IRQ_DB8500_PRCMU0		(IRQ_SHPI_START + 46) -#define IRQ_DB8500_PRCMU1		(IRQ_SHPI_START + 47) -#define IRQ_DB8500_DISP			(IRQ_SHPI_START + 48) -#define IRQ_DB8500_SPI3			(IRQ_SHPI_START + 49) -#define IRQ_DB8500_SDMMC1		(IRQ_SHPI_START + 50) -#define IRQ_DB8500_I2C4			(IRQ_SHPI_START + 51) -#define IRQ_DB8500_SSP1			(IRQ_SHPI_START + 52) -#define IRQ_DB8500_SKE			(IRQ_SHPI_START + 53) -#define IRQ_DB8500_KB			(IRQ_SHPI_START + 54) -#define IRQ_DB8500_I2C2			(IRQ_SHPI_START + 55) -#define IRQ_DB8500_B2R2			(IRQ_SHPI_START + 56) -#define IRQ_DB8500_CRYP0		(IRQ_SHPI_START + 57) -#define IRQ_DB8500_SDMMC3		(IRQ_SHPI_START + 59) -#define IRQ_DB8500_SDMMC0		(IRQ_SHPI_START + 60) -#define IRQ_DB8500_HSEM			(IRQ_SHPI_START + 61) -#define IRQ_DB8500_MSP1			(IRQ_SHPI_START + 62) -#define IRQ_DB8500_SBAG			(IRQ_SHPI_START + 63) -#define IRQ_DB8500_SPI1			(IRQ_SHPI_START + 96) -#define IRQ_DB8500_SRPTIMER		(IRQ_SHPI_START + 97) -#define IRQ_DB8500_MSP2			(IRQ_SHPI_START + 98) -#define IRQ_DB8500_SDMMC4		(IRQ_SHPI_START + 99) -#define IRQ_DB8500_SDMMC5		(IRQ_SHPI_START + 100) -#define IRQ_DB8500_HSIRD0		(IRQ_SHPI_START + 104) -#define IRQ_DB8500_HSIRD1		(IRQ_SHPI_START + 105) -#define IRQ_DB8500_HSITD0		(IRQ_SHPI_START + 106) -#define IRQ_DB8500_HSITD1		(IRQ_SHPI_START + 107) -#define IRQ_DB8500_CTI0			(IRQ_SHPI_START + 108) -#define IRQ_DB8500_CTI1			(IRQ_SHPI_START + 109) -#define IRQ_DB8500_ICN_ERR		(IRQ_SHPI_START + 110) -#define IRQ_DB8500_MALI_PPMMU		(IRQ_SHPI_START + 112) -#define IRQ_DB8500_MALI_PP		(IRQ_SHPI_START + 113) -#define IRQ_DB8500_MALI_GPMMU		(IRQ_SHPI_START + 114) -#define IRQ_DB8500_MALI_GP		(IRQ_SHPI_START + 115) -#define IRQ_DB8500_MALI			(IRQ_SHPI_START + 116) -#define IRQ_DB8500_PRCMU_SEM		(IRQ_SHPI_START + 118) -#define IRQ_DB8500_GPIO0		(IRQ_SHPI_START + 119) -#define IRQ_DB8500_GPIO1		(IRQ_SHPI_START + 120) -#define IRQ_DB8500_GPIO2		(IRQ_SHPI_START + 121) -#define IRQ_DB8500_GPIO3		(IRQ_SHPI_START + 122) -#define IRQ_DB8500_GPIO4		(IRQ_SHPI_START + 123) -#define IRQ_DB8500_GPIO5		(IRQ_SHPI_START + 124) -#define IRQ_DB8500_GPIO6		(IRQ_SHPI_START + 125) -#define IRQ_DB8500_GPIO7		(IRQ_SHPI_START + 126) -#define IRQ_DB8500_GPIO8		(IRQ_SHPI_START + 127) - -#endif diff --git a/arch/arm/mach-ux500/include/mach/irqs.h b/arch/arm/mach-ux500/include/mach/irqs.h deleted file mode 100644 index 693aa57de88..00000000000 --- a/arch/arm/mach-ux500/include/mach/irqs.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - *  Copyright (C) 2008 STMicroelectronics - *  Copyright (C) 2009 ST-Ericsson. - * - * 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_IRQS_H -#define ASM_ARCH_IRQS_H - -#include <mach/irqs-db5500.h> -#include <mach/irqs-db8500.h> - -#define IRQ_LOCALTIMER                  29 -#define IRQ_LOCALWDOG                   30 - -/* Shared Peripheral Interrupt (SHPI) */ -#define IRQ_SHPI_START			32 - -/* Interrupt numbers generic for shared peripheral */ -#define IRQ_MTU0		(IRQ_SHPI_START + 4) -#define IRQ_SPI2		(IRQ_SHPI_START + 6) -#define IRQ_SPI0		(IRQ_SHPI_START + 8) -#define IRQ_UART0		(IRQ_SHPI_START + 11) -#define IRQ_I2C3		(IRQ_SHPI_START + 12) -#define IRQ_SSP0		(IRQ_SHPI_START + 14) -#define IRQ_MTU1		(IRQ_SHPI_START + 17) -#define IRQ_RTC_RTT		(IRQ_SHPI_START + 18) -#define IRQ_UART1		(IRQ_SHPI_START + 19) -#define IRQ_I2C0		(IRQ_SHPI_START + 21) -#define IRQ_I2C1		(IRQ_SHPI_START + 22) -#define IRQ_USBOTG		(IRQ_SHPI_START + 23) -#define IRQ_DMA			(IRQ_SHPI_START + 25) -#define IRQ_UART2		(IRQ_SHPI_START + 26) -#define IRQ_HSIR_EXCEP		(IRQ_SHPI_START + 29) -#define IRQ_MSP0		(IRQ_SHPI_START + 31) -#define IRQ_HSIR_CH0_OVRRUN	(IRQ_SHPI_START + 32) -#define IRQ_HSIR_CH1_OVRRUN	(IRQ_SHPI_START + 33) -#define IRQ_HSIR_CH2_OVRRUN	(IRQ_SHPI_START + 34) -#define IRQ_HSIR_CH3_OVRRUN	(IRQ_SHPI_START + 35) -#define IRQ_AB8500		(IRQ_SHPI_START + 40) -#define IRQ_PRCMU               (IRQ_SHPI_START + 47) -#define IRQ_DISP		(IRQ_SHPI_START + 48) -#define IRQ_SiPI3		(IRQ_SHPI_START + 49) -#define IRQ_I2C4		(IRQ_SHPI_START + 51) -#define IRQ_SSP1		(IRQ_SHPI_START + 52) -#define IRQ_I2C2		(IRQ_SHPI_START + 55) -#define IRQ_SDMMC0		(IRQ_SHPI_START + 60) -#define IRQ_MSP1		(IRQ_SHPI_START + 62) -#define IRQ_SPI1		(IRQ_SHPI_START + 96) -#define IRQ_MSP2		(IRQ_SHPI_START + 98) -#define IRQ_SDMMC4		(IRQ_SHPI_START + 99) -#define IRQ_HSIRD0		(IRQ_SHPI_START + 104) -#define IRQ_HSIRD1		(IRQ_SHPI_START + 105) -#define IRQ_HSITD0		(IRQ_SHPI_START + 106) -#define IRQ_HSITD1		(IRQ_SHPI_START + 107) -#define IRQ_GPIO0		(IRQ_SHPI_START + 119) -#define IRQ_GPIO1		(IRQ_SHPI_START + 120) -#define IRQ_GPIO2		(IRQ_SHPI_START + 121) -#define IRQ_GPIO3		(IRQ_SHPI_START + 122) -#define IRQ_GPIO4		(IRQ_SHPI_START + 123) -#define IRQ_GPIO5		(IRQ_SHPI_START + 124) -#define IRQ_GPIO6		(IRQ_SHPI_START + 125) -#define IRQ_GPIO7		(IRQ_SHPI_START + 126) -#define IRQ_GPIO8		(IRQ_SHPI_START + 127) - -/* There are 128 shared peripheral interrupts assigned to - * INTID[160:32]. The first 32 interrupts are reserved. - */ -#define DBX500_NR_INTERNAL_IRQS		161 - -/* After chip-specific IRQ numbers we have the GPIO ones */ -#define NOMADIK_NR_GPIO			288 -#define NOMADIK_GPIO_TO_IRQ(gpio)	((gpio) + DBX500_NR_INTERNAL_IRQS) -#define NOMADIK_IRQ_TO_GPIO(irq)	((irq) - DBX500_NR_INTERNAL_IRQS) -#define IRQ_BOARD_START			NOMADIK_GPIO_TO_IRQ(NOMADIK_NR_GPIO) - -/* This will be overridden by board-specific irq headers */ -#define IRQ_BOARD_END			IRQ_BOARD_START - -#ifdef CONFIG_MACH_U8500_MOP -#include <mach/irqs-board-mop500.h> -#endif - -/* - * After the board specific IRQ:s we reserve a range of IRQ:s in which virtual - * IRQ:s representing modem IRQ:s can be allocated - */ -#define IRQ_MODEM_EVENTS_BASE (IRQ_BOARD_END + 1) -#define IRQ_MODEM_EVENTS_NBR 72 -#define IRQ_MODEM_EVENTS_END (IRQ_MODEM_EVENTS_BASE + IRQ_MODEM_EVENTS_NBR) - -/* List of virtual IRQ:s that are allocated from the range above */ -#define MBOX_PAIR0_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 43) -#define MBOX_PAIR1_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 45) -#define MBOX_PAIR2_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 41) - -#define NR_IRQS				IRQ_MODEM_EVENTS_END - -#endif /* ASM_ARCH_IRQS_H */ diff --git a/arch/arm/mach-ux500/include/mach/mbox.h b/arch/arm/mach-ux500/include/mach/mbox.h deleted file mode 100644 index 7f9da4d2fbd..00000000000 --- a/arch/arm/mach-ux500/include/mach/mbox.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * Author: Stefan Nilsson <stefan.xk.nilsson@stericsson.com> for ST-Ericsson. - * Author: Martin Persson <martin.persson@stericsson.com> for ST-Ericsson. - * License terms: GNU General Public License (GPL), version 2. - */ - -#ifndef __INC_STE_MBOX_H -#define __INC_STE_MBOX_H - -#define MBOX_BUF_SIZE 16 -#define MBOX_NAME_SIZE 8 - -/** -  * mbox_recv_cb_t - Definition of the mailbox callback. -  * @mbox_msg:	The mailbox message. -  * @priv:	The clients private data as specified in the call to mbox_setup. -  * -  * This function will be called upon reception of new mailbox messages. -  */ -typedef void mbox_recv_cb_t (u32 mbox_msg, void *priv); - -/** -  * struct mbox - Mailbox instance struct -  * @list:		Linked list head. -  * @pdev:		Pointer to device struct. -  * @cb:		Callback function. Will be called -  *			when new data is received. -  * @client_data:	Clients private data. Will be sent back -  *			in the callback function. -  * @virtbase_peer:	Virtual address for outgoing mailbox. -  * @virtbase_local:	Virtual address for incoming mailbox. -  * @buffer:		Then internal queue for outgoing messages. -  * @name:		Name of this mailbox. -  * @buffer_available:	Completion variable to achieve "blocking send". -  *			This variable will be signaled when there is -  *			internal buffer space available. -  * @client_blocked:	To keep track if any client is currently -  *			blocked. -  * @lock:		Spinlock to protect this mailbox instance. -  * @write_index:	Index in internal buffer to write to. -  * @read_index:	Index in internal buffer to read from. -  * @allocated:		Indicates whether this particular mailbox -  *			id has been allocated by someone. -  */ -struct mbox { -	struct list_head list; -	struct platform_device *pdev; -	mbox_recv_cb_t *cb; -	void *client_data; -	void __iomem *virtbase_peer; -	void __iomem *virtbase_local; -	u32 buffer[MBOX_BUF_SIZE]; -	char name[MBOX_NAME_SIZE]; -	struct completion buffer_available; -	u8 client_blocked; -	spinlock_t lock; -	u8 write_index; -	u8 read_index; -	bool allocated; -}; - -/** -  * mbox_setup - Set up a mailbox and return its instance. -  * @mbox_id:	The ID number of the mailbox. 0 or 1 for modem CPU, -  *		2 for modem DSP. -  * @mbox_cb:	Pointer to the callback function to be called when a new message -  *		is received. -  * @priv:	Client user data which will be returned in the callback. -  * -  * Returns a mailbox instance to be specified in subsequent calls to mbox_send. -  */ -struct mbox *mbox_setup(u8 mbox_id, mbox_recv_cb_t *mbox_cb, void *priv); - -/** -  * mbox_send - Send a mailbox message. -  * @mbox:	Mailbox instance (returned by mbox_setup) -  * @mbox_msg:	The mailbox message to send. -  * @block:	Specifies whether this call will block until send is possible, -  *		or return an error if the mailbox buffer is full. -  * -  * Returns 0 on success or a negative error code on error. -ENOMEM indicates -  * that the internal buffer is full and you have to try again later (or -  * specify "block" in order to block until send is possible). -  */ -int mbox_send(struct mbox *mbox, u32 mbox_msg, bool block); - -#endif /*INC_STE_MBOX_H*/ diff --git a/arch/arm/mach-ux500/include/mach/memory.h b/arch/arm/mach-ux500/include/mach/memory.h deleted file mode 100644 index 510571a59e2..00000000000 --- a/arch/arm/mach-ux500/include/mach/memory.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) 2009 ST-Ericsson - * - * 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_MEMORY_H -#define __ASM_ARCH_MEMORY_H - -/* - * Physical DRAM offset. - */ -#define PHYS_OFFSET	UL(0x00000000) -#define BUS_OFFSET	UL(0x00000000) - -#endif diff --git a/arch/arm/mach-ux500/include/mach/prcmu-regs.h b/arch/arm/mach-ux500/include/mach/prcmu-regs.h deleted file mode 100644 index 8885f39a642..00000000000 --- a/arch/arm/mach-ux500/include/mach/prcmu-regs.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2009 ST-Ericsson SA - * - * 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 __MACH_PRCMU_REGS_H -#define __MACH_PRCMU_REGS_H - -#include <mach/hardware.h> - -#define _PRCMU_BASE		IO_ADDRESS(U8500_PRCMU_BASE) - -#define PRCM_ARM_PLLDIVPS	(_PRCMU_BASE + 0x118) -#define PRCM_ARM_CHGCLKREQ	(_PRCMU_BASE + 0x114) -#define PRCM_PLLARM_ENABLE	(_PRCMU_BASE + 0x98) -#define PRCM_ARMCLKFIX_MGT	(_PRCMU_BASE + 0x0) -#define PRCM_A9_RESETN_CLR	(_PRCMU_BASE + 0x1f4) -#define PRCM_A9_RESETN_SET	(_PRCMU_BASE + 0x1f0) -#define PRCM_ARM_LS_CLAMP	(_PRCMU_BASE + 0x30c) -#define PRCM_SRAM_A9		(_PRCMU_BASE + 0x308) - -/* ARM WFI Standby signal register */ -#define PRCM_ARM_WFI_STANDBY    (_PRCMU_BASE + 0x130) -#define PRCMU_IOCR              (_PRCMU_BASE + 0x310) - -/* CPU mailbox registers */ -#define PRCM_MBOX_CPU_VAL	(_PRCMU_BASE + 0x0fc) -#define PRCM_MBOX_CPU_SET	(_PRCMU_BASE + 0x100) -#define PRCM_MBOX_CPU_CLR	(_PRCMU_BASE + 0x104) - -/* Dual A9 core interrupt management unit registers */ -#define PRCM_A9_MASK_REQ	(_PRCMU_BASE + 0x328) -#define PRCM_A9_MASK_ACK	(_PRCMU_BASE + 0x32c) -#define PRCM_ARMITMSK31TO0	(_PRCMU_BASE + 0x11c) -#define PRCM_ARMITMSK63TO32	(_PRCMU_BASE + 0x120) -#define PRCM_ARMITMSK95TO64	(_PRCMU_BASE + 0x124) -#define PRCM_ARMITMSK127TO96	(_PRCMU_BASE + 0x128) -#define PRCM_POWER_STATE_VAL	(_PRCMU_BASE + 0x25C) -#define PRCM_ARMITVAL31TO0	(_PRCMU_BASE + 0x260) -#define PRCM_ARMITVAL63TO32	(_PRCMU_BASE + 0x264) -#define PRCM_ARMITVAL95TO64	(_PRCMU_BASE + 0x268) -#define PRCM_ARMITVAL127TO96	(_PRCMU_BASE + 0x26C) - -#define PRCM_HOSTACCESS_REQ	(_PRCMU_BASE + 0x334) -#define ARM_WAKEUP_MODEM	0x1 - -#define PRCM_ARM_IT1_CLEAR	(_PRCMU_BASE + 0x48C) -#define PRCM_ARM_IT1_VAL	(_PRCMU_BASE + 0x494) -#define PRCM_HOLD_EVT		(_PRCMU_BASE + 0x174) - -#define PRCM_ITSTATUS0		(_PRCMU_BASE + 0x148) -#define PRCM_ITSTATUS1		(_PRCMU_BASE + 0x150) -#define PRCM_ITSTATUS2		(_PRCMU_BASE + 0x158) -#define PRCM_ITSTATUS3		(_PRCMU_BASE + 0x160) -#define PRCM_ITSTATUS4		(_PRCMU_BASE + 0x168) -#define PRCM_ITSTATUS5		(_PRCMU_BASE + 0x484) -#define PRCM_ITCLEAR5		(_PRCMU_BASE + 0x488) -#define PRCM_ARMIT_MASKXP70_IT	(_PRCMU_BASE + 0x1018) - -/* System reset register */ -#define PRCM_APE_SOFTRST	(_PRCMU_BASE + 0x228) - -/* Level shifter and clamp control registers */ -#define PRCM_MMIP_LS_CLAMP_SET     (_PRCMU_BASE + 0x420) -#define PRCM_MMIP_LS_CLAMP_CLR     (_PRCMU_BASE + 0x424) - -/* PRCMU clock/PLL/reset registers */ -#define PRCM_PLLDSI_FREQ           (_PRCMU_BASE + 0x500) -#define PRCM_PLLDSI_ENABLE         (_PRCMU_BASE + 0x504) -#define PRCM_LCDCLK_MGT            (_PRCMU_BASE + 0x044) -#define PRCM_MCDECLK_MGT           (_PRCMU_BASE + 0x064) -#define PRCM_HDMICLK_MGT           (_PRCMU_BASE + 0x058) -#define PRCM_TVCLK_MGT             (_PRCMU_BASE + 0x07c) -#define PRCM_DSI_PLLOUT_SEL        (_PRCMU_BASE + 0x530) -#define PRCM_DSITVCLK_DIV          (_PRCMU_BASE + 0x52C) -#define PRCM_APE_RESETN_SET        (_PRCMU_BASE + 0x1E4) -#define PRCM_APE_RESETN_CLR        (_PRCMU_BASE + 0x1E8) - -/* ePOD and memory power signal control registers */ -#define PRCM_EPOD_C_SET            (_PRCMU_BASE + 0x410) -#define PRCM_SRAM_LS_SLEEP         (_PRCMU_BASE + 0x304) - -/* Debug power control unit registers */ -#define PRCM_POWER_STATE_SET       (_PRCMU_BASE + 0x254) - -/* Miscellaneous unit registers */ -#define PRCM_DSI_SW_RESET          (_PRCMU_BASE + 0x324) - -#endif /* __MACH_PRCMU__REGS_H */ diff --git a/arch/arm/mach-ux500/include/mach/prcmu.h b/arch/arm/mach-ux500/include/mach/prcmu.h deleted file mode 100644 index 549843ff6db..00000000000 --- a/arch/arm/mach-ux500/include/mach/prcmu.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) STMicroelectronics 2009 - * Copyright (C) ST-Ericsson SA 2010 - * - * License Terms: GNU General Public License v2 - * - * PRCMU f/w APIs - */ -#ifndef __MACH_PRCMU_H -#define __MACH_PRCMU_H - -int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); -int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); - -#endif /* __MACH_PRCMU_H */ diff --git a/arch/arm/mach-ux500/include/mach/smp.h b/arch/arm/mach-ux500/include/mach/smp.h deleted file mode 100644 index 197e8417375..00000000000 --- a/arch/arm/mach-ux500/include/mach/smp.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is based ARM realview platform. - * Copyright (C) ARM Limited. - * - * This file is licensed under  the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ -#ifndef ASMARM_ARCH_SMP_H -#define ASMARM_ARCH_SMP_H - -#include <asm/hardware/gic.h> -#include <asm/smp_mpidr.h> - -/* This is required to wakeup the secondary core */ -extern void u8500_secondary_startup(void); - -/* - * We use IRQ1 as the IPI - */ -static inline void smp_cross_call(const struct cpumask *mask) -{ -	gic_raise_softirq(mask, 1); -} -#endif diff --git a/arch/arm/mach-ux500/include/mach/system.h b/arch/arm/mach-ux500/include/mach/system.h deleted file mode 100644 index c0cd8006f1a..00000000000 --- a/arch/arm/mach-ux500/include/mach/system.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2009 ST-Ericsson. - * - * This file is licensed under  the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ -#ifndef __ASM_ARCH_SYSTEM_H -#define __ASM_ARCH_SYSTEM_H - -static inline void arch_idle(void) -{ -	/* -	 * This should do all the clock switching -	 * and wait for interrupt tricks -	 */ -	cpu_do_idle(); -} - -static inline void arch_reset(char mode, const char *cmd) -{ -	/* yet to be implemented - TODO */ -} - -#endif diff --git a/arch/arm/mach-ux500/include/mach/timex.h b/arch/arm/mach-ux500/include/mach/timex.h deleted file mode 100644 index d0942c17401..00000000000 --- a/arch/arm/mach-ux500/include/mach/timex.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __ASM_ARCH_TIMEX_H -#define __ASM_ARCH_TIMEX_H - -#define CLOCK_TICK_RATE		110000000 - -#endif diff --git a/arch/arm/mach-ux500/include/mach/uncompress.h b/arch/arm/mach-ux500/include/mach/uncompress.h deleted file mode 100644 index 0271ca0a83d..00000000000 --- a/arch/arm/mach-ux500/include/mach/uncompress.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - *  Copyright (C) 2009 ST-Ericsson - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#ifndef __ASM_ARCH_UNCOMPRESS_H -#define __ASM_ARCH_UNCOMPRESS_H - -#include <asm/setup.h> -#include <linux/io.h> -#include <mach/hardware.h> - -#define U8500_UART_DR		0x80007000 -#define U8500_UART_LCRH		0x8000702c -#define U8500_UART_CR		0x80007030 -#define U8500_UART_FR		0x80007018 - -static void putc(const char c) -{ -	/* Do nothing if the UART is not enabled. */ -	if (!(__raw_readb(U8500_UART_CR) & 0x1)) -		return; - -	if (c == '\n') -		putc('\r'); - -	while (__raw_readb(U8500_UART_FR) & (1 << 5)) -		barrier(); -	__raw_writeb(c, U8500_UART_DR); -} - -static void flush(void) -{ -	if (!(__raw_readb(U8500_UART_CR) & 0x1)) -		return; -	while (__raw_readb(U8500_UART_FR) & (1 << 3)) -		barrier(); -} - -static inline void arch_decomp_setup(void) -{ -} - -#define arch_decomp_wdog() /* nothing to do here */ - -#endif /* __ASM_ARCH_UNCOMPRESS_H */ diff --git a/arch/arm/mach-ux500/include/mach/vmalloc.h b/arch/arm/mach-ux500/include/mach/vmalloc.h deleted file mode 100644 index a4945cb4117..00000000000 --- a/arch/arm/mach-ux500/include/mach/vmalloc.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - *  Copyright (C) 2009 ST-Ericsson - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#define VMALLOC_END	0xf0000000UL diff --git a/arch/arm/mach-ux500/localtimer.c b/arch/arm/mach-ux500/localtimer.c deleted file mode 100644 index 2288f6a7c51..00000000000 --- a/arch/arm/mach-ux500/localtimer.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2008-2009 ST-Ericsson - * Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> - * - * This file is heavily based on relaview platform, almost a copy. - * - * Copyright (C) 2002 ARM Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#include <linux/init.h> -#include <linux/smp.h> -#include <linux/clockchips.h> - -#include <asm/irq.h> -#include <asm/smp_twd.h> -#include <asm/localtimer.h> - -/* - * Setup the local clock events for a CPU. - */ -void __cpuinit local_timer_setup(struct clock_event_device *evt) -{ -	evt->irq = IRQ_LOCALTIMER; -	twd_timer_setup(evt); -} diff --git a/arch/arm/mach-ux500/mbox.c b/arch/arm/mach-ux500/mbox.c deleted file mode 100644 index 63435389c54..00000000000 --- a/arch/arm/mach-ux500/mbox.c +++ /dev/null @@ -1,567 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * Author: Stefan Nilsson <stefan.xk.nilsson@stericsson.com> for ST-Ericsson. - * Author: Martin Persson <martin.persson@stericsson.com> for ST-Ericsson. - * License terms: GNU General Public License (GPL), version 2. - */ - -/* - * Mailbox nomenclature: - * - *       APE           MODEM - *           mbox pairX - *   .......................... - *   .                       . - *   .           peer        . - *   .     send  ----        . - *   .      -->  |  |        . - *   .           |  |        . - *   .           ----        . - *   .                       . - *   .           local       . - *   .     rec   ----        . - *   .           |  | <--    . - *   .           |  |        . - *   .           ----        . - *   ......................... - */ - -#include <linux/init.h> -#include <linux/module.h> -#include <linux/device.h> -#include <linux/interrupt.h> -#include <linux/spinlock.h> -#include <linux/errno.h> -#include <linux/io.h> -#include <linux/irq.h> -#include <linux/platform_device.h> -#include <linux/debugfs.h> -#include <linux/seq_file.h> -#include <linux/completion.h> -#include <mach/mbox.h> - -#define MBOX_NAME "mbox" - -#define MBOX_FIFO_DATA        0x000 -#define MBOX_FIFO_ADD         0x004 -#define MBOX_FIFO_REMOVE      0x008 -#define MBOX_FIFO_THRES_FREE  0x00C -#define MBOX_FIFO_THRES_OCCUP 0x010 -#define MBOX_FIFO_STATUS      0x014 - -#define MBOX_DISABLE_IRQ 0x4 -#define MBOX_ENABLE_IRQ  0x0 -#define MBOX_LATCH 1 - -/* Global list of all mailboxes */ -static struct list_head mboxs = LIST_HEAD_INIT(mboxs); - -static struct mbox *get_mbox_with_id(u8 id) -{ -	u8 i; -	struct list_head *pos = &mboxs; -	for (i = 0; i <= id; i++) -		pos = pos->next; - -	return (struct mbox *) list_entry(pos, struct mbox, list); -} - -int mbox_send(struct mbox *mbox, u32 mbox_msg, bool block) -{ -	int res = 0; - -	spin_lock(&mbox->lock); - -	dev_dbg(&(mbox->pdev->dev), -		"About to buffer 0x%X to mailbox 0x%X." -		" ri = %d, wi = %d\n", -		mbox_msg, (u32)mbox, mbox->read_index, -		mbox->write_index); - -	/* Check if write buffer is full */ -	while (((mbox->write_index + 1) % MBOX_BUF_SIZE) == mbox->read_index) { -		if (!block) { -			dev_dbg(&(mbox->pdev->dev), -			"Buffer full in non-blocking call! " -			"Returning -ENOMEM!\n"); -			res = -ENOMEM; -			goto exit; -		} -		spin_unlock(&mbox->lock); -		dev_dbg(&(mbox->pdev->dev), -			"Buffer full in blocking call! Sleeping...\n"); -		mbox->client_blocked = 1; -		wait_for_completion(&mbox->buffer_available); -		dev_dbg(&(mbox->pdev->dev), -			"Blocking send was woken up! Trying again...\n"); -		spin_lock(&mbox->lock); -	} - -	mbox->buffer[mbox->write_index] = mbox_msg; -	mbox->write_index = (mbox->write_index + 1) % MBOX_BUF_SIZE; - -	/* -	 * Indicate that we want an IRQ as soon as there is a slot -	 * in the FIFO -	 */ -	writel(MBOX_ENABLE_IRQ, mbox->virtbase_peer + MBOX_FIFO_THRES_FREE); - -exit: -	spin_unlock(&mbox->lock); -	return res; -} -EXPORT_SYMBOL(mbox_send); - -#if defined(CONFIG_DEBUG_FS) -/* - * Expected input: <value> <nbr sends> - * Example: "echo 0xdeadbeef 4 > mbox-node" sends 0xdeadbeef 4 times - */ -static ssize_t mbox_write_fifo(struct device *dev, -			       struct device_attribute *attr, -			       const char *buf, -			       size_t count) -{ -	unsigned long mbox_mess; -	unsigned long nbr_sends; -	unsigned long i; -	char int_buf[16]; -	char *token; -	char *val; - -	struct mbox *mbox = (struct mbox *) dev->platform_data; - -	strncpy((char *) &int_buf, buf, sizeof(int_buf)); -	token = (char *) &int_buf; - -	/* Parse message */ -	val = strsep(&token, " "); -	if ((val == NULL) || (strict_strtoul(val, 16, &mbox_mess) != 0)) -		mbox_mess = 0xDEADBEEF; - -	val = strsep(&token, " "); -	if ((val == NULL) || (strict_strtoul(val, 10, &nbr_sends) != 0)) -		nbr_sends = 1; - -	dev_dbg(dev, "Will write 0x%lX %ld times using data struct at 0x%X\n", -		mbox_mess, nbr_sends, (u32) mbox); - -	for (i = 0; i < nbr_sends; i++) -		mbox_send(mbox, mbox_mess, true); - -	return count; -} - -static ssize_t mbox_read_fifo(struct device *dev, -			      struct device_attribute *attr, -			      char *buf) -{ -	int mbox_value; -	struct mbox *mbox = (struct mbox *) dev->platform_data; - -	if ((readl(mbox->virtbase_local + MBOX_FIFO_STATUS) & 0x7) <= 0) -		return sprintf(buf, "Mailbox is empty\n"); - -	mbox_value = readl(mbox->virtbase_local + MBOX_FIFO_DATA); -	writel(MBOX_LATCH, (mbox->virtbase_local + MBOX_FIFO_REMOVE)); - -	return sprintf(buf, "0x%X\n", mbox_value); -} - -static DEVICE_ATTR(fifo, S_IWUGO | S_IRUGO, mbox_read_fifo, mbox_write_fifo); - -static int mbox_show(struct seq_file *s, void *data) -{ -	struct list_head *pos; -	u8 mbox_index = 0; - -	list_for_each(pos, &mboxs) { -		struct mbox *m = -			(struct mbox *) list_entry(pos, struct mbox, list); -		if (m == NULL) { -			seq_printf(s, -				   "Unable to retrieve mailbox %d\n", -				   mbox_index); -			continue; -		} - -		spin_lock(&m->lock); -		if ((m->virtbase_peer == NULL) || (m->virtbase_local == NULL)) { -			seq_printf(s, "MAILBOX %d not setup or corrupt\n", -				   mbox_index); -			spin_unlock(&m->lock); -			continue; -		} - -		seq_printf(s, -		"===========================\n" -		" MAILBOX %d\n" -		" PEER MAILBOX DUMP\n" -		"---------------------------\n" -		"FIFO:                 0x%X (%d)\n" -		"Free     Threshold:   0x%.2X (%d)\n" -		"Occupied Threshold:   0x%.2X (%d)\n" -		"Status:               0x%.2X (%d)\n" -		"   Free spaces  (ot):    %d (%d)\n" -		"   Occup spaces (ot):    %d (%d)\n" -		"===========================\n" -		" LOCAL MAILBOX DUMP\n" -		"---------------------------\n" -		"FIFO:                 0x%.X (%d)\n" -		"Free     Threshold:   0x%.2X (%d)\n" -		"Occupied Threshold:   0x%.2X (%d)\n" -		"Status:               0x%.2X (%d)\n" -		"   Free spaces  (ot):    %d (%d)\n" -		"   Occup spaces (ot):    %d (%d)\n" -		"===========================\n" -		"write_index: %d\n" -		"read_index : %d\n" -		"===========================\n" -		"\n", -		mbox_index, -		readl(m->virtbase_peer + MBOX_FIFO_DATA), -		readl(m->virtbase_peer + MBOX_FIFO_DATA), -		readl(m->virtbase_peer + MBOX_FIFO_THRES_FREE), -		readl(m->virtbase_peer + MBOX_FIFO_THRES_FREE), -		readl(m->virtbase_peer + MBOX_FIFO_THRES_OCCUP), -		readl(m->virtbase_peer + MBOX_FIFO_THRES_OCCUP), -		readl(m->virtbase_peer + MBOX_FIFO_STATUS), -		readl(m->virtbase_peer + MBOX_FIFO_STATUS), -		(readl(m->virtbase_peer + MBOX_FIFO_STATUS) >> 4) & 0x7, -		(readl(m->virtbase_peer + MBOX_FIFO_STATUS) >> 7) & 0x1, -		(readl(m->virtbase_peer + MBOX_FIFO_STATUS) >> 0) & 0x7, -		(readl(m->virtbase_peer + MBOX_FIFO_STATUS) >> 3) & 0x1, -		readl(m->virtbase_local + MBOX_FIFO_DATA), -		readl(m->virtbase_local + MBOX_FIFO_DATA), -		readl(m->virtbase_local + MBOX_FIFO_THRES_FREE), -		readl(m->virtbase_local + MBOX_FIFO_THRES_FREE), -		readl(m->virtbase_local + MBOX_FIFO_THRES_OCCUP), -		readl(m->virtbase_local + MBOX_FIFO_THRES_OCCUP), -		readl(m->virtbase_local + MBOX_FIFO_STATUS), -		readl(m->virtbase_local + MBOX_FIFO_STATUS), -		(readl(m->virtbase_local + MBOX_FIFO_STATUS) >> 4) & 0x7, -		(readl(m->virtbase_local + MBOX_FIFO_STATUS) >> 7) & 0x1, -		(readl(m->virtbase_local + MBOX_FIFO_STATUS) >> 0) & 0x7, -		(readl(m->virtbase_local + MBOX_FIFO_STATUS) >> 3) & 0x1, -		m->write_index, m->read_index); -		mbox_index++; -		spin_unlock(&m->lock); -	} - -	return 0; -} - -static int mbox_open(struct inode *inode, struct file *file) -{ -	return single_open(file, mbox_show, NULL); -} - -static const struct file_operations mbox_operations = { -	.owner = THIS_MODULE, -	.open = mbox_open, -	.read = seq_read, -	.llseek = seq_lseek, -	.release = single_release, -}; -#endif - -static irqreturn_t mbox_irq(int irq, void *arg) -{ -	u32 mbox_value; -	int nbr_occup; -	int nbr_free; -	struct mbox *mbox = (struct mbox *) arg; - -	spin_lock(&mbox->lock); - -	dev_dbg(&(mbox->pdev->dev), -		"mbox IRQ [%d] received. ri = %d, wi = %d\n", -		irq, mbox->read_index, mbox->write_index); - -	/* -	 * Check if we have any outgoing messages, and if there is space for -	 * them in the FIFO. -	 */ -	if (mbox->read_index != mbox->write_index) { -		/* -		 * Check by reading FREE for LOCAL since that indicates -		 * OCCUP for PEER -		 */ -		nbr_free = (readl(mbox->virtbase_local + MBOX_FIFO_STATUS) -			    >> 4) & 0x7; -		dev_dbg(&(mbox->pdev->dev), -			"Status indicates %d empty spaces in the FIFO!\n", -			nbr_free); - -		while ((nbr_free > 0) && -		       (mbox->read_index != mbox->write_index)) { -			/* Write the message and latch it into the FIFO */ -			writel(mbox->buffer[mbox->read_index], -			       (mbox->virtbase_peer + MBOX_FIFO_DATA)); -			writel(MBOX_LATCH, -			       (mbox->virtbase_peer + MBOX_FIFO_ADD)); -			dev_dbg(&(mbox->pdev->dev), -				"Wrote message 0x%X to addr 0x%X\n", -				mbox->buffer[mbox->read_index], -				(u32) (mbox->virtbase_peer + MBOX_FIFO_DATA)); - -			nbr_free--; -			mbox->read_index = -				(mbox->read_index + 1) % MBOX_BUF_SIZE; -		} - -		/* -		 * Check if we still want IRQ:s when there is free -		 * space to send -		 */ -		if (mbox->read_index != mbox->write_index) { -			dev_dbg(&(mbox->pdev->dev), -				"Still have messages to send, but FIFO full. " -				"Request IRQ again!\n"); -			writel(MBOX_ENABLE_IRQ, -			       mbox->virtbase_peer + MBOX_FIFO_THRES_FREE); -		} else { -			dev_dbg(&(mbox->pdev->dev), -				"No more messages to send. " -				"Do not request IRQ again!\n"); -			writel(MBOX_DISABLE_IRQ, -			       mbox->virtbase_peer + MBOX_FIFO_THRES_FREE); -		} - -		/* -		 * Check if we can signal any blocked clients that it is OK to -		 * start buffering again -		 */ -		if (mbox->client_blocked && -		    (((mbox->write_index + 1) % MBOX_BUF_SIZE) -		     != mbox->read_index)) { -			dev_dbg(&(mbox->pdev->dev), -				"Waking up blocked client\n"); -			complete(&mbox->buffer_available); -			mbox->client_blocked = 0; -		} -	} - -	/* Check if we have any incoming messages */ -	nbr_occup = readl(mbox->virtbase_local + MBOX_FIFO_STATUS) & 0x7; -	if (nbr_occup == 0) -		goto exit; - -	if (mbox->cb == NULL) { -		dev_dbg(&(mbox->pdev->dev), "No receive callback registered, " -			"leaving %d incoming messages in fifo!\n", nbr_occup); -		goto exit; -	} - -	/* Read and acknowledge the message */ -	mbox_value = readl(mbox->virtbase_local + MBOX_FIFO_DATA); -	writel(MBOX_LATCH, (mbox->virtbase_local + MBOX_FIFO_REMOVE)); - -	/* Notify consumer of new mailbox message */ -	dev_dbg(&(mbox->pdev->dev), "Calling callback for message 0x%X!\n", -		mbox_value); -	mbox->cb(mbox_value, mbox->client_data); - -exit: -	dev_dbg(&(mbox->pdev->dev), "Exit mbox IRQ. ri = %d, wi = %d\n", -		mbox->read_index, mbox->write_index); -	spin_unlock(&mbox->lock); - -	return IRQ_HANDLED; -} - -/* Setup is executed once for each mbox pair */ -struct mbox *mbox_setup(u8 mbox_id, mbox_recv_cb_t *mbox_cb, void *priv) -{ -	struct resource *resource; -	int irq; -	int res; -	struct mbox *mbox; - -	mbox = get_mbox_with_id(mbox_id); -	if (mbox == NULL) { -		dev_err(&(mbox->pdev->dev), "Incorrect mailbox id: %d!\n", -			mbox_id); -		goto exit; -	} - -	/* -	 * Check if mailbox has been allocated to someone else, -	 * otherwise allocate it -	 */ -	if (mbox->allocated) { -		dev_err(&(mbox->pdev->dev), "Mailbox number %d is busy!\n", -			mbox_id); -		mbox = NULL; -		goto exit; -	} -	mbox->allocated = true; - -	dev_dbg(&(mbox->pdev->dev), "Initiating mailbox number %d: 0x%X...\n", -		mbox_id, (u32)mbox); - -	mbox->client_data = priv; -	mbox->cb = mbox_cb; - -	/* Get addr for peer mailbox and ioremap it */ -	resource = platform_get_resource_byname(mbox->pdev, -						IORESOURCE_MEM, -						"mbox_peer"); -	if (resource == NULL) { -		dev_err(&(mbox->pdev->dev), -			"Unable to retrieve mbox peer resource\n"); -		mbox = NULL; -		goto exit; -	} -	dev_dbg(&(mbox->pdev->dev), -		"Resource name: %s start: 0x%X, end: 0x%X\n", -		resource->name, resource->start, resource->end); -	mbox->virtbase_peer = -		ioremap(resource->start, resource->end - resource->start); -	if (!mbox->virtbase_peer) { -		dev_err(&(mbox->pdev->dev), "Unable to ioremap peer mbox\n"); -		mbox = NULL; -		goto exit; -	} -	dev_dbg(&(mbox->pdev->dev), -		"ioremapped peer physical: (0x%X-0x%X) to virtual: 0x%X\n", -		resource->start, resource->end, (u32) mbox->virtbase_peer); - -	/* Get addr for local mailbox and ioremap it */ -	resource = platform_get_resource_byname(mbox->pdev, -						IORESOURCE_MEM, -						"mbox_local"); -	if (resource == NULL) { -		dev_err(&(mbox->pdev->dev), -			"Unable to retrieve mbox local resource\n"); -		mbox = NULL; -		goto exit; -	} -	dev_dbg(&(mbox->pdev->dev), -		"Resource name: %s start: 0x%X, end: 0x%X\n", -		resource->name, resource->start, resource->end); -	mbox->virtbase_local = -		ioremap(resource->start, resource->end - resource->start); -	if (!mbox->virtbase_local) { -		dev_err(&(mbox->pdev->dev), "Unable to ioremap local mbox\n"); -		mbox = NULL; -		goto exit; -	} -	dev_dbg(&(mbox->pdev->dev), -		"ioremapped local physical: (0x%X-0x%X) to virtual: 0x%X\n", -		resource->start, resource->end, (u32) mbox->virtbase_peer); - -	init_completion(&mbox->buffer_available); -	mbox->client_blocked = 0; - -	/* Get IRQ for mailbox and allocate it */ -	irq = platform_get_irq_byname(mbox->pdev, "mbox_irq"); -	if (irq < 0) { -		dev_err(&(mbox->pdev->dev), -			"Unable to retrieve mbox irq resource\n"); -		mbox = NULL; -		goto exit; -	} - -	dev_dbg(&(mbox->pdev->dev), "Allocating irq %d...\n", irq); -	res = request_irq(irq, mbox_irq, 0, mbox->name, (void *) mbox); -	if (res < 0) { -		dev_err(&(mbox->pdev->dev), -			"Unable to allocate mbox irq %d\n", irq); -		mbox = NULL; -		goto exit; -	} - -	/* Set up mailbox to not launch IRQ on free space in mailbox */ -	writel(MBOX_DISABLE_IRQ, mbox->virtbase_peer + MBOX_FIFO_THRES_FREE); - -	/* -	 * Set up mailbox to launch IRQ on new message if we have -	 * a callback set. If not, do not raise IRQ, but keep message -	 * in FIFO for manual retrieval -	 */ -	if (mbox_cb != NULL) -		writel(MBOX_ENABLE_IRQ, -		       mbox->virtbase_local + MBOX_FIFO_THRES_OCCUP); -	else -		writel(MBOX_DISABLE_IRQ, -		       mbox->virtbase_local + MBOX_FIFO_THRES_OCCUP); - -#if defined(CONFIG_DEBUG_FS) -	res = device_create_file(&(mbox->pdev->dev), &dev_attr_fifo); -	if (res != 0) -		dev_warn(&(mbox->pdev->dev), -			 "Unable to create mbox sysfs entry"); - -	(void) debugfs_create_file("mbox", S_IFREG | S_IRUGO, NULL, -				   NULL, &mbox_operations); -#endif - -	dev_info(&(mbox->pdev->dev), -		 "Mailbox driver with index %d initated!\n", mbox_id); - -exit: -	return mbox; -} -EXPORT_SYMBOL(mbox_setup); - - -int __init mbox_probe(struct platform_device *pdev) -{ -	struct mbox local_mbox; -	struct mbox *mbox; -	int res = 0; -	dev_dbg(&(pdev->dev), "Probing mailbox (pdev = 0x%X)...\n", (u32) pdev); - -	memset(&local_mbox, 0x0, sizeof(struct mbox)); - -	/* Associate our mbox data with the platform device */ -	res = platform_device_add_data(pdev, -				       (void *) &local_mbox, -				       sizeof(struct mbox)); -	if (res != 0) { -		dev_err(&(pdev->dev), -			"Unable to allocate driver platform data!\n"); -		goto exit; -	} - -	mbox = (struct mbox *) pdev->dev.platform_data; -	mbox->pdev = pdev; -	mbox->write_index = 0; -	mbox->read_index = 0; - -	INIT_LIST_HEAD(&(mbox->list)); -	list_add_tail(&(mbox->list), &mboxs); - -	sprintf(mbox->name, "%s", MBOX_NAME); -	spin_lock_init(&mbox->lock); - -	dev_info(&(pdev->dev), "Mailbox driver loaded\n"); - -exit: -	return res; -} - -static struct platform_driver mbox_driver = { -	.driver = { -		.name = MBOX_NAME, -		.owner = THIS_MODULE, -	}, -}; - -static int __init mbox_init(void) -{ -	return platform_driver_probe(&mbox_driver, mbox_probe); -} - -module_init(mbox_init); - -void __exit mbox_exit(void) -{ -	platform_driver_unregister(&mbox_driver); -} - -module_exit(mbox_exit); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("MBOX driver"); diff --git a/arch/arm/mach-ux500/modem_irq.c b/arch/arm/mach-ux500/modem_irq.c deleted file mode 100644 index 3187f887116..00000000000 --- a/arch/arm/mach-ux500/modem_irq.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * Author: Stefan Nilsson <stefan.xk.nilsson@stericsson.com> for ST-Ericsson. - * Author: Martin Persson <martin.persson@stericsson.com> for ST-Ericsson. - * License terms: GNU General Public License (GPL), version 2. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/slab.h> - -#define MODEM_INTCON_BASE_ADDR 0xBFFD3000 -#define MODEM_INTCON_SIZE 0xFFF - -#define DEST_IRQ41_OFFSET 0x2A4 -#define DEST_IRQ43_OFFSET 0x2AC -#define DEST_IRQ45_OFFSET 0x2B4 - -#define PRIO_IRQ41_OFFSET 0x6A4 -#define PRIO_IRQ43_OFFSET 0x6AC -#define PRIO_IRQ45_OFFSET 0x6B4 - -#define ALLOW_IRQ_OFFSET 0x104 - -#define MODEM_INTCON_CPU_NBR 0x1 -#define MODEM_INTCON_PRIO_HIGH 0x0 - -#define MODEM_INTCON_ALLOW_IRQ41 0x0200 -#define MODEM_INTCON_ALLOW_IRQ43 0x0800 -#define MODEM_INTCON_ALLOW_IRQ45 0x2000 - -#define MODEM_IRQ_REG_OFFSET 0x4 - -struct modem_irq { -	void __iomem *modem_intcon_base; -}; - - -static void setup_modem_intcon(void __iomem *modem_intcon_base) -{ -	/* IC_DESTINATION_BASE_ARRAY - Which CPU to receive the IRQ */ -	writel(MODEM_INTCON_CPU_NBR, modem_intcon_base + DEST_IRQ41_OFFSET); -	writel(MODEM_INTCON_CPU_NBR, modem_intcon_base + DEST_IRQ43_OFFSET); -	writel(MODEM_INTCON_CPU_NBR, modem_intcon_base + DEST_IRQ45_OFFSET); - -	/* IC_PRIORITY_BASE_ARRAY - IRQ priority in modem IRQ controller */ -	writel(MODEM_INTCON_PRIO_HIGH, modem_intcon_base + PRIO_IRQ41_OFFSET); -	writel(MODEM_INTCON_PRIO_HIGH, modem_intcon_base + PRIO_IRQ43_OFFSET); -	writel(MODEM_INTCON_PRIO_HIGH, modem_intcon_base + PRIO_IRQ45_OFFSET); - -	/* IC_ALLOW_ARRAY - IRQ enable */ -	writel(MODEM_INTCON_ALLOW_IRQ41 | -		   MODEM_INTCON_ALLOW_IRQ43 | -		   MODEM_INTCON_ALLOW_IRQ45, -		   modem_intcon_base + ALLOW_IRQ_OFFSET); -} - -static irqreturn_t modem_cpu_irq_handler(int irq, void *data) -{ -	int real_irq; -	int virt_irq; -	struct modem_irq *mi = (struct modem_irq *)data; - -	/* Read modem side IRQ number from modem IRQ controller */ -	real_irq = readl(mi->modem_intcon_base + MODEM_IRQ_REG_OFFSET) & 0xFF; -	virt_irq = IRQ_MODEM_EVENTS_BASE + real_irq; - -	pr_debug("modem_irq: Worker read addr 0x%X and got value 0x%X " -		 "which will be 0x%X (%d) which translates to " -		 "virtual IRQ 0x%X (%d)!\n", -		   (u32)mi->modem_intcon_base + MODEM_IRQ_REG_OFFSET, -		   real_irq, -		   real_irq & 0xFF, -		   real_irq & 0xFF, -		   virt_irq, -		   virt_irq); - -	if (virt_irq != 0) -		generic_handle_irq(virt_irq); - -	pr_debug("modem_irq: Done handling virtual IRQ %d!\n", virt_irq); - -	return IRQ_HANDLED; -} - -static void create_virtual_irq(int irq, struct irq_chip *modem_irq_chip) -{ -	set_irq_chip(irq, modem_irq_chip); -	set_irq_handler(irq, handle_simple_irq); -	set_irq_flags(irq, IRQF_VALID); - -	pr_debug("modem_irq: Created virtual IRQ %d\n", irq); -} - -static int modem_irq_init(void) -{ -	int err; -	static struct irq_chip  modem_irq_chip; -	struct modem_irq *mi; - -	pr_info("modem_irq: Set up IRQ handler for incoming modem IRQ %d\n", -		   IRQ_DB5500_MODEM); - -	mi = kmalloc(sizeof(struct modem_irq), GFP_KERNEL); -	if (!mi) { -		pr_err("modem_irq: Could not allocate device\n"); -		return -ENOMEM; -	} - -	mi->modem_intcon_base = -		ioremap(MODEM_INTCON_BASE_ADDR, MODEM_INTCON_SIZE); -	pr_debug("modem_irq: ioremapped modem_intcon_base from " -		 "phy 0x%x to virt 0x%x\n", MODEM_INTCON_BASE_ADDR, -		 (u32)mi->modem_intcon_base); - -	setup_modem_intcon(mi->modem_intcon_base); - -	modem_irq_chip = dummy_irq_chip; -	modem_irq_chip.name = "modem_irq"; - -	/* Create the virtual IRQ:s needed */ -	create_virtual_irq(MBOX_PAIR0_VIRT_IRQ, &modem_irq_chip); -	create_virtual_irq(MBOX_PAIR1_VIRT_IRQ, &modem_irq_chip); -	create_virtual_irq(MBOX_PAIR2_VIRT_IRQ, &modem_irq_chip); - -	err = request_threaded_irq(IRQ_DB5500_MODEM, NULL, -				   modem_cpu_irq_handler, IRQF_ONESHOT, -				   "modem_irq", mi); -	if (err) -		pr_err("modem_irq: Could not register IRQ %d\n", -		       IRQ_DB5500_MODEM); - -	return 0; -} - -arch_initcall(modem_irq_init); diff --git a/arch/arm/mach-ux500/pins-db5500.h b/arch/arm/mach-ux500/pins-db5500.h deleted file mode 100644 index bf50c21fe69..00000000000 --- a/arch/arm/mach-ux500/pins-db5500.h +++ /dev/null @@ -1,620 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * License terms: GNU General Public License, version 2 - * Author: Rabin Vincent <rabin.vincent@stericsson.com> - */ - -#ifndef __MACH_DB5500_PINS_H -#define __MACH_DB5500_PINS_H - -#define GPIO0_GPIO		PIN_CFG(0, GPIO) -#define GPIO0_SM_CS3n		PIN_CFG(0, ALT_A) - -#define GPIO1_GPIO		PIN_CFG(1, GPIO) -#define GPIO1_SM_A3		PIN_CFG(1, ALT_A) - -#define GPIO2_GPIO		PIN_CFG(2, GPIO) -#define GPIO2_SM_A4		PIN_CFG(2, ALT_A) -#define GPIO2_SM_AVD		PIN_CFG(2, ALT_B) - -#define GPIO3_GPIO		PIN_CFG(3, GPIO) -#define GPIO3_I2C1_SCL		PIN_CFG(3, ALT_A) - -#define GPIO4_GPIO		PIN_CFG(4, GPIO) -#define GPIO4_I2C1_SDA		PIN_CFG(4, ALT_A) - -#define GPIO5_GPIO		PIN_CFG(5, GPIO) -#define GPIO5_MC0_DAT0		PIN_CFG(5, ALT_A) -#define GPIO5_SM_ADQ8		PIN_CFG(5, ALT_B) - -#define GPIO6_GPIO		PIN_CFG(6, GPIO) -#define GPIO6_MC0_DAT1		PIN_CFG(6, ALT_A) -#define GPIO6_SM_ADQ0		PIN_CFG(6, ALT_B) - -#define GPIO7_GPIO		PIN_CFG(7, GPIO) -#define GPIO7_MC0_DAT2		PIN_CFG(7, ALT_A) -#define GPIO7_SM_ADQ9		PIN_CFG(7, ALT_B) - -#define GPIO8_GPIO		PIN_CFG(8, GPIO) -#define GPIO8_MC0_DAT3		PIN_CFG(8, ALT_A) -#define GPIO8_SM_ADQ1		PIN_CFG(8, ALT_B) - -#define GPIO9_GPIO		PIN_CFG(9, GPIO) -#define GPIO9_MC0_DAT4		PIN_CFG(9, ALT_A) -#define GPIO9_SM_ADQ10		PIN_CFG(9, ALT_B) - -#define GPIO10_GPIO		PIN_CFG(10, GPIO) -#define GPIO10_MC0_DAT5		PIN_CFG(10, ALT_A) -#define GPIO10_SM_ADQ2		PIN_CFG(10, ALT_B) - -#define GPIO11_GPIO		PIN_CFG(11, GPIO) -#define GPIO11_MC0_DAT6		PIN_CFG(11, ALT_A) -#define GPIO11_SM_ADQ11		PIN_CFG(11, ALT_B) - -#define GPIO12_GPIO		PIN_CFG(12, GPIO) -#define GPIO12_MC0_DAT7		PIN_CFG(12, ALT_A) -#define GPIO12_SM_ADQ3		PIN_CFG(12, ALT_B) - -#define GPIO13_GPIO		PIN_CFG(13, GPIO) -#define GPIO13_MC0_CMD		PIN_CFG(13, ALT_A) -#define GPIO13_SM_BUSY0n	PIN_CFG(13, ALT_B) -#define GPIO13_SM_WAIT0n	PIN_CFG(13, ALT_C) - -#define GPIO14_GPIO		PIN_CFG(14, GPIO) -#define GPIO14_MC0_CLK		PIN_CFG(14, ALT_A) -#define GPIO14_SM_CS1n		PIN_CFG(14, ALT_B) -#define GPIO14_SM_CKO		PIN_CFG(14, ALT_C) - -#define GPIO15_GPIO		PIN_CFG(15, GPIO) -#define GPIO15_SM_A5		PIN_CFG(15, ALT_A) -#define GPIO15_SM_CLE		PIN_CFG(15, ALT_B) - -#define GPIO16_GPIO		PIN_CFG(16, GPIO) -#define GPIO16_MC2_CMD		PIN_CFG(16, ALT_A) -#define GPIO16_SM_OEn		PIN_CFG(16, ALT_B) - -#define GPIO17_GPIO		PIN_CFG(17, GPIO) -#define GPIO17_MC2_CLK		PIN_CFG(17, ALT_A) -#define GPIO17_SM_WEn		PIN_CFG(17, ALT_B) - -#define GPIO18_GPIO		PIN_CFG(18, GPIO) -#define GPIO18_SM_A6		PIN_CFG(18, ALT_A) -#define GPIO18_SM_ALE		PIN_CFG(18, ALT_B) -#define GPIO18_SM_AVDn		PIN_CFG(18, ALT_C) - -#define GPIO19_GPIO		PIN_CFG(19, GPIO) -#define GPIO19_MC2_DAT1		PIN_CFG(19, ALT_A) -#define GPIO19_SM_ADQ4		PIN_CFG(19, ALT_B) - -#define GPIO20_GPIO		PIN_CFG(20, GPIO) -#define GPIO20_MC2_DAT3		PIN_CFG(20, ALT_A) -#define GPIO20_SM_ADQ5		PIN_CFG(20, ALT_B) - -#define GPIO21_GPIO		PIN_CFG(21, GPIO) -#define GPIO21_MC2_DAT5		PIN_CFG(21, ALT_A) -#define GPIO21_SM_ADQ6		PIN_CFG(21, ALT_B) - -#define GPIO22_GPIO		PIN_CFG(22, GPIO) -#define GPIO22_MC2_DAT7		PIN_CFG(22, ALT_A) -#define GPIO22_SM_ADQ7		PIN_CFG(22, ALT_B) - -#define GPIO23_GPIO		PIN_CFG(23, GPIO) -#define GPIO23_MC2_DAT0		PIN_CFG(23, ALT_A) -#define GPIO23_SM_ADQ12		PIN_CFG(23, ALT_B) -#define GPIO23_MC0_DAT1		PIN_CFG(23, ALT_C) - -#define GPIO24_GPIO		PIN_CFG(24, GPIO) -#define GPIO24_MC2_DAT2		PIN_CFG(24, ALT_A) -#define GPIO24_SM_ADQ13		PIN_CFG(24, ALT_B) -#define GPIO24_MC0_DAT3		PIN_CFG(24, ALT_C) - -#define GPIO25_GPIO		PIN_CFG(25, GPIO) -#define GPIO25_MC2_DAT4		PIN_CFG(25, ALT_A) -#define GPIO25_SM_ADQ14		PIN_CFG(25, ALT_B) -#define GPIO25_MC0_CMD		PIN_CFG(25, ALT_C) - -#define GPIO26_GPIO		PIN_CFG(26, GPIO) -#define GPIO26_MC2_DAT6		PIN_CFG(26, ALT_A) -#define GPIO26_SM_ADQ15		PIN_CFG(26, ALT_B) - -#define GPIO27_GPIO		PIN_CFG(27, GPIO) -#define GPIO27_SM_CS0n		PIN_CFG(27, ALT_A) -#define GPIO27_SM_PS0n		PIN_CFG(27, ALT_B) - -#define GPIO28_GPIO		PIN_CFG(28, GPIO) -#define GPIO28_U0_TXD		PIN_CFG(28, ALT_A) -#define GPIO28_SM_A0		PIN_CFG(28, ALT_B) - -#define GPIO29_GPIO		PIN_CFG(29, GPIO) -#define GPIO29_U0_RXD		PIN_CFG(29, ALT_A) -#define GPIO29_SM_A1		PIN_CFG(29, ALT_B) -#define GPIO29_PWM_0		PIN_CFG(29, ALT_C) - -#define GPIO30_GPIO		PIN_CFG(30, GPIO) -#define GPIO30_MC0_DAT5		PIN_CFG(30, ALT_A) -#define GPIO30_SM_A2		PIN_CFG(30, ALT_B) -#define GPIO30_PWM_1		PIN_CFG(30, ALT_C) - -#define GPIO31_GPIO		PIN_CFG(31, GPIO) -#define GPIO31_MC0_DAT7		PIN_CFG(31, ALT_A) -#define GPIO31_SM_CS2n		PIN_CFG(31, ALT_B) -#define GPIO31_PWM_2		PIN_CFG(31, ALT_C) - -#define GPIO32_GPIO		PIN_CFG(32, GPIO) -#define GPIO32_MSP0_TCK		PIN_CFG(32, ALT_A) -#define GPIO32_ACCI2S0_SCK	PIN_CFG(32, ALT_B) - -#define GPIO33_GPIO		PIN_CFG(33, GPIO) -#define GPIO33_MSP0_TFS		PIN_CFG(33, ALT_A) -#define GPIO33_ACCI2S0_WS	PIN_CFG(33, ALT_B) - -#define GPIO34_GPIO		PIN_CFG(34, GPIO) -#define GPIO34_MSP0_TXD		PIN_CFG(34, ALT_A) -#define GPIO34_ACCI2S0_DLD	PIN_CFG(34, ALT_B) - -#define GPIO35_GPIO		PIN_CFG(35, GPIO) -#define GPIO35_MSP0_RXD		PIN_CFG(35, ALT_A) -#define GPIO35_ACCI2S0_ULD	PIN_CFG(35, ALT_B) - -#define GPIO64_GPIO		PIN_CFG(64, GPIO) -#define GPIO64_USB_DAT0		PIN_CFG(64, ALT_A) -#define GPIO64_U0_TXD		PIN_CFG(64, ALT_B) - -#define GPIO65_GPIO		PIN_CFG(65, GPIO) -#define GPIO65_USB_DAT1		PIN_CFG(65, ALT_A) -#define GPIO65_U0_RXD		PIN_CFG(65, ALT_B) - -#define GPIO66_GPIO		PIN_CFG(66, GPIO) -#define GPIO66_USB_DAT2		PIN_CFG(66, ALT_A) - -#define GPIO67_GPIO		PIN_CFG(67, GPIO) -#define GPIO67_USB_DAT3		PIN_CFG(67, ALT_A) - -#define GPIO68_GPIO		PIN_CFG(68, GPIO) -#define GPIO68_USB_DAT4		PIN_CFG(68, ALT_A) - -#define GPIO69_GPIO		PIN_CFG(69, GPIO) -#define GPIO69_USB_DAT5		PIN_CFG(69, ALT_A) - -#define GPIO70_GPIO		PIN_CFG(70, GPIO) -#define GPIO70_USB_DAT6		PIN_CFG(70, ALT_A) - -#define GPIO71_GPIO		PIN_CFG(71, GPIO) -#define GPIO71_USB_DAT7		PIN_CFG(71, ALT_A) - -#define GPIO72_GPIO		PIN_CFG(72, GPIO) -#define GPIO72_USB_STP		PIN_CFG(72, ALT_A) - -#define GPIO73_GPIO		PIN_CFG(73, GPIO) -#define GPIO73_USB_DIR		PIN_CFG(73, ALT_A) - -#define GPIO74_GPIO		PIN_CFG(74, GPIO) -#define GPIO74_USB_NXT		PIN_CFG(74, ALT_A) - -#define GPIO75_GPIO		PIN_CFG(75, GPIO) -#define GPIO75_USB_XCLK		PIN_CFG(75, ALT_A) - -#define GPIO76_GPIO		PIN_CFG(76, GPIO) - -#define GPIO77_GPIO		PIN_CFG(77, GPIO) -#define GPIO77_ACCTX_ON		PIN_CFG(77, ALT_A) - -#define GPIO78_GPIO		PIN_CFG(78, GPIO) -#define GPIO78_IRQn		PIN_CFG(78, ALT_A) - -#define GPIO79_GPIO		PIN_CFG(79, GPIO) -#define GPIO79_ACCSIM_Clk	PIN_CFG(79, ALT_A) - -#define GPIO80_GPIO		PIN_CFG(80, GPIO) -#define GPIO80_ACCSIM_Da	PIN_CFG(80, ALT_A) - -#define GPIO81_GPIO		PIN_CFG(81, GPIO) -#define GPIO81_ACCSIM_Reset	PIN_CFG(81, ALT_A) - -#define GPIO82_GPIO		PIN_CFG(82, GPIO) -#define GPIO82_ACCSIM_DDir	PIN_CFG(82, ALT_A) - -#define GPIO96_GPIO		PIN_CFG(96, GPIO) -#define GPIO96_MSP1_TCK		PIN_CFG(96, ALT_A) -#define GPIO96_PRCMU_DEBUG3	PIN_CFG(96, ALT_B) -#define GPIO96_PRCMU_DEBUG7	PIN_CFG(96, ALT_C) - -#define GPIO97_GPIO		PIN_CFG(97, GPIO) -#define GPIO97_MSP1_TFS		PIN_CFG(97, ALT_A) -#define GPIO97_PRCMU_DEBUG2	PIN_CFG(97, ALT_B) -#define GPIO97_PRCMU_DEBUG6	PIN_CFG(97, ALT_C) - -#define GPIO98_GPIO		PIN_CFG(98, GPIO) -#define GPIO98_MSP1_TXD		PIN_CFG(98, ALT_A) -#define GPIO98_PRCMU_DEBUG1	PIN_CFG(98, ALT_B) -#define GPIO98_PRCMU_DEBUG5	PIN_CFG(98, ALT_C) - -#define GPIO99_GPIO		PIN_CFG(99, GPIO) -#define GPIO99_MSP1_RXD		PIN_CFG(99, ALT_A) -#define GPIO99_PRCMU_DEBUG0	PIN_CFG(99, ALT_B) -#define GPIO99_PRCMU_DEBUG4	PIN_CFG(99, ALT_C) - -#define GPIO100_GPIO		PIN_CFG(100, GPIO) -#define GPIO100_I2C0_SCL	PIN_CFG(100, ALT_A) - -#define GPIO101_GPIO		PIN_CFG(101, GPIO) -#define GPIO101_I2C0_SDA	PIN_CFG(101, ALT_A) - -#define GPIO128_GPIO		PIN_CFG(128, GPIO) -#define GPIO128_KP_I0		PIN_CFG(128, ALT_A) -#define GPIO128_BUSMON_D0	PIN_CFG(128, ALT_B) - -#define GPIO129_GPIO		PIN_CFG(129, GPIO) -#define GPIO129_KP_O0		PIN_CFG(129, ALT_A) -#define GPIO129_BUSMON_D1	PIN_CFG(129, ALT_B) - -#define GPIO130_GPIO		PIN_CFG(130, GPIO) -#define GPIO130_KP_I1		PIN_CFG(130, ALT_A) -#define GPIO130_BUSMON_D2	PIN_CFG(130, ALT_B) - -#define GPIO131_GPIO		PIN_CFG(131, GPIO) -#define GPIO131_KP_O1		PIN_CFG(131, ALT_A) -#define GPIO131_BUSMON_D3	PIN_CFG(131, ALT_B) - -#define GPIO132_GPIO		PIN_CFG(132, GPIO) -#define GPIO132_KP_I2		PIN_CFG(132, ALT_A) -#define GPIO132_ETM_D15		PIN_CFG(132, ALT_B) -#define GPIO132_STMAPE_CLK	PIN_CFG(132, ALT_C) - -#define GPIO133_GPIO		PIN_CFG(133, GPIO) -#define GPIO133_KP_O2		PIN_CFG(133, ALT_A) -#define GPIO133_ETM_D14		PIN_CFG(133, ALT_B) -#define GPIO133_U0_RXD		PIN_CFG(133, ALT_C) - -#define GPIO134_GPIO		PIN_CFG(134, GPIO) -#define GPIO134_KP_I3		PIN_CFG(134, ALT_A) -#define GPIO134_ETM_D13		PIN_CFG(134, ALT_B) -#define GPIO134_STMAPE_DAT0	PIN_CFG(134, ALT_C) - -#define GPIO135_GPIO		PIN_CFG(135, GPIO) -#define GPIO135_KP_O3		PIN_CFG(135, ALT_A) -#define GPIO135_ETM_D12		PIN_CFG(135, ALT_B) -#define GPIO135_STMAPE_DAT1	PIN_CFG(135, ALT_C) - -#define GPIO136_GPIO		PIN_CFG(136, GPIO) -#define GPIO136_KP_I4		PIN_CFG(136, ALT_A) -#define GPIO136_ETM_D11		PIN_CFG(136, ALT_B) -#define GPIO136_STMAPE_DAT2	PIN_CFG(136, ALT_C) - -#define GPIO137_GPIO		PIN_CFG(137, GPIO) -#define GPIO137_KP_O4		PIN_CFG(137, ALT_A) -#define GPIO137_ETM_D10		PIN_CFG(137, ALT_B) -#define GPIO137_STMAPE_DAT3	PIN_CFG(137, ALT_C) - -#define GPIO138_GPIO		PIN_CFG(138, GPIO) -#define GPIO138_KP_I5		PIN_CFG(138, ALT_A) -#define GPIO138_ETM_D9		PIN_CFG(138, ALT_B) -#define GPIO138_U0_TXD		PIN_CFG(138, ALT_C) - -#define GPIO139_GPIO		PIN_CFG(139, GPIO) -#define GPIO139_KP_O5		PIN_CFG(139, ALT_A) -#define GPIO139_ETM_D8		PIN_CFG(139, ALT_B) -#define GPIO139_BUSMON_D11	PIN_CFG(139, ALT_C) - -#define GPIO140_GPIO		PIN_CFG(140, GPIO) -#define GPIO140_KP_I6		PIN_CFG(140, ALT_A) -#define GPIO140_ETM_D7		PIN_CFG(140, ALT_B) -#define GPIO140_STMAPE_CLK	PIN_CFG(140, ALT_C) - -#define GPIO141_GPIO		PIN_CFG(141, GPIO) -#define GPIO141_KP_O6		PIN_CFG(141, ALT_A) -#define GPIO141_ETM_D6		PIN_CFG(141, ALT_B) -#define GPIO141_U0_RXD		PIN_CFG(141, ALT_C) - -#define GPIO142_GPIO		PIN_CFG(142, GPIO) -#define GPIO142_KP_I7		PIN_CFG(142, ALT_A) -#define GPIO142_ETM_D5		PIN_CFG(142, ALT_B) -#define GPIO142_STMAPE_DAT0	PIN_CFG(142, ALT_C) - -#define GPIO143_GPIO		PIN_CFG(143, GPIO) -#define GPIO143_KP_O7		PIN_CFG(143, ALT_A) -#define GPIO143_ETM_D4		PIN_CFG(143, ALT_B) -#define GPIO143_STMAPE_DAT1	PIN_CFG(143, ALT_C) - -#define GPIO144_GPIO		PIN_CFG(144, GPIO) -#define GPIO144_I2C3_SCL	PIN_CFG(144, ALT_A) -#define GPIO144_ETM_D3		PIN_CFG(144, ALT_B) -#define GPIO144_STMAPE_DAT2	PIN_CFG(144, ALT_C) - -#define GPIO145_GPIO		PIN_CFG(145, GPIO) -#define GPIO145_I2C3_SDA	PIN_CFG(145, ALT_A) -#define GPIO145_ETM_D2		PIN_CFG(145, ALT_B) -#define GPIO145_STMAPE_DAT3	PIN_CFG(145, ALT_C) - -#define GPIO146_GPIO		PIN_CFG(146, GPIO) -#define GPIO146_PWM_0		PIN_CFG(146, ALT_A) -#define GPIO146_ETM_D1		PIN_CFG(146, ALT_B) - -#define GPIO147_GPIO		PIN_CFG(147, GPIO) -#define GPIO147_PWM_1		PIN_CFG(147, ALT_A) -#define GPIO147_ETM_D0		PIN_CFG(147, ALT_B) - -#define GPIO148_GPIO		PIN_CFG(148, GPIO) -#define GPIO148_PWM_2		PIN_CFG(148, ALT_A) -#define GPIO148_ETM_CLK		PIN_CFG(148, ALT_B) - -#define GPIO160_GPIO		PIN_CFG(160, GPIO) -#define GPIO160_CLKOUT_REQn	PIN_CFG(160, ALT_A) - -#define GPIO161_GPIO		PIN_CFG(161, GPIO) -#define GPIO161_CLKOUT_0	PIN_CFG(161, ALT_A) - -#define GPIO162_GPIO		PIN_CFG(162, GPIO) -#define GPIO162_CLKOUT_1	PIN_CFG(162, ALT_A) - -#define GPIO163_GPIO		PIN_CFG(163, GPIO) - -#define GPIO164_GPIO		PIN_CFG(164, GPIO) -#define GPIO164_GPS_START	PIN_CFG(164, ALT_A) - -#define GPIO165_GPIO		PIN_CFG(165, GPIO) -#define GPIO165_SPI1_CS2n	PIN_CFG(165, ALT_A) -#define GPIO165_U3_RXD		PIN_CFG(165, ALT_B) -#define GPIO165_BUSMON_D20	PIN_CFG(165, ALT_C) - -#define GPIO166_GPIO		PIN_CFG(166, GPIO) -#define GPIO166_SPI1_CS1n	PIN_CFG(166, ALT_A) -#define GPIO166_U3_TXD		PIN_CFG(166, ALT_B) -#define GPIO166_BUSMON_D21	PIN_CFG(166, ALT_C) - -#define GPIO167_GPIO		PIN_CFG(167, GPIO) -#define GPIO167_SPI1_CS0n	PIN_CFG(167, ALT_A) -#define GPIO167_U3_RTSn		PIN_CFG(167, ALT_B) -#define GPIO167_BUSMON_D22	PIN_CFG(167, ALT_C) - -#define GPIO168_GPIO		PIN_CFG(168, GPIO) -#define GPIO168_SPI1_RXD	PIN_CFG(168, ALT_A) -#define GPIO168_U3_CTSn		PIN_CFG(168, ALT_B) -#define GPIO168_BUSMON_D23	PIN_CFG(168, ALT_C) - -#define GPIO169_GPIO		PIN_CFG(169, GPIO) -#define GPIO169_SPI1_TXD	PIN_CFG(169, ALT_A) -#define GPIO169_DDR_RC		PIN_CFG(169, ALT_B) -#define GPIO169_BUSMON_D24	PIN_CFG(169, ALT_C) - -#define GPIO170_GPIO		PIN_CFG(170, GPIO) -#define GPIO170_SPI1_CLK	PIN_CFG(170, ALT_A) - -#define GPIO171_GPIO		PIN_CFG(171, GPIO) -#define GPIO171_MC3_DAT0	PIN_CFG(171, ALT_A) -#define GPIO171_SPI3_RXD	PIN_CFG(171, ALT_B) -#define GPIO171_BUSMON_D25	PIN_CFG(171, ALT_C) - -#define GPIO172_GPIO		PIN_CFG(172, GPIO) -#define GPIO172_MC3_DAT1	PIN_CFG(172, ALT_A) -#define GPIO172_SPI3_CS1n	PIN_CFG(172, ALT_B) -#define GPIO172_BUSMON_D26	PIN_CFG(172, ALT_C) - -#define GPIO173_GPIO		PIN_CFG(173, GPIO) -#define GPIO173_MC3_DAT2	PIN_CFG(173, ALT_A) -#define GPIO173_SPI3_CS2n	PIN_CFG(173, ALT_B) -#define GPIO173_BUSMON_D27	PIN_CFG(173, ALT_C) - -#define GPIO174_GPIO		PIN_CFG(174, GPIO) -#define GPIO174_MC3_DAT3	PIN_CFG(174, ALT_A) -#define GPIO174_SPI3_CS0n	PIN_CFG(174, ALT_B) -#define GPIO174_BUSMON_D28	PIN_CFG(174, ALT_C) - -#define GPIO175_GPIO		PIN_CFG(175, GPIO) -#define GPIO175_MC3_CMD		PIN_CFG(175, ALT_A) -#define GPIO175_SPI3_TXD	PIN_CFG(175, ALT_B) -#define GPIO175_BUSMON_D29	PIN_CFG(175, ALT_C) - -#define GPIO176_GPIO		PIN_CFG(176, GPIO) -#define GPIO176_MC3_CLK		PIN_CFG(176, ALT_A) -#define GPIO176_SPI3_CLK	PIN_CFG(176, ALT_B) - -#define GPIO177_GPIO		PIN_CFG(177, GPIO) -#define GPIO177_U2_RXD		PIN_CFG(177, ALT_A) -#define GPIO177_I2C3_SCL	PIN_CFG(177, ALT_B) -#define GPIO177_BUSMON_D30	PIN_CFG(177, ALT_C) - -#define GPIO178_GPIO		PIN_CFG(178, GPIO) -#define GPIO178_U2_TXD		PIN_CFG(178, ALT_A) -#define GPIO178_I2C3_SDA	PIN_CFG(178, ALT_B) -#define GPIO178_BUSMON_D31	PIN_CFG(178, ALT_C) - -#define GPIO179_GPIO		PIN_CFG(179, GPIO) -#define GPIO179_U2_CTSn		PIN_CFG(179, ALT_A) -#define GPIO179_U3_RXD		PIN_CFG(179, ALT_B) -#define GPIO179_BUSMON_D32	PIN_CFG(179, ALT_C) - -#define GPIO180_GPIO		PIN_CFG(180, GPIO) -#define GPIO180_U2_RTSn		PIN_CFG(180, ALT_A) -#define GPIO180_U3_TXD		PIN_CFG(180, ALT_B) -#define GPIO180_BUSMON_D33	PIN_CFG(180, ALT_C) - -#define GPIO185_GPIO		PIN_CFG(185, GPIO) -#define GPIO185_SPI3_CS2n	PIN_CFG(185, ALT_A) -#define GPIO185_MC4_DAT0	PIN_CFG(185, ALT_B) - -#define GPIO186_GPIO		PIN_CFG(186, GPIO) -#define GPIO186_SPI3_CS1n	PIN_CFG(186, ALT_A) -#define GPIO186_MC4_DAT1	PIN_CFG(186, ALT_B) - -#define GPIO187_GPIO		PIN_CFG(187, GPIO) -#define GPIO187_SPI3_CS0n	PIN_CFG(187, ALT_A) -#define GPIO187_MC4_DAT2	PIN_CFG(187, ALT_B) - -#define GPIO188_GPIO		PIN_CFG(188, GPIO) -#define GPIO188_SPI3_RXD	PIN_CFG(188, ALT_A) -#define GPIO188_MC4_DAT3	PIN_CFG(188, ALT_B) - -#define GPIO189_GPIO		PIN_CFG(189, GPIO) -#define GPIO189_SPI3_TXD	PIN_CFG(189, ALT_A) -#define GPIO189_MC4_CMD		PIN_CFG(189, ALT_B) - -#define GPIO190_GPIO		PIN_CFG(190, GPIO) -#define GPIO190_SPI3_CLK	PIN_CFG(190, ALT_A) -#define GPIO190_MC4_CLK		PIN_CFG(190, ALT_B) - -#define GPIO191_GPIO		PIN_CFG(191, GPIO) -#define GPIO191_MC1_DAT0	PIN_CFG(191, ALT_A) -#define GPIO191_MC4_DAT4	PIN_CFG(191, ALT_B) -#define GPIO191_STMAPE_DAT0	PIN_CFG(191, ALT_C) - -#define GPIO192_GPIO		PIN_CFG(192, GPIO) -#define GPIO192_MC1_DAT1	PIN_CFG(192, ALT_A) -#define GPIO192_MC4_DAT5	PIN_CFG(192, ALT_B) -#define GPIO192_STMAPE_DAT1	PIN_CFG(192, ALT_C) - -#define GPIO193_GPIO		PIN_CFG(193, GPIO) -#define GPIO193_MC1_DAT2	PIN_CFG(193, ALT_A) -#define GPIO193_MC4_DAT6	PIN_CFG(193, ALT_B) -#define GPIO193_STMAPE_DAT2	PIN_CFG(193, ALT_C) - -#define GPIO194_GPIO		PIN_CFG(194, GPIO) -#define GPIO194_MC1_DAT3	PIN_CFG(194, ALT_A) -#define GPIO194_MC4_DAT7	PIN_CFG(194, ALT_B) -#define GPIO194_STMAPE_DAT3	PIN_CFG(194, ALT_C) - -#define GPIO195_GPIO		PIN_CFG(195, GPIO) -#define GPIO195_MC1_CLK		PIN_CFG(195, ALT_A) -#define GPIO195_STMAPE_CLK	PIN_CFG(195, ALT_B) -#define GPIO195_BUSMON_CLK	PIN_CFG(195, ALT_C) - -#define GPIO196_GPIO		PIN_CFG(196, GPIO) -#define GPIO196_MC1_CMD		PIN_CFG(196, ALT_A) -#define GPIO196_U0_RXD		PIN_CFG(196, ALT_B) -#define GPIO196_BUSMON_D38	PIN_CFG(196, ALT_C) - -#define GPIO197_GPIO		PIN_CFG(197, GPIO) -#define GPIO197_MC1_CMDDIR	PIN_CFG(197, ALT_A) -#define GPIO197_BUSMON_D39	PIN_CFG(197, ALT_B) - -#define GPIO198_GPIO		PIN_CFG(198, GPIO) -#define GPIO198_MC1_FBCLK	PIN_CFG(198, ALT_A) - -#define GPIO199_GPIO		PIN_CFG(199, GPIO) -#define GPIO199_MC1_DAT0DIR	PIN_CFG(199, ALT_A) -#define GPIO199_BUSMON_D40	PIN_CFG(199, ALT_B) - -#define GPIO200_GPIO		PIN_CFG(200, GPIO) -#define GPIO200_U1_TXD		PIN_CFG(200, ALT_A) -#define GPIO200_ACCU0_RTSn	PIN_CFG(200, ALT_B) - -#define GPIO201_GPIO		PIN_CFG(201, GPIO) -#define GPIO201_U1_RXD		PIN_CFG(201, ALT_A) -#define GPIO201_ACCU0_CTSn	PIN_CFG(201, ALT_B) - -#define GPIO202_GPIO		PIN_CFG(202, GPIO) -#define GPIO202_U1_CTSn		PIN_CFG(202, ALT_A) -#define GPIO202_ACCU0_RXD	PIN_CFG(202, ALT_B) - -#define GPIO203_GPIO		PIN_CFG(203, GPIO) -#define GPIO203_U1_RTSn		PIN_CFG(203, ALT_A) -#define GPIO203_ACCU0_TXD	PIN_CFG(203, ALT_B) - -#define GPIO204_GPIO		PIN_CFG(204, GPIO) -#define GPIO204_SPI0_CS2n	PIN_CFG(204, ALT_A) -#define GPIO204_ACCGPIO_000	PIN_CFG(204, ALT_B) -#define GPIO204_LCD_VSI1	PIN_CFG(204, ALT_C) - -#define GPIO205_GPIO		PIN_CFG(205, GPIO) -#define GPIO205_SPI0_CS1n	PIN_CFG(205, ALT_A) -#define GPIO205_ACCGPIO_001	PIN_CFG(205, ALT_B) -#define GPIO205_LCD_D3		PIN_CFG(205, ALT_C) - -#define GPIO206_GPIO		PIN_CFG(206, GPIO) -#define GPIO206_SPI0_CS0n	PIN_CFG(206, ALT_A) -#define GPIO206_ACCGPIO_002	PIN_CFG(206, ALT_B) -#define GPIO206_LCD_D2		PIN_CFG(206, ALT_C) - -#define GPIO207_GPIO		PIN_CFG(207, GPIO) -#define GPIO207_SPI0_RXD	PIN_CFG(207, ALT_A) -#define GPIO207_ACCGPIO_003	PIN_CFG(207, ALT_B) -#define GPIO207_LCD_D1		PIN_CFG(207, ALT_C) - -#define GPIO208_GPIO		PIN_CFG(208, GPIO) -#define GPIO208_SPI0_TXD	PIN_CFG(208, ALT_A) -#define GPIO208_ACCGPIO_004	PIN_CFG(208, ALT_B) -#define GPIO208_LCD_D0		PIN_CFG(208, ALT_C) - -#define GPIO209_GPIO		PIN_CFG(209, GPIO) -#define GPIO209_SPI0_CLK	PIN_CFG(209, ALT_A) -#define GPIO209_ACCGPIO_005	PIN_CFG(209, ALT_B) -#define GPIO209_LCD_CLK		PIN_CFG(209, ALT_C) - -#define GPIO210_GPIO		PIN_CFG(210, GPIO) -#define GPIO210_LCD_VSO		PIN_CFG(210, ALT_A) -#define GPIO210_PRCMU_PWRCTRL1	PIN_CFG(210, ALT_B) - -#define GPIO211_GPIO		PIN_CFG(211, GPIO) -#define GPIO211_LCD_VSI0	PIN_CFG(211, ALT_A) -#define GPIO211_PRCMU_PWRCTRL2	PIN_CFG(211, ALT_B) - -#define GPIO212_GPIO		PIN_CFG(212, GPIO) -#define GPIO212_SPI2_CS2n	PIN_CFG(212, ALT_A) -#define GPIO212_LCD_HSO		PIN_CFG(212, ALT_B) - -#define GPIO213_GPIO		PIN_CFG(213, GPIO) -#define GPIO213_SPI2_CS1n	PIN_CFG(213, ALT_A) -#define GPIO213_LCD_DE		PIN_CFG(213, ALT_B) -#define GPIO213_BUSMON_D16	PIN_CFG(213, ALT_C) - -#define GPIO214_GPIO		PIN_CFG(214, GPIO) -#define GPIO214_SPI2_CS0n	PIN_CFG(214, ALT_A) -#define GPIO214_LCD_D7		PIN_CFG(214, ALT_B) -#define GPIO214_BUSMON_D17	PIN_CFG(214, ALT_C) - -#define GPIO215_GPIO		PIN_CFG(215, GPIO) -#define GPIO215_SPI2_RXD	PIN_CFG(215, ALT_A) -#define GPIO215_LCD_D6		PIN_CFG(215, ALT_B) -#define GPIO215_BUSMON_D18	PIN_CFG(215, ALT_C) - -#define GPIO216_GPIO		PIN_CFG(216, GPIO) -#define GPIO216_SPI2_CLK	PIN_CFG(216, ALT_A) -#define GPIO216_LCD_D5		PIN_CFG(216, ALT_B) - -#define GPIO217_GPIO		PIN_CFG(217, GPIO) -#define GPIO217_SPI2_TXD	PIN_CFG(217, ALT_A) -#define GPIO217_LCD_D4		PIN_CFG(217, ALT_B) -#define GPIO217_BUSMON_D19	PIN_CFG(217, ALT_C) - -#define GPIO218_GPIO		PIN_CFG(218, GPIO) -#define GPIO218_I2C2_SCL	PIN_CFG(218, ALT_A) -#define GPIO218_LCD_VSO		PIN_CFG(218, ALT_B) - -#define GPIO219_GPIO		PIN_CFG(219, GPIO) -#define GPIO219_I2C2_SDA	PIN_CFG(219, ALT_A) -#define GPIO219_LCD_D3		PIN_CFG(219, ALT_B) - -#define GPIO220_GPIO		PIN_CFG(220, GPIO) -#define GPIO220_MSP2_TCK	PIN_CFG(220, ALT_A) -#define GPIO220_LCD_D2		PIN_CFG(220, ALT_B) - -#define GPIO221_GPIO		PIN_CFG(221, GPIO) -#define GPIO221_MSP2_TFS	PIN_CFG(221, ALT_A) -#define GPIO221_LCD_D1		PIN_CFG(221, ALT_B) - -#define GPIO222_GPIO		PIN_CFG(222, GPIO) -#define GPIO222_MSP2_TXD	PIN_CFG(222, ALT_A) -#define GPIO222_LCD_D0		PIN_CFG(222, ALT_B) - -#define GPIO223_GPIO		PIN_CFG(223, GPIO) -#define GPIO223_MSP2_RXD	PIN_CFG(223, ALT_A) -#define GPIO223_LCD_CLK		PIN_CFG(223, ALT_B) - -#define GPIO224_GPIO		PIN_CFG(224, GPIO) -#define GPIO224_PRCMU_PWRCTRL0	PIN_CFG(224, ALT_A) -#define GPIO224_LCD_VSI1	PIN_CFG(224, ALT_B) - -#define GPIO225_GPIO		PIN_CFG(225, GPIO) -#define GPIO225_PRCMU_PWRCTRL1	PIN_CFG(225, ALT_A) -#define GPIO225_IRDA_RXD	PIN_CFG(225, ALT_B) - -#define GPIO226_GPIO		PIN_CFG(226, GPIO) -#define GPIO226_PRCMU_PWRCTRL2	PIN_CFG(226, ALT_A) -#define GPIO226_IRRC_DAT	PIN_CFG(226, ALT_B) - -#define GPIO227_GPIO		PIN_CFG(227, GPIO) -#define GPIO227_IRRC_DAT	PIN_CFG(227, ALT_A) -#define GPIO227_IRDA_TXD	PIN_CFG(227, ALT_B) - -#endif diff --git a/arch/arm/mach-ux500/pins-db8500.h b/arch/arm/mach-ux500/pins-db8500.h deleted file mode 100644 index f923764ee16..00000000000 --- a/arch/arm/mach-ux500/pins-db8500.h +++ /dev/null @@ -1,742 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * License terms: GNU General Public License, version 2 - * Author: Rabin Vincent <rabin.vincent@stericsson.com> - */ - -#ifndef __MACH_PINS_DB8500_H -#define __MACH_PINS_DB8500_H - -/* - * TODO: Eventually encode all non-board specific pull up/down configuration - * here. - */ - -#define GPIO0_GPIO		PIN_CFG(0, GPIO) -#define GPIO0_U0_CTSn		PIN_CFG(0, ALT_A) -#define GPIO0_TRIG_OUT		PIN_CFG(0, ALT_B) -#define GPIO0_IP_TDO		PIN_CFG(0, ALT_C) - -#define GPIO1_GPIO		PIN_CFG(1, GPIO) -#define GPIO1_U0_RTSn		PIN_CFG(1, ALT_A) -#define GPIO1_TRIG_IN		PIN_CFG(1, ALT_B) -#define GPIO1_IP_TDI		PIN_CFG(1, ALT_C) - -#define GPIO2_GPIO		PIN_CFG(2, GPIO) -#define GPIO2_U0_RXD		PIN_CFG(2, ALT_A) -#define GPIO2_NONE		PIN_CFG(2, ALT_B) -#define GPIO2_IP_TMS		PIN_CFG(2, ALT_C) - -#define GPIO3_GPIO		PIN_CFG(3, GPIO) -#define GPIO3_U0_TXD		PIN_CFG(3, ALT_A) -#define GPIO3_NONE		PIN_CFG(3, ALT_B) -#define GPIO3_IP_TCK		PIN_CFG(3, ALT_C) - -#define GPIO4_GPIO		PIN_CFG(4, GPIO) -#define GPIO4_U1_RXD		PIN_CFG(4, ALT_A) -#define GPIO4_I2C4_SCL		PIN_CFG_PULL(4, ALT_B, UP) -#define GPIO4_IP_TRSTn		PIN_CFG(4, ALT_C) - -#define GPIO5_GPIO		PIN_CFG(5, GPIO) -#define GPIO5_U1_TXD		PIN_CFG(5, ALT_A) -#define GPIO5_I2C4_SDA		PIN_CFG_PULL(5, ALT_B, UP) -#define GPIO5_IP_GPIO6		PIN_CFG(5, ALT_C) - -#define GPIO6_GPIO		PIN_CFG(6, GPIO) -#define GPIO6_U1_CTSn		PIN_CFG(6, ALT_A) -#define GPIO6_I2C1_SCL		PIN_CFG_PULL(6, ALT_B, UP) -#define GPIO6_IP_GPIO0		PIN_CFG(6, ALT_C) - -#define GPIO7_GPIO		PIN_CFG(7, GPIO) -#define GPIO7_U1_RTSn		PIN_CFG(7, ALT_A) -#define GPIO7_I2C1_SDA		PIN_CFG_PULL(7, ALT_B, UP) -#define GPIO7_IP_GPIO1		PIN_CFG(7, ALT_C) - -#define GPIO8_GPIO		PIN_CFG(8, GPIO) -#define GPIO8_IPI2C_SDA		PIN_CFG_PULL(8, ALT_A, UP) -#define GPIO8_I2C2_SDA		PIN_CFG_PULL(8, ALT_B, UP) - -#define GPIO9_GPIO		PIN_CFG(9, GPIO) -#define GPIO9_IPI2C_SCL		PIN_CFG_PULL(9, ALT_A, UP) -#define GPIO9_I2C2_SCL		PIN_CFG_PULL(9, ALT_B, UP) - -#define GPIO10_GPIO		PIN_CFG(10, GPIO) -#define GPIO10_IPI2C_SDA	PIN_CFG_PULL(10, ALT_A, UP) -#define GPIO10_I2C2_SDA		PIN_CFG_PULL(10, ALT_B, UP) -#define GPIO10_IP_GPIO3		PIN_CFG(10, ALT_C) - -#define GPIO11_GPIO		PIN_CFG(11, GPIO) -#define GPIO11_IPI2C_SCL	PIN_CFG_PULL(11, ALT_A, UP) -#define GPIO11_I2C2_SCL		PIN_CFG_PULL(11, ALT_B, UP) -#define GPIO11_IP_GPIO2		PIN_CFG(11, ALT_C) - -#define GPIO12_GPIO		PIN_CFG(12, GPIO) -#define GPIO12_MSP0_TXD		PIN_CFG(12, ALT_A) -#define GPIO12_MSP0_RXD		PIN_CFG(12, ALT_B) - -#define GPIO13_GPIO		PIN_CFG(13, GPIO) -#define GPIO13_MSP0_TFS		PIN_CFG(13, ALT_A) - -#define GPIO14_GPIO		PIN_CFG(14, GPIO) -#define GPIO14_MSP0_TCK		PIN_CFG(14, ALT_A) - -#define GPIO15_GPIO		PIN_CFG(15, GPIO) -#define GPIO15_MSP0_RXD		PIN_CFG(15, ALT_A) -#define GPIO15_MSP0_TXD		PIN_CFG(15, ALT_B) - -#define GPIO16_GPIO		PIN_CFG(16, GPIO) -#define GPIO16_MSP0_RFS		PIN_CFG(16, ALT_A) -#define GPIO16_I2C1_SCL		PIN_CFG_PULL(16, ALT_B, UP) -#define GPIO16_SLIM0_DAT	PIN_CFG(16, ALT_C) - -#define GPIO17_GPIO		PIN_CFG(17, GPIO) -#define GPIO17_MSP0_RCK		PIN_CFG(17, ALT_A) -#define GPIO17_I2C1_SDA		PIN_CFG_PULL(17, ALT_B, UP) -#define GPIO17_SLIM0_CLK	PIN_CFG(17, ALT_C) - -#define GPIO18_GPIO		PIN_CFG(18, GPIO) -#define GPIO18_MC0_CMDDIR	PIN_CFG_PULL(18, ALT_A, UP) -#define GPIO18_U2_RXD		PIN_CFG(18, ALT_B) -#define GPIO18_MS_IEP		PIN_CFG(18, ALT_C) - -#define GPIO19_GPIO		PIN_CFG(19, GPIO) -#define GPIO19_MC0_DAT0DIR	PIN_CFG_PULL(19, ALT_A, UP) -#define GPIO19_U2_TXD		PIN_CFG(19, ALT_B) -#define GPIO19_MS_DAT0DIR	PIN_CFG(19, ALT_C) - -#define GPIO20_GPIO		PIN_CFG(20, GPIO) -#define GPIO20_MC0_DAT2DIR	PIN_CFG_PULL(20, ALT_A, UP) -#define GPIO20_UARTMOD_TXD	PIN_CFG(20, ALT_B) -#define GPIO20_IP_TRIGOUT	PIN_CFG(20, ALT_C) - -#define GPIO21_GPIO		PIN_CFG(21, GPIO) -#define GPIO21_MC0_DAT31DIR	PIN_CFG_PULL(21, ALT_A, UP) -#define GPIO21_MSP0_SCK		PIN_CFG(21, ALT_B) -#define GPIO21_MS_DAT31DIR	PIN_CFG(21, ALT_C) - -#define GPIO22_GPIO		PIN_CFG(22, GPIO) -#define GPIO22_MC0_FBCLK	PIN_CFG_PULL(22, ALT_A, UP) -#define GPIO22_UARTMOD_RXD	PIN_CFG(22, ALT_B) -#define GPIO22_MS_FBCLK		PIN_CFG(22, ALT_C) - -#define GPIO23_GPIO		PIN_CFG(23, GPIO) -#define GPIO23_MC0_CLK		PIN_CFG_PULL(23, ALT_A, UP) -#define GPIO23_STMMOD_CLK	PIN_CFG(23, ALT_B) -#define GPIO23_MS_CLK		PIN_CFG(23, ALT_C) - -#define GPIO24_GPIO		PIN_CFG(24, GPIO) -#define GPIO24_MC0_CMD		PIN_CFG_PULL(24, ALT_A, UP) -#define GPIO24_UARTMOD_RXD	PIN_CFG(24, ALT_B) -#define GPIO24_MS_BS		PIN_CFG(24, ALT_C) - -#define GPIO25_GPIO		PIN_CFG(25, GPIO) -#define GPIO25_MC0_DAT0		PIN_CFG_PULL(25, ALT_A, UP) -#define GPIO25_STMMOD_DAT0	PIN_CFG(25, ALT_B) -#define GPIO25_MS_DAT0		PIN_CFG(25, ALT_C) - -#define GPIO26_GPIO		PIN_CFG(26, GPIO) -#define GPIO26_MC0_DAT1		PIN_CFG_PULL(26, ALT_A, UP) -#define GPIO26_STMMOD_DAT1	PIN_CFG(26, ALT_B) -#define GPIO26_MS_DAT1		PIN_CFG(26, ALT_C) - -#define GPIO27_GPIO		PIN_CFG(27, GPIO) -#define GPIO27_MC0_DAT2		PIN_CFG_PULL(27, ALT_A, UP) -#define GPIO27_STMMOD_DAT2	PIN_CFG(27, ALT_B) -#define GPIO27_MS_DAT2		PIN_CFG(27, ALT_C) - -#define GPIO28_GPIO		PIN_CFG(28, GPIO) -#define GPIO28_MC0_DAT3		PIN_CFG_PULL(28, ALT_A, UP) -#define GPIO28_STMMOD_DAT3	PIN_CFG(28, ALT_B) -#define GPIO28_MS_DAT3		PIN_CFG(28, ALT_C) - -#define GPIO29_GPIO		PIN_CFG(29, GPIO) -#define GPIO29_MC0_DAT4		PIN_CFG(29, ALT_A) -#define GPIO29_SPI3_CLK		PIN_CFG(29, ALT_B) -#define GPIO29_U2_RXD		PIN_CFG(29, ALT_C) - -#define GPIO30_GPIO		PIN_CFG(30, GPIO) -#define GPIO30_MC0_DAT5		PIN_CFG(30, ALT_A) -#define GPIO30_SPI3_RXD		PIN_CFG(30, ALT_B) -#define GPIO30_U2_TXD		PIN_CFG(30, ALT_C) - -#define GPIO31_GPIO		PIN_CFG(31, GPIO) -#define GPIO31_MC0_DAT6		PIN_CFG(31, ALT_A) -#define GPIO31_SPI3_FRM		PIN_CFG(31, ALT_B) -#define GPIO31_U2_CTSn		PIN_CFG(31, ALT_C) - -#define GPIO32_GPIO		PIN_CFG(32, GPIO) -#define GPIO32_MC0_DAT7		PIN_CFG(32, ALT_A) -#define GPIO32_SPI3_TXD		PIN_CFG(32, ALT_B) -#define GPIO32_U2_RTSn		PIN_CFG(32, ALT_C) - -#define GPIO33_GPIO		PIN_CFG(33, GPIO) -#define GPIO33_MSP1_TXD		PIN_CFG(33, ALT_A) -#define GPIO33_MSP1_RXD		PIN_CFG(33, ALT_B) -#define GPIO33_U0_DTRn		PIN_CFG(33, ALT_C) - -#define GPIO34_GPIO		PIN_CFG(34, GPIO) -#define GPIO34_MSP1_TFS		PIN_CFG(34, ALT_A) -#define GPIO34_NONE		PIN_CFG(34, ALT_B) -#define GPIO34_U0_DCDn		PIN_CFG(34, ALT_C) - -#define GPIO35_GPIO		PIN_CFG(35, GPIO) -#define GPIO35_MSP1_TCK		PIN_CFG(35, ALT_A) -#define GPIO35_NONE		PIN_CFG(35, ALT_B) -#define GPIO35_U0_DSRn		PIN_CFG(35, ALT_C) - -#define GPIO36_GPIO		PIN_CFG(36, GPIO) -#define GPIO36_MSP1_RXD		PIN_CFG(36, ALT_A) -#define GPIO36_MSP1_TXD		PIN_CFG(36, ALT_B) -#define GPIO36_U0_RIn		PIN_CFG(36, ALT_C) - -#define GPIO64_GPIO		PIN_CFG(64, GPIO) -#define GPIO64_LCDB_DE		PIN_CFG(64, ALT_A) -#define GPIO64_KP_O1		PIN_CFG(64, ALT_B) -#define GPIO64_IP_GPIO4		PIN_CFG(64, ALT_C) - -#define GPIO65_GPIO		PIN_CFG(65, GPIO) -#define GPIO65_LCDB_HSO		PIN_CFG(65, ALT_A) -#define GPIO65_KP_O0		PIN_CFG(65, ALT_B) -#define GPIO65_IP_GPIO5		PIN_CFG(65, ALT_C) - -#define GPIO66_GPIO		PIN_CFG(66, GPIO) -#define GPIO66_LCDB_VSO		PIN_CFG(66, ALT_A) -#define GPIO66_KP_I1		PIN_CFG(66, ALT_B) -#define GPIO66_IP_GPIO6		PIN_CFG(66, ALT_C) - -#define GPIO67_GPIO		PIN_CFG(67, GPIO) -#define GPIO67_LCDB_CLK		PIN_CFG(67, ALT_A) -#define GPIO67_KP_I0		PIN_CFG(67, ALT_B) -#define GPIO67_IP_GPIO7		PIN_CFG(67, ALT_C) - -#define GPIO68_GPIO		PIN_CFG(68, GPIO) -#define GPIO68_LCD_VSI0		PIN_CFG(68, ALT_A) -#define GPIO68_KP_O7		PIN_CFG(68, ALT_B) -#define GPIO68_SM_CLE		PIN_CFG(68, ALT_C) - -#define GPIO69_GPIO		PIN_CFG(69, GPIO) -#define GPIO69_LCD_VSI1		PIN_CFG(69, ALT_A) -#define GPIO69_KP_I7		PIN_CFG(69, ALT_B) -#define GPIO69_SM_ALE		PIN_CFG(69, ALT_C) - -#define GPIO70_GPIO		PIN_CFG(70, GPIO) -#define GPIO70_LCD_D0		PIN_CFG(70, ALT_A) -#define GPIO70_KP_O5		PIN_CFG(70, ALT_B) -#define GPIO70_STMAPE_CLK	PIN_CFG(70, ALT_C) - -#define GPIO71_GPIO		PIN_CFG(71, GPIO) -#define GPIO71_LCD_D1		PIN_CFG(71, ALT_A) -#define GPIO71_KP_O4		PIN_CFG(71, ALT_B) -#define GPIO71_STMAPE_DAT3	PIN_CFG(71, ALT_C) - -#define GPIO72_GPIO		PIN_CFG(72, GPIO) -#define GPIO72_LCD_D2		PIN_CFG(72, ALT_A) -#define GPIO72_KP_O3		PIN_CFG(72, ALT_B) -#define GPIO72_STMAPE_DAT2	PIN_CFG(72, ALT_C) - -#define GPIO73_GPIO		PIN_CFG(73, GPIO) -#define GPIO73_LCD_D3		PIN_CFG(73, ALT_A) -#define GPIO73_KP_O2		PIN_CFG(73, ALT_B) -#define GPIO73_STMAPE_DAT1	PIN_CFG(73, ALT_C) - -#define GPIO74_GPIO		PIN_CFG(74, GPIO) -#define GPIO74_LCD_D4		PIN_CFG(74, ALT_A) -#define GPIO74_KP_I5		PIN_CFG(74, ALT_B) -#define GPIO74_STMAPE_DAT0	PIN_CFG(74, ALT_C) - -#define GPIO75_GPIO		PIN_CFG(75, GPIO) -#define GPIO75_LCD_D5		PIN_CFG(75, ALT_A) -#define GPIO75_KP_I4		PIN_CFG(75, ALT_B) -#define GPIO75_U2_RXD		PIN_CFG(75, ALT_C) - -#define GPIO76_GPIO		PIN_CFG(76, GPIO) -#define GPIO76_LCD_D6		PIN_CFG(76, ALT_A) -#define GPIO76_KP_I3		PIN_CFG(76, ALT_B) -#define GPIO76_U2_TXD		PIN_CFG(76, ALT_C) - -#define GPIO77_GPIO		PIN_CFG(77, GPIO) -#define GPIO77_LCD_D7		PIN_CFG(77, ALT_A) -#define GPIO77_KP_I2		PIN_CFG(77, ALT_B) -#define GPIO77_NONE		PIN_CFG(77, ALT_C) - -#define GPIO78_GPIO		PIN_CFG(78, GPIO) -#define GPIO78_LCD_D8		PIN_CFG(78, ALT_A) -#define GPIO78_KP_O6		PIN_CFG(78, ALT_B) -#define GPIO78_IP_GPIO2		PIN_CFG(78, ALT_C) - -#define GPIO79_GPIO		PIN_CFG(79, GPIO) -#define GPIO79_LCD_D9		PIN_CFG(79, ALT_A) -#define GPIO79_KP_I6		PIN_CFG(79, ALT_B) -#define GPIO79_IP_GPIO3		PIN_CFG(79, ALT_C) - -#define GPIO80_GPIO		PIN_CFG(80, GPIO) -#define GPIO80_LCD_D10		PIN_CFG(80, ALT_A) -#define GPIO80_KP_SKA0		PIN_CFG(80, ALT_B) -#define GPIO80_IP_GPIO4		PIN_CFG(80, ALT_C) - -#define GPIO81_GPIO		PIN_CFG(81, GPIO) -#define GPIO81_LCD_D11		PIN_CFG(81, ALT_A) -#define GPIO81_KP_SKB0		PIN_CFG(81, ALT_B) -#define GPIO81_IP_GPIO5		PIN_CFG(81, ALT_C) - -#define GPIO82_GPIO		PIN_CFG(82, GPIO) -#define GPIO82_LCD_D12		PIN_CFG(82, ALT_A) -#define GPIO82_KP_O5		PIN_CFG(82, ALT_B) - -#define GPIO83_GPIO		PIN_CFG(83, GPIO) -#define GPIO83_LCD_D13		PIN_CFG(83, ALT_A) -#define GPIO83_KP_O4		PIN_CFG(83, ALT_B) - -#define GPIO84_GPIO		PIN_CFG(84, GPIO) -#define GPIO84_LCD_D14		PIN_CFG(84, ALT_A) -#define GPIO84_KP_I5		PIN_CFG(84, ALT_B) - -#define GPIO85_GPIO		PIN_CFG(85, GPIO) -#define GPIO85_LCD_D15		PIN_CFG(85, ALT_A) -#define GPIO85_KP_I4		PIN_CFG(85, ALT_B) - -#define GPIO86_GPIO		PIN_CFG(86, GPIO) -#define GPIO86_LCD_D16		PIN_CFG(86, ALT_A) -#define GPIO86_SM_ADQ0		PIN_CFG(86, ALT_B) -#define GPIO86_MC5_DAT0		PIN_CFG(86, ALT_C) - -#define GPIO87_GPIO		PIN_CFG(87, GPIO) -#define GPIO87_LCD_D17		PIN_CFG(87, ALT_A) -#define GPIO87_SM_ADQ1		PIN_CFG(87, ALT_B) -#define GPIO87_MC5_DAT1		PIN_CFG(87, ALT_C) - -#define GPIO88_GPIO		PIN_CFG(88, GPIO) -#define GPIO88_LCD_D18		PIN_CFG(88, ALT_A) -#define GPIO88_SM_ADQ2		PIN_CFG(88, ALT_B) -#define GPIO88_MC5_DAT2		PIN_CFG(88, ALT_C) - -#define GPIO89_GPIO		PIN_CFG(89, GPIO) -#define GPIO89_LCD_D19		PIN_CFG(89, ALT_A) -#define GPIO89_SM_ADQ3		PIN_CFG(89, ALT_B) -#define GPIO89_MC5_DAT3		PIN_CFG(89, ALT_C) - -#define GPIO90_GPIO		PIN_CFG(90, GPIO) -#define GPIO90_LCD_D20		PIN_CFG(90, ALT_A) -#define GPIO90_SM_ADQ4		PIN_CFG(90, ALT_B) -#define GPIO90_MC5_CMD		PIN_CFG(90, ALT_C) - -#define GPIO91_GPIO		PIN_CFG(91, GPIO) -#define GPIO91_LCD_D21		PIN_CFG(91, ALT_A) -#define GPIO91_SM_ADQ5		PIN_CFG(91, ALT_B) -#define GPIO91_MC5_FBCLK	PIN_CFG(91, ALT_C) - -#define GPIO92_GPIO		PIN_CFG(92, GPIO) -#define GPIO92_LCD_D22		PIN_CFG(92, ALT_A) -#define GPIO92_SM_ADQ6		PIN_CFG(92, ALT_B) -#define GPIO92_MC5_CLK		PIN_CFG(92, ALT_C) - -#define GPIO93_GPIO		PIN_CFG(93, GPIO) -#define GPIO93_LCD_D23		PIN_CFG(93, ALT_A) -#define GPIO93_SM_ADQ7		PIN_CFG(93, ALT_B) -#define GPIO93_MC5_DAT4		PIN_CFG(93, ALT_C) - -#define GPIO94_GPIO		PIN_CFG(94, GPIO) -#define GPIO94_KP_O7		PIN_CFG(94, ALT_A) -#define GPIO94_SM_ADVn		PIN_CFG(94, ALT_B) -#define GPIO94_MC5_DAT5		PIN_CFG(94, ALT_C) - -#define GPIO95_GPIO		PIN_CFG(95, GPIO) -#define GPIO95_KP_I7		PIN_CFG(95, ALT_A) -#define GPIO95_SM_CS0n		PIN_CFG(95, ALT_B) -#define GPIO95_SM_PS0n		PIN_CFG(95, ALT_C) - -#define GPIO96_GPIO		PIN_CFG(96, GPIO) -#define GPIO96_KP_O6		PIN_CFG(96, ALT_A) -#define GPIO96_SM_OEn		PIN_CFG(96, ALT_B) -#define GPIO96_MC5_DAT6		PIN_CFG(96, ALT_C) - -#define GPIO97_GPIO		PIN_CFG(97, GPIO) -#define GPIO97_KP_I6		PIN_CFG(97, ALT_A) -#define GPIO97_SM_WEn		PIN_CFG(97, ALT_B) -#define GPIO97_MC5_DAT7		PIN_CFG(97, ALT_C) - -#define GPIO128_GPIO		PIN_CFG(128, GPIO) -#define GPIO128_MC2_CLK		PIN_CFG_PULL(128, ALT_A, UP) -#define GPIO128_SM_CKO		PIN_CFG(128, ALT_B) - -#define GPIO129_GPIO		PIN_CFG(129, GPIO) -#define GPIO129_MC2_CMD		PIN_CFG_PULL(129, ALT_A, UP) -#define GPIO129_SM_WAIT0n	PIN_CFG(129, ALT_B) - -#define GPIO130_GPIO		PIN_CFG(130, GPIO) -#define GPIO130_MC2_FBCLK	PIN_CFG_PULL(130, ALT_A, UP) -#define GPIO130_SM_FBCLK	PIN_CFG(130, ALT_B) -#define GPIO130_MC2_RSTN	PIN_CFG(130, ALT_C) - -#define GPIO131_GPIO		PIN_CFG(131, GPIO) -#define GPIO131_MC2_DAT0	PIN_CFG_PULL(131, ALT_A, UP) -#define GPIO131_SM_ADQ8		PIN_CFG(131, ALT_B) - -#define GPIO132_GPIO		PIN_CFG(132, GPIO) -#define GPIO132_MC2_DAT1	PIN_CFG_PULL(132, ALT_A, UP) -#define GPIO132_SM_ADQ9		PIN_CFG(132, ALT_B) - -#define GPIO133_GPIO		PIN_CFG(133, GPIO) -#define GPIO133_MC2_DAT2	PIN_CFG_PULL(133, ALT_A, UP) -#define GPIO133_SM_ADQ10	PIN_CFG(133, ALT_B) - -#define GPIO134_GPIO		PIN_CFG(134, GPIO) -#define GPIO134_MC2_DAT3	PIN_CFG_PULL(134, ALT_A, UP) -#define GPIO134_SM_ADQ11	PIN_CFG(134, ALT_B) - -#define GPIO135_GPIO		PIN_CFG(135, GPIO) -#define GPIO135_MC2_DAT4	PIN_CFG_PULL(135, ALT_A, UP) -#define GPIO135_SM_ADQ12	PIN_CFG(135, ALT_B) - -#define GPIO136_GPIO		PIN_CFG(136, GPIO) -#define GPIO136_MC2_DAT5	PIN_CFG_PULL(136, ALT_A, UP) -#define GPIO136_SM_ADQ13	PIN_CFG(136, ALT_B) - -#define GPIO137_GPIO		PIN_CFG(137, GPIO) -#define GPIO137_MC2_DAT6	PIN_CFG_PULL(137, ALT_A, UP) -#define GPIO137_SM_ADQ14	PIN_CFG(137, ALT_B) - -#define GPIO138_GPIO		PIN_CFG(138, GPIO) -#define GPIO138_MC2_DAT7	PIN_CFG_PULL(138, ALT_A, UP) -#define GPIO138_SM_ADQ15	PIN_CFG(138, ALT_B) - -#define GPIO139_GPIO		PIN_CFG(139, GPIO) -#define GPIO139_SSP1_RXD	PIN_CFG(139, ALT_A) -#define GPIO139_SM_WAIT1n	PIN_CFG(139, ALT_B) -#define GPIO139_KP_O8		PIN_CFG(139, ALT_C) - -#define GPIO140_GPIO		PIN_CFG(140, GPIO) -#define GPIO140_SSP1_TXD	PIN_CFG(140, ALT_A) -#define GPIO140_IP_GPIO7	PIN_CFG(140, ALT_B) -#define GPIO140_KP_SKA1		PIN_CFG(140, ALT_C) - -#define GPIO141_GPIO		PIN_CFG(141, GPIO) -#define GPIO141_SSP1_CLK	PIN_CFG(141, ALT_A) -#define GPIO141_IP_GPIO2	PIN_CFG(141, ALT_B) -#define GPIO141_KP_O9		PIN_CFG(141, ALT_C) - -#define GPIO142_GPIO		PIN_CFG(142, GPIO) -#define GPIO142_SSP1_FRM	PIN_CFG(142, ALT_A) -#define GPIO142_IP_GPIO3	PIN_CFG(142, ALT_B) -#define GPIO142_KP_SKB1		PIN_CFG(142, ALT_C) - -#define GPIO143_GPIO		PIN_CFG(143, GPIO) -#define GPIO143_SSP0_CLK	PIN_CFG(143, ALT_A) - -#define GPIO144_GPIO		PIN_CFG(144, GPIO) -#define GPIO144_SSP0_FRM	PIN_CFG(144, ALT_A) - -#define GPIO145_GPIO		PIN_CFG(145, GPIO) -#define GPIO145_SSP0_RXD	PIN_CFG(145, ALT_A) - -#define GPIO146_GPIO		PIN_CFG(146, GPIO) -#define GPIO146_SSP0_TXD	PIN_CFG(146, ALT_A) - -#define GPIO147_GPIO		PIN_CFG(147, GPIO) -#define GPIO147_I2C0_SCL	PIN_CFG_PULL(147, ALT_A, UP) - -#define GPIO148_GPIO		PIN_CFG(148, GPIO) -#define GPIO148_I2C0_SDA	PIN_CFG_PULL(148, ALT_A, UP) - -#define GPIO149_GPIO		PIN_CFG(149, GPIO) -#define GPIO149_IP_GPIO0	PIN_CFG(149, ALT_A) -#define GPIO149_SM_CS1n		PIN_CFG(149, ALT_B) -#define GPIO149_SM_PS1n		PIN_CFG(149, ALT_C) - -#define GPIO150_GPIO		PIN_CFG(150, GPIO) -#define GPIO150_IP_GPIO1	PIN_CFG(150, ALT_A) -#define GPIO150_LCDA_CLK	PIN_CFG(150, ALT_B) - -#define GPIO151_GPIO		PIN_CFG(151, GPIO) -#define GPIO151_KP_SKA0		PIN_CFG(151, ALT_A) -#define GPIO151_LCD_VSI0	PIN_CFG(151, ALT_B) -#define GPIO151_KP_O8		PIN_CFG(151, ALT_C) - -#define GPIO152_GPIO		PIN_CFG(152, GPIO) -#define GPIO152_KP_SKB0		PIN_CFG(152, ALT_A) -#define GPIO152_LCD_VSI1	PIN_CFG(152, ALT_B) -#define GPIO152_KP_O9		PIN_CFG(152, ALT_C) - -#define GPIO153_GPIO		PIN_CFG(153, GPIO) -#define GPIO153_KP_I7		PIN_CFG_PULL(153, ALT_A, DOWN) -#define GPIO153_LCD_D24		PIN_CFG(153, ALT_B) -#define GPIO153_U2_RXD		PIN_CFG(153, ALT_C) - -#define GPIO154_GPIO		PIN_CFG(154, GPIO) -#define GPIO154_KP_I6		PIN_CFG_PULL(154, ALT_A, DOWN) -#define GPIO154_LCD_D25		PIN_CFG(154, ALT_B) -#define GPIO154_U2_TXD		PIN_CFG(154, ALT_C) - -#define GPIO155_GPIO		PIN_CFG(155, GPIO) -#define GPIO155_KP_I5		PIN_CFG_PULL(155, ALT_A, DOWN) -#define GPIO155_LCD_D26		PIN_CFG(155, ALT_B) -#define GPIO155_STMAPE_CLK	PIN_CFG(155, ALT_C) - -#define GPIO156_GPIO		PIN_CFG(156, GPIO) -#define GPIO156_KP_I4		PIN_CFG_PULL(156, ALT_A, DOWN) -#define GPIO156_LCD_D27		PIN_CFG(156, ALT_B) -#define GPIO156_STMAPE_DAT3	PIN_CFG(156, ALT_C) - -#define GPIO157_GPIO		PIN_CFG(157, GPIO) -#define GPIO157_KP_O7		PIN_CFG_PULL(157, ALT_A, UP) -#define GPIO157_LCD_D28		PIN_CFG(157, ALT_B) -#define GPIO157_STMAPE_DAT2	PIN_CFG(157, ALT_C) - -#define GPIO158_GPIO		PIN_CFG(158, GPIO) -#define GPIO158_KP_O6		PIN_CFG_PULL(158, ALT_A, UP) -#define GPIO158_LCD_D29		PIN_CFG(158, ALT_B) -#define GPIO158_STMAPE_DAT1	PIN_CFG(158, ALT_C) - -#define GPIO159_GPIO		PIN_CFG(159, GPIO) -#define GPIO159_KP_O5		PIN_CFG_PULL(159, ALT_A, UP) -#define GPIO159_LCD_D30		PIN_CFG(159, ALT_B) -#define GPIO159_STMAPE_DAT0	PIN_CFG(159, ALT_C) - -#define GPIO160_GPIO		PIN_CFG(160, GPIO) -#define GPIO160_KP_O4		PIN_CFG_PULL(160, ALT_A, UP) -#define GPIO160_LCD_D31		PIN_CFG(160, ALT_B) -#define GPIO160_NONE		PIN_CFG(160, ALT_C) - -#define GPIO161_GPIO		PIN_CFG(161, GPIO) -#define GPIO161_KP_I3		PIN_CFG_PULL(161, ALT_A, DOWN) -#define GPIO161_LCD_D32		PIN_CFG(161, ALT_B) -#define GPIO161_UARTMOD_RXD	PIN_CFG(161, ALT_C) - -#define GPIO162_GPIO		PIN_CFG(162, GPIO) -#define GPIO162_KP_I2		PIN_CFG_PULL(162, ALT_A, DOWN) -#define GPIO162_LCD_D33		PIN_CFG(162, ALT_B) -#define GPIO162_UARTMOD_TXD	PIN_CFG(162, ALT_C) - -#define GPIO163_GPIO		PIN_CFG(163, GPIO) -#define GPIO163_KP_I1		PIN_CFG_PULL(163, ALT_A, DOWN) -#define GPIO163_LCD_D34		PIN_CFG(163, ALT_B) -#define GPIO163_STMMOD_CLK	PIN_CFG(163, ALT_C) - -#define GPIO164_GPIO		PIN_CFG(164, GPIO) -#define GPIO164_KP_I0		PIN_CFG_PULL(164, ALT_A, UP) -#define GPIO164_LCD_D35		PIN_CFG(164, ALT_B) -#define GPIO164_STMMOD_DAT3	PIN_CFG(164, ALT_C) - -#define GPIO165_GPIO		PIN_CFG(165, GPIO) -#define GPIO165_KP_O3		PIN_CFG_PULL(165, ALT_A, UP) -#define GPIO165_LCD_D36		PIN_CFG(165, ALT_B) -#define GPIO165_STMMOD_DAT2	PIN_CFG(165, ALT_C) - -#define GPIO166_GPIO		PIN_CFG(166, GPIO) -#define GPIO166_KP_O2		PIN_CFG_PULL(166, ALT_A, UP) -#define GPIO166_LCD_D37		PIN_CFG(166, ALT_B) -#define GPIO166_STMMOD_DAT1	PIN_CFG(166, ALT_C) - -#define GPIO167_GPIO		PIN_CFG(167, GPIO) -#define GPIO167_KP_O1		PIN_CFG_PULL(167, ALT_A, UP) -#define GPIO167_LCD_D38		PIN_CFG(167, ALT_B) -#define GPIO167_STMMOD_DAT0	PIN_CFG(167, ALT_C) - -#define GPIO168_GPIO		PIN_CFG(168, GPIO) -#define GPIO168_KP_O0		PIN_CFG_PULL(168, ALT_A, UP) -#define GPIO168_LCD_D39		PIN_CFG(168, ALT_B) -#define GPIO168_NONE		PIN_CFG(168, ALT_C) - -#define GPIO169_GPIO		PIN_CFG(169, GPIO) -#define GPIO169_RF_PURn		PIN_CFG(169, ALT_A) -#define GPIO169_LCDA_DE		PIN_CFG(169, ALT_B) -#define GPIO169_USBSIM_PDC	PIN_CFG(169, ALT_C) - -#define GPIO170_GPIO		PIN_CFG(170, GPIO) -#define GPIO170_MODEM_STATE	PIN_CFG(170, ALT_A) -#define GPIO170_LCDA_VSO	PIN_CFG(170, ALT_B) -#define GPIO170_KP_SKA1		PIN_CFG(170, ALT_C) - -#define GPIO171_GPIO		PIN_CFG(171, GPIO) -#define GPIO171_MODEM_PWREN	PIN_CFG(171, ALT_A) -#define GPIO171_LCDA_HSO	PIN_CFG(171, ALT_B) -#define GPIO171_KP_SKB1		PIN_CFG(171, ALT_C) - -#define GPIO192_GPIO		PIN_CFG(192, GPIO) -#define GPIO192_MSP2_SCK	PIN_CFG(192, ALT_A) - -#define GPIO193_GPIO		PIN_CFG(193, GPIO) -#define GPIO193_MSP2_TXD	PIN_CFG(193, ALT_A) - -#define GPIO194_GPIO		PIN_CFG(194, GPIO) -#define GPIO194_MSP2_TCK	PIN_CFG(194, ALT_A) - -#define GPIO195_GPIO		PIN_CFG(195, GPIO) -#define GPIO195_MSP2_TFS	PIN_CFG(195, ALT_A) - -#define GPIO196_GPIO		PIN_CFG(196, GPIO) -#define GPIO196_MSP2_RXD	PIN_CFG(196, ALT_A) - -#define GPIO197_GPIO		PIN_CFG(197, GPIO) -#define GPIO197_MC4_DAT3	PIN_CFG_PULL(197, ALT_A, UP) - -#define GPIO198_GPIO		PIN_CFG(198, GPIO) -#define GPIO198_MC4_DAT2	PIN_CFG_PULL(198, ALT_A, UP) - -#define GPIO199_GPIO		PIN_CFG(199, GPIO) -#define GPIO199_MC4_DAT1	PIN_CFG_PULL(199, ALT_A, UP) - -#define GPIO200_GPIO		PIN_CFG(200, GPIO) -#define GPIO200_MC4_DAT0	PIN_CFG_PULL(200, ALT_A, UP) - -#define GPIO201_GPIO		PIN_CFG(201, GPIO) -#define GPIO201_MC4_CMD		PIN_CFG_PULL(201, ALT_A, UP) - -#define GPIO202_GPIO		PIN_CFG(202, GPIO) -#define GPIO202_MC4_FBCLK	PIN_CFG_PULL(202, ALT_A, UP) -#define GPIO202_PWL		PIN_CFG(202, ALT_B) -#define GPIO202_MC4_RSTN	PIN_CFG(202, ALT_C) - -#define GPIO203_GPIO		PIN_CFG(203, GPIO) -#define GPIO203_MC4_CLK		PIN_CFG_PULL(203, ALT_A, UP) - -#define GPIO204_GPIO		PIN_CFG(204, GPIO) -#define GPIO204_MC4_DAT7	PIN_CFG_PULL(204, ALT_A, UP) - -#define GPIO205_GPIO		PIN_CFG(205, GPIO) -#define GPIO205_MC4_DAT6	PIN_CFG_PULL(205, ALT_A, UP) - -#define GPIO206_GPIO		PIN_CFG(206, GPIO) -#define GPIO206_MC4_DAT5	PIN_CFG_PULL(206, ALT_A, UP) - -#define GPIO207_GPIO		PIN_CFG(207, GPIO) -#define GPIO207_MC4_DAT4	PIN_CFG_PULL(207, ALT_A, UP) - -#define GPIO208_GPIO		PIN_CFG(208, GPIO) -#define GPIO208_MC1_CLK		PIN_CFG(208, ALT_A) - -#define GPIO209_GPIO		PIN_CFG(209, GPIO) -#define GPIO209_MC1_FBCLK	PIN_CFG(209, ALT_A) -#define GPIO209_SPI1_CLK	PIN_CFG(209, ALT_B) - -#define GPIO210_GPIO		PIN_CFG(210, GPIO) -#define GPIO210_MC1_CMD		PIN_CFG(210, ALT_A) - -#define GPIO211_GPIO		PIN_CFG(211, GPIO) -#define GPIO211_MC1_DAT0	PIN_CFG(211, ALT_A) - -#define GPIO212_GPIO		PIN_CFG(212, GPIO) -#define GPIO212_MC1_DAT1	PIN_CFG(212, ALT_A) -#define GPIO212_SPI1_FRM	PIN_CFG(212, ALT_B) - -#define GPIO213_GPIO		PIN_CFG(213, GPIO) -#define GPIO213_MC1_DAT2	PIN_CFG(213, ALT_A) -#define GPIO213_SPI1_TXD	PIN_CFG(213, ALT_B) - -#define GPIO214_GPIO		PIN_CFG(214, GPIO) -#define GPIO214_MC1_DAT3	PIN_CFG(214, ALT_A) -#define GPIO214_SPI1_RXD	PIN_CFG(214, ALT_B) - -#define GPIO215_GPIO		PIN_CFG(215, GPIO) -#define GPIO215_MC1_CMDDIR	PIN_CFG(215, ALT_A) -#define GPIO215_MC3_DAT2DIR	PIN_CFG(215, ALT_B) -#define GPIO215_CLKOUT1		PIN_CFG(215, ALT_C) - -#define GPIO216_GPIO		PIN_CFG(216, GPIO) -#define GPIO216_MC1_DAT2DIR	PIN_CFG(216, ALT_A) -#define GPIO216_MC3_CMDDIR	PIN_CFG(216, ALT_B) -#define GPIO216_I2C3_SDA	PIN_CFG_PULL(216, ALT_C, UP) - -#define GPIO217_GPIO		PIN_CFG(217, GPIO) -#define GPIO217_MC1_DAT0DIR	PIN_CFG(217, ALT_A) -#define GPIO217_MC3_DAT31DIR	PIN_CFG(217, ALT_B) -#define GPIO217_CLKOUT2		PIN_CFG(217, ALT_C) - -#define GPIO218_GPIO		PIN_CFG(218, GPIO) -#define GPIO218_MC1_DAT31DIR	PIN_CFG(218, ALT_A) -#define GPIO218_MC3_DAT0DIR	PIN_CFG(218, ALT_B) -#define GPIO218_I2C3_SCL	PIN_CFG_PULL(218, ALT_C, UP) - -#define GPIO219_GPIO		PIN_CFG(219, GPIO) -#define GPIO219_HSIR_FLA0	PIN_CFG(219, ALT_A) -#define GPIO219_MC3_CLK		PIN_CFG(219, ALT_B) - -#define GPIO220_GPIO		PIN_CFG(220, GPIO) -#define GPIO220_HSIR_DAT0	PIN_CFG(220, ALT_A) -#define GPIO220_MC3_FBCLK	PIN_CFG(220, ALT_B) -#define GPIO220_SPI0_CLK	PIN_CFG(220, ALT_C) - -#define GPIO221_GPIO		PIN_CFG(221, GPIO) -#define GPIO221_HSIR_RDY0	PIN_CFG(221, ALT_A) -#define GPIO221_MC3_CMD		PIN_CFG(221, ALT_B) - -#define GPIO222_GPIO		PIN_CFG(222, GPIO) -#define GPIO222_HSIT_FLA0	PIN_CFG(222, ALT_A) -#define GPIO222_MC3_DAT0	PIN_CFG(222, ALT_B) - -#define GPIO223_GPIO		PIN_CFG(223, GPIO) -#define GPIO223_HSIT_DAT0	PIN_CFG(223, ALT_A) -#define GPIO223_MC3_DAT1	PIN_CFG(223, ALT_B) -#define GPIO223_SPI0_FRM	PIN_CFG(223, ALT_C) - -#define GPIO224_GPIO		PIN_CFG(224, GPIO) -#define GPIO224_HSIT_RDY0	PIN_CFG(224, ALT_A) -#define GPIO224_MC3_DAT2	PIN_CFG(224, ALT_B) -#define GPIO224_SPI0_TXD	PIN_CFG(224, ALT_C) - -#define GPIO225_GPIO		PIN_CFG(225, GPIO) -#define GPIO225_HSIT_CAWAKE0	PIN_CFG(225, ALT_A) -#define GPIO225_MC3_DAT3	PIN_CFG(225, ALT_B) -#define GPIO225_SPI0_RXD	PIN_CFG(225, ALT_C) - -#define GPIO226_GPIO		PIN_CFG(226, GPIO) -#define GPIO226_HSIT_ACWAKE0	PIN_CFG(226, ALT_A) -#define GPIO226_PWL		PIN_CFG(226, ALT_B) -#define GPIO226_USBSIM_PDC	PIN_CFG(226, ALT_C) - -#define GPIO227_GPIO		PIN_CFG(227, GPIO) -#define GPIO227_CLKOUT1		PIN_CFG(227, ALT_A) - -#define GPIO228_GPIO		PIN_CFG(228, GPIO) -#define GPIO228_CLKOUT2		PIN_CFG(228, ALT_A) - -#define GPIO229_GPIO		PIN_CFG(229, GPIO) -#define GPIO229_CLKOUT1		PIN_CFG(229, ALT_A) -#define GPIO229_PWL		PIN_CFG(229, ALT_B) -#define GPIO229_I2C3_SDA	PIN_CFG_PULL(229, ALT_C, UP) - -#define GPIO230_GPIO		PIN_CFG(230, GPIO) -#define GPIO230_CLKOUT2		PIN_CFG(230, ALT_A) -#define GPIO230_PWL		PIN_CFG(230, ALT_B) -#define GPIO230_I2C3_SCL	PIN_CFG_PULL(230, ALT_C, UP) - -#define GPIO256_GPIO		PIN_CFG(256, GPIO) -#define GPIO256_USB_NXT		PIN_CFG(256, ALT_A) - -#define GPIO257_GPIO		PIN_CFG(257, GPIO) -#define GPIO257_USB_STP		PIN_CFG(257, ALT_A) - -#define GPIO258_GPIO		PIN_CFG(258, GPIO) -#define GPIO258_USB_XCLK	PIN_CFG(258, ALT_A) -#define GPIO258_NONE		PIN_CFG(258, ALT_B) -#define GPIO258_DDR_TRIG	PIN_CFG(258, ALT_C) - -#define GPIO259_GPIO		PIN_CFG(259, GPIO) -#define GPIO259_USB_DIR		PIN_CFG(259, ALT_A) - -#define GPIO260_GPIO		PIN_CFG(260, GPIO) -#define GPIO260_USB_DAT7	PIN_CFG(260, ALT_A) - -#define GPIO261_GPIO		PIN_CFG(261, GPIO) -#define GPIO261_USB_DAT6	PIN_CFG(261, ALT_A) - -#define GPIO262_GPIO		PIN_CFG(262, GPIO) -#define GPIO262_USB_DAT5	PIN_CFG(262, ALT_A) - -#define GPIO263_GPIO		PIN_CFG(263, GPIO) -#define GPIO263_USB_DAT4	PIN_CFG(263, ALT_A) - -#define GPIO264_GPIO		PIN_CFG(264, GPIO) -#define GPIO264_USB_DAT3	PIN_CFG(264, ALT_A) - -#define GPIO265_GPIO		PIN_CFG(265, GPIO) -#define GPIO265_USB_DAT2	PIN_CFG(265, ALT_A) - -#define GPIO266_GPIO		PIN_CFG(266, GPIO) -#define GPIO266_USB_DAT1	PIN_CFG(266, ALT_A) - -#define GPIO267_GPIO		PIN_CFG(267, GPIO) -#define GPIO267_USB_DAT0	PIN_CFG(267, ALT_A) - -#endif diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c index 9e4c678de78..a44967f3168 100644 --- a/arch/arm/mach-ux500/platsmp.c +++ b/arch/arm/mach-ux500/platsmp.c @@ -18,39 +18,48 @@  #include <linux/io.h>  #include <asm/cacheflush.h> -#include <asm/localtimer.h> +#include <asm/smp_plat.h>  #include <asm/smp_scu.h> -#include <mach/hardware.h> + +#include "setup.h" + +#include "db8500-regs.h" +#include "id.h" + +/* This is called from headsmp.S to wakeup the secondary core */ +extern void u8500_secondary_startup(void);  /* - * control for which core is the next to come out of the secondary - * boot "holding pen" + * Write pen_release in a way that is guaranteed to be visible to all + * observers, irrespective of whether they're taking part in coherency + * or not.  This is necessary for the hotplug code to work reliably.   */ -volatile int __cpuinitdata pen_release = -1; +static void write_pen_release(int val) +{ +	pen_release = val; +	smp_wmb(); +	sync_cache_w(&pen_release); +} -static unsigned int __init get_core_count(void) +static void __iomem *scu_base_addr(void)  { -	return scu_get_core_count(__io_address(UX500_SCU_BASE)); +	if (cpu_is_u8500_family() || cpu_is_ux540_family()) +		return __io_address(U8500_SCU_BASE); +	else +		ux500_unknown_soc(); + +	return NULL;  }  static DEFINE_SPINLOCK(boot_lock); -void __cpuinit platform_secondary_init(unsigned int cpu) +static void ux500_secondary_init(unsigned int cpu)  { -	trace_hardirqs_off(); - -	/* -	 * if any interrupts are already enabled for the primary -	 * core (e.g. timer irq), then they will not have been enabled -	 * for us: do so -	 */ -	gic_cpu_init(0, __io_address(UX500_GIC_CPU_BASE)); -  	/*  	 * let the primary processor know we're out of the  	 * pen, then head off into the C entry point  	 */ -	pen_release = -1; +	write_pen_release(-1);  	/*  	 * Synchronise with the boot thread. @@ -59,7 +68,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu)  	spin_unlock(&boot_lock);  } -int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +static int ux500_boot_secondary(unsigned int cpu, struct task_struct *idle)  {  	unsigned long timeout; @@ -74,11 +83,9 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  	 * the holding pen - release it, then wait for it to flag  	 * that it has been released by resetting pen_release.  	 */ -	pen_release = cpu; -	__cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release)); -	outer_clean_range(__pa(&pen_release), __pa(&pen_release) + 1); +	write_pen_release(cpu_logical_map(cpu)); -	smp_cross_call(cpumask_of(cpu)); +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));  	timeout = jiffies + (1 * HZ);  	while (time_before(jiffies, timeout)) { @@ -97,8 +104,12 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  static void __init wakeup_secondary(void)  { -	/* nobody is to be released from the pen yet */ -	pen_release = -1; +	void __iomem *backupram; + +	if (cpu_is_u8500_family() || cpu_is_ux540_family()) +		backupram = __io_address(U8500_BACKUPRAM0_BASE); +	else +		ux500_unknown_soc();  	/*  	 * write the address of secondary startup into the backup ram register @@ -106,15 +117,13 @@ static void __init wakeup_secondary(void)  	 * backup ram register at offset 0x1FF0, which is what boot rom code  	 * is waiting for. This would wake up the secondary core from WFE  	 */ -#define U8500_CPU1_JUMPADDR_OFFSET 0x1FF4 +#define UX500_CPU1_JUMPADDR_OFFSET 0x1FF4  	__raw_writel(virt_to_phys(u8500_secondary_startup), -		__io_address(UX500_BACKUPRAM0_BASE) + -		U8500_CPU1_JUMPADDR_OFFSET); +		     backupram + UX500_CPU1_JUMPADDR_OFFSET); -#define U8500_CPU1_WAKEMAGIC_OFFSET 0x1FF0 +#define UX500_CPU1_WAKEMAGIC_OFFSET 0x1FF0  	__raw_writel(0xA1FEED01, -		__io_address(UX500_BACKUPRAM0_BASE) + -		U8500_CPU1_WAKEMAGIC_OFFSET); +		     backupram + UX500_CPU1_WAKEMAGIC_OFFSET);  	/* make sure write buffer is drained */  	mb(); @@ -124,57 +133,37 @@ static void __init wakeup_secondary(void)   * Initialise the CPU possible map early - this describes the CPUs   * which may be present or become present in the system.   */ -void __init smp_init_cpus(void) +static void __init ux500_smp_init_cpus(void)  { -	unsigned int i, ncores = get_core_count(); - -	for (i = 0; i < ncores; i++) -		set_cpu_possible(i, true); -} +	void __iomem *scu_base = scu_base_addr(); +	unsigned int i, ncores; -void __init smp_prepare_cpus(unsigned int max_cpus) -{ -	unsigned int ncores = get_core_count(); -	unsigned int cpu = smp_processor_id(); -	int i; +	ncores = scu_base ? scu_get_core_count(scu_base) : 1;  	/* sanity check */ -	if (ncores == 0) { -		printk(KERN_ERR -		       "U8500: strange CM count of 0? Default to 1\n"); -		ncores = 1; -	} - -	if (ncores > num_possible_cpus())	{ -		printk(KERN_WARNING -		       "U8500: no. of cores (%d) greater than configured " -		       "maximum of %d - clipping\n", -		       ncores, num_possible_cpus()); -		ncores = num_possible_cpus(); +	if (ncores > nr_cpu_ids) { +		pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", +			ncores, nr_cpu_ids); +		ncores = nr_cpu_ids;  	} -	smp_store_cpu_info(cpu); +	for (i = 0; i < ncores; i++) +		set_cpu_possible(i, true); +} -	/* -	 * are we trying to boot more cores than exist? -	 */ -	if (max_cpus > ncores) -		max_cpus = ncores; +static void __init ux500_smp_prepare_cpus(unsigned int max_cpus) +{ -	/* -	 * Initialise the present map, which describes the set of CPUs -	 * actually populated at the present time. -	 */ -	for (i = 0; i < max_cpus; i++) -		set_cpu_present(i, true); - -	if (max_cpus > 1) { -		/* -		 * Enable the local timer or broadcast device for the -		 * boot CPU, but only if we have more than one CPU. -		 */ -		percpu_timer_setup(); -		scu_enable(__io_address(UX500_SCU_BASE)); -		wakeup_secondary(); -	} +	scu_enable(scu_base_addr()); +	wakeup_secondary();  } + +struct smp_operations ux500_smp_ops __initdata = { +	.smp_init_cpus		= ux500_smp_init_cpus, +	.smp_prepare_cpus	= ux500_smp_prepare_cpus, +	.smp_secondary_init	= ux500_secondary_init, +	.smp_boot_secondary	= ux500_boot_secondary, +#ifdef CONFIG_HOTPLUG_CPU +	.cpu_die		= ux500_cpu_die, +#endif +}; diff --git a/arch/arm/mach-ux500/pm.c b/arch/arm/mach-ux500/pm.c new file mode 100644 index 00000000000..b80a9a2e356 --- /dev/null +++ b/arch/arm/mach-ux500/pm.c @@ -0,0 +1,194 @@ +/* + * Copyright (C) ST-Ericsson SA 2010-2013 + * Author: Rickard Andersson <rickard.andersson@stericsson.com> for + *         ST-Ericsson. + * Author: Daniel Lezcano <daniel.lezcano@linaro.org> for Linaro. + * Author: Ulf Hansson <ulf.hansson@linaro.org> for Linaro. + * + * License terms: GNU General Public License (GPL) version 2 + * + */ + +#include <linux/kernel.h> +#include <linux/irqchip/arm-gic.h> +#include <linux/delay.h> +#include <linux/io.h> +#include <linux/suspend.h> +#include <linux/platform_data/arm-ux500-pm.h> + +#include "db8500-regs.h" + +/* ARM WFI Standby signal register */ +#define PRCM_ARM_WFI_STANDBY    (prcmu_base + 0x130) +#define PRCM_ARM_WFI_STANDBY_WFI0		0x08 +#define PRCM_ARM_WFI_STANDBY_WFI1		0x10 +#define PRCM_IOCR		(prcmu_base + 0x310) +#define PRCM_IOCR_IOFORCE			0x1 + +/* Dual A9 core interrupt management unit registers */ +#define PRCM_A9_MASK_REQ	(prcmu_base + 0x328) +#define PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ	0x1 + +#define PRCM_A9_MASK_ACK	(prcmu_base + 0x32c) +#define PRCM_ARMITMSK31TO0	(prcmu_base + 0x11c) +#define PRCM_ARMITMSK63TO32	(prcmu_base + 0x120) +#define PRCM_ARMITMSK95TO64	(prcmu_base + 0x124) +#define PRCM_ARMITMSK127TO96	(prcmu_base + 0x128) +#define PRCM_POWER_STATE_VAL	(prcmu_base + 0x25C) +#define PRCM_ARMITVAL31TO0	(prcmu_base + 0x260) +#define PRCM_ARMITVAL63TO32	(prcmu_base + 0x264) +#define PRCM_ARMITVAL95TO64	(prcmu_base + 0x268) +#define PRCM_ARMITVAL127TO96	(prcmu_base + 0x26C) + +static void __iomem *prcmu_base; + +/* This function decouple the gic from the prcmu */ +int prcmu_gic_decouple(void) +{ +	u32 val = readl(PRCM_A9_MASK_REQ); + +	/* Set bit 0 register value to 1 */ +	writel(val | PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ, +	       PRCM_A9_MASK_REQ); + +	/* Make sure the register is updated */ +	readl(PRCM_A9_MASK_REQ); + +	/* Wait a few cycles for the gic mask completion */ +	udelay(1); + +	return 0; +} + +/* This function recouple the gic with the prcmu */ +int prcmu_gic_recouple(void) +{ +	u32 val = readl(PRCM_A9_MASK_REQ); + +	/* Set bit 0 register value to 0 */ +	writel(val & ~PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ, PRCM_A9_MASK_REQ); + +	return 0; +} + +#define PRCMU_GIC_NUMBER_REGS 5 + +/* + * This function checks if there are pending irq on the gic. It only + * makes sense if the gic has been decoupled before with the + * db8500_prcmu_gic_decouple function. Disabling an interrupt only + * disables the forwarding of the interrupt to any CPU interface. It + * does not prevent the interrupt from changing state, for example + * becoming pending, or active and pending if it is already + * active. Hence, we have to check the interrupt is pending *and* is + * active. + */ +bool prcmu_gic_pending_irq(void) +{ +	u32 pr; /* Pending register */ +	u32 er; /* Enable register */ +	void __iomem *dist_base = __io_address(U8500_GIC_DIST_BASE); +	int i; + +	/* 5 registers. STI & PPI not skipped */ +	for (i = 0; i < PRCMU_GIC_NUMBER_REGS; i++) { + +		pr = readl_relaxed(dist_base + GIC_DIST_PENDING_SET + i * 4); +		er = readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); + +		if (pr & er) +			return true; /* There is a pending interrupt */ +	} + +	return false; +} + +/* + * This function checks if there are pending interrupt on the + * prcmu which has been delegated to monitor the irqs with the + * db8500_prcmu_copy_gic_settings function. + */ +bool prcmu_pending_irq(void) +{ +	u32 it, im; +	int i; + +	for (i = 0; i < PRCMU_GIC_NUMBER_REGS - 1; i++) { +		it = readl(PRCM_ARMITVAL31TO0 + i * 4); +		im = readl(PRCM_ARMITMSK31TO0 + i * 4); +		if (it & im) +			return true; /* There is a pending interrupt */ +	} + +	return false; +} + +/* + * This function checks if the specified cpu is in in WFI. It's usage + * makes sense only if the gic is decoupled with the db8500_prcmu_gic_decouple + * function. Of course passing smp_processor_id() to this function will + * always return false... + */ +bool prcmu_is_cpu_in_wfi(int cpu) +{ +	return readl(PRCM_ARM_WFI_STANDBY) & cpu ? PRCM_ARM_WFI_STANDBY_WFI1 : +		     PRCM_ARM_WFI_STANDBY_WFI0; +} + +/* + * This function copies the gic SPI settings to the prcmu in order to + * monitor them and abort/finish the retention/off sequence or state. + */ +int prcmu_copy_gic_settings(void) +{ +	u32 er; /* Enable register */ +	void __iomem *dist_base = __io_address(U8500_GIC_DIST_BASE); +	int i; + +	/* We skip the STI and PPI */ +	for (i = 0; i < PRCMU_GIC_NUMBER_REGS - 1; i++) { +		er = readl_relaxed(dist_base + +				   GIC_DIST_ENABLE_SET + (i + 1) * 4); +		writel(er, PRCM_ARMITMSK31TO0 + i * 4); +	} + +	return 0; +} + +#ifdef CONFIG_SUSPEND +static int ux500_suspend_enter(suspend_state_t state) +{ +	cpu_do_idle(); +	return 0; +} + +static int ux500_suspend_valid(suspend_state_t state) +{ +	return state == PM_SUSPEND_MEM || state == PM_SUSPEND_STANDBY; +} + +static const struct platform_suspend_ops ux500_suspend_ops = { +	.enter	      = ux500_suspend_enter, +	.valid	      = ux500_suspend_valid, +}; +#define UX500_SUSPEND_OPS	(&ux500_suspend_ops) +#else +#define UX500_SUSPEND_OPS	NULL +#endif + +void __init ux500_pm_init(u32 phy_base, u32 size) +{ +	prcmu_base = ioremap(phy_base, size); +	if (!prcmu_base) { +		pr_err("could not remap PRCMU for PM functions\n"); +		return; +	} +	/* +	 * On watchdog reboot the GIC is in some cases decoupled. +	 * This will make sure that the GIC is correctly configured. +	 */ +	prcmu_gic_recouple(); + +	/* Set up ux500 suspend callbacks. */ +	suspend_set_ops(UX500_SUSPEND_OPS); +} diff --git a/arch/arm/mach-ux500/prcmu.c b/arch/arm/mach-ux500/prcmu.c deleted file mode 100644 index 293274d1342..00000000000 --- a/arch/arm/mach-ux500/prcmu.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) ST Ericsson SA 2010 - * - * License Terms: GNU General Public License v2 - * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> - * - * U8500 PRCMU driver. - */ -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/errno.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/mutex.h> -#include <linux/completion.h> -#include <linux/jiffies.h> -#include <linux/bitops.h> -#include <linux/interrupt.h> - -#include <mach/hardware.h> -#include <mach/prcmu-regs.h> - -#define PRCMU_TCDM_BASE __io_address(U8500_PRCMU_TCDM_BASE) - -#define REQ_MB5 (PRCMU_TCDM_BASE + 0xE44) -#define ACK_MB5 (PRCMU_TCDM_BASE + 0xDF4) - -#define REQ_MB5_I2C_SLAVE_OP (REQ_MB5) -#define REQ_MB5_I2C_HW_BITS (REQ_MB5 + 1) -#define REQ_MB5_I2C_REG (REQ_MB5 + 2) -#define REQ_MB5_I2C_VAL (REQ_MB5 + 3) - -#define ACK_MB5_I2C_STATUS (ACK_MB5 + 1) -#define ACK_MB5_I2C_VAL (ACK_MB5 + 3) - -#define I2C_WRITE(slave) ((slave) << 1) -#define I2C_READ(slave) (((slave) << 1) | BIT(0)) -#define I2C_STOP_EN BIT(3) - -enum ack_mb5_status { -	I2C_WR_OK = 0x01, -	I2C_RD_OK = 0x02, -}; - -#define MBOX_BIT BIT -#define NUM_MBOX 8 - -static struct { -	struct mutex lock; -	struct completion work; -	bool failed; -	struct { -		u8 status; -		u8 value; -	} ack; -} mb5_transfer; - -/** - * prcmu_abb_read() - Read register value(s) from the ABB. - * @slave:	The I2C slave address. - * @reg:	The (start) register address. - * @value:	The read out value(s). - * @size:	The number of registers to read. - * - * Reads register value(s) from the ABB. - * @size has to be 1 for the current firmware version. - */ -int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size) -{ -	int r; - -	if (size != 1) -		return -EINVAL; - -	r = mutex_lock_interruptible(&mb5_transfer.lock); -	if (r) -		return r; - -	while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(5)) -		cpu_relax(); - -	writeb(I2C_READ(slave), REQ_MB5_I2C_SLAVE_OP); -	writeb(I2C_STOP_EN, REQ_MB5_I2C_HW_BITS); -	writeb(reg, REQ_MB5_I2C_REG); - -	writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET); -	if (!wait_for_completion_timeout(&mb5_transfer.work, -			msecs_to_jiffies(500))) { -		pr_err("prcmu: prcmu_abb_read timed out.\n"); -		r = -EIO; -		goto unlock_and_return; -	} -	r = ((mb5_transfer.ack.status == I2C_RD_OK) ? 0 : -EIO); -	if (!r) -		*value = mb5_transfer.ack.value; - -unlock_and_return: -	mutex_unlock(&mb5_transfer.lock); -	return r; -} -EXPORT_SYMBOL(prcmu_abb_read); - -/** - * prcmu_abb_write() - Write register value(s) to the ABB. - * @slave:	The I2C slave address. - * @reg:	The (start) register address. - * @value:	The value(s) to write. - * @size:	The number of registers to write. - * - * Reads register value(s) from the ABB. - * @size has to be 1 for the current firmware version. - */ -int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) -{ -	int r; - -	if (size != 1) -		return -EINVAL; - -	r = mutex_lock_interruptible(&mb5_transfer.lock); -	if (r) -		return r; - - -	while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(5)) -		cpu_relax(); - -	writeb(I2C_WRITE(slave), REQ_MB5_I2C_SLAVE_OP); -	writeb(I2C_STOP_EN, REQ_MB5_I2C_HW_BITS); -	writeb(reg, REQ_MB5_I2C_REG); -	writeb(*value, REQ_MB5_I2C_VAL); - -	writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET); -	if (!wait_for_completion_timeout(&mb5_transfer.work, -			msecs_to_jiffies(500))) { -		pr_err("prcmu: prcmu_abb_write timed out.\n"); -		r = -EIO; -		goto unlock_and_return; -	} -	r = ((mb5_transfer.ack.status == I2C_WR_OK) ? 0 : -EIO); - -unlock_and_return: -	mutex_unlock(&mb5_transfer.lock); -	return r; -} -EXPORT_SYMBOL(prcmu_abb_write); - -static void read_mailbox_0(void) -{ -	writel(MBOX_BIT(0), PRCM_ARM_IT1_CLEAR); -} - -static void read_mailbox_1(void) -{ -	writel(MBOX_BIT(1), PRCM_ARM_IT1_CLEAR); -} - -static void read_mailbox_2(void) -{ -	writel(MBOX_BIT(2), PRCM_ARM_IT1_CLEAR); -} - -static void read_mailbox_3(void) -{ -	writel(MBOX_BIT(3), PRCM_ARM_IT1_CLEAR); -} - -static void read_mailbox_4(void) -{ -	writel(MBOX_BIT(4), PRCM_ARM_IT1_CLEAR); -} - -static void read_mailbox_5(void) -{ -	mb5_transfer.ack.status = readb(ACK_MB5_I2C_STATUS); -	mb5_transfer.ack.value = readb(ACK_MB5_I2C_VAL); -	complete(&mb5_transfer.work); -	writel(MBOX_BIT(5), PRCM_ARM_IT1_CLEAR); -} - -static void read_mailbox_6(void) -{ -	writel(MBOX_BIT(6), PRCM_ARM_IT1_CLEAR); -} - -static void read_mailbox_7(void) -{ -	writel(MBOX_BIT(7), PRCM_ARM_IT1_CLEAR); -} - -static void (* const read_mailbox[NUM_MBOX])(void) = { -	read_mailbox_0, -	read_mailbox_1, -	read_mailbox_2, -	read_mailbox_3, -	read_mailbox_4, -	read_mailbox_5, -	read_mailbox_6, -	read_mailbox_7 -}; - -static irqreturn_t prcmu_irq_handler(int irq, void *data) -{ -	u32 bits; -	u8 n; - -	bits = (readl(PRCM_ARM_IT1_VAL) & (MBOX_BIT(NUM_MBOX) - 1)); -	if (unlikely(!bits)) -		return IRQ_NONE; - -	for (n = 0; bits; n++) { -		if (bits & MBOX_BIT(n)) { -			bits -= MBOX_BIT(n); -			read_mailbox[n](); -		} -	} -	return IRQ_HANDLED; -} - -static int __init prcmu_init(void) -{ -	mutex_init(&mb5_transfer.lock); -	init_completion(&mb5_transfer.work); - -	/* Clean up the mailbox interrupts after pre-kernel code. */ -	writel((MBOX_BIT(NUM_MBOX) - 1), PRCM_ARM_IT1_CLEAR); - -	return request_irq(IRQ_PRCMU, prcmu_irq_handler, 0, "prcmu", NULL); -} - -arch_initcall(prcmu_init); diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/setup.h index 54bbe648bf5..2dea8b59d22 100644 --- a/arch/arm/mach-ux500/include/mach/setup.h +++ b/arch/arm/mach-ux500/setup.h @@ -11,25 +11,20 @@  #ifndef __ASM_ARCH_SETUP_H  #define __ASM_ARCH_SETUP_H +#include <asm/mach/arch.h>  #include <asm/mach/time.h>  #include <linux/init.h> +#include <linux/mfd/abx500/ab8500.h> -extern void __init ux500_map_io(void); -extern void __init u5500_map_io(void); -extern void __init u8500_map_io(void); +void ux500_restart(enum reboot_mode mode, const char *cmd); -extern void __init ux500_init_devices(void); -extern void __init u5500_init_devices(void); -extern void __init u8500_init_devices(void); +void __init ux500_map_io(void);  extern void __init ux500_init_irq(void); -/* We re-use nomadik_timer for this platform */ -extern void nmdk_timer_init(void); -extern void __init amba_add_devices(struct amba_device *devs[], int num); +extern struct device *ux500_soc_device_init(const char *soc_id); -struct sys_timer; -extern struct sys_timer ux500_timer; +extern void ux500_timer_init(void);  #define __IO_DEV_DESC(x, sz)	{		\  	.virtual	= IO_ADDRESS(x),	\ @@ -42,7 +37,10 @@ extern struct sys_timer ux500_timer;  	.virtual	= IO_ADDRESS(x),	\  	.pfn		= __phys_to_pfn(x),	\  	.length		= sz,			\ -	.type		= MT_MEMORY,		\ +	.type		= MT_MEMORY_RWX,		\  } +extern struct smp_operations ux500_smp_ops; +extern void ux500_cpu_die(unsigned int cpu); +  #endif /*  __ASM_ARCH_SETUP_H */ diff --git a/arch/arm/mach-ux500/ste-dma40-db5500.h b/arch/arm/mach-ux500/ste-dma40-db5500.h deleted file mode 100644 index cb2110c3285..00000000000 --- a/arch/arm/mach-ux500/ste-dma40-db5500.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * License terms: GNU General Public License (GPL) version 2 - * - * DB5500-SoC-specific configuration for DMA40 - */ - -#ifndef STE_DMA40_DB5500_H -#define STE_DMA40_DB5500_H - -#define DB5500_DMA_NR_DEV 64 - -enum dma_src_dev_type { -	DB5500_DMA_DEV0_SPI0_RX = 0, -	DB5500_DMA_DEV1_SPI1_RX = 1, -	DB5500_DMA_DEV2_SPI2_RX = 2, -	DB5500_DMA_DEV3_SPI3_RX = 3, -	DB5500_DMA_DEV4_USB_OTG_IEP_1_9 = 4, -	DB5500_DMA_DEV5_USB_OTG_IEP_2_10 = 5, -	DB5500_DMA_DEV6_USB_OTG_IEP_3_11 = 6, -	DB5500_DMA_DEV7_IRDA_RFS = 7, -	DB5500_DMA_DEV8_IRDA_FIFO_RX = 8, -	DB5500_DMA_DEV9_MSP0_RX = 9, -	DB5500_DMA_DEV10_MSP1_RX = 10, -	DB5500_DMA_DEV11_MSP2_RX = 11, -	DB5500_DMA_DEV12_UART0_RX = 12, -	DB5500_DMA_DEV13_UART1_RX = 13, -	DB5500_DMA_DEV14_UART2_RX = 14, -	DB5500_DMA_DEV15_UART3_RX = 15, -	DB5500_DMA_DEV16_USB_OTG_IEP_8 = 16, -	DB5500_DMA_DEV17_USB_OTG_IEP_1_9 = 17, -	DB5500_DMA_DEV18_USB_OTG_IEP_2_10 = 18, -	DB5500_DMA_DEV19_USB_OTG_IEP_3_11 = 19, -	DB5500_DMA_DEV20_USB_OTG_IEP_4_12 = 20, -	DB5500_DMA_DEV21_USB_OTG_IEP_5_13 = 21, -	DB5500_DMA_DEV22_USB_OTG_IEP_6_14 = 22, -	DB5500_DMA_DEV23_USB_OTG_IEP_7_15 = 23, -	DB5500_DMA_DEV24_SDMMC0_RX = 24, -	DB5500_DMA_DEV25_SDMMC1_RX = 25, -	DB5500_DMA_DEV26_SDMMC2_RX = 26, -	DB5500_DMA_DEV27_SDMMC3_RX = 27, -	DB5500_DMA_DEV28_SDMMC4_RX = 28, -	/* 29 - 32 not used */ -	DB5500_DMA_DEV33_SDMMC0_RX = 33, -	DB5500_DMA_DEV34_SDMMC1_RX = 34, -	DB5500_DMA_DEV35_SDMMC2_RX = 35, -	DB5500_DMA_DEV36_SDMMC3_RX = 36, -	DB5500_DMA_DEV37_SDMMC4_RX = 37, -	DB5500_DMA_DEV38_USB_OTG_IEP_8 = 38, -	DB5500_DMA_DEV39_USB_OTG_IEP_1_9 = 39, -	DB5500_DMA_DEV40_USB_OTG_IEP_2_10 = 40, -	DB5500_DMA_DEV41_USB_OTG_IEP_3_11 = 41, -	DB5500_DMA_DEV42_USB_OTG_IEP_4_12 = 42, -	DB5500_DMA_DEV43_USB_OTG_IEP_5_13 = 43, -	DB5500_DMA_DEV44_USB_OTG_IEP_6_14 = 44, -	DB5500_DMA_DEV45_USB_OTG_IEP_7_15 = 45, -	/* 46 not used */ -	DB5500_DMA_DEV47_MCDE_RX = 47, -	DB5500_DMA_DEV48_CRYPTO1_RX = 48, -	/* 49, 50 not used */ -	DB5500_DMA_DEV49_I2C1_RX = 51, -	DB5500_DMA_DEV50_I2C3_RX = 52, -	DB5500_DMA_DEV51_I2C2_RX = 53, -	/* 54 - 60 not used */ -	DB5500_DMA_DEV61_CRYPTO0_RX = 61, -	/* 62, 63 not used */ -}; - -enum dma_dest_dev_type { -	DB5500_DMA_DEV0_SPI0_TX = 0, -	DB5500_DMA_DEV1_SPI1_TX = 1, -	DB5500_DMA_DEV2_SPI2_TX = 2, -	DB5500_DMA_DEV3_SPI3_TX = 3, -	DB5500_DMA_DEV4_USB_OTG_OEP_1_9 = 4, -	DB5500_DMA_DEV5_USB_OTG_OEP_2_10 = 5, -	DB5500_DMA_DEV6_USB_OTG_OEP_3_11 = 6, -	DB5500_DMA_DEV7_IRRC_TX = 7, -	DB5500_DMA_DEV8_IRDA_FIFO_TX = 8, -	DB5500_DMA_DEV9_MSP0_TX = 9, -	DB5500_DMA_DEV10_MSP1_TX = 10, -	DB5500_DMA_DEV11_MSP2_TX = 11, -	DB5500_DMA_DEV12_UART0_TX = 12, -	DB5500_DMA_DEV13_UART1_TX = 13, -	DB5500_DMA_DEV14_UART2_TX = 14, -	DB5500_DMA_DEV15_UART3_TX = 15, -	DB5500_DMA_DEV16_USB_OTG_OEP_8 = 16, -	DB5500_DMA_DEV17_USB_OTG_OEP_1_9 = 17, -	DB5500_DMA_DEV18_USB_OTG_OEP_2_10 = 18, -	DB5500_DMA_DEV19_USB_OTG_OEP_3_11 = 19, -	DB5500_DMA_DEV20_USB_OTG_OEP_4_12 = 20, -	DB5500_DMA_DEV21_USB_OTG_OEP_5_13 = 21, -	DB5500_DMA_DEV22_USB_OTG_OEP_6_14 = 22, -	DB5500_DMA_DEV23_USB_OTG_OEP_7_15 = 23, -	DB5500_DMA_DEV24_SDMMC0_TX = 24, -	DB5500_DMA_DEV25_SDMMC1_TX = 25, -	DB5500_DMA_DEV26_SDMMC2_TX = 26, -	DB5500_DMA_DEV27_SDMMC3_TX = 27, -	DB5500_DMA_DEV28_SDMMC4_TX = 28, -	/* 29 - 31 not used */ -	DB5500_DMA_DEV32_FSMC_TX = 32, -	DB5500_DMA_DEV33_SDMMC0_TX = 33, -	DB5500_DMA_DEV34_SDMMC1_TX = 34, -	DB5500_DMA_DEV35_SDMMC2_TX = 35, -	DB5500_DMA_DEV36_SDMMC3_TX = 36, -	DB5500_DMA_DEV37_SDMMC4_TX = 37, -	DB5500_DMA_DEV38_USB_OTG_OEP_8 = 38, -	DB5500_DMA_DEV39_USB_OTG_OEP_1_9 = 39, -	DB5500_DMA_DEV40_USB_OTG_OEP_2_10 = 40, -	DB5500_DMA_DEV41_USB_OTG_OEP_3_11 = 41, -	DB5500_DMA_DEV42_USB_OTG_OEP_4_12 = 42, -	DB5500_DMA_DEV43_USB_OTG_OEP_5_13 = 43, -	DB5500_DMA_DEV44_USB_OTG_OEP_6_14 = 44, -	DB5500_DMA_DEV45_USB_OTG_OEP_7_15 = 45, -	/* 46 not used */ -	DB5500_DMA_DEV47_STM_TX = 47, -	DB5500_DMA_DEV48_CRYPTO1_TX = 48, -	DB5500_DMA_DEV49_CRYPTO1_TX_HASH1_TX = 49, -	DB5500_DMA_DEV50_HASH1_TX = 50, -	DB5500_DMA_DEV51_I2C1_TX = 51, -	DB5500_DMA_DEV52_I2C3_TX = 52, -	DB5500_DMA_DEV53_I2C2_TX = 53, -	/* 54, 55 not used */ -	DB5500_DMA_MEMCPY_TX_1 = 56, -	DB5500_DMA_MEMCPY_TX_2 = 57, -	DB5500_DMA_MEMCPY_TX_3 = 58, -	DB5500_DMA_MEMCPY_TX_4 = 59, -	DB5500_DMA_MEMCPY_TX_5 = 60, -	DB5500_DMA_DEV61_CRYPTO0_TX = 61, -	DB5500_DMA_DEV62_CRYPTO0_TX_HASH0_TX = 62, -	DB5500_DMA_DEV63_HASH0_TX = 63, -}; - -#endif diff --git a/arch/arm/mach-ux500/ste-dma40-db8500.h b/arch/arm/mach-ux500/ste-dma40-db8500.h index a616419bea7..0296ae5b0fd 100644 --- a/arch/arm/mach-ux500/ste-dma40-db8500.h +++ b/arch/arm/mach-ux500/ste-dma40-db8500.h @@ -12,133 +12,74 @@  #define DB8500_DMA_NR_DEV 64 -enum dma_src_dev_type { -	DB8500_DMA_DEV0_SPI0_RX = 0, -	DB8500_DMA_DEV1_SD_MMC0_RX = 1, -	DB8500_DMA_DEV2_SD_MMC1_RX = 2, -	DB8500_DMA_DEV3_SD_MMC2_RX = 3, -	DB8500_DMA_DEV4_I2C1_RX = 4, -	DB8500_DMA_DEV5_I2C3_RX = 5, -	DB8500_DMA_DEV6_I2C2_RX = 6, -	DB8500_DMA_DEV7_I2C4_RX = 7, /* Only on V1 and later */ -	DB8500_DMA_DEV8_SSP0_RX = 8, -	DB8500_DMA_DEV9_SSP1_RX = 9, -	DB8500_DMA_DEV10_MCDE_RX = 10, -	DB8500_DMA_DEV11_UART2_RX = 11, -	DB8500_DMA_DEV12_UART1_RX = 12, -	DB8500_DMA_DEV13_UART0_RX = 13, -	DB8500_DMA_DEV14_MSP2_RX = 14, -	DB8500_DMA_DEV15_I2C0_RX = 15, -	DB8500_DMA_DEV16_USB_OTG_IEP_7_15 = 16, -	DB8500_DMA_DEV17_USB_OTG_IEP_6_14 = 17, -	DB8500_DMA_DEV18_USB_OTG_IEP_5_13 = 18, -	DB8500_DMA_DEV19_USB_OTG_IEP_4_12 = 19, -	DB8500_DMA_DEV20_SLIM0_CH0_RX_HSI_RX_CH0 = 20, -	DB8500_DMA_DEV21_SLIM0_CH1_RX_HSI_RX_CH1 = 21, -	DB8500_DMA_DEV22_SLIM0_CH2_RX_HSI_RX_CH2 = 22, -	DB8500_DMA_DEV23_SLIM0_CH3_RX_HSI_RX_CH3 = 23, -	DB8500_DMA_DEV24_SRC_SXA0_RX_TX = 24, -	DB8500_DMA_DEV25_SRC_SXA1_RX_TX = 25, -	DB8500_DMA_DEV26_SRC_SXA2_RX_TX = 26, -	DB8500_DMA_DEV27_SRC_SXA3_RX_TX = 27, -	DB8500_DMA_DEV28_SD_MM2_RX = 28, -	DB8500_DMA_DEV29_SD_MM0_RX = 29, -	DB8500_DMA_DEV30_MSP1_RX = 30, +/* + * Unless otherwise specified, all channels numbers are used for + * TX & RX, and can be used for either source or destination + * channels. + */ +enum dma_dev_type { +	DB8500_DMA_DEV0_SPI0 = 0, +	DB8500_DMA_DEV1_SD_MMC0 = 1, +	DB8500_DMA_DEV2_SD_MMC1 = 2, +	DB8500_DMA_DEV3_SD_MMC2 = 3, +	DB8500_DMA_DEV4_I2C1 = 4, +	DB8500_DMA_DEV5_I2C3 = 5, +	DB8500_DMA_DEV6_I2C2 = 6, +	DB8500_DMA_DEV7_I2C4 = 7,			/* Only on V1 and later */ +	DB8500_DMA_DEV8_SSP0 = 8, +	DB8500_DMA_DEV9_SSP1 = 9, +	DB8500_DMA_DEV10_MCDE_RX = 10,			/* RX only */ +	DB8500_DMA_DEV11_UART2 = 11, +	DB8500_DMA_DEV12_UART1 = 12, +	DB8500_DMA_DEV13_UART0 = 13, +	DB8500_DMA_DEV14_MSP2 = 14, +	DB8500_DMA_DEV15_I2C0 = 15, +	DB8500_DMA_DEV16_USB_OTG_IEP_AND_OEP_7_15 = 16, +	DB8500_DMA_DEV17_USB_OTG_IEP_AND_OEP_6_14 = 17, +	DB8500_DMA_DEV18_USB_OTG_IEP_AND_OEP_5_13 = 18, +	DB8500_DMA_DEV19_USB_OTG_IEP_AND_OEP_4_12 = 19, +	DB8500_DMA_DEV20_SLIM0_CH0_HSI_CH0 = 20, +	DB8500_DMA_DEV21_SLIM0_CH1_HSI_CH1 = 21, +	DB8500_DMA_DEV22_SLIM0_CH2_HSI_CH2 = 22, +	DB8500_DMA_DEV23_SLIM0_CH3_HSI_CH3 = 23, +	DB8500_DMA_DEV24_SXA0 = 24, +	DB8500_DMA_DEV25_SXA1 = 25, +	DB8500_DMA_DEV26_SXA2 = 26, +	DB8500_DMA_DEV27_SXA3 = 27, +	DB8500_DMA_DEV28_SD_MM2 = 28, +	DB8500_DMA_DEV29_SD_MM0 = 29, +	DB8500_DMA_DEV30_MSP1 = 30,  	/* On DB8500v2, MSP3 RX replaces MSP1 RX */ -	DB8500_DMA_DEV30_MSP3_RX = 30, -	DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX = 31, -	DB8500_DMA_DEV32_SD_MM1_RX = 32, -	DB8500_DMA_DEV33_SPI2_RX = 33, -	DB8500_DMA_DEV34_I2C3_RX2 = 34, -	DB8500_DMA_DEV35_SPI1_RX = 35, -	DB8500_DMA_DEV36_USB_OTG_IEP_3_11 = 36, -	DB8500_DMA_DEV37_USB_OTG_IEP_2_10 = 37, -	DB8500_DMA_DEV38_USB_OTG_IEP_1_9 = 38, -	DB8500_DMA_DEV39_USB_OTG_IEP_8 = 39, -	DB8500_DMA_DEV40_SPI3_RX = 40, -	DB8500_DMA_DEV41_SD_MM3_RX = 41, -	DB8500_DMA_DEV42_SD_MM4_RX = 42, -	DB8500_DMA_DEV43_SD_MM5_RX = 43, -	DB8500_DMA_DEV44_SRC_SXA4_RX_TX = 44, -	DB8500_DMA_DEV45_SRC_SXA5_RX_TX = 45, -	DB8500_DMA_DEV46_SLIM0_CH8_RX_SRC_SXA6_RX_TX = 46, -	DB8500_DMA_DEV47_SLIM0_CH9_RX_SRC_SXA7_RX_TX = 47, -	DB8500_DMA_DEV48_CAC1_RX = 48, -	/* 49, 50 and 51 are not used */ -	DB8500_DMA_DEV52_SLIM0_CH4_RX_HSI_RX_CH4 = 52, -	DB8500_DMA_DEV53_SLIM0_CH5_RX_HSI_RX_CH5 = 53, -	DB8500_DMA_DEV54_SLIM0_CH6_RX_HSI_RX_CH6 = 54, -	DB8500_DMA_DEV55_SLIM0_CH7_RX_HSI_RX_CH7 = 55, -	/* 56, 57, 58, 59 and 60 are not used */ -	DB8500_DMA_DEV61_CAC0_RX = 61, -	/* 62 and 63 are not used */ -}; - -enum dma_dest_dev_type { -	DB8500_DMA_DEV0_SPI0_TX = 0, -	DB8500_DMA_DEV1_SD_MMC0_TX = 1, -	DB8500_DMA_DEV2_SD_MMC1_TX = 2, -	DB8500_DMA_DEV3_SD_MMC2_TX = 3, -	DB8500_DMA_DEV4_I2C1_TX = 4, -	DB8500_DMA_DEV5_I2C3_TX = 5, -	DB8500_DMA_DEV6_I2C2_TX = 6, -	DB8500_DMA_DEV7_I2C4_TX = 7, /* Only on V1 and later */ -	DB8500_DMA_DEV8_SSP0_TX = 8, -	DB8500_DMA_DEV9_SSP1_TX = 9, -	/* 10 is not used*/ -	DB8500_DMA_DEV11_UART2_TX = 11, -	DB8500_DMA_DEV12_UART1_TX = 12, -	DB8500_DMA_DEV13_UART0_TX = 13, -	DB8500_DMA_DEV14_MSP2_TX = 14, -	DB8500_DMA_DEV15_I2C0_TX = 15, -	DB8500_DMA_DEV16_USB_OTG_OEP_7_15 = 16, -	DB8500_DMA_DEV17_USB_OTG_OEP_6_14 = 17, -	DB8500_DMA_DEV18_USB_OTG_OEP_5_13 = 18, -	DB8500_DMA_DEV19_USB_OTG_OEP_4_12 = 19, -	DB8500_DMA_DEV20_SLIM0_CH0_TX_HSI_TX_CH0 = 20, -	DB8500_DMA_DEV21_SLIM0_CH1_TX_HSI_TX_CH1 = 21, -	DB8500_DMA_DEV22_SLIM0_CH2_TX_HSI_TX_CH2 = 22, -	DB8500_DMA_DEV23_SLIM0_CH3_TX_HSI_TX_CH3 = 23, -	DB8500_DMA_DEV24_DST_SXA0_RX_TX = 24, -	DB8500_DMA_DEV25_DST_SXA1_RX_TX = 25, -	DB8500_DMA_DEV26_DST_SXA2_RX_TX = 26, -	DB8500_DMA_DEV27_DST_SXA3_RX_TX = 27, -	DB8500_DMA_DEV28_SD_MM2_TX = 28, -	DB8500_DMA_DEV29_SD_MM0_TX = 29, -	DB8500_DMA_DEV30_MSP1_TX = 30, -	DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX = 31, -	DB8500_DMA_DEV32_SD_MM1_TX = 32, -	DB8500_DMA_DEV33_SPI2_TX = 33, -	DB8500_DMA_DEV34_I2C3_TX2 = 34, -	DB8500_DMA_DEV35_SPI1_TX = 35, -	DB8500_DMA_DEV36_USB_OTG_OEP_3_11 = 36, -	DB8500_DMA_DEV37_USB_OTG_OEP_2_10 = 37, -	DB8500_DMA_DEV38_USB_OTG_OEP_1_9 = 38, -	DB8500_DMA_DEV39_USB_OTG_OEP_8 = 39, -	DB8500_DMA_DEV40_SPI3_TX = 40, -	DB8500_DMA_DEV41_SD_MM3_TX = 41, -	DB8500_DMA_DEV42_SD_MM4_TX = 42, -	DB8500_DMA_DEV43_SD_MM5_TX = 43, -	DB8500_DMA_DEV44_DST_SXA4_RX_TX = 44, -	DB8500_DMA_DEV45_DST_SXA5_RX_TX = 45, -	DB8500_DMA_DEV46_SLIM0_CH8_TX_DST_SXA6_RX_TX = 46, -	DB8500_DMA_DEV47_SLIM0_CH9_TX_DST_SXA7_RX_TX = 47, -	DB8500_DMA_DEV48_CAC1_TX  = 48, -	DB8500_DMA_DEV49_CAC1_TX_HAC1_TX = 49, -	DB8500_DMA_DEV50_HAC1_TX = 50, -	DB8500_DMA_MEMCPY_TX_0 = 51, -	DB8500_DMA_DEV52_SLIM1_CH4_TX_HSI_TX_CH4 = 52, -	DB8500_DMA_DEV53_SLIM1_CH5_TX_HSI_TX_CH5 = 53, -	DB8500_DMA_DEV54_SLIM1_CH6_TX_HSI_TX_CH6 = 54, -	DB8500_DMA_DEV55_SLIM1_CH7_TX_HSI_TX_CH7 = 55, -	DB8500_DMA_MEMCPY_TX_1 = 56, -	DB8500_DMA_MEMCPY_TX_2 = 57, -	DB8500_DMA_MEMCPY_TX_3 = 58, -	DB8500_DMA_MEMCPY_TX_4 = 59, -	DB8500_DMA_MEMCPY_TX_5 = 60, -	DB8500_DMA_DEV61_CAC0_TX = 61, -	DB8500_DMA_DEV62_CAC0_TX_HAC0_TX = 62, -	DB8500_DMA_DEV63_HAC0_TX = 63, +	DB8500_DMA_DEV30_MSP3 = 30, +	DB8500_DMA_DEV31_MSP0_SLIM0_CH0 = 31, +	DB8500_DMA_DEV32_SD_MM1 = 32, +	DB8500_DMA_DEV33_SPI2 = 33, +	DB8500_DMA_DEV34_I2C3_RX2_TX2 = 34, +	DB8500_DMA_DEV35_SPI1 = 35, +	DB8500_DMA_DEV36_USB_OTG_IEP_AND_OEP_3_11 = 36, +	DB8500_DMA_DEV37_USB_OTG_IEP_AND_OEP_2_10 = 37, +	DB8500_DMA_DEV38_USB_OTG_IEP_AND_OEP_1_9 = 38, +	DB8500_DMA_DEV39_USB_OTG_IEP_AND_OEP_8 = 39, +	DB8500_DMA_DEV40_SPI3 = 40, +	DB8500_DMA_DEV41_SD_MM3 = 41, +	DB8500_DMA_DEV42_SD_MM4 = 42, +	DB8500_DMA_DEV43_SD_MM5 = 43, +	DB8500_DMA_DEV44_SXA4 = 44, +	DB8500_DMA_DEV45_SXA5 = 45, +	DB8500_DMA_DEV46_SLIM0_CH8_SRC_SXA6 = 46, +	DB8500_DMA_DEV47_SLIM0_CH9_SRC_SXA7 = 47, +	DB8500_DMA_DEV48_CAC1 = 48, +	DB8500_DMA_DEV49_CAC1_TX_HAC1_TX = 49,		/* TX only */ +	DB8500_DMA_DEV50_HAC1_TX = 50,			/* TX only */ +	DB8500_DMA_MEMCPY_TX_0 = 51,			/* TX only */ +	DB8500_DMA_DEV52_SLIM0_CH4_HSI_CH4 = 52, +	DB8500_DMA_DEV53_SLIM0_CH5_HSI_CH5 = 53, +	DB8500_DMA_DEV54_SLIM0_CH6_HSI_CH6 = 54, +	DB8500_DMA_DEV55_SLIM0_CH7_HSI_CH7 = 55, +	/* 56 -> 60 are channels reserved for memcpy only */ +	DB8500_DMA_DEV61_CAC0 = 61, +	DB8500_DMA_DEV62_CAC0_TX_HAC0_TX = 62,		/* TX only */ +	DB8500_DMA_DEV63_HAC0_TX = 63,			/* TX only */  };  #endif diff --git a/arch/arm/mach-ux500/timer.c b/arch/arm/mach-ux500/timer.c new file mode 100644 index 00000000000..87efda0aa34 --- /dev/null +++ b/arch/arm/mach-ux500/timer.c @@ -0,0 +1,48 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * + * License Terms: GNU General Public License v2 + * Author: Mattias Wallin <mattias.wallin@stericsson.com> for ST-Ericsson + */ +#include <linux/io.h> +#include <linux/errno.h> +#include <linux/clksrc-dbx500-prcmu.h> +#include <linux/clocksource.h> +#include <linux/of.h> +#include <linux/of_address.h> + +#include "setup.h" + +#include "db8500-regs.h" +#include "id.h" + +const static struct of_device_id prcmu_timer_of_match[] __initconst = { +	{ .compatible = "stericsson,db8500-prcmu-timer-4", }, +	{ }, +}; + +void __init ux500_timer_init(void) +{ +	void __iomem *prcmu_timer_base; +	void __iomem *tmp_base; +	struct device_node *np; + +	if (cpu_is_u8500_family() || cpu_is_ux540_family()) +		prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE); +	else +		ux500_unknown_soc(); + +	np = of_find_matching_node(NULL, prcmu_timer_of_match); +	if (!np) +		goto dt_fail; + +	tmp_base = of_iomap(np, 0); +	if (!tmp_base) +		goto dt_fail; + +	prcmu_timer_base = tmp_base; + +dt_fail: +	clksrc_dbx500_prcmu_init(prcmu_timer_base); +	clocksource_of_init(); +}  | 
