diff options
Diffstat (limited to 'arch/arm')
754 files changed, 21420 insertions, 14118 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index a91009c6187..7980873525b 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -11,6 +11,7 @@ config ARM  	select RTC_LIB  	select SYS_SUPPORTS_APM_EMULATION  	select GENERIC_ATOMIC64 if (CPU_V6 || !CPU_32v6K || !AEABI) +	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE  	select HAVE_OPROFILE if (HAVE_PERF_EVENTS)  	select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL  	select HAVE_ARCH_KGDB @@ -38,6 +39,7 @@ config ARM  	select GENERIC_IRQ_PROBE  	select GENERIC_IRQ_SHOW  	select GENERIC_IRQ_PROBE +	select ARCH_WANT_IPC_PARSE_VERSION  	select HARDIRQS_SW_RESEND  	select CPU_PM if (SUSPEND || CPU_IDLE)  	select GENERIC_PCI_IOMAP @@ -45,6 +47,9 @@ config ARM  	select GENERIC_SMP_IDLE_THREAD  	select KTIME_SCALAR  	select GENERIC_CLOCKEVENTS_BROADCAST if SMP +	select GENERIC_STRNCPY_FROM_USER +	select GENERIC_STRNLEN_USER +	select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN  	help  	  The ARM series is a line of low-power-consumption RISC chip designs  	  licensed by ARM Ltd and targeted at embedded applications and @@ -250,12 +255,31 @@ choice  	prompt "ARM system type"  	default ARCH_VERSATILE +config ARCH_SOCFPGA +	bool "Altera SOCFPGA family" +	select ARCH_WANT_OPTIONAL_GPIOLIB +	select ARM_AMBA +	select ARM_GIC +	select CACHE_L2X0 +	select CLKDEV_LOOKUP +	select COMMON_CLK +	select CPU_V7 +	select DW_APB_TIMER +	select DW_APB_TIMER_OF +	select GENERIC_CLOCKEVENTS +	select GPIO_PL061 if GPIOLIB +	select HAVE_ARM_SCU +	select SPARSE_IRQ +	select USE_OF +	help +	  This enables support for Altera SOCFPGA Cyclone V platform +  config ARCH_INTEGRATOR  	bool "ARM Ltd. Integrator family"  	select ARM_AMBA  	select ARCH_HAS_CPUFREQ -	select CLKDEV_LOOKUP -	select HAVE_MACH_CLKDEV +	select COMMON_CLK +	select CLK_VERSATILE  	select HAVE_TCM  	select ICST  	select GENERIC_CLOCKEVENTS @@ -277,6 +301,7 @@ config ARCH_REALVIEW  	select GENERIC_CLOCKEVENTS  	select ARCH_WANT_OPTIONAL_GPIOLIB  	select PLAT_VERSATILE +	select PLAT_VERSATILE_CLOCK  	select PLAT_VERSATILE_CLCD  	select ARM_TIMER_SP804  	select GPIO_PL061 if GPIOLIB @@ -295,6 +320,7 @@ config ARCH_VERSATILE  	select ARCH_WANT_OPTIONAL_GPIOLIB  	select NEED_MACH_IO_H if PCI  	select PLAT_VERSATILE +	select PLAT_VERSATILE_CLOCK  	select PLAT_VERSATILE_CLCD  	select PLAT_VERSATILE_FPGA_IRQ  	select ARM_TIMER_SP804 @@ -307,7 +333,7 @@ config ARCH_VEXPRESS  	select ARM_AMBA  	select ARM_TIMER_SP804  	select CLKDEV_LOOKUP -	select HAVE_MACH_CLKDEV +	select COMMON_CLK  	select GENERIC_CLOCKEVENTS  	select HAVE_CLK  	select HAVE_PATA_PLATFORM @@ -315,6 +341,7 @@ config ARCH_VEXPRESS  	select NO_IOPORT  	select PLAT_VERSATILE  	select PLAT_VERSATILE_CLCD +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  	help  	  This enables support for the ARM Ltd Versatile Express boards. @@ -349,6 +376,7 @@ config ARCH_HIGHBANK  	select ARM_TIMER_SP804  	select CACHE_L2X0  	select CLKDEV_LOOKUP +	select COMMON_CLK  	select CPU_V7  	select GENERIC_CLOCKEVENTS  	select HAVE_ARM_SCU @@ -389,6 +417,7 @@ config ARCH_PRIMA2  	bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"  	select CPU_V7  	select NO_IOPORT +	select ARCH_REQUIRE_GPIOLIB  	select GENERIC_CLOCKEVENTS  	select CLKDEV_LOOKUP  	select GENERIC_IRQ_CHIP @@ -447,6 +476,8 @@ config ARCH_MXC  	select CLKSRC_MMIO  	select GENERIC_IRQ_CHIP  	select MULTI_IRQ_HANDLER +	select SPARSE_IRQ +	select USE_OF  	help  	  Support for Freescale MXC/iMX-based family of processors @@ -533,6 +564,18 @@ config ARCH_IXP4XX  	help  	  Support for Intel's IXP4XX (XScale) family of processors. +config ARCH_MVEBU +	bool "Marvell SOCs with Device Tree support" +	select GENERIC_CLOCKEVENTS +	select MULTI_IRQ_HANDLER +	select SPARSE_IRQ +	select CLKSRC_MMIO +	select GENERIC_IRQ_CHIP +	select IRQ_DOMAIN +	select COMMON_CLK +	help +	  Support for the Marvell SoC Family with device tree support +  config ARCH_DOVE  	bool "Marvell Dove"  	select CPU_V7 @@ -567,6 +610,7 @@ config ARCH_LPC32XX  	select CLKDEV_LOOKUP  	select GENERIC_CLOCKEVENTS  	select USE_OF +	select HAVE_PWM  	help  	  Support for the NXP LPC32XX family of processors @@ -647,6 +691,7 @@ config ARCH_TEGRA  	select MIGHT_HAVE_CACHE_L2X0  	select NEED_MACH_IO_H if PCI  	select ARCH_HAS_CPUFREQ +	select USE_OF  	help  	  This enables support for NVIDIA Tegra based systems (Tegra APX,  	  Tegra 6xx and Tegra 2 series). @@ -658,6 +703,7 @@ config ARCH_PICOXCELL  	select ARM_VIC  	select CPU_V6K  	select DW_APB_TIMER +	select DW_APB_TIMER_OF  	select GENERIC_CLOCKEVENTS  	select GENERIC_GPIO  	select HAVE_TCM @@ -888,7 +934,7 @@ config ARCH_U300  	select ARM_VIC  	select GENERIC_CLOCKEVENTS  	select CLKDEV_LOOKUP -	select HAVE_MACH_CLKDEV +	select COMMON_CLK  	select GENERIC_GPIO  	select ARCH_REQUIRE_GPIOLIB  	help @@ -913,7 +959,7 @@ config ARCH_NOMADIK  	select ARM_AMBA  	select ARM_VIC  	select CPU_ARM926T -	select CLKDEV_LOOKUP +	select COMMON_CLK  	select GENERIC_CLOCKEVENTS  	select PINCTRL  	select MIGHT_HAVE_CACHE_L2X0 @@ -936,6 +982,7 @@ config ARCH_DAVINCI  config ARCH_OMAP  	bool "TI OMAP" +	depends on MMU  	select HAVE_CLK  	select ARCH_REQUIRE_GPIOLIB  	select ARCH_HAS_CPUFREQ @@ -964,7 +1011,6 @@ config ARCH_VT8500  	select ARCH_HAS_CPUFREQ  	select GENERIC_CLOCKEVENTS  	select ARCH_REQUIRE_GPIOLIB -	select HAVE_PWM  	help  	  Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip. @@ -987,6 +1033,8 @@ endchoice  # Kconfigs may be included either alphabetically (according to the  # plat- suffix) or along side the corresponding mach-* source.  # +source "arch/arm/mach-mvebu/Kconfig" +  source "arch/arm/mach-at91/Kconfig"  source "arch/arm/mach-bcmring/Kconfig" @@ -1021,8 +1069,6 @@ source "arch/arm/mach-kirkwood/Kconfig"  source "arch/arm/mach-ks8695/Kconfig" -source "arch/arm/mach-lpc32xx/Kconfig" -  source "arch/arm/mach-msm/Kconfig"  source "arch/arm/mach-mv78xx0/Kconfig" @@ -1581,6 +1627,7 @@ config ARCH_NR_GPIO  	default 1024 if ARCH_SHMOBILE || ARCH_TEGRA  	default 355 if ARCH_U8500  	default 264 if MACH_H4700 +	default 512 if SOC_OMAP5  	default 0  	help  	  Maximum number of GPIOs in the system. @@ -1961,6 +2008,25 @@ config ARM_ATAG_DTB_COMPAT  	  bootloaders, this option allows zImage to extract the information  	  from the ATAG list and store it at run time into the appended DTB. +choice +	prompt "Kernel command line type" if ARM_ATAG_DTB_COMPAT +	default ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER + +config ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER +	bool "Use bootloader kernel arguments if available" +	help +	  Uses the command-line options passed by the boot loader instead of +	  the device tree bootargs property. If the boot loader doesn't provide +	  any, the device tree bootargs property will be used. + +config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND +	bool "Extend with bootloader kernel arguments" +	help +	  The command-line arguments provided by the boot loader will be +	  appended to the the device tree bootargs property. + +endchoice +  config CMDLINE  	string "Default kernel command string"  	default "" diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 01a13414121..f15f82bf3a5 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -310,6 +310,32 @@ choice  		  The uncompressor code port configuration is now handled  		  by CONFIG_S3C_LOWLEVEL_UART_PORT. +	config DEBUG_VEXPRESS_UART0_DETECT +		bool "Autodetect UART0 on Versatile Express Cortex-A core tiles" +		depends on ARCH_VEXPRESS && CPU_CP15_MMU +		help +		  This option enables a simple heuristic which tries to determine +		  the motherboard's memory map variant (original or RS1) and then +		  choose the relevant UART0 base address. + +		  Note that this will only work with standard A-class core tiles, +		  and may fail with non-standard SMM or custom software models. + +	config DEBUG_VEXPRESS_UART0_CA9 +		bool "Use PL011 UART0 at 0x10009000 (V2P-CA9 core tile)" +		depends on ARCH_VEXPRESS +		help +		  This option selects UART0 at 0x10009000. Except for custom models, +		  this applies only to the V2P-CA9 tile. + +	config DEBUG_VEXPRESS_UART0_RS1 +		bool "Use PL011 UART0 at 0x1c090000 (RS1 complaint tiles)" +		depends on ARCH_VEXPRESS +		help +		  This option selects UART0 at 0x1c090000. This applies to most +		  of the tiles using the RS1 memory map, including all new A-class +		  core tiles, FPGA-based SMMs and software models. +  	config DEBUG_LL_UART_NONE  		bool "No low-level debugging UART"  		help @@ -369,4 +395,13 @@ config ARM_KPROBES_TEST  	help  	  Perform tests of kprobes API and instruction set simulation. +config PID_IN_CONTEXTIDR +	bool "Write the current PID to the CONTEXTIDR register" +	depends on CPU_COPY_V6 +	help +	  Enabling this option causes the kernel to write the current PID to +	  the PROCID field of the CONTEXTIDR register, at the expense of some +	  additional instructions during context switch. Say Y here only if you +	  are planning to use hardware trace tools with this kernel. +  endmenu diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 0298b00fe24..30eae87ead6 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -10,6 +10,9 @@  #  # Copyright (C) 1995-2001 by Russell King +# Ensure linker flags are correct +LDFLAGS		:= +  LDFLAGS_vmlinux	:=-p --no-undefined -X  ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)  LDFLAGS_vmlinux	+= --be8 @@ -157,6 +160,7 @@ machine-$(CONFIG_ARCH_MV78XX0)		:= mv78xx0  machine-$(CONFIG_ARCH_IMX_V4_V5)	:= imx  machine-$(CONFIG_ARCH_IMX_V6_V7)	:= imx  machine-$(CONFIG_ARCH_MXS)		:= mxs +machine-$(CONFIG_ARCH_MVEBU)		:= mvebu  machine-$(CONFIG_ARCH_NETX)		:= netx  machine-$(CONFIG_ARCH_NOMADIK)		:= nomadik  machine-$(CONFIG_ARCH_OMAP1)		:= omap1 @@ -186,6 +190,7 @@ machine-$(CONFIG_ARCH_VEXPRESS)		:= vexpress  machine-$(CONFIG_ARCH_VT8500)		:= vt8500  machine-$(CONFIG_ARCH_W90X900)		:= w90x900  machine-$(CONFIG_FOOTBRIDGE)		:= footbridge +machine-$(CONFIG_ARCH_SOCFPGA)		:= socfpga  machine-$(CONFIG_MACH_SPEAR1310)	:= spear13xx  machine-$(CONFIG_MACH_SPEAR1340)	:= spear13xx  machine-$(CONFIG_MACH_SPEAR300)		:= spear3xx diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c index 797f04bedb4..aabc02a6848 100644 --- a/arch/arm/boot/compressed/atags_to_fdt.c +++ b/arch/arm/boot/compressed/atags_to_fdt.c @@ -1,6 +1,12 @@  #include <asm/setup.h>  #include <libfdt.h> +#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) +#define do_extend_cmdline 1 +#else +#define do_extend_cmdline 0 +#endif +  static int node_offset(void *fdt, const char *node_path)  {  	int offset = fdt_path_offset(fdt, node_path); @@ -36,6 +42,48 @@ static int setprop_cell(void *fdt, const char *node_path,  	return fdt_setprop_cell(fdt, offset, property, val);  } +static const void *getprop(const void *fdt, const char *node_path, +			   const char *property, int *len) +{ +	int offset = fdt_path_offset(fdt, node_path); + +	if (offset == -FDT_ERR_NOTFOUND) +		return NULL; + +	return fdt_getprop(fdt, offset, property, len); +} + +static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) +{ +	char cmdline[COMMAND_LINE_SIZE]; +	const char *fdt_bootargs; +	char *ptr = cmdline; +	int len = 0; + +	/* copy the fdt command line into the buffer */ +	fdt_bootargs = getprop(fdt, "/chosen", "bootargs", &len); +	if (fdt_bootargs) +		if (len < COMMAND_LINE_SIZE) { +			memcpy(ptr, fdt_bootargs, len); +			/* len is the length of the string +			 * including the NULL terminator */ +			ptr += len - 1; +		} + +	/* and append the ATAG_CMDLINE */ +	if (fdt_cmdline) { +		len = strlen(fdt_cmdline); +		if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { +			*ptr++ = ' '; +			memcpy(ptr, fdt_cmdline, len); +			ptr += len; +		} +	} +	*ptr = '\0'; + +	setprop_string(fdt, "/chosen", "bootargs", cmdline); +} +  /*   * Convert and fold provided ATAGs into the provided FDT.   * @@ -72,8 +120,18 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)  	for_each_tag(atag, atag_list) {  		if (atag->hdr.tag == ATAG_CMDLINE) { -			setprop_string(fdt, "/chosen", "bootargs", -					atag->u.cmdline.cmdline); +			/* Append the ATAGS command line to the device tree +			 * command line. +			 * NB: This means that if the same parameter is set in +			 * the device tree and in the tags, the one from the +			 * tags will be chosen. +			 */ +			if (do_extend_cmdline) +				merge_fdt_bootargs(fdt, +						   atag->u.cmdline.cmdline); +			else +				setprop_string(fdt, "/chosen", "bootargs", +					       atag->u.cmdline.cmdline);  		} else if (atag->hdr.tag == ATAG_MEM) {  			if (memcount >= sizeof(mem_reg_property)/4)  				continue; diff --git a/arch/arm/boot/dts/aks-cdu.dts b/arch/arm/boot/dts/aks-cdu.dts new file mode 100644 index 00000000000..29b9f15e759 --- /dev/null +++ b/arch/arm/boot/dts/aks-cdu.dts @@ -0,0 +1,113 @@ +/* + * aks-cdu.dts - Device Tree file for AK signal CDU + * + * Copyright (C) 2012 AK signal Brno a.s. + *               2012 Jiri Prchal <jiri.prchal@aksignal.cz> + * + * Licensed under GPLv2 or later. + */ + +/dts-v1/; + +/include/ "ge863-pro3.dtsi" + +/ { +	chosen { +		bootargs = "console=ttyS0,115200 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs"; +	}; + +	ahb { +		apb { +			usart0: serial@fffb0000 { +				status = "okay"; +			}; + +			usart1: serial@fffb4000 { +				status = "okay"; +				linux,rs485-enabled-at-boot-time; +				rs485-rts-delay = <0 0>; +				}; + +			usart2: serial@fffb8000 { +				status = "okay"; +				linux,rs485-enabled-at-boot-time; +				rs485-rts-delay = <0 0>; +			}; + +			usart3: serial@fffd0000 { +				status = "okay"; +				linux,rs485-enabled-at-boot-time; +				rs485-rts-delay = <0 0>; +			}; + +			macb0: ethernet@fffc4000 { +				phy-mode = "rmii"; +				status = "okay"; +			}; + +			usb1: gadget@fffa4000 { +				atmel,vbus-gpio = <&pioC 15 0>; +				status = "okay"; +			}; +		}; + +		usb0: ohci@00500000 { +			num-ports = <2>; +			status = "okay"; +		}; + +		nand0: nand@40000000 { +			nand-bus-width = <8>; +			nand-ecc-mode = "soft"; +			nand-on-flash-bbt; +			status = "okay"; + +			bootstrap@0 { +				label = "bootstrap"; +				reg = <0x0 0x40000>; +			}; + +			uboot@40000 { +				label = "uboot"; +				reg = <0x40000 0x80000>; +			}; +			ubootenv@c0000 { +				label = "ubootenv"; +				reg = <0xc0000 0x40000>; +			}; +			kernel@100000 { +				label = "kernel"; +				reg = <0x100000 0x400000>; +			}; +			rootfs@500000 { +				label = "rootfs"; +				reg = <0x500000 0x7b00000>; +			}; +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		red { +			gpios = <&pioC 10 0>; +			linux,default-trigger = "none"; +		}; + +		green { +			gpios = <&pioA 5 1>; +			linux,default-trigger = "none"; +			default-state = "on"; +		}; + +		yellow { +			gpios = <&pioB 20 1>; +			linux,default-trigger = "none"; +		}; + +		blue { +			gpios = <&pioB 21 1>; +			linux,default-trigger = "none"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts new file mode 100644 index 00000000000..a9af4db7234 --- /dev/null +++ b/arch/arm/boot/dts/am335x-bone.dts @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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. + */ +/dts-v1/; + +/include/ "am33xx.dtsi" + +/ { +	model = "TI AM335x BeagleBone"; +	compatible = "ti,am335x-bone", "ti,am33xx"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; +}; diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts new file mode 100644 index 00000000000..d6a97d9eff7 --- /dev/null +++ b/arch/arm/boot/dts/am335x-evm.dts @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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. + */ +/dts-v1/; + +/include/ "am33xx.dtsi" + +/ { +	model = "TI AM335x EVM"; +	compatible = "ti,am335x-evm", "ti,am33xx"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; +}; diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi new file mode 100644 index 00000000000..59509c48d7e --- /dev/null +++ b/arch/arm/boot/dts/am33xx.dtsi @@ -0,0 +1,158 @@ +/* + * Device Tree Source for AM33XX SoC + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This file is licensed under the terms of the GNU General Public License + * version 2.  This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +/include/ "skeleton.dtsi" + +/ { +	compatible = "ti,am33xx"; + +	aliases { +		serial0 = &uart1; +		serial1 = &uart2; +		serial2 = &uart3; +		serial3 = &uart4; +		serial4 = &uart5; +		serial5 = &uart6; +	}; + +	cpus { +		cpu@0 { +			compatible = "arm,cortex-a8"; +		}; +	}; + +	/* +	 * The soc node represents the soc top level view. It is uses for IPs +	 * that are not memory mapped in the MPU view or for the MPU itself. +	 */ +	soc { +		compatible = "ti,omap-infra"; +		mpu { +			compatible = "ti,omap3-mpu"; +			ti,hwmods = "mpu"; +		}; +	}; + +	/* +	 * XXX: Use a flat representation of the AM33XX interconnect. +	 * The real AM33XX interconnect network is quite complex.Since +	 * that will not bring real advantage to represent that in DT +	 * for the moment, just use a fake OCP bus entry to represent +	 * the whole bus hierarchy. +	 */ +	ocp { +		compatible = "simple-bus"; +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; +		ti,hwmods = "l3_main"; + +		intc: interrupt-controller@48200000 { +			compatible = "ti,omap2-intc"; +			interrupt-controller; +			#interrupt-cells = <1>; +			ti,intc-size = <128>; +			reg = <0x48200000 0x1000>; +		}; + +		gpio1: gpio@44e07000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio1"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio2: gpio@4804C000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio2"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio3: gpio@481AC000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio3"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio4: gpio@481AE000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio4"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		uart1: serial@44E09000 { +			compatible = "ti,omap3-uart"; +			ti,hwmods = "uart1"; +			clock-frequency = <48000000>; +		}; + +		uart2: serial@48022000 { +			compatible = "ti,omap3-uart"; +			ti,hwmods = "uart2"; +			clock-frequency = <48000000>; +		}; + +		uart3: serial@48024000 { +			compatible = "ti,omap3-uart"; +			ti,hwmods = "uart3"; +			clock-frequency = <48000000>; +		}; + +		uart4: serial@481A6000 { +			compatible = "ti,omap3-uart"; +			ti,hwmods = "uart4"; +			clock-frequency = <48000000>; +		}; + +		uart5: serial@481A8000 { +			compatible = "ti,omap3-uart"; +			ti,hwmods = "uart5"; +			clock-frequency = <48000000>; +		}; + +		uart6: serial@481AA000 { +			compatible = "ti,omap3-uart"; +			ti,hwmods = "uart6"; +			clock-frequency = <48000000>; +		}; + +		i2c1: i2c@44E0B000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c1"; +		}; + +		i2c2: i2c@4802A000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c2"; +		}; + +		i2c3: i2c@4819C000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c3"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/am3517-evm.dts b/arch/arm/boot/dts/am3517-evm.dts new file mode 100644 index 00000000000..474f760ecad --- /dev/null +++ b/arch/arm/boot/dts/am3517-evm.dts @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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. + */ +/dts-v1/; + +/include/ "omap3.dtsi" + +/ { +	model = "TI AM3517 EVM (AM3517/05)"; +	compatible = "ti,am3517-evm", "ti,omap3"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; +}; + +&i2c1 { +	clock-frequency = <400000>; +}; + +&i2c2 { +	clock-frequency = <400000>; +}; + +&i2c3 { +	clock-frequency = <400000>; +}; diff --git a/arch/arm/boot/dts/armada-370-db.dts b/arch/arm/boot/dts/armada-370-db.dts new file mode 100644 index 00000000000..fffd5c2a304 --- /dev/null +++ b/arch/arm/boot/dts/armada-370-db.dts @@ -0,0 +1,42 @@ +/* + * Device Tree file for Marvell Armada 370 evaluation board + * (DB-88F6710-BP-DDR3) + * + *  Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +/dts-v1/; +/include/ "armada-370.dtsi" + +/ { +	model = "Marvell Armada 370 Evaluation Board"; +	compatible = "marvell,a370-db", "marvell,armada370", "marvell,armada-370-xp"; + +	chosen { +		bootargs = "console=ttyS0,115200 earlyprintk"; +	}; + +	memory { +		device_type = "memory"; +		reg = <0x00000000 0x20000000>; /* 512 MB */ +	}; + +	soc { +		serial@d0012000 { +			clock-frequency = <200000000>; +			status = "okay"; +		}; +		timer@d0020300 { +			clock-frequency = <600000000>; +			status = "okay"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi new file mode 100644 index 00000000000..6b6b932a5a7 --- /dev/null +++ b/arch/arm/boot/dts/armada-370-xp.dtsi @@ -0,0 +1,68 @@ +/* + * Device Tree Include file for Marvell Armada 370 and Armada XP SoC + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * Ben Dooks <ben.dooks@codethink.co.uk> + * + * 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. + * + * This file contains the definitions that are common to the Armada + * 370 and Armada XP SoC. + */ + +/include/ "skeleton.dtsi" + +/ { +	model = "Marvell Armada 370 and XP SoC"; +	compatible = "marvell,armada_370_xp"; + +	cpus { +		cpu@0 { +			compatible = "marvell,sheeva-v7"; +		}; +	}; + +	mpic: interrupt-controller@d0020000 { +	      compatible = "marvell,mpic"; +	      #interrupt-cells = <1>; +	      #address-cells = <1>; +	      #size-cells = <1>; +	      interrupt-controller; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&mpic>; +		ranges; + +		serial@d0012000 { +				compatible = "ns16550"; +				reg = <0xd0012000 0x100>; +				reg-shift = <2>; +				interrupts = <41>; +				status = "disabled"; +		}; +		serial@d0012100 { +				compatible = "ns16550"; +				reg = <0xd0012100 0x100>; +				reg-shift = <2>; +				interrupts = <42>; +				status = "disabled"; +		}; + +		timer@d0020300 { +			       compatible = "marvell,armada-370-xp-timer"; +			       reg = <0xd0020300 0x30>; +			       interrupts = <37>, <38>, <39>, <40>; +		}; +	}; +}; + diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi new file mode 100644 index 00000000000..3228ccc8333 --- /dev/null +++ b/arch/arm/boot/dts/armada-370.dtsi @@ -0,0 +1,35 @@ +/* + * Device Tree Include file for Marvell Armada 370 family SoC + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + * + * Contains definitions specific to the Armada 370 SoC that are not + * common to all Armada SoCs. + */ + +/include/ "armada-370-xp.dtsi" + +/ { +	model = "Marvell Armada 370 family SoC"; +	compatible = "marvell,armada370", "marvell,armada-370-xp"; + +	mpic: interrupt-controller@d0020000 { +	      reg = <0xd0020a00 0x1d0>, +		    <0xd0021870 0x58>; +	}; + +	soc { +		system-controller@d0018200 { +				compatible = "marvell,armada-370-xp-system-controller"; +				reg = <0xd0018200 0x100>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/armada-xp-db.dts b/arch/arm/boot/dts/armada-xp-db.dts new file mode 100644 index 00000000000..f97040d4258 --- /dev/null +++ b/arch/arm/boot/dts/armada-xp-db.dts @@ -0,0 +1,50 @@ +/* + * Device Tree file for Marvell Armada XP evaluation board + * (DB-78460-BP) + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +/dts-v1/; +/include/ "armada-xp.dtsi" + +/ { +	model = "Marvell Armada XP Evaluation Board"; +	compatible = "marvell,axp-db", "marvell,armadaxp", "marvell,armada-370-xp"; + +	chosen { +		bootargs = "console=ttyS0,115200 earlyprintk"; +	}; + +	memory { +		device_type = "memory"; +		reg = <0x00000000 0x80000000>; /* 2 GB */ +	}; + +	soc { +		serial@d0012000 { +			clock-frequency = <250000000>; +			status = "okay"; +		}; +		serial@d0012100 { +			clock-frequency = <250000000>; +			status = "okay"; +		}; +		serial@d0012200 { +			clock-frequency = <250000000>; +			status = "okay"; +		}; +		serial@d0012300 { +			clock-frequency = <250000000>; +			status = "okay"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi new file mode 100644 index 00000000000..71d6b5d0daf --- /dev/null +++ b/arch/arm/boot/dts/armada-xp.dtsi @@ -0,0 +1,55 @@ +/* + * Device Tree Include file for Marvell Armada XP family SoC + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * Ben Dooks <ben.dooks@codethink.co.uk> + * + * 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. + * + * Contains definitions specific to the Armada XP SoC that are not + * common to all Armada SoCs. + */ + +/include/ "armada-370-xp.dtsi" + +/ { +	model = "Marvell Armada XP family SoC"; +	compatible = "marvell,armadaxp", "marvell,armada-370-xp"; + +	mpic: interrupt-controller@d0020000 { +	      reg = <0xd0020a00 0x1d0>, +		    <0xd0021870 0x58>; +	}; + +	soc { +		serial@d0012200 { +				compatible = "ns16550"; +				reg = <0xd0012200 0x100>; +				reg-shift = <2>; +				interrupts = <43>; +				status = "disabled"; +		}; +		serial@d0012300 { +				compatible = "ns16550"; +				reg = <0xd0012300 0x100>; +				reg-shift = <2>; +				interrupts = <44>; +				status = "disabled"; +		}; + +		timer@d0020300 { +				marvell,timer-25Mhz; +		}; + +		system-controller@d0018200 { +				compatible = "marvell,armada-370-xp-system-controller"; +				reg = <0xd0018200 0x500>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index f449efc9825..66389c1c6f6 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi @@ -52,10 +52,11 @@  			ranges;  			aic: interrupt-controller@fffff000 { -				#interrupt-cells = <2>; +				#interrupt-cells = <3>;  				compatible = "atmel,at91rm9200-aic";  				interrupt-controller;  				reg = <0xfffff000 0x200>; +				atmel,external-irqs = <29 30 31>;  			};  			ramc0: ramc@ffffea00 { @@ -81,25 +82,25 @@  			pit: timer@fffffd30 {  				compatible = "atmel,at91sam9260-pit";  				reg = <0xfffffd30 0xf>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  			};  			tcb0: timer@fffa0000 {  				compatible = "atmel,at91rm9200-tcb";  				reg = <0xfffa0000 0x100>; -				interrupts = <17 4 18 4 19 4>; +				interrupts = <17 4 0 18 4 0 19 4 0>;  			};  			tcb1: timer@fffdc000 {  				compatible = "atmel,at91rm9200-tcb";  				reg = <0xfffdc000 0x100>; -				interrupts = <26 4 27 4 28 4>; +				interrupts = <26 4 0 27 4 0 28 4 0>;  			};  			pioA: gpio@fffff400 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff400 0x100>; -				interrupts = <2 4>; +				interrupts = <2 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -108,7 +109,7 @@  			pioB: gpio@fffff600 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff600 0x100>; -				interrupts = <3 4>; +				interrupts = <3 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -117,7 +118,7 @@  			pioC: gpio@fffff800 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff800 0x100>; -				interrupts = <4 4>; +				interrupts = <4 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -126,14 +127,14 @@  			dbgu: serial@fffff200 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffff200 0x200>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  				status = "disabled";  			};  			usart0: serial@fffb0000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffb0000 0x200>; -				interrupts = <6 4>; +				interrupts = <6 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -142,7 +143,7 @@  			usart1: serial@fffb4000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffb4000 0x200>; -				interrupts = <7 4>; +				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -151,7 +152,7 @@  			usart2: serial@fffb8000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffb8000 0x200>; -				interrupts = <8 4>; +				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -160,7 +161,7 @@  			usart3: serial@fffd0000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd0000 0x200>; -				interrupts = <23 4>; +				interrupts = <23 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -169,7 +170,7 @@  			usart4: serial@fffd4000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd4000 0x200>; -				interrupts = <24 4>; +				interrupts = <24 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -178,7 +179,7 @@  			usart5: serial@fffd8000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd8000 0x200>; -				interrupts = <25 4>; +				interrupts = <25 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -187,21 +188,21 @@  			macb0: ethernet@fffc4000 {  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffc4000 0x100>; -				interrupts = <21 4>; +				interrupts = <21 4 3>;  				status = "disabled";  			};  			usb1: gadget@fffa4000 {  				compatible = "atmel,at91rm9200-udc";  				reg = <0xfffa4000 0x4000>; -				interrupts = <10 4>; +				interrupts = <10 4 2>;  				status = "disabled";  			};  			adc0: adc@fffe0000 {  				compatible = "atmel,at91sam9260-adc";  				reg = <0xfffe0000 0x100>; -				interrupts = <5 4>; +				interrupts = <5 4 0>;  				atmel,adc-use-external-triggers;  				atmel,adc-channels-used = <0xf>;  				atmel,adc-vref = <3300>; @@ -253,7 +254,7 @@  		usb0: ohci@00500000 {  			compatible = "atmel,at91rm9200-ohci", "usb-ohci";  			reg = <0x00500000 0x100000>; -			interrupts = <20 4>; +			interrupts = <20 4 2>;  			status = "disabled";  		};  	}; diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 0209913a65a..b460d6ce9eb 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi @@ -48,10 +48,11 @@  			ranges;  			aic: interrupt-controller@fffff000 { -				#interrupt-cells = <2>; +				#interrupt-cells = <3>;  				compatible = "atmel,at91rm9200-aic";  				interrupt-controller;  				reg = <0xfffff000 0x200>; +				atmel,external-irqs = <30 31>;  			};  			pmc: pmc@fffffc00 { @@ -68,13 +69,13 @@  			pit: timer@fffffd30 {  				compatible = "atmel,at91sam9260-pit";  				reg = <0xfffffd30 0xf>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  			};  			tcb0: timer@fff7c000 {  				compatible = "atmel,at91rm9200-tcb";  				reg = <0xfff7c000 0x100>; -				interrupts = <19 4>; +				interrupts = <19 4 0>;  			};  			rstc@fffffd00 { @@ -90,7 +91,7 @@  			pioA: gpio@fffff200 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff200 0x100>; -				interrupts = <2 4>; +				interrupts = <2 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -99,7 +100,7 @@  			pioB: gpio@fffff400 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff400 0x100>; -				interrupts = <3 4>; +				interrupts = <3 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -108,7 +109,7 @@  			pioC: gpio@fffff600 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff600 0x100>; -				interrupts = <4 4>; +				interrupts = <4 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -117,7 +118,7 @@  			pioD: gpio@fffff800 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff800 0x100>; -				interrupts = <4 4>; +				interrupts = <4 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -126,7 +127,7 @@  			pioE: gpio@fffffa00 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffffa00 0x100>; -				interrupts = <4 4>; +				interrupts = <4 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -135,14 +136,14 @@  			dbgu: serial@ffffee00 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xffffee00 0x200>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  				status = "disabled";  			};  			usart0: serial@fff8c000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff8c000 0x200>; -				interrupts = <7 4>; +				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -151,7 +152,7 @@  			usart1: serial@fff90000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff90000 0x200>; -				interrupts = <8 4>; +				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -160,7 +161,7 @@  			usart2: serial@fff94000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff94000 0x200>; -				interrupts = <9 4>; +				interrupts = <9 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -169,14 +170,14 @@  			macb0: ethernet@fffbc000 {  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffbc000 0x100>; -				interrupts = <21 4>; +				interrupts = <21 4 3>;  				status = "disabled";  			};  			usb1: gadget@fff78000 {  				compatible = "atmel,at91rm9200-udc";  				reg = <0xfff78000 0x4000>; -				interrupts = <24 4>; +				interrupts = <24 4 2>;  				status = "disabled";  			};  		}; @@ -200,7 +201,7 @@  		usb0: ohci@00a00000 {  			compatible = "atmel,at91rm9200-ohci", "usb-ohci";  			reg = <0x00a00000 0x100000>; -			interrupts = <29 4>; +			interrupts = <29 4 2>;  			status = "disabled";  		};  	}; diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 7dbccaf199f..bafa8806fc1 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi @@ -53,10 +53,11 @@  			ranges;  			aic: interrupt-controller@fffff000 { -				#interrupt-cells = <2>; +				#interrupt-cells = <3>;  				compatible = "atmel,at91rm9200-aic";  				interrupt-controller;  				reg = <0xfffff000 0x200>; +				atmel,external-irqs = <31>;  			};  			ramc0: ramc@ffffe400 { @@ -78,7 +79,7 @@  			pit: timer@fffffd30 {  				compatible = "atmel,at91sam9260-pit";  				reg = <0xfffffd30 0xf>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  			}; @@ -90,25 +91,25 @@  			tcb0: timer@fff7c000 {  				compatible = "atmel,at91rm9200-tcb";  				reg = <0xfff7c000 0x100>; -				interrupts = <18 4>; +				interrupts = <18 4 0>;  			};  			tcb1: timer@fffd4000 {  				compatible = "atmel,at91rm9200-tcb";  				reg = <0xfffd4000 0x100>; -				interrupts = <18 4>; +				interrupts = <18 4 0>;  			};  			dma: dma-controller@ffffec00 {  				compatible = "atmel,at91sam9g45-dma";  				reg = <0xffffec00 0x200>; -				interrupts = <21 4>; +				interrupts = <21 4 0>;  			};  			pioA: gpio@fffff200 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff200 0x100>; -				interrupts = <2 4>; +				interrupts = <2 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -117,7 +118,7 @@  			pioB: gpio@fffff400 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff400 0x100>; -				interrupts = <3 4>; +				interrupts = <3 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -126,7 +127,7 @@  			pioC: gpio@fffff600 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff600 0x100>; -				interrupts = <4 4>; +				interrupts = <4 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -135,7 +136,7 @@  			pioD: gpio@fffff800 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffff800 0x100>; -				interrupts = <5 4>; +				interrupts = <5 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -144,7 +145,7 @@  			pioE: gpio@fffffa00 {  				compatible = "atmel,at91rm9200-gpio";  				reg = <0xfffffa00 0x100>; -				interrupts = <5 4>; +				interrupts = <5 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -153,14 +154,14 @@  			dbgu: serial@ffffee00 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xffffee00 0x200>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  				status = "disabled";  			};  			usart0: serial@fff8c000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff8c000 0x200>; -				interrupts = <7 4>; +				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -169,7 +170,7 @@  			usart1: serial@fff90000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff90000 0x200>; -				interrupts = <8 4>; +				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -178,7 +179,7 @@  			usart2: serial@fff94000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff94000 0x200>; -				interrupts = <9 4>; +				interrupts = <9 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -187,7 +188,7 @@  			usart3: serial@fff98000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff98000 0x200>; -				interrupts = <10 4>; +				interrupts = <10 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -196,14 +197,14 @@  			macb0: ethernet@fffbc000 {  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffbc000 0x100>; -				interrupts = <25 4>; +				interrupts = <25 4 3>;  				status = "disabled";  			};  			adc0: adc@fffb0000 {  				compatible = "atmel,at91sam9260-adc";  				reg = <0xfffb0000 0x100>; -				interrupts = <20 4>; +				interrupts = <20 4 0>;  				atmel,adc-use-external-triggers;  				atmel,adc-channels-used = <0xff>;  				atmel,adc-vref = <3300>; @@ -257,14 +258,14 @@  		usb0: ohci@00700000 {  			compatible = "atmel,at91rm9200-ohci", "usb-ohci";  			reg = <0x00700000 0x100000>; -			interrupts = <22 4>; +			interrupts = <22 4 2>;  			status = "disabled";  		};  		usb1: ehci@00800000 {  			compatible = "atmel,at91sam9g45-ehci", "usb-ehci";  			reg = <0x00800000 0x100000>; -			interrupts = <22 4>; +			interrupts = <22 4 2>;  			status = "disabled";  		};  	}; diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index cb84de791b5..bfac0dfc332 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi @@ -50,7 +50,7 @@  			ranges;  			aic: interrupt-controller@fffff000 { -				#interrupt-cells = <2>; +				#interrupt-cells = <3>;  				compatible = "atmel,at91rm9200-aic";  				interrupt-controller;  				reg = <0xfffff000 0x200>; @@ -74,7 +74,7 @@  			pit: timer@fffffe30 {  				compatible = "atmel,at91sam9260-pit";  				reg = <0xfffffe30 0xf>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  			};  			shdwc@fffffe10 { @@ -85,25 +85,25 @@  			tcb0: timer@f8008000 {  				compatible = "atmel,at91sam9x5-tcb";  				reg = <0xf8008000 0x100>; -				interrupts = <17 4>; +				interrupts = <17 4 0>;  			};  			tcb1: timer@f800c000 {  				compatible = "atmel,at91sam9x5-tcb";  				reg = <0xf800c000 0x100>; -				interrupts = <17 4>; +				interrupts = <17 4 0>;  			};  			dma: dma-controller@ffffec00 {  				compatible = "atmel,at91sam9g45-dma";  				reg = <0xffffec00 0x200>; -				interrupts = <20 4>; +				interrupts = <20 4 0>;  			};  			pioA: gpio@fffff400 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff400 0x100>; -				interrupts = <2 4>; +				interrupts = <2 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -112,7 +112,7 @@  			pioB: gpio@fffff600 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff600 0x100>; -				interrupts = <2 4>; +				interrupts = <2 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -121,7 +121,7 @@  			pioC: gpio@fffff800 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff800 0x100>; -				interrupts = <3 4>; +				interrupts = <3 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -130,7 +130,7 @@  			pioD: gpio@fffffa00 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffffa00 0x100>; -				interrupts = <3 4>; +				interrupts = <3 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -139,14 +139,14 @@  			dbgu: serial@fffff200 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffff200 0x200>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  				status = "disabled";  			};  			usart0: serial@f801c000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf801c000 0x4000>; -				interrupts = <5 4>; +				interrupts = <5 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -155,7 +155,7 @@  			usart1: serial@f8020000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf8020000 0x4000>; -				interrupts = <6 4>; +				interrupts = <6 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -164,7 +164,7 @@  			usart2: serial@f8024000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf8024000 0x4000>; -				interrupts = <7 4>; +				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -173,7 +173,7 @@  			usart3: serial@f8028000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf8028000 0x4000>; -				interrupts = <8 4>; +				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -201,7 +201,7 @@  		usb0: ohci@00500000 {  			compatible = "atmel,at91rm9200-ohci", "usb-ohci";  			reg = <0x00500000 0x00100000>; -			interrupts = <22 4>; +			interrupts = <22 4 2>;  			status = "disabled";  		};  	}; diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 6b3ef4339ae..4a18c393b13 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi @@ -51,10 +51,11 @@  			ranges;  			aic: interrupt-controller@fffff000 { -				#interrupt-cells = <2>; +				#interrupt-cells = <3>;  				compatible = "atmel,at91rm9200-aic";  				interrupt-controller;  				reg = <0xfffff000 0x200>; +				atmel,external-irqs = <31>;  			};  			ramc0: ramc@ffffe800 { @@ -80,37 +81,37 @@  			pit: timer@fffffe30 {  				compatible = "atmel,at91sam9260-pit";  				reg = <0xfffffe30 0xf>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  			};  			tcb0: timer@f8008000 {  				compatible = "atmel,at91sam9x5-tcb";  				reg = <0xf8008000 0x100>; -				interrupts = <17 4>; +				interrupts = <17 4 0>;  			};  			tcb1: timer@f800c000 {  				compatible = "atmel,at91sam9x5-tcb";  				reg = <0xf800c000 0x100>; -				interrupts = <17 4>; +				interrupts = <17 4 0>;  			};  			dma0: dma-controller@ffffec00 {  				compatible = "atmel,at91sam9g45-dma";  				reg = <0xffffec00 0x200>; -				interrupts = <20 4>; +				interrupts = <20 4 0>;  			};  			dma1: dma-controller@ffffee00 {  				compatible = "atmel,at91sam9g45-dma";  				reg = <0xffffee00 0x200>; -				interrupts = <21 4>; +				interrupts = <21 4 0>;  			};  			pioA: gpio@fffff400 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff400 0x100>; -				interrupts = <2 4>; +				interrupts = <2 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -119,7 +120,7 @@  			pioB: gpio@fffff600 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff600 0x100>; -				interrupts = <2 4>; +				interrupts = <2 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -128,7 +129,7 @@  			pioC: gpio@fffff800 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff800 0x100>; -				interrupts = <3 4>; +				interrupts = <3 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -137,7 +138,7 @@  			pioD: gpio@fffffa00 {  				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffffa00 0x100>; -				interrupts = <3 4>; +				interrupts = <3 4 1>;  				#gpio-cells = <2>;  				gpio-controller;  				interrupt-controller; @@ -146,14 +147,14 @@  			dbgu: serial@fffff200 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffff200 0x200>; -				interrupts = <1 4>; +				interrupts = <1 4 7>;  				status = "disabled";  			};  			usart0: serial@f801c000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf801c000 0x200>; -				interrupts = <5 4>; +				interrupts = <5 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -162,7 +163,7 @@  			usart1: serial@f8020000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf8020000 0x200>; -				interrupts = <6 4>; +				interrupts = <6 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -171,7 +172,7 @@  			usart2: serial@f8024000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf8024000 0x200>; -				interrupts = <7 4>; +				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -180,21 +181,21 @@  			macb0: ethernet@f802c000 {  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xf802c000 0x100>; -				interrupts = <24 4>; +				interrupts = <24 4 3>;  				status = "disabled";  			};  			macb1: ethernet@f8030000 {  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xf8030000 0x100>; -				interrupts = <27 4>; +				interrupts = <27 4 3>;  				status = "disabled";  			};  			adc0: adc@f804c000 {  				compatible = "atmel,at91sam9260-adc";  				reg = <0xf804c000 0x100>; -				interrupts = <19 4>; +				interrupts = <19 4 0>;  				atmel,adc-use-external;  				atmel,adc-channels-used = <0xffff>;  				atmel,adc-vref = <3300>; @@ -248,14 +249,14 @@  		usb0: ohci@00600000 {  			compatible = "atmel,at91rm9200-ohci", "usb-ohci";  			reg = <0x00600000 0x100000>; -			interrupts = <22 4>; +			interrupts = <22 4 2>;  			status = "disabled";  		};  		usb1: ehci@00700000 {  			compatible = "atmel,at91sam9g45-ehci", "usb-ehci";  			reg = <0x00700000 0x100000>; -			interrupts = <22 4>; +			interrupts = <22 4 2>;  			status = "disabled";  		};  	}; diff --git a/arch/arm/boot/dts/db8500.dtsi b/arch/arm/boot/dts/db8500.dtsi index 4ad5160018c..3180a9c588b 100644 --- a/arch/arm/boot/dts/db8500.dtsi +++ b/arch/arm/boot/dts/db8500.dtsi @@ -48,7 +48,7 @@  		};  		rtc@80154000 { -			compatible = "stericsson,db8500-rtc"; +			compatible = "arm,rtc-pl031", "arm,primecell";  			reg = <0x80154000 0x1000>;  			interrupts = <0 18 0x4>;  		}; @@ -60,7 +60,7 @@  			interrupts = <0 119 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <0>; @@ -73,7 +73,7 @@  			interrupts = <0 120 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <1>; @@ -86,7 +86,7 @@  			interrupts = <0 121 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <2>; @@ -99,7 +99,7 @@  			interrupts = <0 122 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <3>; @@ -112,7 +112,7 @@  			interrupts = <0 123 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <4>; @@ -125,7 +125,7 @@  			interrupts = <0 124 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <5>; @@ -138,7 +138,7 @@  			interrupts = <0 125 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <6>; @@ -151,7 +151,7 @@  			interrupts = <0 126 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <7>; @@ -164,7 +164,7 @@  			interrupts = <0 127 0x4>;  			interrupt-controller;  			#interrupt-cells = <2>; -			supports-sleepmode; +			st,supports-sleepmode;  			gpio-controller;  			#gpio-cells = <2>;  			gpio-bank = <8>; @@ -206,62 +206,74 @@  				// DB8500_REGULATOR_VAPE  				db8500_vape_reg: db8500_vape { +					regulator-compatible = "db8500_vape";  					regulator-name = "db8500-vape";  					regulator-always-on;  				};  				// DB8500_REGULATOR_VARM  				db8500_varm_reg: db8500_varm { +					regulator-compatible = "db8500_varm";  					regulator-name = "db8500-varm";  				};  				// DB8500_REGULATOR_VMODEM  				db8500_vmodem_reg: db8500_vmodem { +					regulator-compatible = "db8500_vmodem";  					regulator-name = "db8500-vmodem";  				};  				// DB8500_REGULATOR_VPLL  				db8500_vpll_reg: db8500_vpll { +					regulator-compatible = "db8500_vpll";  					regulator-name = "db8500-vpll";  				};  				// DB8500_REGULATOR_VSMPS1  				db8500_vsmps1_reg: db8500_vsmps1 { +					regulator-compatible = "db8500_vsmps1";  					regulator-name = "db8500-vsmps1";  				};  				// DB8500_REGULATOR_VSMPS2  				db8500_vsmps2_reg: db8500_vsmps2 { +					regulator-compatible = "db8500_vsmps2";  					regulator-name = "db8500-vsmps2";  				};  				// DB8500_REGULATOR_VSMPS3  				db8500_vsmps3_reg: db8500_vsmps3 { +					regulator-compatible = "db8500_vsmps3";  					regulator-name = "db8500-vsmps3";  				};  				// DB8500_REGULATOR_VRF1  				db8500_vrf1_reg: db8500_vrf1 { +					regulator-compatible = "db8500_vrf1";  					regulator-name = "db8500-vrf1";  				};  				// DB8500_REGULATOR_SWITCH_SVAMMDSP  				db8500_sva_mmdsp_reg: db8500_sva_mmdsp { +					regulator-compatible = "db8500_sva_mmdsp";  					regulator-name = "db8500-sva-mmdsp";  				};  				// DB8500_REGULATOR_SWITCH_SVAMMDSPRET  				db8500_sva_mmdsp_ret_reg: db8500_sva_mmdsp_ret { +					regulator-compatible = "db8500_sva_mmdsp_ret";  					regulator-name = "db8500-sva-mmdsp-ret";  				};  				// DB8500_REGULATOR_SWITCH_SVAPIPE  				db8500_sva_pipe_reg: db8500_sva_pipe { +					regulator-compatible = "db8500_sva_pipe";  					regulator-name = "db8500_sva_pipe";  				};  				// DB8500_REGULATOR_SWITCH_SIAMMDSP  				db8500_sia_mmdsp_reg: db8500_sia_mmdsp { +					regulator-compatible = "db8500_sia_mmdsp";  					regulator-name = "db8500_sia_mmdsp";  				}; @@ -272,38 +284,45 @@  				// DB8500_REGULATOR_SWITCH_SIAPIPE  				db8500_sia_pipe_reg: db8500_sia_pipe { +					regulator-compatible = "db8500_sia_pipe";  					regulator-name = "db8500-sia-pipe";  				};  				// DB8500_REGULATOR_SWITCH_SGA  				db8500_sga_reg: db8500_sga { +					regulator-compatible = "db8500_sga";  					regulator-name = "db8500-sga";  					vin-supply = <&db8500_vape_reg>;  				};  				// DB8500_REGULATOR_SWITCH_B2R2_MCDE  				db8500_b2r2_mcde_reg: db8500_b2r2_mcde { +					regulator-compatible = "db8500_b2r2_mcde";  					regulator-name = "db8500-b2r2-mcde";  					vin-supply = <&db8500_vape_reg>;  				};  				// DB8500_REGULATOR_SWITCH_ESRAM12  				db8500_esram12_reg: db8500_esram12 { +					regulator-compatible = "db8500_esram12";  					regulator-name = "db8500-esram12";  				};  				// DB8500_REGULATOR_SWITCH_ESRAM12RET  				db8500_esram12_ret_reg: db8500_esram12_ret { +					regulator-compatible = "db8500_esram12_ret";  					regulator-name = "db8500-esram12-ret";  				};  				// DB8500_REGULATOR_SWITCH_ESRAM34  				db8500_esram34_reg: db8500_esram34 { +					regulator-compatible = "db8500_esram34";  					regulator-name = "db8500-esram34";  				};  				// DB8500_REGULATOR_SWITCH_ESRAM34RET  				db8500_esram34_ret_reg: db8500_esram34_ret { +					regulator-compatible = "db8500_esram34_ret";  					regulator-name = "db8500-esram34-ret";  				};  			}; @@ -312,12 +331,70 @@  				compatible = "stericsson,ab8500";  				reg = <5>; /* mailbox 5 is i2c */  				interrupts = <0 40 0x4>; +				interrupt-controller; +				#interrupt-cells = <2>; + +				ab8500-rtc { +					compatible = "stericsson,ab8500-rtc"; +					interrupts = <17 0x4 +					              18 0x4>; +					interrupt-names = "60S", "ALARM"; +				}; + +				ab8500-gpadc { +					compatible = "stericsson,ab8500-gpadc"; +					interrupts = <32 0x4 +						      39 0x4>; +					interrupt-names = "HW_CONV_END", "SW_CONV_END"; +					vddadc-supply = <&ab8500_ldo_tvout_reg>; +				}; + +				ab8500-usb { +					compatible = "stericsson,ab8500-usb"; +					interrupts = < 90 0x4 +						       96 0x4 +						       14 0x4 +						       15 0x4 +						       79 0x4 +						       74 0x4 +						       75 0x4>; +					interrupt-names = "ID_WAKEUP_R", +							  "ID_WAKEUP_F", +							  "VBUS_DET_F", +							  "VBUS_DET_R", +							  "USB_LINK_STATUS", +							  "USB_ADP_PROBE_PLUG", +							  "USB_ADP_PROBE_UNPLUG"; +					vddulpivio18-supply = <&ab8500_ldo_initcore_reg>; +					v-ape-supply = <&db8500_vape_reg>; +					musb_1v8-supply = <&db8500_vsmps2_reg>; +				}; + +				ab8500-ponkey { +					compatible = "stericsson,ab8500-ponkey"; +					interrupts = <6 0x4 +						      7 0x4>; +					interrupt-names = "ONKEY_DBF", "ONKEY_DBR"; +				}; + +				ab8500-sysctrl { +					compatible = "stericsson,ab8500-sysctrl"; +				}; + +				ab8500-pwm { +					compatible = "stericsson,ab8500-pwm"; +				}; + +				ab8500-debugfs { +					compatible = "stericsson,ab8500-debug"; +				};  				ab8500-regulators {  					compatible = "stericsson,ab8500-regulator";  					// supplies to the display/camera  					ab8500_ldo_aux1_reg: ab8500_ldo_aux1 { +						regulator-compatible = "ab8500_ldo_aux1";  						regulator-name = "V-DISPLAY";  						regulator-min-microvolt = <2500000>;  						regulator-max-microvolt = <2900000>; @@ -328,6 +405,7 @@  					// supplies to the on-board eMMC  					ab8500_ldo_aux2_reg: ab8500_ldo_aux2 { +						regulator-compatible = "ab8500_ldo_aux2";  						regulator-name = "V-eMMC1";  						regulator-min-microvolt = <1100000>;  						regulator-max-microvolt = <3300000>; @@ -335,6 +413,7 @@  					// supply for VAUX3; SDcard slots  					ab8500_ldo_aux3_reg: ab8500_ldo_aux3 { +						regulator-compatible = "ab8500_ldo_aux3";  						regulator-name = "V-MMC-SD";  						regulator-min-microvolt = <1100000>;  						regulator-max-microvolt = <3300000>; @@ -342,41 +421,49 @@  					// supply for v-intcore12; VINTCORE12 LDO  					ab8500_ldo_initcore_reg: ab8500_ldo_initcore { +						regulator-compatible = "ab8500_ldo_initcore";  						regulator-name = "V-INTCORE";  					};  					// supply for tvout; gpadc; TVOUT LDO  					ab8500_ldo_tvout_reg: ab8500_ldo_tvout { +						regulator-compatible = "ab8500_ldo_tvout";  						regulator-name = "V-TVOUT";  					};  					// supply for ab8500-usb; USB LDO  					ab8500_ldo_usb_reg: ab8500_ldo_usb { +						regulator-compatible = "ab8500_ldo_usb";  						regulator-name = "dummy";  					};  					// supply for ab8500-vaudio; VAUDIO LDO  					ab8500_ldo_audio_reg: ab8500_ldo_audio { +						regulator-compatible = "ab8500_ldo_audio";  						regulator-name = "V-AUD";  					};  					// supply for v-anamic1 VAMic1-LDO  					ab8500_ldo_anamic1_reg: ab8500_ldo_anamic1 { +						regulator-compatible = "ab8500_ldo_anamic1";  						regulator-name = "V-AMIC1";  					};  					// supply for v-amic2; VAMIC2 LDO; reuse constants for AMIC1  					ab8500_ldo_amamic2_reg: ab8500_ldo_amamic2 { +						regulator-compatible = "ab8500_ldo_amamic2";  						regulator-name = "V-AMIC2";  					};  					// supply for v-dmic; VDMIC LDO  					ab8500_ldo_dmic_reg: ab8500_ldo_dmic { +						regulator-compatible = "ab8500_ldo_dmic";  						regulator-name = "V-DMIC";  					};  					// supply for U8500 CSI/DSI; VANA LDO  					ab8500_ldo_ana_reg: ab8500_ldo_ana { +						regulator-compatible = "ab8500_ldo_ana";  						regulator-name = "V-CSI/DSI";  					};  				}; diff --git a/arch/arm/boot/dts/ea3250.dts b/arch/arm/boot/dts/ea3250.dts new file mode 100644 index 00000000000..d79b28d9c96 --- /dev/null +++ b/arch/arm/boot/dts/ea3250.dts @@ -0,0 +1,174 @@ +/* + * Embedded Artists LPC3250 board + * + * Copyright 2012 Roland Stigge <stigge@antcom.de> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "lpc32xx.dtsi" + +/ { +	model = "Embedded Artists LPC3250 board based on NXP LPC3250"; +	compatible = "ea,ea3250", "nxp,lpc3250"; +	#address-cells = <1>; +	#size-cells = <1>; + +	memory { +		device_type = "memory"; +		reg = <0 0x4000000>; +	}; + +	ahb { +		mac: ethernet@31060000 { +			phy-mode = "rmii"; +			use-iram; +		}; + +		/* Here, choose exactly one from: ohci, usbd */ +		ohci@31020000 { +			transceiver = <&isp1301>; +			status = "okay"; +		}; + +/* +		usbd@31020000 { +			transceiver = <&isp1301>; +			status = "okay"; +		}; +*/ + +		/* 128MB Flash via SLC NAND controller */ +		slc: flash@20020000 { +			status = "okay"; +			#address-cells = <1>; +			#size-cells = <1>; + +			nxp,wdr-clks = <14>; +			nxp,wwidth = <260000000>; +			nxp,whold = <104000000>; +			nxp,wsetup = <200000000>; +			nxp,rdr-clks = <14>; +			nxp,rwidth = <34666666>; +			nxp,rhold = <104000000>; +			nxp,rsetup = <200000000>; +			nand-on-flash-bbt; +			gpios = <&gpio 5 19 1>; /* GPO_P3 19, active low */ + +			mtd0@00000000 { +				label = "ea3250-boot"; +				reg = <0x00000000 0x00080000>; +				read-only; +			}; + +			mtd1@00080000 { +				label = "ea3250-uboot"; +				reg = <0x00080000 0x000c0000>; +				read-only; +			}; + +			mtd2@00140000 { +				label = "ea3250-kernel"; +				reg = <0x00140000 0x00400000>; +			}; + +			mtd3@00540000 { +				label = "ea3250-rootfs"; +				reg = <0x00540000 0x07ac0000>; +			}; +		}; + +		apb { +			uart5: serial@40090000 { +				status = "okay"; +			}; + +			uart3: serial@40080000 { +				status = "okay"; +			}; + +			uart6: serial@40098000 { +				status = "okay"; +			}; + +			i2c1: i2c@400A0000 { +				clock-frequency = <100000>; + +				eeprom@50 { +					compatible = "at,24c256"; +					reg = <0x50>; +				}; + +				eeprom@57 { +					compatible = "at,24c64"; +					reg = <0x57>; +				}; + +				uda1380: uda1380@18 { +					compatible = "nxp,uda1380"; +					reg = <0x18>; +					power-gpio = <&gpio 0x59 0>; +					reset-gpio = <&gpio 0x51 0>; +					dac-clk = "wspll"; +				}; + +				pca9532: pca9532@60 { +					compatible = "nxp,pca9532"; +					gpio-controller; +					#gpio-cells = <2>; +					reg = <0x60>; +				}; +			}; + +			i2c2: i2c@400A8000 { +				clock-frequency = <100000>; +			}; + +			i2cusb: i2c@31020300 { +				clock-frequency = <100000>; + +				isp1301: usb-transceiver@2d { +					compatible = "nxp,isp1301"; +					reg = <0x2d>; +				}; +			}; + +			sd@20098000 { +				wp-gpios = <&pca9532 5 0>; +				cd-gpios = <&pca9532 4 0>; +				cd-inverted; +				bus-width = <4>; +				status = "okay"; +			}; +		}; + +		fab { +			uart1: serial@40014000 { +				status = "okay"; +			}; + +			/* 3-axis accelerometer X,Y,Z (or AD-IN instead of Z) */ +			adc@40048000 { +				status = "okay"; +			}; +		}; +	}; + +	gpio_keys { +		compatible = "gpio-keys"; +		#address-cells = <1>; +		#size-cells = <0>; +		autorepeat; +		button@21 { +			label = "GPIO Key UP"; +			linux,code = <103>; +			gpios = <&gpio 4 1 0>; /* GPI_P3 1 */ +		}; +	}; +}; diff --git a/arch/arm/boot/dts/evk-pro3.dts b/arch/arm/boot/dts/evk-pro3.dts new file mode 100644 index 00000000000..b7354e6506d --- /dev/null +++ b/arch/arm/boot/dts/evk-pro3.dts @@ -0,0 +1,41 @@ +/* + * evk-pro3.dts - Device Tree file for Telit EVK-PRO3 with Telit GE863-PRO3 + * + * Copyright (C) 2012 Telit, + *               2012 Fabio Porcedda <fabio.porcedda@gmail.com> + * + * Licensed under GPLv2 or later. + */ + +/dts-v1/; + +/include/ "ge863-pro3.dtsi" + +/ { +	model = "Telit EVK-PRO3 for Telit GE863-PRO3"; +	compatible = "telit,evk-pro3", "atmel,at91sam9260", "atmel,at91sam9"; + +	ahb { +		apb { +			macb0: ethernet@fffc4000 { +				phy-mode = "rmii"; +				status = "okay"; +			}; + +			usb1: gadget@fffa4000 { +				atmel,vbus-gpio = <&pioC 5 0>; +				status = "okay"; +			}; +		}; + +		usb0: ohci@00500000 { +			num-ports = <2>; +			status = "okay"; +		}; +	}; + +	i2c@0 { +		status = "okay"; +	}; + +};
\ No newline at end of file diff --git a/arch/arm/boot/dts/exynos4210-origen.dts b/arch/arm/boot/dts/exynos4210-origen.dts index b8c476384ee..0c49caa0997 100644 --- a/arch/arm/boot/dts/exynos4210-origen.dts +++ b/arch/arm/boot/dts/exynos4210-origen.dts @@ -134,4 +134,16 @@  	i2c@138D0000 {  		status = "disabled";  	}; + +	spi_0: spi@13920000 { +		status = "disabled"; +	}; + +	spi_1: spi@13930000 { +		status = "disabled"; +	}; + +	spi_2: spi@13940000 { +		status = "disabled"; +	};  }; diff --git a/arch/arm/boot/dts/exynos4210-smdkv310.dts b/arch/arm/boot/dts/exynos4210-smdkv310.dts index 27afc8e535c..1beccc8f14f 100644 --- a/arch/arm/boot/dts/exynos4210-smdkv310.dts +++ b/arch/arm/boot/dts/exynos4210-smdkv310.dts @@ -179,4 +179,42 @@  	i2c@138D0000 {  		status = "disabled";  	}; + +	spi_0: spi@13920000 { +		status = "disabled"; +	}; + +	spi_1: spi@13930000 { +		status = "disabled"; +	}; + +	spi_2: spi@13940000 { +		gpios = <&gpc1 1 5 3 0>, +			<&gpc1 3 5 3 0>, +			<&gpc1 4 5 3 0>; + +		w25x80@0 { +			#address-cells = <1>; +			#size-cells = <1>; +			compatible = "w25x80"; +			reg = <0>; +			spi-max-frequency = <1000000>; + +			controller-data { +				cs-gpio = <&gpc1 2 1 0 3>; +				samsung,spi-feedback-delay = <0>; +			}; + +			partition@0 { +				label = "U-Boot"; +				reg = <0x0 0x40000>; +				read-only; +			}; + +			partition@40000 { +				label = "Kernel"; +				reg = <0x40000 0xc0000>; +			}; +		}; +	};  }; diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi index a1dd2ee8375..02891fe876e 100644 --- a/arch/arm/boot/dts/exynos4210.dtsi +++ b/arch/arm/boot/dts/exynos4210.dtsi @@ -25,6 +25,12 @@  	compatible = "samsung,exynos4210";  	interrupt-parent = <&gic>; +	aliases { +		spi0 = &spi_0; +		spi1 = &spi_1; +		spi2 = &spi_2; +	}; +  	gic:interrupt-controller@10490000 {  		compatible = "arm,cortex-a9-gic";  		#interrupt-cells = <3>; @@ -33,6 +39,17 @@  		reg = <0x10490000 0x1000>, <0x10480000 0x100>;  	}; +	combiner:interrupt-controller@10440000 { +		compatible = "samsung,exynos4210-combiner"; +		#interrupt-cells = <2>; +		interrupt-controller; +		reg = <0x10440000 0x1000>; +		interrupts = <0 0 0>, <0 1 0>, <0 2 0>, <0 3 0>, +			     <0 4 0>, <0 5 0>, <0 6 0>, <0 7 0>, +			     <0 8 0>, <0 9 0>, <0 10 0>, <0 11 0>, +			     <0 12 0>, <0 13 0>, <0 14 0>, <0 15 0>; +	}; +  	watchdog@10060000 {  		compatible = "samsung,s3c2410-wdt";  		reg = <0x10060000 0x100>; @@ -147,6 +164,36 @@  		interrupts = <0 65 0>;  	}; +	spi_0: spi@13920000 { +		compatible = "samsung,exynos4210-spi"; +		reg = <0x13920000 0x100>; +		interrupts = <0 66 0>; +		tx-dma-channel = <&pdma0 7>; /* preliminary */ +		rx-dma-channel = <&pdma0 6>; /* preliminary */ +		#address-cells = <1>; +		#size-cells = <0>; +	}; + +	spi_1: spi@13930000 { +		compatible = "samsung,exynos4210-spi"; +		reg = <0x13930000 0x100>; +		interrupts = <0 67 0>; +		tx-dma-channel = <&pdma1 7>; /* preliminary */ +		rx-dma-channel = <&pdma1 6>; /* preliminary */ +		#address-cells = <1>; +		#size-cells = <0>; +	}; + +	spi_2: spi@13940000 { +		compatible = "samsung,exynos4210-spi"; +		reg = <0x13940000 0x100>; +		interrupts = <0 68 0>; +		tx-dma-channel = <&pdma0 9>; /* preliminary */ +		rx-dma-channel = <&pdma0 8>; /* preliminary */ +		#address-cells = <1>; +		#size-cells = <0>; +	}; +  	amba {  		#address-cells = <1>;  		#size-cells = <1>; diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts index 49945cc1bc7..8a5e348793c 100644 --- a/arch/arm/boot/dts/exynos5250-smdk5250.dts +++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts @@ -71,4 +71,42 @@  	i2c@12CD0000 {  		status = "disabled";  	}; + +	spi_0: spi@12d20000 { +		status = "disabled"; +	}; + +	spi_1: spi@12d30000 { +		gpios = <&gpa2 4 2 3 0>, +			<&gpa2 6 2 3 0>, +			<&gpa2 7 2 3 0>; + +		w25q80bw@0 { +			#address-cells = <1>; +			#size-cells = <1>; +			compatible = "w25x80"; +			reg = <0>; +			spi-max-frequency = <1000000>; + +			controller-data { +				cs-gpio = <&gpa2 5 1 0 3>; +				samsung,spi-feedback-delay = <0>; +			}; + +			partition@0 { +				label = "U-Boot"; +				reg = <0x0 0x40000>; +				read-only; +			}; + +			partition@40000 { +				label = "Kernel"; +				reg = <0x40000 0xc0000>; +			}; +		}; +	}; + +	spi_2: spi@12d40000 { +		status = "disabled"; +	};  }; diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 4272b294922..004aaa8d123 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi @@ -23,6 +23,12 @@  	compatible = "samsung,exynos5250";  	interrupt-parent = <&gic>; +	aliases { +		spi0 = &spi_0; +		spi1 = &spi_1; +		spi2 = &spi_2; +	}; +  	gic:interrupt-controller@10481000 {  		compatible = "arm,cortex-a9-gic";  		#interrupt-cells = <3>; @@ -146,6 +152,36 @@  		#size-cells = <0>;  	}; +	spi_0: spi@12d20000 { +		compatible = "samsung,exynos4210-spi"; +		reg = <0x12d20000 0x100>; +		interrupts = <0 66 0>; +		tx-dma-channel = <&pdma0 5>; /* preliminary */ +		rx-dma-channel = <&pdma0 4>; /* preliminary */ +		#address-cells = <1>; +		#size-cells = <0>; +	}; + +	spi_1: spi@12d30000 { +		compatible = "samsung,exynos4210-spi"; +		reg = <0x12d30000 0x100>; +		interrupts = <0 67 0>; +		tx-dma-channel = <&pdma1 5>; /* preliminary */ +		rx-dma-channel = <&pdma1 4>; /* preliminary */ +		#address-cells = <1>; +		#size-cells = <0>; +	}; + +	spi_2: spi@12d40000 { +		compatible = "samsung,exynos4210-spi"; +		reg = <0x12d40000 0x100>; +		interrupts = <0 68 0>; +		tx-dma-channel = <&pdma0 7>; /* preliminary */ +		rx-dma-channel = <&pdma0 6>; /* preliminary */ +		#address-cells = <1>; +		#size-cells = <0>; +	}; +  	amba {  		#address-cells = <1>;  		#size-cells = <1>; diff --git a/arch/arm/boot/dts/ge863-pro3.dtsi b/arch/arm/boot/dts/ge863-pro3.dtsi new file mode 100644 index 00000000000..17136fc7a51 --- /dev/null +++ b/arch/arm/boot/dts/ge863-pro3.dtsi @@ -0,0 +1,52 @@ +/* + * ge863_pro3.dtsi - Device Tree file for Telit GE863-PRO3 + * + * Copyright (C) 2012 Telit, + *               2012 Fabio Porcedda <fabio.porcedda@gmail.com> + * + * Licensed under GPLv2 or later. + */ + +/include/ "at91sam9260.dtsi" + +/ { +	clocks { +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		main_clock: clock@0 { +			compatible = "atmel,osc", "fixed-clock"; +			clock-frequency = <6000000>; +		}; +	}; + +	ahb { +		apb { +			dbgu: serial@fffff200 { +				status = "okay"; +			}; +		}; + +		nand0: nand@40000000 { +			nand-bus-width = <8>; +			nand-ecc-mode = "soft"; +			nand-on-flash-bbt; +			status = "okay"; + +			boot@0 { +				label = "boot"; +				reg = <0x0 0x7c0000>; +			}; + +			root@07c0000 { +				label = "root"; +				reg = <0x7c0000 0x7840000>; +			}; +		}; +	}; + +	chosen { +		bootargs = "console=ttyS0,115200 root=ubi0:rootfs ubi.mtd=1 rootfstype=ubifs"; +	}; +}; diff --git a/arch/arm/boot/dts/highbank.dts b/arch/arm/boot/dts/highbank.dts index 83e72294aef..9fecf1ae777 100644 --- a/arch/arm/boot/dts/highbank.dts +++ b/arch/arm/boot/dts/highbank.dts @@ -1,5 +1,5 @@  /* - * Copyright 2011 Calxeda, Inc. + * Copyright 2011-2012 Calxeda, Inc.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms and conditions of the GNU General Public License, @@ -24,6 +24,7 @@  	compatible = "calxeda,highbank";  	#address-cells = <1>;  	#size-cells = <1>; +	clock-ranges;  	cpus {  		#address-cells = <1>; @@ -33,24 +34,32 @@  			compatible = "arm,cortex-a9";  			reg = <0>;  			next-level-cache = <&L2>; +			clocks = <&a9pll>; +			clock-names = "cpu";  		};  		cpu@1 {  			compatible = "arm,cortex-a9";  			reg = <1>;  			next-level-cache = <&L2>; +			clocks = <&a9pll>; +			clock-names = "cpu";  		};  		cpu@2 {  			compatible = "arm,cortex-a9";  			reg = <2>;  			next-level-cache = <&L2>; +			clocks = <&a9pll>; +			clock-names = "cpu";  		};  		cpu@3 {  			compatible = "arm,cortex-a9";  			reg = <3>;  			next-level-cache = <&L2>; +			clocks = <&a9pll>; +			clock-names = "cpu";  		};  	}; @@ -75,12 +84,14 @@  			compatible = "arm,cortex-a9-twd-timer";  			reg = <0xfff10600 0x20>;  			interrupts = <1 13 0xf01>; +			clocks = <&a9periphclk>;  		};  		watchdog@fff10620 {  			compatible = "arm,cortex-a9-twd-wdt";  			reg = <0xfff10620 0x20>;  			interrupts = <1 14 0xf01>; +			clocks = <&a9periphclk>;  		};  		intc: interrupt-controller@fff11000 { @@ -116,12 +127,21 @@  			compatible = "calxeda,hb-sdhci";  			reg = <0xffe0e000 0x1000>;  			interrupts = <0 90 4>; +			clocks = <&eclk>; +		}; + +		memory-controller@fff00000 { +			compatible = "calxeda,hb-ddr-ctrl"; +			reg = <0xfff00000 0x1000>; +			interrupts = <0 91 4>;  		};  		ipc@fff20000 {  			compatible = "arm,pl320", "arm,primecell";  			reg = <0xfff20000 0x1000>;  			interrupts = <0 7 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		gpioe: gpio@fff30000 { @@ -130,6 +150,8 @@  			gpio-controller;  			reg = <0xfff30000 0x1000>;  			interrupts = <0 14 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		gpiof: gpio@fff31000 { @@ -138,6 +160,8 @@  			gpio-controller;  			reg = <0xfff31000 0x1000>;  			interrupts = <0 15 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		gpiog: gpio@fff32000 { @@ -146,6 +170,8 @@  			gpio-controller;  			reg = <0xfff32000 0x1000>;  			interrupts = <0 16 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		gpioh: gpio@fff33000 { @@ -154,24 +180,32 @@  			gpio-controller;  			reg = <0xfff33000 0x1000>;  			interrupts = <0 17 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		timer {  			compatible = "arm,sp804", "arm,primecell";  			reg = <0xfff34000 0x1000>;  			interrupts = <0 18 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		rtc@fff35000 {  			compatible = "arm,pl031", "arm,primecell";  			reg = <0xfff35000 0x1000>;  			interrupts = <0 19 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		serial@fff36000 {  			compatible = "arm,pl011", "arm,primecell";  			reg = <0xfff36000 0x1000>;  			interrupts = <0 20 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		smic@fff3a000 { @@ -186,12 +220,79 @@  		sregs@fff3c000 {  			compatible = "calxeda,hb-sregs";  			reg = <0xfff3c000 0x1000>; + +			clocks { +				#address-cells = <1>; +				#size-cells = <0>; + +				osc: oscillator { +					#clock-cells = <0>; +					compatible = "fixed-clock"; +					clock-frequency = <33333000>; +				}; + +				ddrpll: ddrpll { +					#clock-cells = <0>; +					compatible = "calxeda,hb-pll-clock"; +					clocks = <&osc>; +					reg = <0x108>; +				}; + +				a9pll: a9pll { +					#clock-cells = <0>; +					compatible = "calxeda,hb-pll-clock"; +					clocks = <&osc>; +					reg = <0x100>; +				}; + +				a9periphclk: a9periphclk { +					#clock-cells = <0>; +					compatible = "calxeda,hb-a9periph-clock"; +					clocks = <&a9pll>; +					reg = <0x104>; +				}; + +				a9bclk: a9bclk { +					#clock-cells = <0>; +					compatible = "calxeda,hb-a9bus-clock"; +					clocks = <&a9pll>; +					reg = <0x104>; +				}; + +				emmcpll: emmcpll { +					#clock-cells = <0>; +					compatible = "calxeda,hb-pll-clock"; +					clocks = <&osc>; +					reg = <0x10C>; +				}; + +				eclk: eclk { +					#clock-cells = <0>; +					compatible = "calxeda,hb-emmc-clock"; +					clocks = <&emmcpll>; +					reg = <0x114>; +				}; + +				pclk: pclk { +					#clock-cells = <0>; +					compatible = "fixed-clock"; +					clock-frequency = <150000000>; +				}; +			}; +		}; + +		sregs@fff3c200 { +			compatible = "calxeda,hb-sregs-l2-ecc"; +			reg = <0xfff3c200 0x100>; +			interrupts = <0 71 4  0 72 4>;  		};  		dma@fff3d000 {  			compatible = "arm,pl330", "arm,primecell";  			reg = <0xfff3d000 0x1000>;  			interrupts = <0 92 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk";  		};  		ethernet@fff50000 { diff --git a/arch/arm/boot/dts/imx23-evk.dts b/arch/arm/boot/dts/imx23-evk.dts index 70bffa929b6..e3486f486b4 100644 --- a/arch/arm/boot/dts/imx23-evk.dts +++ b/arch/arm/boot/dts/imx23-evk.dts @@ -22,17 +22,60 @@  	apb@80000000 {  		apbh@80000000 { +			gpmi-nand@8000c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&gpmi_pins_a &gpmi_pins_fixup>; +				status = "okay"; +			}; +  			ssp0: ssp@80010000 {  				compatible = "fsl,imx23-mmc";  				pinctrl-names = "default"; -				pinctrl-0 = <&mmc0_8bit_pins_a &mmc0_pins_fixup>; -				bus-width = <8>; +				pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_pins_fixup>; +				bus-width = <4>;  				wp-gpios = <&gpio1 30 0>; +				vmmc-supply = <®_vddio_sd0>; +				status = "okay"; +			}; + +			pinctrl@80018000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&hog_pins_a>; + +				hog_pins_a: hog-gpios@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x1123 /* MX23_PAD_LCD_RESET__GPIO_1_18 */ +						0x11d3 /* MX23_PAD_PWM3__GPIO_1_29 */ +						0x11e3 /* MX23_PAD_PWM4__GPIO_1_30 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; +			}; + +			lcdif@80030000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&lcdif_24bit_pins_a>; +				panel-enable-gpios = <&gpio1 18 0>;  				status = "okay";  			};  		};  		apbx@80040000 { +			pwm: pwm@80064000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&pwm2_pins_a>; +				status = "okay"; +			}; + +			auart0: serial@8006c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart0_pins_a>; +				status = "okay"; +			}; +  			duart: serial@80070000 {  				pinctrl-names = "default";  				pinctrl-0 = <&duart_pins_a>; @@ -40,4 +83,23 @@  			};  		};  	}; + +	regulators { +		compatible = "simple-bus"; + +		reg_vddio_sd0: vddio-sd0 { +			compatible = "regulator-fixed"; +			regulator-name = "vddio-sd0"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			gpio = <&gpio1 29 0>; +		}; +	}; + +	backlight { +		compatible = "pwm-backlight"; +		pwms = <&pwm 2 5000000>; +		brightness-levels = <0 4 8 16 32 64 128 255>; +		default-brightness-level = <6>; +	};  }; diff --git a/arch/arm/boot/dts/imx23-olinuxino.dts b/arch/arm/boot/dts/imx23-olinuxino.dts new file mode 100644 index 00000000000..20912b1d889 --- /dev/null +++ b/arch/arm/boot/dts/imx23-olinuxino.dts @@ -0,0 +1,44 @@ +/* + * Copyright 2012 Freescale Semiconductor, Inc. + * + * Author: Fabio Estevam <fabio.estevam@freescale.com> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "imx23.dtsi" + +/ { +	model = "i.MX23 Olinuxino Low Cost Board"; +	compatible = "olimex,imx23-olinuxino", "fsl,imx23"; + +	memory { +		reg = <0x40000000 0x04000000>; +	}; + +	apb@80000000 { +		apbh@80000000 { +			ssp0: ssp@80010000 { +				compatible = "fsl,imx23-mmc"; +				pinctrl-names = "default"; +				pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_pins_fixup>; +				bus-width = <4>; +				status = "okay"; +			}; +		}; + +		apbx@80040000 { +			duart: serial@80070000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&duart_pins_a>; +				status = "okay"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx23-stmp378x_devb.dts b/arch/arm/boot/dts/imx23-stmp378x_devb.dts new file mode 100644 index 00000000000..757a327ff3e --- /dev/null +++ b/arch/arm/boot/dts/imx23-stmp378x_devb.dts @@ -0,0 +1,78 @@ +/* + * Copyright 2012 Freescale Semiconductor, Inc. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "imx23.dtsi" + +/ { +	model = "Freescale STMP378x Development Board"; +	compatible = "fsl,stmp378x-devb", "fsl,imx23"; + +	memory { +		reg = <0x40000000 0x04000000>; +	}; + +	apb@80000000 { +		apbh@80000000 { +			ssp0: ssp@80010000 { +				compatible = "fsl,imx23-mmc"; +				pinctrl-names = "default"; +				pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_pins_fixup>; +				bus-width = <4>; +				wp-gpios = <&gpio1 30 0>; +				vmmc-supply = <®_vddio_sd0>; +				status = "okay"; +			}; + +			pinctrl@80018000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&hog_pins_a>; + +				hog_pins_a: hog-gpios@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x11d3 /* MX23_PAD_PWM3__GPIO_1_29 */ +						0x11e3 /* MX23_PAD_PWM4__GPIO_1_30 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; +			}; +		}; + +		apbx@80040000 { +			auart0: serial@8006c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart0_pins_a>; +				status = "okay"; +			}; + +			duart: serial@80070000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&duart_pins_a>; +				status = "okay"; +			}; +		}; +	}; + +	regulators { +		compatible = "simple-bus"; + +		reg_vddio_sd0: vddio-sd0 { +			compatible = "regulator-fixed"; +			regulator-name = "vddio-sd0"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			gpio = <&gpio1 29 0>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx23.dtsi b/arch/arm/boot/dts/imx23.dtsi index 8c5f9994f3f..a874dbfb5ae 100644 --- a/arch/arm/boot/dts/imx23.dtsi +++ b/arch/arm/boot/dts/imx23.dtsi @@ -18,6 +18,8 @@  		gpio0 = &gpio0;  		gpio1 = &gpio1;  		gpio2 = &gpio2; +		serial0 = &auart0; +		serial1 = &auart1;  	};  	cpus { @@ -57,13 +59,15 @@  				status = "disabled";  			}; -			bch@8000a000 { -				reg = <0x8000a000 2000>; -				status = "disabled"; -			}; - -			gpmi@8000c000 { -				reg = <0x8000c000 2000>; +			gpmi-nand@8000c000 { +				compatible = "fsl,imx23-gpmi-nand"; +				#address-cells = <1>; +				#size-cells = <1>; +				reg = <0x8000c000 2000>, <0x8000a000 2000>; +				reg-names = "gpmi-nand", "bch"; +				interrupts = <13>, <56>; +				interrupt-names = "gpmi-dma", "bch"; +				fsl,gpmi-dma-channel = <4>;  				status = "disabled";  			}; @@ -114,24 +118,151 @@  				duart_pins_a: duart@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x11a2 0x11b2>; +					fsl,pinmux-ids = < +						0x11a2 /* MX23_PAD_PWM0__DUART_RX */ +						0x11b2 /* MX23_PAD_PWM1__DUART_TX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				auart0_pins_a: auart0@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x01c0 /* MX23_PAD_AUART1_RX__AUART1_RX */ +						0x01d0 /* MX23_PAD_AUART1_TX__AUART1_TX */ +						0x01a0 /* MX23_PAD_AUART1_CTS__AUART1_CTS */ +						0x01b0 /* MX23_PAD_AUART1_RTS__AUART1_RTS */ +					>;  					fsl,drive-strength = <0>;  					fsl,voltage = <1>;  					fsl,pull-up = <0>;  				}; +				gpmi_pins_a: gpmi-nand@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x0000 /* MX23_PAD_GPMI_D00__GPMI_D00 */ +						0x0010 /* MX23_PAD_GPMI_D01__GPMI_D01 */ +						0x0020 /* MX23_PAD_GPMI_D02__GPMI_D02 */ +						0x0030 /* MX23_PAD_GPMI_D03__GPMI_D03 */ +						0x0040 /* MX23_PAD_GPMI_D04__GPMI_D04 */ +						0x0050 /* MX23_PAD_GPMI_D05__GPMI_D05 */ +						0x0060 /* MX23_PAD_GPMI_D06__GPMI_D06 */ +						0x0070 /* MX23_PAD_GPMI_D07__GPMI_D07 */ +						0x0100 /* MX23_PAD_GPMI_CLE__GPMI_CLE */ +						0x0110 /* MX23_PAD_GPMI_ALE__GPMI_ALE */ +						0x0130 /* MX23_PAD_GPMI_RDY0__GPMI_RDY0 */ +						0x0140 /* MX23_PAD_GPMI_RDY1__GPMI_RDY1 */ +						0x0170 /* MX23_PAD_GPMI_WPN__GPMI_WPN */ +						0x0180 /* MX23_PAD_GPMI_WRN__GPMI_WRN */ +						0x0190 /* MX23_PAD_GPMI_RDN__GPMI_RDN */ +						0x21b0 /* MX23_PAD_GPMI_CE1N__GPMI_CE1N */ +						0x21c0 /* MX23_PAD_GPMI_CE0N__GPMI_CE0N	*/ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				gpmi_pins_fixup: gpmi-pins-fixup { +					fsl,pinmux-ids = < +						0x0170 /* MX23_PAD_GPMI_WPN__GPMI_WPN */ +						0x0180 /* MX23_PAD_GPMI_WRN__GPMI_WRN */ +						0x0190 /* MX23_PAD_GPMI_RDN__GPMI_RDN */ +					>; +					fsl,drive-strength = <2>; +				}; + +				mmc0_4bit_pins_a: mmc0-4bit@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x2020 /* MX23_PAD_SSP1_DATA0__SSP1_DATA0 */ +						0x2030 /* MX23_PAD_SSP1_DATA1__SSP1_DATA1 */ +						0x2040 /* MX23_PAD_SSP1_DATA2__SSP1_DATA2 */ +						0x2050 /* MX23_PAD_SSP1_DATA3__SSP1_DATA3 */ +						0x2000 /* MX23_PAD_SSP1_CMD__SSP1_CMD */ +						0x2010 /* MX23_PAD_SSP1_DETECT__SSP1_DETECT */ +						0x2060 /* MX23_PAD_SSP1_SCK__SSP1_SCK */ +					>; +					fsl,drive-strength = <1>; +					fsl,voltage = <1>; +					fsl,pull-up = <1>; +				}; +  				mmc0_8bit_pins_a: mmc0-8bit@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x2020 0x2030 0x2040 -						0x2050 0x0082 0x0092 0x00a2 -						0x00b2 0x2000 0x2010 0x2060>; +					fsl,pinmux-ids = < +						0x2020 /* MX23_PAD_SSP1_DATA0__SSP1_DATA0 */ +						0x2030 /* MX23_PAD_SSP1_DATA1__SSP1_DATA1 */ +						0x2040 /* MX23_PAD_SSP1_DATA2__SSP1_DATA2 */ +						0x2050 /* MX23_PAD_SSP1_DATA3__SSP1_DATA3 */ +						0x0082 /* MX23_PAD_GPMI_D08__SSP1_DATA4 */ +						0x0092 /* MX23_PAD_GPMI_D09__SSP1_DATA5 */ +						0x00a2 /* MX23_PAD_GPMI_D10__SSP1_DATA6 */ +						0x00b2 /* MX23_PAD_GPMI_D11__SSP1_DATA7 */ +						0x2000 /* MX23_PAD_SSP1_CMD__SSP1_CMD */ +						0x2010 /* MX23_PAD_SSP1_DETECT__SSP1_DETECT */ +						0x2060 /* MX23_PAD_SSP1_SCK__SSP1_SCK */ +					>;  					fsl,drive-strength = <1>;  					fsl,voltage = <1>;  					fsl,pull-up = <1>;  				};  				mmc0_pins_fixup: mmc0-pins-fixup { -					fsl,pinmux-ids = <0x2010 0x2060>; +					fsl,pinmux-ids = < +						0x2010 /* MX23_PAD_SSP1_DETECT__SSP1_DETECT */ +						0x2060 /* MX23_PAD_SSP1_SCK__SSP1_SCK */ +					>; +					fsl,pull-up = <0>; +				}; + +				pwm2_pins_a: pwm2@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x11c0 /* MX23_PAD_PWM2__PWM2 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				lcdif_24bit_pins_a: lcdif-24bit@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x1000 /* MX23_PAD_LCD_D00__LCD_D0 */ +						0x1010 /* MX23_PAD_LCD_D01__LCD_D1 */ +						0x1020 /* MX23_PAD_LCD_D02__LCD_D2 */ +						0x1030 /* MX23_PAD_LCD_D03__LCD_D3 */ +						0x1040 /* MX23_PAD_LCD_D04__LCD_D4 */ +						0x1050 /* MX23_PAD_LCD_D05__LCD_D5 */ +						0x1060 /* MX23_PAD_LCD_D06__LCD_D6 */ +						0x1070 /* MX23_PAD_LCD_D07__LCD_D7 */ +						0x1080 /* MX23_PAD_LCD_D08__LCD_D8 */ +						0x1090 /* MX23_PAD_LCD_D09__LCD_D9 */ +						0x10a0 /* MX23_PAD_LCD_D10__LCD_D10 */ +						0x10b0 /* MX23_PAD_LCD_D11__LCD_D11 */ +						0x10c0 /* MX23_PAD_LCD_D12__LCD_D12 */ +						0x10d0 /* MX23_PAD_LCD_D13__LCD_D13 */ +						0x10e0 /* MX23_PAD_LCD_D14__LCD_D14 */ +						0x10f0 /* MX23_PAD_LCD_D15__LCD_D15 */ +						0x1100 /* MX23_PAD_LCD_D16__LCD_D16 */ +						0x1110 /* MX23_PAD_LCD_D17__LCD_D17 */ +						0x0081 /* MX23_PAD_GPMI_D08__LCD_D18 */ +						0x0091 /* MX23_PAD_GPMI_D09__LCD_D19 */ +						0x00a1 /* MX23_PAD_GPMI_D10__LCD_D20 */ +						0x00b1 /* MX23_PAD_GPMI_D11__LCD_D21 */ +						0x00c1 /* MX23_PAD_GPMI_D12__LCD_D22 */ +						0x00d1 /* MX23_PAD_GPMI_D13__LCD_D23 */ +						0x1160 /* MX23_PAD_LCD_DOTCK__LCD_DOTCK */ +						0x1170 /* MX23_PAD_LCD_ENABLE__LCD_ENABLE */ +						0x1180 /* MX23_PAD_LCD_HSYNC__LCD_HSYNC */ +						0x1190 /* MX23_PAD_LCD_VSYNC__LCD_VSYNC */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>;  					fsl,pull-up = <0>;  				};  			}; @@ -172,7 +303,9 @@  			};  			lcdif@80030000 { +				compatible = "fsl,imx23-lcdif";  				reg = <0x80030000 2000>; +				interrupts = <46 45>;  				status = "disabled";  			}; @@ -242,12 +375,16 @@  			};  			rtc@8005c000 { +				compatible = "fsl,imx23-rtc", "fsl,stmp3xxx-rtc";  				reg = <0x8005c000 2000>; -				status = "disabled"; +				interrupts = <22>;  			}; -			pwm@80064000 { +			pwm: pwm@80064000 { +				compatible = "fsl,imx23-pwm";  				reg = <0x80064000 2000>; +				#pwm-cells = <2>; +				fsl,pwm-number = <5>;  				status = "disabled";  			}; @@ -257,12 +394,16 @@  			};  			auart0: serial@8006c000 { +				compatible = "fsl,imx23-auart";  				reg = <0x8006c000 0x2000>; +				interrupts = <24 25 23>;  				status = "disabled";  			};  			auart1: serial@8006e000 { +				compatible = "fsl,imx23-auart";  				reg = <0x8006e000 0x2000>; +				interrupts = <59 60 58>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/imx27-3ds.dts b/arch/arm/boot/dts/imx27-3ds.dts new file mode 100644 index 00000000000..d3f8296e19e --- /dev/null +++ b/arch/arm/boot/dts/imx27-3ds.dts @@ -0,0 +1,41 @@ +/* + * Copyright 2012 Sascha Hauer, Pengutronix + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "imx27.dtsi" + +/ { +	model = "mx27_3ds"; +	compatible = "freescale,imx27-3ds", "fsl,imx27"; + +	memory { +		reg = <0x0 0x0>; +	}; + +	soc { +		aipi@10000000 { /* aipi */ + +			wdog@10002000 { +				status = "okay"; +			}; + +			uart@1000a000 { +				fsl,uart-has-rtscts; +				status = "okay"; +			}; + +			fec@1002b000 { +				status = "okay"; +			}; +		}; +	}; + +}; diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi index 386c769c38d..00bae3aad5a 100644 --- a/arch/arm/boot/dts/imx27.dtsi +++ b/arch/arm/boot/dts/imx27.dtsi @@ -121,7 +121,7 @@  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio2: gpio@10015100 { @@ -131,7 +131,7 @@  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio3: gpio@10015200 { @@ -141,7 +141,7 @@  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio4: gpio@10015300 { @@ -151,7 +151,7 @@  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio5: gpio@10015400 { @@ -161,7 +161,7 @@  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio6: gpio@10015500 { @@ -171,7 +171,7 @@  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			cspi3: cspi@10017000 { diff --git a/arch/arm/boot/dts/imx28-apx4devkit.dts b/arch/arm/boot/dts/imx28-apx4devkit.dts new file mode 100644 index 00000000000..b383417a558 --- /dev/null +++ b/arch/arm/boot/dts/imx28-apx4devkit.dts @@ -0,0 +1,198 @@ +/dts-v1/; +/include/ "imx28.dtsi" + +/ { +	model = "Bluegiga APX4 Development Kit"; +	compatible = "bluegiga,apx4devkit", "fsl,imx28"; + +	memory { +		reg = <0x40000000 0x04000000>; +	}; + +	apb@80000000 { +		apbh@80000000 { +			gpmi-nand@8000c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&gpmi_pins_a &gpmi_status_cfg>; +				status = "okay"; +			}; + +			ssp0: ssp@80010000 { +				compatible = "fsl,imx28-mmc"; +				pinctrl-names = "default"; +				pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_sck_cfg>; +				bus-width = <4>; +				status = "okay"; +			}; + +			ssp2: ssp@80014000 { +				compatible = "fsl,imx28-mmc"; +				pinctrl-names = "default"; +				pinctrl-0 = <&mmc2_4bit_pins_apx4 &mmc2_sck_cfg_apx4>; +				bus-width = <4>; +				status = "okay"; +			}; + +			pinctrl@80018000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&hog_pins_a>; + +				hog_pins_a: hog-gpios@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x0113 /* MX28_PAD_GPMI_CE1N__GPIO_0_17 */ +						0x0153 /* MX28_PAD_GPMI_RDY1__GPIO_0_21 */ +						0x2123 /* MX28_PAD_SSP2_MISO__GPIO_2_18 */ +						0x2131 /* MX28_PAD_SSP2_SS0__GPIO_2_19 */ +						0x31c3 /* MX28_PAD_PWM3__GPIO_3_28 */ +						0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */ +						0x4143 /* MX28_PAD_JTAG_RTCK__GPIO_4_20 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				lcdif_pins_apx4: lcdif-apx4@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x1181 /* MX28_PAD_LCD_RD_E__LCD_VSYNC */ +						0x1191 /* MX28_PAD_LCD_WR_RWN__LCD_HSYNC */ +						0x11a1 /* MX28_PAD_LCD_RS__LCD_DOTCLK */ +						0x11b1 /* MX28_PAD_LCD_CS__LCD_ENABLE */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				mmc2_4bit_pins_apx4: mmc2-4bit-apx4@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x2041 /* MX28_PAD_SSP0_DATA4__SSP2_D0 */ +						0x2051 /* MX28_PAD_SSP0_DATA5__SSP2_D3 */ +						0x2061 /* MX28_PAD_SSP0_DATA6__SSP2_CMD */ +						0x2071 /* MX28_PAD_SSP0_DATA7__SSP2_SCK */ +						0x2141 /* MX28_PAD_SSP2_SS1__SSP2_D1 */ +						0x2151 /* MX28_PAD_SSP2_SS2__SSP2_D2 */ +					>; +					fsl,drive-strength = <1>; +					fsl,voltage = <1>; +					fsl,pull-up = <1>; +				}; + +				mmc2_sck_cfg_apx4: mmc2-sck-cfg-apx4 { +					fsl,pinmux-ids = < +						0x2071 /* MX28_PAD_SSP0_DATA7__SSP2_SCK */ +					>; +					fsl,drive-strength = <2>; +					fsl,pull-up = <0>; +				}; +			}; + +			lcdif@80030000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&lcdif_24bit_pins_a +					     &lcdif_pins_apx4>; +				status = "okay"; +			}; +		}; + +		apbx@80040000 { +			saif0: saif@80042000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&saif0_pins_a>; +				status = "okay"; +			}; + +			saif1: saif@80046000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&saif1_pins_a>; +				fsl,saif-master = <&saif0>; +				status = "okay"; +			}; + +			i2c0: i2c@80058000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&i2c0_pins_a>; +				status = "okay"; + +				sgtl5000: codec@0a { +					compatible = "fsl,sgtl5000"; +					reg = <0x0a>; +					VDDA-supply = <®_3p3v>; +					VDDIO-supply = <®_3p3v>; + +				}; + +				pcf8563: rtc@51 { +					compatible = "phg,pcf8563"; +					reg = <0x51>; +				}; +			}; + +			duart: serial@80074000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&duart_pins_a>; +				status = "okay"; +			}; + +			auart0: serial@8006a000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart0_pins_a>; +				status = "okay"; +			}; + +			auart1: serial@8006c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart1_2pins_a>; +				status = "okay"; +			}; + +			auart2: serial@8006e000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart2_2pins_a>; +				status = "okay"; +			}; +		}; +	}; + +	ahb@80080000 { +		mac0: ethernet@800f0000 { +			phy-mode = "rmii"; +			pinctrl-names = "default"; +			pinctrl-0 = <&mac0_pins_a>; +			status = "okay"; +		}; +	}; + +	regulators { +		compatible = "simple-bus"; + +		reg_3p3v: 3p3v { +			compatible = "regulator-fixed"; +			regulator-name = "3P3V"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			regulator-always-on; +		}; +	}; + +	sound { +		compatible = "bluegiga,apx4devkit-sgtl5000", +			     "fsl,mxs-audio-sgtl5000"; +		model = "apx4devkit-sgtl5000"; +		saif-controllers = <&saif0 &saif1>; +		audio-codec = <&sgtl5000>; +	}; + +	leds { +		compatible = "gpio-leds"; + +		user { +			label = "Heartbeat"; +			gpios = <&gpio3 28 0>; +			linux,default-trigger = "heartbeat"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts b/arch/arm/boot/dts/imx28-cfa10036.dts new file mode 100644 index 00000000000..c03a577beca --- /dev/null +++ b/arch/arm/boot/dts/imx28-cfa10036.dts @@ -0,0 +1,52 @@ +/* + * Copyright 2012 Free Electrons + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "imx28.dtsi" + +/ { +	model = "Crystalfontz CFA-10036 Board"; +	compatible = "crystalfontz,cfa10036", "fsl,imx28"; + +	memory { +		reg = <0x40000000 0x08000000>; +	}; + +	apb@80000000 { +		apbh@80000000 { +			ssp0: ssp@80010000 { +				compatible = "fsl,imx28-mmc"; +				pinctrl-names = "default"; +				pinctrl-0 = <&mmc0_4bit_pins_a +					&mmc0_cd_cfg &mmc0_sck_cfg>; +				bus-width = <4>; +				status = "okay"; +			}; +		}; + +		apbx@80040000 { +			duart: serial@80074000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&duart_pins_b>; +				status = "okay"; +			}; +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		power { +			gpios = <&gpio3 4 1>; +			default-state = "on"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx28-evk.dts b/arch/arm/boot/dts/imx28-evk.dts index ee520a529cb..773c0e84d1f 100644 --- a/arch/arm/boot/dts/imx28-evk.dts +++ b/arch/arm/boot/dts/imx28-evk.dts @@ -22,6 +22,13 @@  	apb@80000000 {  		apbh@80000000 { +			gpmi-nand@8000c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&gpmi_pins_a &gpmi_status_cfg +					     &gpmi_pins_evk>; +				status = "okay"; +			}; +  			ssp0: ssp@80010000 {  				compatible = "fsl,imx28-mmc";  				pinctrl-names = "default"; @@ -29,6 +36,7 @@  					&mmc0_cd_cfg &mmc0_sck_cfg>;  				bus-width = <8>;  				wp-gpios = <&gpio2 12 0>; +				vmmc-supply = <®_vddio_sd0>;  				status = "okay";  			}; @@ -36,6 +44,72 @@  				compatible = "fsl,imx28-mmc";  				bus-width = <8>;  				wp-gpios = <&gpio0 28 0>; +			}; + +			pinctrl@80018000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&hog_pins_a>; + +				hog_pins_a: hog-gpios@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x20d3 /* MX28_PAD_SSP1_CMD__GPIO_2_13 */ +						0x20f3 /* MX28_PAD_SSP1_DATA3__GPIO_2_15 */ +						0x40d3 /* MX28_PAD_ENET0_RX_CLK__GPIO_4_13 */ +						0x20c3 /* MX28_PAD_SSP1_SCK__GPIO_2_12 */ +						0x31c3 /* MX28_PAD_PWM3__GPIO_3_28 */ +						0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */ +						0x3053 /* MX28_PAD_AUART1_TX__GPIO_3_5 */ +						0x3083 /* MX28_PAD_AUART2_RX__GPIO_3_8 */ +						0x3093 /* MX28_PAD_AUART2_TX__GPIO_3_9 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				gpmi_pins_evk: gpmi-nand-evk@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x0110 /* MX28_PAD_GPMI_CE1N__GPMI_CE1N */ +						0x0150 /* MX28_PAD_GPMI_RDY1__GPMI_READY1 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				lcdif_pins_evk: lcdif-evk@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x1181 /* MX28_PAD_LCD_RD_E__LCD_VSYNC */ +						0x1191 /* MX28_PAD_LCD_WR_RWN__LCD_HSYNC */ +						0x11a1 /* MX28_PAD_LCD_RS__LCD_DOTCLK */ +						0x11b1 /* MX28_PAD_LCD_CS__LCD_ENABLE */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; +			}; + +			lcdif@80030000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&lcdif_24bit_pins_a +					     &lcdif_pins_evk>; +				panel-enable-gpios = <&gpio3 30 0>; +				status = "okay"; +			}; + +			can0: can@80032000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&can0_pins_a>; +				status = "okay"; +			}; + +			can1: can@80034000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&can1_pins_a>;  				status = "okay";  			};  		}; @@ -68,19 +142,58 @@  				};  			}; +			pwm: pwm@80064000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&pwm2_pins_a>; +				status = "okay"; +			}; +  			duart: serial@80074000 {  				pinctrl-names = "default";  				pinctrl-0 = <&duart_pins_a>;  				status = "okay";  			}; + +			auart0: serial@8006a000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart0_pins_a>; +				status = "okay"; +			}; + +			auart3: serial@80070000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart3_pins_a>; +				status = "okay"; +			}; + +			usbphy0: usbphy@8007c000 { +				status = "okay"; +			}; + +			usbphy1: usbphy@8007e000 { +				status = "okay"; +			};  		};  	};  	ahb@80080000 { +		usb0: usb@80080000 { +			vbus-supply = <®_usb0_vbus>; +			status = "okay"; +		}; + +		usb1: usb@80090000 { +			vbus-supply = <®_usb1_vbus>; +			status = "okay"; +		}; +  		mac0: ethernet@800f0000 {  			phy-mode = "rmii";  			pinctrl-names = "default";  			pinctrl-0 = <&mac0_pins_a>; +			phy-supply = <®_fec_3v3>; +			phy-reset-gpios = <&gpio4 13 0>; +			phy-reset-duration = <100>;  			status = "okay";  		}; @@ -102,6 +215,40 @@  			regulator-max-microvolt = <3300000>;  			regulator-always-on;  		}; + +		reg_vddio_sd0: vddio-sd0 { +			compatible = "regulator-fixed"; +			regulator-name = "vddio-sd0"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			gpio = <&gpio3 28 0>; +		}; + +		reg_fec_3v3: fec-3v3 { +			compatible = "regulator-fixed"; +			regulator-name = "fec-3v3"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			gpio = <&gpio2 15 0>; +		}; + +		reg_usb0_vbus: usb0_vbus { +			compatible = "regulator-fixed"; +			regulator-name = "usb0_vbus"; +			regulator-min-microvolt = <5000000>; +			regulator-max-microvolt = <5000000>; +			gpio = <&gpio3 9 0>; +			enable-active-high; +		}; + +		reg_usb1_vbus: usb1_vbus { +			compatible = "regulator-fixed"; +			regulator-name = "usb1_vbus"; +			regulator-min-microvolt = <5000000>; +			regulator-max-microvolt = <5000000>; +			gpio = <&gpio3 8 0>; +			enable-active-high; +		};  	};  	sound { @@ -111,4 +258,21 @@  		saif-controllers = <&saif0 &saif1>;  		audio-codec = <&sgtl5000>;  	}; + +	leds { +		compatible = "gpio-leds"; + +		user { +			label = "Heartbeat"; +			gpios = <&gpio3 5 0>; +			linux,default-trigger = "heartbeat"; +		}; +	}; + +	backlight { +		compatible = "pwm-backlight"; +		pwms = <&pwm 2 5000000>; +		brightness-levels = <0 4 8 16 32 64 128 255>; +		default-brightness-level = <6>; +	};  }; diff --git a/arch/arm/boot/dts/imx28-m28evk.dts b/arch/arm/boot/dts/imx28-m28evk.dts new file mode 100644 index 00000000000..183a3fd2d85 --- /dev/null +++ b/arch/arm/boot/dts/imx28-m28evk.dts @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2012 Marek Vasut <marex@denx.de> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "imx28.dtsi" + +/ { +	model = "DENX M28EVK"; +	compatible = "denx,m28evk", "fsl,imx28"; + +	memory { +		reg = <0x40000000 0x08000000>; +	}; + +	apb@80000000 { +		apbh@80000000 { +			gpmi-nand@8000c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&gpmi_pins_a &gpmi_status_cfg>; +				status = "okay"; + +				partition@0 { +					label = "bootloader"; +					reg = <0x00000000 0x00300000>; +					read-only; +				}; + +				partition@1 { +					label = "environment"; +					reg = <0x00300000 0x00080000>; +				}; + +				partition@2 { +					label = "redundant-environment"; +					reg = <0x00380000 0x00080000>; +				}; + +				partition@3 { +					label = "kernel"; +					reg = <0x00400000 0x00400000>; +				}; + +				partition@4 { +					label = "filesystem"; +					reg = <0x00800000 0x0f800000>; +				}; +			}; + +			ssp0: ssp@80010000 { +				compatible = "fsl,imx28-mmc"; +				pinctrl-names = "default"; +				pinctrl-0 = <&mmc0_8bit_pins_a +					     &mmc0_cd_cfg +					     &mmc0_sck_cfg>; +				bus-width = <8>; +				wp-gpios = <&gpio3 10 1>; +				status = "okay"; +			}; + +			pinctrl@80018000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&hog_pins_a>; + +				hog_pins_a: hog-gpios@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x30a3 /* MX28_PAD_AUART2_CTS__GPIO_3_10 */ +						0x30b3 /* MX28_PAD_AUART2_RTS__GPIO_3_11 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				lcdif_pins_m28: lcdif-m28@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x11e0 /* MX28_PAD_LCD_DOTCLK__LCD_DOTCLK */ +						0x11f0 /* MX28_PAD_LCD_ENABLE__LCD_ENABLE */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; +			}; + +			lcdif@80030000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&lcdif_24bit_pins_a +					     &lcdif_pins_m28>; +				status = "okay"; +			}; + +			can0: can@80032000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&can0_pins_a>; +				status = "okay"; +			}; + +			can1: can@80034000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&can1_pins_a>; +				status = "okay"; +			}; +		}; + +		apbx@80040000 { +			saif0: saif@80042000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&saif0_pins_a>; +				status = "okay"; +			}; + +			saif1: saif@80046000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&saif1_pins_a>; +				fsl,saif-master = <&saif0>; +				status = "okay"; +			}; + +			i2c0: i2c@80058000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&i2c0_pins_a>; +				status = "okay"; + +				sgtl5000: codec@0a { +					compatible = "fsl,sgtl5000"; +					reg = <0x0a>; +					VDDA-supply = <®_3p3v>; +					VDDIO-supply = <®_3p3v>; + +				}; + +				eeprom: eeprom@51 { +					compatible = "atmel,24c128"; +					reg = <0x51>; +					pagesize = <32>; +				}; + +				rtc: rtc@68 { +					compatible = "stm,mt41t62"; +					reg = <0x68>; +				}; +			}; + +			duart: serial@80074000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&duart_pins_a>; +				status = "okay"; +			}; + +			auart0: serial@8006a000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart0_2pins_a>; +				status = "okay"; +			}; + +			auart3: serial@80070000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart3_pins_a>; +				status = "okay"; +			}; +		}; +	}; + +	ahb@80080000 { +		mac0: ethernet@800f0000 { +			phy-mode = "rmii"; +			pinctrl-names = "default"; +			pinctrl-0 = <&mac0_pins_a>; +			phy-reset-gpios = <&gpio3 11 0>; +			status = "okay"; +		}; + +		mac1: ethernet@800f4000 { +			phy-mode = "rmii"; +			pinctrl-names = "default"; +			pinctrl-0 = <&mac1_pins_a>; +			status = "okay"; +		}; +	}; + +	regulators { +		compatible = "simple-bus"; + +		reg_3p3v: 3p3v { +			compatible = "regulator-fixed"; +			regulator-name = "3P3V"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			regulator-always-on; +		}; +	}; + +	sound { +		compatible = "denx,m28evk-sgtl5000", +			     "fsl,mxs-audio-sgtl5000"; +		model = "m28evk-sgtl5000"; +		saif-controllers = <&saif0 &saif1>; +		audio-codec = <&sgtl5000>; +	}; +}; diff --git a/arch/arm/boot/dts/imx28-tx28.dts b/arch/arm/boot/dts/imx28-tx28.dts new file mode 100644 index 00000000000..62bf767409a --- /dev/null +++ b/arch/arm/boot/dts/imx28-tx28.dts @@ -0,0 +1,97 @@ +/dts-v1/; +/include/ "imx28.dtsi" + +/ { +	model = "Ka-Ro electronics TX28 module"; +	compatible = "karo,tx28", "fsl,imx28"; + +	memory { +		reg = <0x40000000 0x08000000>; +	}; + +	apb@80000000 { +		apbh@80000000 { +			ssp0: ssp@80010000 { +				compatible = "fsl,imx28-mmc"; +				pinctrl-names = "default"; +				pinctrl-0 = <&mmc0_4bit_pins_a +					     &mmc0_cd_cfg +					     &mmc0_sck_cfg>; +				bus-width = <4>; +				status = "okay"; +			}; + +			pinctrl@80018000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&hog_pins_a>; + +				hog_pins_a: hog-gpios@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x40a3 /* MX28_PAD_ENET0_RXD3__GPIO_4_10 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; +			}; +		}; + +		apbx@80040000 { +			i2c0: i2c@80058000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&i2c0_pins_a>; +				status = "okay"; + +				ds1339: rtc@68 { +					compatible = "mxim,ds1339"; +					reg = <0x68>; +				}; +			}; + +			pwm: pwm@80064000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&pwm0_pins_a>; +				status = "okay"; +			}; + +			duart: serial@80074000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&duart_4pins_a>; +				status = "okay"; +			}; + +			auart1: serial@8006c000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&auart1_pins_a>; +				status = "okay"; +			}; +		}; +	}; + +	ahb@80080000 { +		mac0: ethernet@800f0000 { +			phy-mode = "rmii"; +			pinctrl-names = "default"; +			pinctrl-0 = <&mac0_pins_a>; +			status = "okay"; +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		user { +			label = "Heartbeat"; +			gpios = <&gpio4 10 0>; +			linux,default-trigger = "heartbeat"; +		}; +	}; + +	backlight { +		compatible = "pwm-backlight"; +		pwms = <&pwm 0 5000000>; +		brightness-levels = <0 4 8 16 32 64 128 255>; +		default-brightness-level = <6>; +	}; +}; diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi index 4634cb861a5..787efac68da 100644 --- a/arch/arm/boot/dts/imx28.dtsi +++ b/arch/arm/boot/dts/imx28.dtsi @@ -22,6 +22,11 @@  		gpio4 = &gpio4;  		saif0 = &saif0;  		saif1 = &saif1; +		serial0 = &auart0; +		serial1 = &auart1; +		serial2 = &auart2; +		serial3 = &auart3; +		serial4 = &auart4;  	};  	cpus { @@ -68,15 +73,15 @@  				status = "disabled";  			}; -			bch@8000a000 { -				reg = <0x8000a000 2000>; -				interrupts = <41>; -				status = "disabled"; -			}; - -			gpmi@8000c000 { -				reg = <0x8000c000 2000>; -				interrupts = <42 88>; +			gpmi-nand@8000c000 { +				compatible = "fsl,imx28-gpmi-nand"; +				#address-cells = <1>; +				#size-cells = <1>; +				reg = <0x8000c000 2000>, <0x8000a000 2000>; +				reg-names = "gpmi-nand", "bch"; +				interrupts = <88>, <41>; +				interrupt-names = "gpmi-dma", "bch"; +				fsl,gpmi-dma-channel = <4>;  				status = "disabled";  			}; @@ -161,7 +166,150 @@  				duart_pins_a: duart@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x3102 0x3112>; +					fsl,pinmux-ids = < +						0x3102 /* MX28_PAD_PWM0__DUART_RX */ +						0x3112 /* MX28_PAD_PWM1__DUART_TX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				duart_pins_b: duart@1 { +					reg = <1>; +					fsl,pinmux-ids = < +						0x3022 /* MX28_PAD_AUART0_CTS__DUART_RX */ +						0x3032 /* MX28_PAD_AUART0_RTS__DUART_TX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				duart_4pins_a: duart-4pins@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x3022 /* MX28_PAD_AUART0_CTS__DUART_RX */ +						0x3032 /* MX28_PAD_AUART0_RTS__DUART_TX */ +						0x3002 /* MX28_PAD_AUART0_RX__DUART_CTS */ +						0x3012 /* MX28_PAD_AUART0_TX__DUART_RTS */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				gpmi_pins_a: gpmi-nand@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x0000 /* MX28_PAD_GPMI_D00__GPMI_D0 */ +						0x0010 /* MX28_PAD_GPMI_D01__GPMI_D1 */ +						0x0020 /* MX28_PAD_GPMI_D02__GPMI_D2 */ +						0x0030 /* MX28_PAD_GPMI_D03__GPMI_D3 */ +						0x0040 /* MX28_PAD_GPMI_D04__GPMI_D4 */ +						0x0050 /* MX28_PAD_GPMI_D05__GPMI_D5 */ +						0x0060 /* MX28_PAD_GPMI_D06__GPMI_D6 */ +						0x0070 /* MX28_PAD_GPMI_D07__GPMI_D7 */ +						0x0100 /* MX28_PAD_GPMI_CE0N__GPMI_CE0N */ +						0x0140 /* MX28_PAD_GPMI_RDY0__GPMI_READY0 */ +						0x0180 /* MX28_PAD_GPMI_RDN__GPMI_RDN */ +						0x0190 /* MX28_PAD_GPMI_WRN__GPMI_WRN */ +						0x01a0 /* MX28_PAD_GPMI_ALE__GPMI_ALE */ +						0x01b0 /* MX28_PAD_GPMI_CLE__GPMI_CLE */ +						0x01c0 /* MX28_PAD_GPMI_RESETN__GPMI_RESETN */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				gpmi_status_cfg: gpmi-status-cfg { +					fsl,pinmux-ids = < +						0x0180 /* MX28_PAD_GPMI_RDN__GPMI_RDN */ +						0x0190 /* MX28_PAD_GPMI_WRN__GPMI_WRN */ +						0x01c0 /* MX28_PAD_GPMI_RESETN__GPMI_RESETN */ +					>; +					fsl,drive-strength = <2>; +				}; + +				auart0_pins_a: auart0@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x3000 /* MX28_PAD_AUART0_RX__AUART0_RX */ +						0x3010 /* MX28_PAD_AUART0_TX__AUART0_TX */ +						0x3020 /* MX28_PAD_AUART0_CTS__AUART0_CTS */ +						0x3030 /* MX28_PAD_AUART0_RTS__AUART0_RTS */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				auart0_2pins_a: auart0-2pins@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x3000 /* MX28_PAD_AUART0_RX__AUART0_RX */ +						0x3010 /* MX28_PAD_AUART0_TX__AUART0_TX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				auart1_pins_a: auart1@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x3040 /* MX28_PAD_AUART1_RX__AUART1_RX */ +						0x3050 /* MX28_PAD_AUART1_TX__AUART1_TX */ +						0x3060 /* MX28_PAD_AUART1_CTS__AUART1_CTS */ +						0x3070 /* MX28_PAD_AUART1_RTS__AUART1_RTS */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				auart1_2pins_a: auart1-2pins@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x3040 /* MX28_PAD_AUART1_RX__AUART1_RX */ +						0x3050 /* MX28_PAD_AUART1_TX__AUART1_TX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				auart2_2pins_a: auart2-2pins@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x2101 /* MX28_PAD_SSP2_SCK__AUART2_RX */ +						0x2111 /* MX28_PAD_SSP2_MOSI__AUART2_TX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				auart3_pins_a: auart3@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x30c0 /* MX28_PAD_AUART3_RX__AUART3_RX */ +						0x30d0 /* MX28_PAD_AUART3_TX__AUART3_TX */ +						0x30e0 /* MX28_PAD_AUART3_CTS__AUART3_CTS */ +						0x30f0 /* MX28_PAD_AUART3_RTS__AUART3_RTS */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				auart3_2pins_a: auart3-2pins@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x2121 /* MX28_PAD_SSP2_MISO__AUART3_RX */ +						0x2131 /* MX28_PAD_SSP2_SS0__AUART3_TX */ +					>;  					fsl,drive-strength = <0>;  					fsl,voltage = <1>;  					fsl,pull-up = <0>; @@ -169,9 +317,17 @@  				mac0_pins_a: mac0@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x4000 0x4010 0x4020 -						0x4030 0x4040 0x4060 0x4070 -						0x4080 0x4100>; +					fsl,pinmux-ids = < +						0x4000 /* MX28_PAD_ENET0_MDC__ENET0_MDC */ +						0x4010 /* MX28_PAD_ENET0_MDIO__ENET0_MDIO */ +						0x4020 /* MX28_PAD_ENET0_RX_EN__ENET0_RX_EN */ +						0x4030 /* MX28_PAD_ENET0_RXD0__ENET0_RXD0 */ +						0x4040 /* MX28_PAD_ENET0_RXD1__ENET0_RXD1 */ +						0x4060 /* MX28_PAD_ENET0_TX_EN__ENET0_TX_EN */ +						0x4070 /* MX28_PAD_ENET0_TXD0__ENET0_TXD0 */ +						0x4080 /* MX28_PAD_ENET0_TXD1__ENET0_TXD1 */ +						0x4100 /* MX28_PAD_ENET_CLK__CLKCTRL_ENET */ +					>;  					fsl,drive-strength = <1>;  					fsl,voltage = <1>;  					fsl,pull-up = <1>; @@ -179,8 +335,14 @@  				mac1_pins_a: mac1@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x40f1 0x4091 0x40a1 -						0x40e1 0x40b1 0x40c1>; +					fsl,pinmux-ids = < +						0x40f1 /* MX28_PAD_ENET0_CRS__ENET1_RX_EN */ +						0x4091 /* MX28_PAD_ENET0_RXD2__ENET1_RXD0 */ +						0x40a1 /* MX28_PAD_ENET0_RXD3__ENET1_RXD1 */ +						0x40e1 /* MX28_PAD_ENET0_COL__ENET1_TX_EN */ +						0x40b1 /* MX28_PAD_ENET0_TXD2__ENET1_TXD0 */ +						0x40c1 /* MX28_PAD_ENET0_TXD3__ENET1_TXD1 */ +					>;  					fsl,drive-strength = <1>;  					fsl,voltage = <1>;  					fsl,pull-up = <1>; @@ -188,28 +350,61 @@  				mmc0_8bit_pins_a: mmc0-8bit@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x2000 0x2010 0x2020 -						0x2030 0x2040 0x2050 0x2060 -						0x2070 0x2080 0x2090 0x20a0>; +					fsl,pinmux-ids = < +						0x2000 /* MX28_PAD_SSP0_DATA0__SSP0_D0 */ +						0x2010 /* MX28_PAD_SSP0_DATA1__SSP0_D1 */ +						0x2020 /* MX28_PAD_SSP0_DATA2__SSP0_D2 */ +						0x2030 /* MX28_PAD_SSP0_DATA3__SSP0_D3 */ +						0x2040 /* MX28_PAD_SSP0_DATA4__SSP0_D4 */ +						0x2050 /* MX28_PAD_SSP0_DATA5__SSP0_D5 */ +						0x2060 /* MX28_PAD_SSP0_DATA6__SSP0_D6 */ +						0x2070 /* MX28_PAD_SSP0_DATA7__SSP0_D7 */ +						0x2080 /* MX28_PAD_SSP0_CMD__SSP0_CMD */ +						0x2090 /* MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT */ +						0x20a0 /* MX28_PAD_SSP0_SCK__SSP0_SCK */ +					>; +					fsl,drive-strength = <1>; +					fsl,voltage = <1>; +					fsl,pull-up = <1>; +				}; + +				mmc0_4bit_pins_a: mmc0-4bit@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x2000 /* MX28_PAD_SSP0_DATA0__SSP0_D0 */ +						0x2010 /* MX28_PAD_SSP0_DATA1__SSP0_D1 */ +						0x2020 /* MX28_PAD_SSP0_DATA2__SSP0_D2 */ +						0x2030 /* MX28_PAD_SSP0_DATA3__SSP0_D3 */ +						0x2080 /* MX28_PAD_SSP0_CMD__SSP0_CMD */ +						0x2090 /* MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT */ +						0x20a0 /* MX28_PAD_SSP0_SCK__SSP0_SCK */ +					>;  					fsl,drive-strength = <1>;  					fsl,voltage = <1>;  					fsl,pull-up = <1>;  				};  				mmc0_cd_cfg: mmc0-cd-cfg { -					fsl,pinmux-ids = <0x2090>; +					fsl,pinmux-ids = < +						0x2090 /* MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT */ +					>;  					fsl,pull-up = <0>;  				};  				mmc0_sck_cfg: mmc0-sck-cfg { -					fsl,pinmux-ids = <0x20a0>; +					fsl,pinmux-ids = < +						0x20a0 /* MX28_PAD_SSP0_SCK__SSP0_SCK */ +					>;  					fsl,drive-strength = <2>;  					fsl,pull-up = <0>;  				};  				i2c0_pins_a: i2c0@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x3180 0x3190>; +					fsl,pinmux-ids = < +						0x3180 /* MX28_PAD_I2C0_SCL__I2C0_SCL */ +						0x3190 /* MX28_PAD_I2C0_SDA__I2C0_SDA */ +					>;  					fsl,drive-strength = <1>;  					fsl,voltage = <1>;  					fsl,pull-up = <1>; @@ -217,8 +412,12 @@  				saif0_pins_a: saif0@0 {  					reg = <0>; -					fsl,pinmux-ids = -						<0x3140 0x3150 0x3160 0x3170>; +					fsl,pinmux-ids = < +						0x3140 /* MX28_PAD_SAIF0_MCLK__SAIF0_MCLK */ +						0x3150 /* MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK */ +						0x3160 /* MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK */ +						0x3170 /* MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 */ +					>;  					fsl,drive-strength = <2>;  					fsl,voltage = <1>;  					fsl,pull-up = <1>; @@ -226,11 +425,88 @@  				saif1_pins_a: saif1@0 {  					reg = <0>; -					fsl,pinmux-ids = <0x31a0>; +					fsl,pinmux-ids = < +						0x31a0 /* MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0 */ +					>;  					fsl,drive-strength = <2>;  					fsl,voltage = <1>;  					fsl,pull-up = <1>;  				}; + +				pwm0_pins_a: pwm0@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x3100 /* MX28_PAD_PWM0__PWM_0 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				pwm2_pins_a: pwm2@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x3120 /* MX28_PAD_PWM2__PWM_2 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				lcdif_24bit_pins_a: lcdif-24bit@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x1000 /* MX28_PAD_LCD_D00__LCD_D0 */ +						0x1010 /* MX28_PAD_LCD_D01__LCD_D1 */ +						0x1020 /* MX28_PAD_LCD_D02__LCD_D2 */ +						0x1030 /* MX28_PAD_LCD_D03__LCD_D3 */ +						0x1040 /* MX28_PAD_LCD_D04__LCD_D4 */ +						0x1050 /* MX28_PAD_LCD_D05__LCD_D5 */ +						0x1060 /* MX28_PAD_LCD_D06__LCD_D6 */ +						0x1070 /* MX28_PAD_LCD_D07__LCD_D7 */ +						0x1080 /* MX28_PAD_LCD_D08__LCD_D8 */ +						0x1090 /* MX28_PAD_LCD_D09__LCD_D9 */ +						0x10a0 /* MX28_PAD_LCD_D10__LCD_D10 */ +						0x10b0 /* MX28_PAD_LCD_D11__LCD_D11 */ +						0x10c0 /* MX28_PAD_LCD_D12__LCD_D12 */ +						0x10d0 /* MX28_PAD_LCD_D13__LCD_D13 */ +						0x10e0 /* MX28_PAD_LCD_D14__LCD_D14 */ +						0x10f0 /* MX28_PAD_LCD_D15__LCD_D15 */ +						0x1100 /* MX28_PAD_LCD_D16__LCD_D16 */ +						0x1110 /* MX28_PAD_LCD_D17__LCD_D17 */ +						0x1120 /* MX28_PAD_LCD_D18__LCD_D18 */ +						0x1130 /* MX28_PAD_LCD_D19__LCD_D19 */ +						0x1140 /* MX28_PAD_LCD_D20__LCD_D20 */ +						0x1150 /* MX28_PAD_LCD_D21__LCD_D21 */ +						0x1160 /* MX28_PAD_LCD_D22__LCD_D22 */ +						0x1170 /* MX28_PAD_LCD_D23__LCD_D23 */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				can0_pins_a: can0@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x0161 /* MX28_PAD_GPMI_RDY2__CAN0_TX */ +						0x0171 /* MX28_PAD_GPMI_RDY3__CAN0_RX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				}; + +				can1_pins_a: can1@0 { +					reg = <0>; +					fsl,pinmux-ids = < +						0x0121 /* MX28_PAD_GPMI_CE2N__CAN1_TX */ +						0x0131 /* MX28_PAD_GPMI_CE3N__CAN1_RX */ +					>; +					fsl,drive-strength = <0>; +					fsl,voltage = <1>; +					fsl,pull-up = <0>; +				};  			};  			digctl@8001c000 { @@ -272,18 +548,21 @@  			};  			lcdif@80030000 { +				compatible = "fsl,imx28-lcdif";  				reg = <0x80030000 2000>;  				interrupts = <38 86>;  				status = "disabled";  			};  			can0: can@80032000 { +				compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";  				reg = <0x80032000 2000>;  				interrupts = <8>;  				status = "disabled";  			};  			can1: can@80034000 { +				compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";  				reg = <0x80034000 2000>;  				interrupts = <9>;  				status = "disabled"; @@ -370,9 +649,9 @@  			};  			rtc@80056000 { +				compatible = "fsl,imx28-rtc", "fsl,stmp3xxx-rtc";  				reg = <0x80056000 2000>; -				interrupts = <28 29>; -				status = "disabled"; +				interrupts = <29>;  			};  			i2c0: i2c@80058000 { @@ -381,6 +660,7 @@  				compatible = "fsl,imx28-i2c";  				reg = <0x80058000 2000>;  				interrupts = <111 68>; +				clock-frequency = <100000>;  				status = "disabled";  			}; @@ -390,11 +670,15 @@  				compatible = "fsl,imx28-i2c";  				reg = <0x8005a000 2000>;  				interrupts = <110 69>; +				clock-frequency = <100000>;  				status = "disabled";  			}; -			pwm@80064000 { +			pwm: pwm@80064000 { +				compatible = "fsl,imx28-pwm", "fsl,imx23-pwm";  				reg = <0x80064000 2000>; +				#pwm-cells = <2>; +				fsl,pwm-number = <8>;  				status = "disabled";  			}; @@ -404,30 +688,35 @@  			};  			auart0: serial@8006a000 { +				compatible = "fsl,imx28-auart", "fsl,imx23-auart";  				reg = <0x8006a000 0x2000>;  				interrupts = <112 70 71>;  				status = "disabled";  			};  			auart1: serial@8006c000 { +				compatible = "fsl,imx28-auart", "fsl,imx23-auart";  				reg = <0x8006c000 0x2000>;  				interrupts = <113 72 73>;  				status = "disabled";  			};  			auart2: serial@8006e000 { +				compatible = "fsl,imx28-auart", "fsl,imx23-auart";  				reg = <0x8006e000 0x2000>;  				interrupts = <114 74 75>;  				status = "disabled";  			};  			auart3: serial@80070000 { +				compatible = "fsl,imx28-auart", "fsl,imx23-auart";  				reg = <0x80070000 0x2000>;  				interrupts = <115 76 77>;  				status = "disabled";  			};  			auart4: serial@80072000 { +				compatible = "fsl,imx28-auart", "fsl,imx23-auart";  				reg = <0x80072000 0x2000>;  				interrupts = <116 78 79>;  				status = "disabled"; @@ -441,11 +730,13 @@  			};  			usbphy0: usbphy@8007c000 { +				compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy";  				reg = <0x8007c000 0x2000>;  				status = "disabled";  			};  			usbphy1: usbphy@8007e000 { +				compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy";  				reg = <0x8007e000 0x2000>;  				status = "disabled";  			}; @@ -459,13 +750,19 @@  		reg = <0x80080000 0x80000>;  		ranges; -		usbctrl0: usbctrl@80080000 { +		usb0: usb@80080000 { +			compatible = "fsl,imx28-usb", "fsl,imx27-usb";  			reg = <0x80080000 0x10000>; +			interrupts = <93>; +			fsl,usbphy = <&usbphy0>;  			status = "disabled";  		}; -		usbctrl1: usbctrl@80090000 { +		usb1: usb@80090000 { +			compatible = "fsl,imx28-usb", "fsl,imx27-usb";  			reg = <0x80090000 0x10000>; +			interrupts = <92>; +			fsl,usbphy = <&usbphy1>;  			status = "disabled";  		}; diff --git a/arch/arm/boot/dts/imx31-bug.dts b/arch/arm/boot/dts/imx31-bug.dts new file mode 100644 index 00000000000..24731cb78e8 --- /dev/null +++ b/arch/arm/boot/dts/imx31-bug.dts @@ -0,0 +1,31 @@ +/* + * Copyright 2012 Denis 'GNUtoo' Carikli <GNUtoo@no-log.org> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "imx31.dtsi" + +/ { +	model = "Buglabs i.MX31 Bug 1.x"; +	compatible = "fsl,imx31-bug", "fsl,imx31"; + +	memory { +		reg = <0x80000000 0x8000000>; /* 128M */ +	}; + +	soc { +		aips@43f00000 { /* AIPS1 */ +			uart5: serial@43fb4000 { +				fsl,uart-has-rtscts; +				status = "okay"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx31.dtsi b/arch/arm/boot/dts/imx31.dtsi new file mode 100644 index 00000000000..eef7099f3e3 --- /dev/null +++ b/arch/arm/boot/dts/imx31.dtsi @@ -0,0 +1,88 @@ +/* + * Copyright 2012 Denis 'GNUtoo' Carikli <GNUtoo@no-log.org> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/include/ "skeleton.dtsi" + +/ { +	aliases { +		serial0 = &uart1; +		serial1 = &uart2; +		serial2 = &uart3; +		serial3 = &uart4; +		serial4 = &uart5; +	}; + +	avic: avic-interrupt-controller@60000000 { +		compatible = "fsl,imx31-avic", "fsl,avic"; +		interrupt-controller; +		#interrupt-cells = <1>; +		reg = <0x60000000 0x100000>; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&avic>; +		ranges; + +		aips@43f00000 { /* AIPS1 */ +			compatible = "fsl,aips-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x43f00000 0x100000>; +			ranges; + +			uart1: serial@43f90000 { +				compatible = "fsl,imx31-uart", "fsl,imx21-uart"; +				reg = <0x43f90000 0x4000>; +				interrupts = <45>; +				status = "disabled"; +			}; + +			uart2: serial@43f94000 { +				compatible = "fsl,imx31-uart", "fsl,imx21-uart"; +				reg = <0x43f94000 0x4000>; +				interrupts = <32>; +				status = "disabled"; +			}; + +			uart4: serial@43fb0000 { +				compatible = "fsl,imx31-uart", "fsl,imx21-uart"; +				reg = <0x43fb0000 0x4000>; +				interrupts = <46>; +				status = "disabled"; +			}; + +			uart5: serial@43fb4000 { +				compatible = "fsl,imx31-uart", "fsl,imx21-uart"; +				reg = <0x43fb4000 0x4000>; +				interrupts = <47>; +				status = "disabled"; +			}; +		}; + +		spba@50000000 { +			compatible = "fsl,spba-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x50000000 0x100000>; +			ranges; + +			uart3: serial@5000c000 { +				compatible = "fsl,imx31-uart", "fsl,imx21-uart"; +				reg = <0x5000c000 0x4000>; +				interrupts = <18>; +				status = "disabled"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi index bfa65abe8ef..53cbaa3d4f9 100644 --- a/arch/arm/boot/dts/imx51.dtsi +++ b/arch/arm/boot/dts/imx51.dtsi @@ -127,43 +127,43 @@  			};  			gpio1: gpio@73f84000 { -				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx51-gpio", "fsl,imx35-gpio";  				reg = <0x73f84000 0x4000>;  				interrupts = <50 51>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio2: gpio@73f88000 { -				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx51-gpio", "fsl,imx35-gpio";  				reg = <0x73f88000 0x4000>;  				interrupts = <52 53>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio3: gpio@73f8c000 { -				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx51-gpio", "fsl,imx35-gpio";  				reg = <0x73f8c000 0x4000>;  				interrupts = <54 55>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio4: gpio@73f90000 { -				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx51-gpio", "fsl,imx35-gpio";  				reg = <0x73f90000 0x4000>;  				interrupts = <56 57>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			wdog@73f98000 { /* WDOG1 */ diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index e3e869470cd..fc79cdc4b4e 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi @@ -129,43 +129,43 @@  			};  			gpio1: gpio@53f84000 { -				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53f84000 0x4000>;  				interrupts = <50 51>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio2: gpio@53f88000 { -				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53f88000 0x4000>;  				interrupts = <52 53>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio3: gpio@53f8c000 { -				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53f8c000 0x4000>;  				interrupts = <54 55>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio4: gpio@53f90000 { -				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53f90000 0x4000>;  				interrupts = <56 57>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			wdog@53f98000 { /* WDOG1 */ @@ -197,33 +197,33 @@  			};  			gpio5: gpio@53fdc000 { -				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53fdc000 0x4000>;  				interrupts = <103 104>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio6: gpio@53fe0000 { -				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53fe0000 0x4000>;  				interrupts = <105 106>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio7: gpio@53fe4000 { -				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53fe4000 0x4000>;  				interrupts = <107 108>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			i2c@53fec000 { /* I2C3 */ diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts index db4c6096c56..d792581672c 100644 --- a/arch/arm/boot/dts/imx6q-arm2.dts +++ b/arch/arm/boot/dts/imx6q-arm2.dts @@ -22,6 +22,12 @@  	};  	soc { +		gpmi-nand@00112000 { +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_gpmi_nand_1>; +			status = "disabled"; /* gpmi nand conflicts with SD */ +		}; +  		aips-bus@02100000 { /* AIPS2 */  			ethernet@02188000 {  				phy-mode = "rgmii"; diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts index e0ec92973e7..d42e851ceb9 100644 --- a/arch/arm/boot/dts/imx6q-sabrelite.dts +++ b/arch/arm/boot/dts/imx6q-sabrelite.dts @@ -27,6 +27,8 @@  				ecspi@02008000 { /* eCSPI1 */  					fsl,spi-num-chipselects = <1>;  					cs-gpios = <&gpio3 19 0>; +					pinctrl-names = "default"; +					pinctrl-0 = <&pinctrl_ecspi1_1>;  					status = "okay";  					flash: m25p80@0 { @@ -42,9 +44,31 @@  				};  			}; +			iomuxc@020e0000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_gpio_hog>; + +				gpios { +					pinctrl_gpio_hog: gpiohog { +						fsl,pins = < +							   144  0x80000000	/* MX6Q_PAD_EIM_D22__GPIO_3_22 */ +							   121  0x80000000	/* MX6Q_PAD_EIM_D19__GPIO_3_19 */ +							   >; +					}; +				}; +			};  		};  		aips-bus@02100000 { /* AIPS2 */ +			usb@02184000 { /* USB OTG */ +				vbus-supply = <®_usb_otg_vbus>; +				status = "okay"; +			}; + +			usb@02184200 { /* USB1 */ +				status = "okay"; +			}; +  			ethernet@02188000 {  				phy-mode = "rgmii";  				phy-reset-gpios = <&gpio3 23 0>; @@ -111,6 +135,15 @@  			regulator-max-microvolt = <3300000>;  			regulator-always-on;  		}; + +		reg_usb_otg_vbus: usb_otg_vbus { +			compatible = "regulator-fixed"; +			regulator-name = "usb_otg_vbus"; +			regulator-min-microvolt = <5000000>; +			regulator-max-microvolt = <5000000>; +			gpio = <&gpio3 22 0>; +			enable-active-high; +		};  	};  	sound { diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi index 8c90cbac945..3d3c64b014e 100644 --- a/arch/arm/boot/dts/imx6q.dtsi +++ b/arch/arm/boot/dts/imx6q.dtsi @@ -87,6 +87,23 @@  		interrupt-parent = <&intc>;  		ranges; +		dma-apbh@00110000 { +			compatible = "fsl,imx6q-dma-apbh", "fsl,imx28-dma-apbh"; +			reg = <0x00110000 0x2000>; +		}; + +		gpmi-nand@00112000 { +		       compatible = "fsl,imx6q-gpmi-nand"; +		       #address-cells = <1>; +		       #size-cells = <1>; +		       reg = <0x00112000 0x2000>, <0x00114000 0x2000>; +		       reg-names = "gpmi-nand", "bch"; +		       interrupts = <0 13 0x04>, <0 15 0x04>; +		       interrupt-names = "gpmi-dma", "bch"; +		       fsl,gpmi-dma-channel = <0>; +		       status = "disabled"; +		}; +  		timer@00a00600 {  			compatible = "arm,cortex-a9-twd-timer";  			reg = <0x00a00600 0x20>; @@ -260,73 +277,73 @@  			};  			gpio1: gpio@0209c000 { -				compatible = "fsl,imx6q-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";  				reg = <0x0209c000 0x4000>;  				interrupts = <0 66 0x04 0 67 0x04>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio2: gpio@020a0000 { -				compatible = "fsl,imx6q-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";  				reg = <0x020a0000 0x4000>;  				interrupts = <0 68 0x04 0 69 0x04>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio3: gpio@020a4000 { -				compatible = "fsl,imx6q-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";  				reg = <0x020a4000 0x4000>;  				interrupts = <0 70 0x04 0 71 0x04>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio4: gpio@020a8000 { -				compatible = "fsl,imx6q-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";  				reg = <0x020a8000 0x4000>;  				interrupts = <0 72 0x04 0 73 0x04>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio5: gpio@020ac000 { -				compatible = "fsl,imx6q-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";  				reg = <0x020ac000 0x4000>;  				interrupts = <0 74 0x04 0 75 0x04>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio6: gpio@020b0000 { -				compatible = "fsl,imx6q-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";  				reg = <0x020b0000 0x4000>;  				interrupts = <0 76 0x04 0 77 0x04>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			gpio7: gpio@020b4000 { -				compatible = "fsl,imx6q-gpio", "fsl,imx31-gpio"; +				compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";  				reg = <0x020b4000 0x4000>;  				interrupts = <0 78 0x04 0 79 0x04>;  				gpio-controller;  				#gpio-cells = <2>;  				interrupt-controller; -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  			};  			kpp@020b8000 { @@ -444,12 +461,14 @@  				};  			}; -			usbphy@020c9000 { /* USBPHY1 */ +			usbphy1: usbphy@020c9000 { +				compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";  				reg = <0x020c9000 0x1000>;  				interrupts = <0 44 0x04>;  			}; -			usbphy@020ca000 { /* USBPHY2 */ +			usbphy2: usbphy@020ca000 { +				compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";  				reg = <0x020ca000 0x1000>;  				interrupts = <0 45 0x04>;  			}; @@ -495,6 +514,30 @@  					};  				}; +				gpmi-nand { +					pinctrl_gpmi_nand_1: gpmi-nand-1 { +						fsl,pins = <1328 0xb0b1		/* MX6Q_PAD_NANDF_CLE__RAWNAND_CLE */ +							    1336 0xb0b1		/* MX6Q_PAD_NANDF_ALE__RAWNAND_ALE */ +							    1344 0xb0b1		/* MX6Q_PAD_NANDF_WP_B__RAWNAND_RESETN */ +							    1352 0xb000		/* MX6Q_PAD_NANDF_RB0__RAWNAND_READY0 */ +							    1360 0xb0b1		/* MX6Q_PAD_NANDF_CS0__RAWNAND_CE0N */ +							    1365 0xb0b1		/* MX6Q_PAD_NANDF_CS1__RAWNAND_CE1N */ +							    1371 0xb0b1		/* MX6Q_PAD_NANDF_CS2__RAWNAND_CE2N */ +							    1378 0xb0b1		/* MX6Q_PAD_NANDF_CS3__RAWNAND_CE3N */ +							    1387 0xb0b1		/* MX6Q_PAD_SD4_CMD__RAWNAND_RDN */ +							    1393 0xb0b1		/* MX6Q_PAD_SD4_CLK__RAWNAND_WRN */ +							    1397 0xb0b1		/* MX6Q_PAD_NANDF_D0__RAWNAND_D0 */ +							    1405 0xb0b1		/* MX6Q_PAD_NANDF_D1__RAWNAND_D1 */ +							    1413 0xb0b1		/* MX6Q_PAD_NANDF_D2__RAWNAND_D2 */ +							    1421 0xb0b1		/* MX6Q_PAD_NANDF_D3__RAWNAND_D3 */ +							    1429 0xb0b1		/* MX6Q_PAD_NANDF_D4__RAWNAND_D4 */ +							    1437 0xb0b1		/* MX6Q_PAD_NANDF_D5__RAWNAND_D5 */ +							    1445 0xb0b1		/* MX6Q_PAD_NANDF_D6__RAWNAND_D6 */ +							    1453 0xb0b1		/* MX6Q_PAD_NANDF_D7__RAWNAND_D7 */ +							    1463 0x00b1>;	/* MX6Q_PAD_SD4_DAT0__RAWNAND_DQS */ +					}; +				}; +  				i2c1 {  					pinctrl_i2c1_1: i2c1grp-1 {  						fsl,pins = <137 0x4001b8b1	/* MX6Q_PAD_EIM_D21__I2C1_SCL */ @@ -538,6 +581,14 @@  							    1517 0x17059>;	/* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */  					};  				}; + +				ecspi1 { +					pinctrl_ecspi1_1: ecspi1grp-1 { +						fsl,pins = <101 0x100b1		/* MX6Q_PAD_EIM_D17__ECSPI1_MISO */ +							    109 0x100b1		/* MX6Q_PAD_EIM_D18__ECSPI1_MOSI */ +							    94  0x100b1>;	/* MX6Q_PAD_EIM_D16__ECSPI1_SCLK */ +					}; +				};  			};  			dcic@020e4000 { /* DCIC1 */ @@ -573,6 +624,36 @@  				reg = <0x0217c000 0x4000>;  			}; +			usb@02184000 { /* USB OTG */ +				compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; +				reg = <0x02184000 0x200>; +				interrupts = <0 43 0x04>; +				fsl,usbphy = <&usbphy1>; +				status = "disabled"; +			}; + +			usb@02184200 { /* USB1 */ +				compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; +				reg = <0x02184200 0x200>; +				interrupts = <0 40 0x04>; +				fsl,usbphy = <&usbphy2>; +				status = "disabled"; +			}; + +			usb@02184400 { /* USB2 */ +				compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; +				reg = <0x02184400 0x200>; +				interrupts = <0 41 0x04>; +				status = "disabled"; +			}; + +			usb@02184600 { /* USB3 */ +				compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; +				reg = <0x02184600 0x200>; +				interrupts = <0 42 0x04>; +				status = "disabled"; +			}; +  			ethernet@02188000 {  				compatible = "fsl,imx6q-fec";  				reg = <0x02188000 0x4000>; diff --git a/arch/arm/boot/dts/kirkwood-dns320.dts b/arch/arm/boot/dts/kirkwood-dns320.dts index dc09a735b04..9a33077130e 100644 --- a/arch/arm/boot/dts/kirkwood-dns320.dts +++ b/arch/arm/boot/dts/kirkwood-dns320.dts @@ -4,7 +4,7 @@  / {  	model = "D-Link DNS-320 NAS (Rev A1)"; -	compatible = "dlink,dns-320-a1", "dlink,dns-320", "dlink,dns-kirkwood", "mrvl,kirkwood-88f6281", "mrvl,kirkwood"; +	compatible = "dlink,dns-320-a1", "dlink,dns-320", "dlink,dns-kirkwood", "marvell,kirkwood-88f6281", "marvell,kirkwood";  	memory {  		device_type = "memory"; diff --git a/arch/arm/boot/dts/kirkwood-dns325.dts b/arch/arm/boot/dts/kirkwood-dns325.dts index c2a5562525d..16734c1b5df 100644 --- a/arch/arm/boot/dts/kirkwood-dns325.dts +++ b/arch/arm/boot/dts/kirkwood-dns325.dts @@ -4,7 +4,7 @@  / {  	model = "D-Link DNS-325 NAS (Rev A1)"; -	compatible = "dlink,dns-325-a1", "dlink,dns-325", "dlink,dns-kirkwood", "mrvl,kirkwood-88f6281", "mrvl,kirkwood"; +	compatible = "dlink,dns-325-a1", "dlink,dns-325", "dlink,dns-kirkwood", "marvell,kirkwood-88f6281", "marvell,kirkwood";  	memory {  		device_type = "memory"; diff --git a/arch/arm/boot/dts/kirkwood-dreamplug.dts b/arch/arm/boot/dts/kirkwood-dreamplug.dts index a5376b84227..78b0f06a09a 100644 --- a/arch/arm/boot/dts/kirkwood-dreamplug.dts +++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts @@ -4,7 +4,7 @@  / {  	model = "Globalscale Technologies Dreamplug"; -	compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "mrvl,kirkwood-88f6281", "mrvl,kirkwood"; +	compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "marvell,kirkwood-88f6281", "marvell,kirkwood";  	memory {  		device_type = "memory"; diff --git a/arch/arm/boot/dts/kirkwood-ib62x0.dts b/arch/arm/boot/dts/kirkwood-ib62x0.dts index ada0f0c2308..f59dcf6dc45 100644 --- a/arch/arm/boot/dts/kirkwood-ib62x0.dts +++ b/arch/arm/boot/dts/kirkwood-ib62x0.dts @@ -4,7 +4,7 @@  / {  	model = "RaidSonic ICY BOX IB-NAS62x0 (Rev B)"; -	compatible = "raidsonic,ib-nas6210-b", "raidsonic,ib-nas6220-b", "raidsonic,ib-nas6210", "raidsonic,ib-nas6220", "raidsonic,ib-nas62x0",  "mrvl,kirkwood-88f6281", "mrvl,kirkwood"; +	compatible = "raidsonic,ib-nas6210-b", "raidsonic,ib-nas6220-b", "raidsonic,ib-nas6210", "raidsonic,ib-nas6220", "raidsonic,ib-nas62x0",  "marvell,kirkwood-88f6281", "marvell,kirkwood";  	memory {  		device_type = "memory"; diff --git a/arch/arm/boot/dts/kirkwood-iconnect.dts b/arch/arm/boot/dts/kirkwood-iconnect.dts index 1ba75d4adec..026a1f82d81 100644 --- a/arch/arm/boot/dts/kirkwood-iconnect.dts +++ b/arch/arm/boot/dts/kirkwood-iconnect.dts @@ -4,7 +4,7 @@  / {  	model = "Iomega Iconnect"; -	compatible = "iom,iconnect-1.1", "iom,iconnect", "mrvl,kirkwood-88f6281", "mrvl,kirkwood"; +	compatible = "iom,iconnect-1.1", "iom,iconnect", "marvell,kirkwood-88f6281", "marvell,kirkwood";  	memory {  		device_type = "memory"; diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi index 926528b81ba..f95dbc190ab 100644 --- a/arch/arm/boot/dts/kirkwood.dtsi +++ b/arch/arm/boot/dts/kirkwood.dtsi @@ -1,7 +1,7 @@  /include/ "skeleton.dtsi"  / { -	compatible = "mrvl,kirkwood"; +	compatible = "marvell,kirkwood";  	ocp@f1000000 {  		compatible = "simple-bus"; @@ -28,7 +28,7 @@  		};  		rtc@10300 { -			compatible = "mrvl,kirkwood-rtc", "mrvl,orion-rtc"; +			compatible = "marvell,kirkwood-rtc", "marvell,orion-rtc";  			reg = <0x10300 0x20>;  			interrupts = <53>;  		}; @@ -39,7 +39,7 @@  			cle = <0>;  			ale = <1>;  			bank-width = <1>; -			compatible = "mrvl,orion-nand"; +			compatible = "marvell,orion-nand";  			reg = <0x3000000 0x400>;  			chip-delay = <25>;  			/* set partition map and/or chip-delay in board dts */ diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi index 3f5dad801a9..e5ffe960dbf 100644 --- a/arch/arm/boot/dts/lpc32xx.dtsi +++ b/arch/arm/boot/dts/lpc32xx.dtsi @@ -35,13 +35,14 @@  		slc: flash@20020000 {  			compatible = "nxp,lpc3220-slc";  			reg = <0x20020000 0x1000>; -			status = "disable"; +			status = "disabled";  		}; -		mlc: flash@200B0000 { +		mlc: flash@200a8000 {  			compatible = "nxp,lpc3220-mlc"; -			reg = <0x200B0000 0x1000>; -			status = "disable"; +			reg = <0x200a8000 0x11000>; +			interrupts = <11 0>; +			status = "disabled";  		};  		dma@31000000 { @@ -57,21 +58,21 @@  			compatible = "nxp,ohci-nxp", "usb-ohci";  			reg = <0x31020000 0x300>;  			interrupts = <0x3b 0>; -			status = "disable"; +			status = "disabled";  		};  		usbd@31020000 {  			compatible = "nxp,lpc3220-udc";  			reg = <0x31020000 0x300>;  			interrupts = <0x3d 0>, <0x3e 0>, <0x3c 0>, <0x3a 0>; -			status = "disable"; +			status = "disabled";  		};  		clcd@31040000 {  			compatible = "arm,pl110", "arm,primecell";  			reg = <0x31040000 0x1000>;  			interrupts = <0x0e 0>; -			status = "disable"; +			status = "disabled";  		};  		mac: ethernet@31060000 { @@ -114,9 +115,10 @@  			};  			sd@20098000 { -				compatible = "arm,pl180", "arm,primecell"; +				compatible = "arm,pl18x", "arm,primecell";  				reg = <0x20098000 0x1000>;  				interrupts = <0x0f 0>, <0x0d 0>; +				status = "disabled";  			};  			i2s1: i2s@2009C000 { @@ -124,24 +126,42 @@  				reg = <0x2009C000 0x1000>;  			}; +			/* UART5 first since it is the default console, ttyS0 */ +			uart5: serial@40090000 { +				/* actually, ns16550a w/ 64 byte fifos! */ +				compatible = "nxp,lpc3220-uart"; +				reg = <0x40090000 0x1000>; +				interrupts = <9 0>; +				clock-frequency = <13000000>; +				reg-shift = <2>; +				status = "disabled"; +			}; +  			uart3: serial@40080000 { -				compatible = "nxp,serial"; +				compatible = "nxp,lpc3220-uart";  				reg = <0x40080000 0x1000>; +				interrupts = <7 0>; +				clock-frequency = <13000000>; +				reg-shift = <2>; +				status = "disabled";  			};  			uart4: serial@40088000 { -				compatible = "nxp,serial"; +				compatible = "nxp,lpc3220-uart";  				reg = <0x40088000 0x1000>; -			}; - -			uart5: serial@40090000 { -				compatible = "nxp,serial"; -				reg = <0x40090000 0x1000>; +				interrupts = <8 0>; +				clock-frequency = <13000000>; +				reg-shift = <2>; +				status = "disabled";  			};  			uart6: serial@40098000 { -				compatible = "nxp,serial"; +				compatible = "nxp,lpc3220-uart";  				reg = <0x40098000 0x1000>; +				interrupts = <10 0>; +				clock-frequency = <13000000>; +				reg-shift = <2>; +				status = "disabled";  			};  			i2c1: i2c@400A0000 { @@ -192,18 +212,24 @@  			};  			uart1: serial@40014000 { -				compatible = "nxp,serial"; +				compatible = "nxp,lpc3220-hsuart";  				reg = <0x40014000 0x1000>; +				interrupts = <26 0>; +				status = "disabled";  			};  			uart2: serial@40018000 { -				compatible = "nxp,serial"; +				compatible = "nxp,lpc3220-hsuart";  				reg = <0x40018000 0x1000>; +				interrupts = <25 0>; +				status = "disabled";  			}; -			uart7: serial@4001C000 { -				compatible = "nxp,serial"; -				reg = <0x4001C000 0x1000>; +			uart7: serial@4001c000 { +				compatible = "nxp,lpc3220-hsuart"; +				reg = <0x4001c000 0x1000>; +				interrupts = <24 0>; +				status = "disabled";  			};  			rtc@40024000 { @@ -235,21 +261,28 @@  				compatible = "nxp,lpc3220-adc";  				reg = <0x40048000 0x1000>;  				interrupts = <0x27 0>; -				status = "disable"; +				status = "disabled";  			};  			tsc@40048000 {  				compatible = "nxp,lpc3220-tsc";  				reg = <0x40048000 0x1000>;  				interrupts = <0x27 0>; -				status = "disable"; +				status = "disabled";  			};  			key@40050000 {  				compatible = "nxp,lpc3220-key";  				reg = <0x40050000 0x1000>; +				interrupts = <54 0>; +				status = "disabled";  			}; +			pwm: pwm@4005C000 { +				compatible = "nxp,lpc3220-pwm"; +				reg = <0x4005C000 0x8>; +				status = "disabled"; +			};  		};  	};  }; diff --git a/arch/arm/boot/dts/omap2420-h4.dts b/arch/arm/boot/dts/omap2420-h4.dts new file mode 100644 index 00000000000..25b50b759de --- /dev/null +++ b/arch/arm/boot/dts/omap2420-h4.dts @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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. + */ +/dts-v1/; + +/include/ "omap2.dtsi" + +/ { +	model = "TI OMAP2420 H4 board"; +	compatible = "ti,omap2420-h4", "ti,omap2420", "ti,omap2"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x84000000>; /* 64 MB */ +	}; +}; diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 5b4506c0a8c..cdcb98c7e07 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts @@ -61,9 +61,9 @@  };  &mmc2 { -	status = "disable"; +	status = "disabled";  };  &mmc3 { -	status = "disable"; +	status = "disabled";  }; diff --git a/arch/arm/boot/dts/omap3-evm.dts b/arch/arm/boot/dts/omap3-evm.dts index 2eee16ec59b..f349ee9182c 100644 --- a/arch/arm/boot/dts/omap3-evm.dts +++ b/arch/arm/boot/dts/omap3-evm.dts @@ -18,3 +18,31 @@  		reg = <0x80000000 0x10000000>; /* 256 MB */  	};  }; + +&i2c1 { +	clock-frequency = <2600000>; + +	twl: twl@48 { +		reg = <0x48>; +		interrupts = <7>; /* SYS_NIRQ cascaded to intc */ +		interrupt-parent = <&intc>; +	}; +}; + +/include/ "twl4030.dtsi" + +&i2c2 { +	clock-frequency = <400000>; +}; + +&i2c3 { +	clock-frequency = <400000>; + +	/* +	 * TVP5146 Video decoder-in for analog input support. +	 */ +	tvp5146@5c { +		compatible = "ti,tvp5146m2"; +		reg = <0x5c>; +	}; +}; diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 99474fa5fac..81094719820 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -215,5 +215,10 @@  			compatible = "ti,omap3-hsmmc";  			ti,hwmods = "mmc3";  		}; + +		wdt2: wdt@48314000 { +			compatible = "ti,omap3-wdt"; +			ti,hwmods = "wd_timer2"; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index 1efe0c58798..9880c12877b 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts @@ -32,6 +32,30 @@  			linux,default-trigger = "mmc0";  		};  	}; + +	sound: sound { +		compatible = "ti,abe-twl6040"; +		ti,model = "PandaBoard"; + +		ti,mclk-freq = <38400000>; + +		ti,mcpdm = <&mcpdm>; + +		ti,twl6040 = <&twl6040>; + +		/* Audio routing */ +		ti,audio-routing = +			"Headset Stereophone", "HSOL", +			"Headset Stereophone", "HSOR", +			"Ext Spk", "HFL", +			"Ext Spk", "HFR", +			"Line Out", "AUXL", +			"Line Out", "AUXR", +			"HSMIC", "Headset Mic", +			"Headset Mic", "Headset Mic Bias", +			"AFML", "Line In", +			"AFMR", "Line In"; +	};  };  &i2c1 { @@ -43,6 +67,19 @@  		interrupts = <0 7 4>; /* IRQ_SYS_1N cascaded to gic */  		interrupt-parent = <&gic>;  	}; + +	twl6040: twl@4b { +		compatible = "ti,twl6040"; +		reg = <0x4b>; +		/* SPI = 0, IRQ# = 119, 4 = active high level-sensitive */ +		interrupts = <0 119 4>; /* IRQ_SYS_2N cascaded to gic */ +		interrupt-parent = <&gic>; +		ti,audpwron-gpio = <&gpio4 31 0>;  /* gpio line 127 */ + +		vio-supply = <&v1v8>; +		v2v1-supply = <&v2v1>; +		enable-active-high; +	};  };  /include/ "twl6030.dtsi" @@ -74,15 +111,15 @@  };  &mmc2 { -	status = "disable"; +	status = "disabled";  };  &mmc3 { -	status = "disable"; +	status = "disabled";  };  &mmc4 { -	status = "disable"; +	status = "disabled";  };  &mmc5 { diff --git a/arch/arm/boot/dts/omap4-pandaES.dts b/arch/arm/boot/dts/omap4-pandaES.dts new file mode 100644 index 00000000000..d4ba43a48d9 --- /dev/null +++ b/arch/arm/boot/dts/omap4-pandaES.dts @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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/ "omap4-panda.dts" + +/* Audio routing is differnet between PandaBoard4430 and PandaBoardES */ +&sound { +	ti,model = "PandaBoardES"; + +	/* Audio routing */ +	ti,audio-routing = +		"Headset Stereophone", "HSOL", +		"Headset Stereophone", "HSOR", +		"Ext Spk", "HFL", +		"Ext Spk", "HFR", +		"Line Out", "AUXL", +		"Line Out", "AUXR", +		"AFML", "Line In", +		"AFMR", "Line In"; +}; diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index d08c4d13728..72216e932fc 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts @@ -28,6 +28,14 @@  		regulator-boot-on;  	}; +	vbat: fixedregulator@2 { +		compatible = "regulator-fixed"; +		regulator-name = "VBAT"; +		regulator-min-microvolt = <3750000>; +		regulator-max-microvolt = <3750000>; +		regulator-boot-on; +	}; +  	leds {  		compatible = "gpio-leds";  		debug0 { @@ -70,6 +78,41 @@  			gpios = <&gpio5 11 0>; /* 139 */  		};  	}; + +	sound { +		compatible = "ti,abe-twl6040"; +		ti,model = "SDP4430"; + +		ti,jack-detection = <1>; +		ti,mclk-freq = <38400000>; + +		ti,mcpdm = <&mcpdm>; +		ti,dmic = <&dmic>; + +		ti,twl6040 = <&twl6040>; + +		/* Audio routing */ +		ti,audio-routing = +			"Headset Stereophone", "HSOL", +			"Headset Stereophone", "HSOR", +			"Earphone Spk", "EP", +			"Ext Spk", "HFL", +			"Ext Spk", "HFR", +			"Line Out", "AUXL", +			"Line Out", "AUXR", +			"Vibrator", "VIBRAL", +			"Vibrator", "VIBRAR", +			"HSMIC", "Headset Mic", +			"Headset Mic", "Headset Mic Bias", +			"MAINMIC", "Main Handset Mic", +			"Main Handset Mic", "Main Mic Bias", +			"SUBMIC", "Sub Handset Mic", +			"Sub Handset Mic", "Main Mic Bias", +			"AFML", "Line In", +			"AFMR", "Line In", +			"DMic", "Digital Mic", +			"Digital Mic", "Digital Mic1 Bias"; +	};  };  &i2c1 { @@ -81,6 +124,31 @@  		interrupts = <0 7 4>; /* IRQ_SYS_1N cascaded to gic */  		interrupt-parent = <&gic>;  	}; + +	twl6040: twl@4b { +		compatible = "ti,twl6040"; +		reg = <0x4b>; +		/* SPI = 0, IRQ# = 119, 4 = active high level-sensitive */ +		interrupts = <0 119 4>; /* IRQ_SYS_2N cascaded to gic */ +		interrupt-parent = <&gic>; +		ti,audpwron-gpio = <&gpio4 31 0>;  /* gpio line 127 */ + +		vio-supply = <&v1v8>; +		v2v1-supply = <&v2v1>; +		enable-active-high; + +		/* regulators for vibra motor */ +		vddvibl-supply = <&vbat>; +		vddvibr-supply = <&vbat>; + +		vibra { +			/* Vibra driver, motor resistance parameters */ +			ti,vibldrv-res = <8>; +			ti,vibrdrv-res = <3>; +			ti,viblmotor-res = <10>; +			ti,vibrmotor-res = <10>; +		}; +	};  };  /include/ "twl6030.dtsi" @@ -147,11 +215,11 @@  };  &mmc3 { -	status = "disable"; +	status = "disabled";  };  &mmc4 { -	status = "disable"; +	status = "disabled";  };  &mmc5 { diff --git a/arch/arm/boot/dts/omap4-var_som.dts b/arch/arm/boot/dts/omap4-var_som.dts new file mode 100644 index 00000000000..6601e6af609 --- /dev/null +++ b/arch/arm/boot/dts/omap4-var_som.dts @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2012 Variscite Ltd. - http://www.variscite.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. + */ +/dts-v1/; + +/include/ "omap4.dtsi" + +/ { +	model = "Variscite OMAP4 SOM"; +	compatible = "var,omap4-var_som", "ti,omap4430", "ti,omap4"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x40000000>; /* 1 GB */ +	}; + +	vdd_eth: fixedregulator@0 { +		compatible = "regulator-fixed"; +		regulator-name = "VDD_ETH"; +		regulator-min-microvolt = <3300000>; +		regulator-max-microvolt = <3300000>; +		enable-active-high; +		regulator-boot-on; +	}; +}; + +&i2c1 { +	clock-frequency = <400000>; + +	twl: twl@48 { +		reg = <0x48>; +		/* SPI = 0, IRQ# = 7, 4 = active high level-sensitive */ +		interrupts = <0 7 4>; /* IRQ_SYS_1N cascaded to gic */ +		interrupt-parent = <&gic>; +	}; +}; + +/include/ "twl6030.dtsi" + +&i2c2 { +	clock-frequency = <400000>; +}; + +&i2c3 { +	clock-frequency = <400000>; + +	/* +	 * Temperature Sensor +	 * http://www.ti.com/lit/ds/symlink/tmp105.pdf +	 */ +	tmp105@49 { +		compatible = "ti,tmp105"; +		reg = <0x49>; +	}; +}; + +&i2c4 { +	clock-frequency = <400000>; +}; + +&mcspi1 { +	eth@0 { +		compatible = "ks8851"; +		spi-max-frequency = <24000000>; +		reg = <0>; +		interrupt-parent = <&gpio6>; +		interrupts = <11>; /* gpio line 171 */ +		vdd-supply = <&vdd_eth>; +	}; +}; + +&mmc1 { +	vmmc-supply = <&vmmc>; +	ti,bus-width = <8>; +	ti,non-removable; +}; + +&mmc2 { +	status = "disabled"; +}; + +&mmc3 { +	status = "disabled"; +}; + +&mmc4 { +	status = "disabled"; +}; + +&mmc5 { +	ti,bus-width = <4>; +}; diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index 359c4979c8a..04cbbcb6ff9 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi @@ -272,5 +272,28 @@  			ti,hwmods = "mmc5";  			ti,needs-special-reset;  		}; + +		wdt2: wdt@4a314000 { +			compatible = "ti,omap4-wdt", "ti,omap3-wdt"; +			ti,hwmods = "wd_timer2"; +		}; + +		mcpdm: mcpdm@40132000 { +			compatible = "ti,omap4-mcpdm"; +			reg = <0x40132000 0x7f>, /* MPU private access */ +			      <0x49032000 0x7f>; /* L3 Interconnect */ +			interrupts = <0 112 0x4>; +			interrupt-parent = <&gic>; +			ti,hwmods = "mcpdm"; +		}; + +		dmic: dmic@4012e000 { +			compatible = "ti,omap4-dmic"; +			reg = <0x4012e000 0x7f>, /* MPU private access */ +			      <0x4902e000 0x7f>; /* L3 Interconnect */ +			interrupts = <0 114 0x4>; +			interrupt-parent = <&gic>; +			ti,hwmods = "dmic"; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap5-evm.dts b/arch/arm/boot/dts/omap5-evm.dts new file mode 100644 index 00000000000..200c39ad1c8 --- /dev/null +++ b/arch/arm/boot/dts/omap5-evm.dts @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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. + */ +/dts-v1/; + +/include/ "omap5.dtsi" + +/ { +	model = "TI OMAP5 EVM board"; +	compatible = "ti,omap5-evm", "ti,omap5"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x40000000>; /* 1 GB */ +	}; +}; diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi new file mode 100644 index 00000000000..57e52708374 --- /dev/null +++ b/arch/arm/boot/dts/omap5.dtsi @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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. + * Based on "omap4.dtsi" + */ + +/* + * Carveout for multimedia usecases + * It should be the last 48MB of the first 512MB memory part + * In theory, it should not even exist. That zone should be reserved + * dynamically during the .reserve callback. + */ +/memreserve/ 0x9d000000 0x03000000; + +/include/ "skeleton.dtsi" + +/ { +	compatible = "ti,omap5"; +	interrupt-parent = <&gic>; + +	aliases { +		serial0 = &uart1; +		serial1 = &uart2; +		serial2 = &uart3; +		serial3 = &uart4; +		serial4 = &uart5; +		serial5 = &uart6; +	}; + +	cpus { +		cpu@0 { +			compatible = "arm,cortex-a15"; +		}; +		cpu@1 { +			compatible = "arm,cortex-a15"; +		}; +	}; + +	/* +	 * The soc node represents the soc top level view. It is uses for IPs +	 * that are not memory mapped in the MPU view or for the MPU itself. +	 */ +	soc { +		compatible = "ti,omap-infra"; +		mpu { +			compatible = "ti,omap5-mpu"; +			ti,hwmods = "mpu"; +		}; +	}; + +	/* +	 * XXX: Use a flat representation of the OMAP3 interconnect. +	 * The real OMAP interconnect network is quite complex. +	 * Since that will not bring real advantage to represent that in DT for +	 * the moment, just use a fake OCP bus entry to represent the whole bus +	 * hierarchy. +	 */ +	ocp { +		compatible = "ti,omap4-l3-noc", "simple-bus"; +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; +		ti,hwmods = "l3_main_1", "l3_main_2", "l3_main_3"; + +		gic: interrupt-controller@48211000 { +			compatible = "arm,cortex-a15-gic"; +			interrupt-controller; +			#interrupt-cells = <3>; +			reg = <0x48211000 0x1000>, +			      <0x48212000 0x1000>; +		}; + +		gpio1: gpio@4ae10000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio1"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio2: gpio@48055000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio2"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio3: gpio@48057000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio3"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio4: gpio@48059000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio4"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio5: gpio@4805b000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio5"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio6: gpio@4805d000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio6"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio7: gpio@48051000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio7"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		gpio8: gpio@48053000 { +			compatible = "ti,omap4-gpio"; +			ti,hwmods = "gpio8"; +			gpio-controller; +			#gpio-cells = <2>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		uart1: serial@4806a000 { +			compatible = "ti,omap4-uart"; +			ti,hwmods = "uart1"; +			clock-frequency = <48000000>; +		}; + +		uart2: serial@4806c000 { +			compatible = "ti,omap4-uart"; +			ti,hwmods = "uart2"; +			clock-frequency = <48000000>; +		}; + +		uart3: serial@48020000 { +			compatible = "ti,omap4-uart"; +			ti,hwmods = "uart3"; +			clock-frequency = <48000000>; +		}; + +		uart4: serial@4806e000 { +			compatible = "ti,omap4-uart"; +			ti,hwmods = "uart4"; +			clock-frequency = <48000000>; +		}; + +		uart5: serial@48066000 { +			compatible = "ti,omap5-uart"; +			ti,hwmods = "uart5"; +			clock-frequency = <48000000>; +		}; + +		uart6: serial@48068000 { +			compatible = "ti,omap6-uart"; +			ti,hwmods = "uart6"; +			clock-frequency = <48000000>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/phy3250.dts b/arch/arm/boot/dts/phy3250.dts index c4ff6d1a018..802ec5b2fd0 100644 --- a/arch/arm/boot/dts/phy3250.dts +++ b/arch/arm/boot/dts/phy3250.dts @@ -54,6 +54,17 @@  			#address-cells = <1>;  			#size-cells = <1>; +			nxp,wdr-clks = <14>; +			nxp,wwidth = <40000000>; +			nxp,whold = <100000000>; +			nxp,wsetup = <100000000>; +			nxp,rdr-clks = <14>; +			nxp,rwidth = <40000000>; +			nxp,rhold = <66666666>; +			nxp,rsetup = <100000000>; +			nand-on-flash-bbt; +			gpios = <&gpio 5 19 1>; /* GPO_P3 19, active low */ +  			mtd0@00000000 {  				label = "phy3250-boot";  				reg = <0x00000000 0x00064000>; @@ -83,6 +94,14 @@  		};  		apb { +			uart5: serial@40090000 { +				status = "okay"; +			}; + +			uart3: serial@40080000 { +				status = "okay"; +			}; +  			i2c1: i2c@400A0000 {  				clock-frequency = <100000>; @@ -114,16 +133,58 @@  			};  			ssp0: ssp@20084000 { +				#address-cells = <1>; +				#size-cells = <0>; +				pl022,num-chipselects = <1>; +				cs-gpios = <&gpio 3 5 0>; +  				eeprom: at25@0 { +					pl022,hierarchy = <0>; +					pl022,interface = <0>; +					pl022,slave-tx-disable = <0>; +					pl022,com-mode = <0>; +					pl022,rx-level-trig = <1>; +					pl022,tx-level-trig = <1>; +					pl022,ctrl-len = <11>; +					pl022,wait-state = <0>; +					pl022,duplex = <0>; + +					at25,byte-len = <0x8000>; +					at25,addr-mode = <2>; +					at25,page-size = <64>; +  					compatible = "atmel,at25"; +					reg = <0>; +					spi-max-frequency = <5000000>;  				};  			}; + +			sd@20098000 { +				wp-gpios = <&gpio 3 0 0>; +				cd-gpios = <&gpio 3 1 0>; +				cd-inverted; +				bus-width = <4>; +				status = "okay"; +			};  		};  		fab { +			uart2: serial@40018000 { +				status = "okay"; +			}; +  			tsc@40048000 {  				status = "okay";  			}; + +			key@40050000 { +				status = "okay"; +				keypad,num-rows = <1>; +				keypad,num-columns = <1>; +				nxp,debounce-delay-ms = <3>; +				nxp,scan-delay-ms = <34>; +				linux,keymap = <0x00000002>; +			};  		};  	}; diff --git a/arch/arm/boot/dts/r8a7740.dtsi b/arch/arm/boot/dts/r8a7740.dtsi new file mode 100644 index 00000000000..798fa35c000 --- /dev/null +++ b/arch/arm/boot/dts/r8a7740.dtsi @@ -0,0 +1,21 @@ +/* + * Device Tree Source for the r8a7740 SoC + * + * Copyright (C) 2012 Renesas Solutions Corp. + * + * 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/ "skeleton.dtsi" + +/ { +	compatible = "renesas,r8a7740"; + +	cpus { +		cpu@0 { +			compatible = "arm,cortex-a9"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/sh7377.dtsi b/arch/arm/boot/dts/sh7377.dtsi new file mode 100644 index 00000000000..767ee0796da --- /dev/null +++ b/arch/arm/boot/dts/sh7377.dtsi @@ -0,0 +1,21 @@ +/* + * Device Tree Source for the sh7377 SoC + * + * Copyright (C) 2012 Renesas Solutions Corp. + * + * 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/ "skeleton.dtsi" + +/ { +	compatible = "renesas,sh7377"; + +	cpus { +		cpu@0 { +			compatible = "arm,cortex-a8"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/snowball.dts index ec3c3397511..7e334d4cae2 100644 --- a/arch/arm/boot/dts/snowball.dts +++ b/arch/arm/boot/dts/snowball.dts @@ -77,6 +77,8 @@  		used-led {  			label = "user_led";  			gpios = <&gpio4 14 0x4>; +			default-state = "on"; +			linux,default-trigger = "heartbeat";  		};  	}; @@ -101,15 +103,30 @@  			};  		}; +		// External Micro SD slot  		sdi@80126000 { -			status = "enabled"; +			arm,primecell-periphid = <0x10480180>; +			max-frequency = <50000000>; +			bus-width = <8>; +			mmc-cap-mmc-highspeed;  			vmmc-supply = <&ab8500_ldo_aux3_reg>; + +			#gpio-cells = <1>;  			cd-gpios  = <&gpio6 26 0x4>; // 218 +			cd-inverted; + +			status = "okay";  		}; +		// On-board eMMC  		sdi@80114000 { -			status = "enabled"; +			arm,primecell-periphid = <0x10480180>; +		        max-frequency = <50000000>; +			bus-width = <8>; +			mmc-cap-mmc-highspeed;  			vmmc-supply = <&ab8500_ldo_aux2_reg>; + +			status = "okay";  		};  		uart@80120000 { diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi new file mode 100644 index 00000000000..0772f5739f5 --- /dev/null +++ b/arch/arm/boot/dts/socfpga.dtsi @@ -0,0 +1,147 @@ +/* + *  Copyright (C) 2012 Altera <www.altera.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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, see <http://www.gnu.org/licenses/>. + */ + +/include/ "skeleton.dtsi" + +/ { +	#address-cells = <1>; +	#size-cells = <1>; + +	aliases { +		ethernet0 = &gmac0; +		serial0 = &uart0; +		serial1 = &uart1; +	}; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			compatible = "arm,cortex-a9"; +			device_type = "cpu"; +			reg = <0>; +			next-level-cache = <&L2>; +		}; +		cpu@1 { +			compatible = "arm,cortex-a9"; +			device_type = "cpu"; +			reg = <1>; +			next-level-cache = <&L2>; +		}; +	}; + +	intc: intc@fffed000 { +		compatible = "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		interrupt-controller; +		reg = <0xfffed000 0x1000>, +		      <0xfffec100 0x100>; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		device_type = "soc"; +		interrupt-parent = <&intc>; +		ranges; + +		amba { +			compatible = "arm,amba-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges; + +			pdma: pdma@ffe01000 { +				compatible = "arm,pl330", "arm,primecell"; +				reg = <0xffe01000 0x1000>; +				interrupts = <0 180 4>; +			}; +		}; + +		gmac0: stmmac@ff700000 { +			compatible = "altr,socfpga-stmmac", "snps,dwmac-3.70a", "snps,dwmac"; +			reg = <0xff700000 0x2000>; +			interrupts = <0 115 4>; +			interrupt-names = "macirq"; +			mac-address = [00 00 00 00 00 00];/* Filled in by U-Boot */ +			phy-mode = "gmii"; +		}; + +		L2: l2-cache@fffef000 { +			compatible = "arm,pl310-cache"; +			reg = <0xfffef000 0x1000>; +			interrupts = <0 38 0x04>; +			cache-unified; +			cache-level = <2>; +		}; + +		/* Local timer */ +		timer@fffec600 { +			compatible = "arm,cortex-a9-twd-timer"; +			reg = <0xfffec600 0x100>; +			interrupts = <1 13 0xf04>; +		}; + +		timer0: timer@ffc08000 { +			compatible = "snps,dw-apb-timer-sp"; +			interrupts = <0 167 4>; +			clock-frequency = <200000000>; +			reg = <0xffc08000 0x1000>; +		}; + +		timer1: timer@ffc09000 { +			compatible = "snps,dw-apb-timer-sp"; +			interrupts = <0 168 4>; +			clock-frequency = <200000000>; +			reg = <0xffc09000 0x1000>; +		}; + +		timer2: timer@ffd00000 { +			compatible = "snps,dw-apb-timer-osc"; +			interrupts = <0 169 4>; +			clock-frequency = <200000000>; +			reg = <0xffd00000 0x1000>; +		}; + +		timer3: timer@ffd01000 { +			compatible = "snps,dw-apb-timer-osc"; +			interrupts = <0 170 4>; +			clock-frequency = <200000000>; +			reg = <0xffd01000 0x1000>; +		}; + +		uart0: uart@ffc02000 { +			compatible = "snps,dw-apb-uart"; +			reg = <0xffc02000 0x1000>; +			clock-frequency = <7372800>; +			interrupts = <0 162 4>; +			reg-shift = <2>; +			reg-io-width = <4>; +		}; + +		uart1: uart@ffc03000 { +			compatible = "snps,dw-apb-uart"; +			reg = <0xffc03000 0x1000>; +			clock-frequency = <7372800>; +			interrupts = <0 163 4>; +			reg-shift = <2>; +			reg-io-width = <4>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/socfpga_cyclone5.dts b/arch/arm/boot/dts/socfpga_cyclone5.dts new file mode 100644 index 00000000000..ab7e4a94299 --- /dev/null +++ b/arch/arm/boot/dts/socfpga_cyclone5.dts @@ -0,0 +1,34 @@ +/* + *  Copyright (C) 2012 Altera Corporation <www.altera.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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, see <http://www.gnu.org/licenses/>. + */ + +/dts-v1/; +/include/ "socfpga.dtsi" + +/ { +	model = "Altera SOCFPGA Cyclone V"; +	compatible = "altr,socfpga-cyclone5"; + +	chosen { +		bootargs = "console=ttyS0,57600"; +	}; + +	memory { +		name = "memory"; +		device_type = "memory"; +		reg = <0x0 0x10000000>; /* 256MB */ +	}; +}; diff --git a/arch/arm/boot/dts/tegra-harmony.dts b/arch/arm/boot/dts/tegra20-harmony.dts index 7de701365fc..f146dbf6f7f 100644 --- a/arch/arm/boot/dts/tegra-harmony.dts +++ b/arch/arm/boot/dts/tegra20-harmony.dts @@ -307,7 +307,6 @@  		cd-gpios = <&gpio 58 0>; /* gpio PH2 */  		wp-gpios = <&gpio 59 0>; /* gpio PH3 */  		power-gpios = <&gpio 70 0>; /* gpio PI6 */ -		support-8bit;  		bus-width = <8>;  	}; diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra20-paz00.dts index bfeb117d5ae..684a9e1ff7e 100644 --- a/arch/arm/boot/dts/tegra-paz00.dts +++ b/arch/arm/boot/dts/tegra20-paz00.dts @@ -301,7 +301,6 @@  	sdhci@c8000600 {  		status = "okay"; -		support-8bit;  		bus-width = <8>;  	}; diff --git a/arch/arm/boot/dts/tegra-seaboard.dts b/arch/arm/boot/dts/tegra20-seaboard.dts index 89cb7f2acd9..85e621ab296 100644 --- a/arch/arm/boot/dts/tegra-seaboard.dts +++ b/arch/arm/boot/dts/tegra20-seaboard.dts @@ -64,11 +64,6 @@  				nvidia,pins = "dap4";  				nvidia,function = "dap4";  			}; -			ddc { -				nvidia,pins = "ddc", "owc", "spdi", "spdo", -					"uac"; -				nvidia,function = "rsvd2"; -			};  			dta {  				nvidia,pins = "dta", "dtb", "dtc", "dtd", "dte";  				nvidia,function = "vi"; @@ -129,14 +124,14 @@  					"lspi", "lvp1", "lvs";  				nvidia,function = "displaya";  			}; +			owc { +				nvidia,pins = "owc", "spdi", "spdo", "uac"; +				nvidia,function = "rsvd2"; +			};  			pmc {  				nvidia,pins = "pmc";  				nvidia,function = "pwr_on";  			}; -			pta { -				nvidia,pins = "pta"; -				nvidia,function = "i2c2"; -			};  			rm {  				nvidia,pins = "rm";  				nvidia,function = "i2c1"; @@ -176,7 +171,7 @@  			conf_ata {  				nvidia,pins = "ata", "atb", "atc", "atd",  					"cdev1", "cdev2", "dap1", "dap2", -					"dap4", "dtf", "gma", "gmc", "gmd", +					"dap4", "ddc", "dtf", "gma", "gmc", "gmd",  					"gme", "gpu", "gpu7", "i2cp", "irrx",  					"irtx", "pta", "rm", "sdc", "sdd",  					"slxd", "slxk", "spdi", "spdo", "uac", @@ -185,7 +180,7 @@  				nvidia,tristate = <0>;  			};  			conf_ate { -				nvidia,pins = "ate", "csus", "dap3", "ddc", +				nvidia,pins = "ate", "csus", "dap3",  					"gpv", "owc", "slxc", "spib", "spid",  					"spie";  				nvidia,pull = <0>; @@ -255,6 +250,39 @@  				nvidia,slew-rate-falling = <3>;  			};  		}; + +		state_i2cmux_ddc: pinmux_i2cmux_ddc { +			ddc { +				nvidia,pins = "ddc"; +				nvidia,function = "i2c2"; +			}; +			pta { +				nvidia,pins = "pta"; +				nvidia,function = "rsvd4"; +			}; +		}; + +		state_i2cmux_pta: pinmux_i2cmux_pta { +			ddc { +				nvidia,pins = "ddc"; +				nvidia,function = "rsvd4"; +			}; +			pta { +				nvidia,pins = "pta"; +				nvidia,function = "i2c2"; +			}; +		}; + +		state_i2cmux_idle: pinmux_i2cmux_idle { +			ddc { +				nvidia,pins = "ddc"; +				nvidia,function = "rsvd4"; +			}; +			pta { +				nvidia,pins = "pta"; +				nvidia,function = "rsvd4"; +			}; +		};  	};  	i2s@70002800 { @@ -303,12 +331,37 @@  	i2c@7000c400 {  		status = "okay";  		clock-frequency = <100000>; +	}; + +	i2cmux { +		compatible = "i2c-mux-pinctrl"; +		#address-cells = <1>; +		#size-cells = <0>; + +		i2c-parent = <&{/i2c@7000c400}>; -		smart-battery@b { -			compatible = "ti,bq20z75", "smart-battery-1.1"; -			reg = <0xb>; -			ti,i2c-retry-count = <2>; -			ti,poll-retry-count = <10>; +		pinctrl-names = "ddc", "pta", "idle"; +		pinctrl-0 = <&state_i2cmux_ddc>; +		pinctrl-1 = <&state_i2cmux_pta>; +		pinctrl-2 = <&state_i2cmux_idle>; + +		i2c@0 { +			reg = <0>; +			#address-cells = <1>; +			#size-cells = <0>; +		}; + +		i2c@1 { +			reg = <1>; +			#address-cells = <1>; +			#size-cells = <0>; + +			smart-battery@b { +				compatible = "ti,bq20z75", "smart-battery-1.1"; +				reg = <0xb>; +				ti,i2c-retry-count = <2>; +				ti,poll-retry-count = <10>; +			};  		};  	}; @@ -334,7 +387,7 @@  		};  	}; -	emc { +	memory-controller@0x7000f400 {  		emc-table@190000 {  			reg = <190000>;  			compatible = "nvidia,tegra20-emc-table"; @@ -397,7 +450,6 @@  	sdhci@c8000600 {  		status = "okay"; -		support-8bit;  		bus-width = <8>;  	}; diff --git a/arch/arm/boot/dts/tegra-trimslice.dts b/arch/arm/boot/dts/tegra20-trimslice.dts index 9de5636023f..27fb8a67ea4 100644 --- a/arch/arm/boot/dts/tegra-trimslice.dts +++ b/arch/arm/boot/dts/tegra20-trimslice.dts @@ -276,9 +276,11 @@  	usb@c5000000 {  		status = "okay"; +		nvidia,vbus-gpio = <&gpio 170 0>; /* gpio PV2 */  	};  	usb@c5004000 { +		status = "okay";  		nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */  	}; diff --git a/arch/arm/boot/dts/tegra-ventana.dts b/arch/arm/boot/dts/tegra20-ventana.dts index 445343b0fbd..be90544e6b5 100644 --- a/arch/arm/boot/dts/tegra-ventana.dts +++ b/arch/arm/boot/dts/tegra20-ventana.dts @@ -314,7 +314,6 @@  	sdhci@c8000600 {  		status = "okay"; -		support-8bit;  		bus-width = <8>;  	}; diff --git a/arch/arm/boot/dts/tegra20-whistler.dts b/arch/arm/boot/dts/tegra20-whistler.dts new file mode 100644 index 00000000000..6916310bf58 --- /dev/null +++ b/arch/arm/boot/dts/tegra20-whistler.dts @@ -0,0 +1,301 @@ +/dts-v1/; + +/include/ "tegra20.dtsi" + +/ { +	model = "NVIDIA Tegra2 Whistler evaluation board"; +	compatible = "nvidia,whistler", "nvidia,tegra20"; + +	memory { +		reg = <0x00000000 0x20000000>; +	}; + +	pinmux { +		pinctrl-names = "default"; +		pinctrl-0 = <&state_default>; + +		state_default: pinmux { +			ata { +				nvidia,pins = "ata", "atb", "ate", "gma", "gmb", +					"gmc", "gmd", "gpu"; +				nvidia,function = "gmi"; +			}; +			atc { +				nvidia,pins = "atc", "atd"; +				nvidia,function = "sdio4"; +			}; +			cdev1 { +				nvidia,pins = "cdev1"; +				nvidia,function = "plla_out"; +			}; +			cdev2 { +				nvidia,pins = "cdev2"; +				nvidia,function = "osc"; +			}; +			crtp { +				nvidia,pins = "crtp"; +				nvidia,function = "crt"; +			}; +			csus { +				nvidia,pins = "csus"; +				nvidia,function = "vi_sensor_clk"; +			}; +			dap1 { +				nvidia,pins = "dap1"; +				nvidia,function = "dap1"; +			}; +			dap2 { +				nvidia,pins = "dap2"; +				nvidia,function = "dap2"; +			}; +			dap3 { +				nvidia,pins = "dap3"; +				nvidia,function = "dap3"; +			}; +			dap4 { +				nvidia,pins = "dap4"; +				nvidia,function = "dap4"; +			}; +			ddc { +				nvidia,pins = "ddc"; +				nvidia,function = "i2c2"; +			}; +			dta { +				nvidia,pins = "dta", "dtb", "dtc", "dtd"; +				nvidia,function = "vi"; +			}; +			dte { +				nvidia,pins = "dte"; +				nvidia,function = "rsvd1"; +			}; +			dtf { +				nvidia,pins = "dtf"; +				nvidia,function = "i2c3"; +			}; +			gme { +				nvidia,pins = "gme"; +				nvidia,function = "dap5"; +			}; +			gpu7 { +				nvidia,pins = "gpu7"; +				nvidia,function = "rtck"; +			}; +			gpv { +				nvidia,pins = "gpv"; +				nvidia,function = "pcie"; +			}; +			hdint { +				nvidia,pins = "hdint", "pta"; +				nvidia,function = "hdmi"; +			}; +			i2cp { +				nvidia,pins = "i2cp"; +				nvidia,function = "i2cp"; +			}; +			irrx { +				nvidia,pins = "irrx", "irtx"; +				nvidia,function = "uartb"; +			}; +			kbca { +				nvidia,pins = "kbca", "kbcc", "kbce", "kbcf"; +				nvidia,function = "kbc"; +			}; +			kbcb { +				nvidia,pins = "kbcb", "kbcd"; +				nvidia,function = "sdio2"; +			}; +			lcsn { +				nvidia,pins = "lcsn", "lsck", "lsda", "lsdi", +					"spia", "spib", "spic"; +				nvidia,function = "spi3"; +			}; +			ld0 { +				nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", +					"ld5", "ld6", "ld7", "ld8", "ld9", +					"ld10", "ld11", "ld12", "ld13", "ld14", +					"ld15", "ld16", "ld17", "ldc", "ldi", +					"lhp0", "lhp1", "lhp2", "lhs", "lm0", +					"lm1", "lpp", "lpw0", "lpw1", "lpw2", +					"lsc0", "lsc1", "lspi", "lvp0", "lvp1", +					"lvs"; +				nvidia,function = "displaya"; +			}; +			owc { +				nvidia,pins = "owc", "uac"; +				nvidia,function = "owr"; +			}; +			pmc { +				nvidia,pins = "pmc"; +				nvidia,function = "pwr_on"; +			}; +			rm { +				nvidia,pins = "rm"; +				nvidia,function = "i2c1"; +			}; +			sdb { +				nvidia,pins = "sdb", "sdc", "sdd", "slxa", +					"slxc", "slxd", "slxk"; +				nvidia,function = "sdio3"; +			}; +			sdio1 { +				nvidia,pins = "sdio1"; +				nvidia,function = "sdio1"; +			}; +			spdi { +				nvidia,pins = "spdi", "spdo"; +				nvidia,function = "rsvd2"; +			}; +			spid { +				nvidia,pins = "spid", "spie", "spig", "spih"; +				nvidia,function = "spi2_alt"; +			}; +			spif { +				nvidia,pins = "spif"; +				nvidia,function = "spi2"; +			}; +			uaa { +				nvidia,pins = "uaa", "uab"; +				nvidia,function = "uarta"; +			}; +			uad { +				nvidia,pins = "uad"; +				nvidia,function = "irda"; +			}; +			uca { +				nvidia,pins = "uca", "ucb"; +				nvidia,function = "uartc"; +			}; +			uda { +				nvidia,pins = "uda"; +				nvidia,function = "spi1"; +			}; +			conf_ata { +				nvidia,pins = "ata", "atb", "atc", "ddc", "gma", +					"gmb", "gmc", "gmd", "irrx", "irtx", +					"kbca", "kbcb", "kbcc", "kbcd", "kbce", +					"kbcf", "sdc", "sdd", "spie", "spig", +					"spih", "uaa", "uab", "uad", "uca", +					"ucb"; +				nvidia,pull = <2>; +				nvidia,tristate = <0>; +			}; +			conf_atd { +				nvidia,pins = "atd", "ate", "cdev1", "csus", +					"dap1", "dap2", "dap3", "dap4", "dte", +					"dtf", "gpu", "gpu7", "gpv", "i2cp", +					"rm", "sdio1", "slxa", "slxc", "slxd", +					"slxk", "spdi", "spdo", "uac", "uda"; +				nvidia,pull = <0>; +				nvidia,tristate = <0>; +			}; +			conf_cdev2 { +				nvidia,pins = "cdev2", "spia", "spib"; +				nvidia,pull = <1>; +				nvidia,tristate = <1>; +			}; +			conf_ck32 { +				nvidia,pins = "ck32", "ddrc", "lc", "pmca", +					"pmcb", "pmcc", "pmcd", "xm2c", +					"xm2d"; +				nvidia,pull = <0>; +			}; +			conf_crtp { +				nvidia,pins = "crtp"; +				nvidia,pull = <0>; +				nvidia,tristate = <1>; +			}; +			conf_dta { +				nvidia,pins = "dta", "dtb", "dtc", "dtd", +					"spid", "spif"; +				nvidia,pull = <1>; +				nvidia,tristate = <0>; +			}; +			conf_gme { +				nvidia,pins = "gme", "owc", "pta", "spic"; +				nvidia,pull = <2>; +				nvidia,tristate = <1>; +			}; +			conf_ld17_0 { +				nvidia,pins = "ld17_0", "ld19_18", "ld21_20", +					"ld23_22"; +				nvidia,pull = <1>; +			}; +			conf_ls { +				nvidia,pins = "ls", "pmce"; +				nvidia,pull = <2>; +			}; +			drive_dap1 { +				nvidia,pins = "drive_dap1"; +				nvidia,high-speed-mode = <0>; +				nvidia,schmitt = <1>; +				nvidia,low-power-mode = <0>; +				nvidia,pull-down-strength = <0>; +				nvidia,pull-up-strength = <0>; +				nvidia,slew-rate-rising = <0>; +				nvidia,slew-rate-falling = <0>; +			}; +		}; +	}; + +	i2s@70002800 { +		status = "okay"; +	}; + +	serial@70006000 { +		status = "okay"; +		clock-frequency = <216000000>; +	}; + +	i2c@7000d000 { +		status = "okay"; +		clock-frequency = <100000>; + +		codec: codec@1a { +			compatible = "wlf,wm8753"; +			reg = <0x1a>; +		}; + +		tca6416: gpio@20 { +			compatible = "ti,tca6416"; +			reg = <0x20>; +			gpio-controller; +			#gpio-cells = <2>; +		}; +	}; + +	usb@c5000000 { +		status = "okay"; +		nvidia,vbus-gpio = <&tca6416 0 0>; /* GPIO_PMU0 */ +	}; + +	usb@c5008000 { +		status = "okay"; +		nvidia,vbus-gpio = <&tca6416 1 0>; /* GPIO_PMU1 */ +	}; + +	sdhci@c8000400 { +		status = "okay"; +		wp-gpios = <&gpio 173 0>; /* gpio PV5 */ +		bus-width = <8>; +	}; + +	sdhci@c8000600 { +		status = "okay"; +		bus-width = <8>; +	}; + +	sound { +		compatible = "nvidia,tegra-audio-wm8753-whistler", +			     "nvidia,tegra-audio-wm8753"; +		nvidia,model = "NVIDIA Tegra Whistler"; + +		nvidia,audio-routing = +			"Headphone Jack", "LOUT1", +			"Headphone Jack", "ROUT1", +			"MIC2", "Mic Jack", +			"MIC2N", "Mic Jack"; + +		nvidia,i2s-controller = <&tegra_i2s1>; +		nvidia,audio-codec = <&codec>; +	}; +}; diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index c417d67e902..405d1673904 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi @@ -72,7 +72,7 @@  		reg = <0x70002800 0x200>;  		interrupts = <0 13 0x04>;  		nvidia,dma-request-selector = <&apbdma 2>; -		status = "disable"; +		status = "disabled";  	};  	tegra_i2s2: i2s@70002a00 { @@ -80,7 +80,7 @@  		reg = <0x70002a00 0x200>;  		interrupts = <0 3 0x04>;  		nvidia,dma-request-selector = <&apbdma 1>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006000 { @@ -88,7 +88,7 @@  		reg = <0x70006000 0x40>;  		reg-shift = <2>;  		interrupts = <0 36 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006040 { @@ -96,7 +96,7 @@  		reg = <0x70006040 0x40>;  		reg-shift = <2>;  		interrupts = <0 37 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006200 { @@ -104,7 +104,7 @@  		reg = <0x70006200 0x100>;  		reg-shift = <2>;  		interrupts = <0 46 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006300 { @@ -112,7 +112,7 @@  		reg = <0x70006300 0x100>;  		reg-shift = <2>;  		interrupts = <0 90 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006400 { @@ -120,7 +120,13 @@  		reg = <0x70006400 0x100>;  		reg-shift = <2>;  		interrupts = <0 91 0x04>; -		status = "disable"; +		status = "disabled"; +	}; + +	pwm { +		compatible = "nvidia,tegra20-pwm"; +		reg = <0x7000a000 0x100>; +		#pwm-cells = <2>;  	};  	i2c@7000c000 { @@ -129,7 +135,7 @@  		interrupts = <0 38 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	i2c@7000c400 { @@ -138,7 +144,7 @@  		interrupts = <0 84 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	i2c@7000c500 { @@ -147,7 +153,7 @@  		interrupts = <0 92 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	i2c@7000d000 { @@ -156,7 +162,7 @@  		interrupts = <0 53 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	pmc { @@ -164,7 +170,7 @@  		reg = <0x7000e400 0x400>;  	}; -	mc { +	memory-controller@0x7000f000 {  		compatible = "nvidia,tegra20-mc";  		reg = <0x7000f000 0x024  		       0x7000f03c 0x3c4>; @@ -177,7 +183,7 @@  		       0x58000000 0x02000000>;	/* GART aperture */  	}; -	emc { +	memory-controller@0x7000f400 {  		compatible = "nvidia,tegra20-emc";  		reg = <0x7000f400 0x200>;  		#address-cells = <1>; @@ -190,7 +196,7 @@  		interrupts = <0 20 0x04>;  		phy_type = "utmi";  		nvidia,has-legacy-mode; -		status = "disable"; +		status = "disabled";  	};  	usb@c5004000 { @@ -198,7 +204,7 @@  		reg = <0xc5004000 0x4000>;  		interrupts = <0 21 0x04>;  		phy_type = "ulpi"; -		status = "disable"; +		status = "disabled";  	};  	usb@c5008000 { @@ -206,35 +212,35 @@  		reg = <0xc5008000 0x4000>;  		interrupts = <0 97 0x04>;  		phy_type = "utmi"; -		status = "disable"; +		status = "disabled";  	};  	sdhci@c8000000 {  		compatible = "nvidia,tegra20-sdhci";  		reg = <0xc8000000 0x200>;  		interrupts = <0 14 0x04>; -		status = "disable"; +		status = "disabled";  	};  	sdhci@c8000200 {  		compatible = "nvidia,tegra20-sdhci";  		reg = <0xc8000200 0x200>;  		interrupts = <0 15 0x04>; -		status = "disable"; +		status = "disabled";  	};  	sdhci@c8000400 {  		compatible = "nvidia,tegra20-sdhci";  		reg = <0xc8000400 0x200>;  		interrupts = <0 19 0x04>; -		status = "disable"; +		status = "disabled";  	};  	sdhci@c8000600 {  		compatible = "nvidia,tegra20-sdhci";  		reg = <0xc8000600 0x200>;  		interrupts = <0 31 0x04>; -		status = "disable"; +		status = "disabled";  	};  	pmu { diff --git a/arch/arm/boot/dts/tegra-cardhu.dts b/arch/arm/boot/dts/tegra30-cardhu.dts index 36321bceec4..c169bced131 100644 --- a/arch/arm/boot/dts/tegra-cardhu.dts +++ b/arch/arm/boot/dts/tegra30-cardhu.dts @@ -144,7 +144,6 @@  	sdhci@78000600 {  		status = "okay"; -		support-8bit;  		bus-width = <8>;  	}; diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi index 2dcc09e784b..3e4334d14ef 100644 --- a/arch/arm/boot/dts/tegra30.dtsi +++ b/arch/arm/boot/dts/tegra30.dtsi @@ -82,7 +82,7 @@  		reg = <0x70006000 0x40>;  		reg-shift = <2>;  		interrupts = <0 36 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006040 { @@ -90,7 +90,7 @@  		reg = <0x70006040 0x40>;  		reg-shift = <2>;  		interrupts = <0 37 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006200 { @@ -98,7 +98,7 @@  		reg = <0x70006200 0x100>;  		reg-shift = <2>;  		interrupts = <0 46 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006300 { @@ -106,7 +106,7 @@  		reg = <0x70006300 0x100>;  		reg-shift = <2>;  		interrupts = <0 90 0x04>; -		status = "disable"; +		status = "disabled";  	};  	serial@70006400 { @@ -114,7 +114,13 @@  		reg = <0x70006400 0x100>;  		reg-shift = <2>;  		interrupts = <0 91 0x04>; -		status = "disable"; +		status = "disabled"; +	}; + +	pwm { +		compatible = "nvidia,tegra30-pwm", "nvidia,tegra20-pwm"; +		reg = <0x7000a000 0x100>; +		#pwm-cells = <2>;  	};  	i2c@7000c000 { @@ -123,7 +129,7 @@  		interrupts = <0 38 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	i2c@7000c400 { @@ -132,7 +138,7 @@  		interrupts = <0 84 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	i2c@7000c500 { @@ -141,7 +147,7 @@  		interrupts = <0 92 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	i2c@7000c700 { @@ -150,7 +156,7 @@  		interrupts = <0 120 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	i2c@7000d000 { @@ -159,7 +165,7 @@  		interrupts = <0 53 0x04>;  		#address-cells = <1>;  		#size-cells = <0>; -		status = "disable"; +		status = "disabled";  	};  	pmc { @@ -167,7 +173,7 @@  		reg = <0x7000e400 0x400>;  	}; -	mc { +	memory-controller {  		compatible = "nvidia,tegra30-mc";  		reg = <0x7000f000 0x010  		       0x7000f03c 0x1b4 @@ -201,35 +207,35 @@  			compatible = "nvidia,tegra30-i2s";  			reg = <0x70080300 0x100>;  			nvidia,ahub-cif-ids = <4 4>; -			status = "disable"; +			status = "disabled";  		};  		tegra_i2s1: i2s@70080400 {  			compatible = "nvidia,tegra30-i2s";  			reg = <0x70080400 0x100>;  			nvidia,ahub-cif-ids = <5 5>; -			status = "disable"; +			status = "disabled";  		};  		tegra_i2s2: i2s@70080500 {  			compatible = "nvidia,tegra30-i2s";  			reg = <0x70080500 0x100>;  			nvidia,ahub-cif-ids = <6 6>; -			status = "disable"; +			status = "disabled";  		};  		tegra_i2s3: i2s@70080600 {  			compatible = "nvidia,tegra30-i2s";  			reg = <0x70080600 0x100>;  			nvidia,ahub-cif-ids = <7 7>; -			status = "disable"; +			status = "disabled";  		};  		tegra_i2s4: i2s@70080700 {  			compatible = "nvidia,tegra30-i2s";  			reg = <0x70080700 0x100>;  			nvidia,ahub-cif-ids = <8 8>; -			status = "disable"; +			status = "disabled";  		};  	}; @@ -237,28 +243,28 @@  		compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";  		reg = <0x78000000 0x200>;  		interrupts = <0 14 0x04>; -		status = "disable"; +		status = "disabled";  	};  	sdhci@78000200 {  		compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";  		reg = <0x78000200 0x200>;  		interrupts = <0 15 0x04>; -		status = "disable"; +		status = "disabled";  	};  	sdhci@78000400 {  		compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";  		reg = <0x78000400 0x200>;  		interrupts = <0 19 0x04>; -		status = "disable"; +		status = "disabled";  	};  	sdhci@78000600 {  		compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";  		reg = <0x78000600 0x200>;  		interrupts = <0 31 0x04>; -		status = "disable"; +		status = "disabled";  	};  	pmu { diff --git a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi index 16076e2d093..d8a827bd2bf 100644 --- a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi +++ b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi @@ -55,6 +55,8 @@  			reg-io-width = <4>;  			smsc,irq-active-high;  			smsc,irq-push-pull; +			vdd33a-supply = <&v2m_fixed_3v3>; +			vddvario-supply = <&v2m_fixed_3v3>;  		};  		usb@2,03000000 { @@ -157,6 +159,7 @@  			v2m_timer23: timer@120000 {  				compatible = "arm,sp804", "arm,primecell";  				reg = <0x120000 0x1000>; +				interrupts = <3>;  			};  			/* DVI I2C bus */ @@ -197,5 +200,13 @@  				interrupts = <14>;  			};  		}; + +		v2m_fixed_3v3: fixedregulator@0 { +			compatible = "regulator-fixed"; +			regulator-name = "3V3"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			regulator-always-on; +		};  	};  }; diff --git a/arch/arm/boot/dts/vexpress-v2m.dtsi b/arch/arm/boot/dts/vexpress-v2m.dtsi index a6c9c7c82d5..dba53fd026b 100644 --- a/arch/arm/boot/dts/vexpress-v2m.dtsi +++ b/arch/arm/boot/dts/vexpress-v2m.dtsi @@ -54,6 +54,8 @@  			reg-io-width = <4>;  			smsc,irq-active-high;  			smsc,irq-push-pull; +			vdd33a-supply = <&v2m_fixed_3v3>; +			vddvario-supply = <&v2m_fixed_3v3>;  		};  		usb@3,03000000 { @@ -156,6 +158,7 @@  			v2m_timer23: timer@12000 {  				compatible = "arm,sp804", "arm,primecell";  				reg = <0x12000 0x1000>; +				interrupts = <3>;  			};  			/* DVI I2C bus */ @@ -196,5 +199,13 @@  				interrupts = <14>;  			};  		}; + +		v2m_fixed_3v3: fixedregulator@0 { +			compatible = "regulator-fixed"; +			regulator-name = "3V3"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			regulator-always-on; +		};  	};  }; diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts index 7e1091d91af..d12b34ca056 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts @@ -14,8 +14,8 @@  	arm,hbi = <0x237>;  	compatible = "arm,vexpress,v2p-ca15,tc1", "arm,vexpress,v2p-ca15", "arm,vexpress";  	interrupt-parent = <&gic>; -	#address-cells = <1>; -	#size-cells = <1>; +	#address-cells = <2>; +	#size-cells = <2>;  	chosen { }; @@ -47,23 +47,23 @@  	memory@80000000 {  		device_type = "memory"; -		reg = <0x80000000 0x40000000>; +		reg = <0 0x80000000 0 0x40000000>;  	};  	hdlcd@2b000000 {  		compatible = "arm,hdlcd"; -		reg = <0x2b000000 0x1000>; +		reg = <0 0x2b000000 0 0x1000>;  		interrupts = <0 85 4>;  	};  	memory-controller@2b0a0000 {  		compatible = "arm,pl341", "arm,primecell"; -		reg = <0x2b0a0000 0x1000>; +		reg = <0 0x2b0a0000 0 0x1000>;  	};  	wdt@2b060000 {  		compatible = "arm,sp805", "arm,primecell"; -		reg = <0x2b060000 0x1000>; +		reg = <0 0x2b060000 0 0x1000>;  		interrupts = <98>;  	}; @@ -72,23 +72,23 @@  		#interrupt-cells = <3>;  		#address-cells = <0>;  		interrupt-controller; -		reg = <0x2c001000 0x1000>, -		      <0x2c002000 0x1000>, -		      <0x2c004000 0x2000>, -		      <0x2c006000 0x2000>; +		reg = <0 0x2c001000 0 0x1000>, +		      <0 0x2c002000 0 0x1000>, +		      <0 0x2c004000 0 0x2000>, +		      <0 0x2c006000 0 0x2000>;  		interrupts = <1 9 0xf04>;  	};  	memory-controller@7ffd0000 {  		compatible = "arm,pl354", "arm,primecell"; -		reg = <0x7ffd0000 0x1000>; +		reg = <0 0x7ffd0000 0 0x1000>;  		interrupts = <0 86 4>,  			     <0 87 4>;  	};  	dma@7ffb0000 {  		compatible = "arm,pl330", "arm,primecell"; -		reg = <0x7ffb0000 0x1000>; +		reg = <0 0x7ffb0000 0 0x1000>;  		interrupts = <0 92 4>,  			     <0 88 4>,  			     <0 89 4>, @@ -111,12 +111,12 @@  	};  	motherboard { -		ranges = <0 0 0x08000000 0x04000000>, -			 <1 0 0x14000000 0x04000000>, -			 <2 0 0x18000000 0x04000000>, -			 <3 0 0x1c000000 0x04000000>, -			 <4 0 0x0c000000 0x04000000>, -			 <5 0 0x10000000 0x04000000>; +		ranges = <0 0 0 0x08000000 0x04000000>, +			 <1 0 0 0x14000000 0x04000000>, +			 <2 0 0 0x18000000 0x04000000>, +			 <3 0 0 0x1c000000 0x04000000>, +			 <4 0 0 0x0c000000 0x04000000>, +			 <5 0 0 0x10000000 0x04000000>;  		interrupt-map-mask = <0 0 63>;  		interrupt-map = <0 0  0 &gic 0  0 4>, diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts new file mode 100644 index 00000000000..4890a81c546 --- /dev/null +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts @@ -0,0 +1,188 @@ +/* + * ARM Ltd. Versatile Express + * + * CoreTile Express A15x2 A7x3 + * Cortex-A15_A7 MPCore (V2P-CA15_A7) + * + * HBI-0249A + */ + +/dts-v1/; + +/ { +	model = "V2P-CA15_CA7"; +	arm,hbi = <0x249>; +	compatible = "arm,vexpress,v2p-ca15_a7", "arm,vexpress"; +	interrupt-parent = <&gic>; +	#address-cells = <2>; +	#size-cells = <2>; + +	chosen { }; + +	aliases { +		serial0 = &v2m_serial0; +		serial1 = &v2m_serial1; +		serial2 = &v2m_serial2; +		serial3 = &v2m_serial3; +		i2c0 = &v2m_i2c_dvi; +		i2c1 = &v2m_i2c_pcie; +	}; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu0: cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a15"; +			reg = <0>; +		}; + +		cpu1: cpu@1 { +			device_type = "cpu"; +			compatible = "arm,cortex-a15"; +			reg = <1>; +		}; + +/* A7s disabled till big.LITTLE patches are available... +		cpu2: cpu@2 { +			device_type = "cpu"; +			compatible = "arm,cortex-a7"; +			reg = <0x100>; +		}; + +		cpu3: cpu@3 { +			device_type = "cpu"; +			compatible = "arm,cortex-a7"; +			reg = <0x101>; +		}; + +		cpu4: cpu@4 { +			device_type = "cpu"; +			compatible = "arm,cortex-a7"; +			reg = <0x102>; +		}; +*/ +	}; + +	memory@80000000 { +		device_type = "memory"; +		reg = <0 0x80000000 0 0x40000000>; +	}; + +	wdt@2a490000 { +		compatible = "arm,sp805", "arm,primecell"; +		reg = <0 0x2a490000 0 0x1000>; +		interrupts = <98>; +	}; + +	hdlcd@2b000000 { +		compatible = "arm,hdlcd"; +		reg = <0 0x2b000000 0 0x1000>; +		interrupts = <0 85 4>; +	}; + +	memory-controller@2b0a0000 { +		compatible = "arm,pl341", "arm,primecell"; +		reg = <0 0x2b0a0000 0 0x1000>; +	}; + +	gic: interrupt-controller@2c001000 { +		compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		#address-cells = <0>; +		interrupt-controller; +		reg = <0 0x2c001000 0 0x1000>, +		      <0 0x2c002000 0 0x1000>, +		      <0 0x2c004000 0 0x2000>, +		      <0 0x2c006000 0 0x2000>; +		interrupts = <1 9 0xf04>; +	}; + +	memory-controller@7ffd0000 { +		compatible = "arm,pl354", "arm,primecell"; +		reg = <0 0x7ffd0000 0 0x1000>; +		interrupts = <0 86 4>, +			     <0 87 4>; +	}; + +	dma@7ff00000 { +		compatible = "arm,pl330", "arm,primecell"; +		reg = <0 0x7ff00000 0 0x1000>; +		interrupts = <0 92 4>, +			     <0 88 4>, +			     <0 89 4>, +			     <0 90 4>, +			     <0 91 4>; +	}; + +	timer { +		compatible = "arm,armv7-timer"; +		interrupts = <1 13 0xf08>, +			     <1 14 0xf08>, +			     <1 11 0xf08>, +			     <1 10 0xf08>; +	}; + +	pmu { +		compatible = "arm,cortex-a15-pmu", "arm,cortex-a9-pmu"; +		interrupts = <0 68 4>, +			     <0 69 4>; +	}; + +	motherboard { +		ranges = <0 0 0 0x08000000 0x04000000>, +			 <1 0 0 0x14000000 0x04000000>, +			 <2 0 0 0x18000000 0x04000000>, +			 <3 0 0 0x1c000000 0x04000000>, +			 <4 0 0 0x0c000000 0x04000000>, +			 <5 0 0 0x10000000 0x04000000>; + +		interrupt-map-mask = <0 0 63>; +		interrupt-map = <0 0  0 &gic 0  0 4>, +				<0 0  1 &gic 0  1 4>, +				<0 0  2 &gic 0  2 4>, +				<0 0  3 &gic 0  3 4>, +				<0 0  4 &gic 0  4 4>, +				<0 0  5 &gic 0  5 4>, +				<0 0  6 &gic 0  6 4>, +				<0 0  7 &gic 0  7 4>, +				<0 0  8 &gic 0  8 4>, +				<0 0  9 &gic 0  9 4>, +				<0 0 10 &gic 0 10 4>, +				<0 0 11 &gic 0 11 4>, +				<0 0 12 &gic 0 12 4>, +				<0 0 13 &gic 0 13 4>, +				<0 0 14 &gic 0 14 4>, +				<0 0 15 &gic 0 15 4>, +				<0 0 16 &gic 0 16 4>, +				<0 0 17 &gic 0 17 4>, +				<0 0 18 &gic 0 18 4>, +				<0 0 19 &gic 0 19 4>, +				<0 0 20 &gic 0 20 4>, +				<0 0 21 &gic 0 21 4>, +				<0 0 22 &gic 0 22 4>, +				<0 0 23 &gic 0 23 4>, +				<0 0 24 &gic 0 24 4>, +				<0 0 25 &gic 0 25 4>, +				<0 0 26 &gic 0 26 4>, +				<0 0 27 &gic 0 27 4>, +				<0 0 28 &gic 0 28 4>, +				<0 0 29 &gic 0 29 4>, +				<0 0 30 &gic 0 30 4>, +				<0 0 31 &gic 0 31 4>, +				<0 0 32 &gic 0 32 4>, +				<0 0 33 &gic 0 33 4>, +				<0 0 34 &gic 0 34 4>, +				<0 0 35 &gic 0 35 4>, +				<0 0 36 &gic 0 36 4>, +				<0 0 37 &gic 0 37 4>, +				<0 0 38 &gic 0 38 4>, +				<0 0 39 &gic 0 39 4>, +				<0 0 40 &gic 0 40 4>, +				<0 0 41 &gic 0 41 4>, +				<0 0 42 &gic 0 42 4>; +	}; +}; + +/include/ "vexpress-v2m-rs1.dtsi" diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index aa07f5938f0..1143c4d5c56 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c @@ -452,6 +452,7 @@ static struct dma_map_ops dmabounce_ops = {  	.alloc			= arm_dma_alloc,  	.free			= arm_dma_free,  	.mmap			= arm_dma_mmap, +	.get_sgtable		= arm_dma_get_sgtable,  	.map_page		= dmabounce_map_page,  	.unmap_page		= dmabounce_unmap_page,  	.sync_single_for_cpu	= dmabounce_sync_for_cpu, diff --git a/arch/arm/configs/armadillo800eva_defconfig b/arch/arm/configs/armadillo800eva_defconfig index ddc9fe6a78a..7d8718468e0 100644 --- a/arch/arm/configs/armadillo800eva_defconfig +++ b/arch/arm/configs/armadillo800eva_defconfig @@ -5,10 +5,7 @@ CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=16  # CONFIG_UTS_NS is not set  # CONFIG_IPC_NS is not set -# CONFIG_USER_NS is not set  # CONFIG_PID_NS is not set -CONFIG_SYSFS_DEPRECATED=y -CONFIG_SYSFS_DEPRECATED_V2=y  CONFIG_CC_OPTIMIZE_FOR_SIZE=y  CONFIG_SLAB=y  CONFIG_MODULES=y @@ -21,7 +18,7 @@ CONFIG_ARCH_SHMOBILE=y  CONFIG_ARCH_R8A7740=y  CONFIG_MACH_ARMADILLO800EVA=y  # CONFIG_SH_TIMER_TMU is not set -# CONFIG_ARM_THUMB is not set +CONFIG_ARM_THUMB=y  CONFIG_CPU_BPREDICT_DISABLE=y  # CONFIG_CACHE_L2X0 is not set  CONFIG_ARM_ERRATA_430973=y @@ -39,6 +36,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0  CONFIG_CMDLINE="console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096"  CONFIG_CMDLINE_FORCE=y  CONFIG_KEXEC=y +CONFIG_VFP=y  # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  # CONFIG_SUSPEND is not set  CONFIG_NET=y @@ -89,26 +87,32 @@ CONFIG_SERIAL_SH_SCI_CONSOLE=y  CONFIG_I2C=y  CONFIG_I2C_SH_MOBILE=y  # CONFIG_HWMON is not set +CONFIG_MEDIA_SUPPORT=y +CONFIG_VIDEO_DEV=y +# CONFIG_RC_CORE is not set +# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set +# CONFIG_V4L_USB_DRIVERS is not set +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_MT9T112=y +CONFIG_VIDEO_SH_MOBILE_CEU=y +# CONFIG_RADIO_ADAPTERS is not set  CONFIG_FB=y -CONFIG_FB_MODE_HELPERS=y  CONFIG_FB_SH_MOBILE_LCDC=y +CONFIG_FB_SH_MOBILE_HDMI=y  CONFIG_LCD_CLASS_DEVICE=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y  CONFIG_LOGO=y  # CONFIG_LOGO_LINUX_MONO is not set  # CONFIG_LOGO_LINUX_VGA16 is not set -CONFIG_SOUND=y -CONFIG_SND=y  # CONFIG_SND_SUPPORT_OLD_API is not set  # CONFIG_SND_VERBOSE_PROCFS is not set  # CONFIG_SND_DRIVERS is not set  # CONFIG_SND_ARM is not set -CONFIG_SND_SOC=y  CONFIG_SND_SOC_SH4_FSI=y  # CONFIG_HID_SUPPORT is not set  CONFIG_USB=y -# CONFIG_USB_DEVICE_CLASS is not set  CONFIG_USB_RENESAS_USBHS=y  CONFIG_USB_GADGET=y  CONFIG_USB_RENESAS_USBHS_UDC=y @@ -116,6 +120,8 @@ CONFIG_USB_ETH=m  CONFIG_MMC=y  CONFIG_MMC_SDHI=y  CONFIG_MMC_SH_MMCIF=y +CONFIG_DMADEVICES=y +CONFIG_SH_DMAE=y  CONFIG_UIO=y  CONFIG_UIO_PDRV_GENIRQ=y  # CONFIG_DNOTIFY is not set @@ -124,7 +130,6 @@ CONFIG_VFAT_FS=y  CONFIG_TMPFS=y  # CONFIG_MISC_FILESYSTEMS is not set  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V3_ACL=y  CONFIG_NFS_V4=y  CONFIG_NFS_V4_1=y diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig new file mode 100644 index 00000000000..e40b435d204 --- /dev/null +++ b/arch/arm/configs/exynos_defconfig @@ -0,0 +1,92 @@ +CONFIG_EXPERIMENTAL=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_KALLSYMS_ALL=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_BLK_DEV_BSG is not set +CONFIG_PARTITION_ADVANCED=y +CONFIG_EFI_PARTITION=y +CONFIG_ARCH_EXYNOS=y +CONFIG_S3C_LOWLEVEL_UART_PORT=1 +CONFIG_S3C24XX_PWM=y +CONFIG_ARCH_EXYNOS5=y +CONFIG_MACH_EXYNOS4_DT=y +CONFIG_MACH_EXYNOS5_DT=y +CONFIG_SMP=y +CONFIG_NR_CPUS=2 +CONFIG_PREEMPT=y +CONFIG_AEABI=y +CONFIG_ARM_APPENDED_DTB=y +CONFIG_ARM_ATAG_DTB_COMPAT=y +CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M" +CONFIG_VFP=y +CONFIG_NEON=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_RFKILL_REGULATOR=y +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_PROC_DEVICETREE=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_NETDEVICES=y +CONFIG_SMSC911X=y +CONFIG_USB_USBNET=y +CONFIG_USB_NET_SMSC75XX=y +CONFIG_USB_NET_SMSC95XX=y +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_SAMSUNG=y +CONFIG_SERIAL_SAMSUNG_CONSOLE=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_HW_RANDOM=y +CONFIG_I2C=y +# CONFIG_HWMON is not set +CONFIG_MFD_TPS65090=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_TPS65090=y +CONFIG_FB=y +CONFIG_EXYNOS_VIDEO=y +CONFIG_EXYNOS_MIPI_DSI=y +CONFIG_EXYNOS_DP=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FONTS=y +CONFIG_FONT_7x14=y +CONFIG_LOGO=y +CONFIG_USB=y +CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT4_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_CRAMFS=y +CONFIG_ROMFS_FS=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_KERNEL=y +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEBUG_RT_MUTEXES=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_MUTEXES=y +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_USER=y +CONFIG_DEBUG_LL=y +CONFIG_EARLY_PRINTK=y +CONFIG_CRC_CCITT=y diff --git a/arch/arm/configs/imx_v4_v5_defconfig b/arch/arm/configs/imx_v4_v5_defconfig index e05a2f1665a..78ed575feb1 100644 --- a/arch/arm/configs/imx_v4_v5_defconfig +++ b/arch/arm/configs/imx_v4_v5_defconfig @@ -2,7 +2,10 @@ CONFIG_EXPERIMENTAL=y  # CONFIG_SWAP is not set  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y  CONFIG_LOG_BUF_SHIFT=14 +CONFIG_CGROUPS=y  CONFIG_EXPERT=y  # CONFIG_COMPAT_BRK is not set  CONFIG_SLAB=y @@ -36,8 +39,6 @@ CONFIG_MACH_IMX27IPCAM=y  CONFIG_MACH_IMX27_DT=y  CONFIG_MXC_IRQ_PRIOR=y  CONFIG_MXC_PWM=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y  CONFIG_PREEMPT=y  CONFIG_AEABI=y  CONFIG_ZBOOT_ROM_TEXT=0x0 @@ -46,7 +47,6 @@ CONFIG_FPE_NWFPE=y  CONFIG_FPE_NWFPE_XP=y  CONFIG_PM_DEBUG=y  CONFIG_NET=y -CONFIG_SMSC911X=y  CONFIG_PACKET=y  CONFIG_UNIX=y  CONFIG_INET=y @@ -70,31 +70,31 @@ CONFIG_MTD_CFI=y  CONFIG_MTD_CFI_ADV_OPTIONS=y  CONFIG_MTD_CFI_GEOMETRY=y  # CONFIG_MTD_MAP_BANK_WIDTH_1 is not set -CONFIG_MTD_MAP_BANK_WIDTH_4=y  # CONFIG_MTD_CFI_I2 is not set  CONFIG_MTD_CFI_INTELEXT=y  CONFIG_MTD_PHYSMAP=y  CONFIG_MTD_NAND=y  CONFIG_MTD_NAND_MXC=y  CONFIG_MTD_UBI=y -CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_AT24=y  CONFIG_EEPROM_AT25=y +CONFIG_ATA=y +CONFIG_PATA_IMX=y  CONFIG_NETDEVICES=y  CONFIG_CS89x0=y  CONFIG_CS89x0_PLATFORM=y  CONFIG_DM9000=y  CONFIG_SMC91X=y  CONFIG_SMC911X=y +CONFIG_SMSC911X=y  CONFIG_SMSC_PHY=y  # CONFIG_INPUT_MOUSEDEV is not set  CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_KEYBOARD is not set +CONFIG_KEYBOARD_IMX=y  # CONFIG_INPUT_MOUSE is not set  CONFIG_INPUT_TOUCHSCREEN=y  CONFIG_TOUCHSCREEN_ADS7846=m -CONFIG_TOUCHSCREEN_MC13783=m -# CONFIG_SERIO is not set +CONFIG_TOUCHSCREEN_MC13783=y  # CONFIG_LEGACY_PTYS is not set  CONFIG_SERIAL_8250=m  CONFIG_SERIAL_IMX=y @@ -113,31 +113,23 @@ CONFIG_HWMON=m  CONFIG_SENSORS_MC13783_ADC=m  CONFIG_WATCHDOG=y  CONFIG_IMX2_WDT=y -CONFIG_MFD_MC13XXX=y +CONFIG_MFD_MC13XXX_SPI=y  CONFIG_REGULATOR=y  CONFIG_REGULATOR_FIXED_VOLTAGE=y  CONFIG_REGULATOR_MC13783=y  CONFIG_REGULATOR_MC13892=y -CONFIG_FB=y -CONFIG_FB_IMX=y -CONFIG_BACKLIGHT_LCD_SUPPORT=y -CONFIG_LCD_CLASS_DEVICE=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_LCD_L4F00242T03=y  CONFIG_MEDIA_SUPPORT=y  CONFIG_VIDEO_DEV=y -CONFIG_VIDEO_V4L2_COMMON=y -CONFIG_VIDEO_MEDIA=y -CONFIG_VIDEO_V4L2=y -CONFIG_VIDEOBUF_GEN=y -CONFIG_VIDEOBUF_DMA_CONTIG=y -CONFIG_VIDEOBUF2_CORE=y -CONFIG_VIDEO_CAPTURE_DRIVERS=y  CONFIG_V4L_PLATFORM_DRIVERS=y  CONFIG_SOC_CAMERA=y  CONFIG_SOC_CAMERA_OV2640=y -CONFIG_VIDEO_MX2_HOSTSUPPORT=y  CONFIG_VIDEO_MX2=y +CONFIG_FB=y +CONFIG_FB_IMX=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_LCD_L4F00242T03=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y  CONFIG_BACKLIGHT_PWM=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_FONTS=y @@ -152,13 +144,17 @@ CONFIG_SND_IMX_SOC=y  CONFIG_SND_SOC_MX27VIS_AIC32X4=y  CONFIG_SND_SOC_PHYCORE_AC97=y  CONFIG_SND_SOC_EUKREA_TLV320=y +CONFIG_SND_SOC_IMX_SGTL5000=y +CONFIG_SND_SOC_IMX_MC13783=y  CONFIG_USB_HID=m  CONFIG_USB=y -# CONFIG_USB_DEVICE_CLASS is not set  CONFIG_USB_EHCI_HCD=y  CONFIG_USB_EHCI_MXC=y  CONFIG_USB_ULPI=y  CONFIG_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_ESDHC_IMX=y  CONFIG_MMC_MXC=y  CONFIG_NEW_LEDS=y  CONFIG_LEDS_CLASS=y @@ -173,22 +169,25 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=y  CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_PCF8563=y  CONFIG_RTC_DRV_IMXDI=y +CONFIG_RTC_DRV_MC13XXX=y  CONFIG_RTC_DRV_MXC=y  CONFIG_DMADEVICES=y  CONFIG_IMX_SDMA=y  CONFIG_IMX_DMA=y +CONFIG_COMMON_CLK_DEBUG=y  # CONFIG_IOMMU_SUPPORT is not set +CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT4_FS=y  # CONFIG_DNOTIFY is not set  # CONFIG_PROC_PAGE_MONITOR is not set  CONFIG_TMPFS=y  CONFIG_JFFS2_FS=y  CONFIG_UBIFS_FS=y  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_ROOT_NFS=y  CONFIG_NLS_CODEPAGE_437=m  CONFIG_NLS_CODEPAGE_850=m  CONFIG_NLS_ISO8859_1=y  CONFIG_NLS_ISO8859_15=m -CONFIG_SYSCTL_SYSCALL_CHECK=y  # CONFIG_CRYPTO_ANSI_CPRNG is not set diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index b1d3675df72..f725b9637b3 100644 --- a/arch/arm/configs/imx_v6_v7_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig @@ -2,6 +2,8 @@ CONFIG_EXPERIMENTAL=y  # CONFIG_LOCALVERSION_AUTO is not set  CONFIG_KERNEL_LZO=y  CONFIG_SYSVIPC=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y  CONFIG_LOG_BUF_SHIFT=18  CONFIG_CGROUPS=y  CONFIG_RELAY=y @@ -29,15 +31,12 @@ CONFIG_MACH_MX35_3DS=y  CONFIG_MACH_VPR200=y  CONFIG_MACH_IMX51_DT=y  CONFIG_MACH_MX51_3DS=y -CONFIG_MACH_EUKREA_CPUIMX51=y  CONFIG_MACH_EUKREA_CPUIMX51SD=y  CONFIG_MACH_MX51_EFIKAMX=y  CONFIG_MACH_MX51_EFIKASB=y  CONFIG_MACH_IMX53_DT=y  CONFIG_SOC_IMX6Q=y  CONFIG_MXC_PWM=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y  CONFIG_SMP=y  CONFIG_VMSPLIT_2G=y  CONFIG_PREEMPT_VOLUNTARY=y @@ -64,17 +63,29 @@ CONFIG_IPV6=y  # CONFIG_WIRELESS is not set  CONFIG_DEVTMPFS=y  CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_STANDALONE is not set +CONFIG_CONNECTOR=y  CONFIG_MTD=y -CONFIG_MTD_OF_PARTS=y +CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_STAA=y  CONFIG_MTD_DATAFLASH=y  CONFIG_MTD_M25P80=y  CONFIG_MTD_SST25L=y -# CONFIG_STANDALONE is not set -CONFIG_CONNECTOR=y +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_GPMI_NAND=y +CONFIG_MTD_NAND_MXC=y +CONFIG_MTD_UBI=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_EEPROM_AT24=y +CONFIG_EEPROM_AT25=y  # CONFIG_SCSI_PROC_FS is not set  CONFIG_BLK_DEV_SD=y  CONFIG_SCSI_MULTI_LUN=y @@ -105,8 +116,11 @@ CONFIG_SMSC911X=y  CONFIG_INPUT_EVDEV=y  CONFIG_INPUT_EVBUG=m  CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_IMX=y  CONFIG_MOUSE_PS2=m  CONFIG_MOUSE_PS2_ELANTECH=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_MC13783=y  CONFIG_INPUT_MISC=y  CONFIG_INPUT_MMA8450=y  CONFIG_SERIO_SERPORT=m @@ -116,6 +130,7 @@ CONFIG_VT_HW_CONSOLE_BINDING=y  CONFIG_SERIAL_IMX=y  CONFIG_SERIAL_IMX_CONSOLE=y  CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MXC_RNGA=y  CONFIG_I2C=y  # CONFIG_I2C_COMPAT is not set  CONFIG_I2C_CHARDEV=y @@ -130,42 +145,37 @@ CONFIG_GPIO_SYSFS=y  # CONFIG_HWMON is not set  CONFIG_WATCHDOG=y  CONFIG_IMX2_WDT=y -CONFIG_MFD_MC13XXX=y +CONFIG_MFD_MC13XXX_SPI=y +CONFIG_MFD_MC13XXX_I2C=y  CONFIG_REGULATOR=y  CONFIG_REGULATOR_FIXED_VOLTAGE=y  CONFIG_REGULATOR_MC13783=y  CONFIG_REGULATOR_MC13892=y  CONFIG_MEDIA_SUPPORT=y -CONFIG_VIDEO_V4L2=y  CONFIG_VIDEO_DEV=y -CONFIG_VIDEO_V4L2_COMMON=y -CONFIG_VIDEOBUF_GEN=y -CONFIG_VIDEOBUF2_CORE=y -CONFIG_VIDEOBUF2_MEMOPS=y -CONFIG_VIDEOBUF2_DMA_CONTIG=y -CONFIG_VIDEO_CAPTURE_DRIVERS=y  CONFIG_V4L_PLATFORM_DRIVERS=y  CONFIG_SOC_CAMERA=y  CONFIG_SOC_CAMERA_OV2640=y -CONFIG_MX3_VIDEO=y  CONFIG_VIDEO_MX3=y  CONFIG_FB=y -CONFIG_FB_MX3=y  CONFIG_BACKLIGHT_LCD_SUPPORT=y  CONFIG_LCD_CLASS_DEVICE=y  CONFIG_LCD_L4F00242T03=y  CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BACKLIGHT_GENERIC=y -CONFIG_DUMMY_CONSOLE=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y  CONFIG_FONTS=y  CONFIG_FONT_8x8=y  CONFIG_FONT_8x16=y  CONFIG_LOGO=y -CONFIG_LOGO_LINUX_MONO=y -CONFIG_LOGO_LINUX_VGA16=y -CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_SOC=y +CONFIG_SND_IMX_SOC=y +CONFIG_SND_SOC_PHYCORE_AC97=y +CONFIG_SND_SOC_EUKREA_TLV320=y +CONFIG_SND_SOC_IMX_SGTL5000=y +CONFIG_SND_SOC_IMX_MC13783=y  CONFIG_USB=y  CONFIG_USB_EHCI_HCD=y  CONFIG_USB_EHCI_MXC=y @@ -178,9 +188,12 @@ CONFIG_NEW_LEDS=y  CONFIG_LEDS_CLASS=y  CONFIG_RTC_CLASS=y  CONFIG_RTC_INTF_DEV_UIE_EMUL=y +CONFIG_RTC_DRV_MC13XXX=y  CONFIG_RTC_DRV_MXC=y  CONFIG_DMADEVICES=y  CONFIG_IMX_SDMA=y +CONFIG_COMMON_CLK_DEBUG=y +# CONFIG_IOMMU_SUPPORT is not set  CONFIG_EXT2_FS=y  CONFIG_EXT2_FS_XATTR=y  CONFIG_EXT2_FS_POSIX_ACL=y @@ -204,8 +217,9 @@ CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=y  CONFIG_TMPFS=y  CONFIG_CONFIGFS_FS=m +CONFIG_JFFS2_FS=y +CONFIG_UBIFS_FS=y  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V3_ACL=y  CONFIG_NFS_V4=y  CONFIG_ROOT_NFS=y @@ -216,14 +230,11 @@ CONFIG_NLS_ISO8859_1=y  CONFIG_NLS_ISO8859_15=m  CONFIG_NLS_UTF8=y  CONFIG_MAGIC_SYSRQ=y -CONFIG_DEBUG_FS=y  # CONFIG_SCHED_DEBUG is not set  # CONFIG_DEBUG_BUGVERBOSE is not set  # CONFIG_FTRACE is not set  # CONFIG_ARM_UNWIND is not set  CONFIG_SECURITYFS=y -CONFIG_CRYPTO_DEFLATE=m -CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set  # CONFIG_CRYPTO_HW is not set  CONFIG_CRC_CCITT=m diff --git a/arch/arm/configs/kzm9d_defconfig b/arch/arm/configs/kzm9d_defconfig new file mode 100644 index 00000000000..26146ffea1a --- /dev/null +++ b/arch/arm/configs/kzm9d_defconfig @@ -0,0 +1,89 @@ +# CONFIG_ARM_PATCH_PHYS_VIRT is not set +CONFIG_EXPERIMENTAL=y +CONFIG_SYSVIPC=y +CONFIG_NO_HZ=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=16 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_EMBEDDED=y +CONFIG_SLAB=y +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_ARCH_SHMOBILE=y +CONFIG_ARCH_EMEV2=y +CONFIG_MACH_KZM9D=y +CONFIG_MEMORY_START=0x40000000 +CONFIG_MEMORY_SIZE=0x10000000 +# CONFIG_SH_TIMER_TMU is not set +# CONFIG_SWP_EMULATE is not set +# CONFIG_CACHE_L2X0 is not set +CONFIG_SMP=y +CONFIG_NR_CPUS=2 +CONFIG_HOTPLUG_CPU=y +# CONFIG_LOCAL_TIMERS is not set +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +# CONFIG_CROSS_MEMORY_ATTACH is not set +CONFIG_FORCE_MAX_ZONEORDER=13 +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_ARM_APPENDED_DTB=y +CONFIG_CMDLINE="console=tty0 console=ttyS1,115200n81 earlyprintk=serial8250-em.1,115200n81 mem=128M@0x40000000 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096" +CONFIG_CMDLINE_FORCE=y +CONFIG_VFP=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_SUSPEND is not set +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +# CONFIG_INET_DIAG is not set +# CONFIG_IPV6 is not set +# CONFIG_WIRELESS is not set +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +# CONFIG_BLK_DEV is not set +CONFIG_NETDEVICES=y +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CIRRUS is not set +# CONFIG_NET_VENDOR_FARADAY is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +CONFIG_SMSC911X=y +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_WLAN is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_SERIO is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_EM=y +# CONFIG_HW_RANDOM is not set +CONFIG_GPIOLIB=y +CONFIG_GPIO_EM=y +# CONFIG_HWMON is not set +# CONFIG_HID_SUPPORT is not set +# CONFIG_USB_SUPPORT is not set +# CONFIG_IOMMU_SUPPORT is not set +# CONFIG_DNOTIFY is not set +CONFIG_TMPFS=y +# CONFIG_MISC_FILESYSTEMS is not set +CONFIG_NFS_FS=y +CONFIG_ROOT_NFS=y +# CONFIG_FTRACE is not set diff --git a/arch/arm/configs/kzm9g_defconfig b/arch/arm/configs/kzm9g_defconfig index e3ebc20ed0a..2388c861062 100644 --- a/arch/arm/configs/kzm9g_defconfig +++ b/arch/arm/configs/kzm9g_defconfig @@ -100,7 +100,12 @@ CONFIG_SND_SOC_SH4_FSI=y  CONFIG_USB=y  CONFIG_USB_DEVICEFS=y  CONFIG_USB_R8A66597_HCD=y +CONFIG_USB_RENESAS_USBHS=y  CONFIG_USB_STORAGE=y +CONFIG_USB_GADGET=y +CONFIG_USB_RENESAS_USBHS_UDC=y +CONFIG_USB_ETH=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_MMC=y  # CONFIG_MMC_BLOCK_BOUNCE is not set  CONFIG_MMC_SDHI=y @@ -108,12 +113,13 @@ CONFIG_MMC_SH_MMCIF=y  CONFIG_NEW_LEDS=y  CONFIG_LEDS_CLASS=y  CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_RS5C372=y  CONFIG_DMADEVICES=y  CONFIG_SH_DMAE=y  CONFIG_ASYNC_TX_DMA=y  CONFIG_STAGING=y  # CONFIG_DNOTIFY is not set -# CONFIG_INOTIFY_USER is not set +CONFIG_INOTIFY_USER=y  CONFIG_VFAT_FS=y  CONFIG_TMPFS=y  # CONFIG_MISC_FILESYSTEMS is not set diff --git a/arch/arm/configs/lpc32xx_defconfig b/arch/arm/configs/lpc32xx_defconfig index 4fa60547494..e42a0e3d4c3 100644 --- a/arch/arm/configs/lpc32xx_defconfig +++ b/arch/arm/configs/lpc32xx_defconfig @@ -1,5 +1,7 @@  CONFIG_EXPERIMENTAL=y  CONFIG_SYSVIPC=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=16 @@ -16,8 +18,7 @@ CONFIG_MODULE_UNLOAD=y  # CONFIG_BLK_DEV_BSG is not set  CONFIG_PARTITION_ADVANCED=y  CONFIG_ARCH_LPC32XX=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y +CONFIG_KEYBOARD_GPIO_POLLED=y  CONFIG_PREEMPT=y  CONFIG_AEABI=y  CONFIG_ZBOOT_ROM_TEXT=0x0 @@ -52,13 +53,17 @@ CONFIG_MTD=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y +CONFIG_MTD_M25P80=y  CONFIG_MTD_NAND=y  CONFIG_MTD_NAND_MUSEUM_IDS=y +CONFIG_MTD_NAND_SLC_LPC32XX=y +CONFIG_MTD_NAND_MLC_LPC32XX=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_COUNT=1  CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_EEPROM_AT24=y  CONFIG_EEPROM_AT25=y  CONFIG_SCSI=y  CONFIG_BLK_DEV_SD=y @@ -79,16 +84,23 @@ CONFIG_LPC_ENET=y  # CONFIG_NET_VENDOR_STMICRO is not set  CONFIG_SMSC_PHY=y  # CONFIG_WLAN is not set +CONFIG_INPUT_MATRIXKMAP=y  # CONFIG_INPUT_MOUSEDEV_PSAUX is not set  CONFIG_INPUT_MOUSEDEV_SCREEN_X=240  CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320  CONFIG_INPUT_EVDEV=y +# CONFIG_KEYBOARD_ATKBD is not set +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_LPC32XX=y  # CONFIG_INPUT_MOUSE is not set  CONFIG_INPUT_TOUCHSCREEN=y  CONFIG_TOUCHSCREEN_LPC32XX=y +CONFIG_SERIO_LIBPS2=y  # CONFIG_LEGACY_PTYS is not set  CONFIG_SERIAL_8250=y  CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_HS_LPC32XX=y +CONFIG_SERIAL_OF_PLATFORM=y  # CONFIG_HW_RANDOM is not set  CONFIG_I2C=y  CONFIG_I2C_CHARDEV=y @@ -96,7 +108,8 @@ CONFIG_I2C_PNX=y  CONFIG_SPI=y  CONFIG_SPI_PL022=y  CONFIG_GPIO_SYSFS=y -# CONFIG_HWMON is not set +CONFIG_SENSORS_DS620=y +CONFIG_SENSORS_MAX6639=y  CONFIG_WATCHDOG=y  CONFIG_PNX4008_WATCHDOG=y  CONFIG_FB=y @@ -133,6 +146,8 @@ CONFIG_MMC=y  CONFIG_MMC_ARMMMCI=y  CONFIG_NEW_LEDS=y  CONFIG_LEDS_CLASS=y +CONFIG_LEDS_PCA9532=y +CONFIG_LEDS_PCA9532_GPIO=y  CONFIG_LEDS_GPIO=y  CONFIG_LEDS_TRIGGERS=y  CONFIG_LEDS_TRIGGER_TIMER=y @@ -146,10 +161,10 @@ CONFIG_RTC_DRV_DS1374=y  CONFIG_RTC_DRV_PCF8563=y  CONFIG_RTC_DRV_LPC32XX=y  CONFIG_DMADEVICES=y -CONFIG_AMBA_PL08X=y  CONFIG_STAGING=y -CONFIG_IIO=y  CONFIG_LPC32XX_ADC=y +CONFIG_MAX517=y +CONFIG_IIO=y  CONFIG_EXT2_FS=y  CONFIG_AUTOFS4_FS=y  CONFIG_MSDOS_FS=y @@ -159,7 +174,6 @@ CONFIG_JFFS2_FS=y  CONFIG_JFFS2_FS_WBUF_VERIFY=y  CONFIG_CRAMFS=y  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_ROOT_NFS=y  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_ASCII=y diff --git a/arch/arm/configs/mvebu_defconfig b/arch/arm/configs/mvebu_defconfig new file mode 100644 index 00000000000..2e86b31c33c --- /dev/null +++ b/arch/arm/configs/mvebu_defconfig @@ -0,0 +1,46 @@ +CONFIG_EXPERIMENTAL=y +CONFIG_SYSVIPC=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_BLK_DEV_INITRD=y +CONFIG_EXPERT=y +CONFIG_SLAB=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_ARCH_MVEBU=y +CONFIG_MACH_ARMADA_370_XP=y +CONFIG_AEABI=y +CONFIG_HIGHMEM=y +CONFIG_USE_OF=y +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_ARM_APPENDED_DTB=y +CONFIG_VFP=y +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_FS_XATTR is not set +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_UDF_FS=m +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_850=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_ISO8859_2=y +CONFIG_NLS_UTF8=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_FS=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_TIMER_STATS=y +# CONFIG_DEBUG_BUGVERBOSE is not set +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_USER=y +CONFIG_DEBUG_LL=y +CONFIG_EARLY_PRINTK=y diff --git a/arch/arm/configs/mxs_defconfig b/arch/arm/configs/mxs_defconfig index 5406c23a02e..ccdb6357fb7 100644 --- a/arch/arm/configs/mxs_defconfig +++ b/arch/arm/configs/mxs_defconfig @@ -28,6 +28,7 @@ CONFIG_MACH_MX28EVK=y  CONFIG_MACH_STMP378X_DEVB=y  CONFIG_MACH_TX28=y  CONFIG_MACH_M28EVK=y +CONFIG_MACH_APX4DEVKIT=y  # CONFIG_ARM_THUMB is not set  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y @@ -58,6 +59,9 @@ CONFIG_CAN_FLEXCAN=m  CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set  # CONFIG_BLK_DEV is not set +CONFIG_MTD=y +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_GPMI_NAND=y  CONFIG_NETDEVICES=y  CONFIG_NET_ETHERNET=y  CONFIG_ENC28J60=y @@ -77,6 +81,7 @@ CONFIG_DEVPTS_MULTIPLE_INSTANCES=y  # CONFIG_DEVKMEM is not set  CONFIG_SERIAL_AMBA_PL011=y  CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_MXS_AUART=y  # CONFIG_HW_RANDOM is not set  CONFIG_I2C=y  # CONFIG_I2C_COMPAT is not set @@ -109,8 +114,10 @@ CONFIG_MMC=y  CONFIG_MMC_MXS=y  CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_DS1307=m +CONFIG_RTC_DRV_STMP=y  CONFIG_DMADEVICES=y  CONFIG_MXS_DMA=y +CONFIG_COMMON_CLK_DEBUG=y  CONFIG_EXT3_FS=y  # CONFIG_DNOTIFY is not set  CONFIG_FSCACHE=m diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index 11828e63253..e58edc36b40 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig @@ -193,9 +193,12 @@ CONFIG_MMC_OMAP_HS=y  CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_TWL92330=y  CONFIG_RTC_DRV_TWL4030=y +CONFIG_DMADEVICES=y +CONFIG_DMA_OMAP=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_QUOTA=y  CONFIG_QFMT_V2=y  CONFIG_MSDOS_FS=y @@ -235,3 +238,4 @@ CONFIG_CRC_T10DIF=y  CONFIG_CRC_ITU_T=y  CONFIG_CRC7=y  CONFIG_LIBCRC32C=y +CONFIG_SOC_OMAP5=y diff --git a/arch/arm/configs/socfpga_defconfig b/arch/arm/configs/socfpga_defconfig new file mode 100644 index 00000000000..0ac1293dba1 --- /dev/null +++ b/arch/arm/configs/socfpga_defconfig @@ -0,0 +1,83 @@ +CONFIG_EXPERIMENTAL=y +CONFIG_SYSVIPC=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_CGROUPS=y +CONFIG_CPUSETS=y +CONFIG_NAMESPACES=y +CONFIG_EMBEDDED=y +CONFIG_PROFILING=y +CONFIG_OPROFILE=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_LBDAF is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_ARCH_SOCFPGA=y +CONFIG_MACH_SOCFPGA_CYCLONE5=y +CONFIG_ARM_THUMBEE=y +# CONFIG_CACHE_L2X0 is not set +CONFIG_HIGH_RES_TIMERS=y +CONFIG_VMSPLIT_2G=y +CONFIG_NR_CPUS=2 +CONFIG_AEABI=y +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="" +CONFIG_VFP=y +CONFIG_NEON=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_NET_KEY=y +CONFIG_NET_KEY_MIGRATE=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y +CONFIG_PROC_DEVICETREE=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=2 +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_SCSI=y +# CONFIG_SCSI_PROC_FS is not set +CONFIG_BLK_DEV_SD=y +# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_NETDEVICES=y +CONFIG_STMMAC_ETH=y +# CONFIG_STMMAC_PHY_ID_ZERO_WORKAROUND is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIO_AMBAKMI=y +CONFIG_LEGACY_PTY_COUNT=16 +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=2 +CONFIG_SERIAL_8250_RUNTIME_UARTS=2 +CONFIG_SERIAL_8250_DW=y +# CONFIG_RTC_HCTOSYS is not set +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +# CONFIG_DNOTIFY is not set +# CONFIG_INOTIFY_USER is not set +CONFIG_VFAT_FS=y +CONFIG_NTFS_FS=y +CONFIG_NTFS_RW=y +CONFIG_TMPFS=y +CONFIG_JFFS2_FS=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ISO8859_1=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_DETECT_HUNG_TASK=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_DEBUG_INFO=y +CONFIG_ENABLE_DEFAULT_TRACERS=y +CONFIG_DEBUG_USER=y +CONFIG_XZ_DEC=y diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig index 1198dd61c7c..db2245353f0 100644 --- a/arch/arm/configs/tegra_defconfig +++ b/arch/arm/configs/tegra_defconfig @@ -1,4 +1,6 @@  CONFIG_EXPERIMENTAL=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_CGROUPS=y @@ -25,14 +27,9 @@ CONFIG_ARCH_TEGRA=y  CONFIG_ARCH_TEGRA_2x_SOC=y  CONFIG_ARCH_TEGRA_3x_SOC=y  CONFIG_MACH_HARMONY=y -CONFIG_MACH_KAEN=y  CONFIG_MACH_PAZ00=y  CONFIG_MACH_TRIMSLICE=y -CONFIG_MACH_WARIO=y -CONFIG_MACH_VENTANA=y  CONFIG_TEGRA_EMC_SCALING_ENABLE=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y  CONFIG_SMP=y  CONFIG_PREEMPT=y  CONFIG_AEABI=y @@ -103,19 +100,25 @@ CONFIG_SERIAL_OF_PLATFORM=y  # CONFIG_HW_RANDOM is not set  CONFIG_I2C=y  # CONFIG_I2C_COMPAT is not set +CONFIG_I2C_MUX=y +CONFIG_I2C_MUX_PINCTRL=y  CONFIG_I2C_TEGRA=y  CONFIG_SPI=y  CONFIG_SPI_TEGRA=y +CONFIG_GPIO_TPS65910=y +CONFIG_GPIO_TPS6586X=y  CONFIG_POWER_SUPPLY=y  CONFIG_BATTERY_SBS=y  CONFIG_SENSORS_LM90=y  CONFIG_MFD_TPS6586X=y +CONFIG_MFD_TPS65910=y  CONFIG_REGULATOR=y  CONFIG_REGULATOR_FIXED_VOLTAGE=y  CONFIG_REGULATOR_VIRTUAL_CONSUMER=y  CONFIG_REGULATOR_GPIO=y  CONFIG_REGULATOR_TPS62360=y  CONFIG_REGULATOR_TPS6586X=y +CONFIG_REGULATOR_TPS65910=y  CONFIG_SOUND=y  CONFIG_SND=y  # CONFIG_SND_SUPPORT_OLD_API is not set @@ -126,6 +129,7 @@ CONFIG_SND=y  # CONFIG_SND_USB is not set  CONFIG_SND_SOC=y  CONFIG_SND_SOC_TEGRA=y +CONFIG_SND_SOC_TEGRA_WM8753=y  CONFIG_SND_SOC_TEGRA_WM8903=y  CONFIG_SND_SOC_TEGRA_TRIMSLICE=y  CONFIG_SND_SOC_TEGRA_ALC5632=y diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h index ed2e95d46e2..62e75475e57 100644 --- a/arch/arm/include/asm/arch_timer.h +++ b/arch/arm/include/asm/arch_timer.h @@ -1,7 +1,10 @@  #ifndef __ASMARM_ARCH_TIMER_H  #define __ASMARM_ARCH_TIMER_H +#include <asm/errno.h> +  #ifdef CONFIG_ARM_ARCH_TIMER +#define ARCH_HAS_READ_CURRENT_TIMER  int arch_timer_of_register(void);  int arch_timer_sched_clock_init(void);  #else diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 004c1bc95d2..e4448e16046 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h @@ -215,7 +215,9 @@ static inline void vivt_flush_cache_mm(struct mm_struct *mm)  static inline void  vivt_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)  { -	if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) +	struct mm_struct *mm = vma->vm_mm; + +	if (!mm || cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm)))  		__cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),  					vma->vm_flags);  } @@ -223,7 +225,9 @@ vivt_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned  static inline void  vivt_flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn)  { -	if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { +	struct mm_struct *mm = vma->vm_mm; + +	if (!mm || cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) {  		unsigned long addr = user_addr & PAGE_MASK;  		__cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);  	} diff --git a/arch/arm/include/asm/delay.h b/arch/arm/include/asm/delay.h index b2deda18154..dc6145120de 100644 --- a/arch/arm/include/asm/delay.h +++ b/arch/arm/include/asm/delay.h @@ -6,9 +6,22 @@  #ifndef __ASM_ARM_DELAY_H  #define __ASM_ARM_DELAY_H +#include <asm/memory.h>  #include <asm/param.h>	/* HZ */ -extern void __delay(int loops); +#define MAX_UDELAY_MS	2 +#define UDELAY_MULT	((UL(2199023) * HZ) >> 11) +#define UDELAY_SHIFT	30 + +#ifndef __ASSEMBLY__ + +extern struct arm_delay_ops { +	void (*delay)(unsigned long); +	void (*const_udelay)(unsigned long); +	void (*udelay)(unsigned long); +} arm_delay_ops; + +#define __delay(n)		arm_delay_ops.delay(n)  /*   * This function intentionally does not exist; if you see references to @@ -23,22 +36,27 @@ extern void __bad_udelay(void);   * division by multiplication: you don't have to worry about   * loss of precision.   * - * Use only for very small delays ( < 1 msec).  Should probably use a + * Use only for very small delays ( < 2 msec).  Should probably use a   * lookup table, really, as the multiplications take much too long with   * short delays.  This is a "reasonable" implementation, though (and the   * first constant multiplications gets optimized away if the delay is   * a constant)   */ -extern void __udelay(unsigned long usecs); -extern void __const_udelay(unsigned long); - -#define MAX_UDELAY_MS 2 +#define __udelay(n)		arm_delay_ops.udelay(n) +#define __const_udelay(n)	arm_delay_ops.const_udelay(n)  #define udelay(n)							\  	(__builtin_constant_p(n) ?					\  	  ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() :		\ -			__const_udelay((n) * ((2199023U*HZ)>>11))) :	\ +			__const_udelay((n) * UDELAY_MULT)) :		\  	  __udelay(n)) +/* Loop-based definitions for assembly code. */ +extern void __loop_delay(unsigned long loops); +extern void __loop_udelay(unsigned long usecs); +extern void __loop_const_udelay(unsigned long); + +#endif /* __ASSEMBLY__ */ +  #endif /* defined(_ARM_DELAY_H) */ diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index bbef15d0489..2ae842df455 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h @@ -186,17 +186,6 @@ extern int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma,  			void *cpu_addr, dma_addr_t dma_addr, size_t size,  			struct dma_attrs *attrs); -#define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, NULL) - -static inline int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, -				  void *cpu_addr, dma_addr_t dma_addr, -				  size_t size, struct dma_attrs *attrs) -{ -	struct dma_map_ops *ops = get_dma_ops(dev); -	BUG_ON(!ops); -	return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); -} -  static inline void *dma_alloc_writecombine(struct device *dev, size_t size,  				       dma_addr_t *dma_handle, gfp_t flag)  { @@ -213,20 +202,12 @@ static inline void dma_free_writecombine(struct device *dev, size_t size,  	return dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs);  } -static inline int dma_mmap_writecombine(struct device *dev, struct vm_area_struct *vma, -		      void *cpu_addr, dma_addr_t dma_addr, size_t size) -{ -	DEFINE_DMA_ATTRS(attrs); -	dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); -	return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, &attrs); -} -  /*   * This can be called during boot to increase the size of the consistent   * DMA region above it's default value of 2MB. It must be called before the   * memory allocator is initialised, i.e. before any core_initcall.   */ -extern void __init init_consistent_dma_size(unsigned long size); +static inline void init_consistent_dma_size(unsigned long size) { }  /*   * For SA-1111, IXP425, and ADI systems  the dma-mapping functions are "magic" @@ -280,6 +261,9 @@ extern void arm_dma_sync_sg_for_cpu(struct device *, struct scatterlist *, int,  		enum dma_data_direction);  extern void arm_dma_sync_sg_for_device(struct device *, struct scatterlist *, int,  		enum dma_data_direction); +extern int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, +		void *cpu_addr, dma_addr_t dma_addr, size_t size, +		struct dma_attrs *attrs);  #endif /* __KERNEL__ */  #endif diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h index e51b1e81df0..83eb2f77291 100644 --- a/arch/arm/include/asm/kmap_types.h +++ b/arch/arm/include/asm/kmap_types.h @@ -4,30 +4,6 @@  /*   * This is the "bare minimum".  AIO seems to require this.   */ -enum km_type { -	KM_BOUNCE_READ, -	KM_SKB_SUNRPC_DATA, -	KM_SKB_DATA_SOFTIRQ, -	KM_USER0, -	KM_USER1, -	KM_BIO_SRC_IRQ, -	KM_BIO_DST_IRQ, -	KM_PTE0, -	KM_PTE1, -	KM_IRQ0, -	KM_IRQ1, -	KM_SOFTIRQ0, -	KM_SOFTIRQ1, -	KM_L1_CACHE, -	KM_L2_CACHE, -	KM_KDB, -	KM_TYPE_NR -}; - -#ifdef CONFIG_DEBUG_HIGHMEM -#define KM_NMI		(-1) -#define KM_NMI_PTE	(-1) -#define KM_IRQ_PTE	(-1) -#endif +#define KM_TYPE_NR 16  #endif diff --git a/arch/arm/include/asm/locks.h b/arch/arm/include/asm/locks.h deleted file mode 100644 index ef4c897772d..00000000000 --- a/arch/arm/include/asm/locks.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - *  arch/arm/include/asm/locks.h - * - *  Copyright (C) 2000 Russell King - * - * 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. - * - *  Interrupt safe locking assembler.  - */ -#ifndef __ASM_PROC_LOCKS_H -#define __ASM_PROC_LOCKS_H - -#if __LINUX_ARM_ARCH__ >= 6 - -#define __down_op(ptr,fail)			\ -	({					\ -	__asm__ __volatile__(			\ -	"@ down_op\n"				\ -"1:	ldrex	lr, [%0]\n"			\ -"	sub	lr, lr, %1\n"			\ -"	strex	ip, lr, [%0]\n"			\ -"	teq	ip, #0\n"			\ -"	bne	1b\n"				\ -"	teq	lr, #0\n"			\ -"	movmi	ip, %0\n"			\ -"	blmi	" #fail				\ -	:					\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	smp_mb();				\ -	}) - -#define __down_op_ret(ptr,fail)			\ -	({					\ -		unsigned int ret;		\ -	__asm__ __volatile__(			\ -	"@ down_op_ret\n"			\ -"1:	ldrex	lr, [%1]\n"			\ -"	sub	lr, lr, %2\n"			\ -"	strex	ip, lr, [%1]\n"			\ -"	teq	ip, #0\n"			\ -"	bne	1b\n"				\ -"	teq	lr, #0\n"			\ -"	movmi	ip, %1\n"			\ -"	movpl	ip, #0\n"			\ -"	blmi	" #fail "\n"			\ -"	mov	%0, ip"				\ -	: "=&r" (ret)				\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	smp_mb();				\ -	ret;					\ -	}) - -#define __up_op(ptr,wake)			\ -	({					\ -	smp_mb();				\ -	__asm__ __volatile__(			\ -	"@ up_op\n"				\ -"1:	ldrex	lr, [%0]\n"			\ -"	add	lr, lr, %1\n"			\ -"	strex	ip, lr, [%0]\n"			\ -"	teq	ip, #0\n"			\ -"	bne	1b\n"				\ -"	cmp	lr, #0\n"			\ -"	movle	ip, %0\n"			\ -"	blle	" #wake				\ -	:					\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	}) - -/* - * The value 0x01000000 supports up to 128 processors and - * lots of processes.  BIAS must be chosen such that sub'ing - * BIAS once per CPU will result in the long remaining - * negative. - */ -#define RW_LOCK_BIAS      0x01000000 -#define RW_LOCK_BIAS_STR "0x01000000" - -#define __down_op_write(ptr,fail)		\ -	({					\ -	__asm__ __volatile__(			\ -	"@ down_op_write\n"			\ -"1:	ldrex	lr, [%0]\n"			\ -"	sub	lr, lr, %1\n"			\ -"	strex	ip, lr, [%0]\n"			\ -"	teq	ip, #0\n"			\ -"	bne	1b\n"				\ -"	teq	lr, #0\n"			\ -"	movne	ip, %0\n"			\ -"	blne	" #fail				\ -	:					\ -	: "r" (ptr), "I" (RW_LOCK_BIAS)		\ -	: "ip", "lr", "cc");			\ -	smp_mb();				\ -	}) - -#define __up_op_write(ptr,wake)			\ -	({					\ -	smp_mb();				\ -	__asm__ __volatile__(			\ -	"@ up_op_write\n"			\ -"1:	ldrex	lr, [%0]\n"			\ -"	adds	lr, lr, %1\n"			\ -"	strex	ip, lr, [%0]\n"			\ -"	teq	ip, #0\n"			\ -"	bne	1b\n"				\ -"	movcs	ip, %0\n"			\ -"	blcs	" #wake				\ -	:					\ -	: "r" (ptr), "I" (RW_LOCK_BIAS)		\ -	: "ip", "lr", "cc");			\ -	}) - -#define __down_op_read(ptr,fail)		\ -	__down_op(ptr, fail) - -#define __up_op_read(ptr,wake)			\ -	({					\ -	smp_mb();				\ -	__asm__ __volatile__(			\ -	"@ up_op_read\n"			\ -"1:	ldrex	lr, [%0]\n"			\ -"	add	lr, lr, %1\n"			\ -"	strex	ip, lr, [%0]\n"			\ -"	teq	ip, #0\n"			\ -"	bne	1b\n"				\ -"	teq	lr, #0\n"			\ -"	moveq	ip, %0\n"			\ -"	bleq	" #wake				\ -	:					\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	}) - -#else - -#define __down_op(ptr,fail)			\ -	({					\ -	__asm__ __volatile__(			\ -	"@ down_op\n"				\ -"	mrs	ip, cpsr\n"			\ -"	orr	lr, ip, #128\n"			\ -"	msr	cpsr_c, lr\n"			\ -"	ldr	lr, [%0]\n"			\ -"	subs	lr, lr, %1\n"			\ -"	str	lr, [%0]\n"			\ -"	msr	cpsr_c, ip\n"			\ -"	movmi	ip, %0\n"			\ -"	blmi	" #fail				\ -	:					\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	smp_mb();				\ -	}) - -#define __down_op_ret(ptr,fail)			\ -	({					\ -		unsigned int ret;		\ -	__asm__ __volatile__(			\ -	"@ down_op_ret\n"			\ -"	mrs	ip, cpsr\n"			\ -"	orr	lr, ip, #128\n"			\ -"	msr	cpsr_c, lr\n"			\ -"	ldr	lr, [%1]\n"			\ -"	subs	lr, lr, %2\n"			\ -"	str	lr, [%1]\n"			\ -"	msr	cpsr_c, ip\n"			\ -"	movmi	ip, %1\n"			\ -"	movpl	ip, #0\n"			\ -"	blmi	" #fail "\n"			\ -"	mov	%0, ip"				\ -	: "=&r" (ret)				\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	smp_mb();				\ -	ret;					\ -	}) - -#define __up_op(ptr,wake)			\ -	({					\ -	smp_mb();				\ -	__asm__ __volatile__(			\ -	"@ up_op\n"				\ -"	mrs	ip, cpsr\n"			\ -"	orr	lr, ip, #128\n"			\ -"	msr	cpsr_c, lr\n"			\ -"	ldr	lr, [%0]\n"			\ -"	adds	lr, lr, %1\n"			\ -"	str	lr, [%0]\n"			\ -"	msr	cpsr_c, ip\n"			\ -"	movle	ip, %0\n"			\ -"	blle	" #wake				\ -	:					\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	}) - -/* - * The value 0x01000000 supports up to 128 processors and - * lots of processes.  BIAS must be chosen such that sub'ing - * BIAS once per CPU will result in the long remaining - * negative. - */ -#define RW_LOCK_BIAS      0x01000000 -#define RW_LOCK_BIAS_STR "0x01000000" - -#define __down_op_write(ptr,fail)		\ -	({					\ -	__asm__ __volatile__(			\ -	"@ down_op_write\n"			\ -"	mrs	ip, cpsr\n"			\ -"	orr	lr, ip, #128\n"			\ -"	msr	cpsr_c, lr\n"			\ -"	ldr	lr, [%0]\n"			\ -"	subs	lr, lr, %1\n"			\ -"	str	lr, [%0]\n"			\ -"	msr	cpsr_c, ip\n"			\ -"	movne	ip, %0\n"			\ -"	blne	" #fail				\ -	:					\ -	: "r" (ptr), "I" (RW_LOCK_BIAS)		\ -	: "ip", "lr", "cc");			\ -	smp_mb();				\ -	}) - -#define __up_op_write(ptr,wake)			\ -	({					\ -	__asm__ __volatile__(			\ -	"@ up_op_write\n"			\ -"	mrs	ip, cpsr\n"			\ -"	orr	lr, ip, #128\n"			\ -"	msr	cpsr_c, lr\n"			\ -"	ldr	lr, [%0]\n"			\ -"	adds	lr, lr, %1\n"			\ -"	str	lr, [%0]\n"			\ -"	msr	cpsr_c, ip\n"			\ -"	movcs	ip, %0\n"			\ -"	blcs	" #wake				\ -	:					\ -	: "r" (ptr), "I" (RW_LOCK_BIAS)		\ -	: "ip", "lr", "cc");			\ -	smp_mb();				\ -	}) - -#define __down_op_read(ptr,fail)		\ -	__down_op(ptr, fail) - -#define __up_op_read(ptr,wake)			\ -	({					\ -	smp_mb();				\ -	__asm__ __volatile__(			\ -	"@ up_op_read\n"			\ -"	mrs	ip, cpsr\n"			\ -"	orr	lr, ip, #128\n"			\ -"	msr	cpsr_c, lr\n"			\ -"	ldr	lr, [%0]\n"			\ -"	adds	lr, lr, %1\n"			\ -"	str	lr, [%0]\n"			\ -"	msr	cpsr_c, ip\n"			\ -"	moveq	ip, %0\n"			\ -"	bleq	" #wake				\ -	:					\ -	: "r" (ptr), "I" (1)			\ -	: "ip", "lr", "cc");			\ -	}) - -#endif - -#endif diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index febe495d0c6..15cb035309f 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h @@ -17,7 +17,7 @@ struct seq_file;  /*   * This is internal.  Do not use it.   */ -extern void init_FIQ(void); +extern void init_FIQ(int);  extern int show_fiq_list(struct seq_file *, int);  #ifdef CONFIG_MULTI_IRQ_HANDLER diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index fcb575747e5..e965f1b560f 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h @@ -16,7 +16,7 @@  #include <linux/compiler.h>  #include <linux/const.h>  #include <linux/types.h> -#include <asm/sizes.h> +#include <linux/sizes.h>  #ifdef CONFIG_NEED_MACH_MEMORY_H  #include <mach/memory.h> diff --git a/arch/arm/include/asm/mutex.h b/arch/arm/include/asm/mutex.h index 93226cf23ae..b1479fd04a9 100644 --- a/arch/arm/include/asm/mutex.h +++ b/arch/arm/include/asm/mutex.h @@ -7,121 +7,10 @@   */  #ifndef _ASM_MUTEX_H  #define _ASM_MUTEX_H - -#if __LINUX_ARM_ARCH__ < 6 -/* On pre-ARMv6 hardware the swp based implementation is the most efficient. */ -# include <asm-generic/mutex-xchg.h> -#else -  /* - * Attempting to lock a mutex on ARMv6+ can be done with a bastardized - * atomic decrement (it is not a reliable atomic decrement but it satisfies - * the defined semantics for our purpose, while being smaller and faster - * than a real atomic decrement or atomic swap.  The idea is to attempt - * decrementing the lock value only once.  If once decremented it isn't zero, - * or if its store-back fails due to a dispute on the exclusive store, we - * simply bail out immediately through the slow path where the lock will be - * reattempted until it succeeds. + * On pre-ARMv6 hardware this results in a swp-based implementation, + * which is the most efficient. For ARMv6+, we emit a pair of exclusive + * accesses instead.   */ -static inline void -__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *)) -{ -	int __ex_flag, __res; - -	__asm__ ( - -		"ldrex	%0, [%2]	\n\t" -		"sub	%0, %0, #1	\n\t" -		"strex	%1, %0, [%2]	" - -		: "=&r" (__res), "=&r" (__ex_flag) -		: "r" (&(count)->counter) -		: "cc","memory" ); - -	__res |= __ex_flag; -	if (unlikely(__res != 0)) -		fail_fn(count); -} - -static inline int -__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) -{ -	int __ex_flag, __res; - -	__asm__ ( - -		"ldrex	%0, [%2]	\n\t" -		"sub	%0, %0, #1	\n\t" -		"strex	%1, %0, [%2]	" - -		: "=&r" (__res), "=&r" (__ex_flag) -		: "r" (&(count)->counter) -		: "cc","memory" ); - -	__res |= __ex_flag; -	if (unlikely(__res != 0)) -		__res = fail_fn(count); -	return __res; -} - -/* - * Same trick is used for the unlock fast path. However the original value, - * rather than the result, is used to test for success in order to have - * better generated assembly. - */ -static inline void -__mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *)) -{ -	int __ex_flag, __res, __orig; - -	__asm__ ( - -		"ldrex	%0, [%3]	\n\t" -		"add	%1, %0, #1	\n\t" -		"strex	%2, %1, [%3]	" - -		: "=&r" (__orig), "=&r" (__res), "=&r" (__ex_flag) -		: "r" (&(count)->counter) -		: "cc","memory" ); - -	__orig |= __ex_flag; -	if (unlikely(__orig != 0)) -		fail_fn(count); -} - -/* - * If the unlock was done on a contended lock, or if the unlock simply fails - * then the mutex remains locked. - */ -#define __mutex_slowpath_needs_to_unlock()	1 - -/* - * For __mutex_fastpath_trylock we use another construct which could be - * described as a "single value cmpxchg". - * - * This provides the needed trylock semantics like cmpxchg would, but it is - * lighter and less generic than a true cmpxchg implementation. - */ -static inline int -__mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *)) -{ -	int __ex_flag, __res, __orig; - -	__asm__ ( - -		"1: ldrex	%0, [%3]	\n\t" -		"subs		%1, %0, #1	\n\t" -		"strexeq	%2, %1, [%3]	\n\t" -		"movlt		%0, #0		\n\t" -		"cmpeq		%2, #0		\n\t" -		"bgt		1b		" - -		: "=&r" (__orig), "=&r" (__res), "=&r" (__ex_flag) -		: "r" (&count->counter) -		: "cc", "memory" ); - -	return __orig; -} - -#endif +#include <asm-generic/mutex-xchg.h>  #endif diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h index 00cbe10a50e..e074948d814 100644 --- a/arch/arm/include/asm/perf_event.h +++ b/arch/arm/include/asm/perf_event.h @@ -12,21 +12,6 @@  #ifndef __ARM_PERF_EVENT_H__  #define __ARM_PERF_EVENT_H__ -/* ARM perf PMU IDs for use by internal perf clients. */ -enum arm_perf_pmu_ids { -	ARM_PERF_PMU_ID_XSCALE1	= 0, -	ARM_PERF_PMU_ID_XSCALE2, -	ARM_PERF_PMU_ID_V6, -	ARM_PERF_PMU_ID_V6MP, -	ARM_PERF_PMU_ID_CA8, -	ARM_PERF_PMU_ID_CA9, -	ARM_PERF_PMU_ID_CA5, -	ARM_PERF_PMU_ID_CA15, -	ARM_PERF_PMU_ID_CA7, -	ARM_NUM_PMU_IDS, -}; - -extern enum arm_perf_pmu_ids -armpmu_get_pmu_id(void); +/* Nothing to see here... */  #endif /* __ARM_PERF_EVENT_H__ */ diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 90114faa9f3..4432305f4a2 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h @@ -103,10 +103,9 @@ struct pmu_hw_events {  struct arm_pmu {  	struct pmu	pmu; -	enum arm_perf_pmu_ids id;  	enum arm_pmu_type type;  	cpumask_t	active_irqs; -	const char	*name; +	char		*name;  	irqreturn_t	(*handle_irq)(int irq_num, void *dev);  	void		(*enable)(struct hw_perf_event *evt, int idx);  	void		(*disable)(struct hw_perf_event *evt, int idx); diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h index 23ebc0c82a3..24d284a1bfc 100644 --- a/arch/arm/include/asm/setup.h +++ b/arch/arm/include/asm/setup.h @@ -196,7 +196,7 @@ static const struct tagtable __tagtable_##fn __tag = { tag, fn }  struct membank {  	phys_addr_t start; -	unsigned long size; +	phys_addr_t size;  	unsigned int highmem;  }; @@ -217,7 +217,7 @@ extern struct meminfo meminfo;  #define bank_phys_end(bank)	((bank)->start + (bank)->size)  #define bank_phys_size(bank)	(bank)->size -extern int arm_add_memory(phys_addr_t start, unsigned long size); +extern int arm_add_memory(phys_addr_t start, phys_addr_t size);  extern void early_print(const char *str, ...);  extern void dump_machine_table(void); diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index 65fa3c88095..b4ca707d0a6 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h @@ -59,18 +59,13 @@ static inline void dsb_sev(void)  }  /* - * ARMv6 Spin-locking. + * ARMv6 ticket-based spin-locking.   * - * We exclusively read the old value.  If it is zero, we may have - * won the lock, so we try exclusively storing it.  A memory barrier - * is required after we get a lock, and before we release it, because - * V6 CPUs are assumed to have weakly ordered memory. - * - * Unlocked value: 0 - * Locked value: 1 + * A memory barrier is required after we get a lock, and before we + * release it, because V6 CPUs are assumed to have weakly ordered + * memory.   */ -#define arch_spin_is_locked(x)		((x)->lock != 0)  #define arch_spin_unlock_wait(lock) \  	do { while (arch_spin_is_locked(lock)) cpu_relax(); } while (0) @@ -79,31 +74,39 @@ static inline void dsb_sev(void)  static inline void arch_spin_lock(arch_spinlock_t *lock)  {  	unsigned long tmp; +	u32 newval; +	arch_spinlock_t lockval;  	__asm__ __volatile__( -"1:	ldrex	%0, [%1]\n" -"	teq	%0, #0\n" -	WFE("ne") -"	strexeq	%0, %2, [%1]\n" -"	teqeq	%0, #0\n" +"1:	ldrex	%0, [%3]\n" +"	add	%1, %0, %4\n" +"	strex	%2, %1, [%3]\n" +"	teq	%2, #0\n"  "	bne	1b" -	: "=&r" (tmp) -	: "r" (&lock->lock), "r" (1) +	: "=&r" (lockval), "=&r" (newval), "=&r" (tmp) +	: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)  	: "cc"); +	while (lockval.tickets.next != lockval.tickets.owner) { +		wfe(); +		lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner); +	} +  	smp_mb();  }  static inline int arch_spin_trylock(arch_spinlock_t *lock)  {  	unsigned long tmp; +	u32 slock;  	__asm__ __volatile__( -"	ldrex	%0, [%1]\n" -"	teq	%0, #0\n" -"	strexeq	%0, %2, [%1]" -	: "=&r" (tmp) -	: "r" (&lock->lock), "r" (1) +"	ldrex	%0, [%2]\n" +"	subs	%1, %0, %0, ror #16\n" +"	addeq	%0, %0, %3\n" +"	strexeq	%1, %0, [%2]" +	: "=&r" (slock), "=&r" (tmp) +	: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)  	: "cc");  	if (tmp == 0) { @@ -116,17 +119,38 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)  static inline void arch_spin_unlock(arch_spinlock_t *lock)  { +	unsigned long tmp; +	u32 slock; +  	smp_mb();  	__asm__ __volatile__( -"	str	%1, [%0]\n" -	: -	: "r" (&lock->lock), "r" (0) +"	mov	%1, #1\n" +"1:	ldrex	%0, [%2]\n" +"	uadd16	%0, %0, %1\n" +"	strex	%1, %0, [%2]\n" +"	teq	%1, #0\n" +"	bne	1b" +	: "=&r" (slock), "=&r" (tmp) +	: "r" (&lock->slock)  	: "cc");  	dsb_sev();  } +static inline int arch_spin_is_locked(arch_spinlock_t *lock) +{ +	struct __raw_tickets tickets = ACCESS_ONCE(lock->tickets); +	return tickets.owner != tickets.next; +} + +static inline int arch_spin_is_contended(arch_spinlock_t *lock) +{ +	struct __raw_tickets tickets = ACCESS_ONCE(lock->tickets); +	return (tickets.next - tickets.owner) > 1; +} +#define arch_spin_is_contended	arch_spin_is_contended +  /*   * RWLOCKS   * @@ -158,7 +182,7 @@ static inline int arch_write_trylock(arch_rwlock_t *rw)  	unsigned long tmp;  	__asm__ __volatile__( -"1:	ldrex	%0, [%1]\n" +"	ldrex	%0, [%1]\n"  "	teq	%0, #0\n"  "	strexeq	%0, %2, [%1]"  	: "=&r" (tmp) @@ -244,7 +268,7 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)  	unsigned long tmp, tmp2 = 1;  	__asm__ __volatile__( -"1:	ldrex	%0, [%2]\n" +"	ldrex	%0, [%2]\n"  "	adds	%0, %0, #1\n"  "	strexpl	%1, %0, [%2]\n"  	: "=&r" (tmp), "+r" (tmp2) diff --git a/arch/arm/include/asm/spinlock_types.h b/arch/arm/include/asm/spinlock_types.h index d14d197ae04..b262d2f8b47 100644 --- a/arch/arm/include/asm/spinlock_types.h +++ b/arch/arm/include/asm/spinlock_types.h @@ -5,11 +5,24 @@  # error "please don't include this file directly"  #endif +#define TICKET_SHIFT	16 +  typedef struct { -	volatile unsigned int lock; +	union { +		u32 slock; +		struct __raw_tickets { +#ifdef __ARMEB__ +			u16 next; +			u16 owner; +#else +			u16 owner; +			u16 next; +#endif +		} tickets; +	};  } arch_spinlock_t; -#define __ARCH_SPIN_LOCK_UNLOCKED	{ 0 } +#define __ARCH_SPIN_LOCK_UNLOCKED	{ { 0 } }  typedef struct {  	volatile unsigned int lock; diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h index 3be8de3adab..ce119442277 100644 --- a/arch/arm/include/asm/timex.h +++ b/arch/arm/include/asm/timex.h @@ -12,13 +12,15 @@  #ifndef _ASMARM_TIMEX_H  #define _ASMARM_TIMEX_H +#include <asm/arch_timer.h>  #include <mach/timex.h>  typedef unsigned long cycles_t; -static inline cycles_t get_cycles (void) -{ -	return 0; -} +#ifdef ARCH_HAS_READ_CURRENT_TIMER +#define get_cycles()	({ cycles_t c; read_current_timer(&c) ? 0 : c; }) +#else +#define get_cycles()	(0) +#endif  #endif diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 71f6536d17a..479a6352e0b 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -189,6 +189,9 @@ static inline void set_fs(mm_segment_t fs)  #define access_ok(type,addr,size)	(__range_ok(addr,size) == 0) +#define user_addr_max() \ +	(segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL) +  /*   * The "__xxx" versions of the user access functions do not verify the   * address space - it must have been done previously with a separate @@ -398,9 +401,6 @@ extern unsigned long __must_check __clear_user_std(void __user *addr, unsigned l  #define __clear_user(addr,n)		(memset((void __force *)addr, 0, n), 0)  #endif -extern unsigned long __must_check __strncpy_from_user(char *to, const char __user *from, unsigned long count); -extern unsigned long __must_check __strnlen_user(const char __user *s, long n); -  static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n)  {  	if (access_ok(VERIFY_READ, from, n)) @@ -427,24 +427,9 @@ static inline unsigned long __must_check clear_user(void __user *to, unsigned lo  	return n;  } -static inline long __must_check strncpy_from_user(char *dst, const char __user *src, long count) -{ -	long res = -EFAULT; -	if (access_ok(VERIFY_READ, src, 1)) -		res = __strncpy_from_user(dst, src, count); -	return res; -} - -#define strlen_user(s)	strnlen_user(s, ~0UL >> 1) +extern long strncpy_from_user(char *dest, const char __user *src, long count); -static inline long __must_check strnlen_user(const char __user *s, long n) -{ -	unsigned long res = 0; - -	if (__addr_ok(s)) -		res = __strnlen_user(s, n); - -	return res; -} +extern __must_check long strlen_user(const char __user *str); +extern __must_check long strnlen_user(const char __user *str, long n);  #endif /* _ASMARM_UACCESS_H */ diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 512cd147345..0cab47d4a83 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h @@ -446,7 +446,6 @@  #ifdef __KERNEL__ -#define __ARCH_WANT_IPC_PARSE_VERSION  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_GETHOSTNAME  #define __ARCH_WANT_SYS_PAUSE diff --git a/arch/arm/include/asm/word-at-a-time.h b/arch/arm/include/asm/word-at-a-time.h new file mode 100644 index 00000000000..4d52f92967a --- /dev/null +++ b/arch/arm/include/asm/word-at-a-time.h @@ -0,0 +1,96 @@ +#ifndef __ASM_ARM_WORD_AT_A_TIME_H +#define __ASM_ARM_WORD_AT_A_TIME_H + +#ifndef __ARMEB__ + +/* + * Little-endian word-at-a-time zero byte handling. + * Heavily based on the x86 algorithm. + */ +#include <linux/kernel.h> + +struct word_at_a_time { +	const unsigned long one_bits, high_bits; +}; + +#define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) } + +static inline unsigned long has_zero(unsigned long a, unsigned long *bits, +				     const struct word_at_a_time *c) +{ +	unsigned long mask = ((a - c->one_bits) & ~a) & c->high_bits; +	*bits = mask; +	return mask; +} + +#define prep_zero_mask(a, bits, c) (bits) + +static inline unsigned long create_zero_mask(unsigned long bits) +{ +	bits = (bits - 1) & ~bits; +	return bits >> 7; +} + +static inline unsigned long find_zero(unsigned long mask) +{ +	unsigned long ret; + +#if __LINUX_ARM_ARCH__ >= 5 +	/* We have clz available. */ +	ret = fls(mask) >> 3; +#else +	/* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ +	ret = (0x0ff0001 + mask) >> 23; +	/* Fix the 1 for 00 case */ +	ret &= mask; +#endif + +	return ret; +} + +#ifdef CONFIG_DCACHE_WORD_ACCESS + +#define zero_bytemask(mask) (mask) + +/* + * Load an unaligned word from kernel space. + * + * In the (very unlikely) case of the word being a page-crosser + * and the next page not being mapped, take the exception and + * return zeroes in the non-existing part. + */ +static inline unsigned long load_unaligned_zeropad(const void *addr) +{ +	unsigned long ret, offset; + +	/* Load word from unaligned pointer addr */ +	asm( +	"1:	ldr	%0, [%2]\n" +	"2:\n" +	"	.pushsection .fixup,\"ax\"\n" +	"	.align 2\n" +	"3:	and	%1, %2, #0x3\n" +	"	bic	%2, %2, #0x3\n" +	"	ldr	%0, [%2]\n" +	"	lsl	%1, %1, #0x3\n" +	"	lsr	%0, %0, %1\n" +	"	b	2b\n" +	"	.popsection\n" +	"	.pushsection __ex_table,\"a\"\n" +	"	.align	3\n" +	"	.long	1b, 3b\n" +	"	.popsection" +	: "=&r" (ret), "=&r" (offset) +	: "r" (addr), "Qo" (*(unsigned long *)addr)); + +	return ret; +} + + +#endif	/* DCACHE_WORD_ACCESS */ + +#else	/* __ARMEB__ */ +#include <asm-generic/word-at-a-time.h> +#endif + +#endif /* __ASM_ARM_WORD_AT_A_TIME_H */ diff --git a/arch/arm/kernel/arch_timer.c b/arch/arm/kernel/arch_timer.c index dd58035621f..cf258807160 100644 --- a/arch/arm/kernel/arch_timer.c +++ b/arch/arm/kernel/arch_timer.c @@ -32,6 +32,8 @@ static int arch_timer_ppi2;  static struct clock_event_device __percpu **arch_timer_evt; +extern void init_current_timer_delay(unsigned long freq); +  /*   * Architected system timer support.   */ @@ -137,7 +139,7 @@ static int __cpuinit arch_timer_setup(struct clock_event_device *clk)  	/* Be safe... */  	arch_timer_disable(); -	clk->features = CLOCK_EVT_FEAT_ONESHOT; +	clk->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP;  	clk->name = "arch_sys_timer";  	clk->rating = 450;  	clk->set_mode = arch_timer_set_mode; @@ -223,6 +225,14 @@ static cycle_t arch_counter_read(struct clocksource *cs)  	return arch_counter_get_cntpct();  } +int read_current_timer(unsigned long *timer_val) +{ +	if (!arch_timer_rate) +		return -ENXIO; +	*timer_val = arch_counter_get_cntpct(); +	return 0; +} +  static struct clocksource clocksource_counter = {  	.name	= "arch_sys_counter",  	.rating	= 400, @@ -296,6 +306,7 @@ static int __init arch_timer_register(void)  	if (err)  		goto out_free_irq; +	init_current_timer_delay(arch_timer_rate);  	return 0;  out_free_irq: diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index b57c75e0b01..60d3b738d42 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c @@ -49,8 +49,7 @@ extern void __aeabi_ulcmp(void);  extern void fpundefinstr(void);  	/* platform dependent support */ -EXPORT_SYMBOL(__udelay); -EXPORT_SYMBOL(__const_udelay); +EXPORT_SYMBOL(arm_delay_ops);  	/* networking */  EXPORT_SYMBOL(csum_partial); @@ -87,10 +86,6 @@ EXPORT_SYMBOL(memmove);  EXPORT_SYMBOL(memchr);  EXPORT_SYMBOL(__memzero); -	/* user mem (segment) */ -EXPORT_SYMBOL(__strnlen_user); -EXPORT_SYMBOL(__strncpy_from_user); -  #ifdef CONFIG_MMU  EXPORT_SYMBOL(copy_page); diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 25552508c3f..2b2f25e7fef 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -253,7 +253,7 @@ static void __devinit pci_fixup_cy82c693(struct pci_dev *dev)  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, pci_fixup_cy82c693); -static void __init pci_fixup_it8152(struct pci_dev *dev) +static void __devinit pci_fixup_it8152(struct pci_dev *dev)  {  	int i;  	/* fixup for ITE 8152 devices */ @@ -461,7 +461,7 @@ static void __init pcibios_init_hw(struct hw_pci *hw, struct list_head *head)  			if (!sys->bus)  				panic("PCI: unable to scan bus!"); -			busnr = sys->bus->subordinate + 1; +			busnr = sys->bus->busn_res.end + 1;  			list_add(&sys->node, head);  		} else { diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 0d1851ca6eb..0f82098c9bf 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -244,6 +244,19 @@ svc_preempt:  	b	1b  #endif +__und_fault: +	@ Correct the PC such that it is pointing at the instruction +	@ which caused the fault.  If the faulting instruction was ARM +	@ the PC will be pointing at the next instruction, and have to +	@ subtract 4.  Otherwise, it is Thumb, and the PC will be +	@ pointing at the second half of the Thumb instruction.  We +	@ have to subtract 2. +	ldr	r2, [r0, #S_PC] +	sub	r2, r2, r1 +	str	r2, [r0, #S_PC] +	b	do_undefinstr +ENDPROC(__und_fault) +  	.align	5  __und_svc:  #ifdef CONFIG_KPROBES @@ -261,25 +274,32 @@ __und_svc:  	@  	@  r0 - instruction  	@ -#ifndef	CONFIG_THUMB2_KERNEL +#ifndef CONFIG_THUMB2_KERNEL  	ldr	r0, [r4, #-4]  #else +	mov	r1, #2  	ldrh	r0, [r4, #-2]			@ Thumb instruction at LR - 2  	cmp	r0, #0xe800			@ 32-bit instruction if xx >= 0 -	ldrhhs	r9, [r4]			@ bottom 16 bits -	orrhs	r0, r9, r0, lsl #16 +	blo	__und_svc_fault +	ldrh	r9, [r4]			@ bottom 16 bits +	add	r4, r4, #2 +	str	r4, [sp, #S_PC] +	orr	r0, r9, r0, lsl #16  #endif -	adr	r9, BSYM(1f) +	adr	r9, BSYM(__und_svc_finish)  	mov	r2, r4  	bl	call_fpe +	mov	r1, #4				@ PC correction to apply +__und_svc_fault:  	mov	r0, sp				@ struct pt_regs *regs -	bl	do_undefinstr +	bl	__und_fault  	@  	@ IRQs off again before pulling preserved data off the stack  	@ -1:	disable_irq_notrace +__und_svc_finish: +	disable_irq_notrace  	@  	@ restore SPSR and restart the instruction @@ -423,25 +443,33 @@ __und_usr:  	mov	r2, r4  	mov	r3, r5 +	@ r2 = regs->ARM_pc, which is either 2 or 4 bytes ahead of the +	@      faulting instruction depending on Thumb mode. +	@ r3 = regs->ARM_cpsr  	@ -	@ fall through to the emulation code, which returns using r9 if -	@ it has emulated the instruction, or the more conventional lr -	@ if we are to treat this as a real undefined instruction -	@ -	@  r0 - instruction +	@ The emulation code returns using r9 if it has emulated the +	@ instruction, or the more conventional lr if we are to treat +	@ this as a real undefined instruction  	@  	adr	r9, BSYM(ret_from_exception) -	adr	lr, BSYM(__und_usr_unknown) +  	tst	r3, #PSR_T_BIT			@ Thumb mode? -	itet	eq				@ explicit IT needed for the 1f label -	subeq	r4, r2, #4			@ ARM instr at LR - 4 -	subne	r4, r2, #2			@ Thumb instr at LR - 2 -1:	ldreqt	r0, [r4] +	bne	__und_usr_thumb +	sub	r4, r2, #4			@ ARM instr at LR - 4 +1:	ldrt	r0, [r4]  #ifdef CONFIG_CPU_ENDIAN_BE8 -	reveq	r0, r0				@ little endian instruction +	rev	r0, r0				@ little endian instruction  #endif -	beq	call_fpe +	@ r0 = 32-bit ARM instruction which caused the exception +	@ r2 = PC value for the following instruction (:= regs->ARM_pc) +	@ r4 = PC value for the faulting instruction +	@ lr = 32-bit undefined instruction function +	adr	lr, BSYM(__und_usr_fault_32) +	b	call_fpe + +__und_usr_thumb:  	@ Thumb instruction +	sub	r4, r2, #2			@ First half of thumb instr at LR - 2  #if CONFIG_ARM_THUMB && __LINUX_ARM_ARCH__ >= 6 && CONFIG_CPU_V7  /*   * Thumb-2 instruction handling.  Note that because pre-v6 and >= v6 platforms @@ -455,7 +483,7 @@ __und_usr:  	ldr	r5, .LCcpu_architecture  	ldr	r5, [r5]  	cmp	r5, #CPU_ARCH_ARMv7 -	blo	__und_usr_unknown +	blo	__und_usr_fault_16		@ 16bit undefined instruction  /*   * The following code won't get run unless the running CPU really is v7, so   * coding round the lack of ldrht on older arches is pointless.  Temporarily @@ -463,15 +491,18 @@ __und_usr:   */  	.arch	armv6t2  #endif -2: - ARM(	ldrht	r5, [r4], #2	) - THUMB(	ldrht	r5, [r4]	) - THUMB(	add	r4, r4, #2	) +2:	ldrht	r5, [r4]  	cmp	r5, #0xe800			@ 32bit instruction if xx != 0 -	blo	__und_usr_unknown -3:	ldrht	r0, [r4] +	blo	__und_usr_fault_16		@ 16bit undefined instruction +3:	ldrht	r0, [r2]  	add	r2, r2, #2			@ r2 is PC + 2, make it PC + 4 +	str	r2, [sp, #S_PC]			@ it's a 2x16bit instr, update  	orr	r0, r0, r5, lsl #16 +	adr	lr, BSYM(__und_usr_fault_32) +	@ r0 = the two 16-bit Thumb instructions which caused the exception +	@ r2 = PC value for the following Thumb instruction (:= regs->ARM_pc) +	@ r4 = PC value for the first 16-bit Thumb instruction +	@ lr = 32bit undefined instruction function  #if __LINUX_ARM_ARCH__ < 7  /* If the target arch was overridden, change it back: */ @@ -482,17 +513,13 @@ __und_usr:  #endif  #endif /* __LINUX_ARM_ARCH__ < 7 */  #else /* !(CONFIG_ARM_THUMB && __LINUX_ARM_ARCH__ >= 6 && CONFIG_CPU_V7) */ -	b	__und_usr_unknown +	b	__und_usr_fault_16  #endif - UNWIND(.fnend		) + UNWIND(.fnend)  ENDPROC(__und_usr) -	@ -	@ fallthrough to call_fpe -	@ -  /* - * The out of line fixup for the ldrt above. + * The out of line fixup for the ldrt instructions above.   */  	.pushsection .fixup, "ax"  	.align	2 @@ -524,11 +551,12 @@ ENDPROC(__und_usr)   * NEON handler code.   *   * Emulators may wish to make use of the following registers: - *  r0  = instruction opcode. - *  r2  = PC+4 + *  r0  = instruction opcode (32-bit ARM or two 16-bit Thumb) + *  r2  = PC value to resume execution after successful emulation   *  r9  = normal "successful" return address - *  r10 = this threads thread_info structure. + *  r10 = this threads thread_info structure   *  lr  = unrecognised instruction return address + * IRQs disabled, FIQs enabled.   */  	@  	@ Fall-through from Thumb-2 __und_usr @@ -659,12 +687,17 @@ ENTRY(no_fp)  	mov	pc, lr  ENDPROC(no_fp) -__und_usr_unknown: -	enable_irq +__und_usr_fault_32: +	mov	r1, #4 +	b	1f +__und_usr_fault_16: +	mov	r1, #2 +1:	enable_irq  	mov	r0, sp  	adr	lr, BSYM(ret_from_exception) -	b	do_undefinstr -ENDPROC(__und_usr_unknown) +	b	__und_fault +ENDPROC(__und_usr_fault_32) +ENDPROC(__und_usr_fault_16)  	.align	5  __pabt_usr: diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 4afed88d250..978eac57e04 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -51,23 +51,15 @@ ret_fast_syscall:  fast_work_pending:  	str	r0, [sp, #S_R0+S_OFF]!		@ returned r0  work_pending: -	tst	r1, #_TIF_NEED_RESCHED -	bne	work_resched -	/* -	 * TIF_SIGPENDING or TIF_NOTIFY_RESUME must've been set if we got here -	 */ -	ldr	r2, [sp, #S_PSR]  	mov	r0, sp				@ 'regs' -	tst	r2, #15				@ are we returning to user mode? -	bne	no_work_pending			@ no?  just leave, then...  	mov	r2, why				@ 'syscall' -	tst	r1, #_TIF_SIGPENDING		@ delivering a signal? -	movne	why, #0				@ prevent further restarts -	bl	do_notify_resume -	b	ret_slow_syscall		@ Check work again +	bl	do_work_pending +	cmp	r0, #0 +	beq	no_work_pending +	movlt	scno, #(__NR_restart_syscall - __NR_SYSCALL_BASE) +	ldmia	sp, {r0 - r6}			@ have to reload r0 - r6 +	b	local_restart			@ ... and off we go -work_resched: -	bl	schedule  /*   * "slow" syscall return path.  "why" tells us if this was a real syscall.   */ @@ -95,13 +87,7 @@ ENDPROC(ret_to_user)  ENTRY(ret_from_fork)  	bl	schedule_tail  	get_thread_info tsk -	ldr	r1, [tsk, #TI_FLAGS]		@ check for syscall tracing  	mov	why, #1 -	tst	r1, #_TIF_SYSCALL_WORK		@ are we tracing syscalls? -	beq	ret_slow_syscall -	mov	r1, sp -	mov	r0, #1				@ trace exit [IP = 1] -	bl	syscall_trace  	b	ret_slow_syscall  ENDPROC(ret_from_fork) @@ -415,6 +401,7 @@ ENTRY(vector_swi)  	eor	scno, scno, #__NR_SYSCALL_BASE	@ check OS number  #endif +local_restart:  	ldr	r10, [tsk, #TI_FLAGS]		@ check for syscall tracing  	stmdb	sp!, {r4, r5}			@ push fifth and sixth args @@ -448,25 +435,24 @@ ENDPROC(vector_swi)  	 * context switches, and waiting for our parent to respond.  	 */  __sys_trace: -	mov	r2, scno -	add	r1, sp, #S_OFF -	mov	r0, #0				@ trace entry [IP = 0] -	bl	syscall_trace +	mov	r1, scno +	add	r0, sp, #S_OFF +	bl	syscall_trace_enter  	adr	lr, BSYM(__sys_trace_return)	@ return address  	mov	scno, r0			@ syscall number (possibly new)  	add	r1, sp, #S_R0 + S_OFF		@ pointer to regs  	cmp	scno, #NR_syscalls		@ check upper syscall limit -	ldmccia	r1, {r0 - r3}			@ have to reload r0 - r3 +	ldmccia	r1, {r0 - r6}			@ have to reload r0 - r6 +	stmccia	sp, {r4, r5}			@ and update the stack args  	ldrcc	pc, [tbl, scno, lsl #2]		@ call sys_* routine  	b	2b  __sys_trace_return:  	str	r0, [sp, #S_R0 + S_OFF]!	@ save returned r0 -	mov	r2, scno -	mov	r1, sp -	mov	r0, #1				@ trace exit [IP = 1] -	bl	syscall_trace +	mov	r1, scno +	mov	r0, sp +	bl	syscall_trace_exit  	b	ret_slow_syscall  	.align	5 diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index c32f8456aa0..2adda11f712 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -122,14 +122,16 @@ void release_fiq(struct fiq_handler *f)  	while (current_fiq->fiq_op(current_fiq->dev_id, 0));  } +static int fiq_start; +  void enable_fiq(int fiq)  { -	enable_irq(fiq + FIQ_START); +	enable_irq(fiq + fiq_start);  }  void disable_fiq(int fiq)  { -	disable_irq(fiq + FIQ_START); +	disable_irq(fiq + fiq_start);  }  EXPORT_SYMBOL(set_fiq_handler); @@ -140,7 +142,8 @@ EXPORT_SYMBOL(release_fiq);  EXPORT_SYMBOL(enable_fiq);  EXPORT_SYMBOL(disable_fiq); -void __init init_FIQ(void) +void __init init_FIQ(int start)  {  	no_fiq_insn = *(unsigned long *)0xffff001c; +	fiq_start = start;  } diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c index df0bf0c8cb7..34e56647dce 100644 --- a/arch/arm/kernel/ftrace.c +++ b/arch/arm/kernel/ftrace.c @@ -179,19 +179,20 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,  	old = *parent;  	*parent = return_hooker; -	err = ftrace_push_return_trace(old, self_addr, &trace.depth, -				       frame_pointer); -	if (err == -EBUSY) { -		*parent = old; -		return; -	} -  	trace.func = self_addr; +	trace.depth = current->curr_ret_stack + 1;  	/* Only trace if the calling function expects to */  	if (!ftrace_graph_entry(&trace)) { -		current->curr_ret_stack--;  		*parent = old; +		return; +	} + +	err = ftrace_push_return_trace(old, self_addr, &trace.depth, +				       frame_pointer); +	if (err == -EBUSY) { +		*parent = old; +		return;  	}  } diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 835898e7d70..3db960e20cb 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -55,14 +55,6 @@  	add	\rd, \phys, #TEXT_OFFSET - PG_DIR_SIZE  	.endm -#ifdef CONFIG_XIP_KERNEL -#define KERNEL_START	XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) -#define KERNEL_END	_edata_loc -#else -#define KERNEL_START	KERNEL_RAM_VADDR -#define KERNEL_END	_end -#endif -  /*   * Kernel startup entry point.   * --------------------------- @@ -218,51 +210,46 @@ __create_page_tables:  	blo	1b  	/* -	 * Now setup the pagetables for our kernel direct -	 * mapped region. +	 * Map our RAM from the start to the end of the kernel .bss section.  	 */ -	mov	r3, pc -	mov	r3, r3, lsr #SECTION_SHIFT -	orr	r3, r7, r3, lsl #SECTION_SHIFT -	add	r0, r4,  #(KERNEL_START & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER) -	str	r3, [r0, #((KERNEL_START & 0x00f00000) >> SECTION_SHIFT) << PMD_ORDER]! -	ldr	r6, =(KERNEL_END - 1) -	add	r0, r0, #1 << PMD_ORDER +	add	r0, r4, #PAGE_OFFSET >> (SECTION_SHIFT - PMD_ORDER) +	ldr	r6, =(_end - 1) +	orr	r3, r8, r7  	add	r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER) -1:	cmp	r0, r6 +1:	str	r3, [r0], #1 << PMD_ORDER  	add	r3, r3, #1 << SECTION_SHIFT -	strls	r3, [r0], #1 << PMD_ORDER +	cmp	r0, r6  	bls	1b  #ifdef CONFIG_XIP_KERNEL  	/* -	 * Map some ram to cover our .data and .bss areas. +	 * Map the kernel image separately as it is not located in RAM.  	 */ -	add	r3, r8, #TEXT_OFFSET -	orr	r3, r3, r7 -	add	r0, r4,  #(KERNEL_RAM_VADDR & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER) -	str	r3, [r0, #(KERNEL_RAM_VADDR & 0x00f00000) >> (SECTION_SHIFT - PMD_ORDER)]! -	ldr	r6, =(_end - 1) -	add	r0, r0, #4 +#define XIP_START XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) +	mov	r3, pc +	mov	r3, r3, lsr #SECTION_SHIFT +	orr	r3, r7, r3, lsl #SECTION_SHIFT +	add	r0, r4,  #(XIP_START & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER) +	str	r3, [r0, #((XIP_START & 0x00f00000) >> SECTION_SHIFT) << PMD_ORDER]! +	ldr	r6, =(_edata_loc - 1) +	add	r0, r0, #1 << PMD_ORDER  	add	r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER)  1:	cmp	r0, r6 -	add	r3, r3, #1 << 20 -	strls	r3, [r0], #4 +	add	r3, r3, #1 << SECTION_SHIFT +	strls	r3, [r0], #1 << PMD_ORDER  	bls	1b  #endif  	/* -	 * Then map boot params address in r2 or the first 1MB (2MB with LPAE) -	 * of ram if boot params address is not specified. +	 * Then map boot params address in r2 if specified.  	 */  	mov	r0, r2, lsr #SECTION_SHIFT  	movs	r0, r0, lsl #SECTION_SHIFT -	moveq	r0, r8 -	sub	r3, r0, r8 -	add	r3, r3, #PAGE_OFFSET -	add	r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER) -	orr	r6, r7, r0 -	str	r6, [r3] +	subne	r3, r0, r8 +	addne	r3, r3, #PAGE_OFFSET +	addne	r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER) +	orrne	r6, r7, r0 +	strne	r6, [r3]  #ifdef CONFIG_DEBUG_LL  #if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING) diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 8349d4e97e2..16cedb42c0c 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -40,13 +40,6 @@  #include <asm/mach/irq.h>  #include <asm/mach/time.h> -/* - * No architecture-specific irq_finish function defined in arm/arch/irqs.h. - */ -#ifndef irq_finish -#define irq_finish(irq) do { } while (0) -#endif -  unsigned long irq_err_count;  int arch_show_interrupts(struct seq_file *p, int prec) @@ -85,9 +78,6 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs)  		generic_handle_irq(irq);  	} -	/* AT91 specific workaround */ -	irq_finish(irq); -  	irq_exit();  	set_irq_regs(old_regs);  } diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index a02eada3aa5..ab243b87118 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -47,17 +47,14 @@ static DEFINE_PER_CPU(struct pmu_hw_events, cpu_hw_events);  /* Set at runtime when we know what CPU type we are. */  static struct arm_pmu *cpu_pmu; -enum arm_perf_pmu_ids -armpmu_get_pmu_id(void) +const char *perf_pmu_name(void)  { -	int id = -ENODEV; - -	if (cpu_pmu != NULL) -		id = cpu_pmu->id; +	if (!cpu_pmu) +		return NULL; -	return id; +	return cpu_pmu->pmu.name;  } -EXPORT_SYMBOL_GPL(armpmu_get_pmu_id); +EXPORT_SYMBOL_GPL(perf_pmu_name);  int perf_num_counters(void)  { @@ -760,7 +757,7 @@ init_hw_perf_events(void)  			cpu_pmu->name, cpu_pmu->num_events);  		cpu_pmu_init(cpu_pmu);  		register_cpu_notifier(&pmu_cpu_notifier); -		armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW); +		armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW);  	} else {  		pr_info("no hardware support available\n");  	} diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index ab627a740fa..c90fcb2b696 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c @@ -650,7 +650,6 @@ static int armv6_map_event(struct perf_event *event)  }  static struct arm_pmu armv6pmu = { -	.id			= ARM_PERF_PMU_ID_V6,  	.name			= "v6",  	.handle_irq		= armv6pmu_handle_irq,  	.enable			= armv6pmu_enable_event, @@ -685,7 +684,6 @@ static int armv6mpcore_map_event(struct perf_event *event)  }  static struct arm_pmu armv6mpcore_pmu = { -	.id			= ARM_PERF_PMU_ID_V6MP,  	.name			= "v6mpcore",  	.handle_irq		= armv6pmu_handle_irq,  	.enable			= armv6pmu_enable_event, diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index d3c53606816..f04070bd218 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c @@ -1258,7 +1258,6 @@ static u32 __init armv7_read_num_pmnc_events(void)  static struct arm_pmu *__init armv7_a8_pmu_init(void)  { -	armv7pmu.id		= ARM_PERF_PMU_ID_CA8;  	armv7pmu.name		= "ARMv7 Cortex-A8";  	armv7pmu.map_event	= armv7_a8_map_event;  	armv7pmu.num_events	= armv7_read_num_pmnc_events(); @@ -1267,7 +1266,6 @@ static struct arm_pmu *__init armv7_a8_pmu_init(void)  static struct arm_pmu *__init armv7_a9_pmu_init(void)  { -	armv7pmu.id		= ARM_PERF_PMU_ID_CA9;  	armv7pmu.name		= "ARMv7 Cortex-A9";  	armv7pmu.map_event	= armv7_a9_map_event;  	armv7pmu.num_events	= armv7_read_num_pmnc_events(); @@ -1276,7 +1274,6 @@ static struct arm_pmu *__init armv7_a9_pmu_init(void)  static struct arm_pmu *__init armv7_a5_pmu_init(void)  { -	armv7pmu.id		= ARM_PERF_PMU_ID_CA5;  	armv7pmu.name		= "ARMv7 Cortex-A5";  	armv7pmu.map_event	= armv7_a5_map_event;  	armv7pmu.num_events	= armv7_read_num_pmnc_events(); @@ -1285,7 +1282,6 @@ static struct arm_pmu *__init armv7_a5_pmu_init(void)  static struct arm_pmu *__init armv7_a15_pmu_init(void)  { -	armv7pmu.id		= ARM_PERF_PMU_ID_CA15;  	armv7pmu.name		= "ARMv7 Cortex-A15";  	armv7pmu.map_event	= armv7_a15_map_event;  	armv7pmu.num_events	= armv7_read_num_pmnc_events(); @@ -1295,7 +1291,6 @@ static struct arm_pmu *__init armv7_a15_pmu_init(void)  static struct arm_pmu *__init armv7_a7_pmu_init(void)  { -	armv7pmu.id		= ARM_PERF_PMU_ID_CA7;  	armv7pmu.name		= "ARMv7 Cortex-A7";  	armv7pmu.map_event	= armv7_a7_map_event;  	armv7pmu.num_events	= armv7_read_num_pmnc_events(); diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index e34e7254e65..f759fe0bab6 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c @@ -435,7 +435,6 @@ static int xscale_map_event(struct perf_event *event)  }  static struct arm_pmu xscale1pmu = { -	.id		= ARM_PERF_PMU_ID_XSCALE1,  	.name		= "xscale1",  	.handle_irq	= xscale1pmu_handle_irq,  	.enable		= xscale1pmu_enable_event, @@ -803,7 +802,6 @@ xscale2pmu_write_counter(int counter, u32 val)  }  static struct arm_pmu xscale2pmu = { -	.id		= ARM_PERF_PMU_ID_XSCALE2,  	.name		= "xscale2",  	.handle_irq	= xscale2pmu_handle_irq,  	.enable		= xscale2pmu_enable_event, diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 19c95ea65b2..693b744fd57 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -247,6 +247,7 @@ void machine_shutdown(void)  void machine_halt(void)  {  	machine_shutdown(); +	local_irq_disable();  	while (1);  } @@ -268,6 +269,7 @@ void machine_restart(char *cmd)  	/* Whoops - the platform was unable to reboot. Tell the user! */  	printk("Reboot failed -- System halted\n"); +	local_irq_disable();  	while (1);  } diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 14e38261cd3..3e0fc5f7ed4 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -25,6 +25,7 @@  #include <linux/regset.h>  #include <linux/audit.h>  #include <linux/tracehook.h> +#include <linux/unistd.h>  #include <asm/pgtable.h>  #include <asm/traps.h> @@ -907,16 +908,16 @@ long arch_ptrace(struct task_struct *child, long request,  	return ret;  } -asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) +enum ptrace_syscall_dir { +	PTRACE_SYSCALL_ENTER = 0, +	PTRACE_SYSCALL_EXIT, +}; + +static int ptrace_syscall_trace(struct pt_regs *regs, int scno, +				enum ptrace_syscall_dir dir)  {  	unsigned long ip; -	if (why) -		audit_syscall_exit(regs); -	else -		audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, -				    regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); -  	if (!test_thread_flag(TIF_SYSCALL_TRACE))  		return scno; @@ -927,14 +928,28 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)  	 * IP = 0 -> entry, =1 -> exit  	 */  	ip = regs->ARM_ip; -	regs->ARM_ip = why; +	regs->ARM_ip = dir; -	if (why) +	if (dir == PTRACE_SYSCALL_EXIT)  		tracehook_report_syscall_exit(regs, 0);  	else if (tracehook_report_syscall_entry(regs))  		current_thread_info()->syscall = -1;  	regs->ARM_ip = ip; -  	return current_thread_info()->syscall;  } + +asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) +{ +	int ret = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_ENTER); +	audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, regs->ARM_r1, +			    regs->ARM_r2, regs->ARM_r3); +	return ret; +} + +asmlinkage int syscall_trace_exit(struct pt_regs *regs, int scno) +{ +	int ret = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_EXIT); +	audit_syscall_exit(regs); +	return ret; +} diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index e15d83bb4ea..a81dcecc734 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -508,7 +508,7 @@ void __init dump_machine_table(void)  		/* can't use cpu_relax() here as it may require MMU setup */;  } -int __init arm_add_memory(phys_addr_t start, unsigned long size) +int __init arm_add_memory(phys_addr_t start, phys_addr_t size)  {  	struct membank *bank = &meminfo.bank[meminfo.nr_banks]; @@ -538,7 +538,7 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size)  	}  #endif -	bank->size = size & PAGE_MASK; +	bank->size = size & ~(phys_addr_t)(PAGE_SIZE - 1);  	/*  	 * Check whether this memory region has non-zero size or @@ -558,7 +558,7 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size)  static int __init early_mem(char *p)  {  	static int usermem __initdata = 0; -	unsigned long size; +	phys_addr_t size;  	phys_addr_t start;  	char *endp; diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 536c5d6b340..f27789e4e38 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -27,7 +27,6 @@   */  #define SWI_SYS_SIGRETURN	(0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE))  #define SWI_SYS_RT_SIGRETURN	(0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)) -#define SWI_SYS_RESTART		(0xef000000|__NR_restart_syscall|__NR_OABI_SYSCALL_BASE)  /*   * With EABI, the syscall number has to be loaded into r7. @@ -48,18 +47,6 @@ const unsigned long sigreturn_codes[7] = {  };  /* - * Either we support OABI only, or we have EABI with the OABI - * compat layer enabled.  In the later case we don't know if - * user space is EABI or not, and if not we must not clobber r7. - * Always using the OABI syscall solves that issue and works for - * all those cases. - */ -const unsigned long syscall_restart_code[2] = { -	SWI_SYS_RESTART,	/* swi	__NR_restart_syscall */ -	0xe49df004,		/* ldr	pc, [sp], #4 */ -}; - -/*   * atomically swap in the new signal mask, and wait for a signal.   */  asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask) @@ -582,12 +569,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,   * the kernel can handle, and then we build all the user-level signal handling   * stack-frames in one go after that.   */ -static void do_signal(struct pt_regs *regs, int syscall) +static int do_signal(struct pt_regs *regs, int syscall)  {  	unsigned int retval = 0, continue_addr = 0, restart_addr = 0;  	struct k_sigaction ka;  	siginfo_t info;  	int signr; +	int restart = 0;  	/*  	 * If we were from a system call, check for system call restarting... @@ -602,15 +590,15 @@ static void do_signal(struct pt_regs *regs, int syscall)  		 * debugger will see the already changed PSW.  		 */  		switch (retval) { +		case -ERESTART_RESTARTBLOCK: +			restart -= 2;  		case -ERESTARTNOHAND:  		case -ERESTARTSYS:  		case -ERESTARTNOINTR: +			restart++;  			regs->ARM_r0 = regs->ARM_ORIG_r0;  			regs->ARM_pc = restart_addr;  			break; -		case -ERESTART_RESTARTBLOCK: -			regs->ARM_r0 = -EINTR; -			break;  		}  	} @@ -619,14 +607,17 @@ static void do_signal(struct pt_regs *regs, int syscall)  	 * point the debugger may change all our registers ...  	 */  	signr = get_signal_to_deliver(&info, &ka, regs, NULL); +	/* +	 * Depending on the signal settings we may need to revert the +	 * decision to restart the system call.  But skip this if a +	 * debugger has chosen to restart at a different PC. +	 */ +	if (regs->ARM_pc != restart_addr) +		restart = 0;  	if (signr > 0) { -		/* -		 * Depending on the signal settings we may need to revert the -		 * decision to restart the system call.  But skip this if a -		 * debugger has chosen to restart at a different PC. -		 */ -		if (regs->ARM_pc == restart_addr) { -			if (retval == -ERESTARTNOHAND +		if (unlikely(restart)) { +			if (retval == -ERESTARTNOHAND || +			    retval == -ERESTART_RESTARTBLOCK  			    || (retval == -ERESTARTSYS  				&& !(ka.sa.sa_flags & SA_RESTART))) {  				regs->ARM_r0 = -EINTR; @@ -635,52 +626,43 @@ static void do_signal(struct pt_regs *regs, int syscall)  		}  		handle_signal(signr, &ka, &info, regs); -		return; -	} - -	if (syscall) { -		/* -		 * Handle restarting a different system call.  As above, -		 * if a debugger has chosen to restart at a different PC, -		 * ignore the restart. -		 */ -		if (retval == -ERESTART_RESTARTBLOCK -		    && regs->ARM_pc == continue_addr) { -			if (thumb_mode(regs)) { -				regs->ARM_r7 = __NR_restart_syscall - __NR_SYSCALL_BASE; -				regs->ARM_pc -= 2; -			} else { -#if defined(CONFIG_AEABI) && !defined(CONFIG_OABI_COMPAT) -				regs->ARM_r7 = __NR_restart_syscall; -				regs->ARM_pc -= 4; -#else -				u32 __user *usp; - -				regs->ARM_sp -= 4; -				usp = (u32 __user *)regs->ARM_sp; - -				if (put_user(regs->ARM_pc, usp) == 0) { -					regs->ARM_pc = KERN_RESTART_CODE; -				} else { -					regs->ARM_sp += 4; -					force_sigsegv(0, current); -				} -#endif -			} -		} +		return 0;  	}  	restore_saved_sigmask(); +	if (unlikely(restart)) +		regs->ARM_pc = continue_addr; +	return restart;  } -asmlinkage void -do_notify_resume(struct pt_regs *regs, unsigned int thread_flags, int syscall) +asmlinkage int +do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)  { -	if (thread_flags & _TIF_SIGPENDING) -		do_signal(regs, syscall); - -	if (thread_flags & _TIF_NOTIFY_RESUME) { -		clear_thread_flag(TIF_NOTIFY_RESUME); -		tracehook_notify_resume(regs); -	} +	do { +		if (likely(thread_flags & _TIF_NEED_RESCHED)) { +			schedule(); +		} else { +			if (unlikely(!user_mode(regs))) +				return 0; +			local_irq_enable(); +			if (thread_flags & _TIF_SIGPENDING) { +				int restart = do_signal(regs, syscall); +				if (unlikely(restart)) { +					/* +					 * Restart without handlers. +					 * Deal with it without leaving +					 * the kernel space. +					 */ +					return restart; +				} +				syscall = 0; +			} else { +				clear_thread_flag(TIF_NOTIFY_RESUME); +				tracehook_notify_resume(regs); +			} +		} +		local_irq_disable(); +		thread_flags = current_thread_info()->flags; +	} while (thread_flags & _TIF_WORK_MASK); +	return 0;  } diff --git a/arch/arm/kernel/signal.h b/arch/arm/kernel/signal.h index 6fcfe8398aa..5ff067b7c75 100644 --- a/arch/arm/kernel/signal.h +++ b/arch/arm/kernel/signal.h @@ -8,7 +8,5 @@   * published by the Free Software Foundation.   */  #define KERN_SIGRETURN_CODE	(CONFIG_VECTORS_BASE + 0x00000500) -#define KERN_RESTART_CODE	(KERN_SIGRETURN_CODE + sizeof(sigreturn_codes))  extern const unsigned long sigreturn_codes[7]; -extern const unsigned long syscall_restart_code[2]; diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 2c7217d971d..ebd8ad274d7 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -179,7 +179,7 @@ void __ref cpu_die(void)  	mb();  	/* Tell __cpu_die() that this CPU is now safe to dispose of */ -	complete(&cpu_died); +	RCU_NONIDLE(complete(&cpu_died));  	/*  	 * actual CPU shutdown procedure is at least platform (if not @@ -563,7 +563,8 @@ void smp_send_stop(void)  	cpumask_copy(&mask, cpu_online_mask);  	cpumask_clear_cpu(smp_processor_id(), &mask); -	smp_cross_call(&mask, IPI_CPU_STOP); +	if (!cpumask_empty(&mask)) +		smp_cross_call(&mask, IPI_CPU_STOP);  	/* Wait up to one second for other CPUs to stop */  	timeout = USEC_PER_SEC; diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index 8200deaa14f..198b08456e9 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c @@ -17,11 +17,190 @@  #include <linux/percpu.h>  #include <linux/node.h>  #include <linux/nodemask.h> +#include <linux/of.h>  #include <linux/sched.h> +#include <linux/slab.h>  #include <asm/cputype.h>  #include <asm/topology.h> +/* + * cpu power scale management + */ + +/* + * cpu power table + * This per cpu data structure describes the relative capacity of each core. + * On a heteregenous system, cores don't have the same computation capacity + * and we reflect that difference in the cpu_power field so the scheduler can + * take this difference into account during load balance. A per cpu structure + * is preferred because each CPU updates its own cpu_power field during the + * load balance except for idle cores. One idle core is selected to run the + * rebalance_domains for all idle cores and the cpu_power can be updated + * during this sequence. + */ +static DEFINE_PER_CPU(unsigned long, cpu_scale); + +unsigned long arch_scale_freq_power(struct sched_domain *sd, int cpu) +{ +	return per_cpu(cpu_scale, cpu); +} + +static void set_power_scale(unsigned int cpu, unsigned long power) +{ +	per_cpu(cpu_scale, cpu) = power; +} + +#ifdef CONFIG_OF +struct cpu_efficiency { +	const char *compatible; +	unsigned long efficiency; +}; + +/* + * Table of relative efficiency of each processors + * The efficiency value must fit in 20bit and the final + * cpu_scale value must be in the range + *   0 < cpu_scale < 3*SCHED_POWER_SCALE/2 + * in order to return at most 1 when DIV_ROUND_CLOSEST + * is used to compute the capacity of a CPU. + * Processors that are not defined in the table, + * use the default SCHED_POWER_SCALE value for cpu_scale. + */ +struct cpu_efficiency table_efficiency[] = { +	{"arm,cortex-a15", 3891}, +	{"arm,cortex-a7",  2048}, +	{NULL, }, +}; + +struct cpu_capacity { +	unsigned long hwid; +	unsigned long capacity; +}; + +struct cpu_capacity *cpu_capacity; + +unsigned long middle_capacity = 1; + +/* + * Iterate all CPUs' descriptor in DT and compute the efficiency + * (as per table_efficiency). Also calculate a middle efficiency + * as close as possible to  (max{eff_i} - min{eff_i}) / 2 + * This is later used to scale the cpu_power field such that an + * 'average' CPU is of middle power. Also see the comments near + * table_efficiency[] and update_cpu_power(). + */ +static void __init parse_dt_topology(void) +{ +	struct cpu_efficiency *cpu_eff; +	struct device_node *cn = NULL; +	unsigned long min_capacity = (unsigned long)(-1); +	unsigned long max_capacity = 0; +	unsigned long capacity = 0; +	int alloc_size, cpu = 0; + +	alloc_size = nr_cpu_ids * sizeof(struct cpu_capacity); +	cpu_capacity = (struct cpu_capacity *)kzalloc(alloc_size, GFP_NOWAIT); + +	while ((cn = of_find_node_by_type(cn, "cpu"))) { +		const u32 *rate, *reg; +		int len; + +		if (cpu >= num_possible_cpus()) +			break; + +		for (cpu_eff = table_efficiency; cpu_eff->compatible; cpu_eff++) +			if (of_device_is_compatible(cn, cpu_eff->compatible)) +				break; + +		if (cpu_eff->compatible == NULL) +			continue; + +		rate = of_get_property(cn, "clock-frequency", &len); +		if (!rate || len != 4) { +			pr_err("%s missing clock-frequency property\n", +				cn->full_name); +			continue; +		} + +		reg = of_get_property(cn, "reg", &len); +		if (!reg || len != 4) { +			pr_err("%s missing reg property\n", cn->full_name); +			continue; +		} + +		capacity = ((be32_to_cpup(rate)) >> 20) * cpu_eff->efficiency; + +		/* Save min capacity of the system */ +		if (capacity < min_capacity) +			min_capacity = capacity; + +		/* Save max capacity of the system */ +		if (capacity > max_capacity) +			max_capacity = capacity; + +		cpu_capacity[cpu].capacity = capacity; +		cpu_capacity[cpu++].hwid = be32_to_cpup(reg); +	} + +	if (cpu < num_possible_cpus()) +		cpu_capacity[cpu].hwid = (unsigned long)(-1); + +	/* If min and max capacities are equals, we bypass the update of the +	 * cpu_scale because all CPUs have the same capacity. Otherwise, we +	 * compute a middle_capacity factor that will ensure that the capacity +	 * of an 'average' CPU of the system will be as close as possible to +	 * SCHED_POWER_SCALE, which is the default value, but with the +	 * constraint explained near table_efficiency[]. +	 */ +	if (min_capacity == max_capacity) +		cpu_capacity[0].hwid = (unsigned long)(-1); +	else if (4*max_capacity < (3*(max_capacity + min_capacity))) +		middle_capacity = (min_capacity + max_capacity) +				>> (SCHED_POWER_SHIFT+1); +	else +		middle_capacity = ((max_capacity / 3) +				>> (SCHED_POWER_SHIFT-1)) + 1; + +} + +/* + * Look for a customed capacity of a CPU in the cpu_capacity table during the + * boot. The update of all CPUs is in O(n^2) for heteregeneous system but the + * function returns directly for SMP system. + */ +void update_cpu_power(unsigned int cpu, unsigned long hwid) +{ +	unsigned int idx = 0; + +	/* look for the cpu's hwid in the cpu capacity table */ +	for (idx = 0; idx < num_possible_cpus(); idx++) { +		if (cpu_capacity[idx].hwid == hwid) +			break; + +		if (cpu_capacity[idx].hwid == -1) +			return; +	} + +	if (idx == num_possible_cpus()) +		return; + +	set_power_scale(cpu, cpu_capacity[idx].capacity / middle_capacity); + +	printk(KERN_INFO "CPU%u: update cpu_power %lu\n", +		cpu, arch_scale_freq_power(NULL, cpu)); +} + +#else +static inline void parse_dt_topology(void) {} +static inline void update_cpu_power(unsigned int cpuid, unsigned int mpidr) {} +#endif + + +/* + * cpu topology management + */ +  #define MPIDR_SMP_BITMASK (0x3 << 30)  #define MPIDR_SMP_VALUE (0x2 << 30) @@ -31,6 +210,7 @@   * These masks reflect the current use of the affinity levels.   * The affinity level can be up to 16 bits according to ARM ARM   */ +#define MPIDR_HWID_BITMASK 0xFFFFFF  #define MPIDR_LEVEL0_MASK 0x3  #define MPIDR_LEVEL0_SHIFT 0 @@ -41,6 +221,9 @@  #define MPIDR_LEVEL2_MASK 0xFF  #define MPIDR_LEVEL2_SHIFT 16 +/* + * cpu topology table + */  struct cputopo_arm cpu_topology[NR_CPUS];  const struct cpumask *cpu_coregroup_mask(int cpu) @@ -48,6 +231,32 @@ const struct cpumask *cpu_coregroup_mask(int cpu)  	return &cpu_topology[cpu].core_sibling;  } +void update_siblings_masks(unsigned int cpuid) +{ +	struct cputopo_arm *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; +	int cpu; + +	/* update core and thread sibling masks */ +	for_each_possible_cpu(cpu) { +		cpu_topo = &cpu_topology[cpu]; + +		if (cpuid_topo->socket_id != cpu_topo->socket_id) +			continue; + +		cpumask_set_cpu(cpuid, &cpu_topo->core_sibling); +		if (cpu != cpuid) +			cpumask_set_cpu(cpu, &cpuid_topo->core_sibling); + +		if (cpuid_topo->core_id != cpu_topo->core_id) +			continue; + +		cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling); +		if (cpu != cpuid) +			cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling); +	} +	smp_wmb(); +} +  /*   * store_cpu_topology is called at boot when only one cpu is running   * and with the mutex cpu_hotplug.lock locked, when several cpus have booted, @@ -57,7 +266,6 @@ void store_cpu_topology(unsigned int cpuid)  {  	struct cputopo_arm *cpuid_topo = &cpu_topology[cpuid];  	unsigned int mpidr; -	unsigned int cpu;  	/* If the cpu topology has been already set, just return */  	if (cpuid_topo->core_id != -1) @@ -99,26 +307,9 @@ void store_cpu_topology(unsigned int cpuid)  		cpuid_topo->socket_id = -1;  	} -	/* update core and thread sibling masks */ -	for_each_possible_cpu(cpu) { -		struct cputopo_arm *cpu_topo = &cpu_topology[cpu]; - -		if (cpuid_topo->socket_id == cpu_topo->socket_id) { -			cpumask_set_cpu(cpuid, &cpu_topo->core_sibling); -			if (cpu != cpuid) -				cpumask_set_cpu(cpu, -					&cpuid_topo->core_sibling); +	update_siblings_masks(cpuid); -			if (cpuid_topo->core_id == cpu_topo->core_id) { -				cpumask_set_cpu(cpuid, -					&cpu_topo->thread_sibling); -				if (cpu != cpuid) -					cpumask_set_cpu(cpu, -						&cpuid_topo->thread_sibling); -			} -		} -	} -	smp_wmb(); +	update_cpu_power(cpuid, mpidr & MPIDR_HWID_BITMASK);  	printk(KERN_INFO "CPU%u: thread %d, cpu %d, socket %d, mpidr %x\n",  		cpuid, cpu_topology[cpuid].thread_id, @@ -134,7 +325,7 @@ void init_cpu_topology(void)  {  	unsigned int cpu; -	/* init core mask */ +	/* init core mask and power*/  	for_each_possible_cpu(cpu) {  		struct cputopo_arm *cpu_topo = &(cpu_topology[cpu]); @@ -143,6 +334,10 @@ void init_cpu_topology(void)  		cpu_topo->socket_id = -1;  		cpumask_clear(&cpu_topo->core_sibling);  		cpumask_clear(&cpu_topo->thread_sibling); + +		set_power_scale(cpu, SCHED_POWER_SCALE);  	}  	smp_wmb(); + +	parse_dt_topology();  } diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 3647170e9a1..f7945218b8c 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -233,9 +233,9 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)  #define S_ISA " ARM"  #endif -static int __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs) +static int __die(const char *str, int err, struct pt_regs *regs)  { -	struct task_struct *tsk = thread->task; +	struct task_struct *tsk = current;  	static int die_counter;  	int ret; @@ -245,12 +245,12 @@ static int __die(const char *str, int err, struct thread_info *thread, struct pt  	/* trap and error numbers are mostly meaningless on ARM */  	ret = notify_die(DIE_OOPS, str, regs, err, tsk->thread.trap_no, SIGSEGV);  	if (ret == NOTIFY_STOP) -		return ret; +		return 1;  	print_modules();  	__show_regs(regs);  	printk(KERN_EMERG "Process %.*s (pid: %d, stack limit = 0x%p)\n", -		TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), thread + 1); +		TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), end_of_stack(tsk));  	if (!user_mode(regs) || in_interrupt()) {  		dump_mem(KERN_EMERG, "Stack: ", regs->ARM_sp, @@ -259,45 +259,77 @@ static int __die(const char *str, int err, struct thread_info *thread, struct pt  		dump_instr(KERN_EMERG, regs);  	} -	return ret; +	return 0;  } -static DEFINE_RAW_SPINLOCK(die_lock); +static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED; +static int die_owner = -1; +static unsigned int die_nest_count; -/* - * This function is protected against re-entrancy. - */ -void die(const char *str, struct pt_regs *regs, int err) +static unsigned long oops_begin(void)  { -	struct thread_info *thread = current_thread_info(); -	int ret; -	enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE; +	int cpu; +	unsigned long flags;  	oops_enter(); -	raw_spin_lock_irq(&die_lock); +	/* racy, but better than risking deadlock. */ +	raw_local_irq_save(flags); +	cpu = smp_processor_id(); +	if (!arch_spin_trylock(&die_lock)) { +		if (cpu == die_owner) +			/* nested oops. should stop eventually */; +		else +			arch_spin_lock(&die_lock); +	} +	die_nest_count++; +	die_owner = cpu;  	console_verbose();  	bust_spinlocks(1); -	if (!user_mode(regs)) -		bug_type = report_bug(regs->ARM_pc, regs); -	if (bug_type != BUG_TRAP_TYPE_NONE) -		str = "Oops - BUG"; -	ret = __die(str, err, thread, regs); +	return flags; +} -	if (regs && kexec_should_crash(thread->task)) +static void oops_end(unsigned long flags, struct pt_regs *regs, int signr) +{ +	if (regs && kexec_should_crash(current))  		crash_kexec(regs);  	bust_spinlocks(0); +	die_owner = -1;  	add_taint(TAINT_DIE); -	raw_spin_unlock_irq(&die_lock); +	die_nest_count--; +	if (!die_nest_count) +		/* Nest count reaches zero, release the lock. */ +		arch_spin_unlock(&die_lock); +	raw_local_irq_restore(flags);  	oops_exit();  	if (in_interrupt())  		panic("Fatal exception in interrupt");  	if (panic_on_oops)  		panic("Fatal exception"); -	if (ret != NOTIFY_STOP) -		do_exit(SIGSEGV); +	if (signr) +		do_exit(signr); +} + +/* + * This function is protected against re-entrancy. + */ +void die(const char *str, struct pt_regs *regs, int err) +{ +	enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE; +	unsigned long flags = oops_begin(); +	int sig = SIGSEGV; + +	if (!user_mode(regs)) +		bug_type = report_bug(regs->ARM_pc, regs); +	if (bug_type != BUG_TRAP_TYPE_NONE) +		str = "Oops - BUG"; + +	if (__die(str, err, regs)) +		sig = 0; + +	oops_end(flags, regs, sig);  }  void arm_notify_die(const char *str, struct pt_regs *regs, @@ -370,18 +402,10 @@ static int call_undef_hook(struct pt_regs *regs, unsigned int instr)  asmlinkage void __exception do_undefinstr(struct pt_regs *regs)  { -	unsigned int correction = thumb_mode(regs) ? 2 : 4;  	unsigned int instr;  	siginfo_t info;  	void __user *pc; -	/* -	 * According to the ARM ARM, PC is 2 or 4 bytes ahead, -	 * depending whether we're in Thumb mode or not. -	 * Correct this offset. -	 */ -	regs->ARM_pc -= correction; -  	pc = (void __user *)instruction_pointer(regs);  	if (processor_mode(regs) == SVC_MODE) { @@ -820,8 +844,6 @@ void __init early_trap_init(void *vectors_base)  	 */  	memcpy((void *)(vectors + KERN_SIGRETURN_CODE - CONFIG_VECTORS_BASE),  	       sigreturn_codes, sizeof(sigreturn_codes)); -	memcpy((void *)(vectors + KERN_RESTART_CODE - CONFIG_VECTORS_BASE), -	       syscall_restart_code, sizeof(syscall_restart_code));  	flush_icache_range(vectors, vectors + PAGE_SIZE);  	modify_domain(DOMAIN_USER, DOMAIN_CLIENT); diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 992769ae259..2473fd1fd51 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -6,9 +6,8 @@  lib-y		:= backtrace.o changebit.o csumipv6.o csumpartial.o   \  		   csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ -		   delay.o findbit.o memchr.o memcpy.o		      \ +		   delay.o delay-loop.o findbit.o memchr.o memcpy.o   \  		   memmove.o memset.o memzero.o setbit.o              \ -		   strncpy_from_user.o strnlen_user.o                 \  		   strchr.o strrchr.o                                 \  		   testchangebit.o testclearbit.o testsetbit.o        \  		   ashldi3.o ashrdi3.o lshrdi3.o muldi3.o             \ diff --git a/arch/arm/lib/delay.S b/arch/arm/lib/delay-loop.S index 3c9a05c8d20..36b668d8e12 100644 --- a/arch/arm/lib/delay.S +++ b/arch/arm/lib/delay-loop.S @@ -9,11 +9,11 @@   */  #include <linux/linkage.h>  #include <asm/assembler.h> -#include <asm/param.h> +#include <asm/delay.h>  		.text  .LC0:		.word	loops_per_jiffy -.LC1:		.word	(2199023*HZ)>>11 +.LC1:		.word	UDELAY_MULT  /*   * r0  <= 2000 @@ -21,10 +21,10 @@   * HZ  <= 1000   */ -ENTRY(__udelay) +ENTRY(__loop_udelay)  		ldr	r2, .LC1  		mul	r0, r2, r0 -ENTRY(__const_udelay)				@ 0 <= r0 <= 0x7fffff06 +ENTRY(__loop_const_udelay)			@ 0 <= r0 <= 0x7fffff06  		mov	r1, #-1  		ldr	r2, .LC0  		ldr	r2, [r2]		@ max = 0x01ffffff @@ -39,12 +39,10 @@ ENTRY(__const_udelay)				@ 0 <= r0 <= 0x7fffff06  /*   * loops = r0 * HZ * loops_per_jiffy / 1000000 - * - * Oh, if only we had a cycle counter...   */  @ Delay routine -ENTRY(__delay) +ENTRY(__loop_delay)  		subs	r0, r0, #1  #if 0  		movls	pc, lr @@ -62,8 +60,8 @@ ENTRY(__delay)  		movls	pc, lr  		subs	r0, r0, #1  #endif -		bhi	__delay +		bhi	__loop_delay  		mov	pc, lr -ENDPROC(__udelay) -ENDPROC(__const_udelay) -ENDPROC(__delay) +ENDPROC(__loop_udelay) +ENDPROC(__loop_const_udelay) +ENDPROC(__loop_delay) diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c new file mode 100644 index 00000000000..d6dacc69254 --- /dev/null +++ b/arch/arm/lib/delay.c @@ -0,0 +1,71 @@ +/* + * Delay loops based on the OpenRISC implementation. + * + * Copyright (C) 2012 ARM Limited + * + * 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. + * + * 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 + * + * Author: Will Deacon <will.deacon@arm.com> + */ + +#include <linux/delay.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/timex.h> + +/* + * Default to the loop-based delay implementation. + */ +struct arm_delay_ops arm_delay_ops = { +	.delay		= __loop_delay, +	.const_udelay	= __loop_const_udelay, +	.udelay		= __loop_udelay, +}; + +#ifdef ARCH_HAS_READ_CURRENT_TIMER +static void __timer_delay(unsigned long cycles) +{ +	cycles_t start = get_cycles(); + +	while ((get_cycles() - start) < cycles) +		cpu_relax(); +} + +static void __timer_const_udelay(unsigned long xloops) +{ +	unsigned long long loops = xloops; +	loops *= loops_per_jiffy; +	__timer_delay(loops >> UDELAY_SHIFT); +} + +static void __timer_udelay(unsigned long usecs) +{ +	__timer_const_udelay(usecs * UDELAY_MULT); +} + +void __init init_current_timer_delay(unsigned long freq) +{ +	pr_info("Switching to timer-based delay loop\n"); +	lpj_fine			= freq / HZ; +	arm_delay_ops.delay		= __timer_delay; +	arm_delay_ops.const_udelay	= __timer_const_udelay; +	arm_delay_ops.udelay		= __timer_udelay; +} + +unsigned long __cpuinit calibrate_delay_is_known(void) +{ +	return lpj_fine; +} +#endif diff --git a/arch/arm/lib/io-acorn.S b/arch/arm/lib/io-acorn.S index 1b197ea7aab..69719bad674 100644 --- a/arch/arm/lib/io-acorn.S +++ b/arch/arm/lib/io-acorn.S @@ -11,13 +11,14 @@   *   */  #include <linux/linkage.h> +#include <linux/kern_levels.h>  #include <asm/assembler.h>  		.text  		.align  .Liosl_warning: -		.ascii	"<4>insl/outsl not implemented, called from %08lX\0" +		.ascii	KERN_WARNING "insl/outsl not implemented, called from %08lX\0"  		.align  /* diff --git a/arch/arm/lib/strncpy_from_user.S b/arch/arm/lib/strncpy_from_user.S deleted file mode 100644 index f202d7bd164..00000000000 --- a/arch/arm/lib/strncpy_from_user.S +++ /dev/null @@ -1,43 +0,0 @@ -/* - *  linux/arch/arm/lib/strncpy_from_user.S - * - *  Copyright (C) 1995-2000 Russell King - * - * 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/linkage.h> -#include <asm/assembler.h> -#include <asm/errno.h> - -	.text -	.align	5 - -/* - * Copy a string from user space to kernel space. - *  r0 = dst, r1 = src, r2 = byte length - * returns the number of characters copied (strlen of copied string), - *  -EFAULT on exception, or "len" if we fill the whole buffer - */ -ENTRY(__strncpy_from_user) -	mov	ip, r1 -1:	subs	r2, r2, #1 -	ldrusr	r3, r1, 1, pl -	bmi	2f -	strb	r3, [r0], #1 -	teq	r3, #0 -	bne	1b -	sub	r1, r1, #1	@ take NUL character out of count -2:	sub	r0, r1, ip -	mov	pc, lr -ENDPROC(__strncpy_from_user) - -	.pushsection .fixup,"ax" -	.align	0 -9001:	mov	r3, #0 -	strb	r3, [r0, #0]	@ null terminate -	mov	r0, #-EFAULT -	mov	pc, lr -	.popsection - diff --git a/arch/arm/lib/strnlen_user.S b/arch/arm/lib/strnlen_user.S deleted file mode 100644 index 0ecbb459c4f..00000000000 --- a/arch/arm/lib/strnlen_user.S +++ /dev/null @@ -1,40 +0,0 @@ -/* - *  linux/arch/arm/lib/strnlen_user.S - * - *  Copyright (C) 1995-2000 Russell King - * - * 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/linkage.h> -#include <asm/assembler.h> -#include <asm/errno.h> - -	.text -	.align	5 - -/* Prototype: unsigned long __strnlen_user(const char *str, long n) - * Purpose  : get length of a string in user memory - * Params   : str - address of string in user memory - * Returns  : length of string *including terminator* - *	      or zero on exception, or n + 1 if too long - */ -ENTRY(__strnlen_user) -	mov	r2, r0 -1: -	ldrusr	r3, r0, 1 -	teq	r3, #0 -	beq	2f -	subs	r1, r1, #1 -	bne	1b -	add	r0, r0, #1 -2:	sub	r0, r0, r2 -	mov	pc, lr -ENDPROC(__strnlen_user) - -	.pushsection .fixup,"ax" -	.align	0 -9001:	mov	r0, #0 -	mov	pc, lr -	.popsection diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 19505c0a3f0..c8050b14e61 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig @@ -29,12 +29,16 @@ comment "Atmel AT91 Processor"  config SOC_AT91SAM9  	bool  	select CPU_ARM926T +	select MULTI_IRQ_HANDLER +	select SPARSE_IRQ  	select AT91_SAM9_TIME  	select AT91_SAM9_SMC  config SOC_AT91RM9200  	bool "AT91RM9200"  	select CPU_ARM920T +	select MULTI_IRQ_HANDLER +	select SPARSE_IRQ  	select GENERIC_CLOCKEVENTS  	select HAVE_AT91_DBGU0 @@ -140,6 +144,8 @@ config ARCH_AT91SAM9G45  config ARCH_AT91X40  	bool "AT91x40"  	depends on !MMU +	select MULTI_IRQ_HANDLER +	select SPARSE_IRQ  	select ARCH_USES_GETTIMEOFFSET  endchoice diff --git a/arch/arm/mach-at91/Makefile.boot b/arch/arm/mach-at91/Makefile.boot index 9e84fe4f2aa..30bb7332e30 100644 --- a/arch/arm/mach-at91/Makefile.boot +++ b/arch/arm/mach-at91/Makefile.boot @@ -15,7 +15,9 @@ endif  # Keep dtb files sorted alphabetically for each SoC  # sam9260 +dtb-$(CONFIG_MACH_AT91SAM_DT) += aks-cdu.dtb  dtb-$(CONFIG_MACH_AT91SAM_DT) += ethernut5.dtb +dtb-$(CONFIG_MACH_AT91SAM_DT) += evk-pro3.dtb  dtb-$(CONFIG_MACH_AT91SAM_DT) += tny_a9260.dtb  dtb-$(CONFIG_MACH_AT91SAM_DT) += usb_a9260.dtb  # sam9263 diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 26917687fc3..6f50c672227 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c @@ -17,6 +17,7 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91rm9200.h> +#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/at91_st.h>  #include <mach/cpu.h> diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index e6b7d0533dd..01fb7325fec 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -41,8 +41,8 @@ static struct resource usbh_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_UHP, -		.end	= AT91RM9200_ID_UHP, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_UHP, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_UHP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -94,8 +94,8 @@ static struct resource udc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_UDP, -		.end	= AT91RM9200_ID_UDP, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_UDP, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_UDP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -145,8 +145,8 @@ static struct resource eth_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_EMAC, -		.end	= AT91RM9200_ID_EMAC, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_EMAC, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_EMAC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -305,8 +305,8 @@ static struct resource mmc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_MCI, -		.end	= AT91RM9200_ID_MCI, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_MCI, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_MCI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -488,8 +488,8 @@ static struct resource twi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_TWI, -		.end	= AT91RM9200_ID_TWI, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_TWI, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_TWI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -532,8 +532,8 @@ static struct resource spi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_SPI, -		.end	= AT91RM9200_ID_SPI, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_SPI, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_SPI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -598,18 +598,18 @@ static struct resource tcb0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_TC0, -		.end	= AT91RM9200_ID_TC0, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_TC0, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_TC0,  		.flags	= IORESOURCE_IRQ,  	},  	[2] = { -		.start	= AT91RM9200_ID_TC1, -		.end	= AT91RM9200_ID_TC1, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_TC1, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_TC1,  		.flags	= IORESOURCE_IRQ,  	},  	[3] = { -		.start	= AT91RM9200_ID_TC2, -		.end	= AT91RM9200_ID_TC2, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_TC2, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_TC2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -628,18 +628,18 @@ static struct resource tcb1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_TC3, -		.end	= AT91RM9200_ID_TC3, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_TC3, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_TC3,  		.flags	= IORESOURCE_IRQ,  	},  	[2] = { -		.start	= AT91RM9200_ID_TC4, -		.end	= AT91RM9200_ID_TC4, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_TC4, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_TC4,  		.flags	= IORESOURCE_IRQ,  	},  	[3] = { -		.start	= AT91RM9200_ID_TC5, -		.end	= AT91RM9200_ID_TC5, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_TC5, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_TC5,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -673,8 +673,8 @@ static struct resource rtc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -729,8 +729,8 @@ static struct resource ssc0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_SSC0, -		.end	= AT91RM9200_ID_SSC0, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_SSC0, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_SSC0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -771,8 +771,8 @@ static struct resource ssc1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_SSC1, -		.end	= AT91RM9200_ID_SSC1, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_SSC1, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_SSC1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -813,8 +813,8 @@ static struct resource ssc2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_SSC2, -		.end	= AT91RM9200_ID_SSC2, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_SSC2, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_SSC2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -897,8 +897,8 @@ static struct resource dbgu_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -935,8 +935,8 @@ static struct resource uart0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_US0, -		.end	= AT91RM9200_ID_US0, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_US0, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_US0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -984,8 +984,8 @@ static struct resource uart1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_US1, -		.end	= AT91RM9200_ID_US1, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_US1, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_US1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1035,8 +1035,8 @@ static struct resource uart2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_US2, -		.end	= AT91RM9200_ID_US2, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_US2, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_US2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1078,8 +1078,8 @@ static struct resource uart3_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91RM9200_ID_US3, -		.end	= AT91RM9200_ID_US3, +		.start	= NR_IRQS_LEGACY + AT91RM9200_ID_US3, +		.end	= NR_IRQS_LEGACY + AT91RM9200_ID_US3,  		.flags	= IORESOURCE_IRQ,  	},  }; diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 2b1e438ed87..30c7f26a466 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c @@ -20,6 +20,7 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91sam9260.h> +#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/at91_rstc.h> diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 0ded951f785..7b9c2ba396e 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -45,8 +45,8 @@ static struct resource usbh_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_UHP, -		.end	= AT91SAM9260_ID_UHP, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_UHP, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_UHP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -98,8 +98,8 @@ static struct resource udc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_UDP, -		.end	= AT91SAM9260_ID_UDP, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_UDP, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_UDP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -149,8 +149,8 @@ static struct resource eth_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_EMAC, -		.end	= AT91SAM9260_ID_EMAC, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_EMAC, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_EMAC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -223,8 +223,8 @@ static struct resource mmc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_MCI, -		.end	= AT91SAM9260_ID_MCI, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_MCI, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_MCI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -305,8 +305,8 @@ static struct resource mmc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_MCI, -		.end	= AT91SAM9260_ID_MCI, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_MCI, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_MCI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -496,8 +496,8 @@ static struct resource twi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_TWI, -		.end	= AT91SAM9260_ID_TWI, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_TWI, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_TWI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -540,8 +540,8 @@ static struct resource spi0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_SPI0, -		.end	= AT91SAM9260_ID_SPI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_SPI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_SPI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -566,8 +566,8 @@ static struct resource spi1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_SPI1, -		.end	= AT91SAM9260_ID_SPI1, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_SPI1, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_SPI1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -652,18 +652,18 @@ static struct resource tcb0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_TC0, -		.end	= AT91SAM9260_ID_TC0, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC0, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC0,  		.flags	= IORESOURCE_IRQ,  	},  	[2] = { -		.start	= AT91SAM9260_ID_TC1, -		.end	= AT91SAM9260_ID_TC1, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC1, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC1,  		.flags	= IORESOURCE_IRQ,  	},  	[3] = { -		.start	= AT91SAM9260_ID_TC2, -		.end	= AT91SAM9260_ID_TC2, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC2, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -682,18 +682,18 @@ static struct resource tcb1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_TC3, -		.end	= AT91SAM9260_ID_TC3, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC3, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC3,  		.flags	= IORESOURCE_IRQ,  	},  	[2] = { -		.start	= AT91SAM9260_ID_TC4, -		.end	= AT91SAM9260_ID_TC4, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC4, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC4,  		.flags	= IORESOURCE_IRQ,  	},  	[3] = { -		.start	= AT91SAM9260_ID_TC5, -		.end	= AT91SAM9260_ID_TC5, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC5, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_TC5,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -807,8 +807,8 @@ static struct resource ssc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_SSC, -		.end	= AT91SAM9260_ID_SSC, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_SSC, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_SSC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -882,8 +882,8 @@ static struct resource dbgu_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -920,8 +920,8 @@ static struct resource uart0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_US0, -		.end	= AT91SAM9260_ID_US0, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_US0, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_US0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -971,8 +971,8 @@ static struct resource uart1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_US1, -		.end	= AT91SAM9260_ID_US1, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_US1, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_US1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1014,8 +1014,8 @@ static struct resource uart2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_US2, -		.end	= AT91SAM9260_ID_US2, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_US2, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_US2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1057,8 +1057,8 @@ static struct resource uart3_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_US3, -		.end	= AT91SAM9260_ID_US3, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_US3, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_US3,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1100,8 +1100,8 @@ static struct resource uart4_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_US4, -		.end	= AT91SAM9260_ID_US4, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_US4, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_US4,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1138,8 +1138,8 @@ static struct resource uart5_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_US5, -		.end	= AT91SAM9260_ID_US5, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_US5, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_US5,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1357,8 +1357,8 @@ static struct resource adc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9260_ID_ADC, -		.end	= AT91SAM9260_ID_ADC, +		.start	= NR_IRQS_LEGACY + AT91SAM9260_ID_ADC, +		.end	= NR_IRQS_LEGACY + AT91SAM9260_ID_ADC,  		.flags	= IORESOURCE_IRQ,  	},  }; diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index c77d503d09d..f40762c5fed 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c @@ -19,6 +19,7 @@  #include <asm/system_misc.h>  #include <mach/cpu.h>  #include <mach/at91sam9261.h> +#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/at91_rstc.h> diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 9295e90b08f..8df5c1bdff9 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -45,8 +45,8 @@ static struct resource usbh_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_UHP, -		.end	= AT91SAM9261_ID_UHP, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_UHP, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_UHP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -98,8 +98,8 @@ static struct resource udc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_UDP, -		.end	= AT91SAM9261_ID_UDP, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_UDP, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_UDP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -148,8 +148,8 @@ static struct resource mmc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_MCI, -		.end	= AT91SAM9261_ID_MCI, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_MCI, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_MCI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -310,8 +310,8 @@ static struct resource twi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_TWI, -		.end	= AT91SAM9261_ID_TWI, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_TWI, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_TWI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -354,8 +354,8 @@ static struct resource spi0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_SPI0, -		.end	= AT91SAM9261_ID_SPI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_SPI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_SPI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -380,8 +380,8 @@ static struct resource spi1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_SPI1, -		.end	= AT91SAM9261_ID_SPI1, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_SPI1, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_SPI1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -468,8 +468,8 @@ static struct resource lcdc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_LCDC, -		.end	= AT91SAM9261_ID_LCDC, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_LCDC, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_LCDC,  		.flags	= IORESOURCE_IRQ,  	},  #if defined(CONFIG_FB_INTSRAM) @@ -566,18 +566,18 @@ static struct resource tcb_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_TC0, -		.end	= AT91SAM9261_ID_TC0, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_TC0, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_TC0,  		.flags	= IORESOURCE_IRQ,  	},  	[2] = { -		.start	= AT91SAM9261_ID_TC1, -		.end	= AT91SAM9261_ID_TC1, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_TC1, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_TC1,  		.flags	= IORESOURCE_IRQ,  	},  	[3] = { -		.start	= AT91SAM9261_ID_TC2, -		.end	= AT91SAM9261_ID_TC2, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_TC2, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_TC2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -689,8 +689,8 @@ static struct resource ssc0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_SSC0, -		.end	= AT91SAM9261_ID_SSC0, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_SSC0, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_SSC0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -731,8 +731,8 @@ static struct resource ssc1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_SSC1, -		.end	= AT91SAM9261_ID_SSC1, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_SSC1, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_SSC1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -773,8 +773,8 @@ static struct resource ssc2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_SSC2, -		.end	= AT91SAM9261_ID_SSC2, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_SSC2, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_SSC2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -857,8 +857,8 @@ static struct resource dbgu_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -895,8 +895,8 @@ static struct resource uart0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_US0, -		.end	= AT91SAM9261_ID_US0, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_US0, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_US0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -938,8 +938,8 @@ static struct resource uart1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_US1, -		.end	= AT91SAM9261_ID_US1, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_US1, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_US1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -981,8 +981,8 @@ static struct resource uart2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9261_ID_US2, -		.end	= AT91SAM9261_ID_US2, +		.start	= NR_IRQS_LEGACY + AT91SAM9261_ID_US2, +		.end	= NR_IRQS_LEGACY + AT91SAM9261_ID_US2,  		.flags	= IORESOURCE_IRQ,  	},  }; diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index ed91c7e9f7c..84b38105231 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c @@ -18,6 +18,7 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91sam9263.h> +#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/at91_rstc.h> diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 175e0009eaa..eb6bbf86fb9 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -44,8 +44,8 @@ static struct resource usbh_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_UHP, -		.end	= AT91SAM9263_ID_UHP, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_UHP, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_UHP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -104,8 +104,8 @@ static struct resource udc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_UDP, -		.end	= AT91SAM9263_ID_UDP, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_UDP, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_UDP,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -155,8 +155,8 @@ static struct resource eth_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_EMAC, -		.end	= AT91SAM9263_ID_EMAC, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_EMAC, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_EMAC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -229,8 +229,8 @@ static struct resource mmc0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_MCI0, -		.end	= AT91SAM9263_ID_MCI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_MCI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_MCI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -254,8 +254,8 @@ static struct resource mmc1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_MCI1, -		.end	= AT91SAM9263_ID_MCI1, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_MCI1, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_MCI1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -567,8 +567,8 @@ static struct resource twi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_TWI, -		.end	= AT91SAM9263_ID_TWI, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_TWI, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_TWI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -611,8 +611,8 @@ static struct resource spi0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_SPI0, -		.end	= AT91SAM9263_ID_SPI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_SPI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_SPI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -637,8 +637,8 @@ static struct resource spi1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_SPI1, -		.end	= AT91SAM9263_ID_SPI1, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_SPI1, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_SPI1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -725,8 +725,8 @@ static struct resource ac97_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_AC97C, -		.end	= AT91SAM9263_ID_AC97C, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_AC97C, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_AC97C,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -776,8 +776,8 @@ static struct resource can_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_CAN, -		.end	= AT91SAM9263_ID_CAN, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_CAN, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_CAN,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -816,8 +816,8 @@ static struct resource lcdc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_LCDC, -		.end	= AT91SAM9263_ID_LCDC, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_LCDC, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_LCDC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -883,8 +883,8 @@ struct resource isi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_ISI, -		.end	= AT91SAM9263_ID_ISI, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_ISI, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_ISI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -940,8 +940,8 @@ static struct resource tcb_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_TCB, -		.end	= AT91SAM9263_ID_TCB, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_TCB, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_TCB,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1108,8 +1108,8 @@ static struct resource pwm_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_PWMC, -		.end	= AT91SAM9263_ID_PWMC, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_PWMC, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_PWMC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1161,8 +1161,8 @@ static struct resource ssc0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_SSC0, -		.end	= AT91SAM9263_ID_SSC0, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_SSC0, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_SSC0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1203,8 +1203,8 @@ static struct resource ssc1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_SSC1, -		.end	= AT91SAM9263_ID_SSC1, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_SSC1, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_SSC1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1284,8 +1284,8 @@ static struct resource dbgu_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1322,8 +1322,8 @@ static struct resource uart0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_US0, -		.end	= AT91SAM9263_ID_US0, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_US0, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_US0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1365,8 +1365,8 @@ static struct resource uart1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_US1, -		.end	= AT91SAM9263_ID_US1, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_US1, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_US1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1408,8 +1408,8 @@ static struct resource uart2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9263_ID_US2, -		.end	= AT91SAM9263_ID_US2, +		.start	= NR_IRQS_LEGACY + AT91SAM9263_ID_US2, +		.end	= NR_IRQS_LEGACY + AT91SAM9263_ID_US2,  		.flags	= IORESOURCE_IRQ,  	},  }; diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index a94758b4273..ffc0957d762 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c @@ -137,7 +137,7 @@ static struct irqaction at91sam926x_pit_irq = {  	.name		= "at91_tick",  	.flags		= IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,  	.handler	= at91sam926x_pit_interrupt, -	.irq		= AT91_ID_SYS, +	.irq		= NR_IRQS_LEGACY + AT91_ID_SYS,  };  static void at91sam926x_pit_reset(void) diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 4792682d52b..ef6cedd52e3 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -18,6 +18,7 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91sam9g45.h> +#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> @@ -182,6 +183,13 @@ static struct clk adc_op_clk = {  	.rate_hz	= 13200000,  }; +/* AES/TDES/SHA clock - Only for sam9m11/sam9g56 */ +static struct clk aestdessha_clk = { +	.name		= "aestdessha_clk", +	.pmc_mask	= 1 << AT91SAM9G45_ID_AESTDESSHA, +	.type		= CLK_TYPE_PERIPHERAL, +}; +  static struct clk *periph_clocks[] __initdata = {  	&pioA_clk,  	&pioB_clk, @@ -211,6 +219,7 @@ static struct clk *periph_clocks[] __initdata = {  	&udphs_clk,  	&mmc1_clk,  	&adc_op_clk, +	&aestdessha_clk,  	// irq0  }; @@ -231,6 +240,9 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),  	CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),  	CLKDEV_CON_DEV_ID(NULL, "atmel-trng", &trng_clk), +	CLKDEV_CON_DEV_ID(NULL, "atmel_sha", &aestdessha_clk), +	CLKDEV_CON_DEV_ID(NULL, "atmel_tdes", &aestdessha_clk), +	CLKDEV_CON_DEV_ID(NULL, "atmel_aes", &aestdessha_clk),  	/* more usart lookup table for DT entries */  	CLKDEV_CON_DEV_ID("usart", "ffffee00.serial", &mck),  	CLKDEV_CON_DEV_ID("usart", "fff8c000.serial", &usart0_clk), @@ -387,7 +399,7 @@ static unsigned int at91sam9g45_default_irq_priority[NR_AIC_IRQS] __initdata = {  	3,	/* Ethernet */  	0,	/* Image Sensor Interface */  	2,	/* USB Device High speed port */ -	0, +	0,	/* AESTDESSHA Crypto HW Accelerators */  	0,	/* Multimedia Card Interface 1 */  	0,  	0,	/* Advanced Interrupt Controller (IRQ0) */ diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 933fc9afe7d..06073996a38 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -18,6 +18,7 @@  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h>  #include <linux/atmel-mci.h> +#include <linux/platform_data/atmel-aes.h>  #include <linux/platform_data/at91_adc.h> @@ -53,8 +54,8 @@ static struct resource hdmac_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_DMA, -		.end	= AT91SAM9G45_ID_DMA, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_DMA, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_DMA,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -94,8 +95,8 @@ static struct resource usbh_ohci_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_UHPHS, -		.end	= AT91SAM9G45_ID_UHPHS, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_UHPHS, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_UHPHS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -156,8 +157,8 @@ static struct resource usbh_ehci_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_UHPHS, -		.end	= AT91SAM9G45_ID_UHPHS, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_UHPHS, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_UHPHS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -213,8 +214,8 @@ static struct resource usba_udc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[2] = { -		.start	= AT91SAM9G45_ID_UDPHS, -		.end	= AT91SAM9G45_ID_UDPHS, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_UDPHS, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_UDPHS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -296,8 +297,8 @@ static struct resource eth_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_EMAC, -		.end	= AT91SAM9G45_ID_EMAC, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_EMAC, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_EMAC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -370,8 +371,8 @@ static struct resource mmc0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_MCI0, -		.end	= AT91SAM9G45_ID_MCI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_MCI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_MCI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -395,8 +396,8 @@ static struct resource mmc1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_MCI1, -		.end	= AT91SAM9G45_ID_MCI1, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_MCI1, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_MCI1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -645,8 +646,8 @@ static struct resource twi0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_TWI0, -		.end	= AT91SAM9G45_ID_TWI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TWI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TWI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -665,8 +666,8 @@ static struct resource twi1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_TWI1, -		.end	= AT91SAM9G45_ID_TWI1, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TWI1, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TWI1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -720,8 +721,8 @@ static struct resource spi0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_SPI0, -		.end	= AT91SAM9G45_ID_SPI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SPI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SPI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -746,8 +747,8 @@ static struct resource spi1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_SPI1, -		.end	= AT91SAM9G45_ID_SPI1, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SPI1, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SPI1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -834,8 +835,8 @@ static struct resource ac97_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_AC97C, -		.end	= AT91SAM9G45_ID_AC97C, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AC97C, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AC97C,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -887,8 +888,8 @@ struct resource isi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_ISI, -		.end	= AT91SAM9G45_ID_ISI, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_ISI, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_ISI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -979,8 +980,8 @@ static struct resource lcdc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_LCDC, -		.end	= AT91SAM9G45_ID_LCDC, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_LCDC, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_LCDC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1054,8 +1055,8 @@ static struct resource tcb0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_TCB, -		.end	= AT91SAM9G45_ID_TCB, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TCB, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TCB,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1075,8 +1076,8 @@ static struct resource tcb1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_TCB, -		.end	= AT91SAM9G45_ID_TCB, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TCB, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TCB,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1110,8 +1111,8 @@ static struct resource rtc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1147,8 +1148,8 @@ static struct resource tsadcc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_TSC, -		.end	= AT91SAM9G45_ID_TSC, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TSC, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TSC,  		.flags	= IORESOURCE_IRQ,  	}  }; @@ -1197,8 +1198,8 @@ static struct resource adc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_TSC, -		.end	= AT91SAM9G45_ID_TSC, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TSC, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_TSC,  		.flags	= IORESOURCE_IRQ,  	}  }; @@ -1400,8 +1401,8 @@ static struct resource pwm_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_PWMC, -		.end	= AT91SAM9G45_ID_PWMC, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_PWMC, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_PWMC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1453,8 +1454,8 @@ static struct resource ssc0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_SSC0, -		.end	= AT91SAM9G45_ID_SSC0, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SSC0, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SSC0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1495,8 +1496,8 @@ static struct resource ssc1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_SSC1, -		.end	= AT91SAM9G45_ID_SSC1, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SSC1, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_SSC1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1575,8 +1576,8 @@ static struct resource dbgu_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1613,8 +1614,8 @@ static struct resource uart0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_US0, -		.end	= AT91SAM9G45_ID_US0, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US0, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1656,8 +1657,8 @@ static struct resource uart1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_US1, -		.end	= AT91SAM9G45_ID_US1, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US1, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1699,8 +1700,8 @@ static struct resource uart2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_US2, -		.end	= AT91SAM9G45_ID_US2, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US2, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1742,8 +1743,8 @@ static struct resource uart3_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9G45_ID_US3, -		.end	= AT91SAM9G45_ID_US3, +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US3, +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_US3,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1830,6 +1831,130 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}  void __init at91_add_device_serial(void) {}  #endif +/* -------------------------------------------------------------------- + *  SHA1/SHA256 + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_CRYPTO_DEV_ATMEL_SHA) || defined(CONFIG_CRYPTO_DEV_ATMEL_SHA_MODULE) +static struct resource sha_resources[] = { +	{ +		.start	= AT91SAM9G45_BASE_SHA, +		.end	= AT91SAM9G45_BASE_SHA + SZ_16K - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= AT91SAM9G45_ID_AESTDESSHA, +		.end	= AT91SAM9G45_ID_AESTDESSHA, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device at91sam9g45_sha_device = { +	.name	= "atmel_sha", +	.id		= -1, +	.resource	= sha_resources, +	.num_resources	= ARRAY_SIZE(sha_resources), +}; + +static void __init at91_add_device_sha(void) +{ +	platform_device_register(&at91sam9g45_sha_device); +} +#else +static void __init at91_add_device_sha(void) {} +#endif + +/* -------------------------------------------------------------------- + *  DES/TDES + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_CRYPTO_DEV_ATMEL_TDES) || defined(CONFIG_CRYPTO_DEV_ATMEL_TDES_MODULE) +static struct resource tdes_resources[] = { +	[0] = { +		.start	= AT91SAM9G45_BASE_TDES, +		.end	= AT91SAM9G45_BASE_TDES + SZ_16K - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= AT91SAM9G45_ID_AESTDESSHA, +		.end	= AT91SAM9G45_ID_AESTDESSHA, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device at91sam9g45_tdes_device = { +	.name	= "atmel_tdes", +	.id		= -1, +	.resource	= tdes_resources, +	.num_resources	= ARRAY_SIZE(tdes_resources), +}; + +static void __init at91_add_device_tdes(void) +{ +	platform_device_register(&at91sam9g45_tdes_device); +} +#else +static void __init at91_add_device_tdes(void) {} +#endif + +/* -------------------------------------------------------------------- + *  AES + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_CRYPTO_DEV_ATMEL_AES) || defined(CONFIG_CRYPTO_DEV_ATMEL_AES_MODULE) +static struct aes_platform_data aes_data; +static u64 aes_dmamask = DMA_BIT_MASK(32); + +static struct resource aes_resources[] = { +	[0] = { +		.start	= AT91SAM9G45_BASE_AES, +		.end	= AT91SAM9G45_BASE_AES + SZ_16K - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= AT91SAM9G45_ID_AESTDESSHA, +		.end	= AT91SAM9G45_ID_AESTDESSHA, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device at91sam9g45_aes_device = { +	.name	= "atmel_aes", +	.id		= -1, +	.dev	= { +		.dma_mask		= &aes_dmamask, +		.coherent_dma_mask	= DMA_BIT_MASK(32), +		.platform_data		= &aes_data, +	}, +	.resource	= aes_resources, +	.num_resources	= ARRAY_SIZE(aes_resources), +}; + +static void __init at91_add_device_aes(void) +{ +	struct at_dma_slave	*atslave; +	struct aes_dma_data	*alt_atslave; + +	alt_atslave = kzalloc(sizeof(struct aes_dma_data), GFP_KERNEL); + +	/* DMA TX slave channel configuration */ +	atslave = &alt_atslave->txdata; +	atslave->dma_dev = &at_hdmac_device.dev; +	atslave->cfg = ATC_FIFOCFG_ENOUGHSPACE	| ATC_SRC_H2SEL_HW | +						ATC_SRC_PER(AT_DMA_ID_AES_RX); + +	/* DMA RX slave channel configuration */ +	atslave = &alt_atslave->rxdata; +	atslave->dma_dev = &at_hdmac_device.dev; +	atslave->cfg = ATC_FIFOCFG_ENOUGHSPACE	| ATC_DST_H2SEL_HW | +						ATC_DST_PER(AT_DMA_ID_AES_TX); + +	aes_data.dma_slave = alt_atslave; +	platform_device_register(&at91sam9g45_aes_device); +} +#else +static void __init at91_add_device_aes(void) {} +#endif  /* -------------------------------------------------------------------- */  /* @@ -1847,6 +1972,9 @@ static int __init at91_add_standard_devices(void)  	at91_add_device_trng();  	at91_add_device_watchdog();  	at91_add_device_tc(); +	at91_add_device_sha(); +	at91_add_device_tdes(); +	at91_add_device_aes();  	return 0;  } diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index e420085a57e..72ce50a50de 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c @@ -19,6 +19,7 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91sam9rl.h> +#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/at91_rstc.h> diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 9c0b1481a9a..f09fff93217 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -41,8 +41,8 @@ static struct resource hdmac_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[2] = { -		.start	= AT91SAM9RL_ID_DMA, -		.end	= AT91SAM9RL_ID_DMA, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_DMA, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_DMA,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -84,8 +84,8 @@ static struct resource usba_udc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[2] = { -		.start	= AT91SAM9RL_ID_UDPHS, -		.end	= AT91SAM9RL_ID_UDPHS, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_UDPHS, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_UDPHS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -172,8 +172,8 @@ static struct resource mmc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_MCI, -		.end	= AT91SAM9RL_ID_MCI, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_MCI, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_MCI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -339,8 +339,8 @@ static struct resource twi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_TWI0, -		.end	= AT91SAM9RL_ID_TWI0, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TWI0, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TWI0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -383,8 +383,8 @@ static struct resource spi_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_SPI, -		.end	= AT91SAM9RL_ID_SPI, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_SPI, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_SPI,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -452,8 +452,8 @@ static struct resource ac97_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_AC97C, -		.end	= AT91SAM9RL_ID_AC97C, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_AC97C, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_AC97C,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -507,8 +507,8 @@ static struct resource lcdc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_LCDC, -		.end	= AT91SAM9RL_ID_LCDC, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_LCDC, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_LCDC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -574,18 +574,18 @@ static struct resource tcb_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_TC0, -		.end	= AT91SAM9RL_ID_TC0, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TC0, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TC0,  		.flags	= IORESOURCE_IRQ,  	},  	[2] = { -		.start	= AT91SAM9RL_ID_TC1, -		.end	= AT91SAM9RL_ID_TC1, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TC1, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TC1,  		.flags	= IORESOURCE_IRQ,  	},  	[3] = { -		.start	= AT91SAM9RL_ID_TC2, -		.end	= AT91SAM9RL_ID_TC2, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TC2, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TC2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -621,8 +621,8 @@ static struct resource tsadcc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_TSC, -		.end	= AT91SAM9RL_ID_TSC, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TSC, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_TSC,  		.flags	= IORESOURCE_IRQ,  	}  }; @@ -768,8 +768,8 @@ static struct resource pwm_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_PWMC, -		.end	= AT91SAM9RL_ID_PWMC, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_PWMC, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_PWMC,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -821,8 +821,8 @@ static struct resource ssc0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_SSC0, -		.end	= AT91SAM9RL_ID_SSC0, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_SSC0, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_SSC0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -863,8 +863,8 @@ static struct resource ssc1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_SSC1, -		.end	= AT91SAM9RL_ID_SSC1, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_SSC1, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_SSC1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -943,8 +943,8 @@ static struct resource dbgu_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91_ID_SYS, -		.end	= AT91_ID_SYS, +		.start	= NR_IRQS_LEGACY + AT91_ID_SYS, +		.end	= NR_IRQS_LEGACY + AT91_ID_SYS,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -981,8 +981,8 @@ static struct resource uart0_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_US0, -		.end	= AT91SAM9RL_ID_US0, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US0, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US0,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1032,8 +1032,8 @@ static struct resource uart1_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_US1, -		.end	= AT91SAM9RL_ID_US1, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US1, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US1,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1075,8 +1075,8 @@ static struct resource uart2_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_US2, -		.end	= AT91SAM9RL_ID_US2, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US2, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US2,  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -1118,8 +1118,8 @@ static struct resource uart3_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= AT91SAM9RL_ID_US3, -		.end	= AT91SAM9RL_ID_US3, +		.start	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US3, +		.end	= NR_IRQS_LEGACY + AT91SAM9RL_ID_US3,  		.flags	= IORESOURCE_IRQ,  	},  }; diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index 1b144b4d3ce..477cf9d0667 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c @@ -312,8 +312,6 @@ static void __init at91sam9x5_map_io(void)  void __init at91sam9x5_initialize(void)  { -	at91_extern_irq = (1 << AT91SAM9X5_ID_IRQ0); -  	/* Register GPIO subsystem (using DT) */  	at91_gpio_init(NULL, 0);  } @@ -321,47 +319,9 @@ void __init at91sam9x5_initialize(void)  /* --------------------------------------------------------------------   *  Interrupt initialization   * -------------------------------------------------------------------- */ -/* - * The default interrupt priority levels (0 = lowest, 7 = highest). - */ -static unsigned int at91sam9x5_default_irq_priority[NR_AIC_IRQS] __initdata = { -	7,	/* Advanced Interrupt Controller (FIQ) */ -	7,	/* System Peripherals */ -	1,	/* Parallel IO Controller A and B */ -	1,	/* Parallel IO Controller C and D */ -	4,	/* Soft Modem */ -	5,	/* USART 0 */ -	5,	/* USART 1 */ -	5,	/* USART 2 */ -	5,	/* USART 3 */ -	6,	/* Two-Wire Interface 0 */ -	6,	/* Two-Wire Interface 1 */ -	6,	/* Two-Wire Interface 2 */ -	0,	/* Multimedia Card Interface 0 */ -	5,	/* Serial Peripheral Interface 0 */ -	5,	/* Serial Peripheral Interface 1 */ -	5,	/* UART 0 */ -	5,	/* UART 1 */ -	0,	/* Timer Counter 0, 1, 2, 3, 4 and 5 */ -	0,	/* Pulse Width Modulation Controller */ -	0,	/* ADC Controller */ -	0,	/* DMA Controller 0 */ -	0,	/* DMA Controller 1 */ -	2,	/* USB Host High Speed port */ -	2,	/* USB Device High speed port */ -	3,	/* Ethernet MAC 0 */ -	3,	/* LDC Controller or Image Sensor Interface */ -	0,	/* Multimedia Card Interface 1 */ -	3,	/* Ethernet MAC 1 */ -	4,	/* Synchronous Serial Interface */ -	4,	/* CAN Controller 0 */ -	4,	/* CAN Controller 1 */ -	0,	/* Advanced Interrupt Controller (IRQ0) */ -};  struct at91_init_soc __initdata at91sam9x5_soc = {  	.map_io = at91sam9x5_map_io, -	.default_irq_priority = at91sam9x5_default_irq_priority,  	.register_clocks = at91sam9x5_register_clocks,  	.init = at91sam9x5_initialize,  }; diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c index d62fe090d81..46090e642d8 100644 --- a/arch/arm/mach-at91/at91x40.c +++ b/arch/arm/mach-at91/at91x40.c @@ -13,10 +13,12 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/irq.h> +#include <linux/io.h>  #include <asm/proc-fns.h>  #include <asm/system_misc.h>  #include <asm/mach/arch.h>  #include <mach/at91x40.h> +#include <mach/at91_aic.h>  #include <mach/at91_st.h>  #include <mach/timex.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c index 271f994314a..22d8856094f 100644 --- a/arch/arm/mach-at91/board-1arm.c +++ b/arch/arm/mach-at91/board-1arm.c @@ -36,6 +36,7 @@  #include <mach/board.h>  #include <mach/cpu.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -91,6 +92,7 @@ MACHINE_START(ONEARM, "Ajeco 1ARM single board computer")  	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= onearm_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= onearm_board_init, diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c index b7d8aa7b81e..de7be193181 100644 --- a/arch/arm/mach-at91/board-afeb-9260v1.c +++ b/arch/arm/mach-at91/board-afeb-9260v1.c @@ -44,6 +44,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -212,6 +213,7 @@ MACHINE_START(AFEB9260, "Custom afeb9260 board")  	/* Maintainer: Sergey Lapin <slapin@ossfans.org> */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= afeb9260_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= afeb9260_board_init, diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c index 29d3ef0a50f..477e708497b 100644 --- a/arch/arm/mach-at91/board-cam60.c +++ b/arch/arm/mach-at91/board-cam60.c @@ -39,6 +39,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" @@ -188,6 +189,7 @@ MACHINE_START(CAM60, "KwikByte CAM60")  	/* Maintainer: KwikByte */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= cam60_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= cam60_board_init, diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c index 44328a6d460..a5b002f32a6 100644 --- a/arch/arm/mach-at91/board-carmeva.c +++ b/arch/arm/mach-at91/board-carmeva.c @@ -36,6 +36,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -158,6 +159,7 @@ MACHINE_START(CARMEVA, "Carmeva")  	/* Maintainer: Conitec Datasystems */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= carmeva_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= carmeva_board_init, diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c index 69951ec7dbf..ecbc13b594d 100644 --- a/arch/arm/mach-at91/board-cpu9krea.c +++ b/arch/arm/mach-at91/board-cpu9krea.c @@ -41,6 +41,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91sam9260_matrix.h>  #include <mach/at91_matrix.h> @@ -376,6 +377,7 @@ MACHINE_START(CPUAT9G20, "Eukrea CPU9G20")  	/* Maintainer: Eric Benard - EUKREA Electromatique */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= cpu9krea_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= cpu9krea_board_init, diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c index 895cf2dba61..2e6d043c82f 100644 --- a/arch/arm/mach-at91/board-cpuat91.c +++ b/arch/arm/mach-at91/board-cpuat91.c @@ -37,6 +37,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> @@ -178,6 +179,7 @@ MACHINE_START(CPUAT91, "Eukrea")  	/* Maintainer: Eric Benard - EUKREA Electromatique */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= cpuat91_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= cpuat91_board_init, diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c index cd813361cd2..462bc319cbc 100644 --- a/arch/arm/mach-at91/board-csb337.c +++ b/arch/arm/mach-at91/board-csb337.c @@ -39,6 +39,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -252,6 +253,7 @@ MACHINE_START(CSB337, "Cogent CSB337")  	/* Maintainer: Bill Gatliff */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= csb337_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= csb337_board_init, diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c index 7c8b05a57d7..872871ab116 100644 --- a/arch/arm/mach-at91/board-csb637.c +++ b/arch/arm/mach-at91/board-csb637.c @@ -36,6 +36,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -133,6 +134,7 @@ MACHINE_START(CSB637, "Cogent CSB637")  	/* Maintainer: Bill Gatliff */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= csb637_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= csb637_board_init, diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c index a1fce05aa7a..e8f45c4e0ea 100644 --- a/arch/arm/mach-at91/board-dt.c +++ b/arch/arm/mach-at91/board-dt.c @@ -16,6 +16,7 @@  #include <linux/of_platform.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <asm/setup.h>  #include <asm/irq.h> @@ -53,6 +54,7 @@ DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM (Device Tree)")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= at91_dt_initialize,  	.init_irq	= at91_dt_init_irq,  	.init_machine	= at91_dt_device_init, diff --git a/arch/arm/mach-at91/board-eb01.c b/arch/arm/mach-at91/board-eb01.c index d2023f27c65..01f66e99ece 100644 --- a/arch/arm/mach-at91/board-eb01.c +++ b/arch/arm/mach-at91/board-eb01.c @@ -28,6 +28,7 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include "generic.h"  static void __init at91eb01_init_irq(void) @@ -43,6 +44,7 @@ static void __init at91eb01_init_early(void)  MACHINE_START(AT91EB01, "Atmel AT91 EB01")  	/* Maintainer: Greg Ungerer <gerg@snapgear.com> */  	.timer		= &at91x40_timer, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= at91eb01_init_early,  	.init_irq	= at91eb01_init_irq,  MACHINE_END diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c index bd101729798..d1e1f3fc0a4 100644 --- a/arch/arm/mach-at91/board-eb9200.c +++ b/arch/arm/mach-at91/board-eb9200.c @@ -36,6 +36,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -118,6 +119,7 @@ static void __init eb9200_board_init(void)  MACHINE_START(ATEB9200, "Embest ATEB9200")  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= eb9200_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= eb9200_board_init, diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c index 89cc3726a9c..9c24cb25707 100644 --- a/arch/arm/mach-at91/board-ecbat91.c +++ b/arch/arm/mach-at91/board-ecbat91.c @@ -39,6 +39,7 @@  #include <mach/board.h>  #include <mach/cpu.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -170,6 +171,7 @@ MACHINE_START(ECBAT91, "emQbit's ECB_AT91")  	/* Maintainer: emQbit.com */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ecb_at91init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ecb_at91board_init, diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c index 558546cf63f..82bdfde3405 100644 --- a/arch/arm/mach-at91/board-eco920.c +++ b/arch/arm/mach-at91/board-eco920.c @@ -25,6 +25,7 @@  #include <asm/mach/map.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> @@ -132,6 +133,7 @@ MACHINE_START(ECO920, "eco920")  	/* Maintainer: Sascha Hauer */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= eco920_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= eco920_board_init, diff --git a/arch/arm/mach-at91/board-flexibity.c b/arch/arm/mach-at91/board-flexibity.c index 47658f78105..6cc83a87d77 100644 --- a/arch/arm/mach-at91/board-flexibity.c +++ b/arch/arm/mach-at91/board-flexibity.c @@ -34,6 +34,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include "generic.h" @@ -160,6 +161,7 @@ MACHINE_START(FLEXIBITY, "Flexibity Connect")  	/* Maintainer: Maxim Osipov */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= flexibity_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= flexibity_board_init, diff --git a/arch/arm/mach-at91/board-foxg20.c b/arch/arm/mach-at91/board-foxg20.c index 33411e6ecb1..69ab1247ef8 100644 --- a/arch/arm/mach-at91/board-foxg20.c +++ b/arch/arm/mach-at91/board-foxg20.c @@ -42,6 +42,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" @@ -262,6 +263,7 @@ MACHINE_START(ACMENETUSFOXG20, "Acme Systems srl FOX Board G20")  	/* Maintainer: Sergio Tanzilli */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= foxg20_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= foxg20_board_init, diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c index 3e0dfa643a8..a9d5e78118c 100644 --- a/arch/arm/mach-at91/board-gsia18s.c +++ b/arch/arm/mach-at91/board-gsia18s.c @@ -31,6 +31,7 @@  #include <asm/mach/arch.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/gsia18s.h>  #include <mach/stamp9g20.h> @@ -575,6 +576,7 @@ static void __init gsia18s_board_init(void)  MACHINE_START(GSIA18S, "GS_IA18_S")  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= gsia18s_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= gsia18s_board_init, diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c index f260657f32b..64c1dbf88a0 100644 --- a/arch/arm/mach-at91/board-kafa.c +++ b/arch/arm/mach-at91/board-kafa.c @@ -35,6 +35,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/cpu.h>  #include "generic.h" @@ -93,6 +94,7 @@ MACHINE_START(KAFA, "Sperry-Sun KAFA")  	/* Maintainer: Sergei Sharonov */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= kafa_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= kafa_board_init, diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index ba39db5482b..5d96cb85175 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c @@ -37,6 +37,7 @@  #include <mach/board.h>  #include <mach/cpu.h> +#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> @@ -133,6 +134,7 @@ MACHINE_START(KB9200, "KB920x")  	/* Maintainer: KwikByte, Inc. */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= kb9202_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= kb9202_board_init, diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c index d2f4cc16176..18103c5d993 100644 --- a/arch/arm/mach-at91/board-neocore926.c +++ b/arch/arm/mach-at91/board-neocore926.c @@ -45,6 +45,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" @@ -378,6 +379,7 @@ MACHINE_START(NEOCORE926, "ADENEO NEOCORE 926")  	/* Maintainer: ADENEO */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= neocore926_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= neocore926_board_init, diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c index 7fe63834242..9ca3e32c54c 100644 --- a/arch/arm/mach-at91/board-pcontrol-g20.c +++ b/arch/arm/mach-at91/board-pcontrol-g20.c @@ -30,6 +30,7 @@  #include <asm/mach/arch.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/stamp9g20.h> @@ -218,6 +219,7 @@ MACHINE_START(PCONTROL_G20, "PControl G20")  	/* Maintainer: pgsellmann@portner-elektronik.at */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= pcontrol_g20_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= pcontrol_g20_board_init, diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c index b45c0a5d5ca..12706550450 100644 --- a/arch/arm/mach-at91/board-picotux200.c +++ b/arch/arm/mach-at91/board-picotux200.c @@ -38,6 +38,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> @@ -120,6 +121,7 @@ MACHINE_START(PICOTUX2XX, "picotux 200")  	/* Maintainer: Kleinhenz Elektronik GmbH */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= picotux200_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= picotux200_board_init, diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c index 0c61bf0d272..bf351e28542 100644 --- a/arch/arm/mach-at91/board-qil-a9260.c +++ b/arch/arm/mach-at91/board-qil-a9260.c @@ -41,6 +41,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h> @@ -258,6 +259,7 @@ MACHINE_START(QIL_A9260, "CALAO QIL_A9260")  	/* Maintainer: calao-systems */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c index afd7a471376..cc2bf979607 100644 --- a/arch/arm/mach-at91/board-rm9200dk.c +++ b/arch/arm/mach-at91/board-rm9200dk.c @@ -40,6 +40,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> @@ -223,6 +224,7 @@ MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")  	/* Maintainer: SAN People/Atmel */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= dk_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= dk_board_init, diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c index 2b15b8adec4..62e19e64c9d 100644 --- a/arch/arm/mach-at91/board-rm9200ek.c +++ b/arch/arm/mach-at91/board-rm9200ek.c @@ -40,6 +40,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> @@ -190,6 +191,7 @@ MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK")  	/* Maintainer: SAN People/Atmel */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-rsi-ews.c b/arch/arm/mach-at91/board-rsi-ews.c index 24ab9be7510..c3b43aefdb7 100644 --- a/arch/arm/mach-at91/board-rsi-ews.c +++ b/arch/arm/mach-at91/board-rsi-ews.c @@ -26,6 +26,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <linux/gpio.h> @@ -225,6 +226,7 @@ MACHINE_START(RSI_EWS, "RSI EWS")  	/* Maintainer: Josef Holzmayr <holzmayr@rsi-elektrotechnik.de> */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= rsi_ews_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= rsi_ews_board_init, diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c index cdd21f2595d..7bf6da70d7d 100644 --- a/arch/arm/mach-at91/board-sam9-l9260.c +++ b/arch/arm/mach-at91/board-sam9-l9260.c @@ -38,6 +38,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" @@ -202,6 +203,7 @@ MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")  	/* Maintainer: Olimex */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c index 7b3c3913551..889c1bf71eb 100644 --- a/arch/arm/mach-at91/board-sam9260ek.c +++ b/arch/arm/mach-at91/board-sam9260ek.c @@ -42,6 +42,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> @@ -344,6 +345,7 @@ MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index 2736453821b..2269be5fa38 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c @@ -46,6 +46,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> @@ -615,6 +616,7 @@ MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index 983cb98d246..82adf581afc 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c @@ -45,6 +45,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> @@ -443,6 +444,7 @@ MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index 6860d345110..4ea4ee00364 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c @@ -44,6 +44,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/system_rev.h> @@ -413,6 +414,7 @@ MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, @@ -422,6 +424,7 @@ MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index 63163dc7df4..3d48ec15468 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c @@ -43,6 +43,7 @@  #include <asm/mach/irq.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> @@ -503,6 +504,7 @@ MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index be3239f13da..e7dc3ead704 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c @@ -31,6 +31,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h> @@ -319,6 +320,7 @@ MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")  	/* Maintainer: Atmel */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c index 9d446f1bb45..a4e031a039f 100644 --- a/arch/arm/mach-at91/board-snapper9260.c +++ b/arch/arm/mach-at91/board-snapper9260.c @@ -33,6 +33,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" @@ -178,6 +179,7 @@ static void __init snapper9260_board_init(void)  MACHINE_START(SNAPPER_9260, "Bluewater Systems Snapper 9260/9G20 module")  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= snapper9260_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= snapper9260_board_init, diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c index ee86f9d7ee7..29eae1626bf 100644 --- a/arch/arm/mach-at91/board-stamp9g20.c +++ b/arch/arm/mach-at91/board-stamp9g20.c @@ -26,6 +26,7 @@  #include <asm/mach/arch.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" @@ -287,6 +288,7 @@ MACHINE_START(PORTUXG20, "taskit PortuxG20")  	/* Maintainer: taskit GmbH */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= stamp9g20_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= portuxg20_board_init, @@ -296,6 +298,7 @@ MACHINE_START(STAMP9G20, "taskit Stamp9G20")  	/* Maintainer: taskit GmbH */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= stamp9g20_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= stamp9g20evb_board_init, diff --git a/arch/arm/mach-at91/board-usb-a926x.c b/arch/arm/mach-at91/board-usb-a926x.c index 95393fcaf19..c1476b9fe7b 100644 --- a/arch/arm/mach-at91/board-usb-a926x.c +++ b/arch/arm/mach-at91/board-usb-a926x.c @@ -42,6 +42,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h> @@ -358,6 +359,7 @@ MACHINE_START(USB_A9263, "CALAO USB_A9263")  	/* Maintainer: calao-systems */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, @@ -367,6 +369,7 @@ MACHINE_START(USB_A9260, "CALAO USB_A9260")  	/* Maintainer: calao-systems */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, @@ -376,6 +379,7 @@ MACHINE_START(USB_A9G20, "CALAO USB_A92G0")  	/* Maintainer: Jean-Christophe PLAGNIOL-VILLARD */  	.timer		= &at91sam926x_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= ek_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= ek_board_init, diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c index d56665ea4b5..516d340549d 100644 --- a/arch/arm/mach-at91/board-yl-9200.c +++ b/arch/arm/mach-at91/board-yl-9200.c @@ -44,6 +44,7 @@  #include <mach/hardware.h>  #include <mach/board.h> +#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> @@ -590,6 +591,7 @@ MACHINE_START(YL9200, "uCdragon YL-9200")  	/* Maintainer: S.Birtles */  	.timer		= &at91rm9200_timer,  	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq,  	.init_early	= yl9200_init_early,  	.init_irq	= at91_init_irq_default,  	.init_machine	= yl9200_board_init, diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 0a60bf83703..f4965067765 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h @@ -29,6 +29,8 @@ extern void __init at91x40_init_interrupts(unsigned int priority[]);  extern void __init at91_aic_init(unsigned int priority[]);  extern int  __init at91_aic_of_init(struct device_node *node,  				    struct device_node *parent); +extern int  __init at91_aic5_of_init(struct device_node *node, +				    struct device_node *parent);   /* Timer */ diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index 325837a264c..be42cf0e74b 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c @@ -26,6 +26,8 @@  #include <linux/of_irq.h>  #include <linux/of_gpio.h> +#include <asm/mach/irq.h> +  #include <mach/hardware.h>  #include <mach/at91_pio.h> @@ -585,15 +587,14 @@ static struct irq_chip gpio_irqchip = {  static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  { +	struct irq_chip *chip = irq_desc_get_chip(desc);  	struct irq_data *idata = irq_desc_get_irq_data(desc); -	struct irq_chip *chip = irq_data_get_irq_chip(idata);  	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(idata);  	void __iomem	*pio = at91_gpio->regbase;  	unsigned long	isr;  	int		n; -	/* temporarily mask (level sensitive) parent IRQ */ -	chip->irq_ack(idata); +	chained_irq_enter(chip, desc);  	for (;;) {  		/* Reading ISR acks pending (edge triggered) GPIO interrupts.  		 * When there none are pending, we're finished unless we need @@ -614,7 +615,7 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  			n = find_next_bit(&isr, BITS_PER_LONG, n + 1);  		}  	} -	chip->irq_unmask(idata); +	chained_irq_exit(chip, desc);  	/* now it may re-trigger */  } diff --git a/arch/arm/mach-at91/include/mach/at91_aic.h b/arch/arm/mach-at91/include/mach/at91_aic.h index 3045781c473..eaea66197fa 100644 --- a/arch/arm/mach-at91/include/mach/at91_aic.h +++ b/arch/arm/mach-at91/include/mach/at91_aic.h @@ -23,12 +23,23 @@ extern void __iomem *at91_aic_base;  	__raw_readl(at91_aic_base + field)  #define at91_aic_write(field, value) \ -	__raw_writel(value, at91_aic_base + field); +	__raw_writel(value, at91_aic_base + field)  #else  .extern at91_aic_base  #endif +/* Number of irq lines managed by AIC */ +#define NR_AIC_IRQS	32 +#define NR_AIC5_IRQS	128 + +#define AT91_AIC5_SSR		0x0			/* Source Select Register [AIC5] */ +#define 	AT91_AIC5_INTSEL_MSK	(0x7f << 0)		/* Interrupt Line Selection Mask */ + +#define AT91_AIC_IRQ_MIN_PRIORITY	0 +#define AT91_AIC_IRQ_MAX_PRIORITY	7 +  #define AT91_AIC_SMR(n)		((n) * 4)		/* Source Mode Registers 0-31 */ +#define AT91_AIC5_SMR		0x4			/* Source Mode Register [AIC5] */  #define		AT91_AIC_PRIOR		(7 << 0)		/* Priority Level */  #define		AT91_AIC_SRCTYPE	(3 << 5)		/* Interrupt Source Type */  #define			AT91_AIC_SRCTYPE_LOW		(0 << 5) @@ -37,29 +48,52 @@ extern void __iomem *at91_aic_base;  #define			AT91_AIC_SRCTYPE_RISING		(3 << 5)  #define AT91_AIC_SVR(n)		(0x80 + ((n) * 4))	/* Source Vector Registers 0-31 */ +#define AT91_AIC5_SVR		0x8			/* Source Vector Register [AIC5] */  #define AT91_AIC_IVR		0x100			/* Interrupt Vector Register */ +#define AT91_AIC5_IVR		0x10			/* Interrupt Vector Register [AIC5] */  #define AT91_AIC_FVR		0x104			/* Fast Interrupt Vector Register */ +#define AT91_AIC5_FVR		0x14			/* Fast Interrupt Vector Register [AIC5] */  #define AT91_AIC_ISR		0x108			/* Interrupt Status Register */ +#define AT91_AIC5_ISR		0x18			/* Interrupt Status Register [AIC5] */  #define		AT91_AIC_IRQID		(0x1f << 0)		/* Current Interrupt Identifier */  #define AT91_AIC_IPR		0x10c			/* Interrupt Pending Register */ +#define AT91_AIC5_IPR0		0x20			/* Interrupt Pending Register 0 [AIC5] */ +#define AT91_AIC5_IPR1		0x24			/* Interrupt Pending Register 1 [AIC5] */ +#define AT91_AIC5_IPR2		0x28			/* Interrupt Pending Register 2 [AIC5] */ +#define AT91_AIC5_IPR3		0x2c			/* Interrupt Pending Register 3 [AIC5] */  #define AT91_AIC_IMR		0x110			/* Interrupt Mask Register */ +#define AT91_AIC5_IMR		0x30			/* Interrupt Mask Register [AIC5] */  #define AT91_AIC_CISR		0x114			/* Core Interrupt Status Register */ +#define AT91_AIC5_CISR		0x34			/* Core Interrupt Status Register [AIC5] */  #define		AT91_AIC_NFIQ		(1 << 0)		/* nFIQ Status */  #define		AT91_AIC_NIRQ		(1 << 1)		/* nIRQ Status */  #define AT91_AIC_IECR		0x120			/* Interrupt Enable Command Register */ +#define AT91_AIC5_IECR		0x40			/* Interrupt Enable Command Register [AIC5] */  #define AT91_AIC_IDCR		0x124			/* Interrupt Disable Command Register */ +#define AT91_AIC5_IDCR		0x44			/* Interrupt Disable Command Register [AIC5] */  #define AT91_AIC_ICCR		0x128			/* Interrupt Clear Command Register */ +#define AT91_AIC5_ICCR		0x48			/* Interrupt Clear Command Register [AIC5] */  #define AT91_AIC_ISCR		0x12c			/* Interrupt Set Command Register */ +#define AT91_AIC5_ISCR		0x4c			/* Interrupt Set Command Register [AIC5] */  #define AT91_AIC_EOICR		0x130			/* End of Interrupt Command Register */ +#define AT91_AIC5_EOICR		0x38			/* End of Interrupt Command Register [AIC5] */  #define AT91_AIC_SPU		0x134			/* Spurious Interrupt Vector Register */ +#define AT91_AIC5_SPU		0x3c			/* Spurious Interrupt Vector Register [AIC5] */  #define AT91_AIC_DCR		0x138			/* Debug Control Register */ +#define AT91_AIC5_DCR		0x6c			/* Debug Control Register [AIC5] */  #define		AT91_AIC_DCR_PROT	(1 << 0)		/* Protection Mode */  #define		AT91_AIC_DCR_GMSK	(1 << 1)		/* General Mask */  #define AT91_AIC_FFER		0x140			/* Fast Forcing Enable Register [SAM9 only] */ +#define AT91_AIC5_FFER		0x50			/* Fast Forcing Enable Register [AIC5] */  #define AT91_AIC_FFDR		0x144			/* Fast Forcing Disable Register [SAM9 only] */ +#define AT91_AIC5_FFDR		0x54			/* Fast Forcing Disable Register [AIC5] */  #define AT91_AIC_FFSR		0x148			/* Fast Forcing Status Register [SAM9 only] */ +#define AT91_AIC5_FFSR		0x58			/* Fast Forcing Status Register [AIC5] */ + +void at91_aic_handle_irq(struct pt_regs *regs); +void at91_aic5_handle_irq(struct pt_regs *regs);  #endif diff --git a/arch/arm/mach-at91/include/mach/at91_spi.h b/arch/arm/mach-at91/include/mach/at91_spi.h deleted file mode 100644 index 2f6ba0c5636..00000000000 --- a/arch/arm/mach-at91/include/mach/at91_spi.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91_spi.h - * - * Copyright (C) 2005 Ivan Kokshaysky - * Copyright (C) SAN People - * - * Serial Peripheral Interface (SPI) registers. - * Based on AT91RM9200 datasheet revision E. - * - * 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 AT91_SPI_H -#define AT91_SPI_H - -#define AT91_SPI_CR			0x00		/* Control Register */ -#define		AT91_SPI_SPIEN		(1 <<  0)		/* SPI Enable */ -#define		AT91_SPI_SPIDIS		(1 <<  1)		/* SPI Disable */ -#define		AT91_SPI_SWRST		(1 <<  7)		/* SPI Software Reset */ -#define		AT91_SPI_LASTXFER	(1 << 24)		/* Last Transfer [SAM9261 only] */ - -#define AT91_SPI_MR			0x04		/* Mode Register */ -#define		AT91_SPI_MSTR		(1    <<  0)		/* Master/Slave Mode */ -#define		AT91_SPI_PS		(1    <<  1)		/* Peripheral Select */ -#define			AT91_SPI_PS_FIXED	(0 << 1) -#define			AT91_SPI_PS_VARIABLE	(1 << 1) -#define		AT91_SPI_PCSDEC		(1    <<  2)		/* Chip Select Decode */ -#define		AT91_SPI_DIV32		(1    <<  3)		/* Clock Selection [AT91RM9200 only] */ -#define		AT91_SPI_MODFDIS	(1    <<  4)		/* Mode Fault Detection */ -#define		AT91_SPI_LLB		(1    <<  7)		/* Local Loopback Enable */ -#define		AT91_SPI_PCS		(0xf  << 16)		/* Peripheral Chip Select */ -#define		AT91_SPI_DLYBCS		(0xff << 24)		/* Delay Between Chip Selects */ - -#define AT91_SPI_RDR		0x08			/* Receive Data Register */ -#define		AT91_SPI_RD		(0xffff <<  0)		/* Receive Data */ -#define		AT91_SPI_PCS		(0xf	<< 16)		/* Peripheral Chip Select */ - -#define AT91_SPI_TDR		0x0c			/* Transmit Data Register */ -#define		AT91_SPI_TD		(0xffff <<  0)		/* Transmit Data */ -#define		AT91_SPI_PCS		(0xf	<< 16)		/* Peripheral Chip Select */ -#define		AT91_SPI_LASTXFER	(1	<< 24)		/* Last Transfer [SAM9261 only] */ - -#define AT91_SPI_SR		0x10			/* Status Register */ -#define		AT91_SPI_RDRF		(1 <<  0)		/* Receive Data Register Full */ -#define		AT91_SPI_TDRE		(1 <<  1)		/* Transmit Data Register Full */ -#define		AT91_SPI_MODF		(1 <<  2)		/* Mode Fault Error */ -#define		AT91_SPI_OVRES		(1 <<  3)		/* Overrun Error Status */ -#define		AT91_SPI_ENDRX		(1 <<  4)		/* End of RX buffer */ -#define		AT91_SPI_ENDTX		(1 <<  5)		/* End of TX buffer */ -#define		AT91_SPI_RXBUFF		(1 <<  6)		/* RX Buffer Full */ -#define		AT91_SPI_TXBUFE		(1 <<  7)		/* TX Buffer Empty */ -#define		AT91_SPI_NSSR		(1 <<  8)		/* NSS Rising [SAM9261 only] */ -#define		AT91_SPI_TXEMPTY	(1 <<  9)		/* Transmission Register Empty [SAM9261 only] */ -#define		AT91_SPI_SPIENS		(1 << 16)		/* SPI Enable Status */ - -#define AT91_SPI_IER		0x14			/* Interrupt Enable Register */ -#define AT91_SPI_IDR		0x18			/* Interrupt Disable Register */ -#define AT91_SPI_IMR		0x1c			/* Interrupt Mask Register */ - -#define AT91_SPI_CSR(n)		(0x30 + ((n) * 4))	/* Chip Select Registers 0-3 */ -#define		AT91_SPI_CPOL		(1    <<  0)		/* Clock Polarity */ -#define		AT91_SPI_NCPHA		(1    <<  1)		/* Clock Phase */ -#define		AT91_SPI_CSAAT		(1    <<  3)		/* Chip Select Active After Transfer [SAM9261 only] */ -#define		AT91_SPI_BITS		(0xf  <<  4)		/* Bits Per Transfer */ -#define			AT91_SPI_BITS_8		(0 << 4) -#define			AT91_SPI_BITS_9		(1 << 4) -#define			AT91_SPI_BITS_10	(2 << 4) -#define			AT91_SPI_BITS_11	(3 << 4) -#define			AT91_SPI_BITS_12	(4 << 4) -#define			AT91_SPI_BITS_13	(5 << 4) -#define			AT91_SPI_BITS_14	(6 << 4) -#define			AT91_SPI_BITS_15	(7 << 4) -#define			AT91_SPI_BITS_16	(8 << 4) -#define		AT91_SPI_SCBR		(0xff <<  8)		/* Serial Clock Baud Rate */ -#define		AT91_SPI_DLYBS		(0xff << 16)		/* Delay before SPCK */ -#define		AT91_SPI_DLYBCT		(0xff << 24)		/* Delay between Consecutive Transfers */ - -#endif diff --git a/arch/arm/mach-at91/include/mach/at91_ssc.h b/arch/arm/mach-at91/include/mach/at91_ssc.h deleted file mode 100644 index a81114c11c7..00000000000 --- a/arch/arm/mach-at91/include/mach/at91_ssc.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91_ssc.h - * - * Copyright (C) SAN People - * - * Serial Synchronous Controller (SSC) registers. - * Based on AT91RM9200 datasheet revision E. - * - * 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 AT91_SSC_H -#define AT91_SSC_H - -#define AT91_SSC_CR		0x00	/* Control Register */ -#define		AT91_SSC_RXEN		(1 <<  0)	/* Receive Enable */ -#define		AT91_SSC_RXDIS		(1 <<  1)	/* Receive Disable */ -#define		AT91_SSC_TXEN		(1 <<  8)	/* Transmit Enable */ -#define		AT91_SSC_TXDIS		(1 <<  9)	/* Transmit Disable */ -#define		AT91_SSC_SWRST		(1 << 15)	/* Software Reset */ - -#define AT91_SSC_CMR		0x04	/* Clock Mode Register */ -#define		AT91_SSC_CMR_DIV	(0xfff << 0)	/* Clock Divider */ - -#define AT91_SSC_RCMR		0x10	/* Receive Clock Mode Register */ -#define		AT91_SSC_CKS		(3    <<  0)	/* Clock Selection */ -#define			AT91_SSC_CKS_DIV		(0 << 0) -#define			AT91_SSC_CKS_CLOCK		(1 << 0) -#define			AT91_SSC_CKS_PIN		(2 << 0) -#define		AT91_SSC_CKO		(7    <<  2)	/* Clock Output Mode Selection */ -#define			AT91_SSC_CKO_NONE		(0 << 2) -#define			AT91_SSC_CKO_CONTINUOUS		(1 << 2) -#define		AT91_SSC_CKI		(1    <<  5)	/* Clock Inversion */ -#define			AT91_SSC_CKI_FALLING		(0 << 5) -#define			AT91_SSC_CK_RISING		(1 << 5) -#define		AT91_SSC_CKG		(1    <<  6)	/* Receive Clock Gating Selection [AT91SAM9261 only] */ -#define			AT91_SSC_CKG_NONE		(0 << 6) -#define			AT91_SSC_CKG_RFLOW		(1 << 6) -#define			AT91_SSC_CKG_RFHIGH		(2 << 6) -#define		AT91_SSC_START		(0xf  <<  8)	/* Start Selection */ -#define			AT91_SSC_START_CONTINUOUS	(0 << 8) -#define			AT91_SSC_START_TX_RX		(1 << 8) -#define			AT91_SSC_START_LOW_RF		(2 << 8) -#define			AT91_SSC_START_HIGH_RF		(3 << 8) -#define			AT91_SSC_START_FALLING_RF	(4 << 8) -#define			AT91_SSC_START_RISING_RF	(5 << 8) -#define			AT91_SSC_START_LEVEL_RF		(6 << 8) -#define			AT91_SSC_START_EDGE_RF		(7 << 8) -#define		AT91_SSC_STOP		(1    << 12)	/* Receive Stop Selection [AT91SAM9261 only] */ -#define		AT91_SSC_STTDLY		(0xff << 16)	/* Start Delay */ -#define		AT91_SSC_PERIOD		(0xff << 24)	/* Period Divider Selection */ - -#define AT91_SSC_RFMR		0x14	/* Receive Frame Mode Register */ -#define		AT91_SSC_DATALEN	(0x1f <<  0)	/* Data Length */ -#define		AT91_SSC_LOOP		(1    <<  5)	/* Loop Mode */ -#define		AT91_SSC_MSBF		(1    <<  7)	/* Most Significant Bit First */ -#define		AT91_SSC_DATNB		(0xf  <<  8)	/* Data Number per Frame */ -#define		AT91_SSC_FSLEN		(0xf  << 16)	/* Frame Sync Length */ -#define		AT91_SSC_FSOS		(7    << 20)	/* Frame Sync Output Selection */ -#define			AT91_SSC_FSOS_NONE		(0 << 20) -#define			AT91_SSC_FSOS_NEGATIVE		(1 << 20) -#define			AT91_SSC_FSOS_POSITIVE		(2 << 20) -#define			AT91_SSC_FSOS_LOW		(3 << 20) -#define			AT91_SSC_FSOS_HIGH		(4 << 20) -#define			AT91_SSC_FSOS_TOGGLE		(5 << 20) -#define		AT91_SSC_FSEDGE		(1    << 24)	/* Frame Sync Edge Detection */ -#define			AT91_SSC_FSEDGE_POSITIVE	(0 << 24) -#define			AT91_SSC_FSEDGE_NEGATIVE	(1 << 24) - -#define AT91_SSC_TCMR		0x18	/* Transmit Clock Mode Register */ -#define AT91_SSC_TFMR		0x1c	/* Transmit Fram Mode Register */ -#define		AT91_SSC_DATDEF		(1 <<  5)	/* Data Default Value */ -#define		AT91_SSC_FSDEN		(1 << 23)	/* Frame Sync Data Enable */ - -#define AT91_SSC_RHR		0x20	/* Receive Holding Register */ -#define AT91_SSC_THR		0x24	/* Transmit Holding Register */ -#define AT91_SSC_RSHR		0x30	/* Receive Sync Holding Register */ -#define AT91_SSC_TSHR		0x34	/* Transmit Sync Holding Register */ - -#define AT91_SSC_RC0R		0x38	/* Receive Compare 0 Register [AT91SAM9261 only] */ -#define AT91_SSC_RC1R		0x3c	/* Receive Compare 1 Register [AT91SAM9261 only] */ - -#define AT91_SSC_SR		0x40	/* Status Register */ -#define		AT91_SSC_TXRDY		(1 <<  0)	/* Transmit Ready */ -#define		AT91_SSC_TXEMPTY	(1 <<  1)	/* Transmit Empty */ -#define		AT91_SSC_ENDTX		(1 <<  2)	/* End of Transmission */ -#define		AT91_SSC_TXBUFE		(1 <<  3)	/* Transmit Buffer Empty */ -#define		AT91_SSC_RXRDY		(1 <<  4)	/* Receive Ready */ -#define		AT91_SSC_OVRUN		(1 <<  5)	/* Receive Overrun */ -#define		AT91_SSC_ENDRX		(1 <<  6)	/* End of Reception */ -#define		AT91_SSC_RXBUFF		(1 <<  7)	/* Receive Buffer Full */ -#define		AT91_SSC_CP0		(1 <<  8)	/* Compare 0 [AT91SAM9261 only] */ -#define		AT91_SSC_CP1		(1 <<  9)	/* Compare 1 [AT91SAM9261 only] */ -#define		AT91_SSC_TXSYN		(1 << 10)	/* Transmit Sync */ -#define		AT91_SSC_RXSYN		(1 << 11)	/* Receive Sync */ -#define		AT91_SSC_TXENA		(1 << 16)	/* Transmit Enable */ -#define		AT91_SSC_RXENA		(1 << 17)	/* Receive Enable */ - -#define AT91_SSC_IER		0x44	/* Interrupt Enable Register */ -#define AT91_SSC_IDR		0x48	/* Interrupt Disable Register */ -#define AT91_SSC_IMR		0x4c	/* Interrupt Mask Register */ - -#endif diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h index 3a4da24d591..8eba1021f53 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9g45.h +++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h @@ -136,6 +136,8 @@  #define AT_DMA_ID_SSC1_RX	 8  #define AT_DMA_ID_AC97_TX	 9  #define AT_DMA_ID_AC97_RX	10 +#define AT_DMA_ID_AES_TX	11 +#define AT_DMA_ID_AES_RX	12  #define AT_DMA_ID_MCI1		13  #endif diff --git a/arch/arm/mach-at91/include/mach/entry-macro.S b/arch/arm/mach-at91/include/mach/entry-macro.S deleted file mode 100644 index 903bf205a33..00000000000 --- a/arch/arm/mach-at91/include/mach/entry-macro.S +++ /dev/null @@ -1,27 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/entry-macro.S - * - *  Copyright (C) 2003-2005 SAN People - * - * Low-level IRQ helper macros for AT91RM9200 platforms - * - * 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 <mach/at91_aic.h> - -	.macro  get_irqnr_preamble, base, tmp -	ldr	\base, =at91_aic_base		@ base virtual address of AIC peripheral -	ldr	\base, [\base] -	.endm - -	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp -	ldr	\irqnr, [\base, #AT91_AIC_IVR]		@ read IRQ vector register: de-asserts nIRQ to processor (and clears interrupt) -	ldr	\irqstat, [\base, #AT91_AIC_ISR]	@ read interrupt source number -	teq	\irqstat, #0				@ ISR is 0 when no current interrupt, or spurious interrupt -	streq	\tmp, [\base, #AT91_AIC_EOICR]		@ not going to be handled further, then ACK it now. -	.endm - diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c index cfcfcbe3626..1e02c0e49dc 100644 --- a/arch/arm/mach-at91/irq.c +++ b/arch/arm/mach-at91/irq.c @@ -23,6 +23,7 @@  #include <linux/init.h>  #include <linux/module.h>  #include <linux/mm.h> +#include <linux/bitmap.h>  #include <linux/types.h>  #include <linux/irq.h>  #include <linux/of.h> @@ -30,38 +31,218 @@  #include <linux/of_irq.h>  #include <linux/irqdomain.h>  #include <linux/err.h> +#include <linux/slab.h>  #include <mach/hardware.h>  #include <asm/irq.h>  #include <asm/setup.h> +#include <asm/exception.h>  #include <asm/mach/arch.h>  #include <asm/mach/irq.h>  #include <asm/mach/map.h> +#include <mach/at91_aic.h> +  void __iomem *at91_aic_base;  static struct irq_domain *at91_aic_domain;  static struct device_node *at91_aic_np; +static unsigned int n_irqs = NR_AIC_IRQS; +static unsigned long at91_aic_caps = 0; + +/* AIC5 introduces a Source Select Register */ +#define AT91_AIC_CAP_AIC5	(1 << 0) +#define has_aic5()		(at91_aic_caps & AT91_AIC_CAP_AIC5) + +#ifdef CONFIG_PM + +static unsigned long *wakeups; +static unsigned long *backups; + +#define set_backup(bit) set_bit(bit, backups) +#define clear_backup(bit) clear_bit(bit, backups) + +static int at91_aic_pm_init(void) +{ +	backups = kzalloc(BITS_TO_LONGS(n_irqs) * sizeof(*backups), GFP_KERNEL); +	if (!backups) +		return -ENOMEM; + +	wakeups = kzalloc(BITS_TO_LONGS(n_irqs) * sizeof(*backups), GFP_KERNEL); +	if (!wakeups) { +		kfree(backups); +		return -ENOMEM; +	} + +	return 0; +} + +static int at91_aic_set_wake(struct irq_data *d, unsigned value) +{ +	if (unlikely(d->hwirq >= n_irqs)) +		return -EINVAL; + +	if (value) +		set_bit(d->hwirq, wakeups); +	else +		clear_bit(d->hwirq, wakeups); + +	return 0; +} + +void at91_irq_suspend(void) +{ +	int i = 0, bit; + +	if (has_aic5()) { +		/* disable enabled irqs */ +		while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) { +			at91_aic_write(AT91_AIC5_SSR, +				       bit & AT91_AIC5_INTSEL_MSK); +			at91_aic_write(AT91_AIC5_IDCR, 1); +			i = bit; +		} +		/* enable wakeup irqs */ +		i = 0; +		while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) { +			at91_aic_write(AT91_AIC5_SSR, +				       bit & AT91_AIC5_INTSEL_MSK); +			at91_aic_write(AT91_AIC5_IECR, 1); +			i = bit; +		} +	} else { +		at91_aic_write(AT91_AIC_IDCR, *backups); +		at91_aic_write(AT91_AIC_IECR, *wakeups); +	} +} + +void at91_irq_resume(void) +{ +	int i = 0, bit; + +	if (has_aic5()) { +		/* disable wakeup irqs */ +		while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) { +			at91_aic_write(AT91_AIC5_SSR, +				       bit & AT91_AIC5_INTSEL_MSK); +			at91_aic_write(AT91_AIC5_IDCR, 1); +			i = bit; +		} +		/* enable irqs disabled for suspend */ +		i = 0; +		while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) { +			at91_aic_write(AT91_AIC5_SSR, +				       bit & AT91_AIC5_INTSEL_MSK); +			at91_aic_write(AT91_AIC5_IECR, 1); +			i = bit; +		} +	} else { +		at91_aic_write(AT91_AIC_IDCR, *wakeups); +		at91_aic_write(AT91_AIC_IECR, *backups); +	} +} + +#else +static inline int at91_aic_pm_init(void) +{ +	return 0; +} + +#define set_backup(bit) +#define clear_backup(bit) +#define at91_aic_set_wake	NULL + +#endif /* CONFIG_PM */ + +asmlinkage void __exception_irq_entry +at91_aic_handle_irq(struct pt_regs *regs) +{ +	u32 irqnr; +	u32 irqstat; + +	irqnr = at91_aic_read(AT91_AIC_IVR); +	irqstat = at91_aic_read(AT91_AIC_ISR); + +	/* +	 * ISR value is 0 when there is no current interrupt or when there is +	 * a spurious interrupt +	 */ +	if (!irqstat) +		at91_aic_write(AT91_AIC_EOICR, 0); +	else +		handle_IRQ(irqnr, regs); +} + +asmlinkage void __exception_irq_entry +at91_aic5_handle_irq(struct pt_regs *regs) +{ +	u32 irqnr; +	u32 irqstat; + +	irqnr = at91_aic_read(AT91_AIC5_IVR); +	irqstat = at91_aic_read(AT91_AIC5_ISR); + +	if (!irqstat) +		at91_aic_write(AT91_AIC5_EOICR, 0); +	else +		handle_IRQ(irqnr, regs); +}  static void at91_aic_mask_irq(struct irq_data *d)  {  	/* Disable interrupt on AIC */  	at91_aic_write(AT91_AIC_IDCR, 1 << d->hwirq); +	/* Update ISR cache */ +	clear_backup(d->hwirq); +} + +static void __maybe_unused at91_aic5_mask_irq(struct irq_data *d) +{ +	/* Disable interrupt on AIC5 */ +	at91_aic_write(AT91_AIC5_SSR, d->hwirq & AT91_AIC5_INTSEL_MSK); +	at91_aic_write(AT91_AIC5_IDCR, 1); +	/* Update ISR cache */ +	clear_backup(d->hwirq);  }  static void at91_aic_unmask_irq(struct irq_data *d)  {  	/* Enable interrupt on AIC */  	at91_aic_write(AT91_AIC_IECR, 1 << d->hwirq); +	/* Update ISR cache */ +	set_backup(d->hwirq); +} + +static void __maybe_unused at91_aic5_unmask_irq(struct irq_data *d) +{ +	/* Enable interrupt on AIC5 */ +	at91_aic_write(AT91_AIC5_SSR, d->hwirq & AT91_AIC5_INTSEL_MSK); +	at91_aic_write(AT91_AIC5_IECR, 1); +	/* Update ISR cache */ +	set_backup(d->hwirq);  } -unsigned int at91_extern_irq; +static void at91_aic_eoi(struct irq_data *d) +{ +	/* +	 * Mark end-of-interrupt on AIC, the controller doesn't care about +	 * the value written. Moreover it's a write-only register. +	 */ +	at91_aic_write(AT91_AIC_EOICR, 0); +} -#define is_extern_irq(hwirq) ((1 << (hwirq)) & at91_extern_irq) +static void __maybe_unused at91_aic5_eoi(struct irq_data *d) +{ +	at91_aic_write(AT91_AIC5_EOICR, 0); +} -static int at91_aic_set_type(struct irq_data *d, unsigned type) +unsigned long *at91_extern_irq; + +#define is_extern_irq(hwirq) test_bit(hwirq, at91_extern_irq) + +static int at91_aic_compute_srctype(struct irq_data *d, unsigned type)  { -	unsigned int smr, srctype; +	int srctype;  	switch (type) {  	case IRQ_TYPE_LEVEL_HIGH: @@ -74,65 +255,51 @@ static int at91_aic_set_type(struct irq_data *d, unsigned type)  		if ((d->hwirq == AT91_ID_FIQ) || is_extern_irq(d->hwirq))		/* only supported on external interrupts */  			srctype = AT91_AIC_SRCTYPE_LOW;  		else -			return -EINVAL; +			srctype = -EINVAL;  		break;  	case IRQ_TYPE_EDGE_FALLING:  		if ((d->hwirq == AT91_ID_FIQ) || is_extern_irq(d->hwirq))		/* only supported on external interrupts */  			srctype = AT91_AIC_SRCTYPE_FALLING;  		else -			return -EINVAL; +			srctype = -EINVAL;  		break;  	default: -		return -EINVAL; +		srctype = -EINVAL;  	} -	smr = at91_aic_read(AT91_AIC_SMR(d->hwirq)) & ~AT91_AIC_SRCTYPE; -	at91_aic_write(AT91_AIC_SMR(d->hwirq), smr | srctype); -	return 0; +	return srctype;  } -#ifdef CONFIG_PM - -static u32 wakeups; -static u32 backups; - -static int at91_aic_set_wake(struct irq_data *d, unsigned value) +static int at91_aic_set_type(struct irq_data *d, unsigned type)  { -	if (unlikely(d->hwirq >= NR_AIC_IRQS)) -		return -EINVAL; +	unsigned int smr; +	int srctype; -	if (value) -		wakeups |= (1 << d->hwirq); -	else -		wakeups &= ~(1 << d->hwirq); +	srctype = at91_aic_compute_srctype(d, type); +	if (srctype < 0) +		return srctype; -	return 0; -} - -void at91_irq_suspend(void) -{ -	backups = at91_aic_read(AT91_AIC_IMR); -	at91_aic_write(AT91_AIC_IDCR, backups); -	at91_aic_write(AT91_AIC_IECR, wakeups); -} +	if (has_aic5()) { +		at91_aic_write(AT91_AIC5_SSR, +			       d->hwirq & AT91_AIC5_INTSEL_MSK); +		smr = at91_aic_read(AT91_AIC5_SMR) & ~AT91_AIC_SRCTYPE; +		at91_aic_write(AT91_AIC5_SMR, smr | srctype); +	} else { +		smr = at91_aic_read(AT91_AIC_SMR(d->hwirq)) +		      & ~AT91_AIC_SRCTYPE; +		at91_aic_write(AT91_AIC_SMR(d->hwirq), smr | srctype); +	} -void at91_irq_resume(void) -{ -	at91_aic_write(AT91_AIC_IDCR, wakeups); -	at91_aic_write(AT91_AIC_IECR, backups); +	return 0;  } -#else -#define at91_aic_set_wake	NULL -#endif -  static struct irq_chip at91_aic_chip = {  	.name		= "AIC", -	.irq_ack	= at91_aic_mask_irq,  	.irq_mask	= at91_aic_mask_irq,  	.irq_unmask	= at91_aic_unmask_irq,  	.irq_set_type	= at91_aic_set_type,  	.irq_set_wake	= at91_aic_set_wake, +	.irq_eoi	= at91_aic_eoi,  };  static void __init at91_aic_hw_init(unsigned int spu_vector) @@ -161,41 +328,172 @@ static void __init at91_aic_hw_init(unsigned int spu_vector)  	at91_aic_write(AT91_AIC_ICCR, 0xFFFFFFFF);  } +static void __init __maybe_unused at91_aic5_hw_init(unsigned int spu_vector) +{ +	int i; + +	/* +	 * Perform 8 End Of Interrupt Command to make sure AIC +	 * will not Lock out nIRQ +	 */ +	for (i = 0; i < 8; i++) +		at91_aic_write(AT91_AIC5_EOICR, 0); + +	/* +	 * Spurious Interrupt ID in Spurious Vector Register. +	 * When there is no current interrupt, the IRQ Vector Register +	 * reads the value stored in AIC_SPU +	 */ +	at91_aic_write(AT91_AIC5_SPU, spu_vector); + +	/* No debugging in AIC: Debug (Protect) Control Register */ +	at91_aic_write(AT91_AIC5_DCR, 0); + +	/* Disable and clear all interrupts initially */ +	for (i = 0; i < n_irqs; i++) { +		at91_aic_write(AT91_AIC5_SSR, i & AT91_AIC5_INTSEL_MSK); +		at91_aic_write(AT91_AIC5_IDCR, 1); +		at91_aic_write(AT91_AIC5_ICCR, 1); +	} +} +  #if defined(CONFIG_OF) +static unsigned int *at91_aic_irq_priorities; +  static int at91_aic_irq_map(struct irq_domain *h, unsigned int virq,  							irq_hw_number_t hw)  {  	/* Put virq number in Source Vector Register */  	at91_aic_write(AT91_AIC_SVR(hw), virq); -	/* Active Low interrupt, without priority */ -	at91_aic_write(AT91_AIC_SMR(hw), AT91_AIC_SRCTYPE_LOW); +	/* Active Low interrupt, with priority */ +	at91_aic_write(AT91_AIC_SMR(hw), +		       AT91_AIC_SRCTYPE_LOW | at91_aic_irq_priorities[hw]); -	irq_set_chip_and_handler(virq, &at91_aic_chip, handle_level_irq); +	irq_set_chip_and_handler(virq, &at91_aic_chip, handle_fasteoi_irq);  	set_irq_flags(virq, IRQF_VALID | IRQF_PROBE);  	return 0;  } +static int at91_aic5_irq_map(struct irq_domain *h, unsigned int virq, +		irq_hw_number_t hw) +{ +	at91_aic_write(AT91_AIC5_SSR, hw & AT91_AIC5_INTSEL_MSK); + +	/* Put virq number in Source Vector Register */ +	at91_aic_write(AT91_AIC5_SVR, virq); + +	/* Active Low interrupt, with priority */ +	at91_aic_write(AT91_AIC5_SMR, +		       AT91_AIC_SRCTYPE_LOW | at91_aic_irq_priorities[hw]); + +	irq_set_chip_and_handler(virq, &at91_aic_chip, handle_fasteoi_irq); +	set_irq_flags(virq, IRQF_VALID | IRQF_PROBE); + +	return 0; +} + +static int at91_aic_irq_domain_xlate(struct irq_domain *d, struct device_node *ctrlr, +				const u32 *intspec, unsigned int intsize, +				irq_hw_number_t *out_hwirq, unsigned int *out_type) +{ +	if (WARN_ON(intsize < 3)) +		return -EINVAL; +	if (WARN_ON(intspec[0] >= n_irqs)) +		return -EINVAL; +	if (WARN_ON((intspec[2] < AT91_AIC_IRQ_MIN_PRIORITY) +		    || (intspec[2] > AT91_AIC_IRQ_MAX_PRIORITY))) +		return -EINVAL; + +	*out_hwirq = intspec[0]; +	*out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; +	at91_aic_irq_priorities[*out_hwirq] = intspec[2]; + +	return 0; +} +  static struct irq_domain_ops at91_aic_irq_ops = {  	.map	= at91_aic_irq_map, -	.xlate	= irq_domain_xlate_twocell, +	.xlate	= at91_aic_irq_domain_xlate,  }; -int __init at91_aic_of_init(struct device_node *node, -				     struct device_node *parent) +int __init at91_aic_of_common_init(struct device_node *node, +				    struct device_node *parent)  { +	struct property *prop; +	const __be32 *p; +	u32 val; + +	at91_extern_irq = kzalloc(BITS_TO_LONGS(n_irqs) +				  * sizeof(*at91_extern_irq), GFP_KERNEL); +	if (!at91_extern_irq) +		return -ENOMEM; + +	if (at91_aic_pm_init()) { +		kfree(at91_extern_irq); +		return -ENOMEM; +	} + +	at91_aic_irq_priorities = kzalloc(n_irqs +					  * sizeof(*at91_aic_irq_priorities), +					  GFP_KERNEL); +	if (!at91_aic_irq_priorities) +		return -ENOMEM; +  	at91_aic_base = of_iomap(node, 0);  	at91_aic_np = node; -	at91_aic_domain = irq_domain_add_linear(at91_aic_np, NR_AIC_IRQS, +	at91_aic_domain = irq_domain_add_linear(at91_aic_np, n_irqs,  						&at91_aic_irq_ops, NULL);  	if (!at91_aic_domain)  		panic("Unable to add AIC irq domain (DT)\n"); +	of_property_for_each_u32(node, "atmel,external-irqs", prop, p, val) { +		if (val >= n_irqs) +			pr_warn("AIC: external irq %d >= %d skip it\n", +				val, n_irqs); +		else +			set_bit(val, at91_extern_irq); +	} +  	irq_set_default_host(at91_aic_domain); -	at91_aic_hw_init(NR_AIC_IRQS); +	return 0; +} + +int __init at91_aic_of_init(struct device_node *node, +				     struct device_node *parent) +{ +	int err; + +	err = at91_aic_of_common_init(node, parent); +	if (err) +		return err; + +	at91_aic_hw_init(n_irqs); + +	return 0; +} + +int __init at91_aic5_of_init(struct device_node *node, +				     struct device_node *parent) +{ +	int err; + +	at91_aic_caps |= AT91_AIC_CAP_AIC5; +	n_irqs = NR_AIC5_IRQS; +	at91_aic_chip.irq_ack           = at91_aic5_mask_irq; +	at91_aic_chip.irq_mask		= at91_aic5_mask_irq; +	at91_aic_chip.irq_unmask	= at91_aic5_unmask_irq; +	at91_aic_chip.irq_eoi		= at91_aic5_eoi; +	at91_aic_irq_ops.map		= at91_aic5_irq_map; + +	err = at91_aic_of_common_init(node, parent); +	if (err) +		return err; + +	at91_aic5_hw_init(n_irqs);  	return 0;  } @@ -204,22 +502,25 @@ int __init at91_aic_of_init(struct device_node *node,  /*   * Initialize the AIC interrupt controller.   */ -void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS]) +void __init at91_aic_init(unsigned int *priority)  {  	unsigned int i;  	int irq_base; +	if (at91_aic_pm_init()) +		panic("Unable to allocate bit maps\n"); +  	at91_aic_base = ioremap(AT91_AIC, 512);  	if (!at91_aic_base)  		panic("Unable to ioremap AIC registers\n");  	/* Add irq domain for AIC */ -	irq_base = irq_alloc_descs(-1, 0, NR_AIC_IRQS, 0); +	irq_base = irq_alloc_descs(-1, 0, n_irqs, 0);  	if (irq_base < 0) {  		WARN(1, "Cannot allocate irq_descs, assuming pre-allocated\n");  		irq_base = 0;  	} -	at91_aic_domain = irq_domain_add_legacy(at91_aic_np, NR_AIC_IRQS, +	at91_aic_domain = irq_domain_add_legacy(at91_aic_np, n_irqs,  						irq_base, 0,  						&irq_domain_simple_ops, NULL); @@ -232,15 +533,14 @@ void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])  	 * The IVR is used by macro get_irqnr_and_base to read and verify.  	 * The irq number is NR_AIC_IRQS when a spurious interrupt has occurred.  	 */ -	for (i = 0; i < NR_AIC_IRQS; i++) { +	for (i = 0; i < n_irqs; i++) {  		/* Put hardware irq number in Source Vector Register: */ -		at91_aic_write(AT91_AIC_SVR(i), i); +		at91_aic_write(AT91_AIC_SVR(i), NR_IRQS_LEGACY + i);  		/* Active Low interrupt, with the specified priority */  		at91_aic_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]); - -		irq_set_chip_and_handler(i, &at91_aic_chip, handle_level_irq); +		irq_set_chip_and_handler(NR_IRQS_LEGACY + i, &at91_aic_chip, handle_fasteoi_irq);  		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);  	} -	at91_aic_hw_init(NR_AIC_IRQS); +	at91_aic_hw_init(n_irqs);  } diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 1bfaad62873..2c2d86505a5 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -25,6 +25,7 @@  #include <asm/mach/time.h>  #include <asm/mach/irq.h> +#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> diff --git a/arch/arm/mach-clps711x/common.c b/arch/arm/mach-clps711x/common.c index c965fd8eb31..f15293bd797 100644 --- a/arch/arm/mach-clps711x/common.c +++ b/arch/arm/mach-clps711x/common.c @@ -26,7 +26,6 @@  #include <linux/io.h>  #include <linux/irq.h>  #include <linux/sched.h> -#include <linux/timex.h>  #include <asm/sizes.h>  #include <mach/hardware.h> @@ -188,7 +187,6 @@ static struct irqaction clps711x_timer_irq = {  static void __init clps711x_timer_init(void)  { -	struct timespec tv;  	unsigned int syscon;  	syscon = clps_readl(SYSCON1); @@ -198,10 +196,6 @@ static void __init clps711x_timer_init(void)  	clps_writel(LATCH-1, TC2D); /* 512kHz / 100Hz - 1 */  	setup_irq(IRQ_TC2OI, &clps711x_timer_irq); - -	tv.tv_nsec = 0; -	tv.tv_sec = clps_readl(RTCDR); -	do_settimeofday(&tv);  }  struct sys_timer clps711x_timer = { diff --git a/arch/arm/mach-clps711x/include/mach/memory.h b/arch/arm/mach-clps711x/include/mach/memory.h index 3a032a67725..fc0e028d940 100644 --- a/arch/arm/mach-clps711x/include/mach/memory.h +++ b/arch/arm/mach-clps711x/include/mach/memory.h @@ -25,26 +25,6 @@   */  #define PLAT_PHYS_OFFSET	UL(0xc0000000) -#if !defined(CONFIG_ARCH_CDB89712) && !defined (CONFIG_ARCH_AUTCPU12) - -#define __virt_to_bus(x)	((x) - PAGE_OFFSET) -#define __bus_to_virt(x)	((x) + PAGE_OFFSET) -#define __pfn_to_bus(x)		(__pfn_to_phys(x) - PHYS_OFFSET) -#define __bus_to_pfn(x)		__phys_to_pfn((x) + PHYS_OFFSET) - -#endif - - -/* - * Like the SA1100, the EDB7211 has a large gap between physical RAM - * banks.  In 2.2, the Psion (CL-PS7110) port added custom support for - * discontiguous physical memory.  In 2.4, we can use the standard - * Linux NUMA support. - * - * This is not necessary for EP7211 implementations with only one used - * memory bank.  For those systems, simply undefine CONFIG_DISCONTIGMEM. - */ -  /*   * The PS7211 allows up to 256MB max per DRAM bank, but the EDB7211   * uses only one of the two banks (bank #1).  However, even within @@ -54,23 +34,6 @@   * them, so we use 24 for the node max shift to get 16MB node sizes.   */ -/* - * Because of the wide memory address space between physical RAM banks on the  - * SA1100, it's much more convenient to use Linux's NUMA support to implement - * our memory map representation.  Assuming all memory nodes have equal access  - * characteristics, we then have generic discontiguous memory support. - * - * Of course, all this isn't mandatory for SA1100 implementations with only - * one used memory bank.  For those, simply undefine CONFIG_DISCONTIGMEM. - * - * The nodes are matched with the physical memory bank addresses which are  - * incidentally the same as virtual addresses. - *  - * 	node 0:  0xc0000000 - 0xc7ffffff - * 	node 1:  0xc8000000 - 0xcfffffff - * 	node 2:  0xd0000000 - 0xd7ffffff - * 	node 3:  0xd8000000 - 0xdfffffff - */  #define SECTION_SIZE_BITS	24  #define MAX_PHYSMEM_BITS	32 diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c index 42ee8f33eaf..f266d90b9ef 100644 --- a/arch/arm/mach-clps711x/p720t.c +++ b/arch/arm/mach-clps711x/p720t.c @@ -86,17 +86,7 @@ static void __init p720t_map_io(void)  	iotable_init(p720t_io_desc, ARRAY_SIZE(p720t_io_desc));  } -MACHINE_START(P720T, "ARM-Prospector720T") -	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ -	.atag_offset	= 0x100, -	.fixup		= fixup_p720t, -	.map_io		= p720t_map_io, -	.init_irq	= clps711x_init_irq, -	.timer		= &clps711x_timer, -	.restart	= clps711x_restart, -MACHINE_END - -static int p720t_hw_init(void) +static void __init p720t_init_early(void)  {  	/*  	 * Power down as much as possible in case we don't @@ -111,13 +101,19 @@ static int p720t_hw_init(void)  	PLD_CODEC = 0;  	PLD_TCH   = 0;  	PLD_SPI   = 0; -#ifndef CONFIG_DEBUG_LL -	PLD_COM2  = 0; -	PLD_COM1  = 0; -#endif - -	return 0; +	if (!IS_ENABLED(CONFIG_DEBUG_LL)) { +		PLD_COM2 = 0; +		PLD_COM1 = 0; +	}  } -__initcall(p720t_hw_init); - +MACHINE_START(P720T, "ARM-Prospector720T") +	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ +	.atag_offset	= 0x100, +	.fixup		= fixup_p720t, +	.init_early	= p720t_init_early, +	.map_io		= p720t_map_io, +	.init_irq	= clps711x_init_irq, +	.timer		= &clps711x_timer, +	.restart	= clps711x_restart, +MACHINE_END diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig index 32d837d8eab..ab99c3c3b75 100644 --- a/arch/arm/mach-davinci/Kconfig +++ b/arch/arm/mach-davinci/Kconfig @@ -4,6 +4,7 @@ config AINTC  	bool  config CP_INTC +	select IRQ_DOMAIN  	bool  config ARCH_DAVINCI_DMx @@ -61,7 +62,6 @@ config MACH_DAVINCI_EVM  	bool "TI DM644x EVM"  	default ARCH_DAVINCI_DM644x  	depends on ARCH_DAVINCI_DM644x -	select MISC_DEVICES  	select EEPROM_AT24  	select I2C  	help @@ -71,7 +71,6 @@ config MACH_DAVINCI_EVM  config MACH_SFFSDR  	bool "Lyrtech SFFSDR"  	depends on ARCH_DAVINCI_DM644x -	select MISC_DEVICES  	select EEPROM_AT24  	select I2C  	help @@ -105,7 +104,6 @@ config MACH_DAVINCI_DM6467_EVM  	default ARCH_DAVINCI_DM646x  	depends on ARCH_DAVINCI_DM646x  	select MACH_DAVINCI_DM6467TEVM -	select MISC_DEVICES  	select EEPROM_AT24  	select I2C  	help @@ -119,7 +117,6 @@ config MACH_DAVINCI_DM365_EVM  	bool "TI DM365 EVM"  	default ARCH_DAVINCI_DM365  	depends on ARCH_DAVINCI_DM365 -	select MISC_DEVICES  	select EEPROM_AT24  	select I2C  	help @@ -131,7 +128,6 @@ config MACH_DAVINCI_DA830_EVM  	default ARCH_DAVINCI_DA830  	depends on ARCH_DAVINCI_DA830  	select GPIO_PCF857X -	select MISC_DEVICES  	select EEPROM_AT24  	select I2C  	help @@ -218,7 +214,6 @@ config MACH_TNETV107X  config MACH_MITYOMAPL138  	bool "Critical Link MityDSP-L138/MityARM-1808 SoM"  	depends on ARCH_DAVINCI_DA850 -	select MISC_DEVICES  	select EEPROM_AT24  	select I2C  	help diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index 2db78bd5c83..2227effcb0e 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile @@ -39,3 +39,4 @@ obj-$(CONFIG_MACH_OMAPL138_HAWKBOARD)	+= board-omapl138-hawk.o  obj-$(CONFIG_CPU_FREQ)			+= cpufreq.o  obj-$(CONFIG_CPU_IDLE)			+= cpuidle.o  obj-$(CONFIG_SUSPEND)			+= pm.o sleep.o +obj-$(CONFIG_HAVE_CLK)			+= pm_domain.o diff --git a/arch/arm/mach-davinci/cp_intc.c b/arch/arm/mach-davinci/cp_intc.c index f83152d643c..006dae8dfe4 100644 --- a/arch/arm/mach-davinci/cp_intc.c +++ b/arch/arm/mach-davinci/cp_intc.c @@ -9,9 +9,14 @@   * kind, whether express or implied.   */ +#include <linux/export.h>  #include <linux/init.h>  #include <linux/irq.h> +#include <linux/irqdomain.h>  #include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <mach/common.h>  #include <mach/cp_intc.h> @@ -28,7 +33,7 @@ static inline void cp_intc_write(unsigned long value, unsigned offset)  static void cp_intc_ack_irq(struct irq_data *d)  { -	cp_intc_write(d->irq, CP_INTC_SYS_STAT_IDX_CLR); +	cp_intc_write(d->hwirq, CP_INTC_SYS_STAT_IDX_CLR);  }  /* Disable interrupt */ @@ -36,20 +41,20 @@ static void cp_intc_mask_irq(struct irq_data *d)  {  	/* XXX don't know why we need to disable nIRQ here... */  	cp_intc_write(1, CP_INTC_HOST_ENABLE_IDX_CLR); -	cp_intc_write(d->irq, CP_INTC_SYS_ENABLE_IDX_CLR); +	cp_intc_write(d->hwirq, CP_INTC_SYS_ENABLE_IDX_CLR);  	cp_intc_write(1, CP_INTC_HOST_ENABLE_IDX_SET);  }  /* Enable interrupt */  static void cp_intc_unmask_irq(struct irq_data *d)  { -	cp_intc_write(d->irq, CP_INTC_SYS_ENABLE_IDX_SET); +	cp_intc_write(d->hwirq, CP_INTC_SYS_ENABLE_IDX_SET);  }  static int cp_intc_set_irq_type(struct irq_data *d, unsigned int flow_type)  { -	unsigned reg		= BIT_WORD(d->irq); -	unsigned mask		= BIT_MASK(d->irq); +	unsigned reg		= BIT_WORD(d->hwirq); +	unsigned mask		= BIT_MASK(d->hwirq);  	unsigned polarity	= cp_intc_read(CP_INTC_SYS_POLARITY(reg));  	unsigned type		= cp_intc_read(CP_INTC_SYS_TYPE(reg)); @@ -99,18 +104,43 @@ static struct irq_chip cp_intc_irq_chip = {  	.irq_set_wake	= cp_intc_set_wake,  }; -void __init cp_intc_init(void) +static struct irq_domain *cp_intc_domain; + +static int cp_intc_host_map(struct irq_domain *h, unsigned int virq, +			  irq_hw_number_t hw)  { -	unsigned long num_irq	= davinci_soc_info.intc_irq_num; +	pr_debug("cp_intc_host_map(%d, 0x%lx)\n", virq, hw); + +	irq_set_chip(virq, &cp_intc_irq_chip); +	set_irq_flags(virq, IRQF_VALID | IRQF_PROBE); +	irq_set_handler(virq, handle_edge_irq); +	return 0; +} + +static const struct irq_domain_ops cp_intc_host_ops = { +	.map = cp_intc_host_map, +	.xlate = irq_domain_xlate_onetwocell, +}; + +int __init cp_intc_of_init(struct device_node *node, struct device_node *parent) +{ +	u32 num_irq		= davinci_soc_info.intc_irq_num;  	u8 *irq_prio		= davinci_soc_info.intc_irq_prios;  	u32 *host_map		= davinci_soc_info.intc_host_map;  	unsigned num_reg	= BITS_TO_LONGS(num_irq); -	int i; +	int i, irq_base;  	davinci_intc_type = DAVINCI_INTC_TYPE_CP_INTC; -	davinci_intc_base = ioremap(davinci_soc_info.intc_base, SZ_8K); +	if (node) { +		davinci_intc_base = of_iomap(node, 0); +		if (of_property_read_u32(node, "ti,intc-size", &num_irq)) +			pr_warn("unable to get intc-size, default to %d\n", +				num_irq); +	} else { +		davinci_intc_base = ioremap(davinci_soc_info.intc_base, SZ_8K); +	}  	if (WARN_ON(!davinci_intc_base)) -		return; +		return -EINVAL;  	cp_intc_write(0, CP_INTC_GLOBAL_ENABLE); @@ -165,13 +195,28 @@ void __init cp_intc_init(void)  		for (i = 0; host_map[i] != -1; i++)  			cp_intc_write(host_map[i], CP_INTC_HOST_MAP(i)); -	/* Set up genirq dispatching for cp_intc */ -	for (i = 0; i < num_irq; i++) { -		irq_set_chip(i, &cp_intc_irq_chip); -		set_irq_flags(i, IRQF_VALID | IRQF_PROBE); -		irq_set_handler(i, handle_edge_irq); +	irq_base = irq_alloc_descs(-1, 0, num_irq, 0); +	if (irq_base < 0) { +		pr_warn("Couldn't allocate IRQ numbers\n"); +		irq_base = 0; +	} + +	/* create a legacy host */ +	cp_intc_domain = irq_domain_add_legacy(node, num_irq, +					irq_base, 0, &cp_intc_host_ops, NULL); + +	if (!cp_intc_domain) { +		pr_err("cp_intc: failed to allocate irq host!\n"); +		return -EINVAL;  	}  	/* Enable global interrupt */  	cp_intc_write(1, CP_INTC_GLOBAL_ENABLE); + +	return 0; +} + +void __init cp_intc_init(void) +{ +	cp_intc_of_init(NULL, NULL);  } diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index d1624a315c9..783eab6845c 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c @@ -546,6 +546,7 @@ static struct lcd_ctrl_config lcd_cfg = {  	.sync_edge		= 0,  	.sync_ctrl		= 1,  	.raster_order		= 0, +	.fifo_th		= 6,  };  struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata = { diff --git a/arch/arm/mach-davinci/include/mach/cp_intc.h b/arch/arm/mach-davinci/include/mach/cp_intc.h index 4e8190eed67..d13d8dfa2b0 100644 --- a/arch/arm/mach-davinci/include/mach/cp_intc.h +++ b/arch/arm/mach-davinci/include/mach/cp_intc.h @@ -52,5 +52,6 @@  #define CP_INTC_VECTOR_ADDR(n)		(0x2000 + (n << 2))  void __init cp_intc_init(void); +int __init cp_intc_of_init(struct device_node *, struct device_node *);  #endif	/* __ASM_HARDWARE_CP_INTC_H */ diff --git a/arch/arm/mach-davinci/include/mach/dm365.h b/arch/arm/mach-davinci/include/mach/dm365.h deleted file mode 100644 index b9bf3d6a442..00000000000 --- a/arch/arm/mach-davinci/include/mach/dm365.h +++ /dev/null @@ -1 +0,0 @@ -/* empty, remove once unused */ diff --git a/arch/arm/mach-davinci/include/mach/dm646x.h b/arch/arm/mach-davinci/include/mach/dm646x.h deleted file mode 100644 index b9bf3d6a442..00000000000 --- a/arch/arm/mach-davinci/include/mach/dm646x.h +++ /dev/null @@ -1 +0,0 @@ -/* empty, remove once unused */ diff --git a/arch/arm/mach-davinci/include/mach/entry-macro.S b/arch/arm/mach-davinci/include/mach/entry-macro.S index 768b3c06021..cf5f573eb5f 100644 --- a/arch/arm/mach-davinci/include/mach/entry-macro.S +++ b/arch/arm/mach-davinci/include/mach/entry-macro.S @@ -30,12 +30,10 @@  #endif  #if defined(CONFIG_CP_INTC)  1001:		ldr \irqnr, [\base, #0x80] /* get irq number */ +		mov \tmp, \irqnr, lsr #31  		and \irqnr, \irqnr, #0xff  /* irq is in bits 0-9 */ -		mov \tmp, \irqnr, lsr #3 -		and \tmp, \tmp, #0xfc -		add \tmp, \tmp, #0x280 /* get the register offset */ -		ldr \irqstat, [\base, \tmp] /* get the intc status */ -		cmp \irqstat, #0x0 +		and \tmp, \tmp, #0x1 +		cmp \tmp, #0x1  #endif  1002:  		.endm diff --git a/arch/arm/mach-davinci/pm_domain.c b/arch/arm/mach-davinci/pm_domain.c new file mode 100644 index 00000000000..00946e23c1e --- /dev/null +++ b/arch/arm/mach-davinci/pm_domain.c @@ -0,0 +1,64 @@ +/* + * Runtime PM support code for DaVinci + * + * Author: Kevin Hilman + * + * Copyright (C) 2012 Texas Instruments, Inc. + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ +#include <linux/init.h> +#include <linux/pm_runtime.h> +#include <linux/pm_clock.h> +#include <linux/platform_device.h> + +#ifdef CONFIG_PM_RUNTIME +static int davinci_pm_runtime_suspend(struct device *dev) +{ +	int ret; + +	dev_dbg(dev, "%s\n", __func__); + +	ret = pm_generic_runtime_suspend(dev); +	if (ret) +		return ret; + +	ret = pm_clk_suspend(dev); +	if (ret) { +		pm_generic_runtime_resume(dev); +		return ret; +	} + +	return 0; +} + +static int davinci_pm_runtime_resume(struct device *dev) +{ +	dev_dbg(dev, "%s\n", __func__); + +	pm_clk_resume(dev); +	return pm_generic_runtime_resume(dev); +} +#endif + +static struct dev_pm_domain davinci_pm_domain = { +	.ops = { +		SET_RUNTIME_PM_OPS(davinci_pm_runtime_suspend, +				   davinci_pm_runtime_resume, NULL) +		USE_PLATFORM_PM_SLEEP_OPS +	}, +}; + +static struct pm_clk_notifier_block platform_bus_notifier = { +	.pm_domain = &davinci_pm_domain, +}; + +static int __init davinci_pm_runtime_init(void) +{ +	pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier); + +	return 0; +} +core_initcall(davinci_pm_runtime_init); diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index 9493076fc59..4db5de54b6a 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c @@ -101,8 +101,8 @@ void __init dove_ehci1_init(void)   ****************************************************************************/  void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data)  { -	orion_ge00_init(eth_data, -			DOVE_GE00_PHYS_BASE, IRQ_DOVE_GE00_SUM, 0); +	orion_ge00_init(eth_data, DOVE_GE00_PHYS_BASE, +			IRQ_DOVE_GE00_SUM, IRQ_DOVE_GE00_ERR);  }  /***************************************************************************** diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 4dd07a0e360..4afe52aaaff 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -797,6 +797,102 @@ static struct platform_device ep93xx_wdt_device = {  	.resource	= ep93xx_wdt_resources,  }; +/************************************************************************* + * EP93xx IDE + *************************************************************************/ +static struct resource ep93xx_ide_resources[] = { +	DEFINE_RES_MEM(EP93XX_IDE_PHYS_BASE, 0x38), +	DEFINE_RES_IRQ(IRQ_EP93XX_EXT3), +}; + +static struct platform_device ep93xx_ide_device = { +	.name		= "ep93xx-ide", +	.id		= -1, +	.dev		= { +		.dma_mask		= &ep93xx_ide_device.dev.coherent_dma_mask, +		.coherent_dma_mask	= DMA_BIT_MASK(32), +	}, +	.num_resources	= ARRAY_SIZE(ep93xx_ide_resources), +	.resource	= ep93xx_ide_resources, +}; + +void __init ep93xx_register_ide(void) +{ +	platform_device_register(&ep93xx_ide_device); +} + +int ep93xx_ide_acquire_gpio(struct platform_device *pdev) +{ +	int err; +	int i; + +	err = gpio_request(EP93XX_GPIO_LINE_EGPIO2, dev_name(&pdev->dev)); +	if (err) +		return err; +	err = gpio_request(EP93XX_GPIO_LINE_EGPIO15, dev_name(&pdev->dev)); +	if (err) +		goto fail_egpio15; +	for (i = 2; i < 8; i++) { +		err = gpio_request(EP93XX_GPIO_LINE_E(i), dev_name(&pdev->dev)); +		if (err) +			goto fail_gpio_e; +	} +	for (i = 4; i < 8; i++) { +		err = gpio_request(EP93XX_GPIO_LINE_G(i), dev_name(&pdev->dev)); +		if (err) +			goto fail_gpio_g; +	} +	for (i = 0; i < 8; i++) { +		err = gpio_request(EP93XX_GPIO_LINE_H(i), dev_name(&pdev->dev)); +		if (err) +			goto fail_gpio_h; +	} + +	/* GPIO ports E[7:2], G[7:4] and H used by IDE */ +	ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_EONIDE | +				 EP93XX_SYSCON_DEVCFG_GONIDE | +				 EP93XX_SYSCON_DEVCFG_HONIDE); +	return 0; + +fail_gpio_h: +	for (--i; i >= 0; --i) +		gpio_free(EP93XX_GPIO_LINE_H(i)); +	i = 8; +fail_gpio_g: +	for (--i; i >= 4; --i) +		gpio_free(EP93XX_GPIO_LINE_G(i)); +	i = 8; +fail_gpio_e: +	for (--i; i >= 2; --i) +		gpio_free(EP93XX_GPIO_LINE_E(i)); +	gpio_free(EP93XX_GPIO_LINE_EGPIO15); +fail_egpio15: +	gpio_free(EP93XX_GPIO_LINE_EGPIO2); +	return err; +} +EXPORT_SYMBOL(ep93xx_ide_acquire_gpio); + +void ep93xx_ide_release_gpio(struct platform_device *pdev) +{ +	int i; + +	for (i = 2; i < 8; i++) +		gpio_free(EP93XX_GPIO_LINE_E(i)); +	for (i = 4; i < 8; i++) +		gpio_free(EP93XX_GPIO_LINE_G(i)); +	for (i = 0; i < 8; i++) +		gpio_free(EP93XX_GPIO_LINE_H(i)); +	gpio_free(EP93XX_GPIO_LINE_EGPIO15); +	gpio_free(EP93XX_GPIO_LINE_EGPIO2); + + +	/* GPIO ports E[7:2], G[7:4] and H used by GPIO */ +	ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_EONIDE | +			       EP93XX_SYSCON_DEVCFG_GONIDE | +			       EP93XX_SYSCON_DEVCFG_HONIDE); +} +EXPORT_SYMBOL(ep93xx_ide_release_gpio); +  void __init ep93xx_init_devices(void)  {  	/* Disallow access to MaverickCrunch initially */ diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index d74c5cddb98..337ab7cf4c1 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c @@ -91,8 +91,8 @@ static void __init edb93xx_register_i2c(void)  		ep93xx_register_i2c(&edb93xx_i2c_gpio_data,  				    edb93xxa_i2c_board_info,  				    ARRAY_SIZE(edb93xxa_i2c_board_info)); -	} else if (machine_is_edb9307() || machine_is_edb9312() || -		   machine_is_edb9315()) { +	} else if (machine_is_edb9302() || machine_is_edb9307() +		|| machine_is_edb9312() || machine_is_edb9315()) {  		ep93xx_register_i2c(&edb93xx_i2c_gpio_data,  				    edb93xx_i2c_board_info,  				    ARRAY_SIZE(edb93xx_i2c_board_info)); @@ -233,6 +233,29 @@ static void __init edb93xx_register_fb(void)  } +/************************************************************************* + * EDB93xx IDE + *************************************************************************/ +static int __init edb93xx_has_ide(void) +{ +	/* +	 * Although EDB9312 and EDB9315 do have IDE capability, they have +	 * INTRQ line wired as pull-up, which makes using IDE interface +	 * problematic. +	 */ +	return machine_is_edb9312() || machine_is_edb9315() || +	       machine_is_edb9315a(); +} + +static void __init edb93xx_register_ide(void) +{ +	if (!edb93xx_has_ide()) +		return; + +	ep93xx_register_ide(); +} + +  static void __init edb93xx_init_machine(void)  {  	ep93xx_init_devices(); @@ -243,6 +266,7 @@ static void __init edb93xx_init_machine(void)  	edb93xx_register_i2s();  	edb93xx_register_pwm();  	edb93xx_register_fb(); +	edb93xx_register_ide();  } diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index 1ecb040d98b..33a5122c6dc 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h @@ -48,6 +48,9 @@ void ep93xx_register_i2s(void);  int ep93xx_i2s_acquire(void);  void ep93xx_i2s_release(void);  void ep93xx_register_ac97(void); +void ep93xx_register_ide(void); +int ep93xx_ide_acquire_gpio(struct platform_device *pdev); +void ep93xx_ide_release_gpio(struct platform_device *pdev);  void ep93xx_init_devices(void);  extern struct sys_timer ep93xx_timer; diff --git a/arch/arm/mach-ep93xx/soc.h b/arch/arm/mach-ep93xx/soc.h index 979fba72292..7bf7ff8beae 100644 --- a/arch/arm/mach-ep93xx/soc.h +++ b/arch/arm/mach-ep93xx/soc.h @@ -69,6 +69,7 @@  #define EP93XX_BOOT_ROM_BASE		EP93XX_AHB_IOMEM(0x00090000) +#define EP93XX_IDE_PHYS_BASE		EP93XX_AHB_PHYS(0x000a0000)  #define EP93XX_IDE_BASE			EP93XX_AHB_IOMEM(0x000a0000)  #define EP93XX_VIC1_BASE		EP93XX_AHB_IOMEM(0x000b0000) diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index 6f6d13f91e4..b5b4c8c9db1 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig @@ -207,6 +207,7 @@ config MACH_SMDKV310  	select S3C_DEV_HSMMC1  	select S3C_DEV_HSMMC2  	select S3C_DEV_HSMMC3 +	select S3C_DEV_USB_HSOTG  	select SAMSUNG_DEV_BACKLIGHT  	select EXYNOS_DEV_DRM  	select EXYNOS_DEV_SYSMMU @@ -326,6 +327,7 @@ config MACH_ORIGEN  	select S3C_DEV_WDT  	select S3C_DEV_HSMMC  	select S3C_DEV_HSMMC2 +	select S3C_DEV_USB_HSOTG  	select S5P_DEV_FIMC0  	select S5P_DEV_FIMC1  	select S5P_DEV_FIMC2 @@ -360,22 +362,27 @@ config MACH_SMDK4212  	select S3C_DEV_I2C3  	select S3C_DEV_I2C7  	select S3C_DEV_RTC +	select S3C_DEV_USB_HSOTG  	select S3C_DEV_WDT  	select S5P_DEV_FIMC0  	select S5P_DEV_FIMC1  	select S5P_DEV_FIMC2  	select S5P_DEV_FIMC3 +	select S5P_DEV_FIMD0  	select S5P_DEV_MFC  	select SAMSUNG_DEV_BACKLIGHT  	select SAMSUNG_DEV_KEYPAD  	select SAMSUNG_DEV_PWM  	select EXYNOS_DEV_SYSMMU  	select EXYNOS_DEV_DMA +	select EXYNOS_DEV_DRM +	select EXYNOS4_SETUP_FIMD0  	select EXYNOS4_SETUP_I2C1  	select EXYNOS4_SETUP_I2C3  	select EXYNOS4_SETUP_I2C7  	select EXYNOS4_SETUP_KEYPAD  	select EXYNOS4_SETUP_SDHCI +	select EXYNOS4_SETUP_USB_PHY  	help  	  Machine support for Samsung SMDK4212 diff --git a/arch/arm/mach-exynos/clock-exynos4.c b/arch/arm/mach-exynos/clock-exynos4.c index bcb7db45314..2f51293c187 100644 --- a/arch/arm/mach-exynos/clock-exynos4.c +++ b/arch/arm/mach-exynos/clock-exynos4.c @@ -586,17 +586,17 @@ static struct clk exynos4_init_clocks_off[] = {  		.ctrlbit	= (1 << 13),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "exynos4210-spi.0",  		.enable		= exynos4_clk_ip_peril_ctrl,  		.ctrlbit	= (1 << 16),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "exynos4210-spi.1",  		.enable		= exynos4_clk_ip_peril_ctrl,  		.ctrlbit	= (1 << 17),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.2", +		.devname	= "exynos4210-spi.2",  		.enable		= exynos4_clk_ip_peril_ctrl,  		.ctrlbit	= (1 << 18),  	}, { @@ -620,10 +620,6 @@ static struct clk exynos4_init_clocks_off[] = {  		.enable		= exynos4_clk_ip_peril_ctrl,  		.ctrlbit	= (1 << 27),  	}, { -		.name		= "fimg2d", -		.enable		= exynos4_clk_ip_image_ctrl, -		.ctrlbit	= (1 << 0), -	}, {  		.name		= "mfc",  		.devname	= "s5p-mfc",  		.enable		= exynos4_clk_ip_mfc_ctrl, @@ -819,47 +815,21 @@ static struct clk *exynos4_clkset_mout_g2d0_list[] = {  	[1] = &exynos4_clk_sclk_apll.clk,  }; -static struct clksrc_sources exynos4_clkset_mout_g2d0 = { +struct clksrc_sources exynos4_clkset_mout_g2d0 = {  	.sources	= exynos4_clkset_mout_g2d0_list,  	.nr_sources	= ARRAY_SIZE(exynos4_clkset_mout_g2d0_list),  }; -static struct clksrc_clk exynos4_clk_mout_g2d0 = { -	.clk	= { -		.name		= "mout_g2d0", -	}, -	.sources = &exynos4_clkset_mout_g2d0, -	.reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 0, .size = 1 }, -}; -  static struct clk *exynos4_clkset_mout_g2d1_list[] = {  	[0] = &exynos4_clk_mout_epll.clk,  	[1] = &exynos4_clk_sclk_vpll.clk,  }; -static struct clksrc_sources exynos4_clkset_mout_g2d1 = { +struct clksrc_sources exynos4_clkset_mout_g2d1 = {  	.sources	= exynos4_clkset_mout_g2d1_list,  	.nr_sources	= ARRAY_SIZE(exynos4_clkset_mout_g2d1_list),  }; -static struct clksrc_clk exynos4_clk_mout_g2d1 = { -	.clk	= { -		.name		= "mout_g2d1", -	}, -	.sources = &exynos4_clkset_mout_g2d1, -	.reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 4, .size = 1 }, -}; - -static struct clk *exynos4_clkset_mout_g2d_list[] = { -	[0] = &exynos4_clk_mout_g2d0.clk, -	[1] = &exynos4_clk_mout_g2d1.clk, -}; - -static struct clksrc_sources exynos4_clkset_mout_g2d = { -	.sources	= exynos4_clkset_mout_g2d_list, -	.nr_sources	= ARRAY_SIZE(exynos4_clkset_mout_g2d_list), -}; -  static struct clk *exynos4_clkset_mout_mfc0_list[] = {  	[0] = &exynos4_clk_mout_mpll.clk,  	[1] = &exynos4_clk_sclk_apll.clk, @@ -1126,13 +1096,6 @@ static struct clksrc_clk exynos4_clksrcs[] = {  		.reg_div = { .reg = EXYNOS4_CLKDIV_LCD0, .shift = 0, .size = 4 },  	}, {  		.clk	= { -			.name		= "sclk_fimg2d", -		}, -		.sources = &exynos4_clkset_mout_g2d, -		.reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 8, .size = 1 }, -		.reg_div = { .reg = EXYNOS4_CLKDIV_IMAGE, .shift = 0, .size = 4 }, -	}, { -		.clk	= {  			.name		= "sclk_mfc",  			.devname	= "s5p-mfc",  		}, @@ -1242,40 +1205,67 @@ static struct clksrc_clk exynos4_clk_sclk_mmc3 = {  	.reg_div = { .reg = EXYNOS4_CLKDIV_FSYS2, .shift = 24, .size = 8 },  }; +static struct clksrc_clk exynos4_clk_mdout_spi0 = { +	.clk	= { +		.name		= "mdout_spi", +		.devname	= "exynos4210-spi.0", +	}, +	.sources = &exynos4_clkset_group, +	.reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 16, .size = 4 }, +	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 0, .size = 4 }, +}; + +static struct clksrc_clk exynos4_clk_mdout_spi1 = { +	.clk	= { +		.name		= "mdout_spi", +		.devname	= "exynos4210-spi.1", +	}, +	.sources = &exynos4_clkset_group, +	.reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 20, .size = 4 }, +	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 16, .size = 4 }, +}; + +static struct clksrc_clk exynos4_clk_mdout_spi2 = { +	.clk	= { +		.name		= "mdout_spi", +		.devname	= "exynos4210-spi.2", +	}, +	.sources = &exynos4_clkset_group, +	.reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 24, .size = 4 }, +	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL2, .shift = 0, .size = 4 }, +}; +  static struct clksrc_clk exynos4_clk_sclk_spi0 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "exynos4210-spi.0", +		.parent		= &exynos4_clk_mdout_spi0.clk,  		.enable		= exynos4_clksrc_mask_peril1_ctrl,  		.ctrlbit	= (1 << 16),  	}, -	.sources = &exynos4_clkset_group, -	.reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 16, .size = 4 }, -	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 0, .size = 4 }, +	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 8, .size = 8 },  };  static struct clksrc_clk exynos4_clk_sclk_spi1 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "exynos4210-spi.1", +		.parent		= &exynos4_clk_mdout_spi1.clk,  		.enable		= exynos4_clksrc_mask_peril1_ctrl,  		.ctrlbit	= (1 << 20),  	}, -	.sources = &exynos4_clkset_group, -	.reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 20, .size = 4 }, -	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 16, .size = 4 }, +	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 24, .size = 8 },  };  static struct clksrc_clk exynos4_clk_sclk_spi2 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.2", +		.devname	= "exynos4210-spi.2", +		.parent		= &exynos4_clk_mdout_spi2.clk,  		.enable		= exynos4_clksrc_mask_peril1_ctrl,  		.ctrlbit	= (1 << 24),  	}, -	.sources = &exynos4_clkset_group, -	.reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 24, .size = 4 }, -	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL2, .shift = 0, .size = 4 }, +	.reg_div = { .reg = EXYNOS4_CLKDIV_PERIL2, .shift = 8, .size = 8 },  };  /* Clock initialization code */ @@ -1331,7 +1321,9 @@ static struct clksrc_clk *exynos4_clksrc_cdev[] = {  	&exynos4_clk_sclk_spi0,  	&exynos4_clk_sclk_spi1,  	&exynos4_clk_sclk_spi2, - +	&exynos4_clk_mdout_spi0, +	&exynos4_clk_mdout_spi1, +	&exynos4_clk_mdout_spi2,  };  static struct clk_lookup exynos4_clk_lookup[] = { @@ -1347,9 +1339,9 @@ static struct clk_lookup exynos4_clk_lookup[] = {  	CLKDEV_INIT("dma-pl330.0", "apb_pclk", &exynos4_clk_pdma0),  	CLKDEV_INIT("dma-pl330.1", "apb_pclk", &exynos4_clk_pdma1),  	CLKDEV_INIT("dma-pl330.2", "apb_pclk", &exynos4_clk_mdma1), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk0", &exynos4_clk_sclk_spi0.clk), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk0", &exynos4_clk_sclk_spi1.clk), -	CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk0", &exynos4_clk_sclk_spi2.clk), +	CLKDEV_INIT("exynos4210-spi.0", "spi_busclk0", &exynos4_clk_sclk_spi0.clk), +	CLKDEV_INIT("exynos4210-spi.1", "spi_busclk0", &exynos4_clk_sclk_spi1.clk), +	CLKDEV_INIT("exynos4210-spi.2", "spi_busclk0", &exynos4_clk_sclk_spi2.clk),  };  static int xtal_rate; diff --git a/arch/arm/mach-exynos/clock-exynos4.h b/arch/arm/mach-exynos/clock-exynos4.h index 28a11970118..bd12d5f8b63 100644 --- a/arch/arm/mach-exynos/clock-exynos4.h +++ b/arch/arm/mach-exynos/clock-exynos4.h @@ -23,6 +23,9 @@ extern struct clksrc_sources exynos4_clkset_group;  extern struct clk *exynos4_clkset_aclk_top_list[];  extern struct clk *exynos4_clkset_group_list[]; +extern struct clksrc_sources exynos4_clkset_mout_g2d0; +extern struct clksrc_sources exynos4_clkset_mout_g2d1; +  extern int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable);  extern int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable);  extern int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable); diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c index b8689ff60ba..fed4c26e9da 100644 --- a/arch/arm/mach-exynos/clock-exynos4210.c +++ b/arch/arm/mach-exynos/clock-exynos4210.c @@ -48,6 +48,32 @@ static struct clksrc_clk *sysclks[] = {  	/* nothing here yet */  }; +static struct clksrc_clk exynos4210_clk_mout_g2d0 = { +	.clk	= { +		.name		= "mout_g2d0", +	}, +	.sources = &exynos4_clkset_mout_g2d0, +	.reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 0, .size = 1 }, +}; + +static struct clksrc_clk exynos4210_clk_mout_g2d1 = { +	.clk	= { +		.name		= "mout_g2d1", +	}, +	.sources = &exynos4_clkset_mout_g2d1, +	.reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 4, .size = 1 }, +}; + +static struct clk *exynos4210_clkset_mout_g2d_list[] = { +	[0] = &exynos4210_clk_mout_g2d0.clk, +	[1] = &exynos4210_clk_mout_g2d1.clk, +}; + +static struct clksrc_sources exynos4210_clkset_mout_g2d = { +	.sources	= exynos4210_clkset_mout_g2d_list, +	.nr_sources	= ARRAY_SIZE(exynos4210_clkset_mout_g2d_list), +}; +  static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)  {  	return s5p_gatectrl(EXYNOS4210_CLKSRC_MASK_LCD1, clk, enable); @@ -74,6 +100,13 @@ static struct clksrc_clk clksrcs[] = {  		.sources = &exynos4_clkset_group,  		.reg_src = { .reg = EXYNOS4210_CLKSRC_LCD1, .shift = 0, .size = 4 },  		.reg_div = { .reg = EXYNOS4210_CLKDIV_LCD1, .shift = 0, .size = 4 }, +	}, { +		.clk	= { +			.name		= "sclk_fimg2d", +		}, +		.sources = &exynos4210_clkset_mout_g2d, +		.reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 8, .size = 1 }, +		.reg_div = { .reg = EXYNOS4_CLKDIV_IMAGE, .shift = 0, .size = 4 },  	},  }; @@ -105,6 +138,10 @@ static struct clk init_clocks_off[] = {  		.devname	= SYSMMU_CLOCK_DEVNAME(fimd1, 11),  		.enable		= exynos4_clk_ip_lcd1_ctrl,  		.ctrlbit	= (1 << 4), +	}, { +		.name		= "fimg2d", +		.enable		= exynos4_clk_ip_image_ctrl, +		.ctrlbit	= (1 << 0),  	},  }; diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c index da397d21bbc..8fba0b5fb8a 100644 --- a/arch/arm/mach-exynos/clock-exynos4212.c +++ b/arch/arm/mach-exynos/clock-exynos4212.c @@ -68,12 +68,45 @@ static struct clksrc_clk clk_mout_mpll_user = {  	.reg_src	= { .reg = EXYNOS4_CLKSRC_CPU, .shift = 24, .size = 1 },  }; +static struct clksrc_clk exynos4x12_clk_mout_g2d0 = { +	.clk	= { +		.name		= "mout_g2d0", +	}, +	.sources = &exynos4_clkset_mout_g2d0, +	.reg_src = { .reg = EXYNOS4_CLKSRC_DMC, .shift = 20, .size = 1 }, +}; + +static struct clksrc_clk exynos4x12_clk_mout_g2d1 = { +	.clk	= { +		.name		= "mout_g2d1", +	}, +	.sources = &exynos4_clkset_mout_g2d1, +	.reg_src = { .reg = EXYNOS4_CLKSRC_DMC, .shift = 24, .size = 1 }, +}; + +static struct clk *exynos4x12_clkset_mout_g2d_list[] = { +	[0] = &exynos4x12_clk_mout_g2d0.clk, +	[1] = &exynos4x12_clk_mout_g2d1.clk, +}; + +static struct clksrc_sources exynos4x12_clkset_mout_g2d = { +	.sources	= exynos4x12_clkset_mout_g2d_list, +	.nr_sources	= ARRAY_SIZE(exynos4x12_clkset_mout_g2d_list), +}; +  static struct clksrc_clk *sysclks[] = {  	&clk_mout_mpll_user,  };  static struct clksrc_clk clksrcs[] = { -	/* nothing here yet */ +	{ +		.clk	= { +			.name		= "sclk_fimg2d", +		}, +		.sources = &exynos4x12_clkset_mout_g2d, +		.reg_src = { .reg = EXYNOS4_CLKSRC_DMC, .shift = 28, .size = 1 }, +		.reg_div = { .reg = EXYNOS4_CLKDIV_DMC1, .shift = 0, .size = 4 }, +	},  };  static struct clk init_clocks_off[] = { @@ -102,7 +135,11 @@ static struct clk init_clocks_off[] = {  		.devname	= "exynos-fimc-lite.1",  		.enable		= exynos4212_clk_ip_isp0_ctrl,  		.ctrlbit	= (1 << 3), -	} +	}, { +		.name		= "fimg2d", +		.enable		= exynos4_clk_ip_dmc_ctrl, +		.ctrlbit	= (1 << 23), +	},  };  #ifdef CONFIG_PM_SLEEP diff --git a/arch/arm/mach-exynos/clock-exynos5.c b/arch/arm/mach-exynos/clock-exynos5.c index fefa336be2b..774533c6706 100644 --- a/arch/arm/mach-exynos/clock-exynos5.c +++ b/arch/arm/mach-exynos/clock-exynos5.c @@ -131,6 +131,11 @@ static int exynos5_clksrc_mask_peric0_ctrl(struct clk *clk, int enable)  	return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC0, clk, enable);  } +static int exynos5_clksrc_mask_peric1_ctrl(struct clk *clk, int enable) +{ +	return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC1, clk, enable); +} +  static int exynos5_clk_ip_acp_ctrl(struct clk *clk, int enable)  {  	return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ACP, clk, enable); @@ -741,6 +746,24 @@ static struct clk exynos5_init_clocks_off[] = {  		.enable		= exynos5_clk_ip_peric_ctrl,  		.ctrlbit	= (1 << 14),  	}, { +		.name		= "spi", +		.devname	= "exynos4210-spi.0", +		.parent		= &exynos5_clk_aclk_66.clk, +		.enable		= exynos5_clk_ip_peric_ctrl, +		.ctrlbit	= (1 << 16), +	}, { +		.name		= "spi", +		.devname	= "exynos4210-spi.1", +		.parent		= &exynos5_clk_aclk_66.clk, +		.enable		= exynos5_clk_ip_peric_ctrl, +		.ctrlbit	= (1 << 17), +	}, { +		.name		= "spi", +		.devname	= "exynos4210-spi.2", +		.parent		= &exynos5_clk_aclk_66.clk, +		.enable		= exynos5_clk_ip_peric_ctrl, +		.ctrlbit	= (1 << 18), +	}, {  		.name		= SYSMMU_CLOCK_NAME,  		.devname	= SYSMMU_CLOCK_DEVNAME(mfc_l, 0),  		.enable		= &exynos5_clk_ip_mfc_ctrl, @@ -1034,6 +1057,69 @@ static struct clksrc_clk exynos5_clk_sclk_mmc3 = {  	.reg_div = { .reg = EXYNOS5_CLKDIV_FSYS2, .shift = 24, .size = 8 },  }; +static struct clksrc_clk exynos5_clk_mdout_spi0 = { +	.clk	= { +		.name		= "mdout_spi", +		.devname	= "exynos4210-spi.0", +	}, +	.sources = &exynos5_clkset_group, +	.reg_src = { .reg = EXYNOS5_CLKSRC_PERIC1, .shift = 16, .size = 4 }, +	.reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 0, .size = 4 }, +}; + +static struct clksrc_clk exynos5_clk_mdout_spi1 = { +	.clk	= { +		.name		= "mdout_spi", +		.devname	= "exynos4210-spi.1", +	}, +	.sources = &exynos5_clkset_group, +	.reg_src = { .reg = EXYNOS5_CLKSRC_PERIC1, .shift = 20, .size = 4 }, +	.reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 16, .size = 4 }, +}; + +static struct clksrc_clk exynos5_clk_mdout_spi2 = { +	.clk	= { +		.name		= "mdout_spi", +		.devname	= "exynos4210-spi.2", +	}, +	.sources = &exynos5_clkset_group, +	.reg_src = { .reg = EXYNOS5_CLKSRC_PERIC1, .shift = 24, .size = 4 }, +	.reg_div = { .reg = EXYNOS5_CLKDIV_PERIC2, .shift = 0, .size = 4 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_spi0 = { +	.clk	= { +		.name		= "sclk_spi", +		.devname	= "exynos4210-spi.0", +		.parent		= &exynos5_clk_mdout_spi0.clk, +		.enable		= exynos5_clksrc_mask_peric1_ctrl, +		.ctrlbit	= (1 << 16), +	}, +	.reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 8, .size = 8 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_spi1 = { +	.clk	= { +		.name		= "sclk_spi", +		.devname	= "exynos4210-spi.1", +		.parent		= &exynos5_clk_mdout_spi1.clk, +		.enable		= exynos5_clksrc_mask_peric1_ctrl, +		.ctrlbit	= (1 << 20), +	}, +	.reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 24, .size = 8 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_spi2 = { +	.clk	= { +		.name		= "sclk_spi", +		.devname	= "exynos4210-spi.2", +		.parent		= &exynos5_clk_mdout_spi2.clk, +		.enable		= exynos5_clksrc_mask_peric1_ctrl, +		.ctrlbit	= (1 << 24), +	}, +	.reg_div = { .reg = EXYNOS5_CLKDIV_PERIC2, .shift = 8, .size = 8 }, +}; +  static struct clksrc_clk exynos5_clksrcs[] = {  	{  		.clk	= { @@ -1148,6 +1234,12 @@ static struct clksrc_clk *exynos5_sysclks[] = {  	&exynos5_clk_dout_mmc4,  	&exynos5_clk_aclk_acp,  	&exynos5_clk_pclk_acp, +	&exynos5_clk_sclk_spi0, +	&exynos5_clk_sclk_spi1, +	&exynos5_clk_sclk_spi2, +	&exynos5_clk_mdout_spi0, +	&exynos5_clk_mdout_spi1, +	&exynos5_clk_mdout_spi2,  };  static struct clk *exynos5_clk_cdev[] = { @@ -1176,6 +1268,9 @@ static struct clk_lookup exynos5_clk_lookup[] = {  	CLKDEV_INIT("exynos4-sdhci.1", "mmc_busclk.2", &exynos5_clk_sclk_mmc1.clk),  	CLKDEV_INIT("exynos4-sdhci.2", "mmc_busclk.2", &exynos5_clk_sclk_mmc2.clk),  	CLKDEV_INIT("exynos4-sdhci.3", "mmc_busclk.2", &exynos5_clk_sclk_mmc3.clk), +	CLKDEV_INIT("exynos4210-spi.0", "spi_busclk0", &exynos5_clk_sclk_spi0.clk), +	CLKDEV_INIT("exynos4210-spi.1", "spi_busclk0", &exynos5_clk_sclk_spi1.clk), +	CLKDEV_INIT("exynos4210-spi.2", "spi_busclk0", &exynos5_clk_sclk_spi2.clk),  	CLKDEV_INIT("dma-pl330.0", "apb_pclk", &exynos5_clk_pdma0),  	CLKDEV_INIT("dma-pl330.1", "apb_pclk", &exynos5_clk_pdma1),  	CLKDEV_INIT("dma-pl330.2", "apb_pclk", &exynos5_clk_mdma1), diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 742edd3bbec..4eb39cdf75e 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c @@ -540,7 +540,8 @@ static struct irq_domain_ops combiner_irq_domain_ops = {  	.map	= combiner_irq_domain_map,  }; -void __init combiner_init(void __iomem *combiner_base, struct device_node *np) +static void __init combiner_init(void __iomem *combiner_base, +				 struct device_node *np)  {  	int i, irq, irq_base;  	unsigned int max_nr, nr_irq; @@ -712,31 +713,6 @@ static int __init exynos4_l2x0_cache_init(void)  early_initcall(exynos4_l2x0_cache_init);  #endif -static int __init exynos5_l2_cache_init(void) -{ -	unsigned int val; - -	if (!soc_is_exynos5250()) -		return 0; - -	asm volatile("mrc p15, 0, %0, c1, c0, 0\n" -		     "bic %0, %0, #(1 << 2)\n"	/* cache disable */ -		     "mcr p15, 0, %0, c1, c0, 0\n" -		     "mrc p15, 1, %0, c9, c0, 2\n" -		     : "=r"(val)); - -	val |= (1 << 9) | (1 << 5) | (2 << 6) | (2 << 0); - -	asm volatile("mcr p15, 1, %0, c9, c0, 2\n" : : "r"(val)); -	asm volatile("mrc p15, 0, %0, c1, c0, 0\n" -		     "orr %0, %0, #(1 << 2)\n"	/* cache enable */ -		     "mcr p15, 0, %0, c1, c0, 0\n" -		     : : "r"(val)); - -	return 0; -} -early_initcall(exynos5_l2_cache_init); -  static int __init exynos_init(void)  {  	printk(KERN_INFO "EXYNOS: Initializing architecture\n"); diff --git a/arch/arm/mach-exynos/include/mach/irqs.h b/arch/arm/mach-exynos/include/mach/irqs.h index 7a4b4789eb7..35bced6f909 100644 --- a/arch/arm/mach-exynos/include/mach/irqs.h +++ b/arch/arm/mach-exynos/include/mach/irqs.h @@ -195,6 +195,10 @@  #define IRQ_IIC6			EXYNOS4_IRQ_IIC6  #define IRQ_IIC7			EXYNOS4_IRQ_IIC7 +#define IRQ_SPI0			EXYNOS4_IRQ_SPI0 +#define IRQ_SPI1			EXYNOS4_IRQ_SPI1 +#define IRQ_SPI2			EXYNOS4_IRQ_SPI2 +  #define IRQ_USB_HOST			EXYNOS4_IRQ_USB_HOST  #define IRQ_OTG				EXYNOS4_IRQ_USB_HSOTG diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index ca4aa89aa46..c72b675b3e4 100644 --- a/arch/arm/mach-exynos/include/mach/map.h +++ b/arch/arm/mach-exynos/include/mach/map.h @@ -154,6 +154,9 @@  #define EXYNOS4_PA_SPI0			0x13920000  #define EXYNOS4_PA_SPI1			0x13930000  #define EXYNOS4_PA_SPI2			0x13940000 +#define EXYNOS5_PA_SPI0			0x12D20000 +#define EXYNOS5_PA_SPI1			0x12D30000 +#define EXYNOS5_PA_SPI2			0x12D40000  #define EXYNOS4_PA_GPIO1		0x11400000  #define EXYNOS4_PA_GPIO2		0x11000000 diff --git a/arch/arm/mach-exynos/include/mach/regs-pmu.h b/arch/arm/mach-exynos/include/mach/regs-pmu.h index 43a99e6f56a..d4e392b811a 100644 --- a/arch/arm/mach-exynos/include/mach/regs-pmu.h +++ b/arch/arm/mach-exynos/include/mach/regs-pmu.h @@ -232,6 +232,11 @@  #define EXYNOS5_USB_CFG						S5P_PMUREG(0x0230) +#define EXYNOS5_AUTO_WDTRESET_DISABLE				S5P_PMUREG(0x0408) +#define EXYNOS5_MASK_WDTRESET_REQUEST				S5P_PMUREG(0x040C) + +#define EXYNOS5_SYS_WDTRESET					(1 << 20) +  #define EXYNOS5_ARM_CORE0_SYS_PWR_REG				S5P_PMUREG(0x1000)  #define EXYNOS5_DIS_IRQ_ARM_CORE0_LOCAL_SYS_PWR_REG		S5P_PMUREG(0x1004)  #define EXYNOS5_DIS_IRQ_ARM_CORE0_CENTRAL_SYS_PWR_REG		S5P_PMUREG(0x1008) diff --git a/arch/arm/mach-exynos/include/mach/regs-usb-phy.h b/arch/arm/mach-exynos/include/mach/regs-usb-phy.h index c337cf3a71b..07277735252 100644 --- a/arch/arm/mach-exynos/include/mach/regs-usb-phy.h +++ b/arch/arm/mach-exynos/include/mach/regs-usb-phy.h @@ -35,11 +35,21 @@  #define PHY1_COMMON_ON_N		(1 << 7)  #define PHY0_COMMON_ON_N		(1 << 4)  #define PHY0_ID_PULLUP			(1 << 2) -#define CLKSEL_MASK			(0x3 << 0) -#define CLKSEL_SHIFT			(0) -#define CLKSEL_48M			(0x0 << 0) -#define CLKSEL_12M			(0x2 << 0) -#define CLKSEL_24M			(0x3 << 0) + +#define EXYNOS4_CLKSEL_SHIFT		(0) + +#define EXYNOS4210_CLKSEL_MASK		(0x3 << 0) +#define EXYNOS4210_CLKSEL_48M		(0x0 << 0) +#define EXYNOS4210_CLKSEL_12M		(0x2 << 0) +#define EXYNOS4210_CLKSEL_24M		(0x3 << 0) + +#define EXYNOS4X12_CLKSEL_MASK		(0x7 << 0) +#define EXYNOS4X12_CLKSEL_9600K		(0x0 << 0) +#define EXYNOS4X12_CLKSEL_10M		(0x1 << 0) +#define EXYNOS4X12_CLKSEL_12M		(0x2 << 0) +#define EXYNOS4X12_CLKSEL_19200K	(0x3 << 0) +#define EXYNOS4X12_CLKSEL_20M		(0x4 << 0) +#define EXYNOS4X12_CLKSEL_24M		(0x5 << 0)  #define EXYNOS4_RSTCON			EXYNOS4_HSOTG_PHYREG(0x08)  #define HOST_LINK_PORT_SWRST_MASK	(0xf << 6) diff --git a/arch/arm/mach-exynos/include/mach/spi-clocks.h b/arch/arm/mach-exynos/include/mach/spi-clocks.h deleted file mode 100644 index c71a5fba6a8..00000000000 --- a/arch/arm/mach-exynos/include/mach/spi-clocks.h +++ /dev/null @@ -1,16 +0,0 @@ -/* linux/arch/arm/mach-exynos4/include/mach/spi-clocks.h - * - * Copyright (C) 2011 Samsung Electronics Co. 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. - */ - -#ifndef __ASM_ARCH_SPI_CLKS_H -#define __ASM_ARCH_SPI_CLKS_H __FILE__ - -/* Must source from SCLK_SPI */ -#define EXYNOS_SPI_SRCCLK_SCLK		0 - -#endif /* __ASM_ARCH_SPI_CLKS_H */ diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index e7e9743543a..b2b5d5faa74 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c @@ -55,6 +55,12 @@ static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = {  				"exynos4-sdhci.3", NULL),  	OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(0),  				"s3c2440-i2c.0", NULL), +	OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI0, +				"exynos4210-spi.0", NULL), +	OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI1, +				"exynos4210-spi.1", NULL), +	OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI2, +				"exynos4210-spi.2", NULL),  	OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA0, "dma-pl330.0", NULL),  	OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA1, "dma-pl330.1", NULL),  	{}, diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c index 7b1e11a228c..ef770bc2318 100644 --- a/arch/arm/mach-exynos/mach-exynos5-dt.c +++ b/arch/arm/mach-exynos/mach-exynos5-dt.c @@ -47,6 +47,12 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {  				"s3c2440-i2c.0", NULL),  	OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(1),  				"s3c2440-i2c.1", NULL), +	OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI0, +				"exynos4210-spi.0", NULL), +	OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI1, +				"exynos4210-spi.1", NULL), +	OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI2, +				"exynos4210-spi.2", NULL),  	OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL),  	OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL),  	OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL), diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index 656f8fc9add..ea785fcaf6c 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c @@ -50,7 +50,6 @@  #include <plat/gpio-cfg.h>  #include <plat/iic.h>  #include <plat/mfc.h> -#include <plat/pd.h>  #include <plat/fimc-core.h>  #include <plat/camport.h>  #include <plat/mipi_csis.h> @@ -1067,12 +1066,8 @@ static struct platform_device nuri_max8903_device = {  static void __init nuri_power_init(void)  {  	int gpio; -	int irq_base = IRQ_GPIO_END + 1;  	int ta_en = 0; -	nuri_max8997_pdata.irq_base = irq_base; -	irq_base += MAX8997_IRQ_NR; -  	gpio = EXYNOS4_GPX0(7);  	gpio_request(gpio, "AP_PMIC_IRQ");  	s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf)); @@ -1342,9 +1337,8 @@ static struct platform_device *nuri_devices[] __initdata = {  static void __init nuri_map_io(void)  { -	clk_xusbxti.rate = 24000000;  	exynos_init_io(NULL, 0); -	s3c24xx_init_clocks(24000000); +	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs));  } diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index f5572be9d7b..5ca80307d6d 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c @@ -9,6 +9,7 @@  */  #include <linux/serial_core.h> +#include <linux/leds.h>  #include <linux/gpio.h>  #include <linux/mmc/host.h>  #include <linux/platform_device.h> @@ -21,6 +22,7 @@  #include <linux/mfd/max8997.h>  #include <linux/lcd.h>  #include <linux/rfkill-gpio.h> +#include <linux/platform_data/s3c-hsotg.h>  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> @@ -38,7 +40,6 @@  #include <plat/clock.h>  #include <plat/gpio-cfg.h>  #include <plat/backlight.h> -#include <plat/pd.h>  #include <plat/fb.h>  #include <plat/mfc.h> @@ -425,7 +426,6 @@ static struct max8997_platform_data __initdata origen_max8997_pdata = {  	.buck1_gpiodvs	= false,  	.buck2_gpiodvs	= false,  	.buck5_gpiodvs	= false, -	.irq_base	= IRQ_GPIO_END + 1,  	.ignore_gpiodvs_side_effect = true,  	.buck125_default_idx = 0x0, @@ -499,6 +499,37 @@ static void __init origen_ohci_init(void)  	exynos4_ohci_set_platdata(pdata);  } +/* USB OTG */ +static struct s3c_hsotg_plat origen_hsotg_pdata; + +static struct gpio_led origen_gpio_leds[] = { +	{ +		.name			= "origen::status1", +		.default_trigger	= "heartbeat", +		.gpio			= EXYNOS4_GPX1(3), +		.active_low		= 1, +	}, +	{ +		.name			= "origen::status2", +		.default_trigger	= "mmc0", +		.gpio			= EXYNOS4_GPX1(4), +		.active_low		= 1, +	}, +}; + +static struct gpio_led_platform_data origen_gpio_led_info = { +	.leds		= origen_gpio_leds, +	.num_leds	= ARRAY_SIZE(origen_gpio_leds), +}; + +static struct platform_device origen_leds_gpio = { +	.name	= "leds-gpio", +	.id	= -1, +	.dev	= { +		.platform_data	= &origen_gpio_led_info, +	}, +}; +  static struct gpio_keys_button origen_gpio_keys_table[] = {  	{  		.code			= KEY_MENU, @@ -655,6 +686,7 @@ static struct platform_device *origen_devices[] __initdata = {  	&s3c_device_hsmmc0,  	&s3c_device_i2c0,  	&s3c_device_rtc, +	&s3c_device_usb_hsotg,  	&s3c_device_wdt,  	&s5p_device_ehci,  	&s5p_device_fimc0, @@ -677,6 +709,7 @@ static struct platform_device *origen_devices[] __initdata = {  	&exynos4_device_ohci,  	&origen_device_gpiokeys,  	&origen_lcd_hv070wsa, +	&origen_leds_gpio,  	&origen_device_bluetooth,  }; @@ -712,7 +745,7 @@ static void s5p_tv_setup(void)  static void __init origen_map_io(void)  {  	exynos_init_io(NULL, 0); -	s3c24xx_init_clocks(24000000); +	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(origen_uartcfgs, ARRAY_SIZE(origen_uartcfgs));  } @@ -744,7 +777,7 @@ static void __init origen_machine_init(void)  	origen_ehci_init();  	origen_ohci_init(); -	clk_xusbxti.rate = 24000000; +	s3c_hsotg_set_platdata(&origen_hsotg_pdata);  	s5p_tv_setup();  	s5p_i2c_hdmiphy_set_platdata(NULL); diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c index fb09c70e195..b26beb13ebe 100644 --- a/arch/arm/mach-exynos/mach-smdk4x12.c +++ b/arch/arm/mach-exynos/mach-smdk4x12.c @@ -13,12 +13,14 @@  #include <linux/i2c.h>  #include <linux/input.h>  #include <linux/io.h> +#include <linux/lcd.h>  #include <linux/mfd/max8997.h>  #include <linux/mmc/host.h>  #include <linux/platform_device.h>  #include <linux/pwm_backlight.h>  #include <linux/regulator/machine.h>  #include <linux/serial_core.h> +#include <linux/platform_data/s3c-hsotg.h>  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> @@ -28,15 +30,18 @@  #include <plat/clock.h>  #include <plat/cpu.h>  #include <plat/devs.h> +#include <plat/fb.h>  #include <plat/gpio-cfg.h>  #include <plat/iic.h>  #include <plat/keypad.h>  #include <plat/mfc.h> +#include <plat/regs-fb.h>  #include <plat/regs-serial.h>  #include <plat/sdhci.h>  #include <mach/map.h> +#include <drm/exynos_drm.h>  #include "common.h"  /* Following are default values for UCON, ULCON and UFCON UART registers */ @@ -219,8 +224,10 @@ static struct platform_pwm_backlight_data smdk4x12_bl_data = {  static uint32_t smdk4x12_keymap[] __initdata = {  	/* KEY(row, col, keycode) */ -	KEY(1, 0, KEY_D), KEY(1, 1, KEY_A), KEY(1, 2, KEY_B), -	KEY(1, 3, KEY_E), KEY(1, 4, KEY_C) +	KEY(1, 3, KEY_1), KEY(1, 4, KEY_2), KEY(1, 5, KEY_3), +	KEY(1, 6, KEY_4), KEY(1, 7, KEY_5), +	KEY(2, 5, KEY_D), KEY(2, 6, KEY_A), KEY(2, 7, KEY_B), +	KEY(0, 7, KEY_E), KEY(0, 5, KEY_C)  };  static struct matrix_keymap_data smdk4x12_keymap_data __initdata = { @@ -230,10 +237,62 @@ static struct matrix_keymap_data smdk4x12_keymap_data __initdata = {  static struct samsung_keypad_platdata smdk4x12_keypad_data __initdata = {  	.keymap_data	= &smdk4x12_keymap_data, -	.rows		= 2, -	.cols		= 5, +	.rows		= 3, +	.cols		= 8,  }; +#ifdef CONFIG_DRM_EXYNOS +static struct exynos_drm_fimd_pdata drm_fimd_pdata = { +	.panel	= { +		.timing	= { +			.left_margin	= 8, +			.right_margin	= 8, +			.upper_margin	= 6, +			.lower_margin	= 6, +			.hsync_len	= 6, +			.vsync_len	= 4, +			.xres		= 480, +			.yres		= 800, +		}, +	}, +	.vidcon0	= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, +	.vidcon1	= VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, +	.default_win	= 0, +	.bpp		= 32, +}; +#else +static struct s3c_fb_pd_win smdk4x12_fb_win0 = { +	.xres		= 480, +	.yres		= 800, +	.virtual_x	= 480, +	.virtual_y	= 800 * 2, +	.max_bpp	= 32, +	.default_bpp	= 24, +}; + +static struct fb_videomode smdk4x12_lcd_timing = { +	.left_margin	= 8, +	.right_margin	= 8, +	.upper_margin	= 6, +	.lower_margin	= 6, +	.hsync_len	= 6, +	.vsync_len	= 4, +	.xres		= 480, +	.yres		= 800, +}; + +static struct s3c_fb_platdata smdk4x12_lcd_pdata __initdata = { +	.win[0]		= &smdk4x12_fb_win0, +	.vtiming	= &smdk4x12_lcd_timing, +	.vidcon0	= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, +	.vidcon1	= VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, +	.setup_gpio	= exynos4_fimd0_gpio_setup_24bpp, +}; +#endif + +/* USB OTG */ +static struct s3c_hsotg_plat smdk4x12_hsotg_pdata; +  static struct platform_device *smdk4x12_devices[] __initdata = {  	&s3c_device_hsmmc2,  	&s3c_device_hsmmc3, @@ -242,22 +301,25 @@ static struct platform_device *smdk4x12_devices[] __initdata = {  	&s3c_device_i2c3,  	&s3c_device_i2c7,  	&s3c_device_rtc, +	&s3c_device_usb_hsotg,  	&s3c_device_wdt,  	&s5p_device_fimc0,  	&s5p_device_fimc1,  	&s5p_device_fimc2,  	&s5p_device_fimc3,  	&s5p_device_fimc_md, +	&s5p_device_fimd0,  	&s5p_device_mfc,  	&s5p_device_mfc_l,  	&s5p_device_mfc_r, +#ifdef CONFIG_DRM_EXYNOS +	&exynos_device_drm, +#endif  	&samsung_device_keypad,  };  static void __init smdk4x12_map_io(void)  { -	clk_xusbxti.rate = 24000000; -  	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(smdk4x12_uartcfgs, ARRAY_SIZE(smdk4x12_uartcfgs)); @@ -293,6 +355,15 @@ static void __init smdk4x12_machine_init(void)  	s3c_sdhci2_set_platdata(&smdk4x12_hsmmc2_pdata);  	s3c_sdhci3_set_platdata(&smdk4x12_hsmmc3_pdata); +	s3c_hsotg_set_platdata(&smdk4x12_hsotg_pdata); + +#ifdef CONFIG_DRM_EXYNOS +	s5p_device_fimd0.dev.platform_data = &drm_fimd_pdata; +	exynos4_fimd0_gpio_setup_24bpp(); +#else +	s5p_fimd0_set_platdata(&smdk4x12_lcd_pdata); +#endif +  	platform_add_devices(smdk4x12_devices, ARRAY_SIZE(smdk4x12_devices));  } diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index 262e9e446a9..3cfa688d274 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c @@ -19,6 +19,7 @@  #include <linux/i2c.h>  #include <linux/input.h>  #include <linux/pwm_backlight.h> +#include <linux/platform_data/s3c-hsotg.h>  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> @@ -34,7 +35,6 @@  #include <plat/keypad.h>  #include <plat/sdhci.h>  #include <plat/iic.h> -#include <plat/pd.h>  #include <plat/gpio-cfg.h>  #include <plat/backlight.h>  #include <plat/mfc.h> @@ -271,6 +271,15 @@ static void __init smdkv310_ohci_init(void)  	exynos4_ohci_set_platdata(pdata);  } +/* USB OTG */ +static struct s3c_hsotg_plat smdkv310_hsotg_pdata; + +/* Audio device */ +static struct platform_device smdkv310_device_audio = { +	.name = "smdk-audio", +	.id = -1, +}; +  static struct platform_device *smdkv310_devices[] __initdata = {  	&s3c_device_hsmmc0,  	&s3c_device_hsmmc1, @@ -279,6 +288,7 @@ static struct platform_device *smdkv310_devices[] __initdata = {  	&s3c_device_i2c1,  	&s5p_device_i2c_hdmiphy,  	&s3c_device_rtc, +	&s3c_device_usb_hsotg,  	&s3c_device_wdt,  	&s5p_device_ehci,  	&s5p_device_fimc0, @@ -302,6 +312,7 @@ static struct platform_device *smdkv310_devices[] __initdata = {  	&samsung_asoc_dma,  	&samsung_asoc_idma,  	&s5p_device_fimd0, +	&smdkv310_device_audio,  	&smdkv310_lcd_lte480wv,  	&smdkv310_smsc911x,  	&exynos4_device_ahci, @@ -354,7 +365,7 @@ static void s5p_tv_setup(void)  static void __init smdkv310_map_io(void)  {  	exynos_init_io(NULL, 0); -	s3c24xx_init_clocks(24000000); +	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(smdkv310_uartcfgs, ARRAY_SIZE(smdkv310_uartcfgs));  } @@ -390,7 +401,7 @@ static void __init smdkv310_machine_init(void)  	smdkv310_ehci_init();  	smdkv310_ohci_init(); -	clk_xusbxti.rate = 24000000; +	s3c_hsotg_set_platdata(&smdkv310_hsotg_pdata);  	platform_add_devices(smdkv310_devices, ARRAY_SIZE(smdkv310_devices));  } @@ -417,5 +428,6 @@ MACHINE_START(SMDKC210, "SMDKC210")  	.init_machine	= smdkv310_machine_init,  	.init_late	= exynos_init_late,  	.timer		= &exynos4_timer, +	.reserve	= &smdkv310_reserve,  	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index cd92fa86ba4..4d1f40d44ed 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c @@ -39,7 +39,6 @@  #include <plat/fb.h>  #include <plat/mfc.h>  #include <plat/sdhci.h> -#include <plat/pd.h>  #include <plat/regs-fb-v4.h>  #include <plat/fimc-core.h>  #include <plat/s5p-time.h> @@ -1100,9 +1099,8 @@ static struct platform_device *universal_devices[] __initdata = {  static void __init universal_map_io(void)  { -	clk_xusbxti.rate = 24000000;  	exynos_init_io(NULL, 0); -	s3c24xx_init_clocks(24000000); +	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));  	s5p_set_timer_source(S5P_PWM2, S5P_PWM4);  } diff --git a/arch/arm/mach-exynos/pmu.c b/arch/arm/mach-exynos/pmu.c index 4aacb66f716..3a48c852be6 100644 --- a/arch/arm/mach-exynos/pmu.c +++ b/arch/arm/mach-exynos/pmu.c @@ -315,7 +315,7 @@ static struct exynos_pmu_conf exynos5250_pmu_config[] = {  	{ PMU_TABLE_END,},  }; -void __iomem *exynos5_list_both_cnt_feed[] = { +static void __iomem *exynos5_list_both_cnt_feed[] = {  	EXYNOS5_ARM_CORE0_OPTION,  	EXYNOS5_ARM_CORE1_OPTION,  	EXYNOS5_ARM_COMMON_OPTION, @@ -329,7 +329,7 @@ void __iomem *exynos5_list_both_cnt_feed[] = {  	EXYNOS5_TOP_PWR_SYSMEM_OPTION,  }; -void __iomem *exynos5_list_diable_wfi_wfe[] = { +static void __iomem *exynos5_list_diable_wfi_wfe[] = {  	EXYNOS5_ARM_CORE1_OPTION,  	EXYNOS5_FSYS_ARM_OPTION,  	EXYNOS5_ISP_ARM_OPTION, @@ -390,6 +390,8 @@ void exynos_sys_powerdown_conf(enum sys_powerdown mode)  static int __init exynos_pmu_init(void)  { +	unsigned int value; +  	exynos_pmu_config = exynos4210_pmu_config;  	if (soc_is_exynos4210()) { @@ -399,6 +401,18 @@ static int __init exynos_pmu_init(void)  		exynos_pmu_config = exynos4x12_pmu_config;  		pr_info("EXYNOS4x12 PMU Initialize\n");  	} else if (soc_is_exynos5250()) { +		/* +		 * When SYS_WDTRESET is set, watchdog timer reset request +		 * is ignored by power management unit. +		 */ +		value = __raw_readl(EXYNOS5_AUTO_WDTRESET_DISABLE); +		value &= ~EXYNOS5_SYS_WDTRESET; +		__raw_writel(value, EXYNOS5_AUTO_WDTRESET_DISABLE); + +		value = __raw_readl(EXYNOS5_MASK_WDTRESET_REQUEST); +		value &= ~EXYNOS5_SYS_WDTRESET; +		__raw_writel(value, EXYNOS5_MASK_WDTRESET_REQUEST); +  		exynos_pmu_config = exynos5250_pmu_config;  		pr_info("EXYNOS5250 PMU Initialize\n");  	} else { diff --git a/arch/arm/mach-exynos/setup-spi.c b/arch/arm/mach-exynos/setup-spi.c index 833ff40ee0e..4999829d1c6 100644 --- a/arch/arm/mach-exynos/setup-spi.c +++ b/arch/arm/mach-exynos/setup-spi.c @@ -9,21 +9,10 @@   */  #include <linux/gpio.h> -#include <linux/platform_device.h> -  #include <plat/gpio-cfg.h> -#include <plat/s3c64xx-spi.h>  #ifdef CONFIG_S3C64XX_DEV_SPI0 -struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { -	.fifo_lvl_mask	= 0x1ff, -	.rx_lvl_offset	= 15, -	.high_speed	= 1, -	.clk_from_cmu	= true, -	.tx_st_done	= 25, -}; - -int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi0_cfg_gpio(void)  {  	s3c_gpio_cfgpin(EXYNOS4_GPB(0), S3C_GPIO_SFN(2));  	s3c_gpio_setpull(EXYNOS4_GPB(0), S3C_GPIO_PULL_UP); @@ -34,15 +23,7 @@ int s3c64xx_spi0_cfg_gpio(struct platform_device *dev)  #endif  #ifdef CONFIG_S3C64XX_DEV_SPI1 -struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 15, -	.high_speed	= 1, -	.clk_from_cmu	= true, -	.tx_st_done	= 25, -}; - -int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi1_cfg_gpio(void)  {  	s3c_gpio_cfgpin(EXYNOS4_GPB(4), S3C_GPIO_SFN(2));  	s3c_gpio_setpull(EXYNOS4_GPB(4), S3C_GPIO_PULL_UP); @@ -53,15 +34,7 @@ int s3c64xx_spi1_cfg_gpio(struct platform_device *dev)  #endif  #ifdef CONFIG_S3C64XX_DEV_SPI2 -struct s3c64xx_spi_info s3c64xx_spi2_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 15, -	.high_speed	= 1, -	.clk_from_cmu	= true, -	.tx_st_done	= 25, -}; - -int s3c64xx_spi2_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi2_cfg_gpio(void)  {  	s3c_gpio_cfgpin(EXYNOS4_GPC1(1), S3C_GPIO_SFN(5));  	s3c_gpio_setpull(EXYNOS4_GPC1(1), S3C_GPIO_PULL_UP); diff --git a/arch/arm/mach-exynos/setup-usb-phy.c b/arch/arm/mach-exynos/setup-usb-phy.c index 1af0a7f44e0..b81cc569a8d 100644 --- a/arch/arm/mach-exynos/setup-usb-phy.c +++ b/arch/arm/mach-exynos/setup-usb-phy.c @@ -31,27 +31,55 @@ static void exynos4210_usb_phy_clkset(struct platform_device *pdev)  	struct clk *xusbxti_clk;  	u32 phyclk; -	/* set clock frequency for PLL */ -	phyclk = readl(EXYNOS4_PHYCLK) & ~CLKSEL_MASK; -  	xusbxti_clk = clk_get(&pdev->dev, "xusbxti");  	if (xusbxti_clk && !IS_ERR(xusbxti_clk)) { -		switch (clk_get_rate(xusbxti_clk)) { -		case 12 * MHZ: -			phyclk |= CLKSEL_12M; -			break; -		case 24 * MHZ: -			phyclk |= CLKSEL_24M; -			break; -		default: -		case 48 * MHZ: -			/* default reference clock */ -			break; +		if (soc_is_exynos4210()) { +			/* set clock frequency for PLL */ +			phyclk = readl(EXYNOS4_PHYCLK) & ~EXYNOS4210_CLKSEL_MASK; + +			switch (clk_get_rate(xusbxti_clk)) { +			case 12 * MHZ: +				phyclk |= EXYNOS4210_CLKSEL_12M; +				break; +			case 48 * MHZ: +				phyclk |= EXYNOS4210_CLKSEL_48M; +				break; +			default: +			case 24 * MHZ: +				phyclk |= EXYNOS4210_CLKSEL_24M; +				break; +			} +			writel(phyclk, EXYNOS4_PHYCLK); +		} else if (soc_is_exynos4212() || soc_is_exynos4412()) { +			/* set clock frequency for PLL */ +			phyclk = readl(EXYNOS4_PHYCLK) & ~EXYNOS4X12_CLKSEL_MASK; + +			switch (clk_get_rate(xusbxti_clk)) { +			case 9600 * KHZ: +				phyclk |= EXYNOS4X12_CLKSEL_9600K; +				break; +			case 10 * MHZ: +				phyclk |= EXYNOS4X12_CLKSEL_10M; +				break; +			case 12 * MHZ: +				phyclk |= EXYNOS4X12_CLKSEL_12M; +				break; +			case 19200 * KHZ: +				phyclk |= EXYNOS4X12_CLKSEL_19200K; +				break; +			case 20 * MHZ: +				phyclk |= EXYNOS4X12_CLKSEL_20M; +				break; +			default: +			case 24 * MHZ: +				/* default reference clock */ +				phyclk |= EXYNOS4X12_CLKSEL_24M; +				break; +			} +			writel(phyclk, EXYNOS4_PHYCLK);  		}  		clk_put(xusbxti_clk);  	} - -	writel(phyclk, EXYNOS4_PHYCLK);  }  static int exynos4210_usb_phy0_init(struct platform_device *pdev) diff --git a/arch/arm/mach-highbank/Makefile b/arch/arm/mach-highbank/Makefile index ded4652ada8..3ec8bdd25d0 100644 --- a/arch/arm/mach-highbank/Makefile +++ b/arch/arm/mach-highbank/Makefile @@ -1,4 +1,4 @@ -obj-y					:= clock.o highbank.o system.o smc.o +obj-y					:= highbank.o system.o smc.o  plus_sec := $(call as-instr,.arch_extension sec,+sec)  AFLAGS_smc.o				:=-Wa,-march=armv7-a$(plus_sec) diff --git a/arch/arm/mach-highbank/clock.c b/arch/arm/mach-highbank/clock.c deleted file mode 100644 index c25a2ae4fde..00000000000 --- a/arch/arm/mach-highbank/clock.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2011 Calxeda, Inc. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>. - */ -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/clk.h> -#include <linux/clkdev.h> - -struct clk { -	unsigned long rate; -}; - -int clk_enable(struct clk *clk) -{ -	return 0; -} - -void clk_disable(struct clk *clk) -{} - -unsigned long clk_get_rate(struct clk *clk) -{ -	return clk->rate; -} - -long clk_round_rate(struct clk *clk, unsigned long rate) -{ -	return clk->rate; -} - -int clk_set_rate(struct clk *clk, unsigned long rate) -{ -	return 0; -} - -static struct clk eclk = { .rate = 200000000 }; -static struct clk pclk = { .rate = 150000000 }; - -static struct clk_lookup lookups[] = { -	{ .clk = &pclk, .con_id = "apb_pclk", }, -	{ .clk = &pclk, .dev_id = "sp804", }, -	{ .clk = &eclk, .dev_id = "ffe0e000.sdhci", }, -	{ .clk = &pclk, .dev_id = "fff36000.serial", }, -}; - -void __init highbank_clocks_init(void) -{ -	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); -} diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 8777612b1a4..d75b0a78d88 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c @@ -105,6 +105,11 @@ static void __init highbank_init_irq(void)  #endif  } +static struct clk_lookup lookup = { +	.dev_id = "sp804", +	.con_id = NULL, +}; +  static void __init highbank_timer_init(void)  {  	int irq; @@ -122,6 +127,8 @@ static void __init highbank_timer_init(void)  	irq = irq_of_parse_and_map(np, 0);  	highbank_clocks_init(); +	lookup.clk = of_clk_get(np, 0); +	clkdev_add(&lookup);  	sp804_clocksource_and_sched_clock_init(timer_base + 0x20, "timer1");  	sp804_clockevents_init(timer_base, irq, "timer0"); diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index eff4db5de0d..afd542ad6f9 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -52,6 +52,7 @@ config SOC_IMX25  	select ARCH_MX25  	select COMMON_CLK  	select CPU_ARM926T +	select HAVE_CAN_FLEXCAN if CAN  	select ARCH_MXC_IOMUX_V3  	select MXC_AVIC @@ -73,12 +74,13 @@ config SOC_IMX31  config SOC_IMX35  	bool -	select CPU_V6 +	select CPU_V6K  	select ARCH_MXC_IOMUX_V3  	select COMMON_CLK  	select HAVE_EPIT  	select MXC_AVIC  	select SMP_ON_UP if SMP +	select HAVE_CAN_FLEXCAN if CAN  config SOC_IMX5  	select CPU_V7 @@ -105,6 +107,7 @@ config	SOC_IMX53  	select SOC_IMX5  	select ARCH_MX5  	select ARCH_MX53 +	select HAVE_CAN_FLEXCAN if CAN  if ARCH_IMX_V4_V5 @@ -158,7 +161,6 @@ config MACH_MX25_3DS  	select IMX_HAVE_PLATFORM_IMX2_WDT  	select IMX_HAVE_PLATFORM_IMXDI_RTC  	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_SSI  	select IMX_HAVE_PLATFORM_IMX_FB  	select IMX_HAVE_PLATFORM_IMX_KEYPAD  	select IMX_HAVE_PLATFORM_IMX_UART @@ -380,7 +382,6 @@ config MACH_IMX27IPCAM  config MACH_IMX27_DT  	bool "Support i.MX27 platforms from device tree"  	select SOC_IMX27 -	select USE_OF  	help  	  Include support for Freescale i.MX27 based platforms  	  using the device tree for discovery @@ -557,6 +558,14 @@ config MACH_BUG  	  Include support for BUGBase 1.3 platform. This includes specific  	  configurations for the board and its peripherals. +config MACH_IMX31_DT +	bool "Support i.MX31 platforms from device tree" +	select SOC_IMX31 +	select USE_OF +	help +	  Include support for Freescale i.MX31 based platforms +	  using the device tree for discovery. +  comment "MX35 platforms:"  config MACH_PCM043 @@ -589,6 +598,7 @@ config MACH_MX35_3DS  	select IMX_HAVE_PLATFORM_IPU_CORE  	select IMX_HAVE_PLATFORM_MXC_EHCI  	select IMX_HAVE_PLATFORM_MXC_NAND +	select IMX_HAVE_PLATFORM_MXC_RTC  	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX  	help  	  Include support for MX35PDK platform. This includes specific @@ -663,7 +673,6 @@ comment "i.MX51 machines:"  config MACH_IMX51_DT  	bool "Support i.MX51 platforms from device tree"  	select SOC_IMX51 -	select USE_OF  	select MACH_MX51_BABBAGE  	help  	  Include support for Freescale i.MX51 based platforms @@ -759,7 +768,6 @@ comment "i.MX53 machines:"  config MACH_IMX53_DT  	bool "Support i.MX53 platforms from device tree"  	select SOC_IMX53 -	select USE_OF  	select MACH_MX53_ARD  	select MACH_MX53_EVK  	select MACH_MX53_LOCO @@ -826,13 +834,14 @@ config SOC_IMX6Q  	select COMMON_CLK  	select CPU_V7  	select HAVE_ARM_SCU +	select HAVE_CAN_FLEXCAN if CAN  	select HAVE_IMX_GPC  	select HAVE_IMX_MMDC  	select HAVE_IMX_SRC  	select HAVE_SMP +	select MFD_ANATOP  	select PINCTRL  	select PINCTRL_IMX6Q -	select USE_OF  	help  	  This enables support for Freescale i.MX6 Quad processor. diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index ff29421414f..07f7c226e4c 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -57,6 +57,7 @@ obj-$(CONFIG_MACH_QONG) += mach-qong.o  obj-$(CONFIG_MACH_ARMADILLO5X0) += mach-armadillo5x0.o  obj-$(CONFIG_MACH_KZM_ARM11_01) += mach-kzm_arm11_01.o  obj-$(CONFIG_MACH_BUG) += mach-bug.o +obj-$(CONFIG_MACH_IMX31_DT) += imx31-dt.o  # i.MX35 based machines  obj-$(CONFIG_MACH_PCM043) += mach-pcm043.o diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c index 295cbd7c08d..7aa6313fb16 100644 --- a/arch/arm/mach-imx/clk-imx27.c +++ b/arch/arm/mach-imx/clk-imx27.c @@ -256,7 +256,7 @@ int __init mx27_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[gpio_ipg_gate], "gpio", NULL);  	clk_register_clkdev(clk[brom_ahb_gate], "brom", NULL);  	clk_register_clkdev(clk[ata_ahb_gate], "ata", NULL); -	clk_register_clkdev(clk[rtc_ipg_gate], "rtc", NULL); +	clk_register_clkdev(clk[rtc_ipg_gate], NULL, "mxc_rtc");  	clk_register_clkdev(clk[scc_ipg_gate], "scc", NULL);  	clk_register_clkdev(clk[cpu_div], "cpu", NULL);  	clk_register_clkdev(clk[emi_ahb_gate], "emi_ahb" , NULL); @@ -267,6 +267,8 @@ int __init mx27_clocks_init(unsigned long fref)  	clk_prepare_enable(clk[emi_ahb_gate]); +	imx_print_silicon_rev("i.MX27", mx27_revision()); +  	return 0;  } diff --git a/arch/arm/mach-imx/clk-imx31.c b/arch/arm/mach-imx/clk-imx31.c index c9a06d800f8..8e19e70f90f 100644 --- a/arch/arm/mach-imx/clk-imx31.c +++ b/arch/arm/mach-imx/clk-imx31.c @@ -20,6 +20,7 @@  #include <linux/clkdev.h>  #include <linux/io.h>  #include <linux/err.h> +#include <linux/of.h>  #include <mach/hardware.h>  #include <mach/mx31.h> @@ -123,7 +124,7 @@ int __init mx31_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[cspi3_gate], NULL, "imx31-cspi.2");  	clk_register_clkdev(clk[pwm_gate], "pwm", NULL);  	clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); -	clk_register_clkdev(clk[rtc_gate], "rtc", NULL); +	clk_register_clkdev(clk[rtc_gate], NULL, "mxc_rtc");  	clk_register_clkdev(clk[epit1_gate], "epit", NULL);  	clk_register_clkdev(clk[epit2_gate], "epit", NULL);  	clk_register_clkdev(clk[nfc], NULL, "mxc_nand.0"); @@ -165,7 +166,7 @@ int __init mx31_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[firi_gate], "firi", NULL);  	clk_register_clkdev(clk[ata_gate], NULL, "pata_imx");  	clk_register_clkdev(clk[rtic_gate], "rtic", NULL); -	clk_register_clkdev(clk[rng_gate], "rng", NULL); +	clk_register_clkdev(clk[rng_gate], NULL, "mxc_rnga");  	clk_register_clkdev(clk[sdma_gate], NULL, "imx31-sdma");  	clk_register_clkdev(clk[iim_gate], "iim", NULL); @@ -179,3 +180,21 @@ int __init mx31_clocks_init(unsigned long fref)  	return 0;  } + +#ifdef CONFIG_OF +int __init mx31_clocks_init_dt(void) +{ +	struct device_node *np; +	u32 fref = 26000000; /* default */ + +	for_each_compatible_node(np, NULL, "fixed-clock") { +		if (!of_device_is_compatible(np, "fsl,imx-osc26m")) +			continue; + +		if (!of_property_read_u32(np, "clock-frequency", &fref)) +			break; +	} + +	return mx31_clocks_init(fref); +} +#endif diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c index a2200c77bf7..f6086693ebd 100644 --- a/arch/arm/mach-imx/clk-imx51-imx53.c +++ b/arch/arm/mach-imx/clk-imx51-imx53.c @@ -58,7 +58,7 @@ enum imx5_clks {  	tve_s, uart1_ipg_gate, uart1_per_gate, uart2_ipg_gate,  	uart2_per_gate, uart3_ipg_gate, uart3_per_gate, i2c1_gate, i2c2_gate,  	gpt_ipg_gate, pwm1_ipg_gate, pwm1_hf_gate, pwm2_ipg_gate, pwm2_hf_gate, -	gpt_gate, fec_gate, usboh3_per_gate, esdhc1_ipg_gate, esdhc2_ipg_gate, +	gpt_hf_gate, fec_gate, usboh3_per_gate, esdhc1_ipg_gate, esdhc2_ipg_gate,  	esdhc3_ipg_gate, esdhc4_ipg_gate, ssi1_ipg_gate, ssi2_ipg_gate,  	ssi3_ipg_gate, ecspi1_ipg_gate, ecspi1_per_gate, ecspi2_ipg_gate,  	ecspi2_per_gate, cspi_ipg_gate, sdma_gate, emi_slow_gate, ipu_s, @@ -81,6 +81,7 @@ enum imx5_clks {  	ssi1_root_podf, ssi2_root_pred, ssi2_root_podf, ssi_ext1_pred,  	ssi_ext1_podf, ssi_ext2_pred, ssi_ext2_podf, ssi1_root_gate,  	ssi2_root_gate, ssi3_root_gate, ssi_ext1_gate, ssi_ext2_gate, +	epit1_ipg_gate, epit1_hf_gate, epit2_ipg_gate, epit2_hf_gate,  	clk_max  }; @@ -167,12 +168,12 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk[uart3_per_gate] = imx_clk_gate2("uart3_per_gate", "uart_root", MXC_CCM_CCGR1, 16);  	clk[i2c1_gate] = imx_clk_gate2("i2c1_gate", "per_root", MXC_CCM_CCGR1, 18);  	clk[i2c2_gate] = imx_clk_gate2("i2c2_gate", "per_root", MXC_CCM_CCGR1, 20); -	clk[gpt_ipg_gate] = imx_clk_gate2("gpt_ipg_gate", "ipg", MXC_CCM_CCGR2, 20);  	clk[pwm1_ipg_gate] = imx_clk_gate2("pwm1_ipg_gate", "ipg", MXC_CCM_CCGR2, 10); -	clk[pwm1_hf_gate] = imx_clk_gate2("pwm1_hf_gate", "ipg", MXC_CCM_CCGR2, 12); +	clk[pwm1_hf_gate] = imx_clk_gate2("pwm1_hf_gate", "per_root", MXC_CCM_CCGR2, 12);  	clk[pwm2_ipg_gate] = imx_clk_gate2("pwm2_ipg_gate", "ipg", MXC_CCM_CCGR2, 14); -	clk[pwm2_hf_gate] = imx_clk_gate2("pwm2_hf_gate", "ipg", MXC_CCM_CCGR2, 16); -	clk[gpt_gate] = imx_clk_gate2("gpt_gate", "per_root", MXC_CCM_CCGR2, 18); +	clk[pwm2_hf_gate] = imx_clk_gate2("pwm2_hf_gate", "per_root", MXC_CCM_CCGR2, 16); +	clk[gpt_ipg_gate] = imx_clk_gate2("gpt_ipg_gate", "ipg", MXC_CCM_CCGR2, 18); +	clk[gpt_hf_gate] = imx_clk_gate2("gpt_hf_gate", "per_root", MXC_CCM_CCGR2, 20);  	clk[fec_gate] = imx_clk_gate2("fec_gate", "ipg", MXC_CCM_CCGR2, 24);  	clk[usboh3_gate] = imx_clk_gate2("usboh3_gate", "ipg", MXC_CCM_CCGR2, 26);  	clk[usboh3_per_gate] = imx_clk_gate2("usboh3_per_gate", "usboh3_podf", MXC_CCM_CCGR2, 28); @@ -226,13 +227,17 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk[ssi3_root_gate] = imx_clk_gate2("ssi3_root_gate", "ssi3_root_sel", MXC_CCM_CCGR3, 26);  	clk[ssi_ext1_gate] = imx_clk_gate2("ssi_ext1_gate", "ssi_ext1_com_sel", MXC_CCM_CCGR3, 28);  	clk[ssi_ext2_gate] = imx_clk_gate2("ssi_ext2_gate", "ssi_ext2_com_sel", MXC_CCM_CCGR3, 30); +	clk[epit1_ipg_gate] = imx_clk_gate2("epit1_ipg_gate", "ipg", MXC_CCM_CCGR2, 2); +	clk[epit1_hf_gate] = imx_clk_gate2("epit1_hf_gate", "per_root", MXC_CCM_CCGR2, 4); +	clk[epit2_ipg_gate] = imx_clk_gate2("epit2_ipg_gate", "ipg", MXC_CCM_CCGR2, 6); +	clk[epit2_hf_gate] = imx_clk_gate2("epit2_hf_gate", "per_root", MXC_CCM_CCGR2, 8);  	for (i = 0; i < ARRAY_SIZE(clk); i++)  		if (IS_ERR(clk[i]))  			pr_err("i.MX5 clk %d: register failed with %ld\n",  				i, PTR_ERR(clk[i])); -	clk_register_clkdev(clk[gpt_gate], "per", "imx-gpt.0"); +	clk_register_clkdev(clk[gpt_hf_gate], "per", "imx-gpt.0");  	clk_register_clkdev(clk[gpt_ipg_gate], "ipg", "imx-gpt.0");  	clk_register_clkdev(clk[uart1_per_gate], "per", "imx21-uart.0");  	clk_register_clkdev(clk[uart1_ipg_gate], "ipg", "imx21-uart.0"); @@ -248,7 +253,7 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk_register_clkdev(clk[ecspi1_ipg_gate], "ipg", "imx51-ecspi.0");  	clk_register_clkdev(clk[ecspi2_per_gate], "per", "imx51-ecspi.1");  	clk_register_clkdev(clk[ecspi2_ipg_gate], "ipg", "imx51-ecspi.1"); -	clk_register_clkdev(clk[cspi_ipg_gate], NULL, "imx51-cspi.0"); +	clk_register_clkdev(clk[cspi_ipg_gate], NULL, "imx35-cspi.2");  	clk_register_clkdev(clk[pwm1_ipg_gate], "pwm", "mxc_pwm.0");  	clk_register_clkdev(clk[pwm2_ipg_gate], "pwm", "mxc_pwm.1");  	clk_register_clkdev(clk[i2c1_gate], NULL, "imx-i2c.0"); @@ -279,6 +284,11 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk_register_clkdev(clk[dummy], NULL, "imx-keypad");  	clk_register_clkdev(clk[tve_gate], NULL, "imx-tve.0");  	clk_register_clkdev(clk[ipu_di1_gate], "di1", "imx-tve.0"); +	clk_register_clkdev(clk[gpc_dvfs], "gpc_dvfs", NULL); +	clk_register_clkdev(clk[epit1_ipg_gate], "ipg", "imx-epit.0"); +	clk_register_clkdev(clk[epit1_hf_gate], "per", "imx-epit.0"); +	clk_register_clkdev(clk[epit2_ipg_gate], "ipg", "imx-epit.1"); +	clk_register_clkdev(clk[epit2_hf_gate], "per", "imx-epit.1");  	/* Set SDHC parents to be PLL2 */  	clk_set_parent(clk[esdhc_a_sel], clk[pll2_sw]); @@ -336,7 +346,6 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  	clk_register_clkdev(clk[mx51_mipi], "mipi_hsp", NULL);  	clk_register_clkdev(clk[vpu_gate], NULL, "imx51-vpu.0");  	clk_register_clkdev(clk[fec_gate], NULL, "imx27-fec.0"); -	clk_register_clkdev(clk[gpc_dvfs], "gpc_dvfs", NULL);  	clk_register_clkdev(clk[ipu_gate], "bus", "imx51-ipu");  	clk_register_clkdev(clk[ipu_di0_gate], "di0", "imx51-ipu");  	clk_register_clkdev(clk[ipu_di1_gate], "di1", "imx51-ipu"); diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index e1a17ac7b3b..ea89520b6e2 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c @@ -147,12 +147,12 @@ enum mx6q_clks {  	esai, gpt_ipg, gpt_ipg_per, gpu2d_core, gpu3d_core, hdmi_iahb,  	hdmi_isfr, i2c1, i2c2, i2c3, iim, enfc, ipu1, ipu1_di0, ipu1_di1, ipu2,  	ipu2_di0, ldb_di0, ldb_di1, ipu2_di1, hsi_tx, mlb, mmdc_ch0_axi, -	mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, +	mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, per1_bch,  	gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1,  	ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3,  	usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg,  	pll4_audio, pll5_video, pll6_mlb, pll7_usb_host, pll8_enet, ssi1_ipg, -	ssi2_ipg, ssi3_ipg, rom, +	ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2,  	clk_max  }; @@ -198,6 +198,9 @@ int __init mx6q_clocks_init(void)  	clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB,	"pll7_usb_host","osc", base + 0x20, 0x2000,   0x3);  	clk[pll8_enet]     = imx_clk_pllv3(IMX_PLLV3_ENET,	"pll8_enet",	"osc", base + 0xe0, 0x182000, 0x3); +	clk[usbphy1] = imx_clk_gate("usbphy1", "pll3_usb_otg", base + 0x10, 6); +	clk[usbphy2] = imx_clk_gate("usbphy2", "pll7_usb_host", base + 0x20, 6); +  	/*                                name              parent_name        reg       idx */  	clk[pll2_pfd0_352m] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus",     base + 0x100, 0);  	clk[pll2_pfd1_594m] = imx_clk_pfd("pll2_pfd1_594m", "pll2_bus",     base + 0x100, 1); @@ -318,7 +321,7 @@ int __init mx6q_clocks_init(void)  	clk[ahb]               = imx_clk_busy_divider("ahb",               "periph",      base + 0x14, 10,  3,   base + 0x48, 1);  	/*                                name             parent_name          reg         shift */ -	clk[apbh_dma]     = imx_clk_gate2("apbh_dma",      "ahb",               base + 0x68, 4); +	clk[apbh_dma]     = imx_clk_gate2("apbh_dma",      "usdhc3",            base + 0x68, 4);  	clk[asrc]         = imx_clk_gate2("asrc",          "asrc_podf",         base + 0x68, 6);  	clk[can1_ipg]     = imx_clk_gate2("can1_ipg",      "ipg",               base + 0x68, 14);  	clk[can1_serial]  = imx_clk_gate2("can1_serial",   "can_root",          base + 0x68, 16); @@ -357,6 +360,7 @@ int __init mx6q_clocks_init(void)  	clk[ocram]        = imx_clk_gate2("ocram",         "ahb",               base + 0x74, 28);  	clk[openvg_axi]   = imx_clk_gate2("openvg_axi",    "axi",               base + 0x74, 30);  	clk[pcie_axi]     = imx_clk_gate2("pcie_axi",      "pcie_axi_sel",      base + 0x78, 0); +	clk[per1_bch]     = imx_clk_gate2("per1_bch",      "usdhc3",            base + 0x78, 12);  	clk[pwm1]         = imx_clk_gate2("pwm1",          "ipg_per",           base + 0x78, 16);  	clk[pwm2]         = imx_clk_gate2("pwm2",          "ipg_per",           base + 0x78, 18);  	clk[pwm3]         = imx_clk_gate2("pwm3",          "ipg_per",           base + 0x78, 20); @@ -388,12 +392,21 @@ int __init mx6q_clocks_init(void)  			pr_err("i.MX6q clk %d: register failed with %ld\n",  				i, PTR_ERR(clk[i])); -	clk_register_clkdev(clk[mmdc_ch0_axi], NULL, "mmdc_ch0_axi"); -	clk_register_clkdev(clk[mmdc_ch1_axi], NULL, "mmdc_ch1_axi");  	clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0");  	clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");  	clk_register_clkdev(clk[twd], NULL, "smp_twd"); -	clk_register_clkdev(clk[usboh3], NULL, "usboh3"); +	clk_register_clkdev(clk[apbh_dma], NULL, "110000.dma-apbh"); +	clk_register_clkdev(clk[per1_bch], "per1_bch", "112000.gpmi-nand"); +	clk_register_clkdev(clk[gpmi_bch_apb], "gpmi_bch_apb", "112000.gpmi-nand"); +	clk_register_clkdev(clk[gpmi_bch], "gpmi_bch", "112000.gpmi-nand"); +	clk_register_clkdev(clk[gpmi_apb], "gpmi_apb", "112000.gpmi-nand"); +	clk_register_clkdev(clk[gpmi_io], "gpmi_io", "112000.gpmi-nand"); +	clk_register_clkdev(clk[usboh3], NULL, "2184000.usb"); +	clk_register_clkdev(clk[usboh3], NULL, "2184200.usb"); +	clk_register_clkdev(clk[usboh3], NULL, "2184400.usb"); +	clk_register_clkdev(clk[usboh3], NULL, "2184600.usb"); +	clk_register_clkdev(clk[usbphy1], NULL, "20c9000.usbphy"); +	clk_register_clkdev(clk[usbphy2], NULL, "20ca000.usbphy");  	clk_register_clkdev(clk[uart_serial], "per", "2020000.serial");  	clk_register_clkdev(clk[uart_ipg], "ipg", "2020000.serial");  	clk_register_clkdev(clk[uart_serial], "per", "21e8000.serial"); diff --git a/arch/arm/mach-imx/devices-imx21.h b/arch/arm/mach-imx/devices-imx21.h index 2628e0c474d..93ece55f75d 100644 --- a/arch/arm/mach-imx/devices-imx21.h +++ b/arch/arm/mach-imx/devices-imx21.h @@ -14,7 +14,7 @@ extern const struct imx_imx21_hcd_data imx21_imx21_hcd_data;  	imx_add_imx21_hcd(&imx21_imx21_hcd_data, pdata)  extern const struct imx_imx2_wdt_data imx21_imx2_wdt_data; -#define imx21_add_imx2_wdt(pdata)	\ +#define imx21_add_imx2_wdt()	\  	imx_add_imx2_wdt(&imx21_imx2_wdt_data)  extern const struct imx_imx_fb_data imx21_imx_fb_data; @@ -50,7 +50,7 @@ extern const struct imx_mxc_nand_data imx21_mxc_nand_data;  	imx_add_mxc_nand(&imx21_mxc_nand_data, pdata)  extern const struct imx_mxc_w1_data imx21_mxc_w1_data; -#define imx21_add_mxc_w1(pdata)	\ +#define imx21_add_mxc_w1()	\  	imx_add_mxc_w1(&imx21_mxc_w1_data)  extern const struct imx_spi_imx_data imx21_cspi_data[]; diff --git a/arch/arm/mach-imx/devices-imx25.h b/arch/arm/mach-imx/devices-imx25.h index efa0761c508..f8e03dd1f11 100644 --- a/arch/arm/mach-imx/devices-imx25.h +++ b/arch/arm/mach-imx/devices-imx25.h @@ -24,11 +24,11 @@ extern const struct imx_fsl_usb2_udc_data imx25_fsl_usb2_udc_data;  	imx_add_fsl_usb2_udc(&imx25_fsl_usb2_udc_data, pdata)  extern struct imx_imxdi_rtc_data imx25_imxdi_rtc_data; -#define imx25_add_imxdi_rtc(pdata)	\ +#define imx25_add_imxdi_rtc()	\  	imx_add_imxdi_rtc(&imx25_imxdi_rtc_data)  extern const struct imx_imx2_wdt_data imx25_imx2_wdt_data; -#define imx25_add_imx2_wdt(pdata)	\ +#define imx25_add_imx2_wdt()	\  	imx_add_imx2_wdt(&imx25_imx2_wdt_data)  extern const struct imx_imx_fb_data imx25_imx_fb_data; diff --git a/arch/arm/mach-imx/devices-imx27.h b/arch/arm/mach-imx/devices-imx27.h index 28537a5d904..436c5720fe6 100644 --- a/arch/arm/mach-imx/devices-imx27.h +++ b/arch/arm/mach-imx/devices-imx27.h @@ -18,7 +18,7 @@ extern const struct imx_fsl_usb2_udc_data imx27_fsl_usb2_udc_data;  	imx_add_fsl_usb2_udc(&imx27_fsl_usb2_udc_data, pdata)  extern const struct imx_imx2_wdt_data imx27_imx2_wdt_data; -#define imx27_add_imx2_wdt(pdata)	\ +#define imx27_add_imx2_wdt()	\  	imx_add_imx2_wdt(&imx27_imx2_wdt_data)  extern const struct imx_imx_fb_data imx27_imx_fb_data; @@ -50,7 +50,7 @@ extern const struct imx_imx_uart_1irq_data imx27_imx_uart_data[];  extern const struct imx_mx2_camera_data imx27_mx2_camera_data;  #define imx27_add_mx2_camera(pdata)	\  	imx_add_mx2_camera(&imx27_mx2_camera_data, pdata) -#define imx27_add_mx2_emmaprp(pdata)	\ +#define imx27_add_mx2_emmaprp()	\  	imx_add_mx2_emmaprp(&imx27_mx2_camera_data)  extern const struct imx_mxc_ehci_data imx27_mxc_ehci_otg_data; @@ -69,7 +69,7 @@ extern const struct imx_mxc_nand_data imx27_mxc_nand_data;  	imx_add_mxc_nand(&imx27_mxc_nand_data, pdata)  extern const struct imx_mxc_w1_data imx27_mxc_w1_data; -#define imx27_add_mxc_w1(pdata)	\ +#define imx27_add_mxc_w1()	\  	imx_add_mxc_w1(&imx27_mxc_w1_data)  extern const struct imx_spi_imx_data imx27_cspi_data[]; diff --git a/arch/arm/mach-imx/devices-imx31.h b/arch/arm/mach-imx/devices-imx31.h index 488e241a6db..8b2ceb45bb8 100644 --- a/arch/arm/mach-imx/devices-imx31.h +++ b/arch/arm/mach-imx/devices-imx31.h @@ -14,7 +14,7 @@ extern const struct imx_fsl_usb2_udc_data imx31_fsl_usb2_udc_data;  	imx_add_fsl_usb2_udc(&imx31_fsl_usb2_udc_data, pdata)  extern const struct imx_imx2_wdt_data imx31_imx2_wdt_data; -#define imx31_add_imx2_wdt(pdata)       \ +#define imx31_add_imx2_wdt()       \  	imx_add_imx2_wdt(&imx31_imx2_wdt_data)  extern const struct imx_imx_i2c_data imx31_imx_i2c_data[]; @@ -42,8 +42,8 @@ extern const struct imx_imx_uart_1irq_data imx31_imx_uart_data[];  #define imx31_add_imx_uart4(pdata)	imx31_add_imx_uart(4, pdata)  extern const struct imx_ipu_core_data imx31_ipu_core_data; -#define imx31_add_ipu_core(pdata)	\ -	imx_add_ipu_core(&imx31_ipu_core_data, pdata) +#define imx31_add_ipu_core()		\ +	imx_add_ipu_core(&imx31_ipu_core_data)  #define imx31_alloc_mx3_camera(pdata)	\  	imx_alloc_mx3_camera(&imx31_ipu_core_data, pdata)  #define imx31_add_mx3_sdc_fb(pdata)	\ @@ -65,11 +65,11 @@ extern const struct imx_mxc_nand_data imx31_mxc_nand_data;  	imx_add_mxc_nand(&imx31_mxc_nand_data, pdata)  extern const struct imx_mxc_rtc_data imx31_mxc_rtc_data; -#define imx31_add_mxc_rtc(pdata)	\ +#define imx31_add_mxc_rtc()	\  	imx_add_mxc_rtc(&imx31_mxc_rtc_data)  extern const struct imx_mxc_w1_data imx31_mxc_w1_data; -#define imx31_add_mxc_w1(pdata)	\ +#define imx31_add_mxc_w1()	\  	imx_add_mxc_w1(&imx31_mxc_w1_data)  extern const struct imx_spi_imx_data imx31_cspi_data[]; diff --git a/arch/arm/mach-imx/devices-imx35.h b/arch/arm/mach-imx/devices-imx35.h index 7b99ef0bb50..c3e9f206ac2 100644 --- a/arch/arm/mach-imx/devices-imx35.h +++ b/arch/arm/mach-imx/devices-imx35.h @@ -24,7 +24,7 @@ extern const struct imx_flexcan_data imx35_flexcan_data[];  #define imx35_add_flexcan1(pdata)	imx35_add_flexcan(1, pdata)  extern const struct imx_imx2_wdt_data imx35_imx2_wdt_data; -#define imx35_add_imx2_wdt(pdata)       \ +#define imx35_add_imx2_wdt()       \  	imx_add_imx2_wdt(&imx35_imx2_wdt_data)  extern const struct imx_imx_i2c_data imx35_imx_i2c_data[]; @@ -50,8 +50,8 @@ extern const struct imx_imx_uart_1irq_data imx35_imx_uart_data[];  #define imx35_add_imx_uart2(pdata)	imx35_add_imx_uart(2, pdata)  extern const struct imx_ipu_core_data imx35_ipu_core_data; -#define imx35_add_ipu_core(pdata)	\ -	imx_add_ipu_core(&imx35_ipu_core_data, pdata) +#define imx35_add_ipu_core()		\ +	imx_add_ipu_core(&imx35_ipu_core_data)  #define imx35_alloc_mx3_camera(pdata)	\  	imx_alloc_mx3_camera(&imx35_ipu_core_data, pdata)  #define imx35_add_mx3_sdc_fb(pdata)	\ @@ -68,8 +68,12 @@ extern const struct imx_mxc_nand_data imx35_mxc_nand_data;  #define imx35_add_mxc_nand(pdata)	\  	imx_add_mxc_nand(&imx35_mxc_nand_data, pdata) +extern const struct imx_mxc_rtc_data imx35_mxc_rtc_data; +#define imx35_add_mxc_rtc()	\ +	imx_add_mxc_rtc(&imx35_mxc_rtc_data) +  extern const struct imx_mxc_w1_data imx35_mxc_w1_data; -#define imx35_add_mxc_w1(pdata)	\ +#define imx35_add_mxc_w1()	\  	imx_add_mxc_w1(&imx35_mxc_w1_data)  extern const struct imx_sdhci_esdhc_imx_data imx35_sdhci_esdhc_imx_data[]; diff --git a/arch/arm/mach-imx/devices-imx51.h b/arch/arm/mach-imx/devices-imx51.h index af488bc0e22..9f171872519 100644 --- a/arch/arm/mach-imx/devices-imx51.h +++ b/arch/arm/mach-imx/devices-imx51.h @@ -55,7 +55,7 @@ extern const struct imx_spi_imx_data imx51_ecspi_data[];  	imx_add_spi_imx(&imx51_ecspi_data[id], pdata)  extern const struct imx_imx2_wdt_data imx51_imx2_wdt_data[]; -#define imx51_add_imx2_wdt(id, pdata)	\ +#define imx51_add_imx2_wdt(id)	\  	imx_add_imx2_wdt(&imx51_imx2_wdt_data[id])  extern const struct imx_mxc_pwm_data imx51_mxc_pwm_data[]; diff --git a/arch/arm/mach-imx/devices-imx53.h b/arch/arm/mach-imx/devices-imx53.h index 6e1e5d1f8c3..77e0db96c44 100644 --- a/arch/arm/mach-imx/devices-imx53.h +++ b/arch/arm/mach-imx/devices-imx53.h @@ -30,7 +30,7 @@ extern const struct imx_spi_imx_data imx53_ecspi_data[];  	imx_add_spi_imx(&imx53_ecspi_data[id], pdata)  extern const struct imx_imx2_wdt_data imx53_imx2_wdt_data[]; -#define imx53_add_imx2_wdt(id, pdata)	\ +#define imx53_add_imx2_wdt(id)	\  	imx_add_imx2_wdt(&imx53_imx2_wdt_data[id])  extern const struct imx_imx_ssi_data imx53_imx_ssi_data[]; diff --git a/arch/arm/mach-imx/ehci-imx25.c b/arch/arm/mach-imx/ehci-imx25.c index 865daf0b09e..05bb41d9972 100644 --- a/arch/arm/mach-imx/ehci-imx25.c +++ b/arch/arm/mach-imx/ehci-imx25.c @@ -24,14 +24,18 @@  #define MX25_OTG_SIC_SHIFT	29  #define MX25_OTG_SIC_MASK	(0x3 << MX25_OTG_SIC_SHIFT)  #define MX25_OTG_PM_BIT		(1 << 24) +#define MX25_OTG_PP_BIT		(1 << 11) +#define MX25_OTG_OCPOL_BIT	(1 << 3)  #define MX25_H1_SIC_SHIFT	21  #define MX25_H1_SIC_MASK	(0x3 << MX25_H1_SIC_SHIFT) +#define MX25_H1_PP_BIT		(1 << 18)  #define MX25_H1_PM_BIT		(1 << 8)  #define MX25_H1_IPPUE_UP_BIT	(1 << 7)  #define MX25_H1_IPPUE_DOWN_BIT	(1 << 6)  #define MX25_H1_TLL_BIT		(1 << 5)  #define MX25_H1_USBTE_BIT	(1 << 4) +#define MX25_H1_OCPOL_BIT	(1 << 2)  int mx25_initialize_usb_hw(int port, unsigned int flags)  { @@ -41,21 +45,35 @@ int mx25_initialize_usb_hw(int port, unsigned int flags)  	switch (port) {  	case 0:	/* OTG port */ -		v &= ~(MX25_OTG_SIC_MASK | MX25_OTG_PM_BIT); +		v &= ~(MX25_OTG_SIC_MASK | MX25_OTG_PM_BIT | MX25_OTG_PP_BIT | +			MX25_OTG_OCPOL_BIT);  		v |= (flags & MXC_EHCI_INTERFACE_MASK) << MX25_OTG_SIC_SHIFT;  		if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))  			v |= MX25_OTG_PM_BIT; +		if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH) +			v |= MX25_OTG_PP_BIT; + +		if (!(flags & MXC_EHCI_OC_PIN_ACTIVE_LOW)) +			v |= MX25_OTG_OCPOL_BIT; +  		break;  	case 1: /* H1 port */ -		v &= ~(MX25_H1_SIC_MASK | MX25_H1_PM_BIT | MX25_H1_TLL_BIT | -			MX25_H1_USBTE_BIT | MX25_H1_IPPUE_DOWN_BIT | MX25_H1_IPPUE_UP_BIT); +		v &= ~(MX25_H1_SIC_MASK | MX25_H1_PM_BIT | MX25_H1_PP_BIT | +			MX25_H1_OCPOL_BIT | MX25_H1_TLL_BIT | MX25_H1_USBTE_BIT | +			MX25_H1_IPPUE_DOWN_BIT | MX25_H1_IPPUE_UP_BIT);  		v |= (flags & MXC_EHCI_INTERFACE_MASK) << MX25_H1_SIC_SHIFT;  		if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))  			v |= MX25_H1_PM_BIT; +		if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH) +			v |= MX25_H1_PP_BIT; + +		if (!(flags & MXC_EHCI_OC_PIN_ACTIVE_LOW)) +			v |= MX25_H1_OCPOL_BIT; +  		if (!(flags & MXC_EHCI_TTL_ENABLED))  			v |= MX25_H1_TLL_BIT; diff --git a/arch/arm/mach-imx/ehci-imx35.c b/arch/arm/mach-imx/ehci-imx35.c index 001ec3971f5..73574c30cf5 100644 --- a/arch/arm/mach-imx/ehci-imx35.c +++ b/arch/arm/mach-imx/ehci-imx35.c @@ -24,14 +24,18 @@  #define MX35_OTG_SIC_SHIFT	29  #define MX35_OTG_SIC_MASK	(0x3 << MX35_OTG_SIC_SHIFT)  #define MX35_OTG_PM_BIT		(1 << 24) +#define MX35_OTG_PP_BIT		(1 << 11) +#define MX35_OTG_OCPOL_BIT	(1 << 3)  #define MX35_H1_SIC_SHIFT	21  #define MX35_H1_SIC_MASK	(0x3 << MX35_H1_SIC_SHIFT) +#define MX35_H1_PP_BIT		(1 << 18)  #define MX35_H1_PM_BIT		(1 << 8)  #define MX35_H1_IPPUE_UP_BIT	(1 << 7)  #define MX35_H1_IPPUE_DOWN_BIT	(1 << 6)  #define MX35_H1_TLL_BIT		(1 << 5)  #define MX35_H1_USBTE_BIT	(1 << 4) +#define MX35_H1_OCPOL_BIT	(1 << 2)  int mx35_initialize_usb_hw(int port, unsigned int flags)  { @@ -41,21 +45,35 @@ int mx35_initialize_usb_hw(int port, unsigned int flags)  	switch (port) {  	case 0:	/* OTG port */ -		v &= ~(MX35_OTG_SIC_MASK | MX35_OTG_PM_BIT); +		v &= ~(MX35_OTG_SIC_MASK | MX35_OTG_PM_BIT | MX35_OTG_PP_BIT | +			MX35_OTG_OCPOL_BIT);  		v |= (flags & MXC_EHCI_INTERFACE_MASK) << MX35_OTG_SIC_SHIFT;  		if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))  			v |= MX35_OTG_PM_BIT; +		if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH) +			v |= MX35_OTG_PP_BIT; + +		if (!(flags & MXC_EHCI_OC_PIN_ACTIVE_LOW)) +			v |= MX35_OTG_OCPOL_BIT; +  		break;  	case 1: /* H1 port */ -		v &= ~(MX35_H1_SIC_MASK | MX35_H1_PM_BIT | MX35_H1_TLL_BIT | -			MX35_H1_USBTE_BIT | MX35_H1_IPPUE_DOWN_BIT | MX35_H1_IPPUE_UP_BIT); +		v &= ~(MX35_H1_SIC_MASK | MX35_H1_PM_BIT | MX35_H1_PP_BIT | +			MX35_H1_OCPOL_BIT | MX35_H1_TLL_BIT | MX35_H1_USBTE_BIT | +			MX35_H1_IPPUE_DOWN_BIT | MX35_H1_IPPUE_UP_BIT);  		v |= (flags & MXC_EHCI_INTERFACE_MASK) << MX35_H1_SIC_SHIFT;  		if (!(flags & MXC_EHCI_POWER_PINS_ENABLED))  			v |= MX35_H1_PM_BIT; +		if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH) +			v |= MX35_H1_PP_BIT; + +		if (!(flags & MXC_EHCI_OC_PIN_ACTIVE_LOW)) +			v |= MX35_H1_OCPOL_BIT; +  		if (!(flags & MXC_EHCI_TTL_ENABLED))  			v |= MX35_H1_TLL_BIT; diff --git a/arch/arm/mach-imx/ehci-imx5.c b/arch/arm/mach-imx/ehci-imx5.c index c17fa131728..a6a4afb0ad6 100644 --- a/arch/arm/mach-imx/ehci-imx5.c +++ b/arch/arm/mach-imx/ehci-imx5.c @@ -28,11 +28,14 @@  #define MXC_OTG_UCTRL_OPM_BIT		(1 << 24)	/* OTG power mask */  #define MXC_H1_UCTRL_H1UIE_BIT		(1 << 12)	/* Host1 ULPI interrupt enable */  #define MXC_H1_UCTRL_H1WIE_BIT		(1 << 11)	/* HOST1 wakeup intr enable */ -#define MXC_H1_UCTRL_H1PM_BIT		(1 <<  8)		/* HOST1 power mask */ +#define MXC_H1_UCTRL_H1PM_BIT		(1 <<  8)	/* HOST1 power mask */  /* USB_PHY_CTRL_FUNC */ +#define MXC_OTG_PHYCTRL_OC_POL_BIT	(1 << 9)	/* OTG Polarity of Overcurrent */  #define MXC_OTG_PHYCTRL_OC_DIS_BIT	(1 << 8)	/* OTG Disable Overcurrent Event */ +#define MXC_H1_OC_POL_BIT		(1 << 6)	/* UH1 Polarity of Overcurrent */  #define MXC_H1_OC_DIS_BIT		(1 << 5)	/* UH1 Disable Overcurrent Event */ +#define MXC_OTG_PHYCTRL_PWR_POL_BIT	(1 << 3)	/* OTG Power Pin Polarity */  /* USBH2CTRL */  #define MXC_H2_UCTRL_H2UIE_BIT		(1 << 8) @@ -80,13 +83,21 @@ int mx51_initialize_usb_hw(int port, unsigned int flags)  		if (flags & MXC_EHCI_INTERNAL_PHY) {  			v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET); +			if (flags & MXC_EHCI_OC_PIN_ACTIVE_LOW) +				v |= MXC_OTG_PHYCTRL_OC_POL_BIT; +			else +				v &= ~MXC_OTG_PHYCTRL_OC_POL_BIT;  			if (flags & MXC_EHCI_POWER_PINS_ENABLED) { -				/* OC/USBPWR is not used */ -				v |= MXC_OTG_PHYCTRL_OC_DIS_BIT; -			} else {  				/* OC/USBPWR is used */  				v &= ~MXC_OTG_PHYCTRL_OC_DIS_BIT; +			} else { +				/* OC/USBPWR is not used */ +				v |= MXC_OTG_PHYCTRL_OC_DIS_BIT;  			} +			if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH) +				v |= MXC_OTG_PHYCTRL_PWR_POL_BIT; +			else +				v &= ~MXC_OTG_PHYCTRL_PWR_POL_BIT;  			__raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);  			v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET); @@ -95,9 +106,9 @@ int mx51_initialize_usb_hw(int port, unsigned int flags)  			else  				v &= ~MXC_OTG_UCTRL_OWIE_BIT;/* OTG wakeup disable */  			if (flags & MXC_EHCI_POWER_PINS_ENABLED) -				v |= MXC_OTG_UCTRL_OPM_BIT; -			else  				v &= ~MXC_OTG_UCTRL_OPM_BIT; +			else +				v |= MXC_OTG_UCTRL_OPM_BIT;  			__raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET);  		}  		break; @@ -113,12 +124,16 @@ int mx51_initialize_usb_hw(int port, unsigned int flags)  		}  		if (flags & MXC_EHCI_POWER_PINS_ENABLED) -			v &= ~MXC_H1_UCTRL_H1PM_BIT; /* HOST1 power mask used*/ +			v &= ~MXC_H1_UCTRL_H1PM_BIT; /* HOST1 power mask unused*/  		else  			v |= MXC_H1_UCTRL_H1PM_BIT; /* HOST1 power mask used*/  		__raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET);  		v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET); +		if (flags & MXC_EHCI_OC_PIN_ACTIVE_LOW) +			v |= MXC_H1_OC_POL_BIT; +		else +			v &= ~MXC_H1_OC_POL_BIT;  		if (flags & MXC_EHCI_POWER_PINS_ENABLED)  			v &= ~MXC_H1_OC_DIS_BIT; /* OC is used */  		else @@ -142,7 +157,7 @@ int mx51_initialize_usb_hw(int port, unsigned int flags)  		}  		if (flags & MXC_EHCI_POWER_PINS_ENABLED) -			v &= ~MXC_H2_UCTRL_H2PM_BIT; /* HOST2 power mask used*/ +			v &= ~MXC_H2_UCTRL_H2PM_BIT; /* HOST2 power mask unused*/  		else  			v |= MXC_H2_UCTRL_H2PM_BIT; /* HOST2 power mask used*/  		__raw_writel(v, usbother_base + MXC_USBH2CTRL_OFFSET); diff --git a/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c b/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c index b46cab0ced5..fd3177f9e79 100644 --- a/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c @@ -266,7 +266,7 @@ static struct spi_board_info __maybe_unused  		.bus_num	= 0,  		.chip_select	= 0,  		.max_speed_hz	= 1500000, -		.irq		= IRQ_GPIOD(25), +		/* irq number is run-time assigned */  		.platform_data	= &ads7846_config,  		.mode           = SPI_MODE_2,  	}, @@ -329,6 +329,7 @@ void __init eukrea_mbimx27_baseboard_init(void)  	/* SPI_CS0 init */  	mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT);  	imx27_add_spi_imx0(&eukrea_mbimx27_spi0_data); +	eukrea_mbimx27_spi_board_info[0].irq = gpio_to_irq(IMX_GPIO_NR(4, 25));  	spi_register_board_info(eukrea_mbimx27_spi_board_info,  			ARRAY_SIZE(eukrea_mbimx27_spi_board_info)); diff --git a/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c b/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c index 557f6c48605..6e9dd12a696 100644 --- a/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c @@ -95,10 +95,6 @@ static const struct fb_videomode fb_modedb[] = {  	},  }; -static const struct ipu_platform_data mx3_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct mx3fb_platform_data mx3fb_pdata __initdata = {  	.name		= "CMO-QVGA",  	.mode		= fb_modedb, @@ -287,7 +283,7 @@ void __init eukrea_mbimxsd35_baseboard_init(void)  		printk(KERN_ERR "error setting mbimxsd pads !\n");  	imx35_add_imx_uart1(&uart_pdata); -	imx35_add_ipu_core(&mx3_ipu_data); +	imx35_add_ipu_core();  	imx35_add_mx3_sdc_fb(&mx3fb_pdata);  	imx35_add_imx_ssi(0, &eukrea_mbimxsd_ssi_pdata); diff --git a/arch/arm/mach-imx/imx27-dt.c b/arch/arm/mach-imx/imx27-dt.c index eee0cc8d92a..e80d5235dac 100644 --- a/arch/arm/mach-imx/imx27-dt.c +++ b/arch/arm/mach-imx/imx27-dt.c @@ -10,7 +10,6 @@   */  #include <linux/irq.h> -#include <linux/irqdomain.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <asm/mach/arch.h> @@ -33,35 +32,8 @@ static const struct of_dev_auxdata imx27_auxdata_lookup[] __initconst = {  	{ /* sentinel */ }  }; -static int __init imx27_avic_add_irq_domain(struct device_node *np, -				struct device_node *interrupt_parent) -{ -	irq_domain_add_legacy(np, 64, 0, 0, &irq_domain_simple_ops, NULL); -	return 0; -} - -static int __init imx27_gpio_add_irq_domain(struct device_node *np, -				struct device_node *interrupt_parent) -{ -	static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS; - -	gpio_irq_base -= 32; -	irq_domain_add_legacy(np, 32, gpio_irq_base, 0, &irq_domain_simple_ops, -				NULL); - -	return 0; -} - -static const struct of_device_id imx27_irq_match[] __initconst = { -	{ .compatible = "fsl,imx27-avic", .data = imx27_avic_add_irq_domain, }, -	{ .compatible = "fsl,imx27-gpio", .data = imx27_gpio_add_irq_domain, }, -	{ /* sentinel */ } -}; -  static void __init imx27_dt_init(void)  { -	of_irq_init(imx27_irq_match); -  	of_platform_populate(NULL, of_default_bus_match_table,  			     imx27_auxdata_lookup, NULL);  } @@ -75,7 +47,7 @@ static struct sys_timer imx27_timer = {  	.init = imx27_timer_init,  }; -static const char *imx27_dt_board_compat[] __initdata = { +static const char * const imx27_dt_board_compat[] __initconst = {  	"fsl,imx27",  	NULL  }; diff --git a/arch/arm/mach-imx/imx31-dt.c b/arch/arm/mach-imx/imx31-dt.c new file mode 100644 index 00000000000..a68ba207b2b --- /dev/null +++ b/arch/arm/mach-imx/imx31-dt.c @@ -0,0 +1,63 @@ +/* + * Copyright 2012 Sascha Hauer, Pengutronix + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/irq.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> +#include <mach/common.h> +#include <mach/mx31.h> + +static const struct of_dev_auxdata imx31_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART1_BASE_ADDR, +			"imx21-uart.0", NULL), +	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART2_BASE_ADDR, +			"imx21-uart.1", NULL), +	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART3_BASE_ADDR, +			"imx21-uart.2", NULL), +	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART4_BASE_ADDR, +			"imx21-uart.3", NULL), +	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART5_BASE_ADDR, +			"imx21-uart.4", NULL), +	{ /* sentinel */ } +}; + +static void __init imx31_dt_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, +			     imx31_auxdata_lookup, NULL); +} + +static void __init imx31_timer_init(void) +{ +	mx31_clocks_init_dt(); +} + +static struct sys_timer imx31_timer = { +	.init = imx31_timer_init, +}; + +static const char *imx31_dt_board_compat[] __initdata = { +	"fsl,imx31", +	NULL +}; + +DT_MACHINE_START(IMX31_DT, "Freescale i.MX31 (Device Tree Support)") +	.map_io		= mx31_map_io, +	.init_early	= imx31_init_early, +	.init_irq	= mx31_init_irq, +	.handle_irq	= imx31_handle_irq, +	.timer		= &imx31_timer, +	.init_machine	= imx31_dt_init, +	.dt_compat	= imx31_dt_board_compat, +	.restart	= mxc_restart, +MACHINE_END diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index 18e78dba429..d4067fe3635 100644 --- a/arch/arm/mach-imx/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c @@ -11,7 +11,6 @@   */  #include <linux/irq.h> -#include <linux/irqdomain.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/pinctrl/machine.h> @@ -45,30 +44,6 @@ static const struct of_dev_auxdata imx51_auxdata_lookup[] __initconst = {  	{ /* sentinel */ }  }; -static int __init imx51_tzic_add_irq_domain(struct device_node *np, -				struct device_node *interrupt_parent) -{ -	irq_domain_add_legacy(np, 128, 0, 0, &irq_domain_simple_ops, NULL); -	return 0; -} - -static int __init imx51_gpio_add_irq_domain(struct device_node *np, -				struct device_node *interrupt_parent) -{ -	static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS; - -	gpio_irq_base -= 32; -	irq_domain_add_legacy(np, 32, gpio_irq_base, 0, &irq_domain_simple_ops, NULL); - -	return 0; -} - -static const struct of_device_id imx51_irq_match[] __initconst = { -	{ .compatible = "fsl,imx51-tzic", .data = imx51_tzic_add_irq_domain, }, -	{ .compatible = "fsl,imx51-gpio", .data = imx51_gpio_add_irq_domain, }, -	{ /* sentinel */ } -}; -  static const struct of_device_id imx51_iomuxc_of_match[] __initconst = {  	{ .compatible = "fsl,imx51-iomuxc-babbage", .data = imx51_babbage_common_init, },  	{ /* sentinel */ } @@ -80,8 +55,6 @@ static void __init imx51_dt_init(void)  	const struct of_device_id *of_id;  	void (*func)(void); -	of_irq_init(imx51_irq_match); -  	pinctrl_provide_dummies();  	node = of_find_matching_node(NULL, imx51_iomuxc_of_match); diff --git a/arch/arm/mach-imx/imx53-dt.c b/arch/arm/mach-imx/imx53-dt.c index eb04b6248e4..1b7a2fc3659 100644 --- a/arch/arm/mach-imx/imx53-dt.c +++ b/arch/arm/mach-imx/imx53-dt.c @@ -15,7 +15,6 @@  #include <linux/err.h>  #include <linux/io.h>  #include <linux/irq.h> -#include <linux/irqdomain.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/pinctrl/machine.h> @@ -52,30 +51,6 @@ static const struct of_dev_auxdata imx53_auxdata_lookup[] __initconst = {  	{ /* sentinel */ }  }; -static int __init imx53_tzic_add_irq_domain(struct device_node *np, -				struct device_node *interrupt_parent) -{ -	irq_domain_add_legacy(np, 128, 0, 0, &irq_domain_simple_ops, NULL); -	return 0; -} - -static int __init imx53_gpio_add_irq_domain(struct device_node *np, -				struct device_node *interrupt_parent) -{ -	static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS; - -	gpio_irq_base -= 32; -	irq_domain_add_legacy(np, 32, gpio_irq_base, 0, &irq_domain_simple_ops, NULL); - -	return 0; -} - -static const struct of_device_id imx53_irq_match[] __initconst = { -	{ .compatible = "fsl,imx53-tzic", .data = imx53_tzic_add_irq_domain, }, -	{ .compatible = "fsl,imx53-gpio", .data = imx53_gpio_add_irq_domain, }, -	{ /* sentinel */ } -}; -  static const struct of_device_id imx53_iomuxc_of_match[] __initconst = {  	{ .compatible = "fsl,imx53-iomuxc-ard", .data = imx53_ard_common_init, },  	{ .compatible = "fsl,imx53-iomuxc-evk", .data = imx53_evk_common_init, }, @@ -103,8 +78,6 @@ static void __init imx53_dt_init(void)  	const struct of_device_id *of_id;  	void (*func)(void); -	of_irq_init(imx53_irq_match); -  	pinctrl_provide_dummies();  	node = of_find_matching_node(NULL, imx53_iomuxc_of_match); @@ -147,6 +120,7 @@ DT_MACHINE_START(IMX53_DT, "Freescale i.MX53 (Device Tree Support)")  	.handle_irq	= imx53_handle_irq,  	.timer		= &imx53_timer,  	.init_machine	= imx53_dt_init, +	.init_late	= imx53_init_late,  	.dt_compat	= imx53_dt_board_compat,  	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-apf9328.c b/arch/arm/mach-imx/mach-apf9328.c index f4a63ee9e21..7b99a79722b 100644 --- a/arch/arm/mach-imx/mach-apf9328.c +++ b/arch/arm/mach-imx/mach-apf9328.c @@ -18,6 +18,7 @@  #include <linux/platform_device.h>  #include <linux/mtd/physmap.h>  #include <linux/dm9000.h> +#include <linux/gpio.h>  #include <linux/i2c.h>  #include <asm/mach-types.h> @@ -26,7 +27,6 @@  #include <mach/common.h>  #include <mach/hardware.h> -#include <mach/irqs.h>  #include <mach/iomux-mx1.h>  #include "devices-imx1.h" @@ -87,8 +87,7 @@ static struct resource dm9000_resources[] = {  		.end    = MX1_CS4_PHYS + 0x00C00003,  		.flags  = IORESOURCE_MEM,  	}, { -		.start  = IRQ_GPIOB(14), -		.end    = IRQ_GPIOB(14), +		/* irq number is run-time assigned */  		.flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,  	},  }; @@ -129,6 +128,8 @@ static void __init apf9328_init(void)  	imx1_add_imx_i2c(&apf9328_i2c_data); +	dm9000_resources[2].start = gpio_to_irq(IMX_GPIO_NR(2, 14)); +	dm9000_resources[2].end = gpio_to_irq(IMX_GPIO_NR(2, 14));  	platform_add_devices(devices, ARRAY_SIZE(devices));  } diff --git a/arch/arm/mach-imx/mach-armadillo5x0.c b/arch/arm/mach-imx/mach-armadillo5x0.c index c650145d164..2c6ab3273f9 100644 --- a/arch/arm/mach-imx/mach-armadillo5x0.c +++ b/arch/arm/mach-imx/mach-armadillo5x0.c @@ -367,10 +367,6 @@ static const struct fb_videomode fb_modedb[] = {  	},  }; -static const struct ipu_platform_data mx3_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct mx3fb_platform_data mx3fb_pdata __initdata = {  	.name		= "CRT-VGA",  	.mode		= fb_modedb, @@ -408,7 +404,8 @@ static int armadillo5x0_sdhc1_init(struct device *dev,  	gpio_direction_input(gpio_wp);  	/* When supported the trigger type have to be BOTH */ -	ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_ATA_DMACK), detect_irq, +	ret = request_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_ATA_DMACK)), +			  detect_irq,  			  IRQF_DISABLED | IRQF_TRIGGER_FALLING,  			  "sdhc-detect", data); @@ -429,7 +426,7 @@ err_gpio_free:  static void armadillo5x0_sdhc1_exit(struct device *dev, void *data)  { -	free_irq(IOMUX_TO_IRQ(MX31_PIN_ATA_DMACK), data); +	free_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_ATA_DMACK)), data);  	gpio_free(IOMUX_TO_GPIO(MX31_PIN_ATA_DMACK));  	gpio_free(IOMUX_TO_GPIO(MX31_PIN_ATA_RESET_B));  } @@ -450,8 +447,7 @@ static struct resource armadillo5x0_smc911x_resources[] = {  		.end	= MX31_CS3_BASE_ADDR + SZ_32M - 1,  		.flags	= IORESOURCE_MEM,  	}, { -		.start	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_0), -		.end	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_0), +		/* irq number is run-time assigned */  		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,  	},  }; @@ -498,6 +494,10 @@ static void __init armadillo5x0_init(void)  	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +	armadillo5x0_smc911x_resources[1].start = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0)); +	armadillo5x0_smc911x_resources[1].end = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0));  	platform_add_devices(devices, ARRAY_SIZE(devices));  	imx_add_gpio_keys(&armadillo5x0_button_data);  	imx31_add_imx_i2c1(NULL); @@ -513,7 +513,7 @@ static void __init armadillo5x0_init(void)  	imx31_add_mxc_mmc(0, &sdhc_pdata);  	/* Register FB */ -	imx31_add_ipu_core(&mx3_ipu_data); +	imx31_add_ipu_core();  	imx31_add_mx3_sdc_fb(&mx3fb_pdata);  	/* Register NOR Flash */ diff --git a/arch/arm/mach-imx/mach-cpuimx27.c b/arch/arm/mach-imx/mach-cpuimx27.c index d085aea0870..2bb9e18d9ee 100644 --- a/arch/arm/mach-imx/mach-cpuimx27.c +++ b/arch/arm/mach-imx/mach-cpuimx27.c @@ -169,28 +169,28 @@ static struct i2c_board_info eukrea_cpuimx27_i2c_devices[] = {  static struct plat_serial8250_port serial_platform_data[] = {  	{  		.mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x200000), -		.irq = IRQ_GPIOB(23), +		/* irq number is run-time assigned */  		.uartclk = 14745600,  		.regshift = 1,  		.iotype = UPIO_MEM,  		.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,  	}, {  		.mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x400000), -		.irq = IRQ_GPIOB(22), +		/* irq number is run-time assigned */  		.uartclk = 14745600,  		.regshift = 1,  		.iotype = UPIO_MEM,  		.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,  	}, {  		.mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x800000), -		.irq = IRQ_GPIOB(27), +		/* irq number is run-time assigned */  		.uartclk = 14745600,  		.regshift = 1,  		.iotype = UPIO_MEM,  		.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,  	}, {  		.mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x1000000), -		.irq = IRQ_GPIOB(30), +		/* irq number is run-time assigned */  		.uartclk = 14745600,  		.regshift = 1,  		.iotype = UPIO_MEM, @@ -233,18 +233,18 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {  	.phy_mode       = FSL_USB2_PHY_ULPI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init eukrea_cpuimx27_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", eukrea_cpuimx27_otg_mode); @@ -266,8 +266,8 @@ static void __init eukrea_cpuimx27_init(void)  	imx27_add_fec(NULL);  	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); -	imx27_add_imx2_wdt(NULL); -	imx27_add_mxc_w1(NULL); +	imx27_add_imx2_wdt(); +	imx27_add_mxc_w1();  #if defined(CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2)  	/* SDHC2 can be used for Wifi */ @@ -279,6 +279,10 @@ static void __init eukrea_cpuimx27_init(void)  #endif  #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) +	serial_platform_data[0].irq = IMX_GPIO_NR(2, 23); +	serial_platform_data[1].irq = IMX_GPIO_NR(2, 22); +	serial_platform_data[2].irq = IMX_GPIO_NR(2, 27); +	serial_platform_data[3].irq = IMX_GPIO_NR(2, 30);  	platform_device_register(&serial_device);  #endif diff --git a/arch/arm/mach-imx/mach-cpuimx35.c b/arch/arm/mach-imx/mach-cpuimx35.c index 6450303f1a7..d49b0ec6bde 100644 --- a/arch/arm/mach-imx/mach-cpuimx35.c +++ b/arch/arm/mach-imx/mach-cpuimx35.c @@ -71,7 +71,7 @@ static struct i2c_board_info eukrea_cpuimx35_i2c_devices[] = {  	}, {  		I2C_BOARD_INFO("tsc2007", 0x48),  		.platform_data	= &tsc2007_info, -		.irq		= IMX_GPIO_TO_IRQ(TSC2007_IRQGPIO), +		/* irq number is run-time assigned */  	},  }; @@ -141,18 +141,18 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {  	.workaround	= FLS_USB2_WORKAROUND_ENGCM09152,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init eukrea_cpuimx35_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", eukrea_cpuimx35_otg_mode); @@ -167,11 +167,12 @@ static void __init eukrea_cpuimx35_init(void)  			ARRAY_SIZE(eukrea_cpuimx35_pads));  	imx35_add_fec(NULL); -	imx35_add_imx2_wdt(NULL); +	imx35_add_imx2_wdt();  	imx35_add_imx_uart0(&uart_pdata);  	imx35_add_mxc_nand(&eukrea_cpuimx35_nand_board_info); +	eukrea_cpuimx35_i2c_devices[1].irq = gpio_to_irq(TSC2007_IRQGPIO);  	i2c_register_board_info(0, eukrea_cpuimx35_i2c_devices,  			ARRAY_SIZE(eukrea_cpuimx35_i2c_devices));  	imx35_add_imx_i2c0(&eukrea_cpuimx35_i2c0_data); diff --git a/arch/arm/mach-imx/mach-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c index 1e09de50cbc..b87cc49ab1e 100644 --- a/arch/arm/mach-imx/mach-cpuimx51sd.c +++ b/arch/arm/mach-imx/mach-cpuimx51sd.c @@ -217,18 +217,18 @@ static const struct mxc_usbh_platform_data usbh1_config __initconst = {  	.portsc	= MXC_EHCI_MODE_ULPI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init eukrea_cpuimx51sd_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", eukrea_cpuimx51sd_otg_mode); @@ -258,7 +258,7 @@ static struct spi_board_info cpuimx51sd_spi_device[] = {  		.mode		= SPI_MODE_0,  		.chip_select     = 0,  		.platform_data   = &mcp251x_info, -		.irq             = IMX_GPIO_TO_IRQ(CAN_IRQGPIO) +		/* irq number is run-time assigned */  	},  }; @@ -292,7 +292,7 @@ static void __init eukrea_cpuimx51sd_init(void)  	imx51_add_imx_uart(0, &uart_pdata);  	imx51_add_mxc_nand(&eukrea_cpuimx51sd_nand_board_info); -	imx51_add_imx2_wdt(0, NULL); +	imx51_add_imx2_wdt(0);  	gpio_request(ETH_RST, "eth_rst");  	gpio_set_value(ETH_RST, 1); @@ -309,6 +309,7 @@ static void __init eukrea_cpuimx51sd_init(void)  	msleep(20);  	gpio_set_value(CAN_RST, 1);  	imx51_add_ecspi(0, &cpuimx51sd_ecspi1_pdata); +	cpuimx51sd_spi_device[0].irq = gpio_to_irq(CAN_IRQGPIO);  	spi_register_board_info(cpuimx51sd_spi_device,  				ARRAY_SIZE(cpuimx51sd_spi_device)); diff --git a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c index d1e04e676e3..017bbb70ea4 100644 --- a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c +++ b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c @@ -109,18 +109,18 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {  	.workaround     = FLS_USB2_WORKAROUND_ENGCM09152,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init eukrea_cpuimx25_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", eukrea_cpuimx25_otg_mode); @@ -134,9 +134,9 @@ static void __init eukrea_cpuimx25_init(void)  	imx25_add_imx_uart0(&uart_pdata);  	imx25_add_mxc_nand(&eukrea_cpuimx25_nand_board_info); -	imx25_add_imxdi_rtc(NULL); +	imx25_add_imxdi_rtc();  	imx25_add_fec(&mx25_fec_pdata); -	imx25_add_imx2_wdt(NULL); +	imx25_add_imx2_wdt();  	i2c_register_board_info(0, eukrea_cpuimx25_i2c_devices,  				ARRAY_SIZE(eukrea_cpuimx25_i2c_devices)); diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c index ba09552fe5f..f264ddddd47 100644 --- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c +++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c @@ -40,6 +40,7 @@  #include <asm/mach/time.h>  #include <asm/system_info.h>  #include <mach/common.h> +#include <mach/hardware.h>  #include <mach/iomux-mx27.h>  #include "devices-imx27.h" @@ -47,7 +48,7 @@  #define TVP5150_RSTN (GPIO_PORTC + 18)  #define TVP5150_PWDN (GPIO_PORTC + 19)  #define OTG_PHY_CS_GPIO (GPIO_PORTF + 17) -#define SDHC1_IRQ IRQ_GPIOB(25) +#define SDHC1_IRQ_GPIO IMX_GPIO_NR(2, 25)  #define MOTHERBOARD_BIT2	(GPIO_PORTD + 31)  #define MOTHERBOARD_BIT1	(GPIO_PORTD + 30) @@ -307,14 +308,14 @@ static int visstrim_m10_sdhc1_init(struct device *dev,  {  	int ret; -	ret = request_irq(SDHC1_IRQ, detect_irq, IRQF_TRIGGER_FALLING, -				"mmc-detect", data); +	ret = request_irq(gpio_to_irq(SDHC1_IRQ_GPIO), detect_irq, +			  IRQF_TRIGGER_FALLING, "mmc-detect", data);  	return ret;  }  static void visstrim_m10_sdhc1_exit(struct device *dev, void *data)  { -	free_irq(SDHC1_IRQ, data); +	free_irq(gpio_to_irq(SDHC1_IRQ_GPIO), data);  }  static const struct imxmmc_platform_data visstrim_m10_sdhc_pdata __initconst = { diff --git a/arch/arm/mach-imx/mach-imx27ipcam.c b/arch/arm/mach-imx/mach-imx27ipcam.c index c9d350c5dcc..7381387a890 100644 --- a/arch/arm/mach-imx/mach-imx27ipcam.c +++ b/arch/arm/mach-imx/mach-imx27ipcam.c @@ -57,7 +57,7 @@ static void __init mx27ipcam_init(void)  	imx27_add_imx_uart0(NULL);  	imx27_add_fec(NULL); -	imx27_add_imx2_wdt(NULL); +	imx27_add_imx2_wdt();  }  static void __init mx27ipcam_timer_init(void) diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index b47e98b7d53..5ec0608f2a7 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -12,11 +12,12 @@  #include <linux/clk.h>  #include <linux/clkdev.h> +#include <linux/cpuidle.h>  #include <linux/delay.h> +#include <linux/export.h>  #include <linux/init.h>  #include <linux/io.h>  #include <linux/irq.h> -#include <linux/irqdomain.h>  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/of_irq.h> @@ -24,6 +25,8 @@  #include <linux/pinctrl/machine.h>  #include <linux/phy.h>  #include <linux/micrel_phy.h> +#include <linux/mfd/anatop.h> +#include <asm/cpuidle.h>  #include <asm/smp_twd.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/hardware/gic.h> @@ -31,8 +34,10 @@  #include <asm/mach/time.h>  #include <asm/system_misc.h>  #include <mach/common.h> +#include <mach/cpuidle.h>  #include <mach/hardware.h> +  void imx6q_restart(char mode, const char *cmd)  {  	struct device_node *np; @@ -113,6 +118,45 @@ static void __init imx6q_sabrelite_init(void)  	imx6q_sabrelite_cko1_setup();  } +static void __init imx6q_usb_init(void) +{ +	struct device_node *np; +	struct platform_device *pdev = NULL; +	struct anatop *adata = NULL; + +	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop"); +	if (np) +		pdev = of_find_device_by_node(np); +	if (pdev) +		adata = platform_get_drvdata(pdev); +	if (!adata) { +		if (np) +			of_node_put(np); +		return; +	} + +#define HW_ANADIG_USB1_CHRG_DETECT		0x000001b0 +#define HW_ANADIG_USB2_CHRG_DETECT		0x00000210 + +#define BM_ANADIG_USB_CHRG_DETECT_EN_B		0x00100000 +#define BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B	0x00080000 + +	/* +	 * The external charger detector needs to be disabled, +	 * or the signal at DP will be poor +	 */ +	anatop_write_reg(adata, HW_ANADIG_USB1_CHRG_DETECT, +			BM_ANADIG_USB_CHRG_DETECT_EN_B +			| BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B, +			~0); +	anatop_write_reg(adata, HW_ANADIG_USB2_CHRG_DETECT, +			BM_ANADIG_USB_CHRG_DETECT_EN_B | +			BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B, +			~0); + +	of_node_put(np); +} +  static void __init imx6q_init_machine(void)  {  	/* @@ -127,6 +171,20 @@ static void __init imx6q_init_machine(void)  	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);  	imx6q_pm_init(); +	imx6q_usb_init(); +} + +static struct cpuidle_driver imx6q_cpuidle_driver = { +	.name			= "imx6q_cpuidle", +	.owner			= THIS_MODULE, +	.en_core_tk_irqen	= 1, +	.states[0]		= ARM_CPUIDLE_WFI_STATE, +	.state_count		= 1, +}; + +static void __init imx6q_init_late(void) +{ +	imx_cpuidle_init(&imx6q_cpuidle_driver);  }  static void __init imx6q_map_io(void) @@ -136,21 +194,8 @@ static void __init imx6q_map_io(void)  	imx6q_clock_map_io();  } -static int __init imx6q_gpio_add_irq_domain(struct device_node *np, -				struct device_node *interrupt_parent) -{ -	static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS; - -	gpio_irq_base -= 32; -	irq_domain_add_legacy(np, 32, gpio_irq_base, 0, &irq_domain_simple_ops, -			      NULL); - -	return 0; -} -  static const struct of_device_id imx6q_irq_match[] __initconst = {  	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{ .compatible = "fsl,imx6q-gpio", .data = imx6q_gpio_add_irq_domain, },  	{ /* sentinel */ }  }; @@ -186,6 +231,7 @@ DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad (Device Tree)")  	.handle_irq	= imx6q_handle_irq,  	.timer		= &imx6q_timer,  	.init_machine	= imx6q_init_machine, +	.init_late      = imx6q_init_late,  	.dt_compat	= imx6q_dt_compat,  	.restart	= imx6q_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-kzm_arm11_01.c b/arch/arm/mach-imx/mach-kzm_arm11_01.c index 15a26e90826..5d08533ab2c 100644 --- a/arch/arm/mach-imx/mach-kzm_arm11_01.c +++ b/arch/arm/mach-imx/mach-kzm_arm11_01.c @@ -73,7 +73,7 @@ static struct plat_serial8250_port serial_platform_data[] = {  	{  		.membase	= KZM_ARM11_IO_ADDRESS(KZM_ARM11_16550),  		.mapbase	= KZM_ARM11_16550, -		.irq		= IOMUX_TO_IRQ(MX31_PIN_GPIO1_1), +		/* irq number is run-time assigned */  		.irqflags	= IRQ_TYPE_EDGE_RISING,  		.uartclk	= 14745600,  		.regshift	= 0, @@ -91,8 +91,7 @@ static struct resource serial8250_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	{ -		.start	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_1), -		.end	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_1), +		/* irq number is run-time assigned */  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -125,6 +124,13 @@ static int __init kzm_init_ext_uart(void)  	tmp |= 0x2;  	__raw_writeb(tmp, KZM_ARM11_IO_ADDRESS(KZM_ARM11_CTL1)); +	serial_platform_data[0].irq = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_1)); +	serial8250_resources[1].start = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_1)); +	serial8250_resources[1].end = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_1)); +  	return platform_device_register(&serial_device);  }  #else @@ -152,8 +158,7 @@ static struct resource kzm_smsc9118_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	{ -		.start	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_2), -		.end	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_2), +		/* irq number is run-time assigned */  		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,  	},  }; @@ -184,6 +189,11 @@ static int __init kzm_init_smsc9118(void)  	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +	kzm_smsc9118_resources[1].start = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2)); +	kzm_smsc9118_resources[1].end = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2)); +  	return platform_device_register(&kzm_smsc9118_device);  }  #else diff --git a/arch/arm/mach-imx/mach-mx1ads.c b/arch/arm/mach-imx/mach-mx1ads.c index 7274e792813..667f359a2e8 100644 --- a/arch/arm/mach-imx/mach-mx1ads.c +++ b/arch/arm/mach-imx/mach-mx1ads.c @@ -26,7 +26,6 @@  #include <mach/common.h>  #include <mach/hardware.h>  #include <mach/iomux-mx1.h> -#include <mach/irqs.h>  #include "devices-imx1.h" diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c index 3e7401fca76..ed22e3fe6ec 100644 --- a/arch/arm/mach-imx/mach-mx21ads.c +++ b/arch/arm/mach-imx/mach-mx21ads.c @@ -38,7 +38,7 @@  		(MX21ADS_MMIO_BASE_ADDR + (offset))  #define MX21ADS_CS8900A_MMIO_SIZE   0x200000 -#define MX21ADS_CS8900A_IRQ         IRQ_GPIOE(11) +#define MX21ADS_CS8900A_IRQ_GPIO    IMX_GPIO_NR(5, 11)  #define MX21ADS_ST16C255_IOBASE_REG MX21ADS_REG_ADDR(0x200000)  #define MX21ADS_VERSION_REG         MX21ADS_REG_ADDR(0x400000)  #define MX21ADS_IO_REG              MX21ADS_REG_ADDR(0x800000) @@ -159,9 +159,10 @@ static struct platform_device mx21ads_nor_mtd_device = {  	.resource = &mx21ads_flash_resource,  }; -static const struct resource mx21ads_cs8900_resources[] __initconst = { +static struct resource mx21ads_cs8900_resources[] __initdata = {  	DEFINE_RES_MEM(MX21_CS1_BASE_ADDR, MX21ADS_CS8900A_MMIO_SIZE), -	DEFINE_RES_IRQ(MX21ADS_CS8900A_IRQ), +	/* irq number is run-time assigned */ +	DEFINE_RES_IRQ(-1),  };  static const struct platform_device_info mx21ads_cs8900_devinfo __initconst = { @@ -241,13 +242,13 @@ static int mx21ads_sdhc_get_ro(struct device *dev)  static int mx21ads_sdhc_init(struct device *dev, irq_handler_t detect_irq,  	void *data)  { -	return request_irq(IRQ_GPIOD(25), detect_irq, +	return request_irq(gpio_to_irq(IMX_GPIO_NR(4, 25)), detect_irq,  		IRQF_TRIGGER_FALLING, "mmc-detect", data);  }  static void mx21ads_sdhc_exit(struct device *dev, void *data)  { -	free_irq(IRQ_GPIOD(25), data); +	free_irq(gpio_to_irq(IMX_GPIO_NR(4, 25)), data);  }  static const struct imxmmc_platform_data mx21ads_sdhc_pdata __initconst = { @@ -304,6 +305,11 @@ static void __init mx21ads_board_init(void)  	imx21_add_mxc_nand(&mx21ads_nand_board_info);  	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); + +	mx21ads_cs8900_resources[1].start = +			gpio_to_irq(MX21ADS_CS8900A_IRQ_GPIO); +	mx21ads_cs8900_resources[1].end = +			gpio_to_irq(MX21ADS_CS8900A_IRQ_GPIO);  	platform_device_register_full(&mx21ads_cs8900_devinfo);  } diff --git a/arch/arm/mach-imx/mach-mx25_3ds.c b/arch/arm/mach-imx/mach-mx25_3ds.c index f26734298aa..ce247fd1269 100644 --- a/arch/arm/mach-imx/mach-mx25_3ds.c +++ b/arch/arm/mach-imx/mach-mx25_3ds.c @@ -237,9 +237,9 @@ static void __init mx25pdk_init(void)  	imx25_add_fsl_usb2_udc(&otg_device_pdata);  	imx25_add_mxc_ehci_hs(&usbh2_pdata);  	imx25_add_mxc_nand(&mx25pdk_nand_board_info); -	imx25_add_imxdi_rtc(NULL); +	imx25_add_imxdi_rtc();  	imx25_add_imx_fb(&mx25pdk_fb_pdata); -	imx25_add_imx2_wdt(NULL); +	imx25_add_imx2_wdt();  	mx25pdk_fec_reset();  	imx25_add_fec(&mx25_fec_pdata); diff --git a/arch/arm/mach-imx/mach-mx27_3ds.c b/arch/arm/mach-imx/mach-mx27_3ds.c index c6d385c5225..58c24c1a7ab 100644 --- a/arch/arm/mach-imx/mach-mx27_3ds.c +++ b/arch/arm/mach-imx/mach-mx27_3ds.c @@ -40,7 +40,6 @@  #include <mach/common.h>  #include <mach/iomux-mx27.h>  #include <mach/ulpi.h> -#include <mach/irqs.h>  #include <mach/3ds_debugboard.h>  #include "devices-imx27.h" @@ -48,7 +47,6 @@  #define SD1_EN_GPIO		IMX_GPIO_NR(2, 25)  #define OTG_PHY_RESET_GPIO	IMX_GPIO_NR(2, 23)  #define SPI2_SS0		IMX_GPIO_NR(4, 21) -#define EXPIO_PARENT_INT	gpio_to_irq(IMX_GPIO_NR(3, 28))  #define PMIC_INT		IMX_GPIO_NR(3, 14)  #define SPI1_SS0		IMX_GPIO_NR(4, 28)  #define SD1_CD			IMX_GPIO_NR(2, 26) @@ -241,18 +239,18 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {  	.phy_mode       = FSL_USB2_PHY_ULPI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init mx27_3ds_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", mx27_3ds_otg_mode); @@ -445,7 +443,7 @@ static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {  		.bus_num	= 1,  		.chip_select	= 0, /* SS0 */  		.platform_data	= &mc13783_pdata, -		.irq = IMX_GPIO_TO_IRQ(PMIC_INT), +		/* irq number is run-time assigned */  		.mode = SPI_CS_HIGH,  	}, {  		.modalias	= "l4f00242t03", @@ -480,7 +478,7 @@ static void __init mx27pdk_init(void)  	imx27_add_fec(NULL);  	imx27_add_imx_keypad(&mx27_3ds_keymap_data);  	imx27_add_mxc_mmc(0, &sdhc1_pdata); -	imx27_add_imx2_wdt(NULL); +	imx27_add_imx2_wdt();  	otg_phy_init();  	if (otg_mode_host) { @@ -496,10 +494,11 @@ static void __init mx27pdk_init(void)  	imx27_add_spi_imx1(&spi2_pdata);  	imx27_add_spi_imx0(&spi1_pdata); +	mx27_3ds_spi_devs[0].irq = gpio_to_irq(PMIC_INT);  	spi_register_board_info(mx27_3ds_spi_devs,  						ARRAY_SIZE(mx27_3ds_spi_devs)); -	if (mxc_expio_init(MX27_CS5_BASE_ADDR, EXPIO_PARENT_INT)) +	if (mxc_expio_init(MX27_CS5_BASE_ADDR, IMX_GPIO_NR(3, 28)))  		pr_warn("Init of the debugboard failed, all devices on the debugboard are unusable.\n");  	imx27_add_imx_i2c(0, &mx27_3ds_i2c0_data);  	platform_add_devices(devices, ARRAY_SIZE(devices)); diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-imx/mach-mx27ads.c index 0228d2e07fe..7dc59bac0e5 100644 --- a/arch/arm/mach-imx/mach-mx27ads.c +++ b/arch/arm/mach-imx/mach-mx27ads.c @@ -246,25 +246,25 @@ static const struct imx_fb_platform_data mx27ads_fb_data __initconst = {  static int mx27ads_sdhc1_init(struct device *dev, irq_handler_t detect_irq,  			      void *data)  { -	return request_irq(IRQ_GPIOE(21), detect_irq, IRQF_TRIGGER_RISING, -			   "sdhc1-card-detect", data); +	return request_irq(gpio_to_irq(IMX_GPIO_NR(5, 21)), detect_irq, +			   IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);  }  static int mx27ads_sdhc2_init(struct device *dev, irq_handler_t detect_irq,  			      void *data)  { -	return request_irq(IRQ_GPIOB(7), detect_irq, IRQF_TRIGGER_RISING, -			   "sdhc2-card-detect", data); +	return request_irq(gpio_to_irq(IMX_GPIO_NR(2, 7)), detect_irq, +			   IRQF_TRIGGER_RISING, "sdhc2-card-detect", data);  }  static void mx27ads_sdhc1_exit(struct device *dev, void *data)  { -	free_irq(IRQ_GPIOE(21), data); +	free_irq(gpio_to_irq(IMX_GPIO_NR(5, 21)), data);  }  static void mx27ads_sdhc2_exit(struct device *dev, void *data)  { -	free_irq(IRQ_GPIOB(7), data); +	free_irq(gpio_to_irq(IMX_GPIO_NR(2, 7)), data);  }  static const struct imxmmc_platform_data sdhc1_pdata __initconst = { @@ -310,7 +310,7 @@ static void __init mx27ads_board_init(void)  	imx27_add_fec(NULL);  	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); -	imx27_add_mxc_w1(NULL); +	imx27_add_mxc_w1();  }  static void __init mx27ads_timer_init(void) diff --git a/arch/arm/mach-imx/mach-mx31_3ds.c b/arch/arm/mach-imx/mach-mx31_3ds.c index 4eafdf275ea..8915f937b7d 100644 --- a/arch/arm/mach-imx/mach-mx31_3ds.c +++ b/arch/arm/mach-imx/mach-mx31_3ds.c @@ -44,9 +44,6 @@  #include "devices-imx31.h" -/* CPLD IRQ line for external uart, external ethernet etc */ -#define EXPIO_PARENT_INT	IOMUX_TO_IRQ(MX31_PIN_GPIO1_1) -  static int mx31_3ds_pins[] = {  	/* UART1 */  	MX31_PIN_CTS1__CTS1, @@ -277,10 +274,6 @@ static const struct fb_videomode fb_modedb[] = {  	},  }; -static struct ipu_platform_data mx3_ipu_data = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct mx3fb_platform_data mx3fb_pdata __initdata = {  	.name		= "Epson-VGA",  	.mode		= fb_modedb, @@ -317,7 +310,7 @@ static int mx31_3ds_sdhc1_init(struct device *dev,  		return ret;  	} -	ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), +	ret = request_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1)),  			  detect_irq, IRQF_DISABLED |  			  IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,  			  "sdhc1-detect", data); @@ -336,7 +329,7 @@ gpio_free:  static void mx31_3ds_sdhc1_exit(struct device *dev, void *data)  { -	free_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), data); +	free_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1)), data);  	gpio_free_array(mx31_3ds_sdhc1_gpios,  			 ARRAY_SIZE(mx31_3ds_sdhc1_gpios));  } @@ -539,7 +532,7 @@ static struct spi_board_info mx31_3ds_spi_devs[] __initdata = {  		.bus_num	= 1,  		.chip_select	= 1, /* SS2 */  		.platform_data	= &mc13783_pdata, -		.irq		= IOMUX_TO_IRQ(MX31_PIN_GPIO1_3), +		/* irq number is run-time assigned */  		.mode = SPI_CS_HIGH,  	}, {  		.modalias	= "l4f00242t03", @@ -671,18 +664,18 @@ static const struct fsl_usb2_platform_data usbotg_pdata __initconst = {  	.phy_mode	= FSL_USB2_PHY_ULPI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init mx31_3ds_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", mx31_3ds_otg_mode); @@ -714,6 +707,7 @@ static void __init mx31_3ds_init(void)  	imx31_add_mxc_nand(&mx31_3ds_nand_board_info);  	imx31_add_spi_imx1(&spi1_pdata); +	mx31_3ds_spi_devs[0].irq = gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3));  	spi_register_board_info(mx31_3ds_spi_devs,  						ARRAY_SIZE(mx31_3ds_spi_devs)); @@ -736,15 +730,15 @@ static void __init mx31_3ds_init(void)  	if (!otg_mode_host)  		imx31_add_fsl_usb2_udc(&usbotg_pdata); -	if (mxc_expio_init(MX31_CS5_BASE_ADDR, EXPIO_PARENT_INT)) +	if (mxc_expio_init(MX31_CS5_BASE_ADDR, IOMUX_TO_GPIO(MX31_PIN_GPIO1_1)))  		printk(KERN_WARNING "Init of the debug board failed, all "  				    "devices on the debug board are unusable.\n"); -	imx31_add_imx2_wdt(NULL); +	imx31_add_imx2_wdt();  	imx31_add_imx_i2c0(&mx31_3ds_i2c0_data);  	imx31_add_mxc_mmc(0, &sdhc1_pdata);  	imx31_add_spi_imx0(&spi0_pdata); -	imx31_add_ipu_core(&mx3_ipu_data); +	imx31_add_ipu_core();  	imx31_add_mx3_sdc_fb(&mx3fb_pdata);  	/* CSI */ diff --git a/arch/arm/mach-imx/mach-mx31ads.c b/arch/arm/mach-imx/mach-mx31ads.c index 4518e544822..d37f4809c55 100644 --- a/arch/arm/mach-imx/mach-mx31ads.c +++ b/arch/arm/mach-imx/mach-mx31ads.c @@ -21,6 +21,7 @@  #include <linux/gpio.h>  #include <linux/i2c.h>  #include <linux/irq.h> +#include <linux/irqdomain.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -62,20 +63,18 @@  #define PBC_INTSTATUS_REG	(PBC_INTSTATUS + PBC_BASE_ADDRESS)  #define PBC_INTMASK_SET_REG	(PBC_INTMASK_SET + PBC_BASE_ADDRESS)  #define PBC_INTMASK_CLEAR_REG	(PBC_INTMASK_CLEAR + PBC_BASE_ADDRESS) -#define EXPIO_PARENT_INT	IOMUX_TO_IRQ(MX31_PIN_GPIO1_4) -#define MXC_EXP_IO_BASE		MXC_BOARD_IRQ_START -#define MXC_IRQ_TO_EXPIO(irq)	((irq) - MXC_EXP_IO_BASE) - -#define EXPIO_INT_XUART_INTA	(MXC_EXP_IO_BASE + 10) -#define EXPIO_INT_XUART_INTB	(MXC_EXP_IO_BASE + 11) +#define EXPIO_INT_XUART_INTA	10 +#define EXPIO_INT_XUART_INTB	11  #define MXC_MAX_EXP_IO_LINES	16  /* CS8900 */ -#define EXPIO_INT_ENET_INT	(MXC_EXP_IO_BASE + 8) +#define EXPIO_INT_ENET_INT	8  #define CS4_CS8900_MMIO_START	0x20000 +static struct irq_domain *domain; +  /*   * The serial port definition structure.   */ @@ -83,7 +82,6 @@ static struct plat_serial8250_port serial_platform_data[] = {  	{  		.membase  = (void *)(PBC_BASE_ADDRESS + PBC_SC16C652_UARTA),  		.mapbase  = (unsigned long)(MX31_CS4_BASE_ADDR + PBC_SC16C652_UARTA), -		.irq      = EXPIO_INT_XUART_INTA,  		.uartclk  = 14745600,  		.regshift = 0,  		.iotype   = UPIO_MEM, @@ -91,7 +89,6 @@ static struct plat_serial8250_port serial_platform_data[] = {  	}, {  		.membase  = (void *)(PBC_BASE_ADDRESS + PBC_SC16C652_UARTB),  		.mapbase  = (unsigned long)(MX31_CS4_BASE_ADDR + PBC_SC16C652_UARTB), -		.irq      = EXPIO_INT_XUART_INTB,  		.uartclk  = 14745600,  		.regshift = 0,  		.iotype   = UPIO_MEM, @@ -108,9 +105,9 @@ static struct platform_device serial_device = {  	},  }; -static const struct resource mx31ads_cs8900_resources[] __initconst = { +static struct resource mx31ads_cs8900_resources[] __initdata = {  	DEFINE_RES_MEM(MX31_CS4_BASE_ADDR + CS4_CS8900_MMIO_START, SZ_64K), -	DEFINE_RES_IRQ(EXPIO_INT_ENET_INT), +	DEFINE_RES_IRQ(-1),  };  static const struct platform_device_info mx31ads_cs8900_devinfo __initconst = { @@ -122,11 +119,19 @@ static const struct platform_device_info mx31ads_cs8900_devinfo __initconst = {  static int __init mxc_init_extuart(void)  { +	serial_platform_data[0].irq = irq_find_mapping(domain, +						       EXPIO_INT_XUART_INTA); +	serial_platform_data[1].irq = irq_find_mapping(domain, +						       EXPIO_INT_XUART_INTB);  	return platform_device_register(&serial_device);  }  static void __init mxc_init_ext_ethernet(void)  { +	mx31ads_cs8900_resources[1].start = +			irq_find_mapping(domain, EXPIO_INT_ENET_INT); +	mx31ads_cs8900_resources[1].end = +			irq_find_mapping(domain, EXPIO_INT_ENET_INT);  	platform_device_register_full(  		(struct platform_device_info *)&mx31ads_cs8900_devinfo);  } @@ -157,12 +162,12 @@ static void mx31ads_expio_irq_handler(u32 irq, struct irq_desc *desc)  	imr_val = __raw_readw(PBC_INTMASK_SET_REG);  	int_valid = __raw_readw(PBC_INTSTATUS_REG) & imr_val; -	expio_irq = MXC_EXP_IO_BASE; +	expio_irq = 0;  	for (; int_valid != 0; int_valid >>= 1, expio_irq++) {  		if ((int_valid & 1) == 0)  			continue; -		generic_handle_irq(expio_irq); +		generic_handle_irq(irq_find_mapping(domain, expio_irq));  	}  } @@ -172,7 +177,7 @@ static void mx31ads_expio_irq_handler(u32 irq, struct irq_desc *desc)   */  static void expio_mask_irq(struct irq_data *d)  { -	u32 expio = MXC_IRQ_TO_EXPIO(d->irq); +	u32 expio = d->hwirq;  	/* mask the interrupt */  	__raw_writew(1 << expio, PBC_INTMASK_CLEAR_REG);  	__raw_readw(PBC_INTMASK_CLEAR_REG); @@ -184,7 +189,7 @@ static void expio_mask_irq(struct irq_data *d)   */  static void expio_ack_irq(struct irq_data *d)  { -	u32 expio = MXC_IRQ_TO_EXPIO(d->irq); +	u32 expio = d->hwirq;  	/* clear the interrupt status */  	__raw_writew(1 << expio, PBC_INTSTATUS_REG);  } @@ -195,7 +200,7 @@ static void expio_ack_irq(struct irq_data *d)   */  static void expio_unmask_irq(struct irq_data *d)  { -	u32 expio = MXC_IRQ_TO_EXPIO(d->irq); +	u32 expio = d->hwirq;  	/* unmask the interrupt */  	__raw_writew(1 << expio, PBC_INTMASK_SET_REG);  } @@ -209,7 +214,8 @@ static struct irq_chip expio_irq_chip = {  static void __init mx31ads_init_expio(void)  { -	int i; +	int irq_base; +	int i, irq;  	printk(KERN_INFO "MX31ADS EXPIO(CPLD) hardware\n"); @@ -221,13 +227,21 @@ static void __init mx31ads_init_expio(void)  	/* disable the interrupt and clear the status */  	__raw_writew(0xFFFF, PBC_INTMASK_CLEAR_REG);  	__raw_writew(0xFFFF, PBC_INTSTATUS_REG); -	for (i = MXC_EXP_IO_BASE; i < (MXC_EXP_IO_BASE + MXC_MAX_EXP_IO_LINES); -	     i++) { + +	irq_base = irq_alloc_descs(-1, 0, MXC_MAX_EXP_IO_LINES, numa_node_id()); +	WARN_ON(irq_base < 0); + +	domain = irq_domain_add_legacy(NULL, MXC_MAX_EXP_IO_LINES, irq_base, 0, +				       &irq_domain_simple_ops, NULL); +	WARN_ON(!domain); + +	for (i = irq_base; i < irq_base + MXC_MAX_EXP_IO_LINES; i++) {  		irq_set_chip_and_handler(i, &expio_irq_chip, handle_level_irq);  		set_irq_flags(i, IRQF_VALID);  	} -	irq_set_irq_type(EXPIO_PARENT_INT, IRQ_TYPE_LEVEL_HIGH); -	irq_set_chained_handler(EXPIO_PARENT_INT, mx31ads_expio_irq_handler); +	irq = gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_4)); +	irq_set_irq_type(irq, IRQ_TYPE_LEVEL_HIGH); +	irq_set_chained_handler(irq, mx31ads_expio_irq_handler);  }  #ifdef CONFIG_MACH_MX31ADS_WM1133_EV1 @@ -479,7 +493,6 @@ static int mx31_wm8350_init(struct wm8350 *wm8350)  static struct wm8350_platform_data __initdata mx31_wm8350_pdata = {  	.init = mx31_wm8350_init, -	.irq_base = MXC_BOARD_IRQ_START + MXC_MAX_EXP_IO_LINES,  };  #endif @@ -488,13 +501,17 @@ static struct i2c_board_info __initdata mx31ads_i2c1_devices[] = {  	{  		I2C_BOARD_INFO("wm8350", 0x1a),  		.platform_data = &mx31_wm8350_pdata, -		.irq = IOMUX_TO_IRQ(MX31_PIN_GPIO1_3), +		/* irq number is run-time assigned */  	},  #endif  };  static void __init mxc_init_i2c(void)  { +#ifdef CONFIG_MACH_MX31ADS_WM1133_EV1 +	mx31ads_i2c1_devices[0].irq = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3)); +#endif  	i2c_register_board_info(1, mx31ads_i2c1_devices,  				ARRAY_SIZE(mx31ads_i2c1_devices)); diff --git a/arch/arm/mach-imx/mach-mx31lilly.c b/arch/arm/mach-imx/mach-mx31lilly.c index 83714b0cc29..34b9bf075da 100644 --- a/arch/arm/mach-imx/mach-mx31lilly.c +++ b/arch/arm/mach-imx/mach-mx31lilly.c @@ -65,8 +65,7 @@ static struct resource smsc91x_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	{ -		.start	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_0), -		.end	= IOMUX_TO_IRQ(MX31_PIN_GPIO1_0), +		/* irq number is run-time assigned */  		.flags	= IORESOURCE_IRQ | IRQF_TRIGGER_FALLING,  	}  }; @@ -233,7 +232,7 @@ static struct spi_board_info mc13783_dev __initdata = {  	.bus_num	= 1,  	.chip_select	= 0,  	.platform_data	= &mc13783_pdata, -	.irq		= IOMUX_TO_IRQ(MX31_PIN_GPIO1_3), +	/* irq number is run-time assigned */  };  static struct platform_device *devices[] __initdata = { @@ -285,10 +284,15 @@ static void __init mx31lilly_board_init(void)  	imx31_add_spi_imx0(&spi0_pdata);  	imx31_add_spi_imx1(&spi1_pdata); +	mc13783_dev.irq = gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3));  	spi_register_board_info(&mc13783_dev, 1);  	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +	smsc91x_resources[1].start = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0)); +	smsc91x_resources[1].end = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0));  	platform_add_devices(devices, ARRAY_SIZE(devices));  	/* USB */ diff --git a/arch/arm/mach-imx/mach-mx31lite.c b/arch/arm/mach-imx/mach-mx31lite.c index 686c6058798..c8785b39eae 100644 --- a/arch/arm/mach-imx/mach-mx31lite.c +++ b/arch/arm/mach-imx/mach-mx31lite.c @@ -43,7 +43,6 @@  #include <mach/common.h>  #include <mach/board-mx31lite.h>  #include <mach/iomux-mx3.h> -#include <mach/irqs.h>  #include <mach/ulpi.h>  #include "devices-imx31.h" @@ -83,8 +82,7 @@ static struct resource smsc911x_resources[] = {  		.end		= MX31_CS4_BASE_ADDR + 0x100,  		.flags		= IORESOURCE_MEM,  	}, { -		.start		= IOMUX_TO_IRQ(MX31_PIN_SFS6), -		.end		= IOMUX_TO_IRQ(MX31_PIN_SFS6), +		/* irq number is run-time assigned */  		.flags		= IORESOURCE_IRQ,  	},  }; @@ -124,7 +122,7 @@ static struct spi_board_info mc13783_spi_dev __initdata = {  	.bus_num	= 1,  	.chip_select    = 0,  	.platform_data  = &mc13783_pdata, -	.irq		= IOMUX_TO_IRQ(MX31_PIN_GPIO1_3), +	/* irq number is run-time assigned */  };  /* @@ -258,6 +256,7 @@ static void __init mx31lite_init(void)  	imx31_add_mxc_nand(&mx31lite_nand_board_info);  	imx31_add_spi_imx1(&spi1_pdata); +	mc13783_spi_dev.irq = gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3));  	spi_register_board_info(&mc13783_spi_dev, 1);  	/* USB */ @@ -274,6 +273,10 @@ static void __init mx31lite_init(void)  		pr_warning("could not get LAN irq gpio\n");  	else {  		gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_SFS6)); +		smsc911x_resources[1].start = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_SFS6)); +		smsc911x_resources[1].end = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_SFS6));  		platform_device_register(&smsc911x_device);  	}  } diff --git a/arch/arm/mach-imx/mach-mx31moboard.c b/arch/arm/mach-imx/mach-mx31moboard.c index 016791f038b..d46290b288e 100644 --- a/arch/arm/mach-imx/mach-mx31moboard.c +++ b/arch/arm/mach-imx/mach-mx31moboard.c @@ -303,7 +303,7 @@ static struct imx_ssi_platform_data moboard_ssi_pdata = {  static struct spi_board_info moboard_spi_board_info[] __initdata = {  	{  		.modalias = "mc13783", -		.irq = IOMUX_TO_IRQ(MX31_PIN_GPIO1_3), +		/* irq number is run-time assigned */  		.max_speed_hz = 300000,  		.bus_num = 1,  		.chip_select = 0, @@ -473,10 +473,6 @@ static const struct gpio_led_platform_data mx31moboard_led_pdata __initconst = {  	.leds		= mx31moboard_leds,  }; -static const struct ipu_platform_data mx3_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct platform_device *devices[] __initdata = {  	&mx31moboard_flash,  }; @@ -494,7 +490,7 @@ static int __init mx31moboard_init_cam(void)  	int dma, ret = -ENOMEM;  	struct platform_device *pdev; -	imx31_add_ipu_core(&mx3_ipu_data); +	imx31_add_ipu_core();  	pdev = imx31_alloc_mx3_camera(&camera_pdata);  	if (IS_ERR(pdev)) @@ -544,7 +540,7 @@ static void __init mx31moboard_init(void)  	platform_add_devices(devices, ARRAY_SIZE(devices));  	gpio_led_register_device(-1, &mx31moboard_led_pdata); -	imx31_add_imx2_wdt(NULL); +	imx31_add_imx2_wdt();  	imx31_add_imx_uart0(&uart0_pdata);  	imx31_add_imx_uart4(&uart4_pdata); @@ -557,6 +553,8 @@ static void __init mx31moboard_init(void)  	gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3), "pmic-irq");  	gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3)); +	moboard_spi_board_info[0].irq = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3));  	spi_register_board_info(moboard_spi_board_info,  		ARRAY_SIZE(moboard_spi_board_info)); diff --git a/arch/arm/mach-imx/mach-mx35_3ds.c b/arch/arm/mach-imx/mach-mx35_3ds.c index 28aa19476de..504983c68aa 100644 --- a/arch/arm/mach-imx/mach-mx35_3ds.c +++ b/arch/arm/mach-imx/mach-mx35_3ds.c @@ -46,7 +46,6 @@  #include <mach/hardware.h>  #include <mach/common.h>  #include <mach/iomux-mx35.h> -#include <mach/irqs.h>  #include <mach/3ds_debugboard.h>  #include <video/platform_lcd.h> @@ -80,10 +79,6 @@ static const struct fb_videomode fb_modedb[] = {  	 },  }; -static const struct ipu_platform_data mx3_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct mx3fb_platform_data mx3fb_pdata __initdata = {  	.name = "Ceramate-CLAA070VC01",  	.mode = fb_modedb, @@ -136,8 +131,6 @@ static struct platform_device mx35_3ds_lcd = {  	.dev.platform_data = &mx35_3ds_lcd_data,  }; -#define EXPIO_PARENT_INT	gpio_to_irq(IMX_GPIO_NR(1, 1)) -  static const struct imxuart_platform_data uart_pdata __initconst = {  	.flags = IMXUART_HAVE_RTSCTS,  }; @@ -297,10 +290,6 @@ err:  	return ret;  } -static const struct ipu_platform_data mx35_3ds_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct i2c_board_info mx35_3ds_i2c_camera = {  	I2C_BOARD_INFO("ov2640", 0x30),  }; @@ -492,7 +481,7 @@ static struct i2c_board_info mx35_3ds_i2c_mc13892 = {  	I2C_BOARD_INFO("mc13892", 0x08),  	.platform_data = &mx35_3ds_mc13892_data, -	.irq = IMX_GPIO_TO_IRQ(GPIO_PMIC_INT), +	/* irq number is run-time assigned */  };  static void __init imx35_3ds_init_mc13892(void) @@ -504,6 +493,7 @@ static void __init imx35_3ds_init_mc13892(void)  		return;  	} +	mx35_3ds_i2c_mc13892.irq = gpio_to_irq(GPIO_PMIC_INT);  	i2c_register_board_info(0, &mx35_3ds_i2c_mc13892, 1);  } @@ -540,18 +530,18 @@ static const struct mxc_usbh_platform_data usb_host_pdata __initconst = {  	.portsc		= MXC_EHCI_MODE_SERIAL,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init mx35_3ds_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", mx35_3ds_otg_mode); @@ -571,7 +561,8 @@ static void __init mx35_3ds_init(void)  	mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads));  	imx35_add_fec(NULL); -	imx35_add_imx2_wdt(NULL); +	imx35_add_imx2_wdt(); +	imx35_add_mxc_rtc();  	platform_add_devices(devices, ARRAY_SIZE(devices));  	imx35_add_imx_uart0(&uart_pdata); @@ -587,7 +578,7 @@ static void __init mx35_3ds_init(void)  	imx35_add_mxc_nand(&mx35pdk_nand_board_info);  	imx35_add_sdhci_esdhc_imx(0, NULL); -	if (mxc_expio_init(MX35_CS5_BASE_ADDR, EXPIO_PARENT_INT)) +	if (mxc_expio_init(MX35_CS5_BASE_ADDR, IMX_GPIO_NR(1, 1)))  		pr_warn("Init of the debugboard failed, all "  				"devices on the debugboard are unusable.\n");  	imx35_add_imx_i2c0(&mx35_3ds_i2c0_data); @@ -595,7 +586,7 @@ static void __init mx35_3ds_init(void)  	i2c_register_board_info(  		0, i2c_devices_3ds, ARRAY_SIZE(i2c_devices_3ds)); -	imx35_add_ipu_core(&mx35_3ds_ipu_data); +	imx35_add_ipu_core();  	platform_device_register(&mx35_3ds_ov2640);  	imx35_3ds_init_camera(); diff --git a/arch/arm/mach-imx/mach-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c index 3c5b163923f..9ee84a4af63 100644 --- a/arch/arm/mach-imx/mach-mx51_3ds.c +++ b/arch/arm/mach-imx/mach-mx51_3ds.c @@ -26,7 +26,6 @@  #include "devices-imx51.h" -#define EXPIO_PARENT_INT	gpio_to_irq(IMX_GPIO_NR(1, 6))  #define MX51_3DS_ECSPI2_CS	(GPIO_PORTC + 28)  static iomux_v3_cfg_t mx51_3ds_pads[] = { @@ -148,13 +147,13 @@ static void __init mx51_3ds_init(void)  	spi_register_board_info(mx51_3ds_spi_nor_device,  				ARRAY_SIZE(mx51_3ds_spi_nor_device)); -	if (mxc_expio_init(MX51_CS5_BASE_ADDR, EXPIO_PARENT_INT)) +	if (mxc_expio_init(MX51_CS5_BASE_ADDR, IMX_GPIO_NR(1, 6)))  		printk(KERN_WARNING "Init of the debugboard failed, all "  				    "devices on the board are unusable.\n");  	imx51_add_sdhci_esdhc_imx(0, NULL);  	imx51_add_imx_keypad(&mx51_3ds_map_data); -	imx51_add_imx2_wdt(0, NULL); +	imx51_add_imx2_wdt(0);  }  static void __init mx51_3ds_timer_init(void) diff --git a/arch/arm/mach-imx/mach-mx51_babbage.c b/arch/arm/mach-imx/mach-mx51_babbage.c index dde397014d4..7b31cbde877 100644 --- a/arch/arm/mach-imx/mach-mx51_babbage.c +++ b/arch/arm/mach-imx/mach-mx51_babbage.c @@ -307,18 +307,18 @@ static const struct mxc_usbh_platform_data usbh1_config __initconst = {  	.portsc	= MXC_EHCI_MODE_ULPI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init babbage_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", babbage_otg_mode); @@ -411,7 +411,7 @@ static void __init mx51_babbage_init(void)  	spi_register_board_info(mx51_babbage_spi_board_info,  		ARRAY_SIZE(mx51_babbage_spi_board_info));  	imx51_add_ecspi(0, &mx51_babbage_spi_pdata); -	imx51_add_imx2_wdt(0, NULL); +	imx51_add_imx2_wdt(0);  }  static void __init mx51_babbage_timer_init(void) diff --git a/arch/arm/mach-imx/mach-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c index 05641980dc5..6c28e65f424 100644 --- a/arch/arm/mach-imx/mach-mx53_ard.c +++ b/arch/arm/mach-imx/mach-mx53_ard.c @@ -135,8 +135,7 @@ static struct resource ard_smsc911x_resources[] = {  		.flags = IORESOURCE_MEM,  	},  	{ -		.start =  IMX_GPIO_TO_IRQ(ARD_ETHERNET_INT_B), -		.end =  IMX_GPIO_TO_IRQ(ARD_ETHERNET_INT_B), +		/* irq number is run-time assigned */  		.flags = IORESOURCE_IRQ,  	},  }; @@ -240,10 +239,12 @@ static void __init mx53_ard_board_init(void)  	imx53_ard_common_init();  	mx53_ard_io_init();  	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +	ard_smsc911x_resources[1].start = gpio_to_irq(ARD_ETHERNET_INT_B); +	ard_smsc911x_resources[1].end = gpio_to_irq(ARD_ETHERNET_INT_B);  	platform_add_devices(devices, ARRAY_SIZE(devices));  	imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data); -	imx53_add_imx2_wdt(0, NULL); +	imx53_add_imx2_wdt(0);  	imx53_add_imx_i2c(1, &mx53_ard_i2c2_data);  	imx53_add_imx_i2c(2, &mx53_ard_i2c3_data);  	imx_add_gpio_keys(&ard_button_data); @@ -266,5 +267,6 @@ MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_ard_timer,  	.init_machine = mx53_ard_board_init, +	.init_late	= imx53_init_late,  	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx53_evk.c b/arch/arm/mach-imx/mach-mx53_evk.c index 5a72188b9cd..09fe2197b49 100644 --- a/arch/arm/mach-imx/mach-mx53_evk.c +++ b/arch/arm/mach-imx/mach-mx53_evk.c @@ -154,7 +154,7 @@ static void __init mx53_evk_board_init(void)  	spi_register_board_info(mx53_evk_spi_board_info,  		ARRAY_SIZE(mx53_evk_spi_board_info));  	imx53_add_ecspi(0, &mx53_evk_spi_data); -	imx53_add_imx2_wdt(0, NULL); +	imx53_add_imx2_wdt(0);  	gpio_led_register_device(-1, &mx53evk_leds_data);  } @@ -174,5 +174,6 @@ MACHINE_START(MX53_EVK, "Freescale MX53 EVK Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_evk_timer,  	.init_machine = mx53_evk_board_init, +	.init_late	= imx53_init_late,  	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx53_loco.c b/arch/arm/mach-imx/mach-mx53_loco.c index 37f67cac15a..8abe23c1d3c 100644 --- a/arch/arm/mach-imx/mach-mx53_loco.c +++ b/arch/arm/mach-imx/mach-mx53_loco.c @@ -283,7 +283,7 @@ static void __init mx53_loco_board_init(void)  	imx53_add_imx_uart(0, NULL);  	mx53_loco_fec_reset();  	imx53_add_fec(&mx53_loco_fec_data); -	imx53_add_imx2_wdt(0, NULL); +	imx53_add_imx2_wdt(0);  	ret = gpio_request_one(LOCO_ACCEL_EN, GPIOF_OUT_INIT_HIGH, "accel_en");  	if (ret) @@ -316,5 +316,6 @@ MACHINE_START(MX53_LOCO, "Freescale MX53 LOCO Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_loco_timer,  	.init_machine = mx53_loco_board_init, +	.init_late	= imx53_init_late,  	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx53_smd.c b/arch/arm/mach-imx/mach-mx53_smd.c index 8e972c5c3e1..b15d6a6d3b6 100644 --- a/arch/arm/mach-imx/mach-mx53_smd.c +++ b/arch/arm/mach-imx/mach-mx53_smd.c @@ -138,7 +138,7 @@ static void __init mx53_smd_board_init(void)  	mx53_smd_init_uart();  	mx53_smd_fec_reset();  	imx53_add_fec(&mx53_smd_fec_data); -	imx53_add_imx2_wdt(0, NULL); +	imx53_add_imx2_wdt(0);  	imx53_add_imx_i2c(0, &mx53_smd_i2c_data);  	imx53_add_sdhci_esdhc_imx(0, NULL);  	imx53_add_sdhci_esdhc_imx(1, NULL); @@ -163,5 +163,6 @@ MACHINE_START(MX53_SMD, "Freescale MX53 SMD Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_smd_timer,  	.init_machine = mx53_smd_board_init, +	.init_late	= imx53_init_late,  	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mxt_td60.c b/arch/arm/mach-imx/mach-mxt_td60.c index 8b3d3f07d89..0bf6d30aa32 100644 --- a/arch/arm/mach-imx/mach-mxt_td60.c +++ b/arch/arm/mach-imx/mach-mxt_td60.c @@ -213,13 +213,13 @@ static const struct imx_fb_platform_data mxt_td60_fb_data __initconst = {  static int mxt_td60_sdhc1_init(struct device *dev, irq_handler_t detect_irq,  				void *data)  { -	return request_irq(IRQ_GPIOF(8), detect_irq, IRQF_TRIGGER_FALLING, -				"sdhc1-card-detect", data); +	return request_irq(gpio_to_irq(IMX_GPIO_NR(6, 8)), detect_irq, +			   IRQF_TRIGGER_FALLING, "sdhc1-card-detect", data);  }  static void mxt_td60_sdhc1_exit(struct device *dev, void *data)  { -	free_irq(IRQ_GPIOF(8), data); +	free_irq(gpio_to_irq(IMX_GPIO_NR(6, 8)), data);  }  static const struct imxmmc_platform_data sdhc1_pdata __initconst = { diff --git a/arch/arm/mach-imx/mach-pca100.c b/arch/arm/mach-imx/mach-pca100.c index 541152e450c..de8516b7d69 100644 --- a/arch/arm/mach-imx/mach-pca100.c +++ b/arch/arm/mach-imx/mach-pca100.c @@ -36,7 +36,6 @@  #include <mach/hardware.h>  #include <mach/iomux-mx27.h>  #include <asm/mach/time.h> -#include <mach/irqs.h>  #include <mach/ulpi.h>  #include "devices-imx27.h" @@ -245,7 +244,7 @@ static int pca100_sdhc2_init(struct device *dev, irq_handler_t detect_irq,  {  	int ret; -	ret = request_irq(IRQ_GPIOC(29), detect_irq, +	ret = request_irq(gpio_to_irq(IMX_GPIO_NR(3, 29)), detect_irq,  			  IRQF_DISABLED | IRQF_TRIGGER_FALLING,  			  "imx-mmc-detect", data);  	if (ret) @@ -257,7 +256,7 @@ static int pca100_sdhc2_init(struct device *dev, irq_handler_t detect_irq,  static void pca100_sdhc2_exit(struct device *dev, void *data)  { -	free_irq(IRQ_GPIOC(29), data); +	free_irq(gpio_to_irq(IMX_GPIO_NR(3, 29)), data);  }  static const struct imxmmc_platform_data sdhc_pdata __initconst = { @@ -298,18 +297,18 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {  	.phy_mode       = FSL_USB2_PHY_ULPI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init pca100_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", pca100_otg_mode); @@ -408,8 +407,8 @@ static void __init pca100_init(void)  	imx27_add_imx_fb(&pca100_fb_data);  	imx27_add_fec(NULL); -	imx27_add_imx2_wdt(NULL); -	imx27_add_mxc_w1(NULL); +	imx27_add_imx2_wdt(); +	imx27_add_mxc_w1();  }  static void __init pca100_timer_init(void) diff --git a/arch/arm/mach-imx/mach-pcm037.c b/arch/arm/mach-imx/mach-pcm037.c index 0a40004154f..e3c45130fb3 100644 --- a/arch/arm/mach-imx/mach-pcm037.c +++ b/arch/arm/mach-imx/mach-pcm037.c @@ -225,8 +225,7 @@ static struct resource smsc911x_resources[] = {  		.end		= MX31_CS1_BASE_ADDR + 0x300 + SZ_64K - 1,  		.flags		= IORESOURCE_MEM,  	}, { -		.start		= IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), -		.end		= IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), +		/* irq number is run-time assigned */  		.flags		= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,  	},  }; @@ -371,7 +370,7 @@ static int pcm970_sdhc1_init(struct device *dev, irq_handler_t detect_irq,  	gpio_direction_input(SDHC1_GPIO_WP);  #endif -	ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_SCK6), detect_irq, +	ret = request_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_SCK6)), detect_irq,  			IRQF_DISABLED | IRQF_TRIGGER_FALLING,  				"sdhc-detect", data);  	if (ret) @@ -391,7 +390,7 @@ err_gpio_free:  static void pcm970_sdhc1_exit(struct device *dev, void *data)  { -	free_irq(IOMUX_TO_IRQ(MX31_PIN_SCK6), data); +	free_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_SCK6)), data);  	gpio_free(SDHC1_GPIO_DET);  	gpio_free(SDHC1_GPIO_WP);  } @@ -442,10 +441,6 @@ static struct platform_device *devices[] __initdata = {  	&pcm037_mt9v022,  }; -static const struct ipu_platform_data mx3_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static const struct fb_videomode fb_modedb[] = {  	{  		/* 240x320 @ 60 Hz Sharp */ @@ -511,8 +506,7 @@ static struct resource pcm970_sja1000_resources[] = {  		.end     = MX31_CS5_BASE_ADDR + 0x100 - 1,  		.flags   = IORESOURCE_MEM,  	}, { -		.start   = IOMUX_TO_IRQ(IOMUX_PIN(48, 105)), -		.end     = IOMUX_TO_IRQ(IOMUX_PIN(48, 105)), +		/* irq number is run-time assigned */  		.flags   = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,  	},  }; @@ -557,18 +551,18 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {  	.phy_mode       = FSL_USB2_PHY_ULPI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init pcm037_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", pcm037_otg_mode); @@ -619,13 +613,13 @@ static void __init pcm037_init(void)  	platform_add_devices(devices, ARRAY_SIZE(devices)); -	imx31_add_imx2_wdt(NULL); +	imx31_add_imx2_wdt();  	imx31_add_imx_uart0(&uart_pdata);  	/* XXX: should't this have .flags = 0 (i.e. no RTSCTS) on PCM037_EET? */  	imx31_add_imx_uart1(&uart_pdata);  	imx31_add_imx_uart2(&uart_pdata); -	imx31_add_mxc_w1(NULL); +	imx31_add_mxc_w1();  	/* LAN9217 IRQ pin */  	ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1), "lan9217-irq"); @@ -633,6 +627,10 @@ static void __init pcm037_init(void)  		pr_warning("could not get LAN irq gpio\n");  	else {  		gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1)); +		smsc911x_resources[1].start = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1)); +		smsc911x_resources[1].end = +			gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1));  		platform_device_register(&pcm037_eth);  	} @@ -646,7 +644,7 @@ static void __init pcm037_init(void)  	imx31_add_mxc_nand(&pcm037_nand_board_info);  	imx31_add_mxc_mmc(0, &sdhc_pdata); -	imx31_add_ipu_core(&mx3_ipu_data); +	imx31_add_ipu_core();  	imx31_add_mx3_sdc_fb(&mx3fb_pdata);  	/* CSI */ @@ -659,6 +657,10 @@ static void __init pcm037_init(void)  	pcm037_init_camera(); +	pcm970_sja1000_resources[1].start = +			gpio_to_irq(IOMUX_TO_GPIO(IOMUX_PIN(48, 105))); +	pcm970_sja1000_resources[1].end = +			gpio_to_irq(IOMUX_TO_GPIO(IOMUX_PIN(48, 105)));  	platform_device_register(&pcm970_sja1000);  	if (otg_mode_host) { diff --git a/arch/arm/mach-imx/mach-pcm038.c b/arch/arm/mach-imx/mach-pcm038.c index 2f3debe2a11..95f49d936fd 100644 --- a/arch/arm/mach-imx/mach-pcm038.c +++ b/arch/arm/mach-imx/mach-pcm038.c @@ -27,6 +27,7 @@  #include <linux/mfd/mc13783.h>  #include <linux/spi/spi.h>  #include <linux/irq.h> +#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -274,7 +275,7 @@ static struct mc13xxx_platform_data pcm038_pmic = {  static struct spi_board_info pcm038_spi_board_info[] __initdata = {  	{  		.modalias = "mc13783", -		.irq = IRQ_GPIOB(23), +		/* irq number is run-time assigned */  		.max_speed_hz = 300000,  		.bus_num = 0,  		.chip_select = 0, @@ -325,6 +326,7 @@ static void __init pcm038_init(void)  	mxc_gpio_mode(GPIO_PORTB | 23 | GPIO_GPIO | GPIO_IN);  	imx27_add_spi_imx0(&pcm038_spi0_data); +	pcm038_spi_board_info[0].irq = gpio_to_irq(IMX_GPIO_NR(2, 23));  	spi_register_board_info(pcm038_spi_board_info,  				ARRAY_SIZE(pcm038_spi_board_info)); @@ -332,8 +334,8 @@ static void __init pcm038_init(void)  	imx27_add_fec(NULL);  	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); -	imx27_add_imx2_wdt(NULL); -	imx27_add_mxc_w1(NULL); +	imx27_add_imx2_wdt(); +	imx27_add_mxc_w1();  #ifdef CONFIG_MACH_PCM970_BASEBOARD  	pcm970_baseboard_init(); diff --git a/arch/arm/mach-imx/mach-pcm043.c b/arch/arm/mach-imx/mach-pcm043.c index 73585f55cca..e4bd4387e34 100644 --- a/arch/arm/mach-imx/mach-pcm043.c +++ b/arch/arm/mach-imx/mach-pcm043.c @@ -76,10 +76,6 @@ static const struct fb_videomode fb_modedb[] = {  	},  }; -static const struct ipu_platform_data mx3_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct mx3fb_platform_data mx3fb_pdata __initdata = {  	.name		= "Sharp-LQ035Q7",  	.mode		= fb_modedb, @@ -330,18 +326,18 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {  	.phy_mode       = FSL_USB2_PHY_UTMI,  }; -static int otg_mode_host; +static bool otg_mode_host __initdata;  static int __init pcm043_otg_mode(char *options)  {  	if (!strcmp(options, "host")) -		otg_mode_host = 1; +		otg_mode_host = true;  	else if (!strcmp(options, "device")) -		otg_mode_host = 0; +		otg_mode_host = false;  	else  		pr_info("otg_mode neither \"host\" nor \"device\". "  			"Defaulting to device\n"); -	return 0; +	return 1;  }  __setup("otg_mode=", pcm043_otg_mode); @@ -363,7 +359,7 @@ static void __init pcm043_init(void)  	imx35_add_fec(NULL);  	platform_add_devices(devices, ARRAY_SIZE(devices)); -	imx35_add_imx2_wdt(NULL); +	imx35_add_imx2_wdt();  	imx35_add_imx_uart0(&uart_pdata);  	imx35_add_mxc_nand(&pcm037_nand_board_info); @@ -376,7 +372,7 @@ static void __init pcm043_init(void)  	imx35_add_imx_i2c0(&pcm043_i2c0_data); -	imx35_add_ipu_core(&mx3_ipu_data); +	imx35_add_ipu_core();  	imx35_add_mx3_sdc_fb(&mx3fb_pdata);  	if (otg_mode_host) { diff --git a/arch/arm/mach-imx/mach-qong.c b/arch/arm/mach-imx/mach-qong.c index 260621055b6..fb25fbd3122 100644 --- a/arch/arm/mach-imx/mach-qong.c +++ b/arch/arm/mach-imx/mach-qong.c @@ -22,7 +22,6 @@  #include <linux/gpio.h>  #include <mach/hardware.h> -#include <mach/irqs.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/time.h> @@ -51,8 +50,6 @@  	(QONG_FPGA_BASEADDR + QONG_DNET_ID * QONG_FPGA_PERIPH_SIZE)  #define QONG_DNET_SIZE		0x00001000 -#define QONG_FPGA_IRQ		IOMUX_TO_IRQ(MX31_PIN_DTR_DCE1) -  static const struct imxuart_platform_data uart_pdata __initconst = {  	.flags = IMXUART_HAVE_RTSCTS,  }; @@ -78,8 +75,7 @@ static struct resource dnet_resources[] = {  		.end	= QONG_DNET_BASEADDR + QONG_DNET_SIZE - 1,  		.flags	= IORESOURCE_MEM,  	}, { -		.start	= QONG_FPGA_IRQ, -		.end	= QONG_FPGA_IRQ, +		/* irq number is run-time assigned */  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -95,6 +91,10 @@ static int __init qong_init_dnet(void)  {  	int ret; +	dnet_resources[1].start = +		gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1)); +	dnet_resources[1].end = +		gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1));  	ret = platform_device_register(&dnet_device);  	return ret;  } @@ -252,7 +252,7 @@ static void __init qong_init(void)  	mxc_init_imx_uart();  	qong_init_nor_mtd();  	qong_init_fpga(); -	imx31_add_imx2_wdt(NULL); +	imx31_add_imx2_wdt();  }  static void __init qong_timer_init(void) diff --git a/arch/arm/mach-imx/mach-scb9328.c b/arch/arm/mach-imx/mach-scb9328.c index cb9ceae2f64..67ff38e9a3c 100644 --- a/arch/arm/mach-imx/mach-scb9328.c +++ b/arch/arm/mach-imx/mach-scb9328.c @@ -14,6 +14,7 @@  #include <linux/mtd/physmap.h>  #include <linux/interrupt.h>  #include <linux/dm9000.h> +#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -21,7 +22,6 @@  #include <mach/common.h>  #include <mach/hardware.h> -#include <mach/irqs.h>  #include <mach/iomux-mx1.h>  #include "devices-imx1.h" @@ -78,8 +78,7 @@ static struct resource dm9000x_resources[] = {  		.end	= MX1_CS5_PHYS + 5,  		.flags	= IORESOURCE_MEM,	/* data access */  	}, { -		.start	= IRQ_GPIOC(3), -		.end	= IRQ_GPIOC(3), +		/* irq number is run-time assigned */  		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,  	},  }; @@ -123,6 +122,8 @@ static void __init scb9328_init(void)  	imx1_add_imx_uart0(&uart_pdata);  	printk(KERN_INFO"Scb9328: Adding devices\n"); +	dm9000x_resources[2].start = gpio_to_irq(IMX_GPIO_NR(3, 3)); +	dm9000x_resources[2].end = gpio_to_irq(IMX_GPIO_NR(3, 3));  	platform_add_devices(devices, ARRAY_SIZE(devices));  } diff --git a/arch/arm/mach-imx/mach-vpr200.c b/arch/arm/mach-imx/mach-vpr200.c index add8c69c6c1..39eb7960e2a 100644 --- a/arch/arm/mach-imx/mach-vpr200.c +++ b/arch/arm/mach-imx/mach-vpr200.c @@ -31,7 +31,6 @@  #include <mach/hardware.h>  #include <mach/common.h>  #include <mach/iomux-mx35.h> -#include <mach/irqs.h>  #include <linux/i2c.h>  #include <linux/i2c/at24.h> @@ -87,10 +86,6 @@ static const struct fb_videomode fb_modedb[] = {  	}  }; -static const struct ipu_platform_data mx3_ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static struct mx3fb_platform_data mx3fb_pdata __initdata = {  	.name		= "PT0708048",  	.mode		= fb_modedb, @@ -162,7 +157,7 @@ static struct i2c_board_info vpr200_i2c_devices[] = {  	}, {  		I2C_BOARD_INFO("mc13892", 0x08),  		.platform_data = &vpr200_pmic, -		.irq = IMX_GPIO_TO_IRQ(GPIO_PMIC_INT), +		/* irq number is run-time assigned */  	}  }; @@ -272,7 +267,7 @@ static void __init vpr200_board_init(void)  	mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads));  	imx35_add_fec(NULL); -	imx35_add_imx2_wdt(NULL); +	imx35_add_imx2_wdt();  	imx_add_gpio_keys(&vpr200_gpio_keys_data);  	platform_add_devices(devices, ARRAY_SIZE(devices)); @@ -290,7 +285,7 @@ static void __init vpr200_board_init(void)  	imx35_add_imx_uart0(NULL);  	imx35_add_imx_uart2(NULL); -	imx35_add_ipu_core(&mx3_ipu_data); +	imx35_add_ipu_core();  	imx35_add_mx3_sdc_fb(&mx3fb_pdata);  	imx35_add_fsl_usb2_udc(&otg_device_pdata); @@ -299,6 +294,7 @@ static void __init vpr200_board_init(void)  	imx35_add_mxc_nand(&vpr200_nand_board_info);  	imx35_add_sdhci_esdhc_imx(0, NULL); +	vpr200_i2c_devices[1].irq = gpio_to_irq(GPIO_PMIC_INT);  	i2c_register_board_info(0, vpr200_i2c_devices,  			ARRAY_SIZE(vpr200_i2c_devices)); diff --git a/arch/arm/mach-imx/mm-imx1.c b/arch/arm/mach-imx/mm-imx1.c index fcafd3dafb8..6d60d51868b 100644 --- a/arch/arm/mach-imx/mm-imx1.c +++ b/arch/arm/mach-imx/mm-imx1.c @@ -24,7 +24,6 @@  #include <mach/common.h>  #include <mach/hardware.h> -#include <mach/irqs.h>  #include <mach/iomux-v1.h>  static struct map_desc imx_io_desc[] __initdata = { diff --git a/arch/arm/mach-imx/mm-imx21.c b/arch/arm/mach-imx/mm-imx21.c index 5f43905e529..d056dad0940 100644 --- a/arch/arm/mach-imx/mm-imx21.c +++ b/arch/arm/mach-imx/mm-imx21.c @@ -26,7 +26,6 @@  #include <mach/devices-common.h>  #include <asm/pgtable.h>  #include <asm/mach/map.h> -#include <mach/irqs.h>  #include <mach/iomux-v1.h>  /* MX21 memory map definition */ diff --git a/arch/arm/mach-imx/mm-imx25.c b/arch/arm/mach-imx/mm-imx25.c index 6ff37140a4f..f3f5c6542ab 100644 --- a/arch/arm/mach-imx/mm-imx25.c +++ b/arch/arm/mach-imx/mm-imx25.c @@ -29,7 +29,6 @@  #include <mach/hardware.h>  #include <mach/mx25.h>  #include <mach/iomux-v3.h> -#include <mach/irqs.h>  /*   * This table defines static virtual address mappings for I/O regions. @@ -90,11 +89,11 @@ static const struct resource imx25_audmux_res[] __initconst = {  void __init imx25_soc_init(void)  { -	/* i.mx25 has the i.mx31 type gpio */ -	mxc_register_gpio("imx31-gpio", 0, MX25_GPIO1_BASE_ADDR, SZ_16K, MX25_INT_GPIO1, 0); -	mxc_register_gpio("imx31-gpio", 1, MX25_GPIO2_BASE_ADDR, SZ_16K, MX25_INT_GPIO2, 0); -	mxc_register_gpio("imx31-gpio", 2, MX25_GPIO3_BASE_ADDR, SZ_16K, MX25_INT_GPIO3, 0); -	mxc_register_gpio("imx31-gpio", 3, MX25_GPIO4_BASE_ADDR, SZ_16K, MX25_INT_GPIO4, 0); +	/* i.mx25 has the i.mx35 type gpio */ +	mxc_register_gpio("imx35-gpio", 0, MX25_GPIO1_BASE_ADDR, SZ_16K, MX25_INT_GPIO1, 0); +	mxc_register_gpio("imx35-gpio", 1, MX25_GPIO2_BASE_ADDR, SZ_16K, MX25_INT_GPIO2, 0); +	mxc_register_gpio("imx35-gpio", 2, MX25_GPIO3_BASE_ADDR, SZ_16K, MX25_INT_GPIO3, 0); +	mxc_register_gpio("imx35-gpio", 3, MX25_GPIO4_BASE_ADDR, SZ_16K, MX25_INT_GPIO4, 0);  	pinctrl_provide_dummies();  	/* i.mx25 has the i.mx35 type sdma */ diff --git a/arch/arm/mach-imx/mm-imx27.c b/arch/arm/mach-imx/mm-imx27.c index 25662558e01..e7e24afc45e 100644 --- a/arch/arm/mach-imx/mm-imx27.c +++ b/arch/arm/mach-imx/mm-imx27.c @@ -26,7 +26,6 @@  #include <mach/devices-common.h>  #include <asm/pgtable.h>  #include <asm/mach/map.h> -#include <mach/irqs.h>  #include <mach/iomux-v1.h>  /* MX27 memory map definition */ diff --git a/arch/arm/mach-imx/mm-imx3.c b/arch/arm/mach-imx/mm-imx3.c index a8983b9778d..9d2c843bde0 100644 --- a/arch/arm/mach-imx/mm-imx3.c +++ b/arch/arm/mach-imx/mm-imx3.c @@ -30,7 +30,6 @@  #include <mach/devices-common.h>  #include <mach/hardware.h>  #include <mach/iomux-v3.h> -#include <mach/irqs.h>  #include "crmregs-imx3.h" @@ -273,10 +272,9 @@ void __init imx35_soc_init(void)  	imx3_init_l2x0(); -	/* i.mx35 has the i.mx31 type gpio */ -	mxc_register_gpio("imx31-gpio", 0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0); -	mxc_register_gpio("imx31-gpio", 1, MX35_GPIO2_BASE_ADDR, SZ_16K, MX35_INT_GPIO2, 0); -	mxc_register_gpio("imx31-gpio", 2, MX35_GPIO3_BASE_ADDR, SZ_16K, MX35_INT_GPIO3, 0); +	mxc_register_gpio("imx35-gpio", 0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0); +	mxc_register_gpio("imx35-gpio", 1, MX35_GPIO2_BASE_ADDR, SZ_16K, MX35_INT_GPIO2, 0); +	mxc_register_gpio("imx35-gpio", 2, MX35_GPIO3_BASE_ADDR, SZ_16K, MX35_INT_GPIO3, 0);  	pinctrl_provide_dummies();  	if (to_version == 1) { diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c index 1d003053d56..52d8f534be1 100644 --- a/arch/arm/mach-imx/mm-imx5.c +++ b/arch/arm/mach-imx/mm-imx5.c @@ -16,7 +16,6 @@  #include <linux/clk.h>  #include <linux/pinctrl/machine.h> -#include <asm/system_misc.h>  #include <asm/mach/map.h>  #include <mach/hardware.h> @@ -24,24 +23,6 @@  #include <mach/devices-common.h>  #include <mach/iomux-v3.h> -static struct clk *gpc_dvfs_clk; - -static void imx5_idle(void) -{ -	/* gpc clock is needed for SRPG */ -	if (gpc_dvfs_clk == NULL) { -		gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); -		if (IS_ERR(gpc_dvfs_clk)) -			return; -		clk_prepare(gpc_dvfs_clk); -	} -	clk_enable(gpc_dvfs_clk); -	mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); -	if (!tzic_enable_wake()) -		cpu_do_idle(); -	clk_disable(gpc_dvfs_clk); -} -  /*   * Define the MX50 memory map.   */ @@ -105,7 +86,6 @@ void __init imx51_init_early(void)  	mxc_set_cpu_type(MXC_CPU_MX51);  	mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR));  	mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); -	arm_pm_idle = imx5_idle;  }  void __init imx53_init_early(void) @@ -181,13 +161,13 @@ static const struct resource imx53_audmux_res[] __initconst = {  void __init imx50_soc_init(void)  { -	/* i.mx50 has the i.mx31 type gpio */ -	mxc_register_gpio("imx31-gpio", 0, MX50_GPIO1_BASE_ADDR, SZ_16K, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH); -	mxc_register_gpio("imx31-gpio", 1, MX50_GPIO2_BASE_ADDR, SZ_16K, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH); -	mxc_register_gpio("imx31-gpio", 2, MX50_GPIO3_BASE_ADDR, SZ_16K, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH); -	mxc_register_gpio("imx31-gpio", 3, MX50_GPIO4_BASE_ADDR, SZ_16K, MX50_INT_GPIO4_LOW, MX50_INT_GPIO4_HIGH); -	mxc_register_gpio("imx31-gpio", 4, MX50_GPIO5_BASE_ADDR, SZ_16K, MX50_INT_GPIO5_LOW, MX50_INT_GPIO5_HIGH); -	mxc_register_gpio("imx31-gpio", 5, MX50_GPIO6_BASE_ADDR, SZ_16K, MX50_INT_GPIO6_LOW, MX50_INT_GPIO6_HIGH); +	/* i.mx50 has the i.mx35 type gpio */ +	mxc_register_gpio("imx35-gpio", 0, MX50_GPIO1_BASE_ADDR, SZ_16K, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH); +	mxc_register_gpio("imx35-gpio", 1, MX50_GPIO2_BASE_ADDR, SZ_16K, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH); +	mxc_register_gpio("imx35-gpio", 2, MX50_GPIO3_BASE_ADDR, SZ_16K, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH); +	mxc_register_gpio("imx35-gpio", 3, MX50_GPIO4_BASE_ADDR, SZ_16K, MX50_INT_GPIO4_LOW, MX50_INT_GPIO4_HIGH); +	mxc_register_gpio("imx35-gpio", 4, MX50_GPIO5_BASE_ADDR, SZ_16K, MX50_INT_GPIO5_LOW, MX50_INT_GPIO5_HIGH); +	mxc_register_gpio("imx35-gpio", 5, MX50_GPIO6_BASE_ADDR, SZ_16K, MX50_INT_GPIO6_LOW, MX50_INT_GPIO6_HIGH);  	/* i.mx50 has the i.mx31 type audmux */  	platform_device_register_simple("imx31-audmux", 0, imx50_audmux_res, @@ -196,11 +176,11 @@ void __init imx50_soc_init(void)  void __init imx51_soc_init(void)  { -	/* i.mx51 has the i.mx31 type gpio */ -	mxc_register_gpio("imx31-gpio", 0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_INT_GPIO1_LOW, MX51_INT_GPIO1_HIGH); -	mxc_register_gpio("imx31-gpio", 1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_INT_GPIO2_LOW, MX51_INT_GPIO2_HIGH); -	mxc_register_gpio("imx31-gpio", 2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_INT_GPIO3_LOW, MX51_INT_GPIO3_HIGH); -	mxc_register_gpio("imx31-gpio", 3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_INT_GPIO4_LOW, MX51_INT_GPIO4_HIGH); +	/* i.mx51 has the i.mx35 type gpio */ +	mxc_register_gpio("imx35-gpio", 0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_INT_GPIO1_LOW, MX51_INT_GPIO1_HIGH); +	mxc_register_gpio("imx35-gpio", 1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_INT_GPIO2_LOW, MX51_INT_GPIO2_HIGH); +	mxc_register_gpio("imx35-gpio", 2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_INT_GPIO3_LOW, MX51_INT_GPIO3_HIGH); +	mxc_register_gpio("imx35-gpio", 3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_INT_GPIO4_LOW, MX51_INT_GPIO4_HIGH);  	pinctrl_provide_dummies(); @@ -218,14 +198,14 @@ void __init imx51_soc_init(void)  void __init imx53_soc_init(void)  { -	/* i.mx53 has the i.mx31 type gpio */ -	mxc_register_gpio("imx31-gpio", 0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH); -	mxc_register_gpio("imx31-gpio", 1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH); -	mxc_register_gpio("imx31-gpio", 2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH); -	mxc_register_gpio("imx31-gpio", 3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH); -	mxc_register_gpio("imx31-gpio", 4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH); -	mxc_register_gpio("imx31-gpio", 5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH); -	mxc_register_gpio("imx31-gpio", 6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH); +	/* i.mx53 has the i.mx35 type gpio */ +	mxc_register_gpio("imx35-gpio", 0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH); +	mxc_register_gpio("imx35-gpio", 1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH); +	mxc_register_gpio("imx35-gpio", 2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH); +	mxc_register_gpio("imx35-gpio", 3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH); +	mxc_register_gpio("imx35-gpio", 4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH); +	mxc_register_gpio("imx35-gpio", 5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH); +	mxc_register_gpio("imx35-gpio", 6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH);  	pinctrl_provide_dummies();  	/* i.mx53 has the i.mx35 type sdma */ @@ -243,4 +223,10 @@ void __init imx53_soc_init(void)  void __init imx51_init_late(void)  {  	mx51_neon_fixup(); +	imx51_pm_init(); +} + +void __init imx53_init_late(void) +{ +	imx53_pm_init();  } diff --git a/arch/arm/mach-imx/mx31lilly-db.c b/arch/arm/mach-imx/mx31lilly-db.c index 7d26f766a4e..29e890f9205 100644 --- a/arch/arm/mach-imx/mx31lilly-db.c +++ b/arch/arm/mach-imx/mx31lilly-db.c @@ -130,7 +130,8 @@ static int mxc_mmc1_init(struct device *dev,  	gpio_direction_input(gpio_det);  	gpio_direction_input(gpio_wp); -	ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO1_1), detect_irq, +	ret = request_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_1)), +			  detect_irq,  			  IRQF_DISABLED | IRQF_TRIGGER_FALLING,  			  "MMC detect", data);  	if (ret) @@ -151,7 +152,7 @@ static void mxc_mmc1_exit(struct device *dev, void *data)  {  	gpio_free(gpio_det);  	gpio_free(gpio_wp); -	free_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO1_1), data); +	free_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_1)), data);  }  static const struct imxmmc_platform_data mmc_pdata __initconst = { @@ -161,10 +162,6 @@ static const struct imxmmc_platform_data mmc_pdata __initconst = {  };  /* Framebuffer support */ -static const struct ipu_platform_data ipu_data __initconst = { -	.irq_base = MXC_IPU_IRQ_START, -}; -  static const struct fb_videomode fb_modedb = {  	/* 640x480 TFT panel (IPS-056T) */  	.name		= "CRT-VGA", @@ -198,7 +195,7 @@ static void __init mx31lilly_init_fb(void)  		return;  	} -	imx31_add_ipu_core(&ipu_data); +	imx31_add_ipu_core();  	imx31_add_mx3_sdc_fb(&fb_pdata);  	gpio_direction_output(LCD_VCC_EN_GPIO, 1);  } diff --git a/arch/arm/mach-imx/mx31lite-db.c b/arch/arm/mach-imx/mx31lite-db.c index bf0fb87946b..83d17d9e0bc 100644 --- a/arch/arm/mach-imx/mx31lite-db.c +++ b/arch/arm/mach-imx/mx31lite-db.c @@ -116,7 +116,8 @@ static int mxc_mmc1_init(struct device *dev,  	gpio_direction_input(gpio_det);  	gpio_direction_input(gpio_wp); -	ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_DCD_DCE1), detect_irq, +	ret = request_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1)), +			  detect_irq,  			  IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,  			  "MMC detect", data);  	if (ret) @@ -137,7 +138,7 @@ static void mxc_mmc1_exit(struct device *dev, void *data)  {  	gpio_free(gpio_det);  	gpio_free(gpio_wp); -	free_irq(IOMUX_TO_IRQ(MX31_PIN_DCD_DCE1), data); +	free_irq(gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1)), data);  }  static const struct imxmmc_platform_data mmc_pdata __initconst = { @@ -191,6 +192,6 @@ void __init mx31lite_db_init(void)  	imx31_add_mxc_mmc(0, &mmc_pdata);  	imx31_add_spi_imx0(&spi0_pdata);  	gpio_led_register_device(-1, &litekit_led_platform_data); -	imx31_add_imx2_wdt(NULL); -	imx31_add_mxc_rtc(NULL); +	imx31_add_imx2_wdt(); +	imx31_add_mxc_rtc();  } diff --git a/arch/arm/mach-imx/mx51_efika.c b/arch/arm/mach-imx/mx51_efika.c index ec6ca91b299..ee870c49bc6 100644 --- a/arch/arm/mach-imx/mx51_efika.c +++ b/arch/arm/mach-imx/mx51_efika.c @@ -587,7 +587,7 @@ static struct spi_board_info mx51_efika_spi_board_info[] __initdata = {  		.bus_num = 0,  		.chip_select = 0,  		.platform_data = &mx51_efika_mc13892_data, -		.irq = IMX_GPIO_TO_IRQ(EFIKAMX_PMIC), +		/* irq number is run-time assigned */  	},  }; @@ -620,6 +620,7 @@ void __init efika_board_common_init(void)  	gpio_request(EFIKAMX_PMIC, "pmic irq");  	gpio_direction_input(EFIKAMX_PMIC); +	mx51_efika_spi_board_info[1].irq = gpio_to_irq(EFIKAMX_PMIC);  	spi_register_board_info(mx51_efika_spi_board_info,  		ARRAY_SIZE(mx51_efika_spi_board_info));  	imx51_add_ecspi(0, &mx51_efika_spi_pdata); diff --git a/arch/arm/mach-imx/pcm970-baseboard.c b/arch/arm/mach-imx/pcm970-baseboard.c index 99afbc3f43a..9917e2ff51d 100644 --- a/arch/arm/mach-imx/pcm970-baseboard.c +++ b/arch/arm/mach-imx/pcm970-baseboard.c @@ -95,14 +95,14 @@ static int pcm970_sdhc2_init(struct device *dev, irq_handler_t detect_irq, void  {  	int ret; -	ret = request_irq(IRQ_GPIOC(29), detect_irq, IRQF_TRIGGER_FALLING, -				"imx-mmc-detect", data); +	ret = request_irq(gpio_to_irq(IMX_GPIO_NR(3, 29)), detect_irq, +			  IRQF_TRIGGER_FALLING, "imx-mmc-detect", data);  	if (ret)  		return ret;  	ret = gpio_request(GPIO_PORTC + 28, "imx-mmc-ro");  	if (ret) { -		free_irq(IRQ_GPIOC(29), data); +		free_irq(gpio_to_irq(IMX_GPIO_NR(3, 29)), data);  		return ret;  	} @@ -113,7 +113,7 @@ static int pcm970_sdhc2_init(struct device *dev, irq_handler_t detect_irq, void  static void pcm970_sdhc2_exit(struct device *dev, void *data)  { -	free_irq(IRQ_GPIOC(29), data); +	free_irq(gpio_to_irq(IMX_GPIO_NR(3, 29)), data);  	gpio_free(GPIO_PORTC + 28);  } @@ -192,8 +192,7 @@ static struct resource pcm970_sja1000_resources[] = {  		.end     = MX27_CS4_BASE_ADDR + 0x100 - 1,  		.flags   = IORESOURCE_MEM,  	}, { -		.start   = IRQ_GPIOE(19), -		.end     = IRQ_GPIOE(19), +		/* irq number is run-time assigned */  		.flags   = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,  	},  }; @@ -227,5 +226,7 @@ void __init pcm970_baseboard_init(void)  	imx27_add_imx_fb(&pcm038_fb_data);  	mxc_gpio_mode(GPIO_PORTC | 28 | GPIO_GPIO | GPIO_IN);  	imx27_add_mxc_mmc(1, &sdhc_pdata); +	pcm970_sja1000_resources[1].start = gpio_to_irq(IMX_GPIO_NR(5, 19)); +	pcm970_sja1000_resources[1].end = gpio_to_irq(IMX_GPIO_NR(5, 19));  	platform_device_register(&pcm970_sja1000);  } diff --git a/arch/arm/mach-imx/pm-imx5.c b/arch/arm/mach-imx/pm-imx5.c index e26a9cb05ed..19621ed1ffa 100644 --- a/arch/arm/mach-imx/pm-imx5.c +++ b/arch/arm/mach-imx/pm-imx5.c @@ -12,19 +12,30 @@  #include <linux/clk.h>  #include <linux/io.h>  #include <linux/err.h> +#include <linux/export.h>  #include <asm/cacheflush.h> +#include <asm/system_misc.h>  #include <asm/tlbflush.h>  #include <mach/common.h> +#include <mach/cpuidle.h>  #include <mach/hardware.h>  #include "crm-regs-imx5.h" -static struct clk *gpc_dvfs_clk; +/* + * The WAIT_UNCLOCKED_POWER_OFF state only requires <= 500ns to exit. + * This is also the lowest power state possible without affecting + * non-cpu parts of the system.  For these reasons, imx5 should default + * to always using this state for cpu idling.  The PM_SUSPEND_STANDBY also + * uses this state and needs to take no action when registers remain confgiured + * for this state. + */ +#define IMX5_DEFAULT_CPU_IDLE_STATE WAIT_UNCLOCKED_POWER_OFF  /*   * set cpu low power mode before WFI instruction. This function is called   * mx5 because it can be used for mx50, mx51, and mx53.   */ -void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode) +static void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)  {  	u32 plat_lpc, arm_srpgcr, ccm_clpcr;  	u32 empgc0, empgc1; @@ -87,11 +98,6 @@ void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)  	}  } -static int mx5_suspend_prepare(void) -{ -	return clk_prepare_enable(gpc_dvfs_clk); -} -  static int mx5_suspend_enter(suspend_state_t state)  {  	switch (state) { @@ -99,7 +105,7 @@ static int mx5_suspend_enter(suspend_state_t state)  		mx5_cpu_lp_set(STOP_POWER_OFF);  		break;  	case PM_SUSPEND_STANDBY: -		mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); +		/* DEFAULT_IDLE_STATE already configured */  		break;  	default:  		return -EINVAL; @@ -114,12 +120,10 @@ static int mx5_suspend_enter(suspend_state_t state)  		__raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR);  	}  	cpu_do_idle(); -	return 0; -} -static void mx5_suspend_finish(void) -{ -	clk_disable_unprepare(gpc_dvfs_clk); +	/* return registers to default idle state */ +	mx5_cpu_lp_set(IMX5_DEFAULT_CPU_IDLE_STATE); +	return 0;  }  static int mx5_pm_valid(suspend_state_t state) @@ -129,25 +133,80 @@ static int mx5_pm_valid(suspend_state_t state)  static const struct platform_suspend_ops mx5_suspend_ops = {  	.valid = mx5_pm_valid, -	.prepare = mx5_suspend_prepare,  	.enter = mx5_suspend_enter, -	.finish = mx5_suspend_finish,  }; -static int __init mx5_pm_init(void) +static inline int imx5_cpu_do_idle(void) +{ +	int ret = tzic_enable_wake(); + +	if (likely(!ret)) +		cpu_do_idle(); + +	return ret; +} + +static void imx5_pm_idle(void) +{ +	imx5_cpu_do_idle(); +} + +static int imx5_cpuidle_enter(struct cpuidle_device *dev, +				struct cpuidle_driver *drv, int idx) +{ +	int ret; + +	ret = imx5_cpu_do_idle(); +	if (ret < 0) +		return ret; + +	return idx; +} + +static struct cpuidle_driver imx5_cpuidle_driver = { +	.name			= "imx5_cpuidle", +	.owner			= THIS_MODULE, +	.en_core_tk_irqen	= 1, +	.states[0]	= { +		.enter			= imx5_cpuidle_enter, +		.exit_latency		= 2, +		.target_residency	= 1, +		.flags			= CPUIDLE_FLAG_TIME_VALID, +		.name			= "IMX5 SRPG", +		.desc			= "CPU state retained,powered off", +	}, +	.state_count		= 1, +}; + +static int __init imx5_pm_common_init(void)  { -	if (!cpu_is_mx51() && !cpu_is_mx53()) -		return 0; +	int ret; +	struct clk *gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); -	if (gpc_dvfs_clk == NULL) -		gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); +	if (IS_ERR(gpc_dvfs_clk)) +		return PTR_ERR(gpc_dvfs_clk); -	if (!IS_ERR(gpc_dvfs_clk)) { -		if (cpu_is_mx51()) -			suspend_set_ops(&mx5_suspend_ops); -	} else -		return -EPERM; +	ret = clk_prepare_enable(gpc_dvfs_clk); +	if (ret) +		return ret; +	arm_pm_idle = imx5_pm_idle; + +	/* Set the registers to the default cpu idle state. */ +	mx5_cpu_lp_set(IMX5_DEFAULT_CPU_IDLE_STATE); + +	imx_cpuidle_init(&imx5_cpuidle_driver);  	return 0;  } -device_initcall(mx5_pm_init); + +void __init imx51_pm_init(void) +{ +	int ret = imx5_pm_common_init(); +	if (!ret) +		suspend_set_ops(&mx5_suspend_ops); +} + +void __init imx53_pm_init(void) +{ +	imx5_pm_common_init(); +} diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index eaf6c6366ff..ebf680bebdf 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c @@ -21,7 +21,6 @@  #include <linux/amba/bus.h>  #include <linux/amba/serial.h>  #include <linux/io.h> -#include <linux/clkdev.h>  #include <mach/hardware.h>  #include <mach/platform.h> @@ -41,17 +40,17 @@ static struct amba_pl010_data integrator_uart_data;  #define KMI0_IRQ		{ IRQ_KMIINT0 }  #define KMI1_IRQ		{ IRQ_KMIINT1 } -static AMBA_APB_DEVICE(rtc, "mb:15", 0, +static AMBA_APB_DEVICE(rtc, "rtc", 0,  	INTEGRATOR_RTC_BASE, INTEGRATOR_RTC_IRQ, NULL); -static AMBA_APB_DEVICE(uart0, "mb:16", 0, +static AMBA_APB_DEVICE(uart0, "uart0", 0,  	INTEGRATOR_UART0_BASE, INTEGRATOR_UART0_IRQ, &integrator_uart_data); -static AMBA_APB_DEVICE(uart1, "mb:17", 0, +static AMBA_APB_DEVICE(uart1, "uart1", 0,  	INTEGRATOR_UART1_BASE, INTEGRATOR_UART1_IRQ, &integrator_uart_data); -static AMBA_APB_DEVICE(kmi0, "mb:18", 0, KMI0_BASE, KMI0_IRQ, NULL); -static AMBA_APB_DEVICE(kmi1, "mb:19", 0, KMI1_BASE, KMI1_IRQ, NULL); +static AMBA_APB_DEVICE(kmi0, "kmi0", 0, KMI0_BASE, KMI0_IRQ, NULL); +static AMBA_APB_DEVICE(kmi1, "kmi1", 0, KMI1_BASE, KMI1_IRQ, NULL);  static struct amba_device *amba_devs[] __initdata = {  	&rtc_device, @@ -61,50 +60,6 @@ static struct amba_device *amba_devs[] __initdata = {  	&kmi1_device,  }; -/* - * These are fixed clocks. - */ -static struct clk clk24mhz = { -	.rate	= 24000000, -}; - -static struct clk uartclk = { -	.rate	= 14745600, -}; - -static struct clk dummy_apb_pclk; - -static struct clk_lookup lookups[] = { -	{	/* Bus clock */ -		.con_id		= "apb_pclk", -		.clk		= &dummy_apb_pclk, -	}, { -		/* Integrator/AP timer frequency */ -		.dev_id		= "ap_timer", -		.clk		= &clk24mhz, -	}, {	/* UART0 */ -		.dev_id		= "mb:16", -		.clk		= &uartclk, -	}, {	/* UART1 */ -		.dev_id		= "mb:17", -		.clk		= &uartclk, -	}, {	/* KMI0 */ -		.dev_id		= "mb:18", -		.clk		= &clk24mhz, -	}, {	/* KMI1 */ -		.dev_id		= "mb:19", -		.clk		= &clk24mhz, -	}, {	/* MMCI - IntegratorCP */ -		.dev_id		= "mb:1c", -		.clk		= &uartclk, -	} -}; - -void __init integrator_init_early(void) -{ -	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); -} -  static int __init integrator_init(void)  {  	int i; diff --git a/arch/arm/mach-integrator/include/mach/clkdev.h b/arch/arm/mach-integrator/include/mach/clkdev.h deleted file mode 100644 index bfe07679fae..00000000000 --- a/arch/arm/mach-integrator/include/mach/clkdev.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef __ASM_MACH_CLKDEV_H -#define __ASM_MACH_CLKDEV_H - -#include <linux/module.h> -#include <plat/clock.h> - -struct clk { -	unsigned long		rate; -	const struct clk_ops	*ops; -	struct module		*owner; -	const struct icst_params *params; -	void __iomem		*vcoreg; -	void			*data; -}; - -static inline int __clk_get(struct clk *clk) -{ -	return try_module_get(clk->owner); -} - -static inline void __clk_put(struct clk *clk) -{ -	module_put(clk->owner); -} - -#endif diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index c857501c578..7b1055c8e0b 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c @@ -33,6 +33,7 @@  #include <linux/io.h>  #include <linux/mtd/physmap.h>  #include <linux/clk.h> +#include <linux/platform_data/clk-integrator.h>  #include <video/vga.h>  #include <mach/hardware.h> @@ -174,6 +175,7 @@ static void __init ap_init_irq(void)  	fpga_irq_init(VA_IC_BASE, "SC", IRQ_PIC_START,  		-1, INTEGRATOR_SC_VALID_INT, NULL); +	integrator_clk_init(false);  }  #ifdef CONFIG_PM @@ -440,6 +442,10 @@ static void integrator_clockevent_init(unsigned long inrate)  					0xffffU);  } +void __init ap_init_early(void) +{ +} +  /*   * Set up timer(s).   */ @@ -471,7 +477,7 @@ MACHINE_START(INTEGRATOR, "ARM-Integrator")  	.reserve	= integrator_reserve,  	.map_io		= ap_map_io,  	.nr_irqs	= NR_IRQS_INTEGRATOR_AP, -	.init_early	= integrator_init_early, +	.init_early	= ap_init_early,  	.init_irq	= ap_init_irq,  	.handle_irq	= fpga_handle_irq,  	.timer		= &ap_timer, diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index a56c5360893..82d5c837cc7 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -21,8 +21,8 @@  #include <linux/amba/mmci.h>  #include <linux/io.h>  #include <linux/gfp.h> -#include <linux/clkdev.h>  #include <linux/mtd/physmap.h> +#include <linux/platform_data/clk-integrator.h>  #include <mach/hardware.h>  #include <mach/platform.h> @@ -171,65 +171,10 @@ static void __init intcp_init_irq(void)  	fpga_irq_init(INTCP_VA_SIC_BASE, "SIC", IRQ_SIC_START,  		      IRQ_CP_CPPLDINT, sic_mask, NULL); +	integrator_clk_init(true);  }  /* - * Clock handling - */ -#define CM_LOCK		(__io_address(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_LOCK_OFFSET) -#define CM_AUXOSC	(__io_address(INTEGRATOR_HDR_BASE)+0x1c) - -static const struct icst_params cp_auxvco_params = { -	.ref		= 24000000, -	.vco_max	= ICST525_VCO_MAX_5V, -	.vco_min	= ICST525_VCO_MIN, -	.vd_min 	= 8, -	.vd_max 	= 263, -	.rd_min 	= 3, -	.rd_max 	= 65, -	.s2div		= icst525_s2div, -	.idx2s		= icst525_idx2s, -}; - -static void cp_auxvco_set(struct clk *clk, struct icst_vco vco) -{ -	u32 val; - -	val = readl(clk->vcoreg) & ~0x7ffff; -	val |= vco.v | (vco.r << 9) | (vco.s << 16); - -	writel(0xa05f, CM_LOCK); -	writel(val, clk->vcoreg); -	writel(0, CM_LOCK); -} - -static const struct clk_ops cp_auxclk_ops = { -	.round	= icst_clk_round, -	.set	= icst_clk_set, -	.setvco	= cp_auxvco_set, -}; - -static struct clk cp_auxclk = { -	.ops	= &cp_auxclk_ops, -	.params	= &cp_auxvco_params, -	.vcoreg	= CM_AUXOSC, -}; - -static struct clk sp804_clk = { -	.rate	= 1000000, -}; - -static struct clk_lookup cp_lookups[] = { -	{	/* CLCD */ -		.dev_id		= "mb:c0", -		.clk		= &cp_auxclk, -	}, {	/* SP804 timers */ -		.dev_id		= "sp804", -		.clk		= &sp804_clk, -	}, -}; - -/*   * Flash handling.   */  static int intcp_flash_init(struct platform_device *dev) @@ -336,10 +281,10 @@ static struct mmci_platform_data mmc_data = {  #define INTEGRATOR_CP_MMC_IRQS	{ IRQ_CP_MMCIINT0, IRQ_CP_MMCIINT1 }  #define INTEGRATOR_CP_AACI_IRQS	{ IRQ_CP_AACIINT } -static AMBA_APB_DEVICE(mmc, "mb:1c", 0, INTEGRATOR_CP_MMC_BASE, +static AMBA_APB_DEVICE(mmc, "mmci", 0, INTEGRATOR_CP_MMC_BASE,  	INTEGRATOR_CP_MMC_IRQS, &mmc_data); -static AMBA_APB_DEVICE(aaci, "mb:1d", 0, INTEGRATOR_CP_AACI_BASE, +static AMBA_APB_DEVICE(aaci, "aaci", 0, INTEGRATOR_CP_AACI_BASE,  	INTEGRATOR_CP_AACI_IRQS, NULL); @@ -393,7 +338,7 @@ static struct clcd_board clcd_data = {  	.remove		= versatile_clcd_remove_dma,  }; -static AMBA_AHB_DEVICE(clcd, "mb:c0", 0, INTCP_PA_CLCD_BASE, +static AMBA_AHB_DEVICE(clcd, "clcd", 0, INTCP_PA_CLCD_BASE,  	{ IRQ_CP_CLCDCINT }, &clcd_data);  static struct amba_device *amba_devs[] __initdata = { @@ -406,10 +351,6 @@ static struct amba_device *amba_devs[] __initdata = {  static void __init intcp_init_early(void)  { -	clkdev_add_table(cp_lookups, ARRAY_SIZE(cp_lookups)); - -	integrator_init_early(); -  #ifdef CONFIG_PLAT_VERSATILE_SCHED_CLOCK  	versatile_sched_clock_init(REFCOUNTER, 24000000);  #endif diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index f261cd24264..c9201539ffb 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c @@ -67,6 +67,14 @@ void __init kirkwood_map_io(void)   * CLK tree   ****************************************************************************/ +static void enable_sata0(void) +{ +	/* Enable PLL and IVREF */ +	writel(readl(SATA0_PHY_MODE_2) | 0xf, SATA0_PHY_MODE_2); +	/* Enable PHY */ +	writel(readl(SATA0_IF_CTRL) & ~0x200, SATA0_IF_CTRL); +} +  static void disable_sata0(void)  {  	/* Disable PLL and IVREF */ @@ -75,6 +83,14 @@ static void disable_sata0(void)  	writel(readl(SATA0_IF_CTRL) | 0x200, SATA0_IF_CTRL);  } +static void enable_sata1(void) +{ +	/* Enable PLL and IVREF */ +	writel(readl(SATA1_PHY_MODE_2) | 0xf, SATA1_PHY_MODE_2); +	/* Enable PHY */ +	writel(readl(SATA1_IF_CTRL) & ~0x200, SATA1_IF_CTRL); +} +  static void disable_sata1(void)  {  	/* Disable PLL and IVREF */ @@ -107,23 +123,38 @@ static void disable_pcie1(void)  	}  } -/* An extended version of the gated clk. This calls fn() before - * disabling the clock. We use this to turn off PHYs etc. */ +/* An extended version of the gated clk. This calls fn_en()/fn_dis + * before enabling/disabling the clock.  We use this to turn on/off + * PHYs etc.  */  struct clk_gate_fn {  	struct clk_gate gate; -	void (*fn)(void); +	void (*fn_en)(void); +	void (*fn_dis)(void);  };  #define to_clk_gate_fn(_gate) container_of(_gate, struct clk_gate_fn, gate)  #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw) +static int clk_gate_fn_enable(struct clk_hw *hw) +{ +	struct clk_gate *gate = to_clk_gate(hw); +	struct clk_gate_fn *gate_fn = to_clk_gate_fn(gate); +	int ret; + +	ret = clk_gate_ops.enable(hw); +	if (!ret && gate_fn->fn_en) +		gate_fn->fn_en(); + +	return ret; +} +  static void clk_gate_fn_disable(struct clk_hw *hw)  {  	struct clk_gate *gate = to_clk_gate(hw);  	struct clk_gate_fn *gate_fn = to_clk_gate_fn(gate); -	if (gate_fn->fn) -		gate_fn->fn(); +	if (gate_fn->fn_dis) +		gate_fn->fn_dis();  	clk_gate_ops.disable(hw);  } @@ -135,7 +166,7 @@ static struct clk __init *clk_register_gate_fn(struct device *dev,  		const char *parent_name, unsigned long flags,  		void __iomem *reg, u8 bit_idx,  		u8 clk_gate_flags, spinlock_t *lock, -		void (*fn)(void)) +		void (*fn_en)(void), void (*fn_dis)(void))  {  	struct clk_gate_fn *gate_fn;  	struct clk *clk; @@ -159,11 +190,14 @@ static struct clk __init *clk_register_gate_fn(struct device *dev,  	gate_fn->gate.flags = clk_gate_flags;  	gate_fn->gate.lock = lock;  	gate_fn->gate.hw.init = &init; -	gate_fn->fn = fn; +	gate_fn->fn_en = fn_en; +	gate_fn->fn_dis = fn_dis; -	/* ops is the gate ops, but with our disable function */ -	if (clk_gate_fn_ops.disable != clk_gate_fn_disable) { +	/* ops is the gate ops, but with our enable/disable functions */ +	if (clk_gate_fn_ops.enable != clk_gate_fn_enable || +	    clk_gate_fn_ops.disable != clk_gate_fn_disable) {  		clk_gate_fn_ops = clk_gate_ops; +		clk_gate_fn_ops.enable = clk_gate_fn_enable;  		clk_gate_fn_ops.disable = clk_gate_fn_disable;  	} @@ -187,11 +221,12 @@ static struct clk __init *kirkwood_register_gate(const char *name, u8 bit_idx)  static struct clk __init *kirkwood_register_gate_fn(const char *name,  						    u8 bit_idx, -						    void (*fn)(void)) +						    void (*fn_en)(void), +						    void (*fn_dis)(void))  {  	return clk_register_gate_fn(NULL, name, "tclk", 0,  				    (void __iomem *)CLOCK_GATING_CTRL, -				    bit_idx, 0, &gating_lock, fn); +				    bit_idx, 0, &gating_lock, fn_en, fn_dis);  }  static struct clk *ge0, *ge1; @@ -208,18 +243,18 @@ void __init kirkwood_clk_init(void)  	ge0 = kirkwood_register_gate("ge0",    CGC_BIT_GE0);  	ge1 = kirkwood_register_gate("ge1",    CGC_BIT_GE1);  	sata0 = kirkwood_register_gate_fn("sata0",  CGC_BIT_SATA0, -					  disable_sata0); +					  enable_sata0, disable_sata0);  	sata1 = kirkwood_register_gate_fn("sata1",  CGC_BIT_SATA1, -					  disable_sata1); +					  enable_sata1, disable_sata1);  	usb0 = kirkwood_register_gate("usb0",   CGC_BIT_USB0);  	sdio = kirkwood_register_gate("sdio",   CGC_BIT_SDIO);  	crypto = kirkwood_register_gate("crypto", CGC_BIT_CRYPTO);  	xor0 = kirkwood_register_gate("xor0",   CGC_BIT_XOR0);  	xor1 = kirkwood_register_gate("xor1",   CGC_BIT_XOR1);  	pex0 = kirkwood_register_gate_fn("pex0",   CGC_BIT_PEX0, -					 disable_pcie0); +					 NULL, disable_pcie0);  	pex1 = kirkwood_register_gate_fn("pex1",   CGC_BIT_PEX1, -					 disable_pcie1); +					 NULL, disable_pcie1);  	audio = kirkwood_register_gate("audio",  CGC_BIT_AUDIO);  	kirkwood_register_gate("tdm",    CGC_BIT_TDM);  	kirkwood_register_gate("tsu",    CGC_BIT_TSU); @@ -241,6 +276,11 @@ void __init kirkwood_clk_init(void)  	orion_clkdev_add("0", "pcie", pex0);  	orion_clkdev_add("1", "pcie", pex1);  	orion_clkdev_add(NULL, "kirkwood-i2s", audio); + +	/* Marvell says runit is used by SPI, UART, NAND, TWSI, ..., +	 * so should never be gated. +	 */ +	clk_prepare_enable(runit);  }  /***************************************************************************** diff --git a/arch/arm/mach-lpc32xx/Kconfig b/arch/arm/mach-lpc32xx/Kconfig deleted file mode 100644 index e0b3eee8383..00000000000 --- a/arch/arm/mach-lpc32xx/Kconfig +++ /dev/null @@ -1,32 +0,0 @@ -if ARCH_LPC32XX - -menu "Individual UART enable selections" - -config ARCH_LPC32XX_UART3_SELECT -	bool "Add support for standard UART3" -	help -	 Adds support for standard UART 3 when the 8250 serial support -	 is enabled. - -config ARCH_LPC32XX_UART4_SELECT -	bool "Add support for standard UART4" -	help -	 Adds support for standard UART 4 when the 8250 serial support -	 is enabled. - -config ARCH_LPC32XX_UART5_SELECT -	bool "Add support for standard UART5" -	default y -	help -	 Adds support for standard UART 5 when the 8250 serial support -	 is enabled. - -config ARCH_LPC32XX_UART6_SELECT -	bool "Add support for standard UART6" -	help -	 Adds support for standard UART 6 when the 8250 serial support -	 is enabled. - -endmenu - -endif diff --git a/arch/arm/mach-lpc32xx/Makefile.boot b/arch/arm/mach-lpc32xx/Makefile.boot index 2cfe0ee635c..697323b5f92 100644 --- a/arch/arm/mach-lpc32xx/Makefile.boot +++ b/arch/arm/mach-lpc32xx/Makefile.boot @@ -2,3 +2,4 @@  params_phys-y	:= 0x80000100  initrd_phys-y	:= 0x82000000 +dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb diff --git a/arch/arm/mach-lpc32xx/clock.c b/arch/arm/mach-lpc32xx/clock.c index f6a3ffec1f4..f48c2e961b8 100644 --- a/arch/arm/mach-lpc32xx/clock.c +++ b/arch/arm/mach-lpc32xx/clock.c @@ -607,6 +607,19 @@ static struct clk clk_dma = {  	.get_rate	= local_return_parent_rate,  }; +static struct clk clk_pwm = { +	.parent		= &clk_pclk, +	.enable		= local_onoff_enable, +	.enable_reg	= LPC32XX_CLKPWR_PWM_CLK_CTRL, +	.enable_mask	= LPC32XX_CLKPWR_PWMCLK_PWM1CLK_EN | +			  LPC32XX_CLKPWR_PWMCLK_PWM1SEL_PCLK | +			  LPC32XX_CLKPWR_PWMCLK_PWM1_DIV(1) | +			  LPC32XX_CLKPWR_PWMCLK_PWM2CLK_EN | +			  LPC32XX_CLKPWR_PWMCLK_PWM2SEL_PCLK | +			  LPC32XX_CLKPWR_PWMCLK_PWM2_DIV(1), +	.get_rate	= local_return_parent_rate, +}; +  static struct clk clk_uart3 = {  	.parent		= &clk_pclk,  	.enable		= local_onoff_enable, @@ -691,10 +704,21 @@ static struct clk clk_nand = {  	.parent		= &clk_hclk,  	.enable		= local_onoff_enable,  	.enable_reg	= LPC32XX_CLKPWR_NAND_CLK_CTRL, -	.enable_mask	= LPC32XX_CLKPWR_NANDCLK_SLCCLK_EN, +	.enable_mask	= LPC32XX_CLKPWR_NANDCLK_SLCCLK_EN | +			  LPC32XX_CLKPWR_NANDCLK_SEL_SLC,  	.get_rate	= local_return_parent_rate,  }; +static struct clk clk_nand_mlc = { +	.parent         = &clk_hclk, +	.enable         = local_onoff_enable, +	.enable_reg     = LPC32XX_CLKPWR_NAND_CLK_CTRL, +	.enable_mask    = LPC32XX_CLKPWR_NANDCLK_MLCCLK_EN | +			  LPC32XX_CLKPWR_NANDCLK_DMA_INT | +			  LPC32XX_CLKPWR_NANDCLK_INTSEL_MLC, +	.get_rate       = local_return_parent_rate, +}; +  static struct clk clk_i2s0 = {  	.parent		= &clk_hclk,  	.enable		= local_onoff_enable, @@ -707,7 +731,8 @@ static struct clk clk_i2s1 = {  	.parent		= &clk_hclk,  	.enable		= local_onoff_enable,  	.enable_reg	= LPC32XX_CLKPWR_I2S_CLK_CTRL, -	.enable_mask	= LPC32XX_CLKPWR_I2SCTRL_I2SCLK1_EN, +	.enable_mask	= LPC32XX_CLKPWR_I2SCTRL_I2SCLK1_EN | +			  LPC32XX_CLKPWR_I2SCTRL_I2S1_USE_DMA,  	.get_rate	= local_return_parent_rate,  }; @@ -727,14 +752,77 @@ static struct clk clk_rtc = {  	.get_rate	= local_return_parent_rate,  }; +static int local_usb_enable(struct clk *clk, int enable) +{ +	u32 tmp; + +	if (enable) { +		/* Set up I2C pull levels */ +		tmp = __raw_readl(LPC32XX_CLKPWR_I2C_CLK_CTRL); +		tmp |= LPC32XX_CLKPWR_I2CCLK_USBI2CHI_DRIVE; +		__raw_writel(tmp, LPC32XX_CLKPWR_I2C_CLK_CTRL); +	} + +	return local_onoff_enable(clk, enable); +} +  static struct clk clk_usbd = {  	.parent		= &clk_usbpll, -	.enable		= local_onoff_enable, +	.enable		= local_usb_enable,  	.enable_reg	= LPC32XX_CLKPWR_USB_CTRL,  	.enable_mask	= LPC32XX_CLKPWR_USBCTRL_HCLK_EN,  	.get_rate	= local_return_parent_rate,  }; +#define OTG_ALWAYS_MASK		(LPC32XX_USB_OTG_OTG_CLOCK_ON | \ +				 LPC32XX_USB_OTG_I2C_CLOCK_ON) + +static int local_usb_otg_enable(struct clk *clk, int enable) +{ +	int to = 1000; + +	if (enable) { +		__raw_writel(clk->enable_mask, clk->enable_reg); + +		while (((__raw_readl(LPC32XX_USB_OTG_CLK_STAT) & +			clk->enable_mask) != clk->enable_mask) && (to > 0)) +			to--; +	} else { +		__raw_writel(OTG_ALWAYS_MASK, clk->enable_reg); + +		while (((__raw_readl(LPC32XX_USB_OTG_CLK_STAT) & +			OTG_ALWAYS_MASK) != OTG_ALWAYS_MASK) && (to > 0)) +			to--; +	} + +	if (to) +		return 0; +	else +		return -1; +} + +static struct clk clk_usb_otg_dev = { +	.parent		= &clk_usbpll, +	.enable		= local_usb_otg_enable, +	.enable_reg	= LPC32XX_USB_OTG_CLK_CTRL, +	.enable_mask	= LPC32XX_USB_OTG_AHB_M_CLOCK_ON | +			  LPC32XX_USB_OTG_OTG_CLOCK_ON | +			  LPC32XX_USB_OTG_DEV_CLOCK_ON | +			  LPC32XX_USB_OTG_I2C_CLOCK_ON, +	.get_rate	= local_return_parent_rate, +}; + +static struct clk clk_usb_otg_host = { +	.parent		= &clk_usbpll, +	.enable		= local_usb_otg_enable, +	.enable_reg	= LPC32XX_USB_OTG_CLK_CTRL, +	.enable_mask	= LPC32XX_USB_OTG_AHB_M_CLOCK_ON | +			  LPC32XX_USB_OTG_OTG_CLOCK_ON | +			  LPC32XX_USB_OTG_HOST_CLOCK_ON | +			  LPC32XX_USB_OTG_I2C_CLOCK_ON, +	.get_rate	= local_return_parent_rate, +}; +  static int tsc_onoff_enable(struct clk *clk, int enable)  {  	u32 tmp; @@ -800,11 +888,17 @@ static int mmc_onoff_enable(struct clk *clk, int enable)  	u32 tmp;  	tmp = __raw_readl(LPC32XX_CLKPWR_MS_CTRL) & -		~LPC32XX_CLKPWR_MSCARD_SDCARD_EN; +		~(LPC32XX_CLKPWR_MSCARD_SDCARD_EN | +		  LPC32XX_CLKPWR_MSCARD_MSDIO_PU_EN | +		  LPC32XX_CLKPWR_MSCARD_MSDIO_PIN_DIS | +		  LPC32XX_CLKPWR_MSCARD_MSDIO0_DIS | +		  LPC32XX_CLKPWR_MSCARD_MSDIO1_DIS | +		  LPC32XX_CLKPWR_MSCARD_MSDIO23_DIS);  	/* If rate is 0, disable clock */  	if (enable != 0) -		tmp |= LPC32XX_CLKPWR_MSCARD_SDCARD_EN; +		tmp |= LPC32XX_CLKPWR_MSCARD_SDCARD_EN | +			LPC32XX_CLKPWR_MSCARD_MSDIO_PU_EN;  	__raw_writel(tmp, LPC32XX_CLKPWR_MS_CTRL); @@ -853,7 +947,7 @@ static unsigned long mmc_round_rate(struct clk *clk, unsigned long rate)  static int mmc_set_rate(struct clk *clk, unsigned long rate)  { -	u32 oldclk, tmp; +	u32 tmp;  	unsigned long prate, div, crate = mmc_round_rate(clk, rate);  	prate = clk->parent->get_rate(clk->parent); @@ -861,16 +955,12 @@ static int mmc_set_rate(struct clk *clk, unsigned long rate)  	div = prate / crate;  	/* The MMC clock must be on when accessing an MMC register */ -	oldclk = __raw_readl(LPC32XX_CLKPWR_MS_CTRL); -	__raw_writel(oldclk | LPC32XX_CLKPWR_MSCARD_SDCARD_EN, -		LPC32XX_CLKPWR_MS_CTRL);  	tmp = __raw_readl(LPC32XX_CLKPWR_MS_CTRL) &  		~LPC32XX_CLKPWR_MSCARD_SDCARD_DIV(0xf); -	tmp |= LPC32XX_CLKPWR_MSCARD_SDCARD_DIV(div); +	tmp |= LPC32XX_CLKPWR_MSCARD_SDCARD_DIV(div) | +		LPC32XX_CLKPWR_MSCARD_SDCARD_EN;  	__raw_writel(tmp, LPC32XX_CLKPWR_MS_CTRL); -	__raw_writel(oldclk, LPC32XX_CLKPWR_MS_CTRL); -  	return 0;  } @@ -1111,6 +1201,7 @@ static struct clk_lookup lookups[] = {  	CLKDEV_INIT(NULL, "vfp9_ck", &clk_vfp9),  	CLKDEV_INIT("pl08xdmac", NULL, &clk_dma),  	CLKDEV_INIT("4003c000.watchdog", NULL, &clk_wdt), +	CLKDEV_INIT("4005c000.pwm", NULL, &clk_pwm),  	CLKDEV_INIT(NULL, "uart3_ck", &clk_uart3),  	CLKDEV_INIT(NULL, "uart4_ck", &clk_uart4),  	CLKDEV_INIT(NULL, "uart5_ck", &clk_uart5), @@ -1120,8 +1211,9 @@ static struct clk_lookup lookups[] = {  	CLKDEV_INIT("31020300.i2c", NULL, &clk_i2c2),  	CLKDEV_INIT("dev:ssp0", NULL, &clk_ssp0),  	CLKDEV_INIT("dev:ssp1", NULL, &clk_ssp1), -	CLKDEV_INIT("lpc32xx_keys.0", NULL, &clk_kscan), -	CLKDEV_INIT("lpc32xx-nand.0", "nand_ck", &clk_nand), +	CLKDEV_INIT("40050000.key", NULL, &clk_kscan), +	CLKDEV_INIT("20020000.flash", NULL, &clk_nand), +	CLKDEV_INIT("200a8000.flash", NULL, &clk_nand_mlc),  	CLKDEV_INIT("40048000.adc", NULL, &clk_adc),  	CLKDEV_INIT(NULL, "i2s0_ck", &clk_i2s0),  	CLKDEV_INIT(NULL, "i2s1_ck", &clk_i2s1), @@ -1130,6 +1222,9 @@ static struct clk_lookup lookups[] = {  	CLKDEV_INIT("31060000.ethernet", NULL, &clk_net),  	CLKDEV_INIT("dev:clcd", NULL, &clk_lcd),  	CLKDEV_INIT("31020000.usbd", "ck_usbd", &clk_usbd), +	CLKDEV_INIT("31020000.ohci", "ck_usbd", &clk_usbd), +	CLKDEV_INIT("31020000.usbd", "ck_usb_otg", &clk_usb_otg_dev), +	CLKDEV_INIT("31020000.ohci", "ck_usb_otg", &clk_usb_otg_host),  	CLKDEV_INIT("lpc32xx_rtc", NULL, &clk_rtc),  }; diff --git a/arch/arm/mach-lpc32xx/common.c b/arch/arm/mach-lpc32xx/common.c index 5c96057b6d7..a48dc2dec48 100644 --- a/arch/arm/mach-lpc32xx/common.c +++ b/arch/arm/mach-lpc32xx/common.c @@ -26,6 +26,7 @@  #include <linux/io.h>  #include <asm/mach/map.h> +#include <asm/system_info.h>  #include <mach/hardware.h>  #include <mach/platform.h> @@ -224,7 +225,7 @@ void lpc23xx_restart(char mode, const char *cmd)  		;  } -static int __init lpc32xx_display_uid(void) +static int __init lpc32xx_check_uid(void)  {  	u32 uid[4]; @@ -233,6 +234,11 @@ static int __init lpc32xx_display_uid(void)  	printk(KERN_INFO "LPC32XX unique ID: %08x%08x%08x%08x\n",  		uid[3], uid[2], uid[1], uid[0]); +	if (!system_serial_low && !system_serial_high) { +		system_serial_low = uid[0]; +		system_serial_high = uid[1]; +	} +  	return 1;  } -arch_initcall(lpc32xx_display_uid); +arch_initcall(lpc32xx_check_uid); diff --git a/arch/arm/mach-lpc32xx/include/mach/gpio.h b/arch/arm/mach-lpc32xx/include/mach/gpio.h index 2ba6ca412be..0052e7a7617 100644 --- a/arch/arm/mach-lpc32xx/include/mach/gpio.h +++ b/arch/arm/mach-lpc32xx/include/mach/gpio.h @@ -3,6 +3,4 @@  #include "gpio-lpc32xx.h" -#define ARCH_NR_GPIOS (LPC32XX_GPO_P3_GRP + LPC32XX_GPO_P3_MAX) -  #endif /* __MACH_GPIO_H */ diff --git a/arch/arm/mach-lpc32xx/include/mach/platform.h b/arch/arm/mach-lpc32xx/include/mach/platform.h index c584f5bb164..acc4aabf1c7 100644 --- a/arch/arm/mach-lpc32xx/include/mach/platform.h +++ b/arch/arm/mach-lpc32xx/include/mach/platform.h @@ -694,4 +694,18 @@  #define LPC32XX_GPIO_P2_MUX_CLR			_GPREG(0x02C)  #define LPC32XX_GPIO_P2_MUX_STATE		_GPREG(0x030) +/* + * USB Otg Registers + */ +#define _OTGREG(x)			io_p2v(LPC32XX_USB_OTG_BASE + (x)) +#define LPC32XX_USB_OTG_CLK_CTRL	_OTGREG(0xFF4) +#define LPC32XX_USB_OTG_CLK_STAT	_OTGREG(0xFF8) + +/* USB OTG CLK CTRL bit defines */ +#define LPC32XX_USB_OTG_AHB_M_CLOCK_ON	_BIT(4) +#define LPC32XX_USB_OTG_OTG_CLOCK_ON	_BIT(3) +#define LPC32XX_USB_OTG_I2C_CLOCK_ON	_BIT(2) +#define LPC32XX_USB_OTG_DEV_CLOCK_ON	_BIT(1) +#define LPC32XX_USB_OTG_HOST_CLOCK_ON	_BIT(0) +  #endif diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index 540106cdb9e..b07dcc90829 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c @@ -30,12 +30,13 @@  #include <linux/amba/bus.h>  #include <linux/amba/clcd.h>  #include <linux/amba/pl022.h> +#include <linux/amba/pl08x.h> +#include <linux/amba/mmci.h>  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/clk.h> -#include <linux/amba/pl08x.h>  #include <asm/setup.h>  #include <asm/mach-types.h> @@ -50,9 +51,9 @@  /*   * Mapped GPIOLIB GPIOs   */ -#define SPI0_CS_GPIO	LPC32XX_GPIO(LPC32XX_GPIO_P3_GRP, 5) -#define LCD_POWER_GPIO	LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 0) -#define BKL_POWER_GPIO	LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 4) +#define LCD_POWER_GPIO		LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 0) +#define BKL_POWER_GPIO		LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 4) +#define MMC_PWR_ENABLE_GPIO	LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 5)  /*   * AMBA LCD controller @@ -158,24 +159,6 @@ static struct clcd_board lpc32xx_clcd_data = {  /*   * AMBA SSP (SPI)   */ -static void phy3250_spi_cs_set(u32 control) -{ -	gpio_set_value(SPI0_CS_GPIO, (int) control); -} - -static struct pl022_config_chip spi0_chip_info = { -	.com_mode		= INTERRUPT_TRANSFER, -	.iface			= SSP_INTERFACE_MOTOROLA_SPI, -	.hierarchy		= SSP_MASTER, -	.slave_tx_disable	= 0, -	.rx_lev_trig		= SSP_RX_4_OR_MORE_ELEM, -	.tx_lev_trig		= SSP_TX_4_OR_MORE_EMPTY_LOC, -	.ctrl_len		= SSP_BITS_8, -	.wait_state		= SSP_MWIRE_WAIT_ZERO, -	.duplex			= SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, -	.cs_control		= phy3250_spi_cs_set, -}; -  static struct pl022_ssp_controller lpc32xx_ssp0_data = {  	.bus_id			= 0,  	.num_chipselect		= 1, @@ -188,45 +171,56 @@ static struct pl022_ssp_controller lpc32xx_ssp1_data = {  	.enable_dma		= 0,  }; -/* AT25 driver registration */ -static int __init phy3250_spi_board_register(void) -{ -#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) -	static struct spi_board_info info[] = { -		{ -			.modalias = "spidev", -			.max_speed_hz = 5000000, -			.bus_num = 0, -			.chip_select = 0, -			.controller_data = &spi0_chip_info, -		}, -	}; +static struct pl08x_channel_data pl08x_slave_channels[] = { +	{ +		.bus_id = "nand-slc", +		.min_signal = 1, /* SLC NAND Flash */ +		.max_signal = 1, +		.periph_buses = PL08X_AHB1, +	}, +	{ +		.bus_id = "nand-mlc", +		.min_signal = 12, /* MLC NAND Flash */ +		.max_signal = 12, +		.periph_buses = PL08X_AHB1, +	}, +}; -#else -	static struct spi_eeprom eeprom = { -		.name = "at25256a", -		.byte_len = 0x8000, -		.page_size = 64, -		.flags = EE_ADDR2, -	}; +static int pl08x_get_signal(const struct pl08x_channel_data *cd) +{ +	return cd->min_signal; +} -	static struct spi_board_info info[] = { -		{ -			.modalias = "at25", -			.max_speed_hz = 5000000, -			.bus_num = 0, -			.chip_select = 0, -			.mode = SPI_MODE_0, -			.platform_data = &eeprom, -			.controller_data = &spi0_chip_info, -		}, -	}; -#endif -	return spi_register_board_info(info, ARRAY_SIZE(info)); +static void pl08x_put_signal(const struct pl08x_channel_data *cd, int ch) +{  } -arch_initcall(phy3250_spi_board_register);  static struct pl08x_platform_data pl08x_pd = { +	.slave_channels = &pl08x_slave_channels[0], +	.num_slave_channels = ARRAY_SIZE(pl08x_slave_channels), +	.get_signal = pl08x_get_signal, +	.put_signal = pl08x_put_signal, +	.lli_buses = PL08X_AHB1, +	.mem_buses = PL08X_AHB1, +}; + +static int mmc_handle_ios(struct device *dev, struct mmc_ios *ios) +{ +	/* Only on and off are supported */ +	if (ios->power_mode == MMC_POWER_OFF) +		gpio_set_value(MMC_PWR_ENABLE_GPIO, 0); +	else +		gpio_set_value(MMC_PWR_ENABLE_GPIO, 1); +	return 0; +} + +static struct mmci_platform_data lpc32xx_mmci_data = { +	.ocr_mask	= MMC_VDD_30_31 | MMC_VDD_31_32 | +			  MMC_VDD_32_33 | MMC_VDD_33_34, +	.ios_handler	= mmc_handle_ios, +	.dma_filter	= NULL, +	/* No DMA for now since AMBA PL080 dmaengine driver only does scatter +	 * gather, and the MMCI driver doesn't do it this way */  };  static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = { @@ -234,6 +228,8 @@ static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = {  	OF_DEV_AUXDATA("arm,pl022", 0x2008C000, "dev:ssp1", &lpc32xx_ssp1_data),  	OF_DEV_AUXDATA("arm,pl110", 0x31040000, "dev:clcd", &lpc32xx_clcd_data),  	OF_DEV_AUXDATA("arm,pl080", 0x31000000, "pl08xdmac", &pl08x_pd), +	OF_DEV_AUXDATA("arm,pl18x", 0x20098000, "20098000.sd", +		       &lpc32xx_mmci_data),  	{ }  }; @@ -241,10 +237,6 @@ static void __init lpc3250_machine_init(void)  {  	u32 tmp; -	/* Setup SLC NAND controller muxing */ -	__raw_writel(LPC32XX_CLKPWR_NANDCLK_SEL_SLC, -		LPC32XX_CLKPWR_NAND_CLK_CTRL); -  	/* Setup LCD muxing to RGB565 */  	tmp = __raw_readl(LPC32XX_CLKPWR_LCDCLK_CTRL) &  		~(LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_MSK | @@ -252,47 +244,8 @@ static void __init lpc3250_machine_init(void)  	tmp |= LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_TFT16;  	__raw_writel(tmp, LPC32XX_CLKPWR_LCDCLK_CTRL); -	/* Set up USB power */ -	tmp = __raw_readl(LPC32XX_CLKPWR_USB_CTRL); -	tmp |= LPC32XX_CLKPWR_USBCTRL_HCLK_EN | -		LPC32XX_CLKPWR_USBCTRL_USBI2C_EN; -	__raw_writel(tmp, LPC32XX_CLKPWR_USB_CTRL); - -	/* Set up I2C pull levels */ -	tmp = __raw_readl(LPC32XX_CLKPWR_I2C_CLK_CTRL); -	tmp |= LPC32XX_CLKPWR_I2CCLK_USBI2CHI_DRIVE | -		LPC32XX_CLKPWR_I2CCLK_I2C2HI_DRIVE; -	__raw_writel(tmp, LPC32XX_CLKPWR_I2C_CLK_CTRL); - -	/* Disable IrDA pulsing support on UART6 */ -	tmp = __raw_readl(LPC32XX_UARTCTL_CTRL); -	tmp |= LPC32XX_UART_UART6_IRDAMOD_BYPASS; -	__raw_writel(tmp, LPC32XX_UARTCTL_CTRL); - -	/* Enable DMA for I2S1 channel */ -	tmp = __raw_readl(LPC32XX_CLKPWR_I2S_CLK_CTRL); -	tmp = LPC32XX_CLKPWR_I2SCTRL_I2S1_USE_DMA; -	__raw_writel(tmp, LPC32XX_CLKPWR_I2S_CLK_CTRL); -  	lpc32xx_serial_init(); -	/* -	 * AMBA peripheral clocks need to be enabled prior to AMBA device -	 * detection or a data fault will occur, so enable the clocks -	 * here. -	 */ -	tmp = __raw_readl(LPC32XX_CLKPWR_LCDCLK_CTRL); -	__raw_writel((tmp | LPC32XX_CLKPWR_LCDCTRL_CLK_EN), -		LPC32XX_CLKPWR_LCDCLK_CTRL); - -	tmp = __raw_readl(LPC32XX_CLKPWR_SSP_CLK_CTRL); -	__raw_writel((tmp | LPC32XX_CLKPWR_SSPCTRL_SSPCLK0_EN), -		LPC32XX_CLKPWR_SSP_CLK_CTRL); - -	tmp = __raw_readl(LPC32XX_CLKPWR_DMA_CLK_CTRL); -	__raw_writel((tmp | LPC32XX_CLKPWR_DMACLKCTRL_CLK_EN), -		     LPC32XX_CLKPWR_DMA_CLK_CTRL); -  	/* Test clock needed for UDA1380 initial init */  	__raw_writel(LPC32XX_CLKPWR_TESTCLK2_SEL_MOSC |  		LPC32XX_CLKPWR_TESTCLK_TESTCLK2_EN, @@ -302,12 +255,10 @@ static void __init lpc3250_machine_init(void)  			     lpc32xx_auxdata_lookup, NULL);  	/* Register GPIOs used on this board */ -	if (gpio_request(SPI0_CS_GPIO, "spi0 cs")) -		printk(KERN_ERR "Error requesting gpio %u", -			SPI0_CS_GPIO); -	else if (gpio_direction_output(SPI0_CS_GPIO, 1)) -		printk(KERN_ERR "Error setting gpio %u to output", -			SPI0_CS_GPIO); +	if (gpio_request(MMC_PWR_ENABLE_GPIO, "mmc_power_en")) +		pr_err("Error requesting gpio %u", MMC_PWR_ENABLE_GPIO); +	else if (gpio_direction_output(MMC_PWR_ENABLE_GPIO, 1)) +		pr_err("Error setting gpio %u to output", MMC_PWR_ENABLE_GPIO);  }  static char const *lpc32xx_dt_compat[] __initdata = { diff --git a/arch/arm/mach-lpc32xx/serial.c b/arch/arm/mach-lpc32xx/serial.c index f2735281616..05621a29fba 100644 --- a/arch/arm/mach-lpc32xx/serial.c +++ b/arch/arm/mach-lpc32xx/serial.c @@ -31,59 +31,6 @@  #define LPC32XX_SUART_FIFO_SIZE	64 -/* Standard 8250/16550 compatible serial ports */ -static struct plat_serial8250_port serial_std_platform_data[] = { -#ifdef CONFIG_ARCH_LPC32XX_UART5_SELECT -	{ -		.membase        = io_p2v(LPC32XX_UART5_BASE), -		.mapbase        = LPC32XX_UART5_BASE, -		.irq		= IRQ_LPC32XX_UART_IIR5, -		.uartclk	= LPC32XX_MAIN_OSC_FREQ, -		.regshift	= 2, -		.iotype		= UPIO_MEM32, -		.flags		= UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | -					UPF_SKIP_TEST, -	}, -#endif -#ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT -	{ -		.membase	= io_p2v(LPC32XX_UART3_BASE), -		.mapbase        = LPC32XX_UART3_BASE, -		.irq		= IRQ_LPC32XX_UART_IIR3, -		.uartclk	= LPC32XX_MAIN_OSC_FREQ, -		.regshift	= 2, -		.iotype		= UPIO_MEM32, -		.flags		= UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | -					UPF_SKIP_TEST, -	}, -#endif -#ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT -	{ -		.membase	= io_p2v(LPC32XX_UART4_BASE), -		.mapbase        = LPC32XX_UART4_BASE, -		.irq		= IRQ_LPC32XX_UART_IIR4, -		.uartclk	= LPC32XX_MAIN_OSC_FREQ, -		.regshift	= 2, -		.iotype		= UPIO_MEM32, -		.flags		= UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | -					UPF_SKIP_TEST, -	}, -#endif -#ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT -	{ -		.membase	= io_p2v(LPC32XX_UART6_BASE), -		.mapbase        = LPC32XX_UART6_BASE, -		.irq		= IRQ_LPC32XX_UART_IIR6, -		.uartclk	= LPC32XX_MAIN_OSC_FREQ, -		.regshift	= 2, -		.iotype		= UPIO_MEM32, -		.flags		= UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | -					UPF_SKIP_TEST, -	}, -#endif -	{ }, -}; -  struct uartinit {  	char *uart_ck_name;  	u32 ck_mode_mask; @@ -92,7 +39,6 @@ struct uartinit {  };  static struct uartinit uartinit_data[] __initdata = { -#ifdef CONFIG_ARCH_LPC32XX_UART5_SELECT  	{  		.uart_ck_name = "uart5_ck",  		.ck_mode_mask = @@ -100,8 +46,6 @@ static struct uartinit uartinit_data[] __initdata = {  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART5_CLK_CTRL,  		.mapbase = LPC32XX_UART5_BASE,  	}, -#endif -#ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT  	{  		.uart_ck_name = "uart3_ck",  		.ck_mode_mask = @@ -109,8 +53,6 @@ static struct uartinit uartinit_data[] __initdata = {  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART3_CLK_CTRL,  		.mapbase = LPC32XX_UART3_BASE,  	}, -#endif -#ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT  	{  		.uart_ck_name = "uart4_ck",  		.ck_mode_mask = @@ -118,8 +60,6 @@ static struct uartinit uartinit_data[] __initdata = {  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART4_CLK_CTRL,  		.mapbase = LPC32XX_UART4_BASE,  	}, -#endif -#ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT  	{  		.uart_ck_name = "uart6_ck",  		.ck_mode_mask = @@ -127,19 +67,6 @@ static struct uartinit uartinit_data[] __initdata = {  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART6_CLK_CTRL,  		.mapbase = LPC32XX_UART6_BASE,  	}, -#endif -}; - -static struct platform_device serial_std_platform_device = { -	.name			= "serial8250", -	.id			= 0, -	.dev			= { -		.platform_data	= serial_std_platform_data, -	}, -}; - -static struct platform_device *lpc32xx_serial_devs[] __initdata = { -	&serial_std_platform_device,  };  void __init lpc32xx_serial_init(void) @@ -156,15 +83,8 @@ void __init lpc32xx_serial_init(void)  		clk = clk_get(NULL, uartinit_data[i].uart_ck_name);  		if (!IS_ERR(clk)) {  			clk_enable(clk); -			serial_std_platform_data[i].uartclk = -				clk_get_rate(clk);  		} -		/* Fall back on main osc rate if clock rate return fails */ -		if (serial_std_platform_data[i].uartclk == 0) -			serial_std_platform_data[i].uartclk = -				LPC32XX_MAIN_OSC_FREQ; -  		/* Setup UART clock modes for all UARTs, disable autoclock */  		clkmodes |= uartinit_data[i].ck_mode_mask; @@ -189,7 +109,7 @@ void __init lpc32xx_serial_init(void)  	__raw_writel(clkmodes, LPC32XX_UARTCTL_CLKMODE);  	for (i = 0; i < ARRAY_SIZE(uartinit_data); i++) {  		/* Force a flush of the RX FIFOs to work around a HW bug */ -		puart = serial_std_platform_data[i].mapbase; +		puart = uartinit_data[i].mapbase;  		__raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart));  		__raw_writel(0x00, LPC32XX_UART_DLL_FIFO(puart));  		j = LPC32XX_SUART_FIFO_SIZE; @@ -198,11 +118,13 @@ void __init lpc32xx_serial_init(void)  		__raw_writel(0, LPC32XX_UART_IIR_FCR(puart));  	} +	/* Disable IrDA pulsing support on UART6 */ +	tmp = __raw_readl(LPC32XX_UARTCTL_CTRL); +	tmp |= LPC32XX_UART_UART6_IRDAMOD_BYPASS; +	__raw_writel(tmp, LPC32XX_UARTCTL_CTRL); +  	/* Disable UART5->USB transparent mode or USB won't work */  	tmp = __raw_readl(LPC32XX_UARTCTL_CTRL);  	tmp &= ~LPC32XX_UART_U5_ROUTE_TO_USB;  	__raw_writel(tmp, LPC32XX_UARTCTL_CTRL); - -	platform_add_devices(lpc32xx_serial_devs, -		ARRAY_SIZE(lpc32xx_serial_devs));  } diff --git a/arch/arm/mach-mmp/gplugd.c b/arch/arm/mach-mmp/gplugd.c index f516e74ce0d..5c3d61ee729 100644 --- a/arch/arm/mach-mmp/gplugd.c +++ b/arch/arm/mach-mmp/gplugd.c @@ -14,6 +14,7 @@  #include <asm/mach/arch.h>  #include <asm/mach-types.h> +#include <mach/irqs.h>  #include <mach/pxa168.h>  #include <mach/mfp-pxa168.h> diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c index db0117ec55f..e012dc8391c 100644 --- a/arch/arm/mach-msm/platsmp.c +++ b/arch/arm/mach-msm/platsmp.c @@ -127,7 +127,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  	 * the boot monitor to read the system wide flags register,  	 * and branch to the address found there.  	 */ -	gic_raise_softirq(cpumask_of(cpu), 1); +	gic_raise_softirq(cpumask_of(cpu), 0);  	timeout = jiffies + (1 * HZ);  	while (time_before(jiffies, timeout)) { diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig new file mode 100644 index 00000000000..caa2c5e734f --- /dev/null +++ b/arch/arm/mach-mvebu/Kconfig @@ -0,0 +1,16 @@ +if ARCH_MVEBU + +menu "Marvell SOC with device tree" + +config MACH_ARMADA_370_XP +	bool "Marvell Armada 370 and Aramada XP boards" +	select ARMADA_370_XP_TIMER +	select CPU_V7 +	help + +	  Say 'Y' here if you want your kernel to support boards based on +	  Marvell Armada 370 or Armada XP with device tree. + +endmenu + +endif diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile new file mode 100644 index 00000000000..e61d2b8fdf5 --- /dev/null +++ b/arch/arm/mach-mvebu/Makefile @@ -0,0 +1,2 @@ +obj-y += system-controller.o +obj-$(CONFIG_MACH_ARMADA_370_XP) += armada-370-xp.o irq-armada-370-xp.o diff --git a/arch/arm/mach-mvebu/Makefile.boot b/arch/arm/mach-mvebu/Makefile.boot new file mode 100644 index 00000000000..2579a2fc233 --- /dev/null +++ b/arch/arm/mach-mvebu/Makefile.boot @@ -0,0 +1,3 @@ +zreladdr-y := 0x00008000 +dtb-$(CONFIG_MACH_ARMADA_370_XP) += armada-370-db.dtb +dtb-$(CONFIG_MACH_ARMADA_370_XP) += armada-xp-db.dtb diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c new file mode 100644 index 00000000000..4ef923b032e --- /dev/null +++ b/arch/arm/mach-mvebu/armada-370-xp.c @@ -0,0 +1,63 @@ +/* + * Device Tree support for Armada 370 and XP platforms. + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/of_platform.h> +#include <linux/io.h> +#include <linux/time-armada-370-xp.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/time.h> +#include <mach/armada-370-xp.h> +#include "common.h" + +static struct map_desc armada_370_xp_io_desc[] __initdata = { +	{ +		.virtual	= ARMADA_370_XP_REGS_VIRT_BASE, +		.pfn		= __phys_to_pfn(ARMADA_370_XP_REGS_PHYS_BASE), +		.length		= ARMADA_370_XP_REGS_SIZE, +		.type		= MT_DEVICE, +	}, +}; + +void __init armada_370_xp_map_io(void) +{ +	iotable_init(armada_370_xp_io_desc, ARRAY_SIZE(armada_370_xp_io_desc)); +} + +struct sys_timer armada_370_xp_timer = { +	.init		= armada_370_xp_timer_init, +}; + +static void __init armada_370_xp_dt_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char * const armada_370_xp_dt_board_dt_compat[] = { +	"marvell,a370-db", +	"marvell,axp-db", +	NULL, +}; + +DT_MACHINE_START(ARMADA_XP_DT, "Marvell Aramada 370/XP (Device Tree)") +	.init_machine	= armada_370_xp_dt_init, +	.map_io		= armada_370_xp_map_io, +	.init_irq	= armada_370_xp_init_irq, +	.handle_irq     = armada_370_xp_handle_irq, +	.timer		= &armada_370_xp_timer, +	.restart	= mvebu_restart, +	.dt_compat	= armada_370_xp_dt_board_dt_compat, +MACHINE_END diff --git a/arch/arm/mach-mvebu/common.h b/arch/arm/mach-mvebu/common.h new file mode 100644 index 00000000000..02f89eaa25f --- /dev/null +++ b/arch/arm/mach-mvebu/common.h @@ -0,0 +1,23 @@ +/* + * Core functions for Marvell System On Chip + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef __ARCH_MVEBU_COMMON_H +#define __ARCH_MVEBU_COMMON_H + +void mvebu_restart(char mode, const char *cmd); + +void armada_370_xp_init_irq(void); +void armada_370_xp_handle_irq(struct pt_regs *regs); + +#endif diff --git a/arch/arm/mach-mvebu/include/mach/armada-370-xp.h b/arch/arm/mach-mvebu/include/mach/armada-370-xp.h new file mode 100644 index 00000000000..25f0ca8d782 --- /dev/null +++ b/arch/arm/mach-mvebu/include/mach/armada-370-xp.h @@ -0,0 +1,22 @@ +/* + * Generic definitions for Marvell Armada_370_XP SoCs + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef __MACH_ARMADA_370_XP_H +#define __MACH_ARMADA_370_XP_H + +#define ARMADA_370_XP_REGS_PHYS_BASE	0xd0000000 +#define ARMADA_370_XP_REGS_VIRT_BASE	0xfeb00000 +#define ARMADA_370_XP_REGS_SIZE		SZ_1M + +#endif /* __MACH_ARMADA_370_XP_H */ diff --git a/arch/arm/mach-mvebu/include/mach/debug-macro.S b/arch/arm/mach-mvebu/include/mach/debug-macro.S new file mode 100644 index 00000000000..22825760c7e --- /dev/null +++ b/arch/arm/mach-mvebu/include/mach/debug-macro.S @@ -0,0 +1,24 @@ +/* + * Early serial output macro for Marvell  SoC + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory Clement <gregory.clement@free-electrons.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 <mach/armada-370-xp.h> + +	.macro	addruart, rp, rv, tmp +	ldr	\rp, =ARMADA_370_XP_REGS_PHYS_BASE +	ldr	\rv, =ARMADA_370_XP_REGS_VIRT_BASE +	orr	\rp, \rp, #0x00012000 +	orr	\rv, \rv, #0x00012000 +	.endm + +#define UART_SHIFT	2 +#include <asm/hardware/debug-8250.S> diff --git a/arch/arm/mach-mvebu/include/mach/timex.h b/arch/arm/mach-mvebu/include/mach/timex.h new file mode 100644 index 00000000000..ab324a3748f --- /dev/null +++ b/arch/arm/mach-mvebu/include/mach/timex.h @@ -0,0 +1,13 @@ +/* + * Marvell Armada SoC time definitions + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#define CLOCK_TICK_RATE		(100 * HZ) diff --git a/arch/arm/mach-mvebu/include/mach/uncompress.h b/arch/arm/mach-mvebu/include/mach/uncompress.h new file mode 100644 index 00000000000..d6a100ccf30 --- /dev/null +++ b/arch/arm/mach-mvebu/include/mach/uncompress.h @@ -0,0 +1,43 @@ +/* + * Marvell Armada SoC kernel uncompression UART routines + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <mach/armada-370-xp.h> + +#define UART_THR ((volatile unsigned char *)(ARMADA_370_XP_REGS_PHYS_BASE\ +								+ 0x12000)) +#define UART_LSR ((volatile unsigned char *)(ARMADA_370_XP_REGS_PHYS_BASE\ +								+ 0x12014)) + +#define LSR_THRE	0x20 + +static void putc(const char c) +{ +	int i; + +	for (i = 0; i < 0x1000; i++) { +		/* Transmit fifo not full? */ +		if (*UART_LSR & LSR_THRE) +			break; +	} + +	*UART_THR = c; +} + +static void flush(void) +{ +} + +/* + * nothing to do + */ +#define arch_decomp_setup() +#define arch_decomp_wdog() diff --git a/arch/arm/mach-mvebu/irq-armada-370-xp.c b/arch/arm/mach-mvebu/irq-armada-370-xp.c new file mode 100644 index 00000000000..5f5f9394b6b --- /dev/null +++ b/arch/arm/mach-mvebu/irq-armada-370-xp.c @@ -0,0 +1,133 @@ +/* + * Marvell Armada 370 and Armada XP SoC IRQ handling + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * Ben Dooks <ben.dooks@codethink.co.uk> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <asm/mach/arch.h> +#include <asm/exception.h> + +/* Interrupt Controller Registers Map */ +#define ARMADA_370_XP_INT_SET_MASK_OFFS		(0x48) +#define ARMADA_370_XP_INT_CLEAR_MASK_OFFS	(0x4C) + +#define ARMADA_370_XP_INT_CONTROL		(0x00) +#define ARMADA_370_XP_INT_SET_ENABLE_OFFS	(0x30) +#define ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS	(0x34) + +#define ARMADA_370_XP_CPU_INTACK_OFFS		(0x44) + +static void __iomem *per_cpu_int_base; +static void __iomem *main_int_base; +static struct irq_domain *armada_370_xp_mpic_domain; + +static void armada_370_xp_irq_mask(struct irq_data *d) +{ +	writel(irqd_to_hwirq(d), +	       per_cpu_int_base + ARMADA_370_XP_INT_SET_MASK_OFFS); +} + +static void armada_370_xp_irq_unmask(struct irq_data *d) +{ +	writel(irqd_to_hwirq(d), +	       per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS); +} + +static struct irq_chip armada_370_xp_irq_chip = { +	.name		= "armada_370_xp_irq", +	.irq_mask       = armada_370_xp_irq_mask, +	.irq_mask_ack   = armada_370_xp_irq_mask, +	.irq_unmask     = armada_370_xp_irq_unmask, +}; + +static int armada_370_xp_mpic_irq_map(struct irq_domain *h, +				      unsigned int virq, irq_hw_number_t hw) +{ +	armada_370_xp_irq_mask(irq_get_irq_data(virq)); +	writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS); + +	irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip, +				 handle_level_irq); +	irq_set_status_flags(virq, IRQ_LEVEL); +	set_irq_flags(virq, IRQF_VALID | IRQF_PROBE); + +	return 0; +} + +static struct irq_domain_ops armada_370_xp_mpic_irq_ops = { +	.map = armada_370_xp_mpic_irq_map, +	.xlate = irq_domain_xlate_onecell, +}; + +static int __init armada_370_xp_mpic_of_init(struct device_node *node, +					     struct device_node *parent) +{ +	u32 control; + +	main_int_base = of_iomap(node, 0); +	per_cpu_int_base = of_iomap(node, 1); + +	BUG_ON(!main_int_base); +	BUG_ON(!per_cpu_int_base); + +	control = readl(main_int_base + ARMADA_370_XP_INT_CONTROL); + +	armada_370_xp_mpic_domain = +	    irq_domain_add_linear(node, (control >> 2) & 0x3ff, +				  &armada_370_xp_mpic_irq_ops, NULL); + +	if (!armada_370_xp_mpic_domain) +		panic("Unable to add Armada_370_Xp MPIC irq domain (DT)\n"); + +	irq_set_default_host(armada_370_xp_mpic_domain); +	return 0; +} + +asmlinkage void __exception_irq_entry armada_370_xp_handle_irq(struct pt_regs +							       *regs) +{ +	u32 irqstat, irqnr; + +	do { +		irqstat = readl_relaxed(per_cpu_int_base + +					ARMADA_370_XP_CPU_INTACK_OFFS); +		irqnr = irqstat & 0x3FF; + +		if (irqnr < 1023) { +			irqnr = +			    irq_find_mapping(armada_370_xp_mpic_domain, irqnr); +			handle_IRQ(irqnr, regs); +			continue; +		} + +		break; +	} while (1); +} + +static const struct of_device_id mpic_of_match[] __initconst = { +	{.compatible = "marvell,mpic", .data = armada_370_xp_mpic_of_init}, +	{}, +}; + +void __init armada_370_xp_init_irq(void) +{ +	of_irq_init(mpic_of_match); +} diff --git a/arch/arm/mach-mvebu/system-controller.c b/arch/arm/mach-mvebu/system-controller.c new file mode 100644 index 00000000000..b8079df8c98 --- /dev/null +++ b/arch/arm/mach-mvebu/system-controller.c @@ -0,0 +1,105 @@ +/* + * System controller support for Armada 370 and XP platforms. + * + * Copyright (C) 2012 Marvell + * + * Lior Amsalem <alior@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + * + * The Armada 370 and Armada XP SoCs both have a range of + * miscellaneous registers, that do not belong to a particular device, + * but rather provide system-level features. This basic + * system-controller driver provides a device tree binding for those + * registers, and implements utility functions offering various + * features related to those registers. + * + * For now, the feature set is limited to restarting the platform by a + * soft-reset, but it might be extended in the future. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/of_address.h> +#include <linux/io.h> + +static void __iomem *system_controller_base; + +struct mvebu_system_controller { +	u32 rstoutn_mask_offset; +	u32 system_soft_reset_offset; + +	u32 rstoutn_mask_reset_out_en; +	u32 system_soft_reset; +}; +static struct mvebu_system_controller *mvebu_sc; + +const struct mvebu_system_controller armada_370_xp_system_controller = { +	.rstoutn_mask_offset = 0x60, +	.system_soft_reset_offset = 0x64, +	.rstoutn_mask_reset_out_en = 0x1, +	.system_soft_reset = 0x1, +}; + +const struct mvebu_system_controller orion_system_controller = { +	.rstoutn_mask_offset = 0x108, +	.system_soft_reset_offset = 0x10c, +	.rstoutn_mask_reset_out_en = 0x4, +	.system_soft_reset = 0x1, +}; + +static struct of_device_id of_system_controller_table[] = { +	{ +		.compatible = "marvell,orion-system-controller", +		.data = (void *) &orion_system_controller, +	}, { +		.compatible = "marvell,armada-370-xp-system-controller", +		.data = (void *) &armada_370_xp_system_controller, +	}, +	{ /* end of list */ }, +}; + +void mvebu_restart(char mode, const char *cmd) +{ +	if (!system_controller_base) { +		pr_err("Cannot restart, system-controller not available: check the device tree\n"); +	} else { +		/* +		 * Enable soft reset to assert RSTOUTn. +		 */ +		writel(mvebu_sc->rstoutn_mask_reset_out_en, +			system_controller_base + +			mvebu_sc->rstoutn_mask_offset); +		/* +		 * Assert soft reset. +		 */ +		writel(mvebu_sc->system_soft_reset, +			system_controller_base + +			mvebu_sc->system_soft_reset_offset); +	} + +	while (1) +		; +} + +static int __init mvebu_system_controller_init(void) +{ +	struct device_node *np; + +	np = of_find_matching_node(NULL, of_system_controller_table); +	if (np) { +		const struct of_device_id *match = +		    of_match_node(of_system_controller_table, np); +		BUG_ON(!match); +		system_controller_base = of_iomap(np, 0); +		mvebu_sc = (struct mvebu_system_controller *)match->data; +	} + +	return 0; +} + +arch_initcall(mvebu_system_controller_init); diff --git a/arch/arm/mach-mxs/Kconfig b/arch/arm/mach-mxs/Kconfig index 91cf0625819..ccdf83b17cf 100644 --- a/arch/arm/mach-mxs/Kconfig +++ b/arch/arm/mach-mxs/Kconfig @@ -16,6 +16,7 @@ config SOC_IMX28  	bool  	select ARM_AMBA  	select CPU_ARM926T +	select HAVE_CAN_FLEXCAN if CAN  	select HAVE_PWM  	select PINCTRL_IMX28 diff --git a/arch/arm/mach-mxs/Makefile.boot b/arch/arm/mach-mxs/Makefile.boot index 07b11fe6453..4582999cf08 100644 --- a/arch/arm/mach-mxs/Makefile.boot +++ b/arch/arm/mach-mxs/Makefile.boot @@ -1 +1,10 @@  zreladdr-y += 0x40008000 + +dtb-y += imx23-evk.dtb \ +	 imx23-olinuxino.dtb \ +	 imx23-stmp378x_devb.dtb \ +	 imx28-apx4devkit.dtb \ +	 imx28-cfa10036.dtb \ +	 imx28-evk.dtb \ +	 imx28-m28evk.dtb \ +	 imx28-tx28.dtb \ diff --git a/arch/arm/mach-mxs/devices-mx23.h b/arch/arm/mach-mxs/devices-mx23.h index 9acdd638704..9ee5cede3d4 100644 --- a/arch/arm/mach-mxs/devices-mx23.h +++ b/arch/arm/mach-mxs/devices-mx23.h @@ -10,7 +10,7 @@   */  #include <mach/mx23.h>  #include <mach/devices-common.h> -#include <mach/mxsfb.h> +#include <linux/mxsfb.h>  #include <linux/amba/bus.h>  static inline int mx23_add_duart(void) diff --git a/arch/arm/mach-mxs/devices-mx28.h b/arch/arm/mach-mxs/devices-mx28.h index 84b2960df11..fcab431060f 100644 --- a/arch/arm/mach-mxs/devices-mx28.h +++ b/arch/arm/mach-mxs/devices-mx28.h @@ -10,7 +10,7 @@   */  #include <mach/mx28.h>  #include <mach/devices-common.h> -#include <mach/mxsfb.h> +#include <linux/mxsfb.h>  #include <linux/amba/bus.h>  static inline int mx28_add_duart(void) diff --git a/arch/arm/mach-mxs/devices/platform-mxsfb.c b/arch/arm/mach-mxs/devices/platform-mxsfb.c index 5a75b7180f7..76b53f73418 100644 --- a/arch/arm/mach-mxs/devices/platform-mxsfb.c +++ b/arch/arm/mach-mxs/devices/platform-mxsfb.c @@ -10,7 +10,7 @@  #include <mach/mx23.h>  #include <mach/mx28.h>  #include <mach/devices-common.h> -#include <mach/mxsfb.h> +#include <linux/mxsfb.h>  #ifdef CONFIG_SOC_IMX23  struct platform_device *__init mx23_add_mxsfb( diff --git a/arch/arm/mach-mxs/include/mach/mxsfb.h b/arch/arm/mach-mxs/include/mach/mxsfb.h deleted file mode 100644 index e4d79791515..00000000000 --- a/arch/arm/mach-mxs/include/mach/mxsfb.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - */ - -#ifndef __MACH_FB_H -#define __MACH_FB_H - -#include <linux/fb.h> - -#define STMLCDIF_8BIT 1	/** pixel data bus to the display is of 8 bit width */ -#define STMLCDIF_16BIT 0 /** pixel data bus to the display is of 16 bit width */ -#define STMLCDIF_18BIT 2 /** pixel data bus to the display is of 18 bit width */ -#define STMLCDIF_24BIT 3 /** pixel data bus to the display is of 24 bit width */ - -#define FB_SYNC_DATA_ENABLE_HIGH_ACT	(1 << 6) -#define FB_SYNC_DOTCLK_FAILING_ACT	(1 << 7) /* failing/negtive edge sampling */ - -struct mxsfb_platform_data { -	struct fb_videomode *mode_list; -	unsigned mode_count; - -	unsigned default_bpp; - -	unsigned dotclk_delay;	/* refer manual HW_LCDIF_VDCTRL4 register */ -	unsigned ld_intf_width;	/* refer STMLCDIF_* macros */ - -	unsigned fb_size;	/* Size of the video memory. If zero a -				 * default will be used -				 */ -	unsigned long fb_phys;	/* physical address for the video memory. If -				 * zero the framebuffer memory will be dynamically -				 * allocated. If specified,fb_size must also be specified. -				 * fb_phys must be unused by Linux. -				 */ -}; - -#endif /* __MACH_FB_H */ diff --git a/arch/arm/mach-mxs/mach-mxs.c b/arch/arm/mach-mxs/mach-mxs.c index 8cac94b3302..8dabfe81d07 100644 --- a/arch/arm/mach-mxs/mach-mxs.c +++ b/arch/arm/mach-mxs/mach-mxs.c @@ -16,12 +16,95 @@  #include <linux/init.h>  #include <linux/init.h>  #include <linux/irqdomain.h> +#include <linux/micrel_phy.h> +#include <linux/mxsfb.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h> +#include <linux/phy.h>  #include <asm/mach/arch.h>  #include <asm/mach/time.h>  #include <mach/common.h> +static struct fb_videomode mx23evk_video_modes[] = { +	{ +		.name		= "Samsung-LMS430HF02", +		.refresh	= 60, +		.xres		= 480, +		.yres		= 272, +		.pixclock	= 108096, /* picosecond (9.2 MHz) */ +		.left_margin	= 15, +		.right_margin	= 8, +		.upper_margin	= 12, +		.lower_margin	= 4, +		.hsync_len	= 1, +		.vsync_len	= 1, +		.sync		= FB_SYNC_DATA_ENABLE_HIGH_ACT | +				  FB_SYNC_DOTCLK_FAILING_ACT, +	}, +}; + +static struct fb_videomode mx28evk_video_modes[] = { +	{ +		.name		= "Seiko-43WVF1G", +		.refresh	= 60, +		.xres		= 800, +		.yres		= 480, +		.pixclock	= 29851, /* picosecond (33.5 MHz) */ +		.left_margin	= 89, +		.right_margin	= 164, +		.upper_margin	= 23, +		.lower_margin	= 10, +		.hsync_len	= 10, +		.vsync_len	= 10, +		.sync		= FB_SYNC_DATA_ENABLE_HIGH_ACT | +				  FB_SYNC_DOTCLK_FAILING_ACT, +	}, +}; + +static struct fb_videomode m28evk_video_modes[] = { +	{ +		.name		= "Ampire AM-800480R2TMQW-T01H", +		.refresh	= 60, +		.xres		= 800, +		.yres		= 480, +		.pixclock	= 30066, /* picosecond (33.26 MHz) */ +		.left_margin	= 0, +		.right_margin	= 256, +		.upper_margin	= 0, +		.lower_margin	= 45, +		.hsync_len	= 1, +		.vsync_len	= 1, +		.sync		= FB_SYNC_DATA_ENABLE_HIGH_ACT, +	}, +}; + +static struct fb_videomode apx4devkit_video_modes[] = { +	{ +		.name		= "HannStar PJ70112A", +		.refresh	= 60, +		.xres		= 800, +		.yres		= 480, +		.pixclock	= 33333, /* picosecond (30.00 MHz) */ +		.left_margin	= 88, +		.right_margin	= 40, +		.upper_margin	= 32, +		.lower_margin	= 13, +		.hsync_len	= 48, +		.vsync_len	= 3, +		.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT | +				  FB_SYNC_DATA_ENABLE_HIGH_ACT | +				  FB_SYNC_DOTCLK_FAILING_ACT, +	}, +}; + +static struct mxsfb_platform_data mxsfb_pdata __initdata; + +static struct of_dev_auxdata mxs_auxdata_lookup[] __initdata = { +	OF_DEV_AUXDATA("fsl,imx23-lcdif", 0x80030000, NULL, &mxsfb_pdata), +	OF_DEV_AUXDATA("fsl,imx28-lcdif", 0x80030000, NULL, &mxsfb_pdata), +	{ /* sentinel */ } +}; +  static int __init mxs_icoll_add_irq_domain(struct device_node *np,  				struct device_node *interrupt_parent)  { @@ -71,33 +154,151 @@ static struct sys_timer imx28_timer = {  	.init = imx28_timer_init,  }; -static void __init imx28_evk_init(void) +enum mac_oui { +	OUI_FSL, +	OUI_DENX, +}; + +static void __init update_fec_mac_prop(enum mac_oui oui) +{ +	struct device_node *np, *from = NULL; +	struct property *newmac; +	const u32 *ocotp = mxs_get_ocotp(); +	u8 *macaddr; +	u32 val; +	int i; + +	for (i = 0; i < 2; i++) { +		np = of_find_compatible_node(from, NULL, "fsl,imx28-fec"); +		if (!np) +			return; +		from = np; + +		newmac = kzalloc(sizeof(*newmac) + 6, GFP_KERNEL); +		if (!newmac) +			return; +		newmac->value = newmac + 1; +		newmac->length = 6; + +		newmac->name = kstrdup("local-mac-address", GFP_KERNEL); +		if (!newmac->name) { +			kfree(newmac); +			return; +		} + +		/* +		 * OCOTP only stores the last 4 octets for each mac address, +		 * so hard-code OUI here. +		 */ +		macaddr = newmac->value; +		switch (oui) { +		case OUI_FSL: +			macaddr[0] = 0x00; +			macaddr[1] = 0x04; +			macaddr[2] = 0x9f; +			break; +		case OUI_DENX: +			macaddr[0] = 0xc0; +			macaddr[1] = 0xe5; +			macaddr[2] = 0x4e; +			break; +		} +		val = ocotp[i]; +		macaddr[3] = (val >> 16) & 0xff; +		macaddr[4] = (val >> 8) & 0xff; +		macaddr[5] = (val >> 0) & 0xff; + +		prom_update_property(np, newmac); +	} +} + +static void __init imx23_evk_init(void) +{ +	mxsfb_pdata.mode_list = mx23evk_video_modes; +	mxsfb_pdata.mode_count = ARRAY_SIZE(mx23evk_video_modes); +	mxsfb_pdata.default_bpp = 32; +	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT; +} + +static inline void enable_clk_enet_out(void)  { -	struct clk *clk; +	struct clk *clk = clk_get_sys("enet_out", NULL); -	/* Enable fec phy clock */ -	clk = clk_get_sys("enet_out", NULL);  	if (!IS_ERR(clk))  		clk_prepare_enable(clk);  } +static void __init imx28_evk_init(void) +{ +	enable_clk_enet_out(); +	update_fec_mac_prop(OUI_FSL); + +	mxsfb_pdata.mode_list = mx28evk_video_modes; +	mxsfb_pdata.mode_count = ARRAY_SIZE(mx28evk_video_modes); +	mxsfb_pdata.default_bpp = 32; +	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT; +} + +static void __init m28evk_init(void) +{ +	enable_clk_enet_out(); +	update_fec_mac_prop(OUI_DENX); + +	mxsfb_pdata.mode_list = m28evk_video_modes; +	mxsfb_pdata.mode_count = ARRAY_SIZE(m28evk_video_modes); +	mxsfb_pdata.default_bpp = 16; +	mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT; +} + +static int apx4devkit_phy_fixup(struct phy_device *phy) +{ +	phy->dev_flags |= MICREL_PHY_50MHZ_CLK; +	return 0; +} + +static void __init apx4devkit_init(void) +{ +	enable_clk_enet_out(); + +	if (IS_BUILTIN(CONFIG_PHYLIB)) +		phy_register_fixup_for_uid(PHY_ID_KS8051, MICREL_PHY_ID_MASK, +					   apx4devkit_phy_fixup); + +	mxsfb_pdata.mode_list = apx4devkit_video_modes; +	mxsfb_pdata.mode_count = ARRAY_SIZE(apx4devkit_video_modes); +	mxsfb_pdata.default_bpp = 32; +	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT; +} +  static void __init mxs_machine_init(void)  {  	if (of_machine_is_compatible("fsl,imx28-evk"))  		imx28_evk_init(); +	else if (of_machine_is_compatible("fsl,imx23-evk")) +		imx23_evk_init(); +	else if (of_machine_is_compatible("denx,m28evk")) +		m28evk_init(); +	else if (of_machine_is_compatible("bluegiga,apx4devkit")) +		apx4devkit_init();  	of_platform_populate(NULL, of_default_bus_match_table, -				NULL, NULL); +			     mxs_auxdata_lookup, NULL);  }  static const char *imx23_dt_compat[] __initdata = {  	"fsl,imx23-evk", +	"fsl,stmp378x_devb" +	"olimex,imx23-olinuxino",  	"fsl,imx23",  	NULL,  };  static const char *imx28_dt_compat[] __initdata = { +	"bluegiga,apx4devkit", +	"crystalfontz,cfa10036", +	"denx,m28evk",  	"fsl,imx28-evk", +	"karo,tx28",  	"fsl,imx28",  	NULL,  }; diff --git a/arch/arm/mach-mxs/module-tx28.c b/arch/arm/mach-mxs/module-tx28.c index 9a7b08b2a92..0f71f82101c 100644 --- a/arch/arm/mach-mxs/module-tx28.c +++ b/arch/arm/mach-mxs/module-tx28.c @@ -11,7 +11,7 @@  #include <linux/gpio.h>  #include <mach/iomux-mx28.h> -#include "../devices-mx28.h" +#include "devices-mx28.h"  #include "module-tx28.h" diff --git a/arch/arm/mach-netx/fb.c b/arch/arm/mach-netx/fb.c index 2cdf6ef69be..d122ee6ab99 100644 --- a/arch/arm/mach-netx/fb.c +++ b/arch/arm/mach-netx/fb.c @@ -69,29 +69,6 @@ void netx_clcd_remove(struct clcd_fb *fb)  			      fb->fb.screen_base, fb->fb.fix.smem_start);  } -void clk_disable(struct clk *clk) -{ -} - -int clk_set_rate(struct clk *clk, unsigned long rate) -{ -	return 0; -} - -int clk_enable(struct clk *clk) -{ -	return 0; -} - -struct clk *clk_get(struct device *dev, const char *id) -{ -	return dev && strcmp(dev_name(dev), "fb") == 0 ? NULL : ERR_PTR(-ENOENT); -} - -void clk_put(struct clk *clk) -{ -} -  static AMBA_AHB_DEVICE(fb, "fb", 0, 0x00104000, { NETX_IRQ_LCD }, NULL);  int netx_fb_init(struct clcd_board *board, struct clcd_panel *panel) diff --git a/arch/arm/mach-nomadik/Makefile b/arch/arm/mach-nomadik/Makefile index a6bbd1a7b4e..a42c9a33d3b 100644 --- a/arch/arm/mach-nomadik/Makefile +++ b/arch/arm/mach-nomadik/Makefile @@ -7,8 +7,6 @@  # Object file lists. -obj-y			+= clock.o -  # Cpu revision  obj-$(CONFIG_NOMADIK_8815) += cpu-8815.o diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index 2e8d3e176bc..f4535a7dadf 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c @@ -14,12 +14,14 @@  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/amba/bus.h> +#include <linux/amba/mmci.h>  #include <linux/interrupt.h>  #include <linux/gpio.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/nand.h>  #include <linux/mtd/onenand.h>  #include <linux/mtd/partitions.h> +#include <linux/i2c.h>  #include <linux/io.h>  #include <asm/hardware/vic.h>  #include <asm/sizes.h> @@ -185,16 +187,28 @@ static void __init nhk8815_onenand_init(void)  #endif  } -static AMBA_APB_DEVICE(uart0, "uart0", 0, NOMADIK_UART0_BASE, -	{ IRQ_UART0 }, NULL); +static struct mmci_platform_data mmcsd_plat_data = { +	.ocr_mask = MMC_VDD_29_30, +	.f_max = 48000000, +	.gpio_wp = -1, +	.gpio_cd = 111, +	.cd_invert = true, +	.capabilities = MMC_CAP_MMC_HIGHSPEED | +	MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA, +}; -static AMBA_APB_DEVICE(uart1, "uart1", 0, NOMADIK_UART1_BASE, -	{ IRQ_UART1 }, NULL); +static int __init nhk8815_mmcsd_init(void) +{ +	int ret; -static struct amba_device *amba_devs[] __initdata = { -	&uart0_device, -	&uart1_device, -}; +	ret = gpio_request(112, "card detect bias"); +	if (ret) +		return ret; +	gpio_direction_output(112, 0); +	amba_apb_device_add(NULL, "mmci", NOMADIK_SDI_BASE, SZ_4K, IRQ_SDMMC, 0, &mmcsd_plat_data, 0x10180180); +	return 0; +} +module_init(nhk8815_mmcsd_init);  static struct resource nhk8815_eth_resources[] = {  	{ @@ -253,17 +267,46 @@ static struct sys_timer nomadik_timer = {  	.init	= nomadik_timer_init,  }; +static struct i2c_board_info __initdata nhk8815_i2c0_devices[] = { +	{ +		I2C_BOARD_INFO("stw4811", 0x2d), +	}, +}; + +static struct i2c_board_info __initdata nhk8815_i2c1_devices[] = { +	{ +		I2C_BOARD_INFO("camera", 0x10), +	}, +	{ +		I2C_BOARD_INFO("stw5095", 0x1a), +	}, +	{ +		I2C_BOARD_INFO("lis3lv02dl", 0x1d), +	}, +}; + +static struct i2c_board_info __initdata nhk8815_i2c2_devices[] = { +	{ +		I2C_BOARD_INFO("stw4811-usb", 0x2d), +	}, +}; +  static void __init nhk8815_platform_init(void)  { -	int i; -  	cpu8815_platform_init();  	nhk8815_onenand_init();  	platform_add_devices(nhk8815_platform_devices,  			     ARRAY_SIZE(nhk8815_platform_devices)); -	for (i = 0; i < ARRAY_SIZE(amba_devs); i++) -		amba_device_register(amba_devs[i], &iomem_resource); +	amba_apb_device_add(NULL, "uart0", NOMADIK_UART0_BASE, SZ_4K, IRQ_UART0, 0, NULL, 0); +	amba_apb_device_add(NULL, "uart1", NOMADIK_UART1_BASE, SZ_4K, IRQ_UART1, 0, NULL, 0); + +	i2c_register_board_info(0, nhk8815_i2c0_devices, +				ARRAY_SIZE(nhk8815_i2c0_devices)); +	i2c_register_board_info(1, nhk8815_i2c1_devices, +				ARRAY_SIZE(nhk8815_i2c1_devices)); +	i2c_register_board_info(2, nhk8815_i2c2_devices, +				ARRAY_SIZE(nhk8815_i2c2_devices));  }  MACHINE_START(NOMADIK, "NHK8815") diff --git a/arch/arm/mach-nomadik/clock.c b/arch/arm/mach-nomadik/clock.c deleted file mode 100644 index 48a59f24e10..00000000000 --- a/arch/arm/mach-nomadik/clock.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - *  linux/arch/arm/mach-nomadik/clock.c - * - *  Copyright (C) 2009 Alessandro Rubini - */ -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/errno.h> -#include <linux/clk.h> -#include <linux/clkdev.h> -#include "clock.h" - -/* - * The nomadik board uses generic clocks, but the serial pl011 file - * calls clk_enable(), clk_disable(), clk_get_rate(), so we provide them - */ -unsigned long clk_get_rate(struct clk *clk) -{ -	return clk->rate; -} -EXPORT_SYMBOL(clk_get_rate); - -/* enable and disable do nothing */ -int clk_enable(struct clk *clk) -{ -	return 0; -} -EXPORT_SYMBOL(clk_enable); - -void clk_disable(struct clk *clk) -{ -} -EXPORT_SYMBOL(clk_disable); - -static struct clk clk_24 = { -	.rate = 2400000, -}; - -static struct clk clk_48 = { -	.rate = 48 * 1000 * 1000, -}; - -/* - * Catch-all default clock to satisfy drivers using the clk API.  We don't - * model the actual hardware clocks yet. - */ -static struct clk clk_default; - -#define CLK(_clk, dev)				\ -	{					\ -		.clk		= _clk,		\ -		.dev_id		= dev,		\ -	} - -static struct clk_lookup lookups[] = { -	{ -		.con_id		= "apb_pclk", -		.clk		= &clk_default, -	}, -	CLK(&clk_24, "mtu0"), -	CLK(&clk_24, "mtu1"), -	CLK(&clk_48, "uart0"), -	CLK(&clk_48, "uart1"), -	CLK(&clk_default, "gpio.0"), -	CLK(&clk_default, "gpio.1"), -	CLK(&clk_default, "gpio.2"), -	CLK(&clk_default, "gpio.3"), -	CLK(&clk_default, "rng"), -}; - -int __init clk_init(void) -{ -	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); -	return 0; -} diff --git a/arch/arm/mach-nomadik/clock.h b/arch/arm/mach-nomadik/clock.h deleted file mode 100644 index 78da2e7c398..00000000000 --- a/arch/arm/mach-nomadik/clock.h +++ /dev/null @@ -1,15 +0,0 @@ - -/* - *  linux/arch/arm/mach-nomadik/clock.h - * - *  Copyright (C) 2009 Alessandro Rubini - * - * 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 clk { -	unsigned long		rate; -}; - -int __init clk_init(void); diff --git a/arch/arm/mach-nomadik/cpu-8815.c b/arch/arm/mach-nomadik/cpu-8815.c index 27f43a46985..6fd8e46567a 100644 --- a/arch/arm/mach-nomadik/cpu-8815.c +++ b/arch/arm/mach-nomadik/cpu-8815.c @@ -22,6 +22,10 @@  #include <linux/amba/bus.h>  #include <linux/platform_device.h>  #include <linux/io.h> +#include <linux/slab.h> +#include <linux/irq.h> +#include <linux/dma-mapping.h> +#include <linux/platform_data/clk-nomadik.h>  #include <plat/gpio-nomadik.h>  #include <mach/hardware.h> @@ -32,91 +36,63 @@  #include <asm/cacheflush.h>  #include <asm/hardware/cache-l2x0.h> -#include "clock.h"  #include "cpu-8815.h" -#define __MEM_4K_RESOURCE(x) \ -	.res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM} -  /* The 8815 has 4 GPIO blocks, let's register them immediately */ - -#define GPIO_RESOURCE(block)						\ -	{								\ -		.start	= NOMADIK_GPIO##block##_BASE,			\ -		.end	= NOMADIK_GPIO##block##_BASE + SZ_4K - 1,	\ -		.flags	= IORESOURCE_MEM,				\ -	},								\ -	{								\ -		.start	= IRQ_GPIO##block,				\ -		.end	= IRQ_GPIO##block,				\ -		.flags	= IORESOURCE_IRQ,				\ -	} - -#define GPIO_DEVICE(block)						\ -	{								\ -		.name 		= "gpio",				\ -		.id		= block,				\ -		.num_resources 	= 2,					\ -		.resource	= &cpu8815_gpio_resources[block * 2],	\ -		.dev = {						\ -			.platform_data = &cpu8815_gpio[block],		\ -		},							\ -	} - -static struct nmk_gpio_platform_data cpu8815_gpio[] = { -	{ -		.name = "GPIO-0-31", -		.first_gpio = 0, -		.first_irq = NOMADIK_GPIO_TO_IRQ(0), -	}, { -		.name = "GPIO-32-63", -		.first_gpio = 32, -		.first_irq = NOMADIK_GPIO_TO_IRQ(32), -	}, { -		.name = "GPIO-64-95", -		.first_gpio = 64, -		.first_irq = NOMADIK_GPIO_TO_IRQ(64), -	}, { -		.name = "GPIO-96-127", /* 124..127 not routed to pin */ -		.first_gpio = 96, -		.first_irq = NOMADIK_GPIO_TO_IRQ(96), -	} +static resource_size_t __initdata cpu8815_gpio_base[] = { +	NOMADIK_GPIO0_BASE, +	NOMADIK_GPIO1_BASE, +	NOMADIK_GPIO2_BASE, +	NOMADIK_GPIO3_BASE,  }; -static struct resource cpu8815_gpio_resources[] = { -	GPIO_RESOURCE(0), -	GPIO_RESOURCE(1), -	GPIO_RESOURCE(2), -	GPIO_RESOURCE(3), -}; +static struct platform_device * +cpu8815_add_gpio(int id, resource_size_t addr, int irq, +		 struct nmk_gpio_platform_data *pdata) +{ +	struct resource resources[] = { +		{ +			.start	= addr, +			.end	= addr + 127, +			.flags	= IORESOURCE_MEM, +		}, +		{ +			.start	= irq, +			.end	= irq, +			.flags	= IORESOURCE_IRQ, +		} +	}; -static struct platform_device cpu8815_platform_gpio[] = { -	GPIO_DEVICE(0), -	GPIO_DEVICE(1), -	GPIO_DEVICE(2), -	GPIO_DEVICE(3), -}; +	return platform_device_register_resndata(NULL, "gpio", id, +				resources, ARRAY_SIZE(resources), +				pdata, sizeof(*pdata)); +} -static AMBA_APB_DEVICE(cpu8815_amba_rng, "rng", 0, NOMADIK_RNG_BASE, { }, NULL); +void cpu8815_add_gpios(resource_size_t *base, int num, int irq, +		       struct nmk_gpio_platform_data *pdata) +{ +	int first = 0; +	int i; -static struct platform_device *platform_devs[] __initdata = { -	cpu8815_platform_gpio + 0, -	cpu8815_platform_gpio + 1, -	cpu8815_platform_gpio + 2, -	cpu8815_platform_gpio + 3, -}; +	for (i = 0; i < num; i++, first += 32, irq++) { +		pdata->first_gpio = first; +		pdata->first_irq = NOMADIK_GPIO_TO_IRQ(first); +		pdata->num_gpio = 32; -static struct amba_device *amba_devs[] __initdata = { -	&cpu8815_amba_rng_device -}; +		cpu8815_add_gpio(i, base[i], irq, pdata); +	} +}  static int __init cpu8815_init(void)  { -	int i; +	struct nmk_gpio_platform_data pdata = { +		/* No custom data yet */ +	}; -	platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); -	for (i = 0; i < ARRAY_SIZE(amba_devs); i++) -		amba_device_register(amba_devs[i], &iomem_resource); +	cpu8815_add_gpios(cpu8815_gpio_base, ARRAY_SIZE(cpu8815_gpio_base), +			  IRQ_GPIO0, &pdata); +	amba_apb_device_add(NULL, "rng", NOMADIK_RNG_BASE, SZ_4K, 0, 0, NULL, 0); +	amba_apb_device_add(NULL, "rtc-pl031", NOMADIK_RTC_BASE, SZ_4K, IRQ_RTC_RTT, 0, NULL, 0);  	return 0;  }  arch_initcall(cpu8815_init); @@ -147,7 +123,7 @@ void __init cpu8815_init_irq(void)  	 * Init clocks here so that they are available for system timer  	 * initialization.  	 */ -	clk_init(); +	nomadik_clk_init();  }  /* diff --git a/arch/arm/mach-nomadik/i2c-8815nhk.c b/arch/arm/mach-nomadik/i2c-8815nhk.c index 0fc2f6f1cc9..6d14454d460 100644 --- a/arch/arm/mach-nomadik/i2c-8815nhk.c +++ b/arch/arm/mach-nomadik/i2c-8815nhk.c @@ -5,6 +5,7 @@  #include <linux/i2c-gpio.h>  #include <linux/platform_device.h>  #include <plat/gpio-nomadik.h> +#include <plat/pincfg.h>  /*   * There are two busses in the 8815NHK. @@ -12,19 +13,27 @@   * use bit-bang through GPIO by now, to keep things simple   */ +/* I2C0 connected to the STw4811 power management chip */  static struct i2c_gpio_platform_data nhk8815_i2c_data0 = {  	/* keep defaults for timeouts; pins are push-pull bidirectional */  	.scl_pin = 62,  	.sda_pin = 63,  }; +/* I2C1 connected to various sensors */  static struct i2c_gpio_platform_data nhk8815_i2c_data1 = {  	/* keep defaults for timeouts; pins are push-pull bidirectional */  	.scl_pin = 53,  	.sda_pin = 54,  }; -/* first bus: GPIO XX and YY */ +/* I2C2 connected to the USB portions of the STw4811 only */ +static struct i2c_gpio_platform_data nhk8815_i2c_data2 = { +	/* keep defaults for timeouts; pins are push-pull bidirectional */ +	.scl_pin = 73, +	.sda_pin = 74, +}; +  static struct platform_device nhk8815_i2c_dev0 = {  	.name	= "i2c-gpio",  	.id	= 0, @@ -32,7 +41,7 @@ static struct platform_device nhk8815_i2c_dev0 = {  		.platform_data = &nhk8815_i2c_data0,  	},  }; -/* second bus: GPIO XX and YY */ +  static struct platform_device nhk8815_i2c_dev1 = {  	.name	= "i2c-gpio",  	.id	= 1, @@ -41,15 +50,29 @@ static struct platform_device nhk8815_i2c_dev1 = {  	},  }; +static struct platform_device nhk8815_i2c_dev2 = { +	.name	= "i2c-gpio", +	.id	= 2, +	.dev	= { +		.platform_data = &nhk8815_i2c_data2, +	}, +}; + +static pin_cfg_t cpu8815_pins_i2c[] = { +	PIN_CFG_INPUT(62, GPIO, PULLUP), +	PIN_CFG_INPUT(63, GPIO, PULLUP), +	PIN_CFG_INPUT(53, GPIO, PULLUP), +	PIN_CFG_INPUT(54, GPIO, PULLUP), +	PIN_CFG_INPUT(73, GPIO, PULLUP), +	PIN_CFG_INPUT(74, GPIO, PULLUP), +}; +  static int __init nhk8815_i2c_init(void)  { -	nmk_gpio_set_mode(nhk8815_i2c_data0.scl_pin, NMK_GPIO_ALT_GPIO); -	nmk_gpio_set_mode(nhk8815_i2c_data0.sda_pin, NMK_GPIO_ALT_GPIO); +	nmk_config_pins(cpu8815_pins_i2c, ARRAY_SIZE(cpu8815_pins_i2c));  	platform_device_register(&nhk8815_i2c_dev0); - -	nmk_gpio_set_mode(nhk8815_i2c_data1.scl_pin, NMK_GPIO_ALT_GPIO); -	nmk_gpio_set_mode(nhk8815_i2c_data1.sda_pin, NMK_GPIO_ALT_GPIO);  	platform_device_register(&nhk8815_i2c_dev1); +	platform_device_register(&nhk8815_i2c_dev2);  	return 0;  } @@ -58,6 +81,7 @@ static void __exit nhk8815_i2c_exit(void)  {  	platform_device_unregister(&nhk8815_i2c_dev0);  	platform_device_unregister(&nhk8815_i2c_dev1); +	platform_device_unregister(&nhk8815_i2c_dev2);  	return;  } diff --git a/arch/arm/mach-nomadik/include/mach/irqs.h b/arch/arm/mach-nomadik/include/mach/irqs.h index 8faabc56039..a118e615f86 100644 --- a/arch/arm/mach-nomadik/include/mach/irqs.h +++ b/arch/arm/mach-nomadik/include/mach/irqs.h @@ -22,56 +22,56 @@  #include <mach/hardware.h> -#define IRQ_VIC_START		0	/* first VIC interrupt is 0 */ +#define IRQ_VIC_START		1	/* first VIC interrupt is 1 */  /*   * Interrupt numbers generic for all Nomadik Chip cuts   */ -#define IRQ_WATCHDOG			0 -#define IRQ_SOFTINT			1 -#define IRQ_CRYPTO			2 -#define IRQ_OWM				3 -#define IRQ_MTU0			4 -#define IRQ_MTU1			5 -#define IRQ_GPIO0			6 -#define IRQ_GPIO1			7 -#define IRQ_GPIO2			8 -#define IRQ_GPIO3			9 -#define IRQ_RTC_RTT			10 -#define IRQ_SSP				11 -#define IRQ_UART0			12 -#define IRQ_DMA1			13 -#define IRQ_CLCD_MDIF			14 -#define IRQ_DMA0			15 -#define IRQ_PWRFAIL			16 -#define IRQ_UART1			17 -#define IRQ_FIRDA			18 -#define IRQ_MSP0			19 -#define IRQ_I2C0			20 -#define IRQ_I2C1			21 -#define IRQ_SDMMC			22 -#define IRQ_USBOTG			23 -#define IRQ_SVA_IT0			24 -#define IRQ_SVA_IT1			25 -#define IRQ_SAA_IT0			26 -#define IRQ_SAA_IT1			27 -#define IRQ_UART2			28 -#define IRQ_MSP2			31 -#define IRQ_L2CC			48 -#define IRQ_HPI				49 -#define IRQ_SKE				50 -#define IRQ_KP				51 -#define IRQ_MEMST			54 -#define IRQ_SGA_IT			58 -#define IRQ_USBM			60 -#define IRQ_MSP1			62 +#define IRQ_WATCHDOG			1 +#define IRQ_SOFTINT			2 +#define IRQ_CRYPTO			3 +#define IRQ_OWM				4 +#define IRQ_MTU0			5 +#define IRQ_MTU1			6 +#define IRQ_GPIO0			7 +#define IRQ_GPIO1			8 +#define IRQ_GPIO2			9 +#define IRQ_GPIO3			10 +#define IRQ_RTC_RTT			11 +#define IRQ_SSP				12 +#define IRQ_UART0			13 +#define IRQ_DMA1			14 +#define IRQ_CLCD_MDIF			15 +#define IRQ_DMA0			16 +#define IRQ_PWRFAIL			17 +#define IRQ_UART1			18 +#define IRQ_FIRDA			19 +#define IRQ_MSP0			20 +#define IRQ_I2C0			21 +#define IRQ_I2C1			22 +#define IRQ_SDMMC			23 +#define IRQ_USBOTG			24 +#define IRQ_SVA_IT0			25 +#define IRQ_SVA_IT1			26 +#define IRQ_SAA_IT0			27 +#define IRQ_SAA_IT1			28 +#define IRQ_UART2			29 +#define IRQ_MSP2			30 +#define IRQ_L2CC			49 +#define IRQ_HPI				50 +#define IRQ_SKE				51 +#define IRQ_KP				52 +#define IRQ_MEMST			55 +#define IRQ_SGA_IT			59 +#define IRQ_USBM			61 +#define IRQ_MSP1			63 -#define NOMADIK_SOC_NR_IRQS		64 +#define NOMADIK_GPIO_OFFSET		(IRQ_VIC_START+64)  /* After chip-specific IRQ numbers we have the GPIO ones */  #define NOMADIK_NR_GPIO			128 /* last 4 not wired to pins */ -#define NOMADIK_GPIO_TO_IRQ(gpio)	((gpio) + NOMADIK_SOC_NR_IRQS) -#define NOMADIK_IRQ_TO_GPIO(irq)	((irq) - NOMADIK_SOC_NR_IRQS) +#define NOMADIK_GPIO_TO_IRQ(gpio)	((gpio) + NOMADIK_GPIO_OFFSET) +#define NOMADIK_IRQ_TO_GPIO(irq)	((irq) - NOMADIK_GPIO_OFFSET)  #define NR_IRQS				NOMADIK_GPIO_TO_IRQ(NOMADIK_NR_GPIO)  /* Following two are used by entry_macro.S, to access our dual-vic */ @@ -79,4 +79,3 @@  #define VIC_REG_IRQSR1		0x20  #endif /* __ASM_ARCH_IRQS_H */ - diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index f2f8a584701..c53469802c0 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -37,12 +37,12 @@  #include <plat/board-ams-delta.h>  #include <plat/keypad.h>  #include <plat/mux.h> -#include <plat/usb.h>  #include <plat/board.h>  #include <mach/hardware.h>  #include <mach/ams-delta-fiq.h>  #include <mach/camera.h> +#include <mach/usb.h>  #include "iomap.h"  #include "common.h" diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index e75e2d55a2d..6ec385e2b98 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c @@ -23,8 +23,10 @@  #include <asm/mach/map.h>  #include <plat/mux.h> -#include <plat/usb.h>  #include <plat/board.h> + +#include <mach/usb.h> +  #include "common.h"  /* assume no Mini-AB port */ diff --git a/arch/arm/mach-omap1/board-h2-mmc.c b/arch/arm/mach-omap1/board-h2-mmc.c index da0e37d4082..e1362ce4849 100644 --- a/arch/arm/mach-omap1/board-h2-mmc.c +++ b/arch/arm/mach-omap1/board-h2-mmc.c @@ -54,7 +54,6 @@ static struct omap_mmc_platform_data mmc1_data = {  	.nr_slots                       = 1,  	.init				= mmc_late_init,  	.cleanup			= mmc_cleanup, -	.dma_mask			= 0xffffffff,  	.slots[0]       = {  		.set_power              = mmc_set_power,  		.ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34, diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index a28e989a63f..44a4ab195fb 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -40,11 +40,11 @@  #include <plat/dma.h>  #include <plat/tc.h>  #include <plat/irda.h> -#include <plat/usb.h>  #include <plat/keypad.h>  #include <plat/flash.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h"  #include "board-h2.h" diff --git a/arch/arm/mach-omap1/board-h3-mmc.c b/arch/arm/mach-omap1/board-h3-mmc.c index f8242aa9b76..c74daace8cd 100644 --- a/arch/arm/mach-omap1/board-h3-mmc.c +++ b/arch/arm/mach-omap1/board-h3-mmc.c @@ -36,7 +36,6 @@ static int mmc_set_power(struct device *dev, int slot, int power_on,   */  static struct omap_mmc_platform_data mmc1_data = {  	.nr_slots                       = 1, -	.dma_mask			= 0xffffffff,  	.slots[0]       = {  		.set_power              = mmc_set_power,  		.ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34, diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 108a8640fc6..86cb5a04a40 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -40,13 +40,13 @@  #include <plat/mux.h>  #include <plat/tc.h> -#include <plat/usb.h>  #include <plat/keypad.h>  #include <plat/dma.h>  #include <plat/flash.h>  #include <mach/hardware.h>  #include <mach/irqs.h> +#include <mach/usb.h>  #include "common.h"  #include "board-h3.h" diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index 118a9d4a4c5..b3f6e943e66 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c @@ -44,10 +44,10 @@  #include <plat/omap7xx.h>  #include <plat/board.h>  #include <plat/keypad.h> -#include <plat/usb.h>  #include <plat/mmc.h>  #include <mach/irqs.h> +#include <mach/usb.h>  #include "common.h" diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 7970223a559..f21c2966daa 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -35,11 +35,11 @@  #include <plat/flash.h>  #include <plat/fpga.h>  #include <plat/tc.h> -#include <plat/usb.h>  #include <plat/keypad.h>  #include <plat/mmc.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "iomap.h"  #include "common.h" diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index 7212ae97f44..2c0ca8fc338 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c @@ -26,7 +26,6 @@  #include <asm/mach/map.h>  #include <plat/mux.h> -#include <plat/usb.h>  #include <plat/board.h>  #include <plat/keypad.h>  #include <plat/lcd_mipid.h> @@ -34,6 +33,7 @@  #include <plat/clock.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h" @@ -185,7 +185,6 @@ static int nokia770_mmc_get_cover_state(struct device *dev, int slot)  static struct omap_mmc_platform_data nokia770_mmc2_data = {  	.nr_slots                       = 1, -	.dma_mask			= 0xffffffff,  	.max_freq                       = 12000000,  	.slots[0]       = {  		.set_power		= nokia770_mmc_set_power, diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index da8d872d3d1..8784705edb6 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -45,11 +45,11 @@  #include <asm/mach/map.h>  #include <plat/flash.h> -#include <plat/usb.h>  #include <plat/mux.h>  #include <plat/tc.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h" diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 949b62a7369..26bcb9defcd 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c @@ -35,7 +35,6 @@  #include <plat/flash.h>  #include <plat/mux.h> -#include <plat/usb.h>  #include <plat/tc.h>  #include <plat/dma.h>  #include <plat/board.h> @@ -43,6 +42,7 @@  #include <plat/keypad.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h" diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index 7f1e1cf2bf4..4d099446dfa 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c @@ -35,7 +35,6 @@  #include <plat/led.h>  #include <plat/flash.h>  #include <plat/mux.h> -#include <plat/usb.h>  #include <plat/dma.h>  #include <plat/tc.h>  #include <plat/board.h> @@ -43,6 +42,7 @@  #include <plat/keypad.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h" diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index 3c71c6bace2..355980321c2 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c @@ -37,7 +37,6 @@  #include <plat/flash.h>  #include <plat/mux.h> -#include <plat/usb.h>  #include <plat/dma.h>  #include <plat/tc.h>  #include <plat/board.h> @@ -45,6 +44,7 @@  #include <plat/keypad.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h" @@ -288,8 +288,7 @@ palmz71_gpio_setup(int early)  		}  		gpio_direction_input(PALMZ71_USBDETECT_GPIO);  		if (request_irq(gpio_to_irq(PALMZ71_USBDETECT_GPIO), -				palmz71_powercable, IRQF_SAMPLE_RANDOM, -				"palmz71-cable", NULL)) +				palmz71_powercable, 0, "palmz71-cable", NULL))  			printk(KERN_ERR  					"IRQ request for power cable failed!\n");  		palmz71_powercable(gpio_to_irq(PALMZ71_USBDETECT_GPIO), NULL); diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 3b7b82b1368..8c665bd16ac 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c @@ -37,13 +37,13 @@  #include <plat/mux.h>  #include <plat/dma.h>  #include <plat/irda.h> -#include <plat/usb.h>  #include <plat/tc.h>  #include <plat/board.h>  #include <plat/keypad.h>  #include <plat/board-sx1.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h" diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index afd67f0ec49..3497769eb35 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c @@ -35,9 +35,10 @@  #include <plat/flash.h>  #include <plat/mux.h>  #include <plat/tc.h> -#include <plat/usb.h> +#include <plat/board.h>  #include <mach/hardware.h> +#include <mach/usb.h>  #include "common.h" diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index c6ce93f71d0..c007d80dfb6 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c @@ -25,10 +25,11 @@  #include <plat/clock.h>  #include <plat/cpu.h>  #include <plat/clkdev_omap.h> +#include <plat/board.h>  #include <plat/sram.h>	/* for omap_sram_reprogram_clock() */ -#include <plat/usb.h>   /* for OTG_BASE */  #include <mach/hardware.h> +#include <mach/usb.h>   /* for OTG_BASE */  #include "iomap.h"  #include "clock.h" diff --git a/arch/arm/mach-omap1/include/mach/usb.h b/arch/arm/mach-omap1/include/mach/usb.h new file mode 100644 index 00000000000..753cd5ce694 --- /dev/null +++ b/arch/arm/mach-omap1/include/mach/usb.h @@ -0,0 +1,165 @@ +/* + * FIXME correct answer depends on hmc_mode, + * as does (on omap1) any nonzero value for config->otg port number + */ +#ifdef	CONFIG_USB_GADGET_OMAP +#define	is_usb0_device(config)	1 +#else +#define	is_usb0_device(config)	0 +#endif + +struct omap_usb_config { +	/* Configure drivers according to the connectors on your board: +	 *  - "A" connector (rectagular) +	 *	... for host/OHCI use, set "register_host". +	 *  - "B" connector (squarish) or "Mini-B" +	 *	... for device/gadget use, set "register_dev". +	 *  - "Mini-AB" connector (very similar to Mini-B) +	 *	... for OTG use as device OR host, initialize "otg" +	 */ +	unsigned	register_host:1; +	unsigned	register_dev:1; +	u8		otg;	/* port number, 1-based:  usb1 == 2 */ + +	u8		hmc_mode; + +	/* implicitly true if otg:  host supports remote wakeup? */ +	u8		rwc; + +	/* signaling pins used to talk to transceiver on usbN: +	 *  0 == usbN unused +	 *  2 == usb0-only, using internal transceiver +	 *  3 == 3 wire bidirectional +	 *  4 == 4 wire bidirectional +	 *  6 == 6 wire unidirectional (or TLL) +	 */ +	u8		pins[3]; + +	struct platform_device *udc_device; +	struct platform_device *ohci_device; +	struct platform_device *otg_device; + +	u32 (*usb0_init)(unsigned nwires, unsigned is_device); +	u32 (*usb1_init)(unsigned nwires); +	u32 (*usb2_init)(unsigned nwires, unsigned alt_pingroup); + +	int (*ocpi_enable)(void); +}; + +void omap_otg_init(struct omap_usb_config *config); + +#if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE) +void omap1_usb_init(struct omap_usb_config *pdata); +#else +static inline void omap1_usb_init(struct omap_usb_config *pdata) +{ +} +#endif + +#define OMAP1_OTG_BASE			0xfffb0400 +#define OMAP1_UDC_BASE			0xfffb4000 +#define OMAP1_OHCI_BASE			0xfffba000 + +#define OMAP2_OHCI_BASE			0x4805e000 +#define OMAP2_UDC_BASE			0x4805e200 +#define OMAP2_OTG_BASE			0x4805e300 +#define OTG_BASE			OMAP1_OTG_BASE +#define UDC_BASE			OMAP1_UDC_BASE +#define OMAP_OHCI_BASE			OMAP1_OHCI_BASE + +/* + * OTG and transceiver registers, for OMAPs starting with ARM926 + */ +#define OTG_REV				(OTG_BASE + 0x00) +#define OTG_SYSCON_1			(OTG_BASE + 0x04) +#	define	 USB2_TRX_MODE(w)	(((w)>>24)&0x07) +#	define	 USB1_TRX_MODE(w)	(((w)>>20)&0x07) +#	define	 USB0_TRX_MODE(w)	(((w)>>16)&0x07) +#	define	 OTG_IDLE_EN		(1 << 15) +#	define	 HST_IDLE_EN		(1 << 14) +#	define	 DEV_IDLE_EN		(1 << 13) +#	define	 OTG_RESET_DONE		(1 << 2) +#	define	 OTG_SOFT_RESET		(1 << 1) +#define OTG_SYSCON_2			(OTG_BASE + 0x08) +#	define	 OTG_EN			(1 << 31) +#	define	 USBX_SYNCHRO		(1 << 30) +#	define	 OTG_MST16		(1 << 29) +#	define	 SRP_GPDATA		(1 << 28) +#	define	 SRP_GPDVBUS		(1 << 27) +#	define	 SRP_GPUVBUS(w)		(((w)>>24)&0x07) +#	define	 A_WAIT_VRISE(w)	(((w)>>20)&0x07) +#	define	 B_ASE_BRST(w)		(((w)>>16)&0x07) +#	define	 SRP_DPW		(1 << 14) +#	define	 SRP_DATA		(1 << 13) +#	define	 SRP_VBUS		(1 << 12) +#	define	 OTG_PADEN		(1 << 10) +#	define	 HMC_PADEN		(1 << 9) +#	define	 UHOST_EN		(1 << 8) +#	define	 HMC_TLLSPEED		(1 << 7) +#	define	 HMC_TLLATTACH		(1 << 6) +#	define	 OTG_HMC(w)		(((w)>>0)&0x3f) +#define OTG_CTRL			(OTG_BASE + 0x0c) +#	define	 OTG_USB2_EN		(1 << 29) +#	define	 OTG_USB2_DP		(1 << 28) +#	define	 OTG_USB2_DM		(1 << 27) +#	define	 OTG_USB1_EN		(1 << 26) +#	define	 OTG_USB1_DP		(1 << 25) +#	define	 OTG_USB1_DM		(1 << 24) +#	define	 OTG_USB0_EN		(1 << 23) +#	define	 OTG_USB0_DP		(1 << 22) +#	define	 OTG_USB0_DM		(1 << 21) +#	define	 OTG_ASESSVLD		(1 << 20) +#	define	 OTG_BSESSEND		(1 << 19) +#	define	 OTG_BSESSVLD		(1 << 18) +#	define	 OTG_VBUSVLD		(1 << 17) +#	define	 OTG_ID			(1 << 16) +#	define	 OTG_DRIVER_SEL		(1 << 15) +#	define	 OTG_A_SETB_HNPEN	(1 << 12) +#	define	 OTG_A_BUSREQ		(1 << 11) +#	define	 OTG_B_HNPEN		(1 << 9) +#	define	 OTG_B_BUSREQ		(1 << 8) +#	define	 OTG_BUSDROP		(1 << 7) +#	define	 OTG_PULLDOWN		(1 << 5) +#	define	 OTG_PULLUP		(1 << 4) +#	define	 OTG_DRV_VBUS		(1 << 3) +#	define	 OTG_PD_VBUS		(1 << 2) +#	define	 OTG_PU_VBUS		(1 << 1) +#	define	 OTG_PU_ID		(1 << 0) +#define OTG_IRQ_EN			(OTG_BASE + 0x10)	/* 16-bit */ +#	define	 DRIVER_SWITCH		(1 << 15) +#	define	 A_VBUS_ERR		(1 << 13) +#	define	 A_REQ_TMROUT		(1 << 12) +#	define	 A_SRP_DETECT		(1 << 11) +#	define	 B_HNP_FAIL		(1 << 10) +#	define	 B_SRP_TMROUT		(1 << 9) +#	define	 B_SRP_DONE		(1 << 8) +#	define	 B_SRP_STARTED		(1 << 7) +#	define	 OPRT_CHG		(1 << 0) +#define OTG_IRQ_SRC			(OTG_BASE + 0x14)	/* 16-bit */ +	// same bits as in IRQ_EN +#define OTG_OUTCTRL			(OTG_BASE + 0x18)	/* 16-bit */ +#	define	 OTGVPD			(1 << 14) +#	define	 OTGVPU			(1 << 13) +#	define	 OTGPUID		(1 << 12) +#	define	 USB2VDR		(1 << 10) +#	define	 USB2PDEN		(1 << 9) +#	define	 USB2PUEN		(1 << 8) +#	define	 USB1VDR		(1 << 6) +#	define	 USB1PDEN		(1 << 5) +#	define	 USB1PUEN		(1 << 4) +#	define	 USB0VDR		(1 << 2) +#	define	 USB0PDEN		(1 << 1) +#	define	 USB0PUEN		(1 << 0) +#define OTG_TEST			(OTG_BASE + 0x20)	/* 16-bit */ +#define OTG_VENDOR_CODE			(OTG_BASE + 0xfc)	/* 16-bit */ + +/*-------------------------------------------------------------------------*/ + +/* OMAP1 */ +#define	USB_TRANSCEIVER_CTRL		(0xfffe1000 + 0x0064) +#	define	CONF_USB2_UNI_R		(1 << 8) +#	define	CONF_USB1_UNI_R		(1 << 7) +#	define	CONF_USB_PORT0_R(x)	(((x)>>4)&0x7) +#	define	CONF_USB0_ISOLATE_R	(1 << 3) +#	define	CONF_USB_PWRDN_DM_R	(1 << 2) +#	define	CONF_USB_PWRDN_DP_R	(1 << 1) diff --git a/arch/arm/mach-omap1/timer.c b/arch/arm/mach-omap1/timer.c index 64c65bcb2d6..aa81593db1a 100644 --- a/arch/arm/mach-omap1/timer.c +++ b/arch/arm/mach-omap1/timer.c @@ -140,7 +140,8 @@ static int __init omap1_dm_timer_init(void)  		}  		pdata->set_timer_src = omap1_dm_timer_set_src; -		pdata->needs_manual_reset = 1; +		pdata->timer_capability = OMAP_TIMER_ALWON | +				OMAP_TIMER_NEEDS_RESET;  		ret = platform_device_add_data(pdev, pdata, sizeof(*pdata));  		if (ret) { diff --git a/arch/arm/mach-omap1/usb.c b/arch/arm/mach-omap1/usb.c index e61afd92276..65f88176fba 100644 --- a/arch/arm/mach-omap1/usb.c +++ b/arch/arm/mach-omap1/usb.c @@ -27,7 +27,8 @@  #include <asm/irq.h>  #include <plat/mux.h> -#include <plat/usb.h> + +#include <mach/usb.h>  #include "common.h" @@ -55,6 +56,119 @@  #define INT_USB_IRQ_HGEN	INT_USB_HHC_1  #define INT_USB_IRQ_OTG		IH2_BASE + 8 +#ifdef	CONFIG_ARCH_OMAP_OTG + +void __init +omap_otg_init(struct omap_usb_config *config) +{ +	u32		syscon; +	int		alt_pingroup = 0; + +	/* NOTE:  no bus or clock setup (yet?) */ + +	syscon = omap_readl(OTG_SYSCON_1) & 0xffff; +	if (!(syscon & OTG_RESET_DONE)) +		pr_debug("USB resets not complete?\n"); + +	//omap_writew(0, OTG_IRQ_EN); + +	/* pin muxing and transceiver pinouts */ +	if (config->pins[0] > 2)	/* alt pingroup 2 */ +		alt_pingroup = 1; +	syscon |= config->usb0_init(config->pins[0], is_usb0_device(config)); +	syscon |= config->usb1_init(config->pins[1]); +	syscon |= config->usb2_init(config->pins[2], alt_pingroup); +	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); +	omap_writel(syscon, OTG_SYSCON_1); + +	syscon = config->hmc_mode; +	syscon |= USBX_SYNCHRO | (4 << 16) /* B_ASE0_BRST */; +#ifdef	CONFIG_USB_OTG +	if (config->otg) +		syscon |= OTG_EN; +#endif +	if (cpu_class_is_omap1()) +		pr_debug("USB_TRANSCEIVER_CTRL = %03x\n", +			 omap_readl(USB_TRANSCEIVER_CTRL)); +	pr_debug("OTG_SYSCON_2 = %08x\n", omap_readl(OTG_SYSCON_2)); +	omap_writel(syscon, OTG_SYSCON_2); + +	printk("USB: hmc %d", config->hmc_mode); +	if (!alt_pingroup) +		printk(", usb2 alt %d wires", config->pins[2]); +	else if (config->pins[0]) +		printk(", usb0 %d wires%s", config->pins[0], +			is_usb0_device(config) ? " (dev)" : ""); +	if (config->pins[1]) +		printk(", usb1 %d wires", config->pins[1]); +	if (!alt_pingroup && config->pins[2]) +		printk(", usb2 %d wires", config->pins[2]); +	if (config->otg) +		printk(", Mini-AB on usb%d", config->otg - 1); +	printk("\n"); + +	if (cpu_class_is_omap1()) { +		u16 w; + +		/* leave USB clocks/controllers off until needed */ +		w = omap_readw(ULPD_SOFT_REQ); +		w &= ~SOFT_USB_CLK_REQ; +		omap_writew(w, ULPD_SOFT_REQ); + +		w = omap_readw(ULPD_CLOCK_CTRL); +		w &= ~USB_MCLK_EN; +		w |= DIS_USB_PVCI_CLK; +		omap_writew(w, ULPD_CLOCK_CTRL); +	} +	syscon = omap_readl(OTG_SYSCON_1); +	syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN; + +#ifdef	CONFIG_USB_GADGET_OMAP +	if (config->otg || config->register_dev) { +		struct platform_device *udc_device = config->udc_device; +		int status; + +		syscon &= ~DEV_IDLE_EN; +		udc_device->dev.platform_data = config; +		status = platform_device_register(udc_device); +		if (status) +			pr_debug("can't register UDC device, %d\n", status); +	} +#endif + +#if	defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) +	if (config->otg || config->register_host) { +		struct platform_device *ohci_device = config->ohci_device; +		int status; + +		syscon &= ~HST_IDLE_EN; +		ohci_device->dev.platform_data = config; +		status = platform_device_register(ohci_device); +		if (status) +			pr_debug("can't register OHCI device, %d\n", status); +	} +#endif + +#ifdef	CONFIG_USB_OTG +	if (config->otg) { +		struct platform_device *otg_device = config->otg_device; +		int status; + +		syscon &= ~OTG_IDLE_EN; +		otg_device->dev.platform_data = config; +		status = platform_device_register(otg_device); +		if (status) +			pr_debug("can't register OTG device, %d\n", status); +	} +#endif +	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); +	omap_writel(syscon, OTG_SYSCON_1); +} + +#else +void omap_otg_init(struct omap_usb_config *config) {} +#endif +  #ifdef	CONFIG_USB_GADGET_OMAP  static struct resource udc_resources[] = { diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index cc83f5e13d5..dd2db025f77 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -9,7 +9,7 @@ config ARCH_OMAP2PLUS_TYPICAL  	select REGULATOR  	select PM_RUNTIME  	select VFP -	select NEON if ARCH_OMAP3 || ARCH_OMAP4 +	select NEON if ARCH_OMAP3 || ARCH_OMAP4 || SOC_OMAP5  	select SERIAL_OMAP  	select SERIAL_OMAP_CONSOLE  	select I2C @@ -21,12 +21,16 @@ config ARCH_OMAP2PLUS_TYPICAL  	help  	  Compile a kernel suitable for booting most boards +config SOC_HAS_OMAP2_SDRC +	bool "OMAP2 SDRAM Controller support" +  config ARCH_OMAP2  	bool "TI OMAP2"  	depends on ARCH_OMAP2PLUS  	default y  	select CPU_V6  	select MULTI_IRQ_HANDLER +	select SOC_HAS_OMAP2_SDRC  config ARCH_OMAP3  	bool "TI OMAP3" @@ -35,9 +39,11 @@ config ARCH_OMAP3  	select CPU_V7  	select USB_ARCH_HAS_EHCI if USB_SUPPORT  	select ARCH_HAS_OPP +	select PM_RUNTIME if CPU_IDLE  	select PM_OPP if PM  	select ARM_CPU_SUSPEND if PM  	select MULTI_IRQ_HANDLER +	select SOC_HAS_OMAP2_SDRC  config ARCH_OMAP4  	bool "TI OMAP4" @@ -52,11 +58,18 @@ config ARCH_OMAP4  	select PL310_ERRATA_727915  	select ARM_ERRATA_720789  	select ARCH_HAS_OPP +	select PM_RUNTIME if CPU_IDLE  	select PM_OPP if PM  	select USB_ARCH_HAS_EHCI if USB_SUPPORT  	select ARM_CPU_SUSPEND if PM  	select ARCH_NEEDS_CPU_IDLE_COUPLED +config SOC_OMAP5 +	bool "TI OMAP5" +	select CPU_V7 +	select ARM_GIC +	select HAVE_SMP +  comment "OMAP Core Type"  	depends on ARCH_OMAP2 @@ -65,19 +78,19 @@ config SOC_OMAP2420  	depends on ARCH_OMAP2  	default y  	select OMAP_DM_TIMER -	select ARCH_OMAP_OTG +	select SOC_HAS_OMAP2_SDRC  config SOC_OMAP2430  	bool "OMAP2430 support"  	depends on ARCH_OMAP2  	default y -	select ARCH_OMAP_OTG +	select SOC_HAS_OMAP2_SDRC  config SOC_OMAP3430  	bool "OMAP3430 support"  	depends on ARCH_OMAP3  	default y -	select ARCH_OMAP_OTG +	select SOC_HAS_OMAP2_SDRC  config SOC_TI81XX  	bool "TI81XX support" @@ -86,8 +99,10 @@ config SOC_TI81XX  config SOC_AM33XX  	bool "AM33XX support" -	depends on ARCH_OMAP3  	default y +	select CPU_V7 +	select ARM_CPU_SUSPEND if PM +	select MULTI_IRQ_HANDLER  config OMAP_PACKAGE_ZAF         bool diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index fa742f3c262..f6a24b3f9c4 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -6,7 +6,7 @@  obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \  	 common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o -omap-2-3-common				= irq.o sdrc.o +omap-2-3-common				= irq.o  hwmod-common				= omap_hwmod.o \  					  omap_hwmod_common_data.o  clock-common				= clock.o clock_common_data.o \ @@ -16,19 +16,24 @@ secure-common				= omap-smc.o omap-secure.o  obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common)  obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)  obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) +obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common) +obj-$(CONFIG_SOC_OMAP5)	 += prm44xx.o $(hwmod-common) $(secure-common)  ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)  obj-y += mcbsp.o  endif  obj-$(CONFIG_TWL4030_CORE) += omap_twl.o +obj-$(CONFIG_SOC_HAS_OMAP2_SDRC)	+= sdrc.o  # SMP support ONLY available for OMAP4  obj-$(CONFIG_SMP)			+= omap-smp.o omap-headsmp.o  obj-$(CONFIG_HOTPLUG_CPU)		+= omap-hotplug.o -obj-$(CONFIG_ARCH_OMAP4)		+= omap4-common.o omap-wakeupgen.o -obj-$(CONFIG_ARCH_OMAP4)		+= sleep44xx.o +omap-4-5-common				=  omap4-common.o omap-wakeupgen.o \ +					   sleep44xx.o +obj-$(CONFIG_ARCH_OMAP4)		+= $(omap-4-5-common) +obj-$(CONFIG_SOC_OMAP5)			+= $(omap-4-5-common)  plus_sec := $(call as-instr,.arch_extension sec,+sec)  AFLAGS_omap-headsmp.o			:=-Wa,-march=armv7-a$(plus_sec) @@ -66,12 +71,12 @@ ifeq ($(CONFIG_PM),y)  obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o  obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o  obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o -obj-$(CONFIG_ARCH_OMAP3)		+= cpuidle34xx.o  obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o omap-mpuss-lowpower.o -obj-$(CONFIG_ARCH_OMAP4)		+= cpuidle44xx.o +obj-$(CONFIG_SOC_OMAP5)			+= omap-mpuss-lowpower.o  obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o -obj-$(CONFIG_OMAP_SMARTREFLEX)          += sr_device.o smartreflex.o -obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3)	+= smartreflex-class3.o + +obj-$(CONFIG_POWER_AVS_OMAP)		+= sr_device.o +obj-$(CONFIG_POWER_AVS_OMAP_CLASS3)    += smartreflex-class3.o  AFLAGS_sleep24xx.o			:=-Wa,-march=armv6  AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a$(plus_sec) @@ -82,14 +87,22 @@ endif  endif +ifeq ($(CONFIG_CPU_IDLE),y) +obj-$(CONFIG_ARCH_OMAP3)                += cpuidle34xx.o +obj-$(CONFIG_ARCH_OMAP4)                += cpuidle44xx.o +endif +  # PRCM +omap-prcm-4-5-common			=  prcm.o cminst44xx.o cm44xx.o \ +					   prcm_mpu44xx.o prminst44xx.o \ +					   vc44xx_data.o vp44xx_data.o  obj-y					+= prm_common.o  obj-$(CONFIG_ARCH_OMAP2)		+= prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o  obj-$(CONFIG_ARCH_OMAP3)		+= prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o  obj-$(CONFIG_ARCH_OMAP3)		+= vc3xxx_data.o vp3xxx_data.o -obj-$(CONFIG_ARCH_OMAP4)		+= prcm.o cminst44xx.o cm44xx.o -obj-$(CONFIG_ARCH_OMAP4)		+= prcm_mpu44xx.o prminst44xx.o -obj-$(CONFIG_ARCH_OMAP4)		+= vc44xx_data.o vp44xx_data.o prm44xx.o +obj-$(CONFIG_SOC_AM33XX)		+= prcm.o prm33xx.o cm33xx.o +obj-$(CONFIG_ARCH_OMAP4)		+= $(omap-prcm-4-5-common) prm44xx.o +obj-$(CONFIG_SOC_OMAP5)			+= $(omap-prcm-4-5-common)  # OMAP voltage domains  voltagedomain-common			:= voltage.o vc.o vp.o @@ -99,6 +112,9 @@ obj-$(CONFIG_ARCH_OMAP3)		+= $(voltagedomain-common)  obj-$(CONFIG_ARCH_OMAP3)		+= voltagedomains3xxx_data.o  obj-$(CONFIG_ARCH_OMAP4)		+= $(voltagedomain-common)  obj-$(CONFIG_ARCH_OMAP4)		+= voltagedomains44xx_data.o +obj-$(CONFIG_SOC_AM33XX)		+= $(voltagedomain-common) +obj-$(CONFIG_SOC_AM33XX)                += voltagedomains33xx_data.o +obj-$(CONFIG_SOC_OMAP5)			+= $(voltagedomain-common)  # OMAP powerdomain framework  powerdomain-common			+= powerdomain.o powerdomain-common.o @@ -113,10 +129,14 @@ obj-$(CONFIG_ARCH_OMAP3)		+= powerdomains2xxx_3xxx_data.o  obj-$(CONFIG_ARCH_OMAP4)		+= $(powerdomain-common)  obj-$(CONFIG_ARCH_OMAP4)		+= powerdomain44xx.o  obj-$(CONFIG_ARCH_OMAP4)		+= powerdomains44xx_data.o +obj-$(CONFIG_SOC_AM33XX)		+= $(powerdomain-common) +obj-$(CONFIG_SOC_AM33XX)		+= powerdomain33xx.o +obj-$(CONFIG_SOC_AM33XX)		+= powerdomains33xx_data.o +obj-$(CONFIG_SOC_OMAP5)			+= $(powerdomain-common) +obj-$(CONFIG_SOC_OMAP5)			+= powerdomain44xx.o  # PRCM clockdomain control  clockdomain-common			+= clockdomain.o -clockdomain-common			+= clockdomains_common_data.o  obj-$(CONFIG_ARCH_OMAP2)		+= $(clockdomain-common)  obj-$(CONFIG_ARCH_OMAP2)		+= clockdomain2xxx_3xxx.o  obj-$(CONFIG_ARCH_OMAP2)		+= clockdomains2xxx_3xxx_data.o @@ -129,6 +149,11 @@ obj-$(CONFIG_ARCH_OMAP3)		+= clockdomains3xxx_data.o  obj-$(CONFIG_ARCH_OMAP4)		+= $(clockdomain-common)  obj-$(CONFIG_ARCH_OMAP4)		+= clockdomain44xx.o  obj-$(CONFIG_ARCH_OMAP4)		+= clockdomains44xx_data.o +obj-$(CONFIG_SOC_AM33XX)		+= $(clockdomain-common) +obj-$(CONFIG_SOC_AM33XX)		+= clockdomain33xx.o +obj-$(CONFIG_SOC_AM33XX)		+= clockdomains33xx_data.o +obj-$(CONFIG_SOC_OMAP5)			+= $(clockdomain-common) +obj-$(CONFIG_SOC_OMAP5)			+= clockdomain44xx.o  # Clock framework  obj-$(CONFIG_ARCH_OMAP2)		+= $(clock-common) clock2xxx.o @@ -146,6 +171,10 @@ obj-$(CONFIG_ARCH_OMAP3)		+= dpll3xxx.o clock3xxx_data.o  obj-$(CONFIG_ARCH_OMAP3)		+= clkt_iclk.o  obj-$(CONFIG_ARCH_OMAP4)		+= $(clock-common) clock44xx_data.o  obj-$(CONFIG_ARCH_OMAP4)		+= dpll3xxx.o dpll44xx.o +obj-$(CONFIG_SOC_AM33XX)		+= $(clock-common) dpll3xxx.o +obj-$(CONFIG_SOC_AM33XX)		+= clock33xx_data.o +obj-$(CONFIG_SOC_OMAP5)			+= $(clock-common) +obj-$(CONFIG_SOC_OMAP5)			+= dpll3xxx.o dpll44xx.o  # OMAP2 clock rate set data (old "OPP" data)  obj-$(CONFIG_SOC_OMAP2420)		+= opp2420_data.o @@ -173,6 +202,7 @@ obj-$(CONFIG_OMAP3_EMU)			+= emu.o  # L3 interconnect  obj-$(CONFIG_ARCH_OMAP3)		+= omap_l3_smx.o  obj-$(CONFIG_ARCH_OMAP4)		+= omap_l3_noc.o +obj-$(CONFIG_SOC_OMAP5)			+= omap_l3_noc.o  obj-$(CONFIG_OMAP_MBOX_FWK)		+= mailbox_mach.o  mailbox_mach-objs			:= mailbox.o @@ -189,6 +219,10 @@ endif  # OMAP2420 MSDI controller integration support ("MMC")  obj-$(CONFIG_SOC_OMAP2420)		+= msdi.o +ifneq ($(CONFIG_DRM_OMAP),) +obj-y					+= drm.o +endif +  # Specific board support  obj-$(CONFIG_MACH_OMAP_GENERIC)		+= board-generic.o  obj-$(CONFIG_MACH_OMAP_H4)		+= board-h4.o @@ -244,9 +278,6 @@ obj-y					+= $(omap-flash-y) $(omap-flash-m)  omap-hsmmc-$(CONFIG_MMC_OMAP_HS)	:= hsmmc.o  obj-y					+= $(omap-hsmmc-m) $(omap-hsmmc-y) - -usbfs-$(CONFIG_ARCH_OMAP_OTG)		:= usb-fs.o -obj-y					+= $(usbfs-m) $(usbfs-y)  obj-y					+= usb-musb.o  obj-y					+= omap_phy_internal.o diff --git a/arch/arm/mach-omap2/am35xx-emac.c b/arch/arm/mach-omap2/am35xx-emac.c index 447682c4e11..2c90ac68668 100644 --- a/arch/arm/mach-omap2/am35xx-emac.c +++ b/arch/arm/mach-omap2/am35xx-emac.c @@ -15,27 +15,13 @@   * General Public License for more details.   */ -#include <linux/clk.h> +#include <linux/err.h>  #include <linux/davinci_emac.h> -#include <linux/platform_device.h> -#include <plat/irqs.h> +#include <asm/system.h> +#include <plat/omap_device.h>  #include <mach/am35xx.h> -  #include "control.h" - -static struct mdio_platform_data am35xx_emac_mdio_pdata; - -static struct resource am35xx_emac_mdio_resources[] = { -	DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET, SZ_4K), -}; - -static struct platform_device am35xx_emac_mdio_device = { -	.name		= "davinci_mdio", -	.id		= 0, -	.num_resources	= ARRAY_SIZE(am35xx_emac_mdio_resources), -	.resource	= am35xx_emac_mdio_resources, -	.dev.platform_data = &am35xx_emac_mdio_pdata, -}; +#include "am35xx-emac.h"  static void am35xx_enable_emac_int(void)  { @@ -69,41 +55,57 @@ static struct emac_platform_data am35xx_emac_pdata = {  	.interrupt_disable	= am35xx_disable_emac_int,  }; -static struct resource am35xx_emac_resources[] = { -	DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE, 0x30000), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RXTHRESH_IRQ), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RX_PULSE_IRQ), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_TX_PULSE_IRQ), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_MISC_PULSE_IRQ), -}; +static struct mdio_platform_data am35xx_mdio_pdata; -static struct platform_device am35xx_emac_device = { -	.name		= "davinci_emac", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(am35xx_emac_resources), -	.resource	= am35xx_emac_resources, -	.dev		= { -		.platform_data	= &am35xx_emac_pdata, -	}, -}; +static int __init omap_davinci_emac_dev_init(struct omap_hwmod *oh, +		void *pdata, int pdata_len) +{ +	struct platform_device *pdev; + +	pdev = omap_device_build(oh->class->name, 0, oh, pdata, pdata_len, +				 NULL, 0, false); +	if (IS_ERR(pdev)) { +		WARN(1, "Can't build omap_device for %s:%s.\n", +		     oh->class->name, oh->name); +		return PTR_ERR(pdev); +	} + +	return 0; +}  void __init am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en)  { +	struct omap_hwmod *oh;  	u32 v; -	int err; +	int ret; -	am35xx_emac_pdata.rmii_en = rmii_en; -	am35xx_emac_mdio_pdata.bus_freq = mdio_bus_freq; -	err = platform_device_register(&am35xx_emac_device); -	if (err) { -		pr_err("AM35x: failed registering EMAC device: %d\n", err); +	oh = omap_hwmod_lookup("davinci_mdio"); +	if (!oh) { +		pr_err("Could not find davinci_mdio hwmod\n"); +		return; +	} + +	am35xx_mdio_pdata.bus_freq = mdio_bus_freq; + +	ret = omap_davinci_emac_dev_init(oh, &am35xx_mdio_pdata, +					 sizeof(am35xx_mdio_pdata)); +	if (ret) { +		pr_err("Could not build davinci_mdio hwmod device\n");  		return;  	} -	err = platform_device_register(&am35xx_emac_mdio_device); -	if (err) { -		pr_err("AM35x: failed registering EMAC MDIO device: %d\n", err); -		platform_device_unregister(&am35xx_emac_device); +	oh = omap_hwmod_lookup("davinci_emac"); +	if (!oh) { +		pr_err("Could not find davinci_emac hwmod\n"); +		return; +	} + +	am35xx_emac_pdata.rmii_en = rmii_en; + +	ret = omap_davinci_emac_dev_init(oh, &am35xx_emac_pdata, +					 sizeof(am35xx_emac_pdata)); +	if (ret) { +		pr_err("Could not build davinci_emac hwmod device\n");  		return;  	} diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 99ca6bad5c3..9511584fdc4 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c @@ -218,9 +218,6 @@ static struct twl4030_gpio_platform_data sdp2430_gpio_data = {  };  static struct twl4030_platform_data sdp2430_twldata = { -	.irq_base	= TWL4030_IRQ_BASE, -	.irq_end	= TWL4030_IRQ_END, -  	/* platform_data for children goes here */  	.gpio		= &sdp2430_gpio_data,  	.vmmc1		= &sdp2430_vmmc1, @@ -254,16 +251,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {  	{}	/* Terminator */  }; -static struct omap_usb_config sdp2430_usb_config __initdata = { -	.otg		= 1, -#ifdef  CONFIG_USB_GADGET_OMAP -	.hmc_mode	= 0x0, -#elif   defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) -	.hmc_mode	= 0x1, -#endif -	.pins[0]	= 3, -}; -  #ifdef CONFIG_OMAP_MUX  static struct omap_board_mux board_mux[] __initdata = {  	{ .reg_offset = OMAP_MUX_TERMINATOR }, @@ -280,7 +267,6 @@ static void __init omap_2430sdp_init(void)  	omap_serial_init();  	omap_sdrc_init(NULL, NULL);  	omap_hsmmc_init(mmc); -	omap2_usbfs_init(&sdp2430_usb_config);  	omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP);  	usb_musb_init(NULL); diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 8e17284a803..ad8a7d94afc 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -821,6 +821,9 @@ static void __init omap_4430sdp_display_init(void)  #ifdef CONFIG_OMAP_MUX  static struct omap_board_mux board_mux[] __initdata = {  	OMAP4_MUX(USBB2_ULPITLL_CLK, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), +	/* NIRQ2 for twl6040 */ +	OMAP4_MUX(SYS_NIRQ2, OMAP_MUX_MODE0 | +		  OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),  	{ .reg_offset = OMAP_MUX_TERMINATOR },  }; diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 502c31e123b..e5fa46bfde2 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c @@ -35,7 +35,6 @@  #include <asm/mach/flash.h>  #include <plat/led.h> -#include <plat/usb.h>  #include <plat/board.h>  #include "common.h"  #include <plat/gpmc.h> @@ -253,13 +252,6 @@ out:  	clk_put(gpmc_fck);  } -static struct omap_usb_config apollon_usb_config __initdata = { -	.register_dev	= 1, -	.hmc_mode	= 0x14,	/* 0:dev 1:host1 2:disable */ - -	.pins[0]	= 6, -}; -  static struct panel_generic_dpi_data apollon_panel_data = {  	.name			= "apollon",  }; @@ -297,15 +289,6 @@ static void __init apollon_led_init(void)  	gpio_request_array(apollon_gpio_leds, ARRAY_SIZE(apollon_gpio_leds));  } -static void __init apollon_usb_init(void) -{ -	/* USB device */ -	/* DEVICE_SUSPEND */ -	omap_mux_init_signal("mcbsp2_clkx.gpio_12", 0); -	gpio_request_one(12, GPIOF_OUT_INIT_LOW, "USB suspend"); -	omap2_usbfs_init(&apollon_usb_config); -} -  #ifdef CONFIG_OMAP_MUX  static struct omap_board_mux board_mux[] __initdata = {  	{ .reg_offset = OMAP_MUX_TERMINATOR }, @@ -321,7 +304,6 @@ static void __init omap_apollon_init(void)  	apollon_init_smc91x();  	apollon_led_init();  	apollon_flash_init(); -	apollon_usb_init();  	/* REVISIT: where's the correct place */  	omap_mux_init_signal("sys_nirq", OMAP_PULL_ENA | OMAP_PULL_UP); @@ -329,7 +311,7 @@ static void __init omap_apollon_init(void)  	/* LCD PWR_EN */  	omap_mux_init_signal("mcbsp2_dr.gpio_11", OMAP_PULL_ENA | OMAP_PULL_UP); -	/* Use Interal loop-back in MMC/SDIO Module Input Clock selection */ +	/* Use Internal loop-back in MMC/SDIO Module Input Clock selection */  	v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);  	v |= (1 << 24);  	omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index ded100c80a9..97d719047af 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c @@ -490,6 +490,71 @@ static struct twl4030_platform_data cm_t35_twldata = {  	.power		= &cm_t35_power_data,  }; +#if defined(CONFIG_VIDEO_OMAP3) || defined(CONFIG_VIDEO_OMAP3_MODULE) +#include <media/omap3isp.h> +#include "devices.h" + +static struct i2c_board_info cm_t35_isp_i2c_boardinfo[] = { +	{ +		I2C_BOARD_INFO("mt9t001", 0x5d), +	}, +	{ +		I2C_BOARD_INFO("tvp5150", 0x5c), +	}, +}; + +static struct isp_subdev_i2c_board_info cm_t35_isp_primary_subdevs[] = { +	{ +		.board_info = &cm_t35_isp_i2c_boardinfo[0], +		.i2c_adapter_id = 3, +	}, +	{ NULL, 0, }, +}; + +static struct isp_subdev_i2c_board_info cm_t35_isp_secondary_subdevs[] = { +	{ +		.board_info = &cm_t35_isp_i2c_boardinfo[1], +		.i2c_adapter_id = 3, +	}, +	{ NULL, 0, }, +}; + +static struct isp_v4l2_subdevs_group cm_t35_isp_subdevs[] = { +	{ +		.subdevs = cm_t35_isp_primary_subdevs, +		.interface = ISP_INTERFACE_PARALLEL, +		.bus = { +			.parallel = { +				.clk_pol = 1, +			}, +		}, +	}, +	{ +		.subdevs = cm_t35_isp_secondary_subdevs, +		.interface = ISP_INTERFACE_PARALLEL, +		.bus = { +			.parallel = { +				.clk_pol = 0, +			}, +		}, +	}, +	{ NULL, 0, }, +}; + +static struct isp_platform_data cm_t35_isp_pdata = { +	.subdevs = cm_t35_isp_subdevs, +}; + +static void __init cm_t35_init_camera(void) +{ +	if (omap3_init_camera(&cm_t35_isp_pdata) < 0) +		pr_warn("CM-T3x: Failed registering camera device!\n"); +} + +#else +static inline void cm_t35_init_camera(void) {} +#endif /* CONFIG_VIDEO_OMAP3 */ +  static void __init cm_t35_init_i2c(void)  {  	omap3_pmic_get_config(&cm_t35_twldata, TWL_COMMON_PDATA_USB, @@ -497,6 +562,8 @@ static void __init cm_t35_init_i2c(void)  			      TWL_COMMON_PDATA_AUDIO);  	omap3_pmic_init("tps65930", &cm_t35_twldata); + +	omap_register_i2c_bus(3, 400, NULL, 0);  }  #ifdef CONFIG_OMAP_MUX @@ -574,6 +641,27 @@ static struct omap_board_mux board_mux[] __initdata = {  	OMAP3_MUX(DSS_DATA16, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),  	OMAP3_MUX(DSS_DATA17, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT), +	/* Camera */ +	OMAP3_MUX(CAM_HS, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_VS, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_XCLKA, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_PCLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_FLD, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D4, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D5, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D6, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D7, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	OMAP3_MUX(CAM_D8, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN), +	OMAP3_MUX(CAM_D9, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN), +	OMAP3_MUX(CAM_STROBE, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), + +	OMAP3_MUX(CAM_D10, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLDOWN), +	OMAP3_MUX(CAM_D11, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLDOWN), +  	/* display controls */  	OMAP3_MUX(MCBSP1_FSR, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),  	OMAP3_MUX(GPMC_NCS7, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), @@ -646,6 +734,7 @@ static void __init cm_t3x_common_init(void)  	usb_musb_init(NULL);  	cm_t35_init_usbh(); +	cm_t35_init_camera();  }  static void __init cm_t35_init(void) diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 20293465786..6f93a20536e 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -25,23 +25,12 @@  #include "common-board-devices.h"  #if !(defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)) -#define omap_intc_of_init	NULL +#define intc_of_init	NULL  #endif  #ifndef CONFIG_ARCH_OMAP4  #define gic_of_init		NULL  #endif -static struct of_device_id irq_match[] __initdata = { -	{ .compatible = "ti,omap2-intc", .data = omap_intc_of_init, }, -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{ } -}; - -static void __init omap_init_irq(void) -{ -	of_irq_init(irq_match); -} -  static struct of_device_id omap_dt_match_table[] __initdata = {  	{ .compatible = "simple-bus", },  	{ .compatible = "ti,omap-infra", }, @@ -65,7 +54,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")  	.reserve	= omap_reserve,  	.map_io		= omap242x_map_io,  	.init_early	= omap2420_init_early, -	.init_irq	= omap_init_irq, +	.init_irq	= omap_intc_of_init,  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer, @@ -84,7 +73,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")  	.reserve	= omap_reserve,  	.map_io		= omap243x_map_io,  	.init_early	= omap2430_init_early, -	.init_irq	= omap_init_irq, +	.init_irq	= omap_intc_of_init,  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer, @@ -103,7 +92,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  	.reserve	= omap_reserve,  	.map_io		= omap3_map_io,  	.init_early	= omap3430_init_early, -	.init_irq	= omap_init_irq, +	.init_irq	= omap_intc_of_init,  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap3_timer, @@ -112,6 +101,24 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  MACHINE_END  #endif +#ifdef CONFIG_SOC_AM33XX +static const char *am33xx_boards_compat[] __initdata = { +	"ti,am33xx", +	NULL, +}; + +DT_MACHINE_START(AM33XX_DT, "Generic AM33XX (Flattened Device Tree)") +	.reserve	= omap_reserve, +	.map_io		= am33xx_map_io, +	.init_early	= am33xx_init_early, +	.init_irq	= omap_intc_of_init, +	.handle_irq	= omap3_intc_handle_irq, +	.init_machine	= omap_generic_init, +	.timer		= &omap3_am33xx_timer, +	.dt_compat	= am33xx_boards_compat, +MACHINE_END +#endif +  #ifdef CONFIG_ARCH_OMAP4  static const char *omap4_boards_compat[] __initdata = {  	"ti,omap4", @@ -122,7 +129,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")  	.reserve	= omap_reserve,  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early, -	.init_irq	= omap_init_irq, +	.init_irq	= omap_gic_of_init,  	.handle_irq	= gic_handle_irq,  	.init_machine	= omap_generic_init,  	.init_late	= omap4430_init_late, @@ -131,3 +138,22 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")  	.restart	= omap_prcm_restart,  MACHINE_END  #endif + +#ifdef CONFIG_SOC_OMAP5 +static const char *omap5_boards_compat[] __initdata = { +	"ti,omap5", +	NULL, +}; + +DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)") +	.reserve	= omap_reserve, +	.map_io		= omap5_map_io, +	.init_early	= omap5_init_early, +	.init_irq	= omap_gic_of_init, +	.handle_irq	= gic_handle_irq, +	.init_machine	= omap_generic_init, +	.timer		= &omap5_timer, +	.dt_compat	= omap5_boards_compat, +	.restart	= omap_prcm_restart, +MACHINE_END +#endif diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 876becf8205..ace20482e3e 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c @@ -32,7 +32,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <plat/usb.h>  #include <plat/board.h>  #include "common.h"  #include <plat/menelaus.h> @@ -329,17 +328,6 @@ static void __init h4_init_flash(void)  	h4_flash_resource.end	= base + SZ_64M - 1;  } -static struct omap_usb_config h4_usb_config __initdata = { -	/* S1.10 OFF -- usb "download port" -	 * usb0 switched to Mini-B port and isp1105 transceiver; -	 * S2.POS3 = ON, S2.POS4 = OFF ... to enable battery charging -	 */ -	.register_dev	= 1, -	.pins[0]	= 3, -/*	.hmc_mode	= 0x14,*/	/* 0:dev 1:host 2:disable */ -	.hmc_mode	= 0x00,		/* 0:dev|otg 1:disable 2:disable */ -}; -  static struct at24_platform_data m24c01 = {  	.byte_len	= SZ_1K / 8,  	.page_size	= 16, @@ -381,7 +369,6 @@ static void __init omap_h4_init(void)  			ARRAY_SIZE(h4_i2c_board_info));  	platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices)); -	omap2_usbfs_init(&h4_usb_config);  	omap_serial_init();  	omap_sdrc_init(NULL, NULL);  	h4_init_flash(); diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 2c5d0ed7528..677357ff61a 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -468,7 +468,6 @@ static struct omap_mmc_platform_data mmc1_data = {  	.cleanup			= n8x0_mmc_cleanup,  	.shutdown			= n8x0_mmc_shutdown,  	.max_freq			= 24000000, -	.dma_mask			= 0xffffffff,  	.slots[0] = {  		.wires			= 4,  		.set_power		= n8x0_mmc_set_power, diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 580fd17208d..6202fc76e49 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -433,7 +433,7 @@ static struct platform_device *omap3_beagle_devices[] __initdata = {  static const struct usbhs_omap_board_data usbhs_bdata __initconst = { -	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, +	.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,  	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,  	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 639bd07ea38..ef230a0eb5e 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c @@ -24,6 +24,10 @@  #include <linux/leds.h>  #include <linux/interrupt.h> +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> +#include <linux/mtd/nand.h> +  #include <linux/spi/spi.h>  #include <linux/spi/ads7846.h>  #include <linux/i2c/twl.h> @@ -43,6 +47,7 @@  #include <plat/board.h>  #include <plat/usb.h> +#include <plat/nand.h>  #include "common.h"  #include <plat/mcspi.h>  #include <video/omapdss.h> @@ -53,7 +58,6 @@  #include "hsmmc.h"  #include "common-board-devices.h" -#define OMAP3_EVM_TS_GPIO	175  #define OMAP3_EVM_EHCI_VBUS	22  #define OMAP3_EVM_EHCI_SELECT	61 @@ -355,6 +359,19 @@ static int omap3evm_twl_gpio_setup(struct device *dev,  	platform_device_register(&leds_gpio); +	/* Enable VBUS switch by setting TWL4030.GPIO2DIR as output +	 * for starting USB tranceiver +	 */ +#ifdef CONFIG_TWL4030_CORE +	if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) { +		u8 val; + +		twl_i2c_read_u8(TWL4030_MODULE_GPIO, &val, REG_GPIODATADIR1); +		val |= 0x04; /* TWL4030.GPIO2DIR BIT at GPIODATADIR1(0x9B) */ +		twl_i2c_write_u8(TWL4030_MODULE_GPIO, val, REG_GPIODATADIR1); +	} +#endif +  	return 0;  } @@ -461,6 +478,28 @@ struct wl12xx_platform_data omap3evm_wlan_data __initdata = {  };  #endif +/* VAUX2 for USB */ +static struct regulator_consumer_supply omap3evm_vaux2_supplies[] = { +	REGULATOR_SUPPLY("VDD_CSIPHY1", "omap3isp"),	/* OMAP ISP */ +	REGULATOR_SUPPLY("VDD_CSIPHY2", "omap3isp"),	/* OMAP ISP */ +	REGULATOR_SUPPLY("hsusb1", "ehci-omap.0"), +	REGULATOR_SUPPLY("vaux2", NULL), +}; + +static struct regulator_init_data omap3evm_vaux2 = { +	.constraints = { +		.min_uV		= 2800000, +		.max_uV		= 2800000, +		.apply_uV	= true, +		.valid_modes_mask	= REGULATOR_MODE_NORMAL +					| REGULATOR_MODE_STANDBY, +		.valid_ops_mask		= REGULATOR_CHANGE_MODE +					| REGULATOR_CHANGE_STATUS, +	}, +	.num_consumer_supplies		= ARRAY_SIZE(omap3evm_vaux2_supplies), +	.consumer_supplies		= omap3evm_vaux2_supplies, +}; +  static struct twl4030_platform_data omap3evm_twldata = {  	/* platform_data for children goes here */  	.keypad		= &omap3evm_kp_data, @@ -607,6 +646,37 @@ static struct regulator_consumer_supply dummy_supplies[] = {  	REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),  }; +static struct mtd_partition omap3evm_nand_partitions[] = { +	/* All the partition sizes are listed in terms of NAND block size */ +	{ +		.name           = "X-Loader", +		.offset         = 0, +		.size           = 4*(SZ_128K), +		.mask_flags     = MTD_WRITEABLE +	}, +	{ +		.name           = "U-Boot", +		.offset         = MTDPART_OFS_APPEND, +		.size           = 14*(SZ_128K), +		.mask_flags     = MTD_WRITEABLE +	}, +	{ +		.name           = "U-Boot Env", +		.offset         = MTDPART_OFS_APPEND, +		.size           = 2*(SZ_128K) +	}, +	{ +		.name           = "Kernel", +		.offset         = MTDPART_OFS_APPEND, +		.size           = 40*(SZ_128K) +	}, +	{ +		.name           = "File system", +		.size           = MTDPART_SIZ_FULL, +		.offset         = MTDPART_OFS_APPEND, +	}, +}; +  static void __init omap3_evm_init(void)  {  	struct omap_board_mux *obm; @@ -623,6 +693,9 @@ static void __init omap3_evm_init(void)  	omap_mux_init_gpio(63, OMAP_PIN_INPUT);  	omap_hsmmc_init(mmc); +	if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) +		omap3evm_twldata.vaux2 = &omap3evm_vaux2; +  	omap3_evm_i2c_init();  	omap_display_init(&omap3_evm_dss_data); @@ -656,6 +729,9 @@ static void __init omap3_evm_init(void)  	}  	usb_musb_init(&musb_board_data);  	usbhs_init(&usbhs_bdata); +	omap_nand_flash_init(NAND_BUSWIDTH_16, omap3evm_nand_partitions, +			     ARRAY_SIZE(omap3evm_nand_partitions)); +  	omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL);  	omap3evm_init_smsc911x();  	omap3_evm_display_init(); diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 932e1778aff..fca93d1afd4 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c @@ -93,9 +93,6 @@ static struct twl4030_usb_data omap3logic_usb_data = {  static struct twl4030_platform_data omap3logic_twldata = { -	.irq_base	= TWL4030_IRQ_BASE, -	.irq_end	= TWL4030_IRQ_END, -  	/* platform_data for children goes here */  	.gpio		= &omap3logic_gpio_data,  	.vmmc1		= &omap3logic_vmmc1, diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 982fb2622ab..70f6d1d2546 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -106,7 +106,7 @@ static struct platform_device leds_gpio = {  static struct omap_abe_twl6040_data panda_abe_audio_data = {  	/* Audio out */  	.has_hs		= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT, -	/* HandsFree through expasion connector */ +	/* HandsFree through expansion connector */  	.has_hf		= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,  	/* PandaBoard: FM TX, PandaBoardES: can be connected to audio out */  	.has_aux	= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT, @@ -379,6 +379,9 @@ static struct omap_board_mux board_mux[] __initdata = {  	OMAP4_MUX(DPM_EMU18, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),  	/* dispc2_data0 */  	OMAP4_MUX(DPM_EMU19, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), +	/* NIRQ2 for twl6040 */ +	OMAP4_MUX(SYS_NIRQ2, OMAP_MUX_MODE0 | +		  OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),  	{ .reg_offset = OMAP_MUX_TERMINATOR },  }; diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 5c4e6654216..ea3f565ba1a 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -398,24 +398,6 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)  	return omap2_clksel_set_parent(clk, new_parent);  } -/* OMAP3/4 non-CORE DPLL clkops */ - -#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) - -const struct clkops clkops_omap3_noncore_dpll_ops = { -	.enable		= omap3_noncore_dpll_enable, -	.disable	= omap3_noncore_dpll_disable, -	.allow_idle	= omap3_dpll_allow_idle, -	.deny_idle	= omap3_dpll_deny_idle, -}; - -const struct clkops clkops_omap3_core_dpll_ops = { -	.allow_idle	= omap3_dpll_allow_idle, -	.deny_idle	= omap3_dpll_deny_idle, -}; - -#endif -  /*   * OMAP2+ clock reset and init functions   */ diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index a1bb23a2335..35ec5f3d9a7 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h @@ -155,4 +155,18 @@ extern const struct clkops clkops_omap3_noncore_dpll_ops;  extern const struct clkops clkops_omap3_core_dpll_ops;  extern const struct clkops clkops_omap4_dpllmx_ops; +/* clksel_rate blocks shared between OMAP44xx and AM33xx */ +extern const struct clksel_rate div_1_0_rates[]; +extern const struct clksel_rate div_1_1_rates[]; +extern const struct clksel_rate div_1_2_rates[]; +extern const struct clksel_rate div_1_3_rates[]; +extern const struct clksel_rate div_1_4_rates[]; +extern const struct clksel_rate div31_1to31_rates[]; + +/* clocks shared between various OMAP SoCs */ +extern struct clk virt_19200000_ck; +extern struct clk virt_26000000_ck; + +extern int am33xx_clk_init(void); +  #endif diff --git a/arch/arm/mach-omap2/clock2420_data.c b/arch/arm/mach-omap2/clock2420_data.c index bace9308a4d..002745181ad 100644 --- a/arch/arm/mach-omap2/clock2420_data.c +++ b/arch/arm/mach-omap2/clock2420_data.c @@ -1774,8 +1774,6 @@ static struct omap_clk omap2420_clks[] = {  	CLK(NULL,	"osc_ck",	&osc_ck,	CK_242X),  	CLK(NULL,	"sys_ck",	&sys_ck,	CK_242X),  	CLK(NULL,	"alt_ck",	&alt_ck,	CK_242X), -	CLK("omap-mcbsp.1",	"pad_fck",	&mcbsp_clks,	CK_242X), -	CLK("omap-mcbsp.2",	"pad_fck",	&mcbsp_clks,	CK_242X),  	CLK(NULL,	"mcbsp_clks",	&mcbsp_clks,	CK_242X),  	/* internal analog sources */  	CLK(NULL,	"dpll_ck",	&dpll_ck,	CK_242X), @@ -1784,8 +1782,6 @@ static struct omap_clk omap2420_clks[] = {  	/* internal prcm root sources */  	CLK(NULL,	"func_54m_ck",	&func_54m_ck,	CK_242X),  	CLK(NULL,	"core_ck",	&core_ck,	CK_242X), -	CLK("omap-mcbsp.1",	"prcm_fck",	&func_96m_ck,	CK_242X), -	CLK("omap-mcbsp.2",	"prcm_fck",	&func_96m_ck,	CK_242X),  	CLK(NULL,	"func_96m_ck",	&func_96m_ck,	CK_242X),  	CLK(NULL,	"func_48m_ck",	&func_48m_ck,	CK_242X),  	CLK(NULL,	"func_12m_ck",	&func_12m_ck,	CK_242X), @@ -1901,42 +1897,9 @@ static struct omap_clk omap2420_clks[] = {  	CLK(NULL,	"pka_ick",	&pka_ick,	CK_242X),  	CLK(NULL,	"usb_fck",	&usb_fck,	CK_242X),  	CLK("musb-hdrc",	"fck",	&osc_ck,	CK_242X), -	CLK("omap_timer.1",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.2",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.3",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.4",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.5",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.6",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.7",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.8",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.9",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.10",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.11",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.12",	"32k_ck",	&func_32k_ck,	CK_243X), -	CLK("omap_timer.1",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.2",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.3",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.4",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.5",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.6",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.7",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.8",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.9",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.10",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.11",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.12",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.1",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.2",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.3",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.4",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.5",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.6",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.7",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.8",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.9",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.10",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.11",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.12",	"alt_ck",	&alt_ck,	CK_243X), +	CLK(NULL,	"timer_32k_ck",	&func_32k_ck,	CK_243X), +	CLK(NULL,	"timer_sys_ck",	&sys_ck,	CK_243X), +	CLK(NULL,	"timer_ext_ck",	&alt_ck,	CK_243X),  };  /* diff --git a/arch/arm/mach-omap2/clock2430_data.c b/arch/arm/mach-omap2/clock2430_data.c index 3b4d09a5039..cacabb070e2 100644 --- a/arch/arm/mach-omap2/clock2430_data.c +++ b/arch/arm/mach-omap2/clock2430_data.c @@ -1858,11 +1858,6 @@ static struct omap_clk omap2430_clks[] = {  	CLK(NULL,	"osc_ck",	&osc_ck,	CK_243X),  	CLK(NULL,	"sys_ck",	&sys_ck,	CK_243X),  	CLK(NULL,	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap-mcbsp.1",	"pad_fck",	&mcbsp_clks,	CK_243X), -	CLK("omap-mcbsp.2",	"pad_fck",	&mcbsp_clks,	CK_243X), -	CLK("omap-mcbsp.3",	"pad_fck",	&mcbsp_clks,	CK_243X), -	CLK("omap-mcbsp.4",	"pad_fck",	&mcbsp_clks,	CK_243X), -	CLK("omap-mcbsp.5",	"pad_fck",	&mcbsp_clks,	CK_243X),  	CLK(NULL,	"mcbsp_clks",	&mcbsp_clks,	CK_243X),  	/* internal analog sources */  	CLK(NULL,	"dpll_ck",	&dpll_ck,	CK_243X), @@ -1871,11 +1866,6 @@ static struct omap_clk omap2430_clks[] = {  	/* internal prcm root sources */  	CLK(NULL,	"func_54m_ck",	&func_54m_ck,	CK_243X),  	CLK(NULL,	"core_ck",	&core_ck,	CK_243X), -	CLK("omap-mcbsp.1",	"prcm_fck",	&func_96m_ck,	CK_243X), -	CLK("omap-mcbsp.2",	"prcm_fck",	&func_96m_ck,	CK_243X), -	CLK("omap-mcbsp.3",	"prcm_fck",	&func_96m_ck,	CK_243X), -	CLK("omap-mcbsp.4",	"prcm_fck",	&func_96m_ck,	CK_243X), -	CLK("omap-mcbsp.5",	"prcm_fck",	&func_96m_ck,	CK_243X),  	CLK(NULL,	"func_96m_ck",	&func_96m_ck,	CK_243X),  	CLK(NULL,	"func_48m_ck",	&func_48m_ck,	CK_243X),  	CLK(NULL,	"func_12m_ck",	&func_12m_ck,	CK_243X), @@ -2000,42 +1990,9 @@ static struct omap_clk omap2430_clks[] = {  	CLK(NULL,	"mdm_intc_ick",	&mdm_intc_ick,	CK_243X),  	CLK("omap_hsmmc.0", "mmchsdb_fck",	&mmchsdb1_fck,	CK_243X),  	CLK("omap_hsmmc.1", "mmchsdb_fck",	&mmchsdb2_fck,	CK_243X), -	CLK("omap_timer.1",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.2",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.3",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.4",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.5",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.6",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.7",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.8",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.9",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.10",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.11",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.12",	"32k_ck",  &func_32k_ck,   CK_243X), -	CLK("omap_timer.1",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.2",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.3",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.4",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.5",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.6",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.7",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.8",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.9",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.10",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.11",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.12",	"sys_ck",	&sys_ck,	CK_243X), -	CLK("omap_timer.1",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.2",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.3",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.4",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.5",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.6",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.7",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.8",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.9",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.10",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.11",	"alt_ck",	&alt_ck,	CK_243X), -	CLK("omap_timer.12",	"alt_ck",	&alt_ck,	CK_243X), +	CLK(NULL,	"timer_32k_ck",  &func_32k_ck,   CK_243X), +	CLK(NULL,	"timer_sys_ck",	&sys_ck,	CK_243X), +	CLK(NULL,	"timer_ext_ck",	&alt_ck,	CK_243X),  };  /* diff --git a/arch/arm/mach-omap2/clock33xx_data.c b/arch/arm/mach-omap2/clock33xx_data.c new file mode 100644 index 00000000000..25bbcc7ca4d --- /dev/null +++ b/arch/arm/mach-omap2/clock33xx_data.c @@ -0,0 +1,1105 @@ +/* + * AM33XX Clock data + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + * Vaibhav Hiremath <hvaibhav@ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> +#include <linux/list.h> +#include <linux/clk.h> +#include <plat/clkdev_omap.h> +#include <plat/am33xx.h> + +#include "iomap.h" +#include "control.h" +#include "clock.h" +#include "cm.h" +#include "cm33xx.h" +#include "cm-regbits-33xx.h" +#include "prm.h" + +/* Maximum DPLL multiplier, divider values for AM33XX */ +#define AM33XX_MAX_DPLL_MULT		2047 +#define AM33XX_MAX_DPLL_DIV		128 + +/* Modulemode control */ +#define AM33XX_MODULEMODE_HWCTRL	0 +#define AM33XX_MODULEMODE_SWCTRL	1 + +/* TRM ERRATA: Timer 3 & 6 default parent (TCLKIN) may not be always + *    physically present, in such a case HWMOD enabling of + *    clock would be failure with default parent. And timer + *    probe thinks clock is already enabled, this leads to + *    crash upon accessing timer 3 & 6 registers in probe. + *    Fix by setting parent of both these timers to master + *    oscillator clock. + */ +static inline void am33xx_init_timer_parent(struct clk *clk) +{ +	omap2_clksel_set_parent(clk, clk->parent); +} + +/* Root clocks */ + +/* RTC 32k */ +static struct clk clk_32768_ck = { +	.name		= "clk_32768_ck", +	.clkdm_name	= "l4_rtc_clkdm", +	.rate		= 32768, +	.ops		= &clkops_null, +}; + +/* On-Chip 32KHz RC OSC */ +static struct clk clk_rc32k_ck = { +	.name		= "clk_rc32k_ck", +	.rate		= 32000, +	.ops		= &clkops_null, +}; + +/* Crystal input clks */ +static struct clk virt_24000000_ck = { +	.name		= "virt_24000000_ck", +	.rate		= 24000000, +	.ops		= &clkops_null, +}; + +static struct clk virt_25000000_ck = { +	.name		= "virt_25000000_ck", +	.rate		= 25000000, +	.ops		= &clkops_null, +}; + +/* Oscillator clock */ +/* 19.2, 24, 25 or 26 MHz */ +static const struct clksel sys_clkin_sel[] = { +	{ .parent = &virt_19200000_ck, .rates = div_1_0_rates }, +	{ .parent = &virt_24000000_ck, .rates = div_1_1_rates }, +	{ .parent = &virt_25000000_ck, .rates = div_1_2_rates }, +	{ .parent = &virt_26000000_ck, .rates = div_1_3_rates }, +	{ .parent = NULL }, +}; + +/* External clock - 12 MHz */ +static struct clk tclkin_ck = { +	.name		= "tclkin_ck", +	.rate		= 12000000, +	.ops		= &clkops_null, +}; + +/* + * sys_clk in: input to the dpll and also used as funtional clock for, + *   adc_tsc, smartreflex0-1, timer1-7, mcasp0-1, dcan0-1, cefuse + * + */ +static struct clk sys_clkin_ck = { +	.name		= "sys_clkin_ck", +	.parent		= &virt_24000000_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel_reg	= AM33XX_CTRL_REGADDR(AM33XX_CONTROL_STATUS), +	.clksel_mask	= AM33XX_CONTROL_STATUS_SYSBOOT1_MASK, +	.clksel		= sys_clkin_sel, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +/* DPLL_CORE */ +static struct dpll_data dpll_core_dd = { +	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_CORE, +	.clk_bypass	= &sys_clkin_ck, +	.clk_ref	= &sys_clkin_ck, +	.control_reg	= AM33XX_CM_CLKMODE_DPLL_CORE, +	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), +	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_CORE, +	.mult_mask	= AM33XX_DPLL_MULT_MASK, +	.div1_mask	= AM33XX_DPLL_DIV_MASK, +	.enable_mask	= AM33XX_DPLL_EN_MASK, +	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK, +	.max_multiplier	= AM33XX_MAX_DPLL_MULT, +	.max_divider	= AM33XX_MAX_DPLL_DIV, +	.min_divider	= 1, +}; + +/* CLKDCOLDO output */ +static struct clk dpll_core_ck = { +	.name		= "dpll_core_ck", +	.parent		= &sys_clkin_ck, +	.dpll_data	= &dpll_core_dd, +	.init		= &omap2_init_dpll_parent, +	.ops		= &clkops_omap3_core_dpll_ops, +	.recalc		= &omap3_dpll_recalc, +}; + +static struct clk dpll_core_x2_ck = { +	.name		= "dpll_core_x2_ck", +	.parent		= &dpll_core_ck, +	.flags		= CLOCK_CLKOUTX2, +	.ops		= &clkops_null, +	.recalc		= &omap3_clkoutx2_recalc, +}; + + +static const struct clksel dpll_core_m4_div[] = { +	{ .parent = &dpll_core_x2_ck, .rates = div31_1to31_rates }, +	{ .parent = NULL }, +}; + +static struct clk dpll_core_m4_ck = { +	.name		= "dpll_core_m4_ck", +	.parent		= &dpll_core_x2_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= dpll_core_m4_div, +	.clksel_reg	= AM33XX_CM_DIV_M4_DPLL_CORE, +	.clksel_mask	= AM33XX_HSDIVIDER_CLKOUT1_DIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static const struct clksel dpll_core_m5_div[] = { +	{ .parent = &dpll_core_x2_ck, .rates = div31_1to31_rates }, +	{ .parent = NULL }, +}; + +static struct clk dpll_core_m5_ck = { +	.name		= "dpll_core_m5_ck", +	.parent		= &dpll_core_x2_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= dpll_core_m5_div, +	.clksel_reg	= AM33XX_CM_DIV_M5_DPLL_CORE, +	.clksel_mask	= AM33XX_HSDIVIDER_CLKOUT2_DIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static const struct clksel dpll_core_m6_div[] = { +	{ .parent = &dpll_core_x2_ck, .rates = div31_1to31_rates }, +	{ .parent = NULL }, +}; + +static struct clk dpll_core_m6_ck = { +	.name		= "dpll_core_m6_ck", +	.parent		= &dpll_core_x2_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= dpll_core_m6_div, +	.clksel_reg	= AM33XX_CM_DIV_M6_DPLL_CORE, +	.clksel_mask	= AM33XX_HSDIVIDER_CLKOUT3_DIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +/* DPLL_MPU */ +static struct dpll_data dpll_mpu_dd = { +	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_MPU, +	.clk_bypass	= &sys_clkin_ck, +	.clk_ref	= &sys_clkin_ck, +	.control_reg	= AM33XX_CM_CLKMODE_DPLL_MPU, +	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), +	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_MPU, +	.mult_mask	= AM33XX_DPLL_MULT_MASK, +	.div1_mask	= AM33XX_DPLL_DIV_MASK, +	.enable_mask	= AM33XX_DPLL_EN_MASK, +	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK, +	.max_multiplier	= AM33XX_MAX_DPLL_MULT, +	.max_divider	= AM33XX_MAX_DPLL_DIV, +	.min_divider	= 1, +}; + +/* CLKOUT: fdpll/M2 */ +static struct clk dpll_mpu_ck = { +	.name		= "dpll_mpu_ck", +	.parent		= &sys_clkin_ck, +	.dpll_data	= &dpll_mpu_dd, +	.init		= &omap2_init_dpll_parent, +	.ops		= &clkops_omap3_noncore_dpll_ops, +	.recalc		= &omap3_dpll_recalc, +	.round_rate	= &omap2_dpll_round_rate, +	.set_rate	= &omap3_noncore_dpll_set_rate, +}; + +/* + * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 + * and ALT_CLK1/2) + */ +static const struct clksel dpll_mpu_m2_div[] = { +	{ .parent = &dpll_mpu_ck, .rates = div31_1to31_rates }, +	{ .parent = NULL }, +}; + +static struct clk dpll_mpu_m2_ck = { +	.name		= "dpll_mpu_m2_ck", +	.clkdm_name	= "mpu_clkdm", +	.parent		= &dpll_mpu_ck, +	.clksel		= dpll_mpu_m2_div, +	.clksel_reg	= AM33XX_CM_DIV_M2_DPLL_MPU, +	.clksel_mask	= AM33XX_DPLL_CLKOUT_DIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +/* DPLL_DDR */ +static struct dpll_data dpll_ddr_dd = { +	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_DDR, +	.clk_bypass	= &sys_clkin_ck, +	.clk_ref	= &sys_clkin_ck, +	.control_reg	= AM33XX_CM_CLKMODE_DPLL_DDR, +	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), +	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_DDR, +	.mult_mask	= AM33XX_DPLL_MULT_MASK, +	.div1_mask	= AM33XX_DPLL_DIV_MASK, +	.enable_mask	= AM33XX_DPLL_EN_MASK, +	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK, +	.max_multiplier	= AM33XX_MAX_DPLL_MULT, +	.max_divider	= AM33XX_MAX_DPLL_DIV, +	.min_divider	= 1, +}; + +/* CLKOUT: fdpll/M2 */ +static struct clk dpll_ddr_ck = { +	.name		= "dpll_ddr_ck", +	.parent		= &sys_clkin_ck, +	.dpll_data	= &dpll_ddr_dd, +	.init		= &omap2_init_dpll_parent, +	.ops		= &clkops_null, +	.recalc		= &omap3_dpll_recalc, +}; + +/* + * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 + * and ALT_CLK1/2) + */ +static const struct clksel dpll_ddr_m2_div[] = { +	{ .parent = &dpll_ddr_ck, .rates = div31_1to31_rates }, +	{ .parent = NULL }, +}; + +static struct clk dpll_ddr_m2_ck = { +	.name		= "dpll_ddr_m2_ck", +	.parent		= &dpll_ddr_ck, +	.clksel		= dpll_ddr_m2_div, +	.clksel_reg	= AM33XX_CM_DIV_M2_DPLL_DDR, +	.clksel_mask	= AM33XX_DPLL_CLKOUT_DIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +/* emif_fck functional clock */ +static struct clk dpll_ddr_m2_div2_ck = { +	.name		= "dpll_ddr_m2_div2_ck", +	.clkdm_name	= "l3_clkdm", +	.parent		= &dpll_ddr_m2_ck, +	.ops		= &clkops_null, +	.fixed_div	= 2, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +/* DPLL_DISP */ +static struct dpll_data dpll_disp_dd = { +	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_DISP, +	.clk_bypass	= &sys_clkin_ck, +	.clk_ref	= &sys_clkin_ck, +	.control_reg	= AM33XX_CM_CLKMODE_DPLL_DISP, +	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), +	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_DISP, +	.mult_mask	= AM33XX_DPLL_MULT_MASK, +	.div1_mask	= AM33XX_DPLL_DIV_MASK, +	.enable_mask	= AM33XX_DPLL_EN_MASK, +	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK, +	.max_multiplier	= AM33XX_MAX_DPLL_MULT, +	.max_divider	= AM33XX_MAX_DPLL_DIV, +	.min_divider	= 1, +}; + +/* CLKOUT: fdpll/M2 */ +static struct clk dpll_disp_ck = { +	.name		= "dpll_disp_ck", +	.parent		= &sys_clkin_ck, +	.dpll_data	= &dpll_disp_dd, +	.init		= &omap2_init_dpll_parent, +	.ops		= &clkops_null, +	.recalc		= &omap3_dpll_recalc, +	.round_rate	= &omap2_dpll_round_rate, +	.set_rate	= &omap3_noncore_dpll_set_rate, +}; + +/* + * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 + * and ALT_CLK1/2) + */ +static const struct clksel dpll_disp_m2_div[] = { +	{ .parent = &dpll_disp_ck, .rates = div31_1to31_rates }, +	{ .parent = NULL }, +}; + +static struct clk dpll_disp_m2_ck = { +	.name		= "dpll_disp_m2_ck", +	.parent		= &dpll_disp_ck, +	.clksel		= dpll_disp_m2_div, +	.clksel_reg	= AM33XX_CM_DIV_M2_DPLL_DISP, +	.clksel_mask	= AM33XX_DPLL_CLKOUT_DIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +/* DPLL_PER */ +static struct dpll_data dpll_per_dd = { +	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_PERIPH, +	.clk_bypass	= &sys_clkin_ck, +	.clk_ref	= &sys_clkin_ck, +	.control_reg	= AM33XX_CM_CLKMODE_DPLL_PER, +	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), +	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_PER, +	.mult_mask	= AM33XX_DPLL_MULT_PERIPH_MASK, +	.div1_mask	= AM33XX_DPLL_PER_DIV_MASK, +	.enable_mask	= AM33XX_DPLL_EN_MASK, +	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK, +	.max_multiplier	= AM33XX_MAX_DPLL_MULT, +	.max_divider	= AM33XX_MAX_DPLL_DIV, +	.min_divider	= 1, +	.flags		= DPLL_J_TYPE, +}; + +/* CLKDCOLDO */ +static struct clk dpll_per_ck = { +	.name		= "dpll_per_ck", +	.parent		= &sys_clkin_ck, +	.dpll_data	= &dpll_per_dd, +	.init		= &omap2_init_dpll_parent, +	.ops		= &clkops_null, +	.recalc		= &omap3_dpll_recalc, +	.round_rate	= &omap2_dpll_round_rate, +	.set_rate	= &omap3_noncore_dpll_set_rate, +}; + +/* CLKOUT: fdpll/M2 */ +static const struct clksel dpll_per_m2_div[] = { +	{ .parent = &dpll_per_ck, .rates = div31_1to31_rates }, +	{ .parent = NULL }, +}; + +static struct clk dpll_per_m2_ck = { +	.name		= "dpll_per_m2_ck", +	.parent		= &dpll_per_ck, +	.clksel		= dpll_per_m2_div, +	.clksel_reg	= AM33XX_CM_DIV_M2_DPLL_PER, +	.clksel_mask	= AM33XX_DPLL_CLKOUT_DIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static struct clk dpll_per_m2_div4_wkupdm_ck = { +	.name		= "dpll_per_m2_div4_wkupdm_ck", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &dpll_per_m2_ck, +	.fixed_div	= 4, +	.ops		= &clkops_null, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +static struct clk dpll_per_m2_div4_ck = { +	.name		= "dpll_per_m2_div4_ck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &dpll_per_m2_ck, +	.fixed_div	= 4, +	.ops		= &clkops_null, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +static struct clk l3_gclk = { +	.name		= "l3_gclk", +	.clkdm_name	= "l3_clkdm", +	.parent		= &dpll_core_m4_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk dpll_core_m4_div2_ck = { +	.name		= "dpll_core_m4_div2_ck", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &dpll_core_m4_ck, +	.ops		= &clkops_null, +	.fixed_div	= 2, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +static struct clk l4_rtc_gclk = { +	.name		= "l4_rtc_gclk", +	.parent		= &dpll_core_m4_ck, +	.ops		= &clkops_null, +	.fixed_div	= 2, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +static struct clk clk_24mhz = { +	.name		= "clk_24mhz", +	.parent		= &dpll_per_m2_ck, +	.fixed_div	= 8, +	.ops		= &clkops_null, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +/* + * Below clock nodes describes clockdomains derived out + * of core clock. + */ +static struct clk l4hs_gclk = { +	.name		= "l4hs_gclk", +	.clkdm_name	= "l4hs_clkdm", +	.parent		= &dpll_core_m4_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk l3s_gclk = { +	.name		= "l3s_gclk", +	.clkdm_name	= "l3s_clkdm", +	.parent		= &dpll_core_m4_div2_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk l4fw_gclk = { +	.name		= "l4fw_gclk", +	.clkdm_name	= "l4fw_clkdm", +	.parent		= &dpll_core_m4_div2_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk l4ls_gclk = { +	.name		= "l4ls_gclk", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &dpll_core_m4_div2_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk sysclk_div_ck = { +	.name		= "sysclk_div_ck", +	.parent		= &dpll_core_m4_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +/* + * In order to match the clock domain with hwmod clockdomain entry, + * separate clock nodes is required for the modules which are + * directly getting their funtioncal clock from sys_clkin. + */ +static struct clk adc_tsc_fck = { +	.name		= "adc_tsc_fck", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &sys_clkin_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk dcan0_fck = { +	.name		= "dcan0_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk dcan1_fck = { +	.name		= "dcan1_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk mcasp0_fck = { +	.name		= "mcasp0_fck", +	.clkdm_name	= "l3s_clkdm", +	.parent		= &sys_clkin_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk mcasp1_fck = { +	.name		= "mcasp1_fck", +	.clkdm_name	= "l3s_clkdm", +	.parent		= &sys_clkin_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk smartreflex0_fck = { +	.name		= "smartreflex0_fck", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &sys_clkin_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk smartreflex1_fck = { +	.name		= "smartreflex1_fck", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &sys_clkin_ck, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +/* + * Modules clock nodes + * + * The following clock leaf nodes are added for the moment because: + * + *  - hwmod data is not present for these modules, either hwmod + *    control is not required or its not populated. + *  - Driver code is not yet migrated to use hwmod/runtime pm + *  - Modules outside kernel access (to disable them by default) + * + *     - debugss + *     - mmu (gfx domain) + *     - cefuse + *     - usbotg_fck (its additional clock and not really a modulemode) + *     - ieee5000 + */ +static struct clk debugss_ick = { +	.name		= "debugss_ick", +	.clkdm_name	= "l3_aon_clkdm", +	.parent		= &dpll_core_m4_ck, +	.ops		= &clkops_omap2_dflt, +	.enable_reg	= AM33XX_CM_WKUP_DEBUGSS_CLKCTRL, +	.enable_bit	= AM33XX_MODULEMODE_SWCTRL, +	.recalc		= &followparent_recalc, +}; + +static struct clk mmu_fck = { +	.name		= "mmu_fck", +	.clkdm_name	= "gfx_l3_clkdm", +	.parent		= &dpll_core_m4_ck, +	.ops		= &clkops_omap2_dflt, +	.enable_reg	= AM33XX_CM_GFX_MMUDATA_CLKCTRL, +	.enable_bit	= AM33XX_MODULEMODE_SWCTRL, +	.recalc		= &followparent_recalc, +}; + +static struct clk cefuse_fck = { +	.name		= "cefuse_fck", +	.clkdm_name	= "l4_cefuse_clkdm", +	.parent		= &sys_clkin_ck, +	.enable_reg	= AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL, +	.enable_bit	= AM33XX_MODULEMODE_SWCTRL, +	.ops		= &clkops_omap2_dflt, +	.recalc		= &followparent_recalc, +}; + +/* + * clkdiv32 is generated from fixed division of 732.4219 + */ +static struct clk clkdiv32k_ick = { +	.name		= "clkdiv32k_ick", +	.clkdm_name	= "clk_24mhz_clkdm", +	.rate		= 32768, +	.parent		= &clk_24mhz, +	.enable_reg	= AM33XX_CM_PER_CLKDIV32K_CLKCTRL, +	.enable_bit	= AM33XX_MODULEMODE_SWCTRL, +	.ops		= &clkops_omap2_dflt, +}; + +static struct clk usbotg_fck = { +	.name		= "usbotg_fck", +	.clkdm_name	= "l3s_clkdm", +	.parent		= &dpll_per_ck, +	.enable_reg	= AM33XX_CM_CLKDCOLDO_DPLL_PER, +	.enable_bit	= AM33XX_ST_DPLL_CLKDCOLDO_SHIFT, +	.ops		= &clkops_omap2_dflt, +	.recalc		= &followparent_recalc, +}; + +static struct clk ieee5000_fck = { +	.name		= "ieee5000_fck", +	.clkdm_name	= "l3s_clkdm", +	.parent		= &dpll_core_m4_div2_ck, +	.enable_reg	= AM33XX_CM_PER_IEEE5000_CLKCTRL, +	.enable_bit	= AM33XX_MODULEMODE_SWCTRL, +	.ops		= &clkops_omap2_dflt, +	.recalc		= &followparent_recalc, +}; + +/* Timers */ +static const struct clksel timer1_clkmux_sel[] = { +	{ .parent = &sys_clkin_ck, .rates = div_1_0_rates }, +	{ .parent = &clkdiv32k_ick, .rates = div_1_1_rates }, +	{ .parent = &tclkin_ck, .rates = div_1_2_rates }, +	{ .parent = &clk_rc32k_ck, .rates = div_1_3_rates }, +	{ .parent = &clk_32768_ck, .rates = div_1_4_rates }, +	{ .parent = NULL }, +}; + +static struct clk timer1_fck = { +	.name		= "timer1_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= timer1_clkmux_sel, +	.clksel_reg	= AM33XX_CLKSEL_TIMER1MS_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_2_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static const struct clksel timer2_to_7_clk_sel[] = { +	{ .parent = &tclkin_ck, .rates = div_1_0_rates }, +	{ .parent = &sys_clkin_ck, .rates = div_1_1_rates }, +	{ .parent = &clkdiv32k_ick, .rates = div_1_2_rates }, +	{ .parent = NULL }, +}; + +static struct clk timer2_fck = { +	.name		= "timer2_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= timer2_to_7_clk_sel, +	.clksel_reg	= AM33XX_CLKSEL_TIMER2_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static struct clk timer3_fck = { +	.name		= "timer3_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.init		= &am33xx_init_timer_parent, +	.clksel		= timer2_to_7_clk_sel, +	.clksel_reg	= AM33XX_CLKSEL_TIMER3_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static struct clk timer4_fck = { +	.name		= "timer4_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= timer2_to_7_clk_sel, +	.clksel_reg	= AM33XX_CLKSEL_TIMER4_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static struct clk timer5_fck = { +	.name		= "timer5_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= timer2_to_7_clk_sel, +	.clksel_reg	= AM33XX_CLKSEL_TIMER5_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static struct clk timer6_fck = { +	.name		= "timer6_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.init		= &am33xx_init_timer_parent, +	.clksel		= timer2_to_7_clk_sel, +	.clksel_reg	= AM33XX_CLKSEL_TIMER6_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static struct clk timer7_fck = { +	.name		= "timer7_fck", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &sys_clkin_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= timer2_to_7_clk_sel, +	.clksel_reg	= AM33XX_CLKSEL_TIMER7_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static struct clk cpsw_125mhz_gclk = { +	.name		= "cpsw_125mhz_gclk", +	.clkdm_name	= "cpsw_125mhz_clkdm", +	.parent		= &dpll_core_m5_ck, +	.ops		= &clkops_null, +	.fixed_div	= 2, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +static const struct clksel cpsw_cpts_rft_clkmux_sel[] = { +	{ .parent = &dpll_core_m5_ck, .rates = div_1_0_rates }, +	{ .parent = &dpll_core_m4_ck, .rates = div_1_1_rates }, +	{ .parent = NULL }, +}; + +static struct clk cpsw_cpts_rft_clk = { +	.name		= "cpsw_cpts_rft_clk", +	.clkdm_name	= "cpsw_125mhz_clkdm", +	.parent		= &dpll_core_m5_ck, +	.clksel		= cpsw_cpts_rft_clkmux_sel, +	.clksel_reg	= AM33XX_CM_CPTS_RFT_CLKSEL, +	.clksel_mask	= AM33XX_CLKSEL_0_0_MASK, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +/* gpio */ +static const struct clksel gpio0_dbclk_mux_sel[] = { +	{ .parent = &clk_rc32k_ck, .rates = div_1_0_rates }, +	{ .parent = &clk_32768_ck, .rates = div_1_1_rates }, +	{ .parent = &clkdiv32k_ick, .rates = div_1_2_rates }, +	{ .parent = NULL }, +}; + +static struct clk gpio0_dbclk_mux_ck = { +	.name		= "gpio0_dbclk_mux_ck", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &clk_rc32k_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= gpio0_dbclk_mux_sel, +	.clksel_reg	= AM33XX_CLKSEL_GPIO0_DBCLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +static struct clk gpio0_dbclk = { +	.name		= "gpio0_dbclk", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &gpio0_dbclk_mux_ck, +	.enable_reg	= AM33XX_CM_WKUP_GPIO0_CLKCTRL, +	.enable_bit	= AM33XX_OPTFCLKEN_GPIO0_GDBCLK_SHIFT, +	.ops		= &clkops_omap2_dflt, +	.recalc		= &followparent_recalc, +}; + +static struct clk gpio1_dbclk = { +	.name		= "gpio1_dbclk", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &clkdiv32k_ick, +	.enable_reg	= AM33XX_CM_PER_GPIO1_CLKCTRL, +	.enable_bit	= AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_SHIFT, +	.ops		= &clkops_omap2_dflt, +	.recalc		= &followparent_recalc, +}; + +static struct clk gpio2_dbclk = { +	.name		= "gpio2_dbclk", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &clkdiv32k_ick, +	.enable_reg	= AM33XX_CM_PER_GPIO2_CLKCTRL, +	.enable_bit	= AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_SHIFT, +	.ops		= &clkops_omap2_dflt, +	.recalc		= &followparent_recalc, +}; + +static struct clk gpio3_dbclk = { +	.name		= "gpio3_dbclk", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &clkdiv32k_ick, +	.enable_reg	= AM33XX_CM_PER_GPIO3_CLKCTRL, +	.enable_bit	= AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_SHIFT, +	.ops		= &clkops_omap2_dflt, +	.recalc		= &followparent_recalc, +}; + +static const struct clksel pruss_ocp_clk_mux_sel[] = { +	{ .parent = &l3_gclk, .rates = div_1_0_rates }, +	{ .parent = &dpll_disp_m2_ck, .rates = div_1_1_rates }, +	{ .parent = NULL }, +}; + +static struct clk pruss_ocp_gclk = { +	.name		= "pruss_ocp_gclk", +	.clkdm_name	= "pruss_ocp_clkdm", +	.parent		= &l3_gclk, +	.init		= &omap2_init_clksel_parent, +	.clksel		= pruss_ocp_clk_mux_sel, +	.clksel_reg	= AM33XX_CLKSEL_PRUSS_OCP_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_0_MASK, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static const struct clksel lcd_clk_mux_sel[] = { +	{ .parent = &dpll_disp_m2_ck, .rates = div_1_0_rates }, +	{ .parent = &dpll_core_m5_ck, .rates = div_1_1_rates }, +	{ .parent = &dpll_per_m2_ck, .rates = div_1_2_rates }, +	{ .parent = NULL }, +}; + +static struct clk lcd_gclk = { +	.name		= "lcd_gclk", +	.clkdm_name	= "lcdc_clkdm", +	.parent		= &dpll_disp_m2_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= lcd_clk_mux_sel, +	.clksel_reg	= AM33XX_CLKSEL_LCDC_PIXEL_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static struct clk mmc_clk = { +	.name		= "mmc_clk", +	.clkdm_name	= "l4ls_clkdm", +	.parent		= &dpll_per_m2_ck, +	.ops		= &clkops_null, +	.fixed_div	= 2, +	.recalc		= &omap_fixed_divisor_recalc, +}; + +static struct clk mmc2_fck = { +	.name		= "mmc2_fck", +	.clkdm_name	= "l3s_clkdm", +	.parent		= &mmc_clk, +	.ops		= &clkops_null, +	.recalc		= &followparent_recalc, +}; + +static const struct clksel gfx_clksel_sel[] = { +	{ .parent = &dpll_core_m4_ck, .rates = div_1_0_rates }, +	{ .parent = &dpll_per_m2_ck, .rates = div_1_1_rates }, +	{ .parent = NULL }, +}; + +static struct clk gfx_fclk_clksel_ck = { +	.name		= "gfx_fclk_clksel_ck", +	.parent		= &dpll_core_m4_ck, +	.clksel		= gfx_clksel_sel, +	.ops		= &clkops_null, +	.clksel_reg	= AM33XX_CLKSEL_GFX_FCLK, +	.clksel_mask	= AM33XX_CLKSEL_GFX_FCLK_MASK, +	.recalc		= &omap2_clksel_recalc, +}; + +static const struct clksel_rate div_1_0_2_1_rates[] = { +	{ .div = 1, .val = 0, .flags = RATE_IN_AM33XX }, +	{ .div = 2, .val = 1, .flags = RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +static const struct clksel gfx_div_sel[] = { +	{ .parent = &gfx_fclk_clksel_ck, .rates = div_1_0_2_1_rates }, +	{ .parent = NULL }, +}; + +static struct clk gfx_fck_div_ck = { +	.name		= "gfx_fck_div_ck", +	.clkdm_name	= "gfx_l3_clkdm", +	.parent		= &gfx_fclk_clksel_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= gfx_div_sel, +	.clksel_reg	= AM33XX_CLKSEL_GFX_FCLK, +	.clksel_mask	= AM33XX_CLKSEL_0_0_MASK, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +	.ops		= &clkops_null, +}; + +static const struct clksel sysclkout_pre_sel[] = { +	{ .parent = &clk_32768_ck, .rates = div_1_0_rates }, +	{ .parent = &l3_gclk, .rates = div_1_1_rates }, +	{ .parent = &dpll_ddr_m2_ck, .rates = div_1_2_rates }, +	{ .parent = &dpll_per_m2_ck, .rates = div_1_3_rates }, +	{ .parent = &lcd_gclk, .rates = div_1_4_rates }, +	{ .parent = NULL }, +}; + +static struct clk sysclkout_pre_ck = { +	.name		= "sysclkout_pre_ck", +	.parent		= &clk_32768_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= sysclkout_pre_sel, +	.clksel_reg	= AM33XX_CM_CLKOUT_CTRL, +	.clksel_mask	= AM33XX_CLKOUT2SOURCE_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +/* Divide by 8 clock rates with default clock is 1/1*/ +static const struct clksel_rate div8_rates[] = { +	{ .div = 1, .val = 0, .flags = RATE_IN_AM33XX }, +	{ .div = 2, .val = 1, .flags = RATE_IN_AM33XX }, +	{ .div = 3, .val = 2, .flags = RATE_IN_AM33XX }, +	{ .div = 4, .val = 3, .flags = RATE_IN_AM33XX }, +	{ .div = 5, .val = 4, .flags = RATE_IN_AM33XX }, +	{ .div = 6, .val = 5, .flags = RATE_IN_AM33XX }, +	{ .div = 7, .val = 6, .flags = RATE_IN_AM33XX }, +	{ .div = 8, .val = 7, .flags = RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +static const struct clksel clkout2_div[] = { +	{ .parent = &sysclkout_pre_ck, .rates = div8_rates }, +	{ .parent = NULL }, +}; + +static struct clk clkout2_ck = { +	.name		= "clkout2_ck", +	.parent		= &sysclkout_pre_ck, +	.ops		= &clkops_omap2_dflt, +	.clksel		= clkout2_div, +	.clksel_reg	= AM33XX_CM_CLKOUT_CTRL, +	.clksel_mask	= AM33XX_CLKOUT2DIV_MASK, +	.enable_reg	= AM33XX_CM_CLKOUT_CTRL, +	.enable_bit	= AM33XX_CLKOUT2EN_SHIFT, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static const struct clksel wdt_clkmux_sel[] = { +	{ .parent = &clk_rc32k_ck, .rates = div_1_0_rates }, +	{ .parent = &clkdiv32k_ick, .rates = div_1_1_rates }, +	{ .parent = NULL }, +}; + +static struct clk wdt1_fck = { +	.name		= "wdt1_fck", +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &clk_rc32k_ck, +	.init		= &omap2_init_clksel_parent, +	.clksel		= wdt_clkmux_sel, +	.clksel_reg	= AM33XX_CLKSEL_WDT1_CLK, +	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +}; + +/* + * clkdev + */ +static struct omap_clk am33xx_clks[] = { +	CLK(NULL,	"clk_32768_ck",		&clk_32768_ck,	CK_AM33XX), +	CLK(NULL,	"clk_rc32k_ck",		&clk_rc32k_ck,	CK_AM33XX), +	CLK(NULL,	"virt_19200000_ck",	&virt_19200000_ck,	CK_AM33XX), +	CLK(NULL,	"virt_24000000_ck",	&virt_24000000_ck,	CK_AM33XX), +	CLK(NULL,	"virt_25000000_ck",	&virt_25000000_ck,	CK_AM33XX), +	CLK(NULL,	"virt_26000000_ck",	&virt_26000000_ck,	CK_AM33XX), +	CLK(NULL,	"sys_clkin_ck",		&sys_clkin_ck,	CK_AM33XX), +	CLK(NULL,	"tclkin_ck",		&tclkin_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_core_ck",		&dpll_core_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_core_x2_ck",	&dpll_core_x2_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_core_m4_ck",	&dpll_core_m4_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_core_m5_ck",	&dpll_core_m5_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_core_m6_ck",	&dpll_core_m6_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_mpu_ck",		&dpll_mpu_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_mpu_m2_ck",	&dpll_mpu_m2_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_ddr_ck",		&dpll_ddr_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_ddr_m2_ck",	&dpll_ddr_m2_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_ddr_m2_div2_ck",	&dpll_ddr_m2_div2_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_disp_ck",		&dpll_disp_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_disp_m2_ck",	&dpll_disp_m2_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_per_ck",		&dpll_per_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_per_m2_ck",	&dpll_per_m2_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_per_m2_div4_wkupdm_ck",	&dpll_per_m2_div4_wkupdm_ck,	CK_AM33XX), +	CLK(NULL,	"dpll_per_m2_div4_ck",	&dpll_per_m2_div4_ck,	CK_AM33XX), +	CLK(NULL,	"adc_tsc_fck",		&adc_tsc_fck,	CK_AM33XX), +	CLK(NULL,	"cefuse_fck",		&cefuse_fck,	CK_AM33XX), +	CLK(NULL,	"clkdiv32k_ick",	&clkdiv32k_ick,	CK_AM33XX), +	CLK(NULL,	"dcan0_fck",		&dcan0_fck,	CK_AM33XX), +	CLK(NULL,	"dcan1_fck",		&dcan1_fck,	CK_AM33XX), +	CLK(NULL,	"debugss_ick",		&debugss_ick,	CK_AM33XX), +	CLK(NULL,	"pruss_ocp_gclk",	&pruss_ocp_gclk,	CK_AM33XX), +	CLK("davinci-mcasp.0",  NULL,           &mcasp0_fck,    CK_AM33XX), +	CLK("davinci-mcasp.1",  NULL,           &mcasp1_fck,    CK_AM33XX), +	CLK("NULL",	"mmc2_fck",		&mmc2_fck,	CK_AM33XX), +	CLK(NULL,	"mmu_fck",		&mmu_fck,	CK_AM33XX), +	CLK(NULL,	"smartreflex0_fck",	&smartreflex0_fck,	CK_AM33XX), +	CLK(NULL,	"smartreflex1_fck",	&smartreflex1_fck,	CK_AM33XX), +	CLK(NULL,	"gpt1_fck",		&timer1_fck,	CK_AM33XX), +	CLK(NULL,	"gpt2_fck",		&timer2_fck,	CK_AM33XX), +	CLK(NULL,	"gpt3_fck",		&timer3_fck,	CK_AM33XX), +	CLK(NULL,	"gpt4_fck",		&timer4_fck,	CK_AM33XX), +	CLK(NULL,	"gpt5_fck",		&timer5_fck,	CK_AM33XX), +	CLK(NULL,	"gpt6_fck",		&timer6_fck,	CK_AM33XX), +	CLK(NULL,	"gpt7_fck",		&timer7_fck,	CK_AM33XX), +	CLK(NULL,	"usbotg_fck",		&usbotg_fck,	CK_AM33XX), +	CLK(NULL,	"ieee5000_fck",		&ieee5000_fck,	CK_AM33XX), +	CLK(NULL,	"wdt1_fck",		&wdt1_fck,	CK_AM33XX), +	CLK(NULL,	"l4_rtc_gclk",		&l4_rtc_gclk,	CK_AM33XX), +	CLK(NULL,	"l3_gclk",		&l3_gclk,	CK_AM33XX), +	CLK(NULL,	"dpll_core_m4_div2_ck",	&dpll_core_m4_div2_ck,	CK_AM33XX), +	CLK(NULL,	"l4hs_gclk",		&l4hs_gclk,	CK_AM33XX), +	CLK(NULL,	"l3s_gclk",		&l3s_gclk,	CK_AM33XX), +	CLK(NULL,	"l4fw_gclk",		&l4fw_gclk,	CK_AM33XX), +	CLK(NULL,	"l4ls_gclk",		&l4ls_gclk,	CK_AM33XX), +	CLK(NULL,	"clk_24mhz",		&clk_24mhz,	CK_AM33XX), +	CLK(NULL,	"sysclk_div_ck",	&sysclk_div_ck,	CK_AM33XX), +	CLK(NULL,	"cpsw_125mhz_gclk",	&cpsw_125mhz_gclk,	CK_AM33XX), +	CLK(NULL,	"cpsw_cpts_rft_clk",	&cpsw_cpts_rft_clk,	CK_AM33XX), +	CLK(NULL,	"gpio0_dbclk_mux_ck",	&gpio0_dbclk_mux_ck,	CK_AM33XX), +	CLK(NULL,	"gpio0_dbclk",		&gpio0_dbclk,	CK_AM33XX), +	CLK(NULL,	"gpio1_dbclk",		&gpio1_dbclk,	CK_AM33XX), +	CLK(NULL,	"gpio2_dbclk",		&gpio2_dbclk,	CK_AM33XX), +	CLK(NULL,	"gpio3_dbclk",		&gpio3_dbclk,	CK_AM33XX), +	CLK(NULL,	"lcd_gclk",		&lcd_gclk,	CK_AM33XX), +	CLK(NULL,	"mmc_clk",		&mmc_clk,	CK_AM33XX), +	CLK(NULL,	"gfx_fclk_clksel_ck",	&gfx_fclk_clksel_ck,	CK_AM33XX), +	CLK(NULL,	"gfx_fck_div_ck",	&gfx_fck_div_ck,	CK_AM33XX), +	CLK(NULL,	"sysclkout_pre_ck",	&sysclkout_pre_ck,	CK_AM33XX), +	CLK(NULL,	"clkout2_ck",		&clkout2_ck,	CK_AM33XX), +}; + +int __init am33xx_clk_init(void) +{ +	struct omap_clk *c; +	u32 cpu_clkflg; + +	if (soc_is_am33xx()) { +		cpu_mask = RATE_IN_AM33XX; +		cpu_clkflg = CK_AM33XX; +	} + +	clk_init(&omap2_clk_functions); + +	for (c = am33xx_clks; c < am33xx_clks + ARRAY_SIZE(am33xx_clks); c++) +		clk_preinit(c->lk.clk); + +	for (c = am33xx_clks; c < am33xx_clks + ARRAY_SIZE(am33xx_clks); c++) { +		if (c->cpu & cpu_clkflg) { +			clkdev_add(&c->lk); +			clk_register(c->lk.clk); +			omap2_init_clk_clkdm(c->lk.clk); +		} +	} + +	recalculate_root_clocks(); + +	/* +	 * Only enable those clocks we will need, let the drivers +	 * enable other clocks as necessary +	 */ +	clk_enable_init_clocks(); + +	return 0; +} diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 1efdec236ae..83bed9ad301 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c @@ -93,18 +93,6 @@ static struct clk virt_16_8m_ck = {  	.rate		= 16800000,  }; -static struct clk virt_19_2m_ck = { -	.name		= "virt_19_2m_ck", -	.ops		= &clkops_null, -	.rate		= 19200000, -}; - -static struct clk virt_26m_ck = { -	.name		= "virt_26m_ck", -	.ops		= &clkops_null, -	.rate		= 26000000, -}; -  static struct clk virt_38_4m_ck = {  	.name		= "virt_38_4m_ck",  	.ops		= &clkops_null, @@ -145,8 +133,8 @@ static const struct clksel osc_sys_clksel[] = {  	{ .parent = &virt_12m_ck,   .rates = osc_sys_12m_rates },  	{ .parent = &virt_13m_ck,   .rates = osc_sys_13m_rates },  	{ .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates }, -	{ .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates }, -	{ .parent = &virt_26m_ck,   .rates = osc_sys_26m_rates }, +	{ .parent = &virt_19200000_ck, .rates = osc_sys_19_2m_rates }, +	{ .parent = &virt_26000000_ck,   .rates = osc_sys_26m_rates },  	{ .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates },  	{ .parent = NULL },  }; @@ -2490,13 +2478,13 @@ static struct clk uart4_fck = {  };  static struct clk uart4_fck_am35xx = { -	.name           = "uart4_fck", -	.ops            = &clkops_omap2_dflt_wait, -	.parent         = &per_48m_fck, -	.enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), -	.enable_bit     = OMAP3430_EN_UART4_SHIFT, -	.clkdm_name     = "core_l4_clkdm", -	.recalc         = &followparent_recalc, +	.name		= "uart4_fck", +	.ops		= &clkops_omap2_dflt_wait, +	.parent		= &core_48m_fck, +	.enable_reg	= OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), +	.enable_bit	= AM35XX_EN_UART4_SHIFT, +	.clkdm_name	= "core_l4_clkdm", +	.recalc		= &followparent_recalc,  };  static struct clk gpt2_fck = { @@ -3201,8 +3189,12 @@ static struct clk vpfe_fck = {  };  /* - * The UART1/2 functional clock acts as the functional - * clock for UART4. No separate fclk control available. + * The UART1/2 functional clock acts as the functional clock for + * UART4. No separate fclk control available.  XXX Well now we have a + * uart4_fck that is apparently used as the UART4 functional clock, + * but it also seems that uart1_fck or uart2_fck are still needed, at + * least for UART4 softresets to complete.  This really needs + * clarification.   */  static struct clk uart4_ick_am35xx = {  	.name		= "uart4_ick", @@ -3230,17 +3222,12 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"virt_12m_ck",	&virt_12m_ck,	CK_3XXX),  	CLK(NULL,	"virt_13m_ck",	&virt_13m_ck,	CK_3XXX),  	CLK(NULL,	"virt_16_8m_ck", &virt_16_8m_ck, CK_3430ES2PLUS | CK_AM35XX  | CK_36XX), -	CLK(NULL,	"virt_19_2m_ck", &virt_19_2m_ck, CK_3XXX), -	CLK(NULL,	"virt_26m_ck",	&virt_26m_ck,	CK_3XXX), +	CLK(NULL,	"virt_19200000_ck", &virt_19200000_ck, CK_3XXX), +	CLK(NULL,	"virt_26000000_ck",	&virt_26000000_ck,	CK_3XXX),  	CLK(NULL,	"virt_38_4m_ck", &virt_38_4m_ck, CK_3XXX),  	CLK(NULL,	"osc_sys_ck",	&osc_sys_ck,	CK_3XXX),  	CLK(NULL,	"sys_ck",	&sys_ck,	CK_3XXX),  	CLK(NULL,	"sys_altclk",	&sys_altclk,	CK_3XXX), -	CLK("omap-mcbsp.1",	"pad_fck",	&mcbsp_clks,	CK_3XXX), -	CLK("omap-mcbsp.2",	"pad_fck",	&mcbsp_clks,	CK_3XXX), -	CLK("omap-mcbsp.3",	"pad_fck",	&mcbsp_clks,	CK_3XXX), -	CLK("omap-mcbsp.4",	"pad_fck",	&mcbsp_clks,	CK_3XXX), -	CLK("omap-mcbsp.5",	"pad_fck",	&mcbsp_clks,	CK_3XXX),  	CLK(NULL,	"mcbsp_clks",	&mcbsp_clks,	CK_3XXX),  	CLK(NULL,	"sys_clkout1",	&sys_clkout1,	CK_3XXX),  	CLK(NULL,	"dpll1_ck",	&dpll1_ck,	CK_3XXX), @@ -3307,8 +3294,6 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"ts_fck",	&ts_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),  	CLK(NULL,	"usbtll_fck",	&usbtll_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),  	CLK("usbhs_omap",	"usbtll_fck",	&usbtll_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX), -	CLK("omap-mcbsp.1",	"prcm_fck",	&core_96m_fck,	CK_3XXX), -	CLK("omap-mcbsp.5",	"prcm_fck",	&core_96m_fck,	CK_3XXX),  	CLK(NULL,	"core_96m_fck",	&core_96m_fck,	CK_3XXX),  	CLK(NULL,	"mmchs3_fck",	&mmchs3_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),  	CLK(NULL,	"mmchs2_fck",	&mmchs2_fck,	CK_3XXX), @@ -3391,15 +3376,15 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"usbhost_48m_fck", &usbhost_48m_fck, CK_3430ES2PLUS | CK_AM35XX | CK_36XX),  	CLK(NULL,	"usbhost_ick",	&usbhost_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),  	CLK("usbhs_omap",	"usbhost_ick",	&usbhost_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX), -	CLK("usbhs_omap",	"utmi_p1_gfclk",	&dummy_ck,	CK_3XXX), -	CLK("usbhs_omap",	"utmi_p2_gfclk",	&dummy_ck,	CK_3XXX), -	CLK("usbhs_omap",	"xclk60mhsp1_ck",	&dummy_ck,	CK_3XXX), -	CLK("usbhs_omap",	"xclk60mhsp2_ck",	&dummy_ck,	CK_3XXX), -	CLK("usbhs_omap",	"usb_host_hs_utmi_p1_clk",	&dummy_ck,	CK_3XXX), -	CLK("usbhs_omap",	"usb_host_hs_utmi_p2_clk",	&dummy_ck,	CK_3XXX), +	CLK(NULL,	"utmi_p1_gfclk",	&dummy_ck,	CK_3XXX), +	CLK(NULL,	"utmi_p2_gfclk",	&dummy_ck,	CK_3XXX), +	CLK(NULL,	"xclk60mhsp1_ck",	&dummy_ck,	CK_3XXX), +	CLK(NULL,	"xclk60mhsp2_ck",	&dummy_ck,	CK_3XXX), +	CLK(NULL,	"usb_host_hs_utmi_p1_clk",	&dummy_ck,	CK_3XXX), +	CLK(NULL,	"usb_host_hs_utmi_p2_clk",	&dummy_ck,	CK_3XXX),  	CLK("usbhs_omap",	"usb_tll_hs_usb_ch0_clk",	&dummy_ck,	CK_3XXX),  	CLK("usbhs_omap",	"usb_tll_hs_usb_ch1_clk",	&dummy_ck,	CK_3XXX), -	CLK("usbhs_omap",	"init_60m_fclk",	&dummy_ck,	CK_3XXX), +	CLK(NULL,	"init_60m_fclk",	&dummy_ck,	CK_3XXX),  	CLK(NULL,	"usim_fck",	&usim_fck,	CK_3430ES2PLUS | CK_36XX),  	CLK(NULL,	"gpt1_fck",	&gpt1_fck,	CK_3XXX),  	CLK(NULL,	"wkup_32k_fck",	&wkup_32k_fck,	CK_3XXX), @@ -3413,9 +3398,6 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"omap_32ksync_ick", &omap_32ksync_ick, CK_3XXX),  	CLK(NULL,	"gpt12_ick",	&gpt12_ick,	CK_3XXX),  	CLK(NULL,	"gpt1_ick",	&gpt1_ick,	CK_3XXX), -	CLK("omap-mcbsp.2",	"prcm_fck",	&per_96m_fck,	CK_3XXX), -	CLK("omap-mcbsp.3",	"prcm_fck",	&per_96m_fck,	CK_3XXX), -	CLK("omap-mcbsp.4",	"prcm_fck",	&per_96m_fck,	CK_3XXX),  	CLK(NULL,	"per_96m_fck",	&per_96m_fck,	CK_3XXX),  	CLK(NULL,	"per_48m_fck",	&per_48m_fck,	CK_3XXX),  	CLK(NULL,	"uart3_fck",	&uart3_fck,	CK_3XXX), @@ -3474,38 +3456,16 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"ipss_ick",	&ipss_ick,	CK_AM35XX),  	CLK(NULL,	"rmii_ck",	&rmii_ck,	CK_AM35XX),  	CLK(NULL,	"pclk_ck",	&pclk_ck,	CK_AM35XX), -	CLK("davinci_emac",	NULL,	&emac_ick,	CK_AM35XX), +	CLK("davinci_emac.0",	NULL,	&emac_ick,	CK_AM35XX),  	CLK("davinci_mdio.0",	NULL,	&emac_fck,	CK_AM35XX),  	CLK("vpfe-capture",	"master",	&vpfe_ick,	CK_AM35XX),  	CLK("vpfe-capture",	"slave",	&vpfe_fck,	CK_AM35XX), -	CLK("musb-am35x",	"ick",		&hsotgusb_ick_am35xx,	CK_AM35XX), -	CLK("musb-am35x",	"fck",		&hsotgusb_fck_am35xx,	CK_AM35XX), +	CLK(NULL,	"hsotgusb_ick",		&hsotgusb_ick_am35xx,	CK_AM35XX), +	CLK(NULL,	"hsotgusb_fck",		&hsotgusb_fck_am35xx,	CK_AM35XX),  	CLK(NULL,	"hecc_ck",	&hecc_ck,	CK_AM35XX),  	CLK(NULL,	"uart4_ick",	&uart4_ick_am35xx,	CK_AM35XX), -	CLK("omap_timer.1",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.2",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.3",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.4",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.5",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.6",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.7",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.8",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.9",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.10",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.11",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.12",	"32k_ck",	&omap_32k_fck,  CK_3XXX), -	CLK("omap_timer.1",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.2",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.3",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.4",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.5",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.6",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.7",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.8",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.9",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.10",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.11",	"sys_ck",	&sys_ck,	CK_3XXX), -	CLK("omap_timer.12",	"sys_ck",	&sys_ck,	CK_3XXX), +	CLK(NULL,	"timer_32k_ck",	&omap_32k_fck,  CK_3XXX), +	CLK(NULL,	"timer_sys_ck",	&sys_ck,	CK_3XXX),  }; @@ -3523,7 +3483,7 @@ int __init omap3xxx_clk_init(void)  	} else if (cpu_is_ti816x()) {  		cpu_mask = RATE_IN_TI816X;  		cpu_clkflg = CK_TI816X; -	} else if (cpu_is_am33xx()) { +	} else if (soc_is_am33xx()) {  		cpu_mask = RATE_IN_AM33XX;  	} else if (cpu_is_ti814x()) {  		cpu_mask = RATE_IN_TI814X; diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index ba6f9a0a43e..d7f55e43b76 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c @@ -107,18 +107,6 @@ static struct clk virt_16800000_ck = {  	.rate		= 16800000,  }; -static struct clk virt_19200000_ck = { -	.name		= "virt_19200000_ck", -	.ops		= &clkops_null, -	.rate		= 19200000, -}; - -static struct clk virt_26000000_ck = { -	.name		= "virt_26000000_ck", -	.ops		= &clkops_null, -	.rate		= 26000000, -}; -  static struct clk virt_27000000_ck = {  	.name		= "virt_27000000_ck",  	.ops		= &clkops_null, @@ -131,31 +119,6 @@ static struct clk virt_38400000_ck = {  	.rate		= 38400000,  }; -static const struct clksel_rate div_1_0_rates[] = { -	{ .div = 1, .val = 0, .flags = RATE_IN_4430 }, -	{ .div = 0 }, -}; - -static const struct clksel_rate div_1_1_rates[] = { -	{ .div = 1, .val = 1, .flags = RATE_IN_4430 }, -	{ .div = 0 }, -}; - -static const struct clksel_rate div_1_2_rates[] = { -	{ .div = 1, .val = 2, .flags = RATE_IN_4430 }, -	{ .div = 0 }, -}; - -static const struct clksel_rate div_1_3_rates[] = { -	{ .div = 1, .val = 3, .flags = RATE_IN_4430 }, -	{ .div = 0 }, -}; - -static const struct clksel_rate div_1_4_rates[] = { -	{ .div = 1, .val = 4, .flags = RATE_IN_4430 }, -	{ .div = 0 }, -}; -  static const struct clksel_rate div_1_5_rates[] = {  	{ .div = 1, .val = 5, .flags = RATE_IN_4430 },  	{ .div = 0 }, @@ -289,41 +252,6 @@ static struct clk dpll_abe_x2_ck = {  	.recalc		= &omap3_clkoutx2_recalc,  }; -static const struct clksel_rate div31_1to31_rates[] = { -	{ .div = 1, .val = 1, .flags = RATE_IN_4430 }, -	{ .div = 2, .val = 2, .flags = RATE_IN_4430 }, -	{ .div = 3, .val = 3, .flags = RATE_IN_4430 }, -	{ .div = 4, .val = 4, .flags = RATE_IN_4430 }, -	{ .div = 5, .val = 5, .flags = RATE_IN_4430 }, -	{ .div = 6, .val = 6, .flags = RATE_IN_4430 }, -	{ .div = 7, .val = 7, .flags = RATE_IN_4430 }, -	{ .div = 8, .val = 8, .flags = RATE_IN_4430 }, -	{ .div = 9, .val = 9, .flags = RATE_IN_4430 }, -	{ .div = 10, .val = 10, .flags = RATE_IN_4430 }, -	{ .div = 11, .val = 11, .flags = RATE_IN_4430 }, -	{ .div = 12, .val = 12, .flags = RATE_IN_4430 }, -	{ .div = 13, .val = 13, .flags = RATE_IN_4430 }, -	{ .div = 14, .val = 14, .flags = RATE_IN_4430 }, -	{ .div = 15, .val = 15, .flags = RATE_IN_4430 }, -	{ .div = 16, .val = 16, .flags = RATE_IN_4430 }, -	{ .div = 17, .val = 17, .flags = RATE_IN_4430 }, -	{ .div = 18, .val = 18, .flags = RATE_IN_4430 }, -	{ .div = 19, .val = 19, .flags = RATE_IN_4430 }, -	{ .div = 20, .val = 20, .flags = RATE_IN_4430 }, -	{ .div = 21, .val = 21, .flags = RATE_IN_4430 }, -	{ .div = 22, .val = 22, .flags = RATE_IN_4430 }, -	{ .div = 23, .val = 23, .flags = RATE_IN_4430 }, -	{ .div = 24, .val = 24, .flags = RATE_IN_4430 }, -	{ .div = 25, .val = 25, .flags = RATE_IN_4430 }, -	{ .div = 26, .val = 26, .flags = RATE_IN_4430 }, -	{ .div = 27, .val = 27, .flags = RATE_IN_4430 }, -	{ .div = 28, .val = 28, .flags = RATE_IN_4430 }, -	{ .div = 29, .val = 29, .flags = RATE_IN_4430 }, -	{ .div = 30, .val = 30, .flags = RATE_IN_4430 }, -	{ .div = 31, .val = 31, .flags = RATE_IN_4430 }, -	{ .div = 0 }, -}; -  static const struct clksel dpll_abe_m2x2_div[] = {  	{ .parent = &dpll_abe_x2_ck, .rates = div31_1to31_rates },  	{ .parent = NULL }, @@ -3299,17 +3227,17 @@ static struct omap_clk omap44xx_clks[] = {  	CLK(NULL,	"smartreflex_core_fck",		&smartreflex_core_fck,	CK_443X),  	CLK(NULL,	"smartreflex_iva_fck",		&smartreflex_iva_fck,	CK_443X),  	CLK(NULL,	"smartreflex_mpu_fck",		&smartreflex_mpu_fck,	CK_443X), -	CLK(NULL,	"gpt1_fck",			&timer1_fck,	CK_443X), -	CLK(NULL,	"gpt10_fck",			&timer10_fck,	CK_443X), -	CLK(NULL,	"gpt11_fck",			&timer11_fck,	CK_443X), -	CLK(NULL,	"gpt2_fck",			&timer2_fck,	CK_443X), -	CLK(NULL,	"gpt3_fck",			&timer3_fck,	CK_443X), -	CLK(NULL,	"gpt4_fck",			&timer4_fck,	CK_443X), -	CLK(NULL,	"gpt5_fck",			&timer5_fck,	CK_443X), -	CLK(NULL,	"gpt6_fck",			&timer6_fck,	CK_443X), -	CLK(NULL,	"gpt7_fck",			&timer7_fck,	CK_443X), -	CLK(NULL,	"gpt8_fck",			&timer8_fck,	CK_443X), -	CLK(NULL,	"gpt9_fck",			&timer9_fck,	CK_443X), +	CLK(NULL,	"timer1_fck",			&timer1_fck,	CK_443X), +	CLK(NULL,	"timer10_fck",			&timer10_fck,	CK_443X), +	CLK(NULL,	"timer11_fck",			&timer11_fck,	CK_443X), +	CLK(NULL,	"timer2_fck",			&timer2_fck,	CK_443X), +	CLK(NULL,	"timer3_fck",			&timer3_fck,	CK_443X), +	CLK(NULL,	"timer4_fck",			&timer4_fck,	CK_443X), +	CLK(NULL,	"timer5_fck",			&timer5_fck,	CK_443X), +	CLK(NULL,	"timer6_fck",			&timer6_fck,	CK_443X), +	CLK(NULL,	"timer7_fck",			&timer7_fck,	CK_443X), +	CLK(NULL,	"timer8_fck",			&timer8_fck,	CK_443X), +	CLK(NULL,	"timer9_fck",			&timer9_fck,	CK_443X),  	CLK(NULL,	"uart1_fck",			&uart1_fck,	CK_443X),  	CLK(NULL,	"uart2_fck",			&uart2_fck,	CK_443X),  	CLK(NULL,	"uart3_fck",			&uart3_fck,	CK_443X), @@ -3385,28 +3313,18 @@ static struct omap_clk omap44xx_clks[] = {  	CLK("usbhs_omap",	"usbhost_ick",		&dummy_ck,		CK_443X),  	CLK("usbhs_omap",	"usbtll_fck",		&dummy_ck,	CK_443X),  	CLK("omap_wdt",	"ick",				&dummy_ck,	CK_443X), -	CLK("omap_timer.1",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.2",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.3",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.4",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.5",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.6",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.7",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.8",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.9",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.10",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.11",	"32k_ck",	&sys_32k_ck,	CK_443X), -	CLK("omap_timer.1",	"sys_ck",	&sys_clkin_ck,	CK_443X), -	CLK("omap_timer.2",	"sys_ck",	&sys_clkin_ck,	CK_443X), -	CLK("omap_timer.3",	"sys_ck",	&sys_clkin_ck,	CK_443X), -	CLK("omap_timer.4",	"sys_ck",	&sys_clkin_ck,	CK_443X), -	CLK("omap_timer.9",	"sys_ck",	&sys_clkin_ck,	CK_443X), -	CLK("omap_timer.10",	"sys_ck",	&sys_clkin_ck,	CK_443X), -	CLK("omap_timer.11",	"sys_ck",	&sys_clkin_ck,	CK_443X), -	CLK("omap_timer.5",	"sys_ck",	&syc_clk_div_ck,	CK_443X), -	CLK("omap_timer.6",	"sys_ck",	&syc_clk_div_ck,	CK_443X), -	CLK("omap_timer.7",	"sys_ck",	&syc_clk_div_ck,	CK_443X), -	CLK("omap_timer.8",	"sys_ck",	&syc_clk_div_ck,	CK_443X), +	CLK(NULL,	"timer_32k_ck",	&sys_32k_ck,	CK_443X), +	CLK("omap_timer.1",	"timer_sys_ck",	&sys_clkin_ck,	CK_443X), +	CLK("omap_timer.2",	"timer_sys_ck",	&sys_clkin_ck,	CK_443X), +	CLK("omap_timer.3",	"timer_sys_ck",	&sys_clkin_ck,	CK_443X), +	CLK("omap_timer.4",	"timer_sys_ck",	&sys_clkin_ck,	CK_443X), +	CLK("omap_timer.9",	"timer_sys_ck",	&sys_clkin_ck,	CK_443X), +	CLK("omap_timer.10",	"timer_sys_ck",	&sys_clkin_ck,	CK_443X), +	CLK("omap_timer.11",	"timer_sys_ck",	&sys_clkin_ck,	CK_443X), +	CLK("omap_timer.5",	"timer_sys_ck",	&syc_clk_div_ck,	CK_443X), +	CLK("omap_timer.6",	"timer_sys_ck",	&syc_clk_div_ck,	CK_443X), +	CLK("omap_timer.7",	"timer_sys_ck",	&syc_clk_div_ck,	CK_443X), +	CLK("omap_timer.8",	"timer_sys_ck",	&syc_clk_div_ck,	CK_443X),  };  int __init omap4xxx_clk_init(void) diff --git a/arch/arm/mach-omap2/clock_common_data.c b/arch/arm/mach-omap2/clock_common_data.c index 6424d46be14..b9f3ba68148 100644 --- a/arch/arm/mach-omap2/clock_common_data.c +++ b/arch/arm/mach-omap2/clock_common_data.c @@ -43,3 +43,80 @@ const struct clksel_rate dsp_ick_rates[] = {  	{ .div = 3, .val = 3, .flags = RATE_IN_243X },  	{ .div = 0 },  }; + + +/* clksel_rate blocks shared between OMAP44xx and AM33xx */ + +const struct clksel_rate div_1_0_rates[] = { +	{ .div = 1, .val = 0, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +const struct clksel_rate div_1_1_rates[] = { +	{ .div = 1, .val = 1, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +const struct clksel_rate div_1_2_rates[] = { +	{ .div = 1, .val = 2, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +const struct clksel_rate div_1_3_rates[] = { +	{ .div = 1, .val = 3, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +const struct clksel_rate div_1_4_rates[] = { +	{ .div = 1, .val = 4, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +const struct clksel_rate div31_1to31_rates[] = { +	{ .div = 1, .val = 1, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 2, .val = 2, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 3, .val = 3, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 4, .val = 4, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 5, .val = 5, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 6, .val = 6, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 7, .val = 7, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 8, .val = 8, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 9, .val = 9, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 10, .val = 10, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 11, .val = 11, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 12, .val = 12, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 13, .val = 13, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 14, .val = 14, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 15, .val = 15, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 16, .val = 16, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 17, .val = 17, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 18, .val = 18, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 19, .val = 19, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 20, .val = 20, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 21, .val = 21, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 22, .val = 22, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 23, .val = 23, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 24, .val = 24, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 25, .val = 25, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 26, .val = 26, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 27, .val = 27, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 28, .val = 28, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 29, .val = 29, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 30, .val = 30, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 31, .val = 31, .flags = RATE_IN_4430 | RATE_IN_AM33XX }, +	{ .div = 0 }, +}; + +/* Clocks shared between various OMAP SoCs */ + +struct clk virt_19200000_ck = { +	.name		= "virt_19200000_ck", +	.ops		= &clkops_null, +	.rate		= 19200000, +}; + +struct clk virt_26000000_ck = { +	.name		= "virt_26000000_ck", +	.ops		= &clkops_null, +	.rate		= 26000000, +}; diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index 6227e9505c2..5601dc13785 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h @@ -199,6 +199,7 @@ int clkdm_hwmod_disable(struct clockdomain *clkdm, struct omap_hwmod *oh);  extern void __init omap242x_clockdomains_init(void);  extern void __init omap243x_clockdomains_init(void);  extern void __init omap3xxx_clockdomains_init(void); +extern void __init am33xx_clockdomains_init(void);  extern void __init omap44xx_clockdomains_init(void);  extern void _clkdm_add_autodeps(struct clockdomain *clkdm);  extern void _clkdm_del_autodeps(struct clockdomain *clkdm); @@ -206,11 +207,10 @@ extern void _clkdm_del_autodeps(struct clockdomain *clkdm);  extern struct clkdm_ops omap2_clkdm_operations;  extern struct clkdm_ops omap3_clkdm_operations;  extern struct clkdm_ops omap4_clkdm_operations; +extern struct clkdm_ops am33xx_clkdm_operations;  extern struct clkdm_dep gfx_24xx_wkdeps[];  extern struct clkdm_dep dsp_24xx_wkdeps[];  extern struct clockdomain wkup_common_clkdm; -extern struct clockdomain prm_common_clkdm; -extern struct clockdomain cm_common_clkdm;  #endif diff --git a/arch/arm/mach-omap2/clockdomain33xx.c b/arch/arm/mach-omap2/clockdomain33xx.c new file mode 100644 index 00000000000..aca6388fad7 --- /dev/null +++ b/arch/arm/mach-omap2/clockdomain33xx.c @@ -0,0 +1,74 @@ +/* + * AM33XX clockdomain control + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * Vaibhav Hiremath <hvaibhav@ti.com> + * + * Derived from mach-omap2/clockdomain44xx.c written by Rajendra Nayak + * + * 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 version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> + +#include "clockdomain.h" +#include "cm33xx.h" + + +static int am33xx_clkdm_sleep(struct clockdomain *clkdm) +{ +	am33xx_cm_clkdm_force_sleep(clkdm->cm_inst, clkdm->clkdm_offs); +	return 0; +} + +static int am33xx_clkdm_wakeup(struct clockdomain *clkdm) +{ +	am33xx_cm_clkdm_force_wakeup(clkdm->cm_inst, clkdm->clkdm_offs); +	return 0; +} + +static void am33xx_clkdm_allow_idle(struct clockdomain *clkdm) +{ +	am33xx_cm_clkdm_enable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); +} + +static void am33xx_clkdm_deny_idle(struct clockdomain *clkdm) +{ +	am33xx_cm_clkdm_disable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); +} + +static int am33xx_clkdm_clk_enable(struct clockdomain *clkdm) +{ +	if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) +		return am33xx_clkdm_wakeup(clkdm); + +	return 0; +} + +static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm) +{ +	bool hwsup = false; + +	hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); + +	if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) +		am33xx_clkdm_sleep(clkdm); + +	return 0; +} + +struct clkdm_ops am33xx_clkdm_operations = { +	.clkdm_sleep		= am33xx_clkdm_sleep, +	.clkdm_wakeup		= am33xx_clkdm_wakeup, +	.clkdm_allow_idle	= am33xx_clkdm_allow_idle, +	.clkdm_deny_idle	= am33xx_clkdm_deny_idle, +	.clkdm_clk_enable	= am33xx_clkdm_clk_enable, +	.clkdm_clk_disable	= am33xx_clkdm_clk_disable, +}; diff --git a/arch/arm/mach-omap2/clockdomain44xx.c b/arch/arm/mach-omap2/clockdomain44xx.c index 4f04dd11d65..762f2cc542c 100644 --- a/arch/arm/mach-omap2/clockdomain44xx.c +++ b/arch/arm/mach-omap2/clockdomain44xx.c @@ -70,7 +70,7 @@ static int omap4_clkdm_clear_all_wkup_sleep_deps(struct clockdomain *clkdm)  static int omap4_clkdm_sleep(struct clockdomain *clkdm)  { -	omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, +	omap4_cminst_clkdm_enable_hwsup(clkdm->prcm_partition,  					clkdm->cm_inst, clkdm->clkdm_offs);  	return 0;  } @@ -90,8 +90,12 @@ static void omap4_clkdm_allow_idle(struct clockdomain *clkdm)  static void omap4_clkdm_deny_idle(struct clockdomain *clkdm)  { -	omap4_cminst_clkdm_disable_hwsup(clkdm->prcm_partition, -					clkdm->cm_inst, clkdm->clkdm_offs); +	if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) +		omap4_clkdm_wakeup(clkdm); +	else +		omap4_cminst_clkdm_disable_hwsup(clkdm->prcm_partition, +						 clkdm->cm_inst, +						 clkdm->clkdm_offs);  }  static int omap4_clkdm_clk_enable(struct clockdomain *clkdm) diff --git a/arch/arm/mach-omap2/clockdomains2420_data.c b/arch/arm/mach-omap2/clockdomains2420_data.c index 0ab8e46d5b2..5c741852fac 100644 --- a/arch/arm/mach-omap2/clockdomains2420_data.c +++ b/arch/arm/mach-omap2/clockdomains2420_data.c @@ -131,8 +131,6 @@ static struct clockdomain dss_2420_clkdm = {  static struct clockdomain *clockdomains_omap242x[] __initdata = {  	&wkup_common_clkdm, -	&cm_common_clkdm, -	&prm_common_clkdm,  	&mpu_2420_clkdm,  	&iva1_2420_clkdm,  	&dsp_2420_clkdm, diff --git a/arch/arm/mach-omap2/clockdomains2430_data.c b/arch/arm/mach-omap2/clockdomains2430_data.c index 3645ed04489..f09617555e1 100644 --- a/arch/arm/mach-omap2/clockdomains2430_data.c +++ b/arch/arm/mach-omap2/clockdomains2430_data.c @@ -157,8 +157,6 @@ static struct clockdomain dss_2430_clkdm = {  static struct clockdomain *clockdomains_omap243x[] __initdata = {  	&wkup_common_clkdm, -	&cm_common_clkdm, -	&prm_common_clkdm,  	&mpu_2430_clkdm,  	&mdm_clkdm,  	&dsp_2430_clkdm, diff --git a/arch/arm/mach-omap2/clockdomains33xx_data.c b/arch/arm/mach-omap2/clockdomains33xx_data.c new file mode 100644 index 00000000000..32c90fd9eba --- /dev/null +++ b/arch/arm/mach-omap2/clockdomains33xx_data.c @@ -0,0 +1,196 @@ +/* + * AM33XX Clock Domain data. + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * Vaibhav Hiremath <hvaibhav@ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> +#include <linux/io.h> + +#include "clockdomain.h" +#include "cm.h" +#include "cm33xx.h" +#include "cm-regbits-33xx.h" + +static struct clockdomain l4ls_am33xx_clkdm = { +	.name		= "l4ls_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_L4LS_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l3s_am33xx_clkdm = { +	.name		= "l3s_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_L3S_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l4fw_am33xx_clkdm = { +	.name		= "l4fw_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_L4FW_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l3_am33xx_clkdm = { +	.name		= "l3_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_L3_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l4hs_am33xx_clkdm = { +	.name		= "l4hs_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_L4HS_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain ocpwp_l3_am33xx_clkdm = { +	.name		= "ocpwp_l3_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_OCPWP_L3_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain pruss_ocp_am33xx_clkdm = { +	.name		= "pruss_ocp_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_PRUSS_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain cpsw_125mhz_am33xx_clkdm = { +	.name		= "cpsw_125mhz_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_CPSW_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain lcdc_am33xx_clkdm = { +	.name		= "lcdc_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_LCDC_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain clk_24mhz_am33xx_clkdm = { +	.name		= "clk_24mhz_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.cm_inst	= AM33XX_CM_PER_MOD, +	.clkdm_offs	= AM33XX_CM_PER_CLK_24MHZ_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l4_wkup_am33xx_clkdm = { +	.name		= "l4_wkup_clkdm", +	.pwrdm		= { .name = "wkup_pwrdm" }, +	.cm_inst	= AM33XX_CM_WKUP_MOD, +	.clkdm_offs	= AM33XX_CM_WKUP_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l3_aon_am33xx_clkdm = { +	.name		= "l3_aon_clkdm", +	.pwrdm		= { .name = "wkup_pwrdm" }, +	.cm_inst	= AM33XX_CM_WKUP_MOD, +	.clkdm_offs	= AM33XX_CM_L3_AON_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l4_wkup_aon_am33xx_clkdm = { +	.name		= "l4_wkup_aon_clkdm", +	.pwrdm		= { .name = "wkup_pwrdm" }, +	.cm_inst	= AM33XX_CM_WKUP_MOD, +	.clkdm_offs	= AM33XX_CM_L4_WKUP_AON_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain mpu_am33xx_clkdm = { +	.name		= "mpu_clkdm", +	.pwrdm		= { .name = "mpu_pwrdm" }, +	.cm_inst	= AM33XX_CM_MPU_MOD, +	.clkdm_offs	= AM33XX_CM_MPU_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l4_rtc_am33xx_clkdm = { +	.name		= "l4_rtc_clkdm", +	.pwrdm		= { .name = "rtc_pwrdm" }, +	.cm_inst	= AM33XX_CM_RTC_MOD, +	.clkdm_offs	= AM33XX_CM_RTC_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain gfx_l3_am33xx_clkdm = { +	.name		= "gfx_l3_clkdm", +	.pwrdm		= { .name = "gfx_pwrdm" }, +	.cm_inst	= AM33XX_CM_GFX_MOD, +	.clkdm_offs	= AM33XX_CM_GFX_L3_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain gfx_l4ls_gfx_am33xx_clkdm = { +	.name		= "gfx_l4ls_gfx_clkdm", +	.pwrdm		= { .name = "gfx_pwrdm" }, +	.cm_inst	= AM33XX_CM_GFX_MOD, +	.clkdm_offs	= AM33XX_CM_GFX_L4LS_GFX_CLKSTCTRL__1_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain l4_cefuse_am33xx_clkdm = { +	.name		= "l4_cefuse_clkdm", +	.pwrdm		= { .name = "cefuse_pwrdm" }, +	.cm_inst	= AM33XX_CM_CEFUSE_MOD, +	.clkdm_offs	= AM33XX_CM_CEFUSE_CLKSTCTRL_OFFSET, +	.flags		= CLKDM_CAN_SWSUP, +}; + +static struct clockdomain *clockdomains_am33xx[] __initdata = { +	&l4ls_am33xx_clkdm, +	&l3s_am33xx_clkdm, +	&l4fw_am33xx_clkdm, +	&l3_am33xx_clkdm, +	&l4hs_am33xx_clkdm, +	&ocpwp_l3_am33xx_clkdm, +	&pruss_ocp_am33xx_clkdm, +	&cpsw_125mhz_am33xx_clkdm, +	&lcdc_am33xx_clkdm, +	&clk_24mhz_am33xx_clkdm, +	&l4_wkup_am33xx_clkdm, +	&l3_aon_am33xx_clkdm, +	&l4_wkup_aon_am33xx_clkdm, +	&mpu_am33xx_clkdm, +	&l4_rtc_am33xx_clkdm, +	&gfx_l3_am33xx_clkdm, +	&gfx_l4ls_gfx_am33xx_clkdm, +	&l4_cefuse_am33xx_clkdm, +	NULL, +}; + +void __init am33xx_clockdomains_init(void) +{ +	clkdm_register_platform_funcs(&am33xx_clkdm_operations); +	clkdm_register_clkdms(clockdomains_am33xx); +	clkdm_complete_init(); +} diff --git a/arch/arm/mach-omap2/clockdomains3xxx_data.c b/arch/arm/mach-omap2/clockdomains3xxx_data.c index 6038adb9771..56089c49142 100644 --- a/arch/arm/mach-omap2/clockdomains3xxx_data.c +++ b/arch/arm/mach-omap2/clockdomains3xxx_data.c @@ -59,6 +59,12 @@ static struct clkdm_dep gfx_sgx_3xxx_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep gfx_sgx_am35x_wkdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */  static struct clkdm_dep per_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -69,6 +75,14 @@ static struct clkdm_dep per_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep per_am35x_wkdeps[] = { +	{ .clkdm_name = "core_l3_clkdm" }, +	{ .clkdm_name = "core_l4_clkdm" }, +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */  static struct clkdm_dep usbhost_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -79,6 +93,14 @@ static struct clkdm_dep usbhost_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep usbhost_am35x_wkdeps[] = { +	{ .clkdm_name = "core_l3_clkdm" }, +	{ .clkdm_name = "core_l4_clkdm" }, +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */  static struct clkdm_dep mpu_3xxx_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -89,6 +111,14 @@ static struct clkdm_dep mpu_3xxx_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep mpu_am35x_wkdeps[] = { +	{ .clkdm_name = "core_l3_clkdm" }, +	{ .clkdm_name = "core_l4_clkdm" }, +	{ .clkdm_name = "dss_clkdm" }, +	{ .clkdm_name = "per_clkdm" }, +	{ NULL }, +}; +  /* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */  static struct clkdm_dep iva2_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -116,6 +146,12 @@ static struct clkdm_dep dss_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep dss_am35x_wkdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430: PM_WKDEP_NEON: MPU */  static struct clkdm_dep neon_wkdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -131,6 +167,11 @@ static struct clkdm_dep dss_sleepdeps[] = {  	{ NULL },  }; +static struct clkdm_dep dss_am35x_sleepdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ NULL }, +}; +  /* 3430: CM_SLEEPDEP_PER: MPU, IVA */  static struct clkdm_dep per_sleepdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -138,6 +179,11 @@ static struct clkdm_dep per_sleepdeps[] = {  	{ NULL },  }; +static struct clkdm_dep per_am35x_sleepdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ NULL }, +}; +  /* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */  static struct clkdm_dep usbhost_sleepdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -145,6 +191,11 @@ static struct clkdm_dep usbhost_sleepdeps[] = {  	{ NULL },  }; +static struct clkdm_dep usbhost_am35x_sleepdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ NULL }, +}; +  /* 3430: CM_SLEEPDEP_CAM: MPU */  static struct clkdm_dep cam_sleepdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -175,6 +226,15 @@ static struct clockdomain mpu_3xxx_clkdm = {  	.clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,  }; +static struct clockdomain mpu_am35x_clkdm = { +	.name		= "mpu_clkdm", +	.pwrdm		= { .name = "mpu_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP, +	.dep_bit	= OMAP3430_EN_MPU_SHIFT, +	.wkdep_srcs	= mpu_am35x_wkdeps, +	.clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK, +}; +  static struct clockdomain neon_clkdm = {  	.name		= "neon_clkdm",  	.pwrdm		= { .name = "neon_pwrdm" }, @@ -210,6 +270,15 @@ static struct clockdomain sgx_clkdm = {  	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,  }; +static struct clockdomain sgx_am35x_clkdm = { +	.name		= "sgx_clkdm", +	.pwrdm		= { .name = "sgx_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.wkdep_srcs	= gfx_sgx_am35x_wkdeps, +	.sleepdep_srcs	= gfx_sgx_sleepdeps, +	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK, +}; +  /*   * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but   * then that information was removed from the 34xx ES2+ TRM.  It is @@ -261,6 +330,16 @@ static struct clockdomain dss_3xxx_clkdm = {  	.clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,  }; +static struct clockdomain dss_am35x_clkdm = { +	.name		= "dss_clkdm", +	.pwrdm		= { .name = "dss_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.dep_bit	= OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT, +	.wkdep_srcs	= dss_am35x_wkdeps, +	.sleepdep_srcs	= dss_am35x_sleepdeps, +	.clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK, +}; +  static struct clockdomain cam_clkdm = {  	.name		= "cam_clkdm",  	.pwrdm		= { .name = "cam_pwrdm" }, @@ -279,6 +358,15 @@ static struct clockdomain usbhost_clkdm = {  	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,  }; +static struct clockdomain usbhost_am35x_clkdm = { +	.name		= "usbhost_clkdm", +	.pwrdm		= { .name = "core_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.wkdep_srcs	= usbhost_am35x_wkdeps, +	.sleepdep_srcs	= usbhost_am35x_sleepdeps, +	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK, +}; +  static struct clockdomain per_clkdm = {  	.name		= "per_clkdm",  	.pwrdm		= { .name = "per_pwrdm" }, @@ -289,6 +377,16 @@ static struct clockdomain per_clkdm = {  	.clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,  }; +static struct clockdomain per_am35x_clkdm = { +	.name		= "per_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.dep_bit	= OMAP3430_EN_PER_SHIFT, +	.wkdep_srcs	= per_am35x_wkdeps, +	.sleepdep_srcs	= per_am35x_sleepdeps, +	.clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK, +}; +  /*   * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is   * switched of even if sdti is in use @@ -341,31 +439,42 @@ static struct clkdm_autodep clkdm_autodeps[] = {  	}  }; +static struct clkdm_autodep clkdm_am35x_autodeps[] = { +	{ +		.clkdm = { .name = "mpu_clkdm" }, +	}, +	{ +		.clkdm = { .name = NULL }, +	} +}; +  /*   *   */ -static struct clockdomain *clockdomains_omap3430_common[] __initdata = { +static struct clockdomain *clockdomains_common[] __initdata = {  	&wkup_common_clkdm, -	&cm_common_clkdm, -	&prm_common_clkdm, -	&mpu_3xxx_clkdm,  	&neon_clkdm, -	&iva2_clkdm, -	&d2d_clkdm,  	&core_l3_3xxx_clkdm,  	&core_l4_3xxx_clkdm, -	&dss_3xxx_clkdm, -	&cam_clkdm, -	&per_clkdm,  	&emu_clkdm,  	&dpll1_clkdm, -	&dpll2_clkdm,  	&dpll3_clkdm,  	&dpll4_clkdm,  	NULL  }; +static struct clockdomain *clockdomains_omap3430[] __initdata = { +	&mpu_3xxx_clkdm, +	&iva2_clkdm, +	&d2d_clkdm, +	&dss_3xxx_clkdm, +	&cam_clkdm, +	&per_clkdm, +	&dpll2_clkdm, +	NULL +}; +  static struct clockdomain *clockdomains_omap3430es1[] __initdata = {  	&gfx_3430es1_clkdm,  	NULL, @@ -378,21 +487,41 @@ static struct clockdomain *clockdomains_omap3430es2plus[] __initdata = {  	NULL,  }; +static struct clockdomain *clockdomains_am35x[] __initdata = { +	&mpu_am35x_clkdm, +	&sgx_am35x_clkdm, +	&dss_am35x_clkdm, +	&per_am35x_clkdm, +	&usbhost_am35x_clkdm, +	&dpll5_clkdm, +	NULL +}; +  void __init omap3xxx_clockdomains_init(void)  {  	struct clockdomain **sc; +	unsigned int rev;  	if (!cpu_is_omap34xx())  		return;  	clkdm_register_platform_funcs(&omap3_clkdm_operations); -	clkdm_register_clkdms(clockdomains_omap3430_common); +	clkdm_register_clkdms(clockdomains_common); -	sc = (omap_rev() == OMAP3430_REV_ES1_0) ? clockdomains_omap3430es1 : -		clockdomains_omap3430es2plus; +	rev = omap_rev(); -	clkdm_register_clkdms(sc); +	if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { +		clkdm_register_clkdms(clockdomains_am35x); +		clkdm_register_autodeps(clkdm_am35x_autodeps); +	} else { +		clkdm_register_clkdms(clockdomains_omap3430); + +		sc = (rev == OMAP3430_REV_ES1_0) ? +			clockdomains_omap3430es1 : clockdomains_omap3430es2plus; + +		clkdm_register_clkdms(sc); +		clkdm_register_autodeps(clkdm_autodeps); +	} -	clkdm_register_autodeps(clkdm_autodeps);  	clkdm_complete_init();  } diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c index 7f2133abe7d..63d60a773d3 100644 --- a/arch/arm/mach-omap2/clockdomains44xx_data.c +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c @@ -430,8 +430,6 @@ static struct clockdomain *clockdomains_omap44xx[] __initdata = {  	&l4_wkup_44xx_clkdm,  	&emu_sys_44xx_clkdm,  	&l3_dma_44xx_clkdm, -	&prm_common_clkdm, -	&cm_common_clkdm,  	NULL  }; diff --git a/arch/arm/mach-omap2/clockdomains_common_data.c b/arch/arm/mach-omap2/clockdomains_common_data.c deleted file mode 100644 index 615b1f04967..00000000000 --- a/arch/arm/mach-omap2/clockdomains_common_data.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * OMAP2+-common clockdomain data - * - * Copyright (C) 2008-2012 Texas Instruments, Inc. - * Copyright (C) 2008-2010 Nokia Corporation - * - * Paul Walmsley, Jouni Högander - */ - -#include <linux/kernel.h> -#include <linux/io.h> - -#include "clockdomain.h" - -/* These are implicit clockdomains - they are never defined as such in TRM */ -struct clockdomain prm_common_clkdm = { -	.name		= "prm_clkdm", -	.pwrdm		= { .name = "wkup_pwrdm" }, -}; - -struct clockdomain cm_common_clkdm = { -	.name		= "cm_clkdm", -	.pwrdm		= { .name = "core_pwrdm" }, -}; diff --git a/arch/arm/mach-omap2/cm-regbits-33xx.h b/arch/arm/mach-omap2/cm-regbits-33xx.h new file mode 100644 index 00000000000..532027ee3d8 --- /dev/null +++ b/arch/arm/mach-omap2/cm-regbits-33xx.h @@ -0,0 +1,687 @@ +/* + * AM33XX Power Management register bits + * + * This file is automatically generated from the AM33XX hardware databases. + * Vaibhav Hiremath <hvaibhav@ti.com> + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_33XX_H +#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_33XX_H + +/* + * Used by CM_AUTOIDLE_DPLL_CORE, CM_AUTOIDLE_DPLL_DDR, CM_AUTOIDLE_DPLL_DISP, + * CM_AUTOIDLE_DPLL_MPU, CM_AUTOIDLE_DPLL_PER + */ +#define AM33XX_AUTO_DPLL_MODE_SHIFT			0 +#define AM33XX_AUTO_DPLL_MODE_MASK			(0x7 << 0) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_ADC_FCLK_SHIFT		14 +#define AM33XX_CLKACTIVITY_ADC_FCLK_MASK		(1 << 16) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CAN_CLK_SHIFT		11 +#define AM33XX_CLKACTIVITY_CAN_CLK_MASK			(1 << 11) + +/* Used by CM_PER_CLK_24MHZ_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CLK_24MHZ_GCLK_SHIFT		4 +#define AM33XX_CLKACTIVITY_CLK_24MHZ_GCLK_MASK		(1 << 4) + +/* Used by CM_PER_CPSW_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CPSW_125MHZ_GCLK_SHIFT	4 +#define AM33XX_CLKACTIVITY_CPSW_125MHZ_GCLK_MASK	(1 << 4) + +/* Used by CM_PER_L4HS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CPSW_250MHZ_GCLK_SHIFT	4 +#define AM33XX_CLKACTIVITY_CPSW_250MHZ_GCLK_MASK	(1 << 4) + +/* Used by CM_PER_L4HS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CPSW_50MHZ_GCLK_SHIFT	5 +#define AM33XX_CLKACTIVITY_CPSW_50MHZ_GCLK_MASK		(1 << 5) + +/* Used by CM_PER_L4HS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CPSW_5MHZ_GCLK_SHIFT		6 +#define AM33XX_CLKACTIVITY_CPSW_5MHZ_GCLK_MASK		(1 << 6) + +/* Used by CM_PER_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CPTS_RFT_GCLK_SHIFT		6 +#define AM33XX_CLKACTIVITY_CPTS_RFT_GCLK_MASK		(1 << 6) + +/* Used by CM_CEFUSE_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_CUST_EFUSE_SYS_CLK_SHIFT	9 +#define AM33XX_CLKACTIVITY_CUST_EFUSE_SYS_CLK_MASK	(1 << 9) + +/* Used by CM_L3_AON_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_DBGSYSCLK_SHIFT		2 +#define AM33XX_CLKACTIVITY_DBGSYSCLK_MASK		(1 << 2) + +/* Used by CM_L3_AON_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_DEBUG_CLKA_SHIFT		4 +#define AM33XX_CLKACTIVITY_DEBUG_CLKA_MASK		(1 << 4) + +/* Used by CM_PER_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_EMIF_GCLK_SHIFT		2 +#define AM33XX_CLKACTIVITY_EMIF_GCLK_MASK		(1 << 2) + +/* Used by CM_GFX_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GFX_FCLK_SHIFT		9 +#define AM33XX_CLKACTIVITY_GFX_FCLK_MASK		(1 << 9) + +/* Used by CM_GFX_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GFX_L3_GCLK_SHIFT		8 +#define AM33XX_CLKACTIVITY_GFX_L3_GCLK_MASK		(1 << 8) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GPIO0_GDBCLK_SHIFT		8 +#define AM33XX_CLKACTIVITY_GPIO0_GDBCLK_MASK		(1 << 8) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GPIO_1_GDBCLK_SHIFT		19 +#define AM33XX_CLKACTIVITY_GPIO_1_GDBCLK_MASK		(1 << 19) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GPIO_2_GDBCLK_SHIFT		20 +#define AM33XX_CLKACTIVITY_GPIO_2_GDBCLK_MASK		(1 << 20) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GPIO_3_GDBCLK_SHIFT		21 +#define AM33XX_CLKACTIVITY_GPIO_3_GDBCLK_MASK		(1 << 21) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GPIO_4_GDBCLK_SHIFT		22 +#define AM33XX_CLKACTIVITY_GPIO_4_GDBCLK_MASK		(1 << 22) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GPIO_5_GDBCLK_SHIFT		26 +#define AM33XX_CLKACTIVITY_GPIO_5_GDBCLK_MASK		(1 << 26) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_GPIO_6_GDBCLK_SHIFT		18 +#define AM33XX_CLKACTIVITY_GPIO_6_GDBCLK_MASK		(1 << 18) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_I2C0_GFCLK_SHIFT		11 +#define AM33XX_CLKACTIVITY_I2C0_GFCLK_MASK		(1 << 11) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_I2C_FCLK_SHIFT		24 +#define AM33XX_CLKACTIVITY_I2C_FCLK_MASK		(1 << 24) + +/* Used by CM_PER_PRUSS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_PRUSS_IEP_GCLK_SHIFT		5 +#define AM33XX_CLKACTIVITY_PRUSS_IEP_GCLK_MASK		(1 << 5) + +/* Used by CM_PER_PRUSS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_PRUSS_OCP_GCLK_SHIFT		4 +#define AM33XX_CLKACTIVITY_PRUSS_OCP_GCLK_MASK		(1 << 4) + +/* Used by CM_PER_PRUSS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_PRUSS_UART_GCLK_SHIFT	6 +#define AM33XX_CLKACTIVITY_PRUSS_UART_GCLK_MASK		(1 << 6) + +/* Used by CM_PER_L3S_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L3S_GCLK_SHIFT		3 +#define AM33XX_CLKACTIVITY_L3S_GCLK_MASK		(1 << 3) + +/* Used by CM_L3_AON_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L3_AON_GCLK_SHIFT		3 +#define AM33XX_CLKACTIVITY_L3_AON_GCLK_MASK		(1 << 3) + +/* Used by CM_PER_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L3_GCLK_SHIFT		4 +#define AM33XX_CLKACTIVITY_L3_GCLK_MASK			(1 << 4) + +/* Used by CM_PER_L4FW_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L4FW_GCLK_SHIFT		8 +#define AM33XX_CLKACTIVITY_L4FW_GCLK_MASK		(1 << 8) + +/* Used by CM_PER_L4HS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L4HS_GCLK_SHIFT		3 +#define AM33XX_CLKACTIVITY_L4HS_GCLK_MASK		(1 << 3) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L4LS_GCLK_SHIFT		8 +#define AM33XX_CLKACTIVITY_L4LS_GCLK_MASK		(1 << 8) + +/* Used by CM_GFX_L4LS_GFX_CLKSTCTRL__1 */ +#define AM33XX_CLKACTIVITY_L4LS_GFX_GCLK_SHIFT		8 +#define AM33XX_CLKACTIVITY_L4LS_GFX_GCLK_MASK		(1 << 8) + +/* Used by CM_CEFUSE_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L4_CEFUSE_GICLK_SHIFT	8 +#define AM33XX_CLKACTIVITY_L4_CEFUSE_GICLK_MASK		(1 << 8) + +/* Used by CM_RTC_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L4_RTC_GCLK_SHIFT		8 +#define AM33XX_CLKACTIVITY_L4_RTC_GCLK_MASK		(1 << 8) + +/* Used by CM_L4_WKUP_AON_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L4_WKUP_AON_GCLK_SHIFT	2 +#define AM33XX_CLKACTIVITY_L4_WKUP_AON_GCLK_MASK	(1 << 2) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_L4_WKUP_GCLK_SHIFT		2 +#define AM33XX_CLKACTIVITY_L4_WKUP_GCLK_MASK		(1 << 2) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_LCDC_GCLK_SHIFT		17 +#define AM33XX_CLKACTIVITY_LCDC_GCLK_MASK		(1 << 17) + +/* Used by CM_PER_LCDC_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_LCDC_L3_OCP_GCLK_SHIFT	4 +#define AM33XX_CLKACTIVITY_LCDC_L3_OCP_GCLK_MASK	(1 << 4) + +/* Used by CM_PER_LCDC_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_LCDC_L4_OCP_GCLK_SHIFT	5 +#define AM33XX_CLKACTIVITY_LCDC_L4_OCP_GCLK_MASK	(1 << 5) + +/* Used by CM_PER_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_MCASP_GCLK_SHIFT		7 +#define AM33XX_CLKACTIVITY_MCASP_GCLK_MASK		(1 << 7) + +/* Used by CM_PER_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_MMC_FCLK_SHIFT		3 +#define AM33XX_CLKACTIVITY_MMC_FCLK_MASK		(1 << 3) + +/* Used by CM_MPU_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_MPU_CLK_SHIFT		2 +#define AM33XX_CLKACTIVITY_MPU_CLK_MASK			(1 << 2) + +/* Used by CM_PER_OCPWP_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_OCPWP_L3_GCLK_SHIFT		4 +#define AM33XX_CLKACTIVITY_OCPWP_L3_GCLK_MASK		(1 << 4) + +/* Used by CM_PER_OCPWP_L3_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_OCPWP_L4_GCLK_SHIFT		5 +#define AM33XX_CLKACTIVITY_OCPWP_L4_GCLK_MASK		(1 << 5) + +/* Used by CM_RTC_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_RTC_32KCLK_SHIFT		9 +#define AM33XX_CLKACTIVITY_RTC_32KCLK_MASK		(1 << 9) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_SPI_GCLK_SHIFT		25 +#define AM33XX_CLKACTIVITY_SPI_GCLK_MASK		(1 << 25) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_SR_SYSCLK_SHIFT		3 +#define AM33XX_CLKACTIVITY_SR_SYSCLK_MASK		(1 << 3) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER0_GCLK_SHIFT		10 +#define AM33XX_CLKACTIVITY_TIMER0_GCLK_MASK		(1 << 10) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER1_GCLK_SHIFT		13 +#define AM33XX_CLKACTIVITY_TIMER1_GCLK_MASK		(1 << 13) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER2_GCLK_SHIFT		14 +#define AM33XX_CLKACTIVITY_TIMER2_GCLK_MASK		(1 << 14) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER3_GCLK_SHIFT		15 +#define AM33XX_CLKACTIVITY_TIMER3_GCLK_MASK		(1 << 15) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER4_GCLK_SHIFT		16 +#define AM33XX_CLKACTIVITY_TIMER4_GCLK_MASK		(1 << 16) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER5_GCLK_SHIFT		27 +#define AM33XX_CLKACTIVITY_TIMER5_GCLK_MASK		(1 << 27) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER6_GCLK_SHIFT		28 +#define AM33XX_CLKACTIVITY_TIMER6_GCLK_MASK		(1 << 28) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_TIMER7_GCLK_SHIFT		13 +#define AM33XX_CLKACTIVITY_TIMER7_GCLK_MASK		(1 << 13) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_UART0_GFCLK_SHIFT		12 +#define AM33XX_CLKACTIVITY_UART0_GFCLK_MASK		(1 << 12) + +/* Used by CM_PER_L4LS_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_UART_GFCLK_SHIFT		10 +#define AM33XX_CLKACTIVITY_UART_GFCLK_MASK		(1 << 10) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_WDT0_GCLK_SHIFT		9 +#define AM33XX_CLKACTIVITY_WDT0_GCLK_MASK		(1 << 9) + +/* Used by CM_WKUP_CLKSTCTRL */ +#define AM33XX_CLKACTIVITY_WDT1_GCLK_SHIFT		4 +#define AM33XX_CLKACTIVITY_WDT1_GCLK_MASK		(1 << 4) + +/* Used by CLKSEL_GFX_FCLK */ +#define AM33XX_CLKDIV_SEL_GFX_FCLK_SHIFT		0 +#define AM33XX_CLKDIV_SEL_GFX_FCLK_MASK			(1 << 0) + +/* Used by CM_CLKOUT_CTRL */ +#define AM33XX_CLKOUT2DIV_SHIFT				3 +#define AM33XX_CLKOUT2DIV_MASK				(0x05 << 3) + +/* Used by CM_CLKOUT_CTRL */ +#define AM33XX_CLKOUT2EN_SHIFT				7 +#define AM33XX_CLKOUT2EN_MASK				(1 << 7) + +/* Used by CM_CLKOUT_CTRL */ +#define AM33XX_CLKOUT2SOURCE_SHIFT			0 +#define AM33XX_CLKOUT2SOURCE_MASK			(0x02 << 0) + +/* + * Used by CLKSEL_GPIO0_DBCLK, CLKSEL_LCDC_PIXEL_CLK, CLKSEL_TIMER2_CLK, + * CLKSEL_TIMER3_CLK, CLKSEL_TIMER4_CLK, CLKSEL_TIMER5_CLK, CLKSEL_TIMER6_CLK, + * CLKSEL_TIMER7_CLK + */ +#define AM33XX_CLKSEL_SHIFT				0 +#define AM33XX_CLKSEL_MASK				(0x01 << 0) + +/* + * Renamed from CLKSEL Used by CLKSEL_PRUSS_OCP_CLK, CLKSEL_WDT1_CLK, + * CM_CPTS_RFT_CLKSEL + */ +#define AM33XX_CLKSEL_0_0_SHIFT				0 +#define AM33XX_CLKSEL_0_0_MASK				(1 << 0) + +#define AM33XX_CLKSEL_0_1_SHIFT				0 +#define AM33XX_CLKSEL_0_1_MASK				(3 << 0) + +/* Renamed from CLKSEL Used by CLKSEL_TIMER1MS_CLK */ +#define AM33XX_CLKSEL_0_2_SHIFT				0 +#define AM33XX_CLKSEL_0_2_MASK				(7 << 0) + +/* Used by CLKSEL_GFX_FCLK */ +#define AM33XX_CLKSEL_GFX_FCLK_SHIFT			1 +#define AM33XX_CLKSEL_GFX_FCLK_MASK			(1 << 1) + +/* + * Used by CM_MPU_CLKSTCTRL, CM_RTC_CLKSTCTRL, CM_PER_CLK_24MHZ_CLKSTCTRL, + * CM_PER_CPSW_CLKSTCTRL, CM_PER_PRUSS_CLKSTCTRL, CM_PER_L3S_CLKSTCTRL, + * CM_PER_L3_CLKSTCTRL, CM_PER_L4FW_CLKSTCTRL, CM_PER_L4HS_CLKSTCTRL, + * CM_PER_L4LS_CLKSTCTRL, CM_PER_LCDC_CLKSTCTRL, CM_PER_OCPWP_L3_CLKSTCTRL, + * CM_L3_AON_CLKSTCTRL, CM_L4_WKUP_AON_CLKSTCTRL, CM_WKUP_CLKSTCTRL, + * CM_GFX_L3_CLKSTCTRL, CM_GFX_L4LS_GFX_CLKSTCTRL__1, CM_CEFUSE_CLKSTCTRL + */ +#define AM33XX_CLKTRCTRL_SHIFT				0 +#define AM33XX_CLKTRCTRL_MASK				(0x3 << 0) + +/* + * Used by CM_SSC_DELTAMSTEP_DPLL_CORE, CM_SSC_DELTAMSTEP_DPLL_DDR, + * CM_SSC_DELTAMSTEP_DPLL_DISP, CM_SSC_DELTAMSTEP_DPLL_MPU, + * CM_SSC_DELTAMSTEP_DPLL_PER + */ +#define AM33XX_DELTAMSTEP_SHIFT				0 +#define AM33XX_DELTAMSTEP_MASK				(0x19 << 0) + +/* Used by CM_CLKSEL_DPLL_DDR, CM_CLKSEL_DPLL_DISP, CM_CLKSEL_DPLL_MPU */ +#define AM33XX_DPLL_BYP_CLKSEL_SHIFT			23 +#define AM33XX_DPLL_BYP_CLKSEL_MASK			(1 << 23) + +/* Used by CM_CLKDCOLDO_DPLL_PER */ +#define AM33XX_DPLL_CLKDCOLDO_GATE_CTRL_SHIFT		8 +#define AM33XX_DPLL_CLKDCOLDO_GATE_CTRL_MASK		(1 << 8) + +/* Used by CM_CLKDCOLDO_DPLL_PER */ +#define AM33XX_DPLL_CLKDCOLDO_PWDN_SHIFT		12 +#define AM33XX_DPLL_CLKDCOLDO_PWDN_MASK			(1 << 12) + +/* Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU */ +#define AM33XX_DPLL_CLKOUT_DIV_SHIFT			0 +#define AM33XX_DPLL_CLKOUT_DIV_MASK			(0x1f << 0) + +/* Renamed from DPLL_CLKOUT_DIV Used by CM_DIV_M2_DPLL_PER */ +#define AM33XX_DPLL_CLKOUT_DIV_0_6_SHIFT		0 +#define AM33XX_DPLL_CLKOUT_DIV_0_6_MASK			(0x06 << 0) + +/* Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU */ +#define AM33XX_DPLL_CLKOUT_DIVCHACK_SHIFT		5 +#define AM33XX_DPLL_CLKOUT_DIVCHACK_MASK		(1 << 5) + +/* Renamed from DPLL_CLKOUT_DIVCHACK Used by CM_DIV_M2_DPLL_PER */ +#define AM33XX_DPLL_CLKOUT_DIVCHACK_M2_PER_SHIFT	7 +#define AM33XX_DPLL_CLKOUT_DIVCHACK_M2_PER_MASK		(1 << 7) + +/* + * Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU, + * CM_DIV_M2_DPLL_PER + */ +#define AM33XX_DPLL_CLKOUT_GATE_CTRL_SHIFT		8 +#define AM33XX_DPLL_CLKOUT_GATE_CTRL_MASK		(1 << 8) + +/* + * Used by CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_DDR, CM_CLKSEL_DPLL_DISP, + * CM_CLKSEL_DPLL_MPU + */ +#define AM33XX_DPLL_DIV_SHIFT				0 +#define AM33XX_DPLL_DIV_MASK				(0x7f << 0) + +#define AM33XX_DPLL_PER_DIV_MASK			(0xff << 0) + +/* Renamed from DPLL_DIV Used by CM_CLKSEL_DPLL_PERIPH */ +#define AM33XX_DPLL_DIV_0_7_SHIFT			0 +#define AM33XX_DPLL_DIV_0_7_MASK			(0x07 << 0) + +/* + * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP, + * CM_CLKMODE_DPLL_MPU + */ +#define AM33XX_DPLL_DRIFTGUARD_EN_SHIFT			8 +#define AM33XX_DPLL_DRIFTGUARD_EN_MASK			(1 << 8) + +/* + * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP, + * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER + */ +#define AM33XX_DPLL_EN_SHIFT				0 +#define AM33XX_DPLL_EN_MASK				(0x7 << 0) + +/* + * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP, + * CM_CLKMODE_DPLL_MPU + */ +#define AM33XX_DPLL_LPMODE_EN_SHIFT			10 +#define AM33XX_DPLL_LPMODE_EN_MASK			(1 << 10) + +/* + * Used by CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_DDR, CM_CLKSEL_DPLL_DISP, + * CM_CLKSEL_DPLL_MPU + */ +#define AM33XX_DPLL_MULT_SHIFT				8 +#define AM33XX_DPLL_MULT_MASK				(0x7ff << 8) + +/* Renamed from DPLL_MULT Used by CM_CLKSEL_DPLL_PERIPH */ +#define AM33XX_DPLL_MULT_PERIPH_SHIFT			8 +#define AM33XX_DPLL_MULT_PERIPH_MASK			(0xfff << 8) + +/* + * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP, + * CM_CLKMODE_DPLL_MPU + */ +#define AM33XX_DPLL_REGM4XEN_SHIFT			11 +#define AM33XX_DPLL_REGM4XEN_MASK			(1 << 11) + +/* Used by CM_CLKSEL_DPLL_PERIPH */ +#define AM33XX_DPLL_SD_DIV_SHIFT			24 +#define AM33XX_DPLL_SD_DIV_MASK				(24, 31) + +/* + * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP, + * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER + */ +#define AM33XX_DPLL_SSC_ACK_SHIFT			13 +#define AM33XX_DPLL_SSC_ACK_MASK			(1 << 13) + +/* + * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP, + * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER + */ +#define AM33XX_DPLL_SSC_DOWNSPREAD_SHIFT		14 +#define AM33XX_DPLL_SSC_DOWNSPREAD_MASK			(1 << 14) + +/* + * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP, + * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER + */ +#define AM33XX_DPLL_SSC_EN_SHIFT			12 +#define AM33XX_DPLL_SSC_EN_MASK				(1 << 12) + +/* Used by CM_DIV_M4_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT1_DIV_SHIFT		0 +#define AM33XX_HSDIVIDER_CLKOUT1_DIV_MASK		(0x1f << 0) + +/* Used by CM_DIV_M4_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT1_DIVCHACK_SHIFT		5 +#define AM33XX_HSDIVIDER_CLKOUT1_DIVCHACK_MASK		(1 << 5) + +/* Used by CM_DIV_M4_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT1_GATE_CTRL_SHIFT	8 +#define AM33XX_HSDIVIDER_CLKOUT1_GATE_CTRL_MASK		(1 << 8) + +/* Used by CM_DIV_M4_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT1_PWDN_SHIFT		12 +#define AM33XX_HSDIVIDER_CLKOUT1_PWDN_MASK		(1 << 12) + +/* Used by CM_DIV_M5_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT2_DIV_SHIFT		0 +#define AM33XX_HSDIVIDER_CLKOUT2_DIV_MASK		(0x1f << 0) + +/* Used by CM_DIV_M5_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT2_DIVCHACK_SHIFT		5 +#define AM33XX_HSDIVIDER_CLKOUT2_DIVCHACK_MASK		(1 << 5) + +/* Used by CM_DIV_M5_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT2_GATE_CTRL_SHIFT	8 +#define AM33XX_HSDIVIDER_CLKOUT2_GATE_CTRL_MASK		(1 << 8) + +/* Used by CM_DIV_M5_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT2_PWDN_SHIFT		12 +#define AM33XX_HSDIVIDER_CLKOUT2_PWDN_MASK		(1 << 12) + +/* Used by CM_DIV_M6_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT3_DIV_SHIFT		0 +#define AM33XX_HSDIVIDER_CLKOUT3_DIV_MASK		(0x04 << 0) + +/* Used by CM_DIV_M6_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT3_DIVCHACK_SHIFT		5 +#define AM33XX_HSDIVIDER_CLKOUT3_DIVCHACK_MASK		(1 << 5) + +/* Used by CM_DIV_M6_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT3_GATE_CTRL_SHIFT	8 +#define AM33XX_HSDIVIDER_CLKOUT3_GATE_CTRL_MASK		(1 << 8) + +/* Used by CM_DIV_M6_DPLL_CORE */ +#define AM33XX_HSDIVIDER_CLKOUT3_PWDN_SHIFT		12 +#define AM33XX_HSDIVIDER_CLKOUT3_PWDN_MASK		(1 << 12) + +/* + * Used by CM_MPU_MPU_CLKCTRL, CM_RTC_RTC_CLKCTRL, CM_PER_AES0_CLKCTRL, + * CM_PER_AES1_CLKCTRL, CM_PER_CLKDIV32K_CLKCTRL, CM_PER_CPGMAC0_CLKCTRL, + * CM_PER_DCAN0_CLKCTRL, CM_PER_DCAN1_CLKCTRL, CM_PER_DES_CLKCTRL, + * CM_PER_ELM_CLKCTRL, CM_PER_EMIF_CLKCTRL, CM_PER_EMIF_FW_CLKCTRL, + * CM_PER_EPWMSS0_CLKCTRL, CM_PER_EPWMSS1_CLKCTRL, CM_PER_EPWMSS2_CLKCTRL, + * CM_PER_GPIO1_CLKCTRL, CM_PER_GPIO2_CLKCTRL, CM_PER_GPIO3_CLKCTRL, + * CM_PER_GPIO4_CLKCTRL, CM_PER_GPIO5_CLKCTRL, CM_PER_GPIO6_CLKCTRL, + * CM_PER_GPMC_CLKCTRL, CM_PER_I2C1_CLKCTRL, CM_PER_I2C2_CLKCTRL, + * CM_PER_PRUSS_CLKCTRL, CM_PER_IEEE5000_CLKCTRL, CM_PER_L3_CLKCTRL, + * CM_PER_L3_INSTR_CLKCTRL, CM_PER_L4FW_CLKCTRL, CM_PER_L4HS_CLKCTRL, + * CM_PER_L4LS_CLKCTRL, CM_PER_LCDC_CLKCTRL, CM_PER_MAILBOX0_CLKCTRL, + * CM_PER_MAILBOX1_CLKCTRL, CM_PER_MCASP0_CLKCTRL, CM_PER_MCASP1_CLKCTRL, + * CM_PER_MCASP2_CLKCTRL, CM_PER_MLB_CLKCTRL, CM_PER_MMC0_CLKCTRL, + * CM_PER_MMC1_CLKCTRL, CM_PER_MMC2_CLKCTRL, CM_PER_MSTR_EXPS_CLKCTRL, + * CM_PER_OCMCRAM_CLKCTRL, CM_PER_OCPWP_CLKCTRL, CM_PER_PCIE_CLKCTRL, + * CM_PER_PKA_CLKCTRL, CM_PER_RNG_CLKCTRL, CM_PER_SHA0_CLKCTRL, + * CM_PER_SLV_EXPS_CLKCTRL, CM_PER_SPARE0_CLKCTRL, CM_PER_SPARE1_CLKCTRL, + * CM_PER_SPARE_CLKCTRL, CM_PER_SPI0_CLKCTRL, CM_PER_SPI1_CLKCTRL, + * CM_PER_SPI2_CLKCTRL, CM_PER_SPI3_CLKCTRL, CM_PER_SPINLOCK_CLKCTRL, + * CM_PER_TIMER2_CLKCTRL, CM_PER_TIMER3_CLKCTRL, CM_PER_TIMER4_CLKCTRL, + * CM_PER_TIMER5_CLKCTRL, CM_PER_TIMER6_CLKCTRL, CM_PER_TIMER7_CLKCTRL, + * CM_PER_TPCC_CLKCTRL, CM_PER_TPTC0_CLKCTRL, CM_PER_TPTC1_CLKCTRL, + * CM_PER_TPTC2_CLKCTRL, CM_PER_UART1_CLKCTRL, CM_PER_UART2_CLKCTRL, + * CM_PER_UART3_CLKCTRL, CM_PER_UART4_CLKCTRL, CM_PER_UART5_CLKCTRL, + * CM_PER_USB0_CLKCTRL, CM_WKUP_ADC_TSC_CLKCTRL, CM_WKUP_CONTROL_CLKCTRL, + * CM_WKUP_DEBUGSS_CLKCTRL, CM_WKUP_GPIO0_CLKCTRL, CM_WKUP_I2C0_CLKCTRL, + * CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_SMARTREFLEX0_CLKCTRL, + * CM_WKUP_SMARTREFLEX1_CLKCTRL, CM_WKUP_TIMER0_CLKCTRL, + * CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_UART0_CLKCTRL, CM_WKUP_WDT0_CLKCTRL, + * CM_WKUP_WDT1_CLKCTRL, CM_GFX_BITBLT_CLKCTRL, CM_GFX_GFX_CLKCTRL, + * CM_GFX_MMUCFG_CLKCTRL, CM_GFX_MMUDATA_CLKCTRL, CM_CEFUSE_CEFUSE_CLKCTRL + */ +#define AM33XX_IDLEST_SHIFT				16 +#define AM33XX_IDLEST_MASK				(0x3 << 16) +#define AM33XX_IDLEST_VAL				0x3 + +/* Used by CM_MAC_CLKSEL */ +#define AM33XX_MII_CLK_SEL_SHIFT			2 +#define AM33XX_MII_CLK_SEL_MASK				(1 << 2) + +/* + * Used by CM_SSC_MODFREQDIV_DPLL_CORE, CM_SSC_MODFREQDIV_DPLL_DDR, + * CM_SSC_MODFREQDIV_DPLL_DISP, CM_SSC_MODFREQDIV_DPLL_MPU, + * CM_SSC_MODFREQDIV_DPLL_PER + */ +#define AM33XX_MODFREQDIV_EXPONENT_SHIFT		8 +#define AM33XX_MODFREQDIV_EXPONENT_MASK			(0x10 << 8) + +/* + * Used by CM_SSC_MODFREQDIV_DPLL_CORE, CM_SSC_MODFREQDIV_DPLL_DDR, + * CM_SSC_MODFREQDIV_DPLL_DISP, CM_SSC_MODFREQDIV_DPLL_MPU, + * CM_SSC_MODFREQDIV_DPLL_PER + */ +#define AM33XX_MODFREQDIV_MANTISSA_SHIFT		0 +#define AM33XX_MODFREQDIV_MANTISSA_MASK			(0x06 << 0) + +/* + * Used by CM_MPU_MPU_CLKCTRL, CM_RTC_RTC_CLKCTRL, CM_PER_AES0_CLKCTRL, + * CM_PER_AES1_CLKCTRL, CM_PER_CLKDIV32K_CLKCTRL, CM_PER_CPGMAC0_CLKCTRL, + * CM_PER_DCAN0_CLKCTRL, CM_PER_DCAN1_CLKCTRL, CM_PER_DES_CLKCTRL, + * CM_PER_ELM_CLKCTRL, CM_PER_EMIF_CLKCTRL, CM_PER_EMIF_FW_CLKCTRL, + * CM_PER_EPWMSS0_CLKCTRL, CM_PER_EPWMSS1_CLKCTRL, CM_PER_EPWMSS2_CLKCTRL, + * CM_PER_GPIO1_CLKCTRL, CM_PER_GPIO2_CLKCTRL, CM_PER_GPIO3_CLKCTRL, + * CM_PER_GPIO4_CLKCTRL, CM_PER_GPIO5_CLKCTRL, CM_PER_GPIO6_CLKCTRL, + * CM_PER_GPMC_CLKCTRL, CM_PER_I2C1_CLKCTRL, CM_PER_I2C2_CLKCTRL, + * CM_PER_PRUSS_CLKCTRL, CM_PER_IEEE5000_CLKCTRL, CM_PER_L3_CLKCTRL, + * CM_PER_L3_INSTR_CLKCTRL, CM_PER_L4FW_CLKCTRL, CM_PER_L4HS_CLKCTRL, + * CM_PER_L4LS_CLKCTRL, CM_PER_LCDC_CLKCTRL, CM_PER_MAILBOX0_CLKCTRL, + * CM_PER_MAILBOX1_CLKCTRL, CM_PER_MCASP0_CLKCTRL, CM_PER_MCASP1_CLKCTRL, + * CM_PER_MCASP2_CLKCTRL, CM_PER_MLB_CLKCTRL, CM_PER_MMC0_CLKCTRL, + * CM_PER_MMC1_CLKCTRL, CM_PER_MMC2_CLKCTRL, CM_PER_MSTR_EXPS_CLKCTRL, + * CM_PER_OCMCRAM_CLKCTRL, CM_PER_OCPWP_CLKCTRL, CM_PER_PCIE_CLKCTRL, + * CM_PER_PKA_CLKCTRL, CM_PER_RNG_CLKCTRL, CM_PER_SHA0_CLKCTRL, + * CM_PER_SLV_EXPS_CLKCTRL, CM_PER_SPARE0_CLKCTRL, CM_PER_SPARE1_CLKCTRL, + * CM_PER_SPARE_CLKCTRL, CM_PER_SPI0_CLKCTRL, CM_PER_SPI1_CLKCTRL, + * CM_PER_SPI2_CLKCTRL, CM_PER_SPI3_CLKCTRL, CM_PER_SPINLOCK_CLKCTRL, + * CM_PER_TIMER2_CLKCTRL, CM_PER_TIMER3_CLKCTRL, CM_PER_TIMER4_CLKCTRL, + * CM_PER_TIMER5_CLKCTRL, CM_PER_TIMER6_CLKCTRL, CM_PER_TIMER7_CLKCTRL, + * CM_PER_TPCC_CLKCTRL, CM_PER_TPTC0_CLKCTRL, CM_PER_TPTC1_CLKCTRL, + * CM_PER_TPTC2_CLKCTRL, CM_PER_UART1_CLKCTRL, CM_PER_UART2_CLKCTRL, + * CM_PER_UART3_CLKCTRL, CM_PER_UART4_CLKCTRL, CM_PER_UART5_CLKCTRL, + * CM_PER_USB0_CLKCTRL, CM_WKUP_ADC_TSC_CLKCTRL, CM_WKUP_CONTROL_CLKCTRL, + * CM_WKUP_DEBUGSS_CLKCTRL, CM_WKUP_GPIO0_CLKCTRL, CM_WKUP_I2C0_CLKCTRL, + * CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_SMARTREFLEX0_CLKCTRL, + * CM_WKUP_SMARTREFLEX1_CLKCTRL, CM_WKUP_TIMER0_CLKCTRL, + * CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_UART0_CLKCTRL, CM_WKUP_WDT0_CLKCTRL, + * CM_WKUP_WDT1_CLKCTRL, CM_WKUP_WKUP_M3_CLKCTRL, CM_GFX_BITBLT_CLKCTRL, + * CM_GFX_GFX_CLKCTRL, CM_GFX_MMUCFG_CLKCTRL, CM_GFX_MMUDATA_CLKCTRL, + * CM_CEFUSE_CEFUSE_CLKCTRL + */ +#define AM33XX_MODULEMODE_SHIFT				0 +#define AM33XX_MODULEMODE_MASK				(0x3 << 0) + +/* Used by CM_WKUP_DEBUGSS_CLKCTRL */ +#define AM33XX_OPTCLK_DEBUG_CLKA_SHIFT			30 +#define AM33XX_OPTCLK_DEBUG_CLKA_MASK			(1 << 30) + +/* Used by CM_WKUP_DEBUGSS_CLKCTRL */ +#define AM33XX_OPTFCLKEN_DBGSYSCLK_SHIFT		19 +#define AM33XX_OPTFCLKEN_DBGSYSCLK_MASK			(1 << 19) + +/* Used by CM_WKUP_GPIO0_CLKCTRL */ +#define AM33XX_OPTFCLKEN_GPIO0_GDBCLK_SHIFT		18 +#define AM33XX_OPTFCLKEN_GPIO0_GDBCLK_MASK		(1 << 18) + +/* Used by CM_PER_GPIO1_CLKCTRL */ +#define AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_SHIFT		18 +#define AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_MASK		(1 << 18) + +/* Used by CM_PER_GPIO2_CLKCTRL */ +#define AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_SHIFT		18 +#define AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_MASK		(1 << 18) + +/* Used by CM_PER_GPIO3_CLKCTRL */ +#define AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_SHIFT		18 +#define AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_MASK		(1 << 18) + +/* Used by CM_PER_GPIO4_CLKCTRL */ +#define AM33XX_OPTFCLKEN_GPIO_4_GDBCLK_SHIFT		18 +#define AM33XX_OPTFCLKEN_GPIO_4_GDBCLK_MASK		(1 << 18) + +/* Used by CM_PER_GPIO5_CLKCTRL */ +#define AM33XX_OPTFCLKEN_GPIO_5_GDBCLK_SHIFT		18 +#define AM33XX_OPTFCLKEN_GPIO_5_GDBCLK_MASK		(1 << 18) + +/* Used by CM_PER_GPIO6_CLKCTRL */ +#define AM33XX_OPTFCLKEN_GPIO_6_GDBCLK_SHIFT		18 +#define AM33XX_OPTFCLKEN_GPIO_6_GDBCLK_MASK		(1 << 18) + +/* + * Used by CM_MPU_MPU_CLKCTRL, CM_PER_CPGMAC0_CLKCTRL, CM_PER_PRUSS_CLKCTRL, + * CM_PER_IEEE5000_CLKCTRL, CM_PER_LCDC_CLKCTRL, CM_PER_MLB_CLKCTRL, + * CM_PER_MSTR_EXPS_CLKCTRL, CM_PER_OCPWP_CLKCTRL, CM_PER_PCIE_CLKCTRL, + * CM_PER_SPARE_CLKCTRL, CM_PER_TPTC0_CLKCTRL, CM_PER_TPTC1_CLKCTRL, + * CM_PER_TPTC2_CLKCTRL, CM_PER_USB0_CLKCTRL, CM_WKUP_DEBUGSS_CLKCTRL, + * CM_WKUP_WKUP_M3_CLKCTRL, CM_GFX_BITBLT_CLKCTRL, CM_GFX_GFX_CLKCTRL + */ +#define AM33XX_STBYST_SHIFT				18 +#define AM33XX_STBYST_MASK				(1 << 18) + +/* Used by CM_WKUP_DEBUGSS_CLKCTRL */ +#define AM33XX_STM_PMD_CLKDIVSEL_SHIFT			27 +#define AM33XX_STM_PMD_CLKDIVSEL_MASK			(0x29 << 27) + +/* Used by CM_WKUP_DEBUGSS_CLKCTRL */ +#define AM33XX_STM_PMD_CLKSEL_SHIFT			22 +#define AM33XX_STM_PMD_CLKSEL_MASK			(0x23 << 22) + +/* + * Used by CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_DDR, CM_IDLEST_DPLL_DISP, + * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER + */ +#define AM33XX_ST_DPLL_CLK_SHIFT			0 +#define AM33XX_ST_DPLL_CLK_MASK				(1 << 0) + +/* Used by CM_CLKDCOLDO_DPLL_PER */ +#define AM33XX_ST_DPLL_CLKDCOLDO_SHIFT			8 +#define AM33XX_ST_DPLL_CLKDCOLDO_MASK			(1 << 8) + +/* + * Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU, + * CM_DIV_M2_DPLL_PER + */ +#define AM33XX_ST_DPLL_CLKOUT_SHIFT			9 +#define AM33XX_ST_DPLL_CLKOUT_MASK			(1 << 9) + +/* Used by CM_DIV_M4_DPLL_CORE */ +#define AM33XX_ST_HSDIVIDER_CLKOUT1_SHIFT		9 +#define AM33XX_ST_HSDIVIDER_CLKOUT1_MASK		(1 << 9) + +/* Used by CM_DIV_M5_DPLL_CORE */ +#define AM33XX_ST_HSDIVIDER_CLKOUT2_SHIFT		9 +#define AM33XX_ST_HSDIVIDER_CLKOUT2_MASK		(1 << 9) + +/* Used by CM_DIV_M6_DPLL_CORE */ +#define AM33XX_ST_HSDIVIDER_CLKOUT3_SHIFT		9 +#define AM33XX_ST_HSDIVIDER_CLKOUT3_MASK		(1 << 9) + +/* + * Used by CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_DDR, CM_IDLEST_DPLL_DISP, + * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER + */ +#define AM33XX_ST_MN_BYPASS_SHIFT			8 +#define AM33XX_ST_MN_BYPASS_MASK			(1 << 8) + +/* Used by CM_WKUP_DEBUGSS_CLKCTRL */ +#define AM33XX_TRC_PMD_CLKDIVSEL_SHIFT			24 +#define AM33XX_TRC_PMD_CLKDIVSEL_MASK			(0x26 << 24) + +/* Used by CM_WKUP_DEBUGSS_CLKCTRL */ +#define AM33XX_TRC_PMD_CLKSEL_SHIFT			20 +#define AM33XX_TRC_PMD_CLKSEL_MASK			(0x21 << 20) + +/* Used by CONTROL_SEC_CLK_CTRL */ +#define AM33XX_TIMER0_CLKSEL_MASK			(0x3 << 4) +#endif diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h index 8083a8cdc55..766338fe4d3 100644 --- a/arch/arm/mach-omap2/cm-regbits-34xx.h +++ b/arch/arm/mach-omap2/cm-regbits-34xx.h @@ -169,8 +169,6 @@  /* AM35XX specific CM_ICLKEN1_CORE bits */  #define AM35XX_EN_IPSS_MASK				(1 << 4)  #define AM35XX_EN_IPSS_SHIFT				4 -#define AM35XX_EN_UART4_MASK				(1 << 23) -#define AM35XX_EN_UART4_SHIFT				23  /* CM_ICLKEN2_CORE */  #define OMAP3430_EN_PKA_MASK				(1 << 4) @@ -207,6 +205,8 @@  #define OMAP3430_ST_DES2_MASK				(1 << 26)  #define OMAP3430_ST_MSPRO_SHIFT				23  #define OMAP3430_ST_MSPRO_MASK				(1 << 23) +#define AM35XX_ST_UART4_SHIFT				23 +#define AM35XX_ST_UART4_MASK				(1 << 23)  #define OMAP3430_ST_HDQ_SHIFT				22  #define OMAP3430_ST_HDQ_MASK				(1 << 22)  #define OMAP3430ES1_ST_FAC_SHIFT			8 diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c new file mode 100644 index 00000000000..13f56eafef0 --- /dev/null +++ b/arch/arm/mach-omap2/cm33xx.c @@ -0,0 +1,313 @@ +/* + * AM33XX CM functions + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * Vaibhav Hiremath <hvaibhav@ti.com> + * + * Reference taken from from OMAP4 cminst44xx.c + * + * 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 version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/errno.h> +#include <linux/err.h> +#include <linux/io.h> + +#include <plat/common.h> + +#include "cm.h" +#include "cm33xx.h" +#include "cm-regbits-34xx.h" +#include "cm-regbits-33xx.h" +#include "prm33xx.h" + +/* + * CLKCTRL_IDLEST_*: possible values for the CM_*_CLKCTRL.IDLEST bitfield: + * + *   0x0 func:     Module is fully functional, including OCP + *   0x1 trans:    Module is performing transition: wakeup, or sleep, or sleep + *                 abortion + *   0x2 idle:     Module is in Idle mode (only OCP part). It is functional if + *                 using separate functional clock + *   0x3 disabled: Module is disabled and cannot be accessed + * + */ +#define CLKCTRL_IDLEST_FUNCTIONAL		0x0 +#define CLKCTRL_IDLEST_INTRANSITION		0x1 +#define CLKCTRL_IDLEST_INTERFACE_IDLE		0x2 +#define CLKCTRL_IDLEST_DISABLED			0x3 + +/* Private functions */ + +/* Read a register in a CM instance */ +static inline u32 am33xx_cm_read_reg(s16 inst, u16 idx) +{ +	return __raw_readl(cm_base + inst + idx); +} + +/* Write into a register in a CM */ +static inline void am33xx_cm_write_reg(u32 val, s16 inst, u16 idx) +{ +	__raw_writel(val, cm_base + inst + idx); +} + +/* Read-modify-write a register in CM */ +static inline u32 am33xx_cm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx) +{ +	u32 v; + +	v = am33xx_cm_read_reg(inst, idx); +	v &= ~mask; +	v |= bits; +	am33xx_cm_write_reg(v, inst, idx); + +	return v; +} + +static inline u32 am33xx_cm_set_reg_bits(u32 bits, s16 inst, s16 idx) +{ +	return am33xx_cm_rmw_reg_bits(bits, bits, inst, idx); +} + +static inline u32 am33xx_cm_clear_reg_bits(u32 bits, s16 inst, s16 idx) +{ +	return am33xx_cm_rmw_reg_bits(bits, 0x0, inst, idx); +} + +static inline u32 am33xx_cm_read_reg_bits(u16 inst, s16 idx, u32 mask) +{ +	u32 v; + +	v = am33xx_cm_read_reg(inst, idx); +	v &= mask; +	v >>= __ffs(mask); + +	return v; +} + +/** + * _clkctrl_idlest - read a CM_*_CLKCTRL register; mask & shift IDLEST bitfield + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * + * Return the IDLEST bitfield of a CM_*_CLKCTRL register, shifted down to + * bit 0. + */ +static u32 _clkctrl_idlest(u16 inst, s16 cdoffs, u16 clkctrl_offs) +{ +	u32 v = am33xx_cm_read_reg(inst, clkctrl_offs); +	v &= AM33XX_IDLEST_MASK; +	v >>= AM33XX_IDLEST_SHIFT; +	return v; +} + +/** + * _is_module_ready - can module registers be accessed without causing an abort? + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * + * Returns true if the module's CM_*_CLKCTRL.IDLEST bitfield is either + * *FUNCTIONAL or *INTERFACE_IDLE; false otherwise. + */ +static bool _is_module_ready(u16 inst, s16 cdoffs, u16 clkctrl_offs) +{ +	u32 v; + +	v = _clkctrl_idlest(inst, cdoffs, clkctrl_offs); + +	return (v == CLKCTRL_IDLEST_FUNCTIONAL || +		v == CLKCTRL_IDLEST_INTERFACE_IDLE) ? true : false; +} + +/** + * _clktrctrl_write - write @c to a CM_CLKSTCTRL.CLKTRCTRL register bitfield + * @c: CLKTRCTRL register bitfield (LSB = bit 0, i.e., unshifted) + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * + * @c must be the unshifted value for CLKTRCTRL - i.e., this function + * will handle the shift itself. + */ +static void _clktrctrl_write(u8 c, s16 inst, u16 cdoffs) +{ +	u32 v; + +	v = am33xx_cm_read_reg(inst, cdoffs); +	v &= ~AM33XX_CLKTRCTRL_MASK; +	v |= c << AM33XX_CLKTRCTRL_SHIFT; +	am33xx_cm_write_reg(v, inst, cdoffs); +} + +/* Public functions */ + +/** + * am33xx_cm_is_clkdm_in_hwsup - is a clockdomain in hwsup idle mode? + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * + * Returns true if the clockdomain referred to by (@inst, @cdoffs) + * is in hardware-supervised idle mode, or 0 otherwise. + */ +bool am33xx_cm_is_clkdm_in_hwsup(s16 inst, u16 cdoffs) +{ +	u32 v; + +	v = am33xx_cm_read_reg(inst, cdoffs); +	v &= AM33XX_CLKTRCTRL_MASK; +	v >>= AM33XX_CLKTRCTRL_SHIFT; + +	return (v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ? true : false; +} + +/** + * am33xx_cm_clkdm_enable_hwsup - put a clockdomain in hwsup-idle mode + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * + * Put a clockdomain referred to by (@inst, @cdoffs) into + * hardware-supervised idle mode.  No return value. + */ +void am33xx_cm_clkdm_enable_hwsup(s16 inst, u16 cdoffs) +{ +	_clktrctrl_write(OMAP34XX_CLKSTCTRL_ENABLE_AUTO, inst, cdoffs); +} + +/** + * am33xx_cm_clkdm_disable_hwsup - put a clockdomain in swsup-idle mode + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * + * Put a clockdomain referred to by (@inst, @cdoffs) into + * software-supervised idle mode, i.e., controlled manually by the + * Linux OMAP clockdomain code.  No return value. + */ +void am33xx_cm_clkdm_disable_hwsup(s16 inst, u16 cdoffs) +{ +	_clktrctrl_write(OMAP34XX_CLKSTCTRL_DISABLE_AUTO, inst, cdoffs); +} + +/** + * am33xx_cm_clkdm_force_sleep - try to put a clockdomain into idle + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * + * Put a clockdomain referred to by (@inst, @cdoffs) into idle + * No return value. + */ +void am33xx_cm_clkdm_force_sleep(s16 inst, u16 cdoffs) +{ +	_clktrctrl_write(OMAP34XX_CLKSTCTRL_FORCE_SLEEP, inst, cdoffs); +} + +/** + * am33xx_cm_clkdm_force_wakeup - try to take a clockdomain out of idle + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * + * Take a clockdomain referred to by (@inst, @cdoffs) out of idle, + * waking it up.  No return value. + */ +void am33xx_cm_clkdm_force_wakeup(s16 inst, u16 cdoffs) +{ +	_clktrctrl_write(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, inst, cdoffs); +} + +/* + * + */ + +/** + * am33xx_cm_wait_module_ready - wait for a module to be in 'func' state + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * + * Wait for the module IDLEST to be functional. If the idle state is in any + * the non functional state (trans, idle or disabled), module and thus the + * sysconfig cannot be accessed and will probably lead to an "imprecise + * external abort" + */ +int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, u16 clkctrl_offs) +{ +	int i = 0; + +	if (!clkctrl_offs) +		return 0; + +	omap_test_timeout(_is_module_ready(inst, cdoffs, clkctrl_offs), +			  MAX_MODULE_READY_TIME, i); + +	return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; +} + +/** + * am33xx_cm_wait_module_idle - wait for a module to be in 'disabled' + * state + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * + * Wait for the module IDLEST to be disabled. Some PRCM transition, + * like reset assertion or parent clock de-activation must wait the + * module to be fully disabled. + */ +int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, u16 clkctrl_offs) +{ +	int i = 0; + +	if (!clkctrl_offs) +		return 0; + +	omap_test_timeout((_clkctrl_idlest(inst, cdoffs, clkctrl_offs) == +				CLKCTRL_IDLEST_DISABLED), +				MAX_MODULE_READY_TIME, i); + +	return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; +} + +/** + * am33xx_cm_module_enable - Enable the modulemode inside CLKCTRL + * @mode: Module mode (SW or HW) + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * + * No return value. + */ +void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, u16 clkctrl_offs) +{ +	u32 v; + +	v = am33xx_cm_read_reg(inst, clkctrl_offs); +	v &= ~AM33XX_MODULEMODE_MASK; +	v |= mode << AM33XX_MODULEMODE_SHIFT; +	am33xx_cm_write_reg(v, inst, clkctrl_offs); +} + +/** + * am33xx_cm_module_disable - Disable the module inside CLKCTRL + * @inst: CM instance register offset (*_INST macro) + * @cdoffs: Clockdomain register offset (*_CDOFFS macro) + * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * + * No return value. + */ +void am33xx_cm_module_disable(u16 inst, s16 cdoffs, u16 clkctrl_offs) +{ +	u32 v; + +	v = am33xx_cm_read_reg(inst, clkctrl_offs); +	v &= ~AM33XX_MODULEMODE_MASK; +	am33xx_cm_write_reg(v, inst, clkctrl_offs); +} diff --git a/arch/arm/mach-omap2/cm33xx.h b/arch/arm/mach-omap2/cm33xx.h new file mode 100644 index 00000000000..5fa0b62e1a7 --- /dev/null +++ b/arch/arm/mach-omap2/cm33xx.h @@ -0,0 +1,420 @@ +/* + * AM33XX CM offset macros + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * Vaibhav Hiremath <hvaibhav@ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __ARCH_ARM_MACH_OMAP2_CM_33XX_H +#define __ARCH_ARM_MACH_OMAP2_CM_33XX_H + +#include <linux/delay.h> +#include <linux/errno.h> +#include <linux/err.h> +#include <linux/io.h> + +#include "common.h" + +#include "cm.h" +#include "cm-regbits-33xx.h" +#include "cm33xx.h" + +/* CM base address */ +#define AM33XX_CM_BASE		0x44e00000 + +#define AM33XX_CM_REGADDR(inst, reg)				\ +	AM33XX_L4_WK_IO_ADDRESS(AM33XX_CM_BASE + (inst) + (reg)) + +/* CM instances */ +#define AM33XX_CM_PER_MOD		0x0000 +#define AM33XX_CM_WKUP_MOD		0x0400 +#define AM33XX_CM_DPLL_MOD		0x0500 +#define AM33XX_CM_MPU_MOD		0x0600 +#define AM33XX_CM_DEVICE_MOD		0x0700 +#define AM33XX_CM_RTC_MOD		0x0800 +#define AM33XX_CM_GFX_MOD		0x0900 +#define AM33XX_CM_CEFUSE_MOD		0x0A00 + +/* CM */ + +/* CM.PER_CM register offsets */ +#define AM33XX_CM_PER_L4LS_CLKSTCTRL_OFFSET		0x0000 +#define AM33XX_CM_PER_L4LS_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0000) +#define AM33XX_CM_PER_L3S_CLKSTCTRL_OFFSET		0x0004 +#define AM33XX_CM_PER_L3S_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0004) +#define AM33XX_CM_PER_L4FW_CLKSTCTRL_OFFSET		0x0008 +#define AM33XX_CM_PER_L4FW_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0008) +#define AM33XX_CM_PER_L3_CLKSTCTRL_OFFSET		0x000c +#define AM33XX_CM_PER_L3_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x000c) +#define AM33XX_CM_PER_CPGMAC0_CLKCTRL_OFFSET		0x0014 +#define AM33XX_CM_PER_CPGMAC0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0014) +#define AM33XX_CM_PER_LCDC_CLKCTRL_OFFSET		0x0018 +#define AM33XX_CM_PER_LCDC_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0018) +#define AM33XX_CM_PER_USB0_CLKCTRL_OFFSET		0x001c +#define AM33XX_CM_PER_USB0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x001c) +#define AM33XX_CM_PER_MLB_CLKCTRL_OFFSET		0x0020 +#define AM33XX_CM_PER_MLB_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0020) +#define AM33XX_CM_PER_TPTC0_CLKCTRL_OFFSET		0x0024 +#define AM33XX_CM_PER_TPTC0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0024) +#define AM33XX_CM_PER_EMIF_CLKCTRL_OFFSET		0x0028 +#define AM33XX_CM_PER_EMIF_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0028) +#define AM33XX_CM_PER_OCMCRAM_CLKCTRL_OFFSET		0x002c +#define AM33XX_CM_PER_OCMCRAM_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x002c) +#define AM33XX_CM_PER_GPMC_CLKCTRL_OFFSET		0x0030 +#define AM33XX_CM_PER_GPMC_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0030) +#define AM33XX_CM_PER_MCASP0_CLKCTRL_OFFSET		0x0034 +#define AM33XX_CM_PER_MCASP0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0034) +#define AM33XX_CM_PER_UART5_CLKCTRL_OFFSET		0x0038 +#define AM33XX_CM_PER_UART5_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0038) +#define AM33XX_CM_PER_MMC0_CLKCTRL_OFFSET		0x003c +#define AM33XX_CM_PER_MMC0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x003c) +#define AM33XX_CM_PER_ELM_CLKCTRL_OFFSET		0x0040 +#define AM33XX_CM_PER_ELM_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0040) +#define AM33XX_CM_PER_I2C2_CLKCTRL_OFFSET		0x0044 +#define AM33XX_CM_PER_I2C2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0044) +#define AM33XX_CM_PER_I2C1_CLKCTRL_OFFSET		0x0048 +#define AM33XX_CM_PER_I2C1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0048) +#define AM33XX_CM_PER_SPI0_CLKCTRL_OFFSET		0x004c +#define AM33XX_CM_PER_SPI0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x004c) +#define AM33XX_CM_PER_SPI1_CLKCTRL_OFFSET		0x0050 +#define AM33XX_CM_PER_SPI1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0050) +#define AM33XX_CM_PER_SPI2_CLKCTRL_OFFSET		0x0054 +#define AM33XX_CM_PER_SPI2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0054) +#define AM33XX_CM_PER_SPI3_CLKCTRL_OFFSET		0x0058 +#define AM33XX_CM_PER_SPI3_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0058) +#define AM33XX_CM_PER_L4LS_CLKCTRL_OFFSET		0x0060 +#define AM33XX_CM_PER_L4LS_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0060) +#define AM33XX_CM_PER_L4FW_CLKCTRL_OFFSET		0x0064 +#define AM33XX_CM_PER_L4FW_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0064) +#define AM33XX_CM_PER_MCASP1_CLKCTRL_OFFSET		0x0068 +#define AM33XX_CM_PER_MCASP1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0068) +#define AM33XX_CM_PER_UART1_CLKCTRL_OFFSET		0x006c +#define AM33XX_CM_PER_UART1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x006c) +#define AM33XX_CM_PER_UART2_CLKCTRL_OFFSET		0x0070 +#define AM33XX_CM_PER_UART2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0070) +#define AM33XX_CM_PER_UART3_CLKCTRL_OFFSET		0x0074 +#define AM33XX_CM_PER_UART3_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0074) +#define AM33XX_CM_PER_UART4_CLKCTRL_OFFSET		0x0078 +#define AM33XX_CM_PER_UART4_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0078) +#define AM33XX_CM_PER_TIMER7_CLKCTRL_OFFSET		0x007c +#define AM33XX_CM_PER_TIMER7_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x007c) +#define AM33XX_CM_PER_TIMER2_CLKCTRL_OFFSET		0x0080 +#define AM33XX_CM_PER_TIMER2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0080) +#define AM33XX_CM_PER_TIMER3_CLKCTRL_OFFSET		0x0084 +#define AM33XX_CM_PER_TIMER3_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0084) +#define AM33XX_CM_PER_TIMER4_CLKCTRL_OFFSET		0x0088 +#define AM33XX_CM_PER_TIMER4_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0088) +#define AM33XX_CM_PER_MCASP2_CLKCTRL_OFFSET		0x008c +#define AM33XX_CM_PER_MCASP2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x008c) +#define AM33XX_CM_PER_RNG_CLKCTRL_OFFSET		0x0090 +#define AM33XX_CM_PER_RNG_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0090) +#define AM33XX_CM_PER_AES0_CLKCTRL_OFFSET		0x0094 +#define AM33XX_CM_PER_AES0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0094) +#define AM33XX_CM_PER_AES1_CLKCTRL_OFFSET		0x0098 +#define AM33XX_CM_PER_AES1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0098) +#define AM33XX_CM_PER_DES_CLKCTRL_OFFSET		0x009c +#define AM33XX_CM_PER_DES_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x009c) +#define AM33XX_CM_PER_SHA0_CLKCTRL_OFFSET		0x00a0 +#define AM33XX_CM_PER_SHA0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00a0) +#define AM33XX_CM_PER_PKA_CLKCTRL_OFFSET		0x00a4 +#define AM33XX_CM_PER_PKA_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00a4) +#define AM33XX_CM_PER_GPIO6_CLKCTRL_OFFSET		0x00a8 +#define AM33XX_CM_PER_GPIO6_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00a8) +#define AM33XX_CM_PER_GPIO1_CLKCTRL_OFFSET		0x00ac +#define AM33XX_CM_PER_GPIO1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00ac) +#define AM33XX_CM_PER_GPIO2_CLKCTRL_OFFSET		0x00b0 +#define AM33XX_CM_PER_GPIO2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00b0) +#define AM33XX_CM_PER_GPIO3_CLKCTRL_OFFSET		0x00b4 +#define AM33XX_CM_PER_GPIO3_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00b4) +#define AM33XX_CM_PER_GPIO4_CLKCTRL_OFFSET		0x00b8 +#define AM33XX_CM_PER_GPIO4_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00b8) +#define AM33XX_CM_PER_TPCC_CLKCTRL_OFFSET		0x00bc +#define AM33XX_CM_PER_TPCC_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00bc) +#define AM33XX_CM_PER_DCAN0_CLKCTRL_OFFSET		0x00c0 +#define AM33XX_CM_PER_DCAN0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00c0) +#define AM33XX_CM_PER_DCAN1_CLKCTRL_OFFSET		0x00c4 +#define AM33XX_CM_PER_DCAN1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00c4) +#define AM33XX_CM_PER_EPWMSS1_CLKCTRL_OFFSET		0x00cc +#define AM33XX_CM_PER_EPWMSS1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00cc) +#define AM33XX_CM_PER_EMIF_FW_CLKCTRL_OFFSET		0x00d0 +#define AM33XX_CM_PER_EMIF_FW_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00d0) +#define AM33XX_CM_PER_EPWMSS0_CLKCTRL_OFFSET		0x00d4 +#define AM33XX_CM_PER_EPWMSS0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00d4) +#define AM33XX_CM_PER_EPWMSS2_CLKCTRL_OFFSET		0x00d8 +#define AM33XX_CM_PER_EPWMSS2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00d8) +#define AM33XX_CM_PER_L3_INSTR_CLKCTRL_OFFSET		0x00dc +#define AM33XX_CM_PER_L3_INSTR_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00dc) +#define AM33XX_CM_PER_L3_CLKCTRL_OFFSET			0x00e0 +#define AM33XX_CM_PER_L3_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00e0) +#define AM33XX_CM_PER_IEEE5000_CLKCTRL_OFFSET		0x00e4 +#define AM33XX_CM_PER_IEEE5000_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00e4) +#define AM33XX_CM_PER_PRUSS_CLKCTRL_OFFSET		0x00e8 +#define AM33XX_CM_PER_PRUSS_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00e8) +#define AM33XX_CM_PER_TIMER5_CLKCTRL_OFFSET		0x00ec +#define AM33XX_CM_PER_TIMER5_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00ec) +#define AM33XX_CM_PER_TIMER6_CLKCTRL_OFFSET		0x00f0 +#define AM33XX_CM_PER_TIMER6_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00f0) +#define AM33XX_CM_PER_MMC1_CLKCTRL_OFFSET		0x00f4 +#define AM33XX_CM_PER_MMC1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00f4) +#define AM33XX_CM_PER_MMC2_CLKCTRL_OFFSET		0x00f8 +#define AM33XX_CM_PER_MMC2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00f8) +#define AM33XX_CM_PER_TPTC1_CLKCTRL_OFFSET		0x00fc +#define AM33XX_CM_PER_TPTC1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x00fc) +#define AM33XX_CM_PER_TPTC2_CLKCTRL_OFFSET		0x0100 +#define AM33XX_CM_PER_TPTC2_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0100) +#define AM33XX_CM_PER_GPIO5_CLKCTRL_OFFSET		0x0104 +#define AM33XX_CM_PER_GPIO5_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0104) +#define AM33XX_CM_PER_SPINLOCK_CLKCTRL_OFFSET		0x010c +#define AM33XX_CM_PER_SPINLOCK_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x010c) +#define AM33XX_CM_PER_MAILBOX0_CLKCTRL_OFFSET		0x0110 +#define AM33XX_CM_PER_MAILBOX0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0110) +#define AM33XX_CM_PER_L4HS_CLKSTCTRL_OFFSET		0x011c +#define AM33XX_CM_PER_L4HS_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x011c) +#define AM33XX_CM_PER_L4HS_CLKCTRL_OFFSET		0x0120 +#define AM33XX_CM_PER_L4HS_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0120) +#define AM33XX_CM_PER_MSTR_EXPS_CLKCTRL_OFFSET		0x0124 +#define AM33XX_CM_PER_MSTR_EXPS_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0124) +#define AM33XX_CM_PER_SLV_EXPS_CLKCTRL_OFFSET		0x0128 +#define AM33XX_CM_PER_SLV_EXPS_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0128) +#define AM33XX_CM_PER_OCPWP_L3_CLKSTCTRL_OFFSET		0x012c +#define AM33XX_CM_PER_OCPWP_L3_CLKSTCTRL		AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x012c) +#define AM33XX_CM_PER_OCPWP_CLKCTRL_OFFSET		0x0130 +#define AM33XX_CM_PER_OCPWP_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0130) +#define AM33XX_CM_PER_MAILBOX1_CLKCTRL_OFFSET		0x0134 +#define AM33XX_CM_PER_MAILBOX1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0134) +#define AM33XX_CM_PER_PRUSS_CLKSTCTRL_OFFSET		0x0140 +#define AM33XX_CM_PER_PRUSS_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0140) +#define AM33XX_CM_PER_CPSW_CLKSTCTRL_OFFSET		0x0144 +#define AM33XX_CM_PER_CPSW_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0144) +#define AM33XX_CM_PER_LCDC_CLKSTCTRL_OFFSET		0x0148 +#define AM33XX_CM_PER_LCDC_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0148) +#define AM33XX_CM_PER_CLKDIV32K_CLKCTRL_OFFSET		0x014c +#define AM33XX_CM_PER_CLKDIV32K_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x014c) +#define AM33XX_CM_PER_CLK_24MHZ_CLKSTCTRL_OFFSET	0x0150 +#define AM33XX_CM_PER_CLK_24MHZ_CLKSTCTRL		AM33XX_CM_REGADDR(AM33XX_CM_PER_MOD, 0x0150) + +/* CM.WKUP_CM register offsets */ +#define AM33XX_CM_WKUP_CLKSTCTRL_OFFSET			0x0000 +#define AM33XX_CM_WKUP_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0000) +#define AM33XX_CM_WKUP_CONTROL_CLKCTRL_OFFSET		0x0004 +#define AM33XX_CM_WKUP_CONTROL_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0004) +#define AM33XX_CM_WKUP_GPIO0_CLKCTRL_OFFSET		0x0008 +#define AM33XX_CM_WKUP_GPIO0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0008) +#define AM33XX_CM_WKUP_L4WKUP_CLKCTRL_OFFSET		0x000c +#define AM33XX_CM_WKUP_L4WKUP_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x000c) +#define AM33XX_CM_WKUP_TIMER0_CLKCTRL_OFFSET		0x0010 +#define AM33XX_CM_WKUP_TIMER0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0010) +#define AM33XX_CM_WKUP_DEBUGSS_CLKCTRL_OFFSET		0x0014 +#define AM33XX_CM_WKUP_DEBUGSS_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0014) +#define AM33XX_CM_L3_AON_CLKSTCTRL_OFFSET		0x0018 +#define AM33XX_CM_L3_AON_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0018) +#define AM33XX_CM_AUTOIDLE_DPLL_MPU_OFFSET		0x001c +#define AM33XX_CM_AUTOIDLE_DPLL_MPU			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x001c) +#define AM33XX_CM_IDLEST_DPLL_MPU_OFFSET		0x0020 +#define AM33XX_CM_IDLEST_DPLL_MPU			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0020) +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_MPU_OFFSET	0x0024 +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_MPU		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0024) +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_MPU_OFFSET	0x0028 +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_MPU		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0028) +#define AM33XX_CM_CLKSEL_DPLL_MPU_OFFSET		0x002c +#define AM33XX_CM_CLKSEL_DPLL_MPU			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x002c) +#define AM33XX_CM_AUTOIDLE_DPLL_DDR_OFFSET		0x0030 +#define AM33XX_CM_AUTOIDLE_DPLL_DDR			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0030) +#define AM33XX_CM_IDLEST_DPLL_DDR_OFFSET		0x0034 +#define AM33XX_CM_IDLEST_DPLL_DDR			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0034) +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_DDR_OFFSET	0x0038 +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_DDR		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0038) +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_DDR_OFFSET	0x003c +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_DDR		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x003c) +#define AM33XX_CM_CLKSEL_DPLL_DDR_OFFSET		0x0040 +#define AM33XX_CM_CLKSEL_DPLL_DDR			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0040) +#define AM33XX_CM_AUTOIDLE_DPLL_DISP_OFFSET		0x0044 +#define AM33XX_CM_AUTOIDLE_DPLL_DISP			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0044) +#define AM33XX_CM_IDLEST_DPLL_DISP_OFFSET		0x0048 +#define AM33XX_CM_IDLEST_DPLL_DISP			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0048) +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_DISP_OFFSET	0x004c +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_DISP		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x004c) +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_DISP_OFFSET	0x0050 +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_DISP		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0050) +#define AM33XX_CM_CLKSEL_DPLL_DISP_OFFSET		0x0054 +#define AM33XX_CM_CLKSEL_DPLL_DISP			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0054) +#define AM33XX_CM_AUTOIDLE_DPLL_CORE_OFFSET		0x0058 +#define AM33XX_CM_AUTOIDLE_DPLL_CORE			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0058) +#define AM33XX_CM_IDLEST_DPLL_CORE_OFFSET		0x005c +#define AM33XX_CM_IDLEST_DPLL_CORE			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x005c) +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_CORE_OFFSET	0x0060 +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_CORE		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0060) +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_CORE_OFFSET	0x0064 +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_CORE		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0064) +#define AM33XX_CM_CLKSEL_DPLL_CORE_OFFSET		0x0068 +#define AM33XX_CM_CLKSEL_DPLL_CORE			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0068) +#define AM33XX_CM_AUTOIDLE_DPLL_PER_OFFSET		0x006c +#define AM33XX_CM_AUTOIDLE_DPLL_PER			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x006c) +#define AM33XX_CM_IDLEST_DPLL_PER_OFFSET		0x0070 +#define AM33XX_CM_IDLEST_DPLL_PER			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0070) +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_PER_OFFSET	0x0074 +#define AM33XX_CM_SSC_DELTAMSTEP_DPLL_PER		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0074) +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_PER_OFFSET	0x0078 +#define AM33XX_CM_SSC_MODFREQDIV_DPLL_PER		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0078) +#define AM33XX_CM_CLKDCOLDO_DPLL_PER_OFFSET		0x007c +#define AM33XX_CM_CLKDCOLDO_DPLL_PER			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x007c) +#define AM33XX_CM_DIV_M4_DPLL_CORE_OFFSET		0x0080 +#define AM33XX_CM_DIV_M4_DPLL_CORE			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0080) +#define AM33XX_CM_DIV_M5_DPLL_CORE_OFFSET		0x0084 +#define AM33XX_CM_DIV_M5_DPLL_CORE			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0084) +#define AM33XX_CM_CLKMODE_DPLL_MPU_OFFSET		0x0088 +#define AM33XX_CM_CLKMODE_DPLL_MPU			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0088) +#define AM33XX_CM_CLKMODE_DPLL_PER_OFFSET		0x008c +#define AM33XX_CM_CLKMODE_DPLL_PER			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x008c) +#define AM33XX_CM_CLKMODE_DPLL_CORE_OFFSET		0x0090 +#define AM33XX_CM_CLKMODE_DPLL_CORE			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0090) +#define AM33XX_CM_CLKMODE_DPLL_DDR_OFFSET		0x0094 +#define AM33XX_CM_CLKMODE_DPLL_DDR			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0094) +#define AM33XX_CM_CLKMODE_DPLL_DISP_OFFSET		0x0098 +#define AM33XX_CM_CLKMODE_DPLL_DISP			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x0098) +#define AM33XX_CM_CLKSEL_DPLL_PERIPH_OFFSET		0x009c +#define AM33XX_CM_CLKSEL_DPLL_PERIPH			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x009c) +#define AM33XX_CM_DIV_M2_DPLL_DDR_OFFSET		0x00a0 +#define AM33XX_CM_DIV_M2_DPLL_DDR			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00a0) +#define AM33XX_CM_DIV_M2_DPLL_DISP_OFFSET		0x00a4 +#define AM33XX_CM_DIV_M2_DPLL_DISP			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00a4) +#define AM33XX_CM_DIV_M2_DPLL_MPU_OFFSET		0x00a8 +#define AM33XX_CM_DIV_M2_DPLL_MPU			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00a8) +#define AM33XX_CM_DIV_M2_DPLL_PER_OFFSET		0x00ac +#define AM33XX_CM_DIV_M2_DPLL_PER			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00ac) +#define AM33XX_CM_WKUP_WKUP_M3_CLKCTRL_OFFSET		0x00b0 +#define AM33XX_CM_WKUP_WKUP_M3_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00b0) +#define AM33XX_CM_WKUP_UART0_CLKCTRL_OFFSET		0x00b4 +#define AM33XX_CM_WKUP_UART0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00b4) +#define AM33XX_CM_WKUP_I2C0_CLKCTRL_OFFSET		0x00b8 +#define AM33XX_CM_WKUP_I2C0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00b8) +#define AM33XX_CM_WKUP_ADC_TSC_CLKCTRL_OFFSET		0x00bc +#define AM33XX_CM_WKUP_ADC_TSC_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00bc) +#define AM33XX_CM_WKUP_SMARTREFLEX0_CLKCTRL_OFFSET	0x00c0 +#define AM33XX_CM_WKUP_SMARTREFLEX0_CLKCTRL		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00c0) +#define AM33XX_CM_WKUP_TIMER1_CLKCTRL_OFFSET		0x00c4 +#define AM33XX_CM_WKUP_TIMER1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00c4) +#define AM33XX_CM_WKUP_SMARTREFLEX1_CLKCTRL_OFFSET	0x00c8 +#define AM33XX_CM_WKUP_SMARTREFLEX1_CLKCTRL		AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00c8) +#define AM33XX_CM_L4_WKUP_AON_CLKSTCTRL_OFFSET		0x00cc +#define AM33XX_CM_L4_WKUP_AON_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00cc) +#define AM33XX_CM_WKUP_WDT0_CLKCTRL_OFFSET		0x00d0 +#define AM33XX_CM_WKUP_WDT0_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00d0) +#define AM33XX_CM_WKUP_WDT1_CLKCTRL_OFFSET		0x00d4 +#define AM33XX_CM_WKUP_WDT1_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00d4) +#define AM33XX_CM_DIV_M6_DPLL_CORE_OFFSET		0x00d8 +#define AM33XX_CM_DIV_M6_DPLL_CORE			AM33XX_CM_REGADDR(AM33XX_CM_WKUP_MOD, 0x00d8) + +/* CM.DPLL_CM register offsets */ +#define AM33XX_CLKSEL_TIMER7_CLK_OFFSET			0x0004 +#define AM33XX_CLKSEL_TIMER7_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0004) +#define AM33XX_CLKSEL_TIMER2_CLK_OFFSET			0x0008 +#define AM33XX_CLKSEL_TIMER2_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0008) +#define AM33XX_CLKSEL_TIMER3_CLK_OFFSET			0x000c +#define AM33XX_CLKSEL_TIMER3_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x000c) +#define AM33XX_CLKSEL_TIMER4_CLK_OFFSET			0x0010 +#define AM33XX_CLKSEL_TIMER4_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0010) +#define AM33XX_CM_MAC_CLKSEL_OFFSET			0x0014 +#define AM33XX_CM_MAC_CLKSEL				AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0014) +#define AM33XX_CLKSEL_TIMER5_CLK_OFFSET			0x0018 +#define AM33XX_CLKSEL_TIMER5_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0018) +#define AM33XX_CLKSEL_TIMER6_CLK_OFFSET			0x001c +#define AM33XX_CLKSEL_TIMER6_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x001c) +#define AM33XX_CM_CPTS_RFT_CLKSEL_OFFSET		0x0020 +#define AM33XX_CM_CPTS_RFT_CLKSEL			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0020) +#define AM33XX_CLKSEL_TIMER1MS_CLK_OFFSET		0x0028 +#define AM33XX_CLKSEL_TIMER1MS_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0028) +#define AM33XX_CLKSEL_GFX_FCLK_OFFSET			0x002c +#define AM33XX_CLKSEL_GFX_FCLK				AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x002c) +#define AM33XX_CLKSEL_PRUSS_OCP_CLK_OFFSET		0x0030 +#define AM33XX_CLKSEL_PRUSS_OCP_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0030) +#define AM33XX_CLKSEL_LCDC_PIXEL_CLK_OFFSET		0x0034 +#define AM33XX_CLKSEL_LCDC_PIXEL_CLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0034) +#define AM33XX_CLKSEL_WDT1_CLK_OFFSET			0x0038 +#define AM33XX_CLKSEL_WDT1_CLK				AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x0038) +#define AM33XX_CLKSEL_GPIO0_DBCLK_OFFSET		0x003c +#define AM33XX_CLKSEL_GPIO0_DBCLK			AM33XX_CM_REGADDR(AM33XX_CM_DPLL_MOD, 0x003c) + +/* CM.MPU_CM register offsets */ +#define AM33XX_CM_MPU_CLKSTCTRL_OFFSET			0x0000 +#define AM33XX_CM_MPU_CLKSTCTRL				AM33XX_CM_REGADDR(AM33XX_CM_MPU_MOD, 0x0000) +#define AM33XX_CM_MPU_MPU_CLKCTRL_OFFSET		0x0004 +#define AM33XX_CM_MPU_MPU_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_MPU_MOD, 0x0004) + +/* CM.DEVICE_CM register offsets */ +#define AM33XX_CM_CLKOUT_CTRL_OFFSET			0x0000 +#define AM33XX_CM_CLKOUT_CTRL				AM33XX_CM_REGADDR(AM33XX_CM_DEVICE_MOD, 0x0000) + +/* CM.RTC_CM register offsets */ +#define AM33XX_CM_RTC_RTC_CLKCTRL_OFFSET		0x0000 +#define AM33XX_CM_RTC_RTC_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_RTC_MOD, 0x0000) +#define AM33XX_CM_RTC_CLKSTCTRL_OFFSET			0x0004 +#define AM33XX_CM_RTC_CLKSTCTRL				AM33XX_CM_REGADDR(AM33XX_CM_RTC_MOD, 0x0004) + +/* CM.GFX_CM register offsets */ +#define AM33XX_CM_GFX_L3_CLKSTCTRL_OFFSET		0x0000 +#define AM33XX_CM_GFX_L3_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_GFX_MOD, 0x0000) +#define AM33XX_CM_GFX_GFX_CLKCTRL_OFFSET		0x0004 +#define AM33XX_CM_GFX_GFX_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_GFX_MOD, 0x0004) +#define AM33XX_CM_GFX_BITBLT_CLKCTRL_OFFSET		0x0008 +#define AM33XX_CM_GFX_BITBLT_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_GFX_MOD, 0x0008) +#define AM33XX_CM_GFX_L4LS_GFX_CLKSTCTRL__1_OFFSET	0x000c +#define AM33XX_CM_GFX_L4LS_GFX_CLKSTCTRL__1		AM33XX_CM_REGADDR(AM33XX_CM_GFX_MOD, 0x000c) +#define AM33XX_CM_GFX_MMUCFG_CLKCTRL_OFFSET		0x0010 +#define AM33XX_CM_GFX_MMUCFG_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_GFX_MOD, 0x0010) +#define AM33XX_CM_GFX_MMUDATA_CLKCTRL_OFFSET		0x0014 +#define AM33XX_CM_GFX_MMUDATA_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_GFX_MOD, 0x0014) + +/* CM.CEFUSE_CM register offsets */ +#define AM33XX_CM_CEFUSE_CLKSTCTRL_OFFSET		0x0000 +#define AM33XX_CM_CEFUSE_CLKSTCTRL			AM33XX_CM_REGADDR(AM33XX_CM_CEFUSE_MOD, 0x0000) +#define AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL_OFFSET		0x0020 +#define AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL			AM33XX_CM_REGADDR(AM33XX_CM_CEFUSE_MOD, 0x0020) + + +extern bool am33xx_cm_is_clkdm_in_hwsup(s16 inst, u16 cdoffs); +extern void am33xx_cm_clkdm_enable_hwsup(s16 inst, u16 cdoffs); +extern void am33xx_cm_clkdm_disable_hwsup(s16 inst, u16 cdoffs); +extern void am33xx_cm_clkdm_force_sleep(s16 inst, u16 cdoffs); +extern void am33xx_cm_clkdm_force_wakeup(s16 inst, u16 cdoffs); + +#ifdef CONFIG_SOC_AM33XX +extern int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, +					u16 clkctrl_offs); +extern void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, +					u16 clkctrl_offs); +extern void am33xx_cm_module_disable(u16 inst, s16 cdoffs, +					u16 clkctrl_offs); +extern int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, +					u16 clkctrl_offs); +#else +static inline int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, +					u16 clkctrl_offs) +{ +	return 0; +} +static inline void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, +					u16 clkctrl_offs) +{ +} +static inline void am33xx_cm_module_disable(u16 inst, s16 cdoffs, +					u16 clkctrl_offs) +{ +} +static inline int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, +					u16 clkctrl_offs) +{ +	return 0; +} +#endif + +#endif diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index 1a39945d9ff..1894015ff04 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c @@ -235,20 +235,6 @@ void omap4_cminst_clkdm_disable_hwsup(u8 part, s16 inst, u16 cdoffs)  }  /** - * omap4_cminst_clkdm_force_sleep - try to put a clockdomain into idle - * @part: PRCM partition ID that the clockdomain registers exist in - * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro) - * - * Put a clockdomain referred to by (@part, @inst, @cdoffs) into idle - * No return value. - */ -void omap4_cminst_clkdm_force_sleep(u8 part, s16 inst, u16 cdoffs) -{ -	_clktrctrl_write(OMAP34XX_CLKSTCTRL_FORCE_SLEEP, part, inst, cdoffs); -} - -/**   * omap4_cminst_clkdm_force_sleep - try to take a clockdomain out of idle   * @part: PRCM partition ID that the clockdomain registers exist in   * @inst: CM instance register offset (*_INST macro) diff --git a/arch/arm/mach-omap2/cminst44xx.h b/arch/arm/mach-omap2/cminst44xx.h index a018a732787..d69fdefef98 100644 --- a/arch/arm/mach-omap2/cminst44xx.h +++ b/arch/arm/mach-omap2/cminst44xx.h @@ -16,38 +16,13 @@ extern void omap4_cminst_clkdm_enable_hwsup(u8 part, s16 inst, u16 cdoffs);  extern void omap4_cminst_clkdm_disable_hwsup(u8 part, s16 inst, u16 cdoffs);  extern void omap4_cminst_clkdm_force_sleep(u8 part, s16 inst, u16 cdoffs);  extern void omap4_cminst_clkdm_force_wakeup(u8 part, s16 inst, u16 cdoffs); -  extern int omap4_cminst_wait_module_ready(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs); - -# ifdef CONFIG_ARCH_OMAP4  extern int omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs,  					 u16 clkctrl_offs); -  extern void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs,  				       u16 clkctrl_offs);  extern void omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs,  					u16 clkctrl_offs); - -# else - -static inline int omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, -					u16 clkctrl_offs) -{ -	return 0; -} - -static inline void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, -				s16 cdoffs, u16 clkctrl_offs) -{ -} - -static inline void omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs, -				 u16 clkctrl_offs) -{ -} - -# endif -  /*   * In an ideal world, we would not export these low-level functions,   * but this will probably take some time to fix properly diff --git a/arch/arm/mach-omap2/common-board-devices.c b/arch/arm/mach-omap2/common-board-devices.c index 1706ebcec08..14734746457 100644 --- a/arch/arm/mach-omap2/common-board-devices.c +++ b/arch/arm/mach-omap2/common-board-devices.c @@ -35,6 +35,16 @@ static struct omap2_mcspi_device_config ads7846_mcspi_config = {  	.turbo_mode	= 0,  }; +/* + * ADS7846 driver maybe request a gpio according to the value + * of pdata->get_pendown_state, but we have done this. So set + * get_pendown_state to avoid twice gpio requesting. + */ +static int omap3_get_pendown_state(void) +{ +	return !gpio_get_value(OMAP3_EVM_TS_GPIO); +} +  static struct ads7846_platform_data ads7846_config = {  	.x_max			= 0x0fff,  	.y_max			= 0x0fff, @@ -45,6 +55,7 @@ static struct ads7846_platform_data ads7846_config = {  	.debounce_rep		= 1,  	.gpio_pendown		= -EINVAL,  	.keep_vref_on		= 1, +	.get_pendown_state	= &omap3_get_pendown_state,  };  static struct spi_board_info ads7846_spi_board_info __initdata = { @@ -63,28 +74,30 @@ void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,  	struct spi_board_info *spi_bi = &ads7846_spi_board_info;  	int err; -	if (board_pdata && board_pdata->get_pendown_state) { -		err = gpio_request_one(gpio_pendown, GPIOF_IN, "TSPenDown"); -		if (err) { -			pr_err("Couldn't obtain gpio for TSPenDown: %d\n", err); -			return; -		} -		gpio_export(gpio_pendown, 0); - -		if (gpio_debounce) -			gpio_set_debounce(gpio_pendown, gpio_debounce); +	err = gpio_request_one(gpio_pendown, GPIOF_IN, "TSPenDown"); +	if (err) { +		pr_err("Couldn't obtain gpio for TSPenDown: %d\n", err); +		return;  	} +	if (gpio_debounce) +		gpio_set_debounce(gpio_pendown, gpio_debounce); +  	spi_bi->bus_num	= bus_num;  	spi_bi->irq	= gpio_to_irq(gpio_pendown);  	if (board_pdata) {  		board_pdata->gpio_pendown = gpio_pendown;  		spi_bi->platform_data = board_pdata; +		if (board_pdata->get_pendown_state) +			gpio_export(gpio_pendown, 0);  	} else {  		ads7846_config.gpio_pendown = gpio_pendown;  	} +	if (!board_pdata || (board_pdata && !board_pdata->get_pendown_state)) +		gpio_free(gpio_pendown); +  	spi_register_board_info(&ads7846_spi_board_info, 1);  }  #else diff --git a/arch/arm/mach-omap2/common-board-devices.h b/arch/arm/mach-omap2/common-board-devices.h index a0b4a42836a..4c4ef6a6166 100644 --- a/arch/arm/mach-omap2/common-board-devices.h +++ b/arch/arm/mach-omap2/common-board-devices.h @@ -4,6 +4,7 @@  #include "twl-common.h"  #define NAND_BLOCK_SIZE	SZ_128K +#define OMAP3_EVM_TS_GPIO	175  struct mtd_partition;  struct ads7846_platform_data; diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 8a6953a34fe..069f9725b1c 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c @@ -29,8 +29,6 @@  /* Global address base setup code */ -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -  static void __init __omap2_set_globals(struct omap_globals *omap2_globals)  {  	omap2_set_globals_tap(omap2_globals); @@ -39,8 +37,6 @@ static void __init __omap2_set_globals(struct omap_globals *omap2_globals)  	omap2_set_globals_prcm(omap2_globals);  } -#endif -  #if defined(CONFIG_SOC_OMAP2420)  static struct omap_globals omap242x_globals = { @@ -134,7 +130,9 @@ void __init ti81xx_map_io(void)  {  	omapti81xx_map_common_io();  } +#endif +#if defined(CONFIG_SOC_AM33XX)  #define AM33XX_TAP_BASE		(AM33XX_CTRL_BASE + \  				TI81XX_CONTROL_DEVICE_ID - 0x204) @@ -171,9 +169,7 @@ static struct omap_globals omap4_globals = {  void __init omap2_set_globals_443x(void)  { -	omap2_set_globals_tap(&omap4_globals); -	omap2_set_globals_control(&omap4_globals); -	omap2_set_globals_prcm(&omap4_globals); +	__omap2_set_globals(&omap4_globals);  }  void __init omap4_map_io(void) @@ -182,3 +178,27 @@ void __init omap4_map_io(void)  }  #endif +#if defined(CONFIG_SOC_OMAP5) +static struct omap_globals omap5_globals = { +	.class	= OMAP54XX_CLASS, +	.tap	= OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE), +	.ctrl	= OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE), +	.ctrl_pad	= OMAP2_L4_IO_ADDRESS(OMAP54XX_CTRL_BASE), +	.prm	= OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE), +	.cm	= OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_AON_BASE), +	.cm2	= OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE), +	.prcm_mpu = OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE), +}; + +void __init omap2_set_globals_5xxx(void) +{ +	omap2_set_globals_tap(&omap5_globals); +	omap2_set_globals_control(&omap5_globals); +	omap2_set_globals_prcm(&omap5_globals); +} + +void __init omap5_map_io(void) +{ +	omap5_map_common_io(); +} +#endif diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index be9dfd1abe6..1f65b1871c2 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -115,12 +115,22 @@ static inline int omap_mux_late_init(void)  }  #endif +#ifdef CONFIG_SOC_OMAP5 +extern void omap5_map_common_io(void); +#else +static inline void omap5_map_common_io(void) +{ +} +#endif +  extern void omap2_init_common_infrastructure(void);  extern struct sys_timer omap2_timer;  extern struct sys_timer omap3_timer;  extern struct sys_timer omap3_secure_timer; +extern struct sys_timer omap3_am33xx_timer;  extern struct sys_timer omap4_timer; +extern struct sys_timer omap5_timer;  void omap2420_init_early(void);  void omap2430_init_early(void); @@ -128,9 +138,12 @@ void omap3430_init_early(void);  void omap35xx_init_early(void);  void omap3630_init_early(void);  void omap3_init_early(void);	/* Do not use this one */ +void am33xx_init_early(void);  void am35xx_init_early(void);  void ti81xx_init_early(void); +void am33xx_init_early(void);  void omap4430_init_early(void); +void omap5_init_early(void);  void omap3_init_late(void);	/* Do not use this one */  void omap4430_init_late(void);  void omap2420_init_late(void); @@ -166,12 +179,18 @@ void omap2_set_globals_242x(void);  void omap2_set_globals_243x(void);  void omap2_set_globals_3xxx(void);  void omap2_set_globals_443x(void); +void omap2_set_globals_5xxx(void);  void omap2_set_globals_ti81xx(void);  void omap2_set_globals_am33xx(void);  /* These get called from omap2_set_globals_xxxx(), do not call these */  void omap2_set_globals_tap(struct omap_globals *); +#if defined(CONFIG_SOC_HAS_OMAP2_SDRC)  void omap2_set_globals_sdrc(struct omap_globals *); +#else +static inline void omap2_set_globals_sdrc(struct omap_globals *omap2_globals) +{ } +#endif  void omap2_set_globals_control(struct omap_globals *);  void omap2_set_globals_prcm(struct omap_globals *); @@ -180,6 +199,7 @@ void omap243x_map_io(void);  void omap3_map_io(void);  void am33xx_map_io(void);  void omap4_map_io(void); +void omap5_map_io(void);  void ti81xx_map_io(void);  void omap_barriers_init(void); @@ -219,6 +239,8 @@ void omap3_intc_prepare_idle(void);  void omap3_intc_resume_idle(void);  void omap2_intc_handle_irq(struct pt_regs *regs);  void omap3_intc_handle_irq(struct pt_regs *regs); +void omap_intc_of_init(void); +void omap_gic_of_init(void);  #ifdef CONFIG_CACHE_L2X0  extern void __iomem *omap4_get_l2cache_base(void); @@ -226,10 +248,10 @@ extern void __iomem *omap4_get_l2cache_base(void);  struct device_node;  #ifdef CONFIG_OF -int __init omap_intc_of_init(struct device_node *node, +int __init intc_of_init(struct device_node *node,  			     struct device_node *parent);  #else -int __init omap_intc_of_init(struct device_node *node, +int __init intc_of_init(struct device_node *node,  			     struct device_node *parent)  {  	return 0; @@ -256,6 +278,7 @@ extern void omap_secondary_startup(void);  extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask);  extern void omap_auxcoreboot_addr(u32 cpu_addr);  extern u32 omap_read_auxcoreboot0(void); +extern void omap5_secondary_startup(void);  #endif  #if defined(CONFIG_SMP) && defined(CONFIG_PM) diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c index 08e674bb041..3223b81e753 100644 --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c @@ -241,6 +241,49 @@ void omap3_ctrl_write_boot_mode(u8 bootmode)  #endif +/** + * omap_ctrl_write_dsp_boot_addr - set boot address for a remote processor + * @bootaddr: physical address of the boot loader + * + * Set boot address for the boot loader of a supported processor + * when a power ON sequence occurs. + */ +void omap_ctrl_write_dsp_boot_addr(u32 bootaddr) +{ +	u32 offset = cpu_is_omap243x() ? OMAP243X_CONTROL_IVA2_BOOTADDR : +		     cpu_is_omap34xx() ? OMAP343X_CONTROL_IVA2_BOOTADDR : +		     cpu_is_omap44xx() ? OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR : +		     0; + +	if (!offset) { +		pr_err("%s: unsupported omap type\n", __func__); +		return; +	} + +	omap_ctrl_writel(bootaddr, offset); +} + +/** + * omap_ctrl_write_dsp_boot_mode - set boot mode for a remote processor + * @bootmode: 8-bit value to pass to some boot code + * + * Sets boot mode for the boot loader of a supported processor + * when a power ON sequence occurs. + */ +void omap_ctrl_write_dsp_boot_mode(u8 bootmode) +{ +	u32 offset = cpu_is_omap243x() ? OMAP243X_CONTROL_IVA2_BOOTMOD : +		     cpu_is_omap34xx() ? OMAP343X_CONTROL_IVA2_BOOTMOD : +		     0; + +	if (!offset) { +		pr_err("%s: unsupported omap type\n", __func__); +		return; +	} + +	omap_ctrl_writel(bootmode, offset); +} +  #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)  /*   * Clears the scratchpad contents in case of cold boot- diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h index a406fd045ce..b8cdc8531b6 100644 --- a/arch/arm/mach-omap2/control.h +++ b/arch/arm/mach-omap2/control.h @@ -21,6 +21,8 @@  #include <mach/ctrl_module_pad_core_44xx.h>  #include <mach/ctrl_module_pad_wkup_44xx.h> +#include <plat/am33xx.h> +  #ifndef __ASSEMBLY__  #define OMAP242X_CTRL_REGADDR(reg)					\  		OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg)) @@ -28,6 +30,8 @@  		OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))  #define OMAP343X_CTRL_REGADDR(reg)					\  		OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg)) +#define AM33XX_CTRL_REGADDR(reg)					\ +		AM33XX_L4_WK_IO_ADDRESS(AM33XX_SCM_BASE + (reg))  #else  #define OMAP242X_CTRL_REGADDR(reg)					\  		OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg)) @@ -35,6 +39,8 @@  		OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))  #define OMAP343X_CTRL_REGADDR(reg)					\  		OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg)) +#define AM33XX_CTRL_REGADDR(reg)					\ +		AM33XX_L4_WK_IO_ADDRESS(AM33XX_SCM_BASE + (reg))  #endif /* __ASSEMBLY__ */  /* @@ -182,6 +188,7 @@  #define OMAP3630_CONTROL_FUSE_OPP120_VDD1       (OMAP2_CONTROL_GENERAL + 0x0120)  #define OMAP3630_CONTROL_FUSE_OPP50_VDD2        (OMAP2_CONTROL_GENERAL + 0x0128)  #define OMAP3630_CONTROL_FUSE_OPP100_VDD2       (OMAP2_CONTROL_GENERAL + 0x012C) +#define OMAP3630_CONTROL_CAMERA_PHY_CTRL	(OMAP2_CONTROL_GENERAL + 0x02f0)  /* OMAP44xx control efuse offsets */  #define OMAP44XX_CONTROL_FUSE_IVA_OPP50		0x22C @@ -246,6 +253,10 @@  /* TI81XX CONTROL_DEVCONF register offsets */  #define TI81XX_CONTROL_DEVICE_ID	(TI81XX_CONTROL_DEVCONF + 0x000) +/* OMAP54XX CONTROL STATUS register */ +#define OMAP5XXX_CONTROL_STATUS                0x134 +#define OMAP5_DEVICETYPE_MASK          (0x7 << 6) +  /*   * REVISIT: This list of registers is not comprehensive - there are more   * that should be added. @@ -312,15 +323,15 @@  						OMAP343X_SCRATCHPAD + reg)  /* AM35XX_CONTROL_IPSS_CLK_CTRL bits */ -#define AM35XX_USBOTG_VBUSP_CLK_SHIFT   0 -#define AM35XX_CPGMAC_VBUSP_CLK_SHIFT   1 -#define AM35XX_VPFE_VBUSP_CLK_SHIFT     2 -#define AM35XX_HECC_VBUSP_CLK_SHIFT     3 -#define AM35XX_USBOTG_FCLK_SHIFT        8 -#define AM35XX_CPGMAC_FCLK_SHIFT        9 -#define AM35XX_VPFE_FCLK_SHIFT          10 +#define AM35XX_USBOTG_VBUSP_CLK_SHIFT	0 +#define AM35XX_CPGMAC_VBUSP_CLK_SHIFT	1 +#define AM35XX_VPFE_VBUSP_CLK_SHIFT	2 +#define AM35XX_HECC_VBUSP_CLK_SHIFT	3 +#define AM35XX_USBOTG_FCLK_SHIFT	8 +#define AM35XX_CPGMAC_FCLK_SHIFT	9 +#define AM35XX_VPFE_FCLK_SHIFT		10 -/*AM35XX CONTROL_LVL_INTR_CLEAR bits*/ +/* AM35XX CONTROL_LVL_INTR_CLEAR bits */  #define AM35XX_CPGMAC_C0_MISC_PULSE_CLR	BIT(0)  #define AM35XX_CPGMAC_C0_RX_PULSE_CLR	BIT(1)  #define AM35XX_CPGMAC_C0_RX_THRESH_CLR	BIT(2) @@ -330,21 +341,22 @@  #define AM35XX_VPFE_CCDC_VD1_INT_CLR	BIT(6)  #define AM35XX_VPFE_CCDC_VD2_INT_CLR	BIT(7) -/*AM35XX CONTROL_IP_SW_RESET bits*/ +/* AM35XX CONTROL_IP_SW_RESET bits */  #define AM35XX_USBOTGSS_SW_RST		BIT(0)  #define AM35XX_CPGMACSS_SW_RST		BIT(1)  #define AM35XX_VPFE_VBUSP_SW_RST	BIT(2)  #define AM35XX_HECC_SW_RST		BIT(3)  #define AM35XX_VPFE_PCLK_SW_RST		BIT(4) -/* - * CONTROL AM33XX STATUS register - */ +/* AM33XX CONTROL_STATUS register */  #define AM33XX_CONTROL_STATUS		0x040 +#define AM33XX_CONTROL_SEC_CLK_CTRL	0x1bc -/* - * CONTROL OMAP STATUS register to identify OMAP3 features - */ +/* AM33XX CONTROL_STATUS bitfields (partial) */ +#define AM33XX_CONTROL_STATUS_SYSBOOT1_SHIFT		22 +#define AM33XX_CONTROL_STATUS_SYSBOOT1_MASK		(0x3 << 22) + +/* CONTROL OMAP STATUS register to identify OMAP3 features */  #define OMAP3_CONTROL_OMAP_STATUS	0x044c  #define OMAP3_SGX_SHIFT			13 @@ -397,6 +409,8 @@ extern u32 omap3_arm_context[128];  extern void omap3_control_save_context(void);  extern void omap3_control_restore_context(void);  extern void omap3_ctrl_write_boot_mode(u8 bootmode); +extern void omap_ctrl_write_dsp_boot_addr(u32 bootaddr); +extern void omap_ctrl_write_dsp_boot_mode(u8 bootmode);  extern void omap3630_ctrl_disable_rta(void);  extern int omap3_ctrl_save_padconf(void);  #else diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index 207bc1c7759..f2a49a48ef5 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c @@ -36,8 +36,6 @@  #include "control.h"  #include "common.h" -#ifdef CONFIG_CPU_IDLE -  /* Mach specific information to be recorded in the C-state driver_data */  struct omap3_idle_statedata {  	u32 mpu_state; @@ -77,20 +75,6 @@ static struct omap3_idle_statedata omap3_idle_data[] = {  static struct powerdomain *mpu_pd, *core_pd, *per_pd, *cam_pd; -static int _cpuidle_allow_idle(struct powerdomain *pwrdm, -				struct clockdomain *clkdm) -{ -	clkdm_allow_idle(clkdm); -	return 0; -} - -static int _cpuidle_deny_idle(struct powerdomain *pwrdm, -				struct clockdomain *clkdm) -{ -	clkdm_deny_idle(clkdm); -	return 0; -} -  static int __omap3_enter_idle(struct cpuidle_device *dev,  				struct cpuidle_driver *drv,  				int index) @@ -108,8 +92,8 @@ static int __omap3_enter_idle(struct cpuidle_device *dev,  	/* Deny idle for C1 */  	if (index == 0) { -		pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle); -		pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle); +		clkdm_deny_idle(mpu_pd->pwrdm_clkdms[0]); +		clkdm_deny_idle(core_pd->pwrdm_clkdms[0]);  	}  	/* @@ -131,8 +115,8 @@ static int __omap3_enter_idle(struct cpuidle_device *dev,  	/* Re-allow idle for C1 */  	if (index == 0) { -		pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle); -		pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle); +		clkdm_allow_idle(mpu_pd->pwrdm_clkdms[0]); +		clkdm_allow_idle(core_pd->pwrdm_clkdms[0]);  	}  return_sleep_time: @@ -178,7 +162,7 @@ static int next_valid_state(struct cpuidle_device *dev,  	u32 mpu_deepest_state = PWRDM_POWER_RET;  	u32 core_deepest_state = PWRDM_POWER_RET;  	int idx; -	int next_index = -1; +	int next_index = 0; /* C1 is the default value */  	if (enable_off_mode) {  		mpu_deepest_state = PWRDM_POWER_OFF; @@ -209,12 +193,6 @@ static int next_valid_state(struct cpuidle_device *dev,  		}  	} -	/* -	 * C1 is always valid. -	 * So, no need to check for 'next_index == -1' outside -	 * this loop. -	 */ -  	return next_index;  } @@ -228,23 +206,22 @@ static int next_valid_state(struct cpuidle_device *dev,   * the device to the specified or a safer state.   */  static int omap3_enter_idle_bm(struct cpuidle_device *dev, -				struct cpuidle_driver *drv, +			       struct cpuidle_driver *drv,  			       int index)  {  	int new_state_idx; -	u32 core_next_state, per_next_state = 0, per_saved_state = 0, cam_state; +	u32 core_next_state, per_next_state = 0, per_saved_state = 0;  	struct omap3_idle_statedata *cx;  	int ret;  	/* -	 * Prevent idle completely if CAM is active. +	 * Use only C1 if CAM is active.  	 * CAM does not have wakeup capability in OMAP3.  	 */ -	cam_state = pwrdm_read_pwrst(cam_pd); -	if (cam_state == PWRDM_POWER_ON) { +	if (pwrdm_read_pwrst(cam_pd) == PWRDM_POWER_ON)  		new_state_idx = drv->safe_state_index; -		goto select_state; -	} +	else +		new_state_idx = next_valid_state(dev, drv, index);  	/*  	 * FIXME: we currently manage device-specific idle states @@ -254,24 +231,28 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,  	 *        its own code.  	 */ -	/* -	 * Prevent PER off if CORE is not in retention or off as this -	 * would disable PER wakeups completely. -	 */ -	cx = &omap3_idle_data[index]; +	/* Program PER state */ +	cx = &omap3_idle_data[new_state_idx];  	core_next_state = cx->core_state;  	per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd); -	if ((per_next_state == PWRDM_POWER_OFF) && -	    (core_next_state > PWRDM_POWER_RET)) -		per_next_state = PWRDM_POWER_RET; +	if (new_state_idx == 0) { +		/* In C1 do not allow PER state lower than CORE state */ +		if (per_next_state < core_next_state) +			per_next_state = core_next_state; +	} else { +		/* +		 * Prevent PER OFF if CORE is not in RETention or OFF as this +		 * would disable PER wakeups completely. +		 */ +		if ((per_next_state == PWRDM_POWER_OFF) && +		    (core_next_state > PWRDM_POWER_RET)) +			per_next_state = PWRDM_POWER_RET; +	}  	/* Are we changing PER target state? */  	if (per_next_state != per_saved_state)  		pwrdm_set_next_pwrst(per_pd, per_next_state); -	new_state_idx = next_valid_state(dev, drv, index); - -select_state:  	ret = omap3_enter_idle(dev, drv, new_state_idx);  	/* Restore original PER state if it was modified */ @@ -288,7 +269,7 @@ struct cpuidle_driver omap3_idle_driver = {  	.owner = 	THIS_MODULE,  	.states = {  		{ -			.enter		  = omap3_enter_idle, +			.enter		  = omap3_enter_idle_bm,  			.exit_latency	  = 2 + 2,  			.target_residency = 5,  			.flags		  = CPUIDLE_FLAG_TIME_VALID, @@ -379,9 +360,3 @@ int __init omap3_idle_init(void)  	return 0;  } -#else -int __init omap3_idle_init(void) -{ -	return 0; -} -#endif /* CONFIG_CPU_IDLE */ diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c index 45e6a54d581..ee05e193fc6 100644 --- a/arch/arm/mach-omap2/cpuidle44xx.c +++ b/arch/arm/mach-omap2/cpuidle44xx.c @@ -23,8 +23,6 @@  #include "prm.h"  #include "clockdomain.h" -#ifdef CONFIG_CPU_IDLE -  /* Machine specific information */  struct omap4_idle_statedata {  	u32 cpu_state; @@ -252,9 +250,3 @@ int __init omap4_idle_init(void)  	return 0;  } -#else -int __init omap4_idle_init(void) -{ -	return 0; -} -#endif /* CONFIG_CPU_IDLE */ diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 7b4b9327e54..c00c68961bb 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -27,7 +27,6 @@  #include "iomap.h"  #include <plat/board.h> -#include <plat/mmc.h>  #include <plat/dma.h>  #include <plat/omap_hwmod.h>  #include <plat/omap_device.h> @@ -84,7 +83,7 @@ static int __init omap4_l3_init(void)  	 * To avoid code running on other OMAPs in  	 * multi-omap builds  	 */ -	if (!(cpu_is_omap44xx())) +	if (!cpu_is_omap44xx() && !soc_is_omap54xx())  		return -ENODEV;  	for (i = 0; i < L3_MODULES; i++) { @@ -603,112 +602,6 @@ static inline void omap_init_aes(void) { }  /*-------------------------------------------------------------------------*/ -#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) - -static inline void omap242x_mmc_mux(struct omap_mmc_platform_data -							*mmc_controller) -{ -	if ((mmc_controller->slots[0].switch_pin > 0) && \ -		(mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES)) -		omap_mux_init_gpio(mmc_controller->slots[0].switch_pin, -					OMAP_PIN_INPUT_PULLUP); -	if ((mmc_controller->slots[0].gpio_wp > 0) && \ -		(mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES)) -		omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp, -					OMAP_PIN_INPUT_PULLUP); - -	omap_mux_init_signal("sdmmc_cmd", 0); -	omap_mux_init_signal("sdmmc_clki", 0); -	omap_mux_init_signal("sdmmc_clko", 0); -	omap_mux_init_signal("sdmmc_dat0", 0); -	omap_mux_init_signal("sdmmc_dat_dir0", 0); -	omap_mux_init_signal("sdmmc_cmd_dir", 0); -	if (mmc_controller->slots[0].caps & MMC_CAP_4_BIT_DATA) { -		omap_mux_init_signal("sdmmc_dat1", 0); -		omap_mux_init_signal("sdmmc_dat2", 0); -		omap_mux_init_signal("sdmmc_dat3", 0); -		omap_mux_init_signal("sdmmc_dat_dir1", 0); -		omap_mux_init_signal("sdmmc_dat_dir2", 0); -		omap_mux_init_signal("sdmmc_dat_dir3", 0); -	} - -	/* -	 * Use internal loop-back in MMC/SDIO Module Input Clock -	 * selection -	 */ -	if (mmc_controller->slots[0].internal_clock) { -		u32 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); -		v |= (1 << 24); -		omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); -	} -} - -void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) -{ -	struct platform_device *pdev; -	struct omap_hwmod *oh; -	int id = 0; -	char *oh_name = "msdi1"; -	char *dev_name = "mmci-omap"; - -	if (!mmc_data[0]) { -		pr_err("%s fails: Incomplete platform data\n", __func__); -		return; -	} - -	omap242x_mmc_mux(mmc_data[0]); - -	oh = omap_hwmod_lookup(oh_name); -	if (!oh) { -		pr_err("Could not look up %s\n", oh_name); -		return; -	} -	pdev = omap_device_build(dev_name, id, oh, mmc_data[0], -				 sizeof(struct omap_mmc_platform_data), NULL, 0, 0); -	if (IS_ERR(pdev)) -		WARN(1, "Can'd build omap_device for %s:%s.\n", -					dev_name, oh->name); -} - -#endif - -/*-------------------------------------------------------------------------*/ - -#if defined(CONFIG_HDQ_MASTER_OMAP) || defined(CONFIG_HDQ_MASTER_OMAP_MODULE) -#define OMAP_HDQ_BASE	0x480B2000 -static struct resource omap_hdq_resources[] = { -	{ -		.start		= OMAP_HDQ_BASE, -		.end		= OMAP_HDQ_BASE + 0x1C, -		.flags		= IORESOURCE_MEM, -	}, -	{ -		.start		= INT_24XX_HDQ_IRQ, -		.flags		= IORESOURCE_IRQ, -	}, -}; -static struct platform_device omap_hdq_dev = { -	.name = "omap_hdq", -	.id = 0, -	.dev = { -		.platform_data = NULL, -	}, -	.num_resources	= ARRAY_SIZE(omap_hdq_resources), -	.resource	= omap_hdq_resources, -}; -static inline void omap_hdq_init(void) -{ -	if (cpu_is_omap2420()) -		return; - -	platform_device_register(&omap_hdq_dev); -} -#else -static inline void omap_hdq_init(void) {} -#endif - -/*---------------------------------------------------------------------------*/ -  #if defined(CONFIG_VIDEO_OMAP2_VOUT) || \  	defined(CONFIG_VIDEO_OMAP2_VOUT_MODULE)  #if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) @@ -753,7 +646,6 @@ static int __init omap2_init_devices(void)  		omap_init_mcspi();  	}  	omap_init_pmu(); -	omap_hdq_init();  	omap_init_sti();  	omap_init_sham();  	omap_init_aes(); @@ -772,7 +664,7 @@ static int __init omap_init_wdt(void)  	char *oh_name = "wd_timer2";  	char *dev_name = "omap_wdt"; -	if (!cpu_class_is_omap2()) +	if (!cpu_class_is_omap2() || of_have_populated_dt())  		return 0;  	oh = omap_hwmod_lookup(oh_name); diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 5fb47a14f4b..af1ed7d24a1 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c @@ -37,6 +37,7 @@  #define DISPC_CONTROL		0x0040  #define DISPC_CONTROL2		0x0238 +#define DISPC_CONTROL3		0x0848  #define DISPC_IRQSTATUS		0x0018  #define DSS_SYSCONFIG		0x10 @@ -52,6 +53,7 @@  #define EVSYNC_EVEN_IRQ_SHIFT	2  #define EVSYNC_ODD_IRQ_SHIFT	3  #define FRAMEDONE2_IRQ_SHIFT	22 +#define FRAMEDONE3_IRQ_SHIFT	30  #define FRAMEDONETV_IRQ_SHIFT	24  /* @@ -376,7 +378,7 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)  static void dispc_disable_outputs(void)  {  	u32 v, irq_mask = 0; -	bool lcd_en, digit_en, lcd2_en = false; +	bool lcd_en, digit_en, lcd2_en = false, lcd3_en = false;  	int i;  	struct omap_dss_dispc_dev_attr *da;  	struct omap_hwmod *oh; @@ -405,7 +407,13 @@ static void dispc_disable_outputs(void)  		lcd2_en = v & LCD_EN_MASK;  	} -	if (!(lcd_en | digit_en | lcd2_en)) +	/* store value of LCDENABLE for LCD3 */ +	if (da->manager_count > 3) { +		v = omap_hwmod_read(oh, DISPC_CONTROL3); +		lcd3_en = v & LCD_EN_MASK; +	} + +	if (!(lcd_en | digit_en | lcd2_en | lcd3_en))  		return; /* no managers currently enabled */  	/* @@ -426,10 +434,12 @@ static void dispc_disable_outputs(void)  	if (lcd2_en)  		irq_mask |= 1 << FRAMEDONE2_IRQ_SHIFT; +	if (lcd3_en) +		irq_mask |= 1 << FRAMEDONE3_IRQ_SHIFT;  	/*  	 * clear any previous FRAMEDONE, FRAMEDONETV, -	 * EVSYNC_EVEN/ODD or FRAMEDONE2 interrupts +	 * EVSYNC_EVEN/ODD, FRAMEDONE2 or FRAMEDONE3 interrupts  	 */  	omap_hwmod_write(irq_mask, oh, DISPC_IRQSTATUS); @@ -445,12 +455,19 @@ static void dispc_disable_outputs(void)  		omap_hwmod_write(v, oh, DISPC_CONTROL2);  	} +	/* disable LCD3 manager */ +	if (da->manager_count > 3) { +		v = omap_hwmod_read(oh, DISPC_CONTROL3); +		v &= ~LCD_EN_MASK; +		omap_hwmod_write(v, oh, DISPC_CONTROL3); +	} +  	i = 0;  	while ((omap_hwmod_read(oh, DISPC_IRQSTATUS) & irq_mask) !=  	       irq_mask) {  		i++;  		if (i > FRAMEDONE_IRQ_TIMEOUT) { -			pr_err("didn't get FRAMEDONE1/2 or TV interrupt\n"); +			pr_err("didn't get FRAMEDONE1/2/3 or TV interrupt\n");  			break;  		}  		mdelay(1); diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index f0f10beeffe..b9c8d2f6a81 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c @@ -135,11 +135,20 @@ static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n)   */  static int _omap3_noncore_dpll_lock(struct clk *clk)  { +	const struct dpll_data *dd;  	u8 ai; -	int r; +	u8 state = 1; +	int r = 0;  	pr_debug("clock: locking DPLL %s\n", clk->name); +	dd = clk->dpll_data; +	state <<= __ffs(dd->idlest_mask); + +	/* Check if already locked */ +	if ((__raw_readl(dd->idlest_reg) & dd->idlest_mask) == state) +		goto done; +  	ai = omap3_dpll_autoidle_read(clk);  	if (ai) @@ -152,6 +161,7 @@ static int _omap3_noncore_dpll_lock(struct clk *clk)  	if (ai)  		omap3_dpll_allow_idle(clk); +done:  	return r;  } @@ -628,3 +638,17 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk)  		rate = clk->parent->rate * 2;  	return rate;  } + +/* OMAP3/4 non-CORE DPLL clkops */ + +const struct clkops clkops_omap3_noncore_dpll_ops = { +	.enable		= omap3_noncore_dpll_enable, +	.disable	= omap3_noncore_dpll_disable, +	.allow_idle	= omap3_dpll_allow_idle, +	.deny_idle	= omap3_dpll_deny_idle, +}; + +const struct clkops clkops_omap3_core_dpll_ops = { +	.allow_idle	= omap3_dpll_allow_idle, +	.deny_idle	= omap3_dpll_deny_idle, +}; diff --git a/arch/arm/mach-omap2/drm.c b/arch/arm/mach-omap2/drm.c new file mode 100644 index 00000000000..72e0f01b715 --- /dev/null +++ b/arch/arm/mach-omap2/drm.c @@ -0,0 +1,61 @@ +/* + * DRM/KMS device registration for TI OMAP platforms + * + * Copyright (C) 2012 Texas Instruments + * Author: Rob Clark <rob.clark@linaro.org> + * + * 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. + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/dma-mapping.h> + +#include <plat/omap_device.h> +#include <plat/omap_hwmod.h> + +#if defined(CONFIG_DRM_OMAP) || (CONFIG_DRM_OMAP_MODULE) + +static struct platform_device omap_drm_device = { +	.dev = { +		.coherent_dma_mask = DMA_BIT_MASK(32), +	}, +	.name = "omapdrm", +	.id = 0, +}; + +static int __init omap_init_drm(void) +{ +	struct omap_hwmod *oh = NULL; +	struct platform_device *pdev; + +	/* lookup and populate the DMM information, if present - OMAP4+ */ +	oh = omap_hwmod_lookup("dmm"); + +	if (oh) { +		pdev = omap_device_build(oh->name, -1, oh, NULL, 0, NULL, 0, +					false); +		WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", +			oh->name); +	} + +	return platform_device_register(&omap_drm_device); + +} + +arch_initcall(omap_init_drm); + +#endif diff --git a/arch/arm/mach-omap2/dsp.c b/arch/arm/mach-omap2/dsp.c index 88ffa1e645c..a636ebc16b3 100644 --- a/arch/arm/mach-omap2/dsp.c +++ b/arch/arm/mach-omap2/dsp.c @@ -23,6 +23,7 @@  #include <asm/memblock.h> +#include "control.h"  #include "cm2xxx_3xxx.h"  #include "prm2xxx_3xxx.h"  #ifdef CONFIG_BRIDGE_DVFS @@ -46,6 +47,9 @@ static struct omap_dsp_platform_data omap_dsp_pdata __initdata = {  	.dsp_cm_read = omap2_cm_read_mod_reg,  	.dsp_cm_write = omap2_cm_write_mod_reg,  	.dsp_cm_rmw_bits = omap2_cm_rmw_mod_reg_bits, + +	.set_bootaddr = omap_ctrl_write_dsp_boot_addr, +	.set_bootmode = omap_ctrl_write_dsp_boot_mode,  };  static phys_addr_t omap_dsp_phys_mempool_base; diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 2286410671e..b2b5759ab0f 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c @@ -727,7 +727,8 @@ static int __init gpmc_init(void)  		ck = "gpmc_fck";  		l = OMAP34XX_GPMC_BASE;  		gpmc_irq = INT_34XX_GPMC_IRQ; -	} else if (cpu_is_omap44xx()) { +	} else if (cpu_is_omap44xx() || soc_is_omap54xx()) { +		/* Base address and irq number are same for OMAP4/5 */  		ck = "gpmc_ck";  		l = OMAP44XX_GPMC_BASE;  		gpmc_irq = OMAP44XX_IRQ_GPMC; diff --git a/arch/arm/mach-omap2/hdq1w.c b/arch/arm/mach-omap2/hdq1w.c index 297ebe03f09..cdd6dda0382 100644 --- a/arch/arm/mach-omap2/hdq1w.c +++ b/arch/arm/mach-omap2/hdq1w.c @@ -22,7 +22,13 @@   * 02110-1301 USA   */ +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/err.h> +#include <linux/platform_device.h> +  #include <plat/omap_hwmod.h> +#include <plat/omap_device.h>  #include <plat/hdq1w.h>  #include "common.h" @@ -70,3 +76,23 @@ int omap_hdq1w_reset(struct omap_hwmod *oh)  	return 0;  } + +static int __init omap_init_hdq(void) +{ +	int id = -1; +	struct platform_device *pdev; +	struct omap_hwmod *oh; +	char *oh_name = "hdq1w"; +	char *devname = "omap_hdq"; + +	oh = omap_hwmod_lookup(oh_name); +	if (!oh) +		return 0; + +	pdev = omap_device_build(devname, id, oh, NULL, 0, NULL, 0, 0); +	WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", +	     devname, oh->name); + +	return 0; +} +arch_initcall(omap_init_hdq); diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index be697d4e084..a9675d8d182 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c @@ -315,7 +315,6 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,  	mmc->slots[0].caps = c->caps;  	mmc->slots[0].pm_caps = c->pm_caps;  	mmc->slots[0].internal_clock = !c->ext_clock; -	mmc->dma_mask = 0xffffffff;  	mmc->max_freq = c->max_freq;  	if (cpu_is_omap44xx())  		mmc->reg_offset = OMAP4_MMC_REG_OFFSET; diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 00486a8564f..40373db649a 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -44,12 +44,17 @@ int omap_type(void)  	if (cpu_is_omap24xx()) {  		val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS); -	} else if (cpu_is_am33xx()) { +	} else if (soc_is_am33xx()) {  		val = omap_ctrl_readl(AM33XX_CONTROL_STATUS);  	} else if (cpu_is_omap34xx()) {  		val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);  	} else if (cpu_is_omap44xx()) {  		val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS); +	} else if (soc_is_omap54xx()) { +		val = omap_ctrl_readl(OMAP5XXX_CONTROL_STATUS); +		val &= OMAP5_DEVICETYPE_MASK; +		val >>= 6; +		goto out;  	} else {  		pr_err("Cannot detect omap type!\n");  		goto out; @@ -100,7 +105,7 @@ static u16 tap_prod_id;  void omap_get_die_id(struct omap_die_id *odi)  { -	if (cpu_is_omap44xx()) { +	if (cpu_is_omap44xx() || soc_is_omap54xx()) {  		odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_0);  		odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_1);  		odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_2); @@ -189,7 +194,7 @@ static void __init omap3_cpuinfo(void)  		cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505";  	} else if (cpu_is_ti816x()) {  		cpu_name = "TI816X"; -	} else if (cpu_is_am335x()) { +	} else if (soc_is_am335x()) {  		cpu_name =  "AM335X";  	} else if (cpu_is_ti814x()) {  		cpu_name = "TI814X"; @@ -513,6 +518,41 @@ void __init omap4xxx_check_revision(void)  		((omap_rev() >> 12) & 0xf), ((omap_rev() >> 8) & 0xf));  } +void __init omap5xxx_check_revision(void) +{ +	u32 idcode; +	u16 hawkeye; +	u8 rev; + +	idcode = read_tap_reg(OMAP_TAP_IDCODE); +	hawkeye = (idcode >> 12) & 0xffff; +	rev = (idcode >> 28) & 0xff; +	switch (hawkeye) { +	case 0xb942: +		switch (rev) { +		case 0: +		default: +			omap_revision = OMAP5430_REV_ES1_0; +		} +		break; + +	case 0xb998: +		switch (rev) { +		case 0: +		default: +			omap_revision = OMAP5432_REV_ES1_0; +		} +		break; + +	default: +		/* Unknown default to latest silicon rev as default*/ +		omap_revision = OMAP5430_REV_ES1_0; +	} + +	pr_info("OMAP%04x ES%d.0\n", +			omap_rev() >> 16, ((omap_rev() >> 12) & 0xf)); +} +  /*   * Set up things for map_io and processor detection later on. Gets called   * pretty much first thing from board init. For multi-omap, this gets diff --git a/arch/arm/mach-omap2/include/mach/am35xx.h b/arch/arm/mach-omap2/include/mach/am35xx.h index f1e13d1ca5e..95594495fcf 100644 --- a/arch/arm/mach-omap2/include/mach/am35xx.h +++ b/arch/arm/mach-omap2/include/mach/am35xx.h @@ -36,6 +36,8 @@  #define AM35XX_EMAC_CNTRL_MOD_OFFSET	(0x0)  #define AM35XX_EMAC_CNTRL_RAM_OFFSET	(0x20000)  #define AM35XX_EMAC_MDIO_OFFSET		(0x30000) +#define AM35XX_IPSS_MDIO_BASE		(AM35XX_IPSS_EMAC_BASE + \ +						AM35XX_EMAC_MDIO_OFFSET)  #define AM35XX_EMAC_CNTRL_RAM_SIZE	(0x2000)  #define AM35XX_EMAC_RAM_ADDR		(AM3517_EMAC_BASE + \  						AM3517_EMAC_CNTRL_RAM_OFFSET) diff --git a/arch/arm/mach-omap2/include/mach/ctrl_module_core_44xx.h b/arch/arm/mach-omap2/include/mach/ctrl_module_core_44xx.h index 2f7ac70a20d..01970824e0e 100644 --- a/arch/arm/mach-omap2/include/mach/ctrl_module_core_44xx.h +++ b/arch/arm/mach-omap2/include/mach/ctrl_module_core_44xx.h @@ -42,6 +42,7 @@  #define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_DPLL_1		0x0268  #define OMAP4_CTRL_MODULE_CORE_STATUS				0x02c4  #define OMAP4_CTRL_MODULE_CORE_DEV_CONF				0x0300 +#define OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR			0x0304  #define OMAP4_CTRL_MODULE_CORE_LDOVBB_IVA_VOLTAGE_CTRL		0x0314  #define OMAP4_CTRL_MODULE_CORE_LDOVBB_MPU_VOLTAGE_CTRL		0x0318  #define OMAP4_CTRL_MODULE_CORE_LDOSRAM_IVA_VOLTAGE_CTRL		0x0320 diff --git a/arch/arm/mach-omap2/include/mach/debug-macro.S b/arch/arm/mach-omap2/include/mach/debug-macro.S index cdfc2a1f0e7..93d10de7129 100644 --- a/arch/arm/mach-omap2/include/mach/debug-macro.S +++ b/arch/arm/mach-omap2/include/mach/debug-macro.S @@ -60,18 +60,20 @@ omap_uart_lsr:	.word	0  		beq	23f			@ configure OMAP2UART3  		cmp	\rp, #OMAP3UART3	@ only on 34xx  		beq	33f			@ configure OMAP3UART3 -		cmp	\rp, #OMAP4UART3	@ only on 44xx -		beq	43f			@ configure OMAP4UART3 +		cmp	\rp, #OMAP4UART3	@ only on 44xx/54xx +		beq	43f			@ configure OMAP4/5UART3  		cmp	\rp, #OMAP3UART4	@ only on 36xx  		beq	34f			@ configure OMAP3UART4 -		cmp	\rp, #OMAP4UART4	@ only on 44xx -		beq	44f			@ configure OMAP4UART4 +		cmp	\rp, #OMAP4UART4	@ only on 44xx/54xx +		beq	44f			@ configure OMAP4/5UART4  		cmp	\rp, #TI81XXUART1	@ ti81Xx UART offsets different  		beq	81f			@ configure UART1  		cmp	\rp, #TI81XXUART2	@ ti81Xx UART offsets different  		beq	82f			@ configure UART2  		cmp	\rp, #TI81XXUART3	@ ti81Xx UART offsets different  		beq	83f			@ configure UART3 +		cmp	\rp, #AM33XXUART1	@ AM33XX UART offsets different +		beq	84f			@ configure UART1  		cmp	\rp, #ZOOM_UART		@ only on zoom2/3  		beq	95f			@ configure ZOOM_UART @@ -100,7 +102,9 @@ omap_uart_lsr:	.word	0  		b	98f  83:		mov	\rp, #UART_OFFSET(TI81XX_UART3_BASE)  		b	98f - +84:		ldr	\rp, =AM33XX_UART1_BASE +		and	\rp, \rp, #0x00ffffff +		b	97f  95:		ldr	\rp, =ZOOM_UART_BASE  		str	\rp, [\tmp, #0]		@ omap_uart_phys  		ldr	\rp, =ZOOM_UART_VIRT @@ -109,6 +113,17 @@ omap_uart_lsr:	.word	0  		str	\rp, [\tmp, #8]		@ omap_uart_lsr  		b	10b +		/* AM33XX: Store both phys and virt address for the uart */ +97:		add	\rp, \rp, #0x44000000	@ phys base +		str	\rp, [\tmp, #0]		@ omap_uart_phys +		sub	\rp, \rp, #0x44000000	@ phys base +		add	\rp, \rp, #0xf9000000	@ virt base +		str	\rp, [\tmp, #4]		@ omap_uart_virt +		mov	\rp, #(UART_LSR << OMAP_PORT_SHIFT) +		str	\rp, [\tmp, #8]		@ omap_uart_lsr + +		b	10b +  		/* Store both phys and virt address for the uart */  98:		add	\rp, \rp, #0x48000000	@ phys base  		str	\rp, [\tmp, #0]		@ omap_uart_phys diff --git a/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h b/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h index 548de90b58c..b0fd16f5c39 100644 --- a/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h +++ b/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h @@ -11,15 +11,20 @@  #ifndef OMAP_ARCH_WAKEUPGEN_H  #define OMAP_ARCH_WAKEUPGEN_H +/* OMAP4 and OMAP5 has same base address */ +#define OMAP_WKUPGEN_BASE			0x48281000 +  #define OMAP_WKG_CONTROL_0			0x00  #define OMAP_WKG_ENB_A_0			0x10  #define OMAP_WKG_ENB_B_0			0x14  #define OMAP_WKG_ENB_C_0			0x18  #define OMAP_WKG_ENB_D_0			0x1c +#define OMAP_WKG_ENB_E_0			0x20  #define OMAP_WKG_ENB_A_1			0x410  #define OMAP_WKG_ENB_B_1			0x414  #define OMAP_WKG_ENB_C_1			0x418  #define OMAP_WKG_ENB_D_1			0x41c +#define OMAP_WKG_ENB_E_1			0x420  #define OMAP_AUX_CORE_BOOT_0			0x800  #define OMAP_AUX_CORE_BOOT_1			0x804  #define OMAP_PTMSYNCREQ_MASK			0xc00 @@ -28,4 +33,6 @@  #define OMAP_TIMESTAMPCYCLEHI			0xc0c  extern int __init omap_wakeupgen_init(void); +extern void __iomem *omap_get_wakeupgen_base(void); +extern int omap_secure_apis_support(void);  #endif diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 8d014ba04ab..4d2d981ff5c 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -38,6 +38,7 @@  #include "powerdomain.h"  #include "clockdomain.h"  #include "common.h" +#include "clock.h"  #include "clock2xxx.h"  #include "clock3xxx.h"  #include "clock44xx.h" @@ -233,6 +234,35 @@ static struct map_desc omap44xx_io_desc[] __initdata = {  };  #endif +#ifdef	CONFIG_SOC_OMAP5 +static struct map_desc omap54xx_io_desc[] __initdata = { +	{ +		.virtual	= L3_54XX_VIRT, +		.pfn		= __phys_to_pfn(L3_54XX_PHYS), +		.length		= L3_54XX_SIZE, +		.type		= MT_DEVICE, +	}, +	{ +		.virtual	= L4_54XX_VIRT, +		.pfn		= __phys_to_pfn(L4_54XX_PHYS), +		.length		= L4_54XX_SIZE, +		.type		= MT_DEVICE, +	}, +	{ +		.virtual	= L4_WK_54XX_VIRT, +		.pfn		= __phys_to_pfn(L4_WK_54XX_PHYS), +		.length		= L4_WK_54XX_SIZE, +		.type		= MT_DEVICE, +	}, +	{ +		.virtual	= L4_PER_54XX_VIRT, +		.pfn		= __phys_to_pfn(L4_PER_54XX_PHYS), +		.length		= L4_PER_54XX_SIZE, +		.type		= MT_DEVICE, +	}, +}; +#endif +  #ifdef CONFIG_SOC_OMAP2420  void __init omap242x_map_common_io(void)  { @@ -278,6 +308,12 @@ void __init omap44xx_map_common_io(void)  }  #endif +#ifdef CONFIG_SOC_OMAP5 +void __init omap5_map_common_io(void) +{ +	iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc)); +} +#endif  /*   * omap2_init_reprogram_sdrc - reprogram SDRC timing parameters   * @@ -477,6 +513,20 @@ void __init ti81xx_init_late(void)  }  #endif +#ifdef CONFIG_SOC_AM33XX +void __init am33xx_init_early(void) +{ +	omap2_set_globals_am33xx(); +	omap3xxx_check_revision(); +	ti81xx_check_features(); +	omap_common_init_early(); +	am33xx_voltagedomains_init(); +	am33xx_powerdomains_init(); +	am33xx_clockdomains_init(); +	am33xx_clk_init(); +} +#endif +  #ifdef CONFIG_ARCH_OMAP4  void __init omap4430_init_early(void)  { @@ -500,6 +550,15 @@ void __init omap4430_init_late(void)  }  #endif +#ifdef CONFIG_SOC_OMAP5 +void __init omap5_init_early(void) +{ +	omap2_set_globals_5xxx(); +	omap5xxx_check_revision(); +	omap_common_init_early(); +} +#endif +  void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,  				      struct omap_sdrc_params *sdrc_cs1)  { diff --git a/arch/arm/mach-omap2/iomap.h b/arch/arm/mach-omap2/iomap.h index 80b88921fab..cce2b65039f 100644 --- a/arch/arm/mach-omap2/iomap.h +++ b/arch/arm/mach-omap2/iomap.h @@ -1,6 +1,14 @@  /*   * IO mappings for OMAP2+   * + * IO definitions for TI OMAP processors and boards + * + * Copied from arch/arm/mach-sa1100/include/mach/io.h + * Copyright (C) 1997-1999 Russell King + * + * Copyright (C) 2009-2012 Texas Instruments + * Added OMAP4/5 support - Santosh Shilimkar <santosh.shilimkar@ti.com> + *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the   * Free Software Foundation; either version 2 of the License, or (at your @@ -166,4 +174,23 @@  						/* 0x49000000 --> 0xfb000000 */  #define L4_ABE_44XX_VIRT	(L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET)  #define L4_ABE_44XX_SIZE	SZ_1M +/* + * ---------------------------------------------------------------------------- + * Omap5 specific IO mapping + * ---------------------------------------------------------------------------- + */ +#define L3_54XX_PHYS		L3_54XX_BASE	/* 0x44000000 --> 0xf8000000 */ +#define L3_54XX_VIRT		(L3_54XX_PHYS + OMAP4_L3_IO_OFFSET) +#define L3_54XX_SIZE		SZ_1M + +#define L4_54XX_PHYS		L4_54XX_BASE	/* 0x4a000000 --> 0xfc000000 */ +#define L4_54XX_VIRT		(L4_54XX_PHYS + OMAP2_L4_IO_OFFSET) +#define L4_54XX_SIZE		SZ_4M + +#define L4_WK_54XX_PHYS		L4_WK_54XX_BASE	/* 0x4ae00000 --> 0xfce00000 */ +#define L4_WK_54XX_VIRT		(L4_WK_54XX_PHYS + OMAP2_L4_IO_OFFSET) +#define L4_WK_54XX_SIZE		SZ_2M +#define L4_PER_54XX_PHYS	L4_PER_54XX_BASE /* 0x48000000 --> 0xfa000000 */ +#define L4_PER_54XX_VIRT	(L4_PER_54XX_PHYS + OMAP2_L4_IO_OFFSET) +#define L4_PER_54XX_SIZE	SZ_4M diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 6038a8c84b7..bcd83db41bb 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c @@ -21,6 +21,7 @@  #include <linux/irqdomain.h>  #include <linux/of.h>  #include <linux/of_address.h> +#include <linux/of_irq.h>  #include <mach/hardware.h> @@ -258,11 +259,11 @@ asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs  	omap_intc_handle_irq(base_addr, regs);  } -int __init omap_intc_of_init(struct device_node *node, +int __init intc_of_init(struct device_node *node,  			     struct device_node *parent)  {  	struct resource res; -	u32 nr_irqs = 96; +	u32 nr_irq = 96;  	if (WARN_ON(!node))  		return -ENODEV; @@ -272,15 +273,25 @@ int __init omap_intc_of_init(struct device_node *node,  		return -EINVAL;  	} -	if (of_property_read_u32(node, "ti,intc-size", &nr_irqs)) -		pr_warn("unable to get intc-size, default to %d\n", nr_irqs); +	if (of_property_read_u32(node, "ti,intc-size", &nr_irq)) +		pr_warn("unable to get intc-size, default to %d\n", nr_irq); -	omap_init_irq(res.start, nr_irqs, of_node_get(node)); +	omap_init_irq(res.start, nr_irq, of_node_get(node));  	return 0;  } -#ifdef CONFIG_ARCH_OMAP3 +static struct of_device_id irq_match[] __initdata = { +	{ .compatible = "ti,omap2-intc", .data = intc_of_init, }, +	{ } +}; + +void __init omap_intc_of_init(void) +{ +	of_irq_init(irq_match); +} + +#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM33XX)  static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)];  void omap_intc_save_context(void) diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 19b8b677486..6875be837d9 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -83,8 +83,6 @@ static int omap2_mbox_startup(struct omap_mbox *mbox)  	l = mbox_read_reg(MAILBOX_REVISION);  	pr_debug("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f)); -	omap2_mbox_enable_irq(mbox, IRQ_RX); -  	return 0;  } diff --git a/arch/arm/mach-omap2/msdi.c b/arch/arm/mach-omap2/msdi.c index ef2a6924731..fb5bc6cf377 100644 --- a/arch/arm/mach-omap2/msdi.c +++ b/arch/arm/mach-omap2/msdi.c @@ -22,11 +22,15 @@   */  #include <linux/kernel.h> +#include <linux/err.h>  #include <plat/omap_hwmod.h> +#include <plat/omap_device.h>  #include <plat/mmc.h>  #include "common.h" +#include "control.h" +#include "mux.h"  /*   * MSDI_CON_OFFSET: offset in bytes of the MSDI IP block's CON register @@ -86,3 +90,72 @@ int omap_msdi_reset(struct omap_hwmod *oh)  	return 0;  } + +#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) + +static inline void omap242x_mmc_mux(struct omap_mmc_platform_data +				    *mmc_controller) +{ +	if ((mmc_controller->slots[0].switch_pin > 0) && \ +		(mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES)) +		omap_mux_init_gpio(mmc_controller->slots[0].switch_pin, +					OMAP_PIN_INPUT_PULLUP); +	if ((mmc_controller->slots[0].gpio_wp > 0) && \ +		(mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES)) +		omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp, +					OMAP_PIN_INPUT_PULLUP); + +	omap_mux_init_signal("sdmmc_cmd", 0); +	omap_mux_init_signal("sdmmc_clki", 0); +	omap_mux_init_signal("sdmmc_clko", 0); +	omap_mux_init_signal("sdmmc_dat0", 0); +	omap_mux_init_signal("sdmmc_dat_dir0", 0); +	omap_mux_init_signal("sdmmc_cmd_dir", 0); +	if (mmc_controller->slots[0].caps & MMC_CAP_4_BIT_DATA) { +		omap_mux_init_signal("sdmmc_dat1", 0); +		omap_mux_init_signal("sdmmc_dat2", 0); +		omap_mux_init_signal("sdmmc_dat3", 0); +		omap_mux_init_signal("sdmmc_dat_dir1", 0); +		omap_mux_init_signal("sdmmc_dat_dir2", 0); +		omap_mux_init_signal("sdmmc_dat_dir3", 0); +	} + +	/* +	 * Use internal loop-back in MMC/SDIO Module Input Clock +	 * selection +	 */ +	if (mmc_controller->slots[0].internal_clock) { +		u32 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); +		v |= (1 << 24); +		omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); +	} +} + +void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) +{ +	struct platform_device *pdev; +	struct omap_hwmod *oh; +	int id = 0; +	char *oh_name = "msdi1"; +	char *dev_name = "mmci-omap"; + +	if (!mmc_data[0]) { +		pr_err("%s fails: Incomplete platform data\n", __func__); +		return; +	} + +	omap242x_mmc_mux(mmc_data[0]); + +	oh = omap_hwmod_lookup(oh_name); +	if (!oh) { +		pr_err("Could not look up %s\n", oh_name); +		return; +	} +	pdev = omap_device_build(dev_name, id, oh, mmc_data[0], +				 sizeof(struct omap_mmc_platform_data), NULL, 0, 0); +	if (IS_ERR(pdev)) +		WARN(1, "Can'd build omap_device for %s:%s.\n", +					dev_name, oh->name); +} + +#endif diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index 503ac777a2b..502e3135aad 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S @@ -19,6 +19,27 @@  #include <linux/init.h>  	__CPUINIT + +/* Physical address needed since MMU not enabled yet on secondary core */ +#define AUX_CORE_BOOT0_PA			0x48281800 + +/* + * OMAP5 specific entry point for secondary CPU to jump from ROM + * code.  This routine also provides a holding flag into which + * secondary core is held until we're ready for it to initialise. + * The primary core will update this flag using a hardware ++ * register AuxCoreBoot0. + */ +ENTRY(omap5_secondary_startup) +wait:	ldr	r2, =AUX_CORE_BOOT0_PA	@ read from AuxCoreBoot0 +	ldr	r0, [r2] +	mov	r0, r0, lsr #5 +	mrc	p15, 0, r4, c0, c0, 5 +	and	r4, r4, #0x0f +	cmp	r0, r4 +	bne	wait +	b	secondary_startup +END(omap5_secondary_startup)  /*   * OMAP4 specific entry point for secondary CPU to jump from ROM   * code.  This routine also provides a holding flag into which diff --git a/arch/arm/mach-omap2/omap-hotplug.c b/arch/arm/mach-omap2/omap-hotplug.c index 56c345b8b93..414083b427d 100644 --- a/arch/arm/mach-omap2/omap-hotplug.c +++ b/arch/arm/mach-omap2/omap-hotplug.c @@ -17,8 +17,10 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/smp.h> +#include <linux/io.h>  #include <asm/cacheflush.h> +#include <mach/omap-wakeupgen.h>  #include "common.h" @@ -35,7 +37,8 @@ int platform_cpu_kill(unsigned int cpu)   */  void __ref platform_cpu_die(unsigned int cpu)  { -	unsigned int this_cpu; +	unsigned int boot_cpu = 0; +	void __iomem *base = omap_get_wakeupgen_base();  	flush_cache_all();  	dsb(); @@ -43,16 +46,27 @@ void __ref platform_cpu_die(unsigned int cpu)  	/*  	 * we're ready for shutdown now, so do it  	 */ -	if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0) -		pr_err("Secure clear status failed\n"); +	if (omap_secure_apis_support()) { +		if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0) +			pr_err("Secure clear status failed\n"); +	} else { +		__raw_writel(0, base + OMAP_AUX_CORE_BOOT_0); +	} +  	for (;;) {  		/*  		 * Enter into low power state  		 */  		omap4_hotplug_cpu(cpu, PWRDM_POWER_OFF); -		this_cpu = smp_processor_id(); -		if (omap_read_auxcoreboot0() == this_cpu) { + +		if (omap_secure_apis_support()) +			boot_cpu = omap_read_auxcoreboot0(); +		else +			boot_cpu = +				__raw_readl(base + OMAP_AUX_CORE_BOOT_0) >> 5; + +		if (boot_cpu == smp_processor_id()) {  			/*  			 * OK, proper wakeup, we're done  			 */ diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c index ac49384d028..1be8bcb52e9 100644 --- a/arch/arm/mach-omap2/omap-iommu.c +++ b/arch/arm/mach-omap2/omap-iommu.c @@ -73,19 +73,17 @@ static struct iommu_device omap4_devices[] = {  			.da_end = 0xFFFFF000,  		},  	}, -#if defined(CONFIG_MPU_TESLA_IOMMU)  	{  		.base = OMAP4_MMU2_BASE, -		.irq = INT_44XX_DSP_MMU, +		.irq = OMAP44XX_IRQ_TESLA_MMU,  		.pdata = {  			.name = "tesla",  			.nr_tlb_entries = 32, -			.clk_name = "tesla_ick", +			.clk_name = "dsp_fck",  			.da_start = 0x0,  			.da_end = 0xFFFFF000,  		},  	}, -#endif  };  #define NR_OMAP4_IOMMU_DEVICES ARRAY_SIZE(omap4_devices)  static struct platform_device *omap4_iommu_pdev[NR_OMAP4_IOMMU_DEVICES]; diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c index 13670aa84e5..637a1bdf2ac 100644 --- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c +++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c @@ -255,7 +255,7 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)  		return -ENXIO;  	} -	pwrdm_pre_transition(); +	pwrdm_pre_transition(NULL);  	/*  	 * Check MPUSS next state and save interrupt controller if needed. @@ -287,7 +287,7 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)  	wakeup_cpu = smp_processor_id();  	set_cpu_next_pwrst(wakeup_cpu, PWRDM_POWER_ON); -	pwrdm_post_transition(); +	pwrdm_post_transition(NULL);  	return 0;  } @@ -313,7 +313,7 @@ int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)  	scu_pwrst_prepare(cpu, power_state);  	/* -	 * CPU never retuns back if targetted power state is OFF mode. +	 * CPU never retuns back if targeted power state is OFF mode.  	 * CPU ONLINE follows normal CPU ONLINE ptah via  	 * omap_secondary_startup().  	 */ diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index deffbf1c962..9a35adf9123 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c @@ -26,11 +26,19 @@  #include <mach/hardware.h>  #include <mach/omap-secure.h> +#include <mach/omap-wakeupgen.h> +#include <asm/cputype.h>  #include "iomap.h"  #include "common.h"  #include "clockdomain.h" +#define CPU_MASK		0xff0ffff0 +#define CPU_CORTEX_A9		0x410FC090 +#define CPU_CORTEX_A15		0x410FC0F0 + +#define OMAP5_CORE_COUNT	0x2 +  /* SCU base address */  static void __iomem *scu_base; @@ -73,6 +81,8 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  {  	static struct clockdomain *cpu1_clkdm;  	static bool booted; +	void __iomem *base = omap_get_wakeupgen_base(); +  	/*  	 * Set synchronisation state between this boot processor  	 * and the secondary one @@ -85,7 +95,11 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  	 * the AuxCoreBoot1 register is updated with cpu state  	 * A barrier is added to ensure that write buffer is drained  	 */ -	omap_modify_auxcoreboot0(0x200, 0xfffffdff); +	if (omap_secure_apis_support()) +		omap_modify_auxcoreboot0(0x200, 0xfffffdff); +	else +		__raw_writel(0x20, base + OMAP_AUX_CORE_BOOT_0); +  	flush_cache_all();  	smp_wmb(); @@ -111,7 +125,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  		booted = true;  	} -	gic_raise_softirq(cpumask_of(cpu), 1); +	gic_raise_softirq(cpumask_of(cpu), 0);  	/*  	 * Now the secondary core is starting up let it run its @@ -124,13 +138,19 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  static void __init wakeup_secondary(void)  { +	void __iomem *base = omap_get_wakeupgen_base();  	/*  	 * Write the address of secondary startup routine into the  	 * AuxCoreBoot1 where ROM code will jump and start executing  	 * on secondary core once out of WFE  	 * A barrier is added to ensure that write buffer is drained  	 */ -	omap_auxcoreboot_addr(virt_to_phys(omap_secondary_startup)); +	if (omap_secure_apis_support()) +		omap_auxcoreboot_addr(virt_to_phys(omap_secondary_startup)); +	else +		__raw_writel(virt_to_phys(omap5_secondary_startup), +						base + OMAP_AUX_CORE_BOOT_1); +  	smp_wmb();  	/* @@ -147,16 +167,21 @@ static void __init wakeup_secondary(void)   */  void __init smp_init_cpus(void)  { -	unsigned int i, ncores; +	unsigned int i = 0, ncores = 1, cpu_id; -	/* -	 * Currently we can't call ioremap here because -	 * SoC detection won't work until after init_early. -	 */ -	scu_base =  OMAP2_L4_IO_ADDRESS(OMAP44XX_SCU_BASE); -	BUG_ON(!scu_base); - -	ncores = scu_get_core_count(scu_base); +	/* Use ARM cpuid check here, as SoC detection will not work so early */ +	cpu_id = read_cpuid(CPUID_ID) & CPU_MASK; +	if (cpu_id == CPU_CORTEX_A9) { +		/* +		 * Currently we can't call ioremap here because +		 * SoC detection won't work until after init_early. +		 */ +		scu_base =  OMAP2_L4_IO_ADDRESS(OMAP44XX_SCU_BASE); +		BUG_ON(!scu_base); +		ncores = scu_get_core_count(scu_base); +	} else if (cpu_id == CPU_CORTEX_A15) { +		ncores = OMAP5_CORE_COUNT; +	}  	/* sanity check */  	if (ncores > nr_cpu_ids) { @@ -178,6 +203,7 @@ void __init platform_smp_prepare_cpus(unsigned int max_cpus)  	 * Initialise the SCU and wake up the secondary core using  	 * wakeup_secondary().  	 */ -	scu_enable(scu_base); +	if (scu_base) +		scu_enable(scu_base);  	wakeup_secondary();  } diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c index d811c779035..05fdebfaa19 100644 --- a/arch/arm/mach-omap2/omap-wakeupgen.c +++ b/arch/arm/mach-omap2/omap-wakeupgen.c @@ -33,18 +33,23 @@  #include "omap4-sar-layout.h"  #include "common.h" -#define NR_REG_BANKS		4 -#define MAX_IRQS		128 +#define MAX_NR_REG_BANKS	5 +#define MAX_IRQS		160  #define WKG_MASK_ALL		0x00000000  #define WKG_UNMASK_ALL		0xffffffff  #define CPU_ENA_OFFSET		0x400  #define CPU0_ID			0x0  #define CPU1_ID			0x1 +#define OMAP4_NR_BANKS		4 +#define OMAP4_NR_IRQS		128  static void __iomem *wakeupgen_base;  static void __iomem *sar_base;  static DEFINE_SPINLOCK(wakeupgen_lock);  static unsigned int irq_target_cpu[NR_IRQS]; +static unsigned int irq_banks = MAX_NR_REG_BANKS; +static unsigned int max_irqs = MAX_IRQS; +static unsigned int omap_secure_apis;  /*   * Static helper functions. @@ -146,13 +151,13 @@ static void wakeupgen_unmask(struct irq_data *d)  }  #ifdef CONFIG_HOTPLUG_CPU -static DEFINE_PER_CPU(u32 [NR_REG_BANKS], irqmasks); +static DEFINE_PER_CPU(u32 [MAX_NR_REG_BANKS], irqmasks);  static void _wakeupgen_save_masks(unsigned int cpu)  {  	u8 i; -	for (i = 0; i < NR_REG_BANKS; i++) +	for (i = 0; i < irq_banks; i++)  		per_cpu(irqmasks, cpu)[i] = wakeupgen_readl(i, cpu);  } @@ -160,7 +165,7 @@ static void _wakeupgen_restore_masks(unsigned int cpu)  {  	u8 i; -	for (i = 0; i < NR_REG_BANKS; i++) +	for (i = 0; i < irq_banks; i++)  		wakeupgen_writel(per_cpu(irqmasks, cpu)[i], i, cpu);  } @@ -168,7 +173,7 @@ static void _wakeupgen_set_all(unsigned int cpu, unsigned int reg)  {  	u8 i; -	for (i = 0; i < NR_REG_BANKS; i++) +	for (i = 0; i < irq_banks; i++)  		wakeupgen_writel(reg, i, cpu);  } @@ -196,25 +201,14 @@ static void wakeupgen_irqmask_all(unsigned int cpu, unsigned int set)  #endif  #ifdef CONFIG_CPU_PM -/* - * Save WakeupGen interrupt context in SAR BANK3. Restore is done by - * ROM code. WakeupGen IP is integrated along with GIC to manage the - * interrupt wakeups from CPU low power states. It manages - * masking/unmasking of Shared peripheral interrupts(SPI). So the - * interrupt enable/disable control should be in sync and consistent - * at WakeupGen and GIC so that interrupts are not lost. - */ -static void irq_save_context(void) +static inline void omap4_irq_save_context(void)  {  	u32 i, val;  	if (omap_rev() == OMAP4430_REV_ES1_0)  		return; -	if (!sar_base) -		sar_base = omap4_get_sar_ram_base(); - -	for (i = 0; i < NR_REG_BANKS; i++) { +	for (i = 0; i < irq_banks; i++) {  		/* Save the CPUx interrupt mask for IRQ 0 to 127 */  		val = wakeupgen_readl(i, 0);  		sar_writel(val, WAKEUPGENENB_OFFSET_CPU0, i); @@ -254,6 +248,53 @@ static void irq_save_context(void)  	val = __raw_readl(sar_base + SAR_BACKUP_STATUS_OFFSET);  	val |= SAR_BACKUP_STATUS_WAKEUPGEN;  	__raw_writel(val, sar_base + SAR_BACKUP_STATUS_OFFSET); + +} + +static inline void omap5_irq_save_context(void) +{ +	u32 i, val; + +	for (i = 0; i < irq_banks; i++) { +		/* Save the CPUx interrupt mask for IRQ 0 to 159 */ +		val = wakeupgen_readl(i, 0); +		sar_writel(val, OMAP5_WAKEUPGENENB_OFFSET_CPU0, i); +		val = wakeupgen_readl(i, 1); +		sar_writel(val, OMAP5_WAKEUPGENENB_OFFSET_CPU1, i); +		sar_writel(0x0, OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU0, i); +		sar_writel(0x0, OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU1, i); +	} + +	/* Save AuxBoot* registers */ +	val = __raw_readl(wakeupgen_base + OMAP_AUX_CORE_BOOT_0); +	__raw_writel(val, sar_base + OMAP5_AUXCOREBOOT0_OFFSET); +	val = __raw_readl(wakeupgen_base + OMAP_AUX_CORE_BOOT_0); +	__raw_writel(val, sar_base + OMAP5_AUXCOREBOOT1_OFFSET); + +	/* Set the Backup Bit Mask status */ +	val = __raw_readl(sar_base + OMAP5_SAR_BACKUP_STATUS_OFFSET); +	val |= SAR_BACKUP_STATUS_WAKEUPGEN; +	__raw_writel(val, sar_base + OMAP5_SAR_BACKUP_STATUS_OFFSET); + +} + +/* + * Save WakeupGen interrupt context in SAR BANK3. Restore is done by + * ROM code. WakeupGen IP is integrated along with GIC to manage the + * interrupt wakeups from CPU low power states. It manages + * masking/unmasking of Shared peripheral interrupts(SPI). So the + * interrupt enable/disable control should be in sync and consistent + * at WakeupGen and GIC so that interrupts are not lost. + */ +static void irq_save_context(void) +{ +	if (!sar_base) +		sar_base = omap4_get_sar_ram_base(); + +	if (soc_is_omap54xx()) +		omap5_irq_save_context(); +	else +		omap4_irq_save_context();  }  /* @@ -262,9 +303,14 @@ static void irq_save_context(void)  static void irq_sar_clear(void)  {  	u32 val; -	val = __raw_readl(sar_base + SAR_BACKUP_STATUS_OFFSET); +	u32 offset = SAR_BACKUP_STATUS_OFFSET; + +	if (soc_is_omap54xx()) +		offset = OMAP5_SAR_BACKUP_STATUS_OFFSET; + +	val = __raw_readl(sar_base + offset);  	val &= ~SAR_BACKUP_STATUS_WAKEUPGEN; -	__raw_writel(val, sar_base + SAR_BACKUP_STATUS_OFFSET); +	__raw_writel(val, sar_base + offset);  }  /* @@ -336,13 +382,25 @@ static struct notifier_block irq_notifier_block = {  static void __init irq_pm_init(void)  { -	cpu_pm_register_notifier(&irq_notifier_block); +	/* FIXME: Remove this when MPU OSWR support is added */ +	if (!soc_is_omap54xx()) +		cpu_pm_register_notifier(&irq_notifier_block);  }  #else  static void __init irq_pm_init(void)  {}  #endif +void __iomem *omap_get_wakeupgen_base(void) +{ +	return wakeupgen_base; +} + +int omap_secure_apis_support(void) +{ +	return omap_secure_apis; +} +  /*   * Initialise the wakeupgen module.   */ @@ -358,12 +416,18 @@ int __init omap_wakeupgen_init(void)  	}  	/* Static mapping, never released */ -	wakeupgen_base = ioremap(OMAP44XX_WKUPGEN_BASE, SZ_4K); +	wakeupgen_base = ioremap(OMAP_WKUPGEN_BASE, SZ_4K);  	if (WARN_ON(!wakeupgen_base))  		return -ENOMEM; +	if (cpu_is_omap44xx()) { +		irq_banks = OMAP4_NR_BANKS; +		max_irqs = OMAP4_NR_IRQS; +		omap_secure_apis = 1; +	} +  	/* Clear all IRQ bitmasks at wakeupGen level */ -	for (i = 0; i < NR_REG_BANKS; i++) { +	for (i = 0; i < irq_banks; i++) {  		wakeupgen_writel(0, i, CPU0_ID);  		wakeupgen_writel(0, i, CPU1_ID);  	} @@ -382,7 +446,7 @@ int __init omap_wakeupgen_init(void)  	 */  	/* Associate all the IRQs to boot CPU like GIC init does. */ -	for (i = 0; i < NR_IRQS; i++) +	for (i = 0; i < max_irqs; i++)  		irq_target_cpu[i] = boot_cpu;  	irq_hotplug_init(); diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index a8161e5f320..c29dee998a7 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c @@ -21,6 +21,8 @@  #include <asm/hardware/cache-l2x0.h>  #include <asm/mach/map.h>  #include <asm/memblock.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h>  #include <plat/irqs.h>  #include <plat/sram.h> @@ -210,6 +212,18 @@ static int __init omap4_sar_ram_init(void)  }  early_initcall(omap4_sar_ram_init); +static struct of_device_id irq_match[] __initdata = { +	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, +	{ .compatible = "arm,cortex-a15-gic", .data = gic_of_init, }, +	{ } +}; + +void __init omap_gic_of_init(void) +{ +	omap_wakeupgen_init(); +	of_irq_init(irq_match); +} +  #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)  static int omap4_twl6030_hsmmc_late_init(struct device *dev)  { diff --git a/arch/arm/mach-omap2/omap4-sar-layout.h b/arch/arm/mach-omap2/omap4-sar-layout.h index fe5b545ad44..e170fe803b0 100644 --- a/arch/arm/mach-omap2/omap4-sar-layout.h +++ b/arch/arm/mach-omap2/omap4-sar-layout.h @@ -12,7 +12,7 @@  #define OMAP_ARCH_OMAP4_SAR_LAYOUT_H  /* - * SAR BANK offsets from base address OMAP44XX_SAR_RAM_BASE + * SAR BANK offsets from base address OMAP44XX/54XX_SAR_RAM_BASE   */  #define SAR_BANK1_OFFSET		0x0000  #define SAR_BANK2_OFFSET		0x1000 @@ -47,4 +47,14 @@  #define PTMSYNCREQ_EN_OFFSET			(SAR_BANK3_OFFSET + 0x6d0)  #define SAR_BACKUP_STATUS_WAKEUPGEN		0x10 +/* WakeUpGen save restore offset from OMAP54XX_SAR_RAM_BASE */ +#define OMAP5_WAKEUPGENENB_OFFSET_CPU0		(SAR_BANK3_OFFSET + 0x8d4) +#define OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU0	(SAR_BANK3_OFFSET + 0x8e8) +#define OMAP5_WAKEUPGENENB_OFFSET_CPU1		(SAR_BANK3_OFFSET + 0x8fc) +#define OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU1	(SAR_BANK3_OFFSET + 0x910) +#define OMAP5_AUXCOREBOOT0_OFFSET		(SAR_BANK3_OFFSET + 0x924) +#define OMAP5_AUXCOREBOOT1_OFFSET		(SAR_BANK3_OFFSET + 0x928) +#define OMAP5_AMBA_IF_MODE_OFFSET		(SAR_BANK3_OFFSET + 0x92c) +#define OMAP5_SAR_BACKUP_STATUS_OFFSET		(SAR_BANK3_OFFSET + 0x800) +  #endif diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 2d710f50fca..6ca8e519968 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -153,6 +153,7 @@  #include "prm44xx.h"  #include "prminst44xx.h"  #include "mux.h" +#include "pm.h"  /* Maximum microseconds to wait for OMAP module to softreset */  #define MAX_MODULE_SOFTRESET_WAIT	10000 @@ -166,12 +167,40 @@   */  #define LINKS_PER_OCP_IF		2 +/** + * struct omap_hwmod_soc_ops - fn ptrs for some SoC-specific operations + * @enable_module: function to enable a module (via MODULEMODE) + * @disable_module: function to disable a module (via MODULEMODE) + * + * XXX Eventually this functionality will be hidden inside the PRM/CM + * device drivers.  Until then, this should avoid huge blocks of cpu_is_*() + * conditionals in this code. + */ +struct omap_hwmod_soc_ops { +	void (*enable_module)(struct omap_hwmod *oh); +	int (*disable_module)(struct omap_hwmod *oh); +	int (*wait_target_ready)(struct omap_hwmod *oh); +	int (*assert_hardreset)(struct omap_hwmod *oh, +				struct omap_hwmod_rst_info *ohri); +	int (*deassert_hardreset)(struct omap_hwmod *oh, +				  struct omap_hwmod_rst_info *ohri); +	int (*is_hardreset_asserted)(struct omap_hwmod *oh, +				     struct omap_hwmod_rst_info *ohri); +	int (*init_clkdm)(struct omap_hwmod *oh); +}; + +/* soc_ops: adapts the omap_hwmod code to the currently-booted SoC */ +static struct omap_hwmod_soc_ops soc_ops; +  /* omap_hwmod_list contains all registered struct omap_hwmods */  static LIST_HEAD(omap_hwmod_list);  /* mpu_oh: used to add/remove MPU initiator from sleepdep list */  static struct omap_hwmod *mpu_oh; +/* io_chain_lock: used to serialize reconfigurations of the I/O chain */ +static DEFINE_SPINLOCK(io_chain_lock); +  /*   * linkspace: ptr to a buffer that struct omap_hwmod_link records are   * allocated from - used to reduce the number of small memory @@ -186,6 +215,9 @@ static struct omap_hwmod_link *linkspace;   */  static unsigned short free_ls, max_ls, ls_supp; +/* inited: set to true once the hwmod code is initialized */ +static bool inited; +  /* Private functions */  /** @@ -388,6 +420,49 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v)  }  /** + * _set_dmadisable: set OCP_SYSCONFIG.DMADISABLE bit in @v + * @oh: struct omap_hwmod * + * + * The DMADISABLE bit is a semi-automatic bit present in sysconfig register + * of some modules. When the DMA must perform read/write accesses, the + * DMADISABLE bit is cleared by the hardware. But when the DMA must stop + * for power management, software must set the DMADISABLE bit back to 1. + * + * Set the DMADISABLE bit in @v for hwmod @oh.  Returns -EINVAL upon + * error or 0 upon success. + */ +static int _set_dmadisable(struct omap_hwmod *oh) +{ +	u32 v; +	u32 dmadisable_mask; + +	if (!oh->class->sysc || +	    !(oh->class->sysc->sysc_flags & SYSC_HAS_DMADISABLE)) +		return -EINVAL; + +	if (!oh->class->sysc->sysc_fields) { +		WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); +		return -EINVAL; +	} + +	/* clocks must be on for this operation */ +	if (oh->_state != _HWMOD_STATE_ENABLED) { +		pr_warn("omap_hwmod: %s: dma can be disabled only from enabled state\n", oh->name); +		return -EINVAL; +	} + +	pr_debug("omap_hwmod: %s: setting DMADISABLE\n", oh->name); + +	v = oh->_sysc_cache; +	dmadisable_mask = +		(0x1 << oh->class->sysc->sysc_fields->dmadisable_shift); +	v |= dmadisable_mask; +	_write_sysconfig(v, oh); + +	return 0; +} + +/**   * _set_module_autoidle: set the OCP_SYSCONFIG AUTOIDLE field in @v   * @oh: struct omap_hwmod *   * @autoidle: desired AUTOIDLE bitfield value (0 or 1) @@ -771,23 +846,19 @@ static void _disable_optional_clocks(struct omap_hwmod *oh)  }  /** - * _enable_module - enable CLKCTRL modulemode on OMAP4 + * _omap4_enable_module - enable CLKCTRL modulemode on OMAP4   * @oh: struct omap_hwmod *   *   * Enables the PRCM module mode related to the hwmod @oh.   * No return value.   */ -static void _enable_module(struct omap_hwmod *oh) +static void _omap4_enable_module(struct omap_hwmod *oh)  { -	/* The module mode does not exist prior OMAP4 */ -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) -		return; -  	if (!oh->clkdm || !oh->prcm.omap4.modulemode)  		return; -	pr_debug("omap_hwmod: %s: _enable_module: %d\n", -		 oh->name, oh->prcm.omap4.modulemode); +	pr_debug("omap_hwmod: %s: %s: %d\n", +		 oh->name, __func__, oh->prcm.omap4.modulemode);  	omap4_cminst_module_enable(oh->prcm.omap4.modulemode,  				   oh->clkdm->prcm_partition, @@ -807,10 +878,7 @@ static void _enable_module(struct omap_hwmod *oh)   */  static int _omap4_wait_target_disable(struct omap_hwmod *oh)  { -	if (!cpu_is_omap44xx()) -		return 0; - -	if (!oh) +	if (!oh || !oh->clkdm)  		return -EINVAL;  	if (oh->_int_flags & _HWMOD_NO_MPU_PORT) @@ -1301,24 +1369,20 @@ static struct omap_hwmod *_lookup(const char *name)  	return oh;  } +  /**   * _init_clkdm - look up a clockdomain name, store pointer in omap_hwmod   * @oh: struct omap_hwmod *   *   * Convert a clockdomain name stored in a struct omap_hwmod into a   * clockdomain pointer, and save it into the struct omap_hwmod. - * return -EINVAL if clkdm_name does not exist or if the lookup failed. + * Return -EINVAL if the clkdm_name lookup failed.   */  static int _init_clkdm(struct omap_hwmod *oh)  { -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) +	if (!oh->clkdm_name)  		return 0; -	if (!oh->clkdm_name) { -		pr_warning("omap_hwmod: %s: no clkdm_name\n", oh->name); -		return -EINVAL; -	} -  	oh->clkdm = clkdm_lookup(oh->clkdm_name);  	if (!oh->clkdm) {  		pr_warning("omap_hwmod: %s: could not associate to clkdm %s\n", @@ -1354,7 +1418,8 @@ static int _init_clocks(struct omap_hwmod *oh, void *data)  	ret |= _init_main_clk(oh);  	ret |= _init_interface_clks(oh);  	ret |= _init_opt_clks(oh); -	ret |= _init_clkdm(oh); +	if (soc_ops.init_clkdm) +		ret |= soc_ops.init_clkdm(oh);  	if (!ret)  		oh->_state = _HWMOD_STATE_CLKS_INITED; @@ -1365,53 +1430,6 @@ static int _init_clocks(struct omap_hwmod *oh, void *data)  }  /** - * _wait_target_ready - wait for a module to leave slave idle - * @oh: struct omap_hwmod * - * - * Wait for a module @oh to leave slave idle.  Returns 0 if the module - * does not have an IDLEST bit or if the module successfully leaves - * slave idle; otherwise, pass along the return value of the - * appropriate *_cm*_wait_module_ready() function. - */ -static int _wait_target_ready(struct omap_hwmod *oh) -{ -	struct omap_hwmod_ocp_if *os; -	int ret; - -	if (!oh) -		return -EINVAL; - -	if (oh->flags & HWMOD_NO_IDLEST) -		return 0; - -	os = _find_mpu_rt_port(oh); -	if (!os) -		return 0; - -	/* XXX check module SIDLEMODE */ - -	/* XXX check clock enable states */ - -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) { -		ret = omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs, -						 oh->prcm.omap2.idlest_reg_id, -						 oh->prcm.omap2.idlest_idle_bit); -	} else if (cpu_is_omap44xx()) { -		if (!oh->clkdm) -			return -EINVAL; - -		ret = omap4_cminst_wait_module_ready(oh->clkdm->prcm_partition, -						     oh->clkdm->cm_inst, -						     oh->clkdm->clkdm_offs, -						     oh->prcm.omap4.clkctrl_offs); -	} else { -		BUG(); -	}; - -	return ret; -} - -/**   * _lookup_hardreset - fill register bit info for this hwmod/reset line   * @oh: struct omap_hwmod *   * @name: name of the reset line in the context of this hwmod @@ -1447,32 +1465,31 @@ static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name,   * @oh: struct omap_hwmod *   * @name: name of the reset line to lookup and assert   * - * Some IP like dsp, ipu or iva contain processor that require - * an HW reset line to be assert / deassert in order to enable fully - * the IP. + * Some IP like dsp, ipu or iva contain processor that require an HW + * reset line to be assert / deassert in order to enable fully the IP. + * Returns -EINVAL if @oh is null, -ENOSYS if we have no way of + * asserting the hardreset line on the currently-booted SoC, or passes + * along the return value from _lookup_hardreset() or the SoC's + * assert_hardreset code.   */  static int _assert_hardreset(struct omap_hwmod *oh, const char *name)  {  	struct omap_hwmod_rst_info ohri; -	u8 ret; +	u8 ret = -EINVAL;  	if (!oh)  		return -EINVAL; +	if (!soc_ops.assert_hardreset) +		return -ENOSYS; +  	ret = _lookup_hardreset(oh, name, &ohri);  	if (IS_ERR_VALUE(ret))  		return ret; -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) -		return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs, -						  ohri.rst_shift); -	else if (cpu_is_omap44xx()) -		return omap4_prminst_assert_hardreset(ohri.rst_shift, -				  oh->clkdm->pwrdm.ptr->prcm_partition, -				  oh->clkdm->pwrdm.ptr->prcm_offs, -				  oh->prcm.omap4.rstctrl_offs); -	else -		return -EINVAL; +	ret = soc_ops.assert_hardreset(oh, &ohri); + +	return ret;  }  /** @@ -1481,38 +1498,29 @@ static int _assert_hardreset(struct omap_hwmod *oh, const char *name)   * @oh: struct omap_hwmod *   * @name: name of the reset line to look up and deassert   * - * Some IP like dsp, ipu or iva contain processor that require - * an HW reset line to be assert / deassert in order to enable fully - * the IP. + * Some IP like dsp, ipu or iva contain processor that require an HW + * reset line to be assert / deassert in order to enable fully the IP. + * Returns -EINVAL if @oh is null, -ENOSYS if we have no way of + * deasserting the hardreset line on the currently-booted SoC, or passes + * along the return value from _lookup_hardreset() or the SoC's + * deassert_hardreset code.   */  static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)  {  	struct omap_hwmod_rst_info ohri; -	int ret; +	int ret = -EINVAL;  	if (!oh)  		return -EINVAL; +	if (!soc_ops.deassert_hardreset) +		return -ENOSYS; +  	ret = _lookup_hardreset(oh, name, &ohri);  	if (IS_ERR_VALUE(ret))  		return ret; -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) { -		ret = omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs, -						   ohri.rst_shift, -						   ohri.st_shift); -	} else if (cpu_is_omap44xx()) { -		if (ohri.st_shift) -			pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n", -			       oh->name, name); -		ret = omap4_prminst_deassert_hardreset(ohri.rst_shift, -				  oh->clkdm->pwrdm.ptr->prcm_partition, -				  oh->clkdm->pwrdm.ptr->prcm_offs, -				  oh->prcm.omap4.rstctrl_offs); -	} else { -		return -EINVAL; -	} - +	ret = soc_ops.deassert_hardreset(oh, &ohri);  	if (ret == -EBUSY)  		pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name); @@ -1525,31 +1533,28 @@ static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)   * @oh: struct omap_hwmod *   * @name: name of the reset line to look up and read   * - * Return the state of the reset line. + * Return the state of the reset line.  Returns -EINVAL if @oh is + * null, -ENOSYS if we have no way of reading the hardreset line + * status on the currently-booted SoC, or passes along the return + * value from _lookup_hardreset() or the SoC's is_hardreset_asserted + * code.   */  static int _read_hardreset(struct omap_hwmod *oh, const char *name)  {  	struct omap_hwmod_rst_info ohri; -	u8 ret; +	u8 ret = -EINVAL;  	if (!oh)  		return -EINVAL; +	if (!soc_ops.is_hardreset_asserted) +		return -ENOSYS; +  	ret = _lookup_hardreset(oh, name, &ohri);  	if (IS_ERR_VALUE(ret))  		return ret; -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) { -		return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs, -						       ohri.st_shift); -	} else if (cpu_is_omap44xx()) { -		return omap4_prminst_is_hardreset_asserted(ohri.rst_shift, -				  oh->clkdm->pwrdm.ptr->prcm_partition, -				  oh->clkdm->pwrdm.ptr->prcm_offs, -				  oh->prcm.omap4.rstctrl_offs); -	} else { -		return -EINVAL; -	} +	return soc_ops.is_hardreset_asserted(oh, &ohri);  }  /** @@ -1587,10 +1592,6 @@ static int _omap4_disable_module(struct omap_hwmod *oh)  {  	int v; -	/* The module mode does not exist prior OMAP4 */ -	if (!cpu_is_omap44xx()) -		return -EINVAL; -  	if (!oh->clkdm || !oh->prcm.omap4.modulemode)  		return -EINVAL; @@ -1714,11 +1715,17 @@ dis_opt_clks:   * therefore have no OCP header registers to access.  Others (like the   * IVA) have idiosyncratic reset sequences.  So for these relatively   * rare cases, custom reset code can be supplied in the struct - * omap_hwmod_class .reset function pointer.  Passes along the return - * value from either _ocp_softreset() or the custom reset function - - * these must return -EINVAL if the hwmod cannot be reset this way or - * if the hwmod is in the wrong state, -ETIMEDOUT if the module did - * not reset in time, or 0 upon success. + * omap_hwmod_class .reset function pointer. + * + * _set_dmadisable() is called to set the DMADISABLE bit so that it + * does not prevent idling of the system. This is necessary for cases + * where ROMCODE/BOOTLOADER uses dma and transfers control to the + * kernel without disabling dma. + * + * Passes along the return value from either _ocp_softreset() or the + * custom reset function - these must return -EINVAL if the hwmod + * cannot be reset this way or if the hwmod is in the wrong state, + * -ETIMEDOUT if the module did not reset in time, or 0 upon success.   */  static int _reset(struct omap_hwmod *oh)  { @@ -1740,6 +1747,8 @@ static int _reset(struct omap_hwmod *oh)  		}  	} +	_set_dmadisable(oh); +  	/*  	 * OCP_SYSCONFIG bits need to be reprogrammed after a  	 * softreset.  The _enable() function should be split to avoid @@ -1754,6 +1763,32 @@ static int _reset(struct omap_hwmod *oh)  }  /** + * _reconfigure_io_chain - clear any I/O chain wakeups and reconfigure chain + * + * Call the appropriate PRM function to clear any logged I/O chain + * wakeups and to reconfigure the chain.  This apparently needs to be + * done upon every mux change.  Since hwmods can be concurrently + * enabled and idled, hold a spinlock around the I/O chain + * reconfiguration sequence.  No return value. + * + * XXX When the PRM code is moved to drivers, this function can be removed, + * as the PRM infrastructure should abstract this. + */ +static void _reconfigure_io_chain(void) +{ +	unsigned long flags; + +	spin_lock_irqsave(&io_chain_lock, flags); + +	if (cpu_is_omap34xx() && omap3_has_io_chain_ctrl()) +		omap3xxx_prm_reconfigure_io_chain(); +	else if (cpu_is_omap44xx()) +		omap44xx_prm_reconfigure_io_chain(); + +	spin_unlock_irqrestore(&io_chain_lock, flags); +} + +/**   * _enable - enable an omap_hwmod   * @oh: struct omap_hwmod *   * @@ -1809,8 +1844,10 @@ static int _enable(struct omap_hwmod *oh)  	/* Mux pins for device runtime if populated */  	if (oh->mux && (!oh->mux->enabled ||  			((oh->_state == _HWMOD_STATE_IDLE) && -			 oh->mux->pads_dynamic))) +			 oh->mux->pads_dynamic))) {  		omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED); +		_reconfigure_io_chain(); +	}  	_add_initiator_dep(oh, mpu_oh); @@ -1830,9 +1867,11 @@ static int _enable(struct omap_hwmod *oh)  	}  	_enable_clocks(oh); -	_enable_module(oh); +	if (soc_ops.enable_module) +		soc_ops.enable_module(oh); -	r = _wait_target_ready(oh); +	r = (soc_ops.wait_target_ready) ? soc_ops.wait_target_ready(oh) : +		-EINVAL;  	if (!r) {  		/*  		 * Set the clockdomain to HW_AUTO only if the target is ready, @@ -1886,7 +1925,8 @@ static int _idle(struct omap_hwmod *oh)  		_idle_sysc(oh);  	_del_initiator_dep(oh, mpu_oh); -	_omap4_disable_module(oh); +	if (soc_ops.disable_module) +		soc_ops.disable_module(oh);  	/*  	 * The module must be in idle mode before disabling any parents @@ -1899,8 +1939,10 @@ static int _idle(struct omap_hwmod *oh)  		clkdm_hwmod_disable(oh->clkdm, oh);  	/* Mux pins for device idle if populated */ -	if (oh->mux && oh->mux->pads_dynamic) +	if (oh->mux && oh->mux->pads_dynamic) {  		omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE); +		_reconfigure_io_chain(); +	}  	oh->_state = _HWMOD_STATE_IDLE; @@ -1991,7 +2033,8 @@ static int _shutdown(struct omap_hwmod *oh)  	if (oh->_state == _HWMOD_STATE_ENABLED) {  		_del_initiator_dep(oh, mpu_oh);  		/* XXX what about the other system initiators here? dma, dsp */ -		_omap4_disable_module(oh); +		if (soc_ops.disable_module) +			soc_ops.disable_module(oh);  		_disable_clocks(oh);  		if (oh->clkdm)  			clkdm_hwmod_disable(oh->clkdm, oh); @@ -2447,6 +2490,194 @@ static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois)  	return 0;  } +/* Static functions intended only for use in soc_ops field function pointers */ + +/** + * _omap2_wait_target_ready - wait for a module to leave slave idle + * @oh: struct omap_hwmod * + * + * Wait for a module @oh to leave slave idle.  Returns 0 if the module + * does not have an IDLEST bit or if the module successfully leaves + * slave idle; otherwise, pass along the return value of the + * appropriate *_cm*_wait_module_ready() function. + */ +static int _omap2_wait_target_ready(struct omap_hwmod *oh) +{ +	if (!oh) +		return -EINVAL; + +	if (oh->flags & HWMOD_NO_IDLEST) +		return 0; + +	if (!_find_mpu_rt_port(oh)) +		return 0; + +	/* XXX check module SIDLEMODE, hardreset status, enabled clocks */ + +	return omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs, +					  oh->prcm.omap2.idlest_reg_id, +					  oh->prcm.omap2.idlest_idle_bit); +} + +/** + * _omap4_wait_target_ready - wait for a module to leave slave idle + * @oh: struct omap_hwmod * + * + * Wait for a module @oh to leave slave idle.  Returns 0 if the module + * does not have an IDLEST bit or if the module successfully leaves + * slave idle; otherwise, pass along the return value of the + * appropriate *_cm*_wait_module_ready() function. + */ +static int _omap4_wait_target_ready(struct omap_hwmod *oh) +{ +	if (!oh || !oh->clkdm) +		return -EINVAL; + +	if (oh->flags & HWMOD_NO_IDLEST) +		return 0; + +	if (!_find_mpu_rt_port(oh)) +		return 0; + +	/* XXX check module SIDLEMODE, hardreset status */ + +	return omap4_cminst_wait_module_ready(oh->clkdm->prcm_partition, +					      oh->clkdm->cm_inst, +					      oh->clkdm->clkdm_offs, +					      oh->prcm.omap4.clkctrl_offs); +} + +/** + * _omap2_assert_hardreset - call OMAP2 PRM hardreset fn with hwmod args + * @oh: struct omap_hwmod * to assert hardreset + * @ohri: hardreset line data + * + * Call omap2_prm_assert_hardreset() with parameters extracted from + * the hwmod @oh and the hardreset line data @ohri.  Only intended for + * use as an soc_ops function pointer.  Passes along the return value + * from omap2_prm_assert_hardreset().  XXX This function is scheduled + * for removal when the PRM code is moved into drivers/. + */ +static int _omap2_assert_hardreset(struct omap_hwmod *oh, +				   struct omap_hwmod_rst_info *ohri) +{ +	return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs, +					  ohri->rst_shift); +} + +/** + * _omap2_deassert_hardreset - call OMAP2 PRM hardreset fn with hwmod args + * @oh: struct omap_hwmod * to deassert hardreset + * @ohri: hardreset line data + * + * Call omap2_prm_deassert_hardreset() with parameters extracted from + * the hwmod @oh and the hardreset line data @ohri.  Only intended for + * use as an soc_ops function pointer.  Passes along the return value + * from omap2_prm_deassert_hardreset().  XXX This function is + * scheduled for removal when the PRM code is moved into drivers/. + */ +static int _omap2_deassert_hardreset(struct omap_hwmod *oh, +				     struct omap_hwmod_rst_info *ohri) +{ +	return omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs, +					    ohri->rst_shift, +					    ohri->st_shift); +} + +/** + * _omap2_is_hardreset_asserted - call OMAP2 PRM hardreset fn with hwmod args + * @oh: struct omap_hwmod * to test hardreset + * @ohri: hardreset line data + * + * Call omap2_prm_is_hardreset_asserted() with parameters extracted + * from the hwmod @oh and the hardreset line data @ohri.  Only + * intended for use as an soc_ops function pointer.  Passes along the + * return value from omap2_prm_is_hardreset_asserted().  XXX This + * function is scheduled for removal when the PRM code is moved into + * drivers/. + */ +static int _omap2_is_hardreset_asserted(struct omap_hwmod *oh, +					struct omap_hwmod_rst_info *ohri) +{ +	return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs, +					       ohri->st_shift); +} + +/** + * _omap4_assert_hardreset - call OMAP4 PRM hardreset fn with hwmod args + * @oh: struct omap_hwmod * to assert hardreset + * @ohri: hardreset line data + * + * Call omap4_prminst_assert_hardreset() with parameters extracted + * from the hwmod @oh and the hardreset line data @ohri.  Only + * intended for use as an soc_ops function pointer.  Passes along the + * return value from omap4_prminst_assert_hardreset().  XXX This + * function is scheduled for removal when the PRM code is moved into + * drivers/. + */ +static int _omap4_assert_hardreset(struct omap_hwmod *oh, +				   struct omap_hwmod_rst_info *ohri) +{ +	if (!oh->clkdm) +		return -EINVAL; + +	return omap4_prminst_assert_hardreset(ohri->rst_shift, +				oh->clkdm->pwrdm.ptr->prcm_partition, +				oh->clkdm->pwrdm.ptr->prcm_offs, +				oh->prcm.omap4.rstctrl_offs); +} + +/** + * _omap4_deassert_hardreset - call OMAP4 PRM hardreset fn with hwmod args + * @oh: struct omap_hwmod * to deassert hardreset + * @ohri: hardreset line data + * + * Call omap4_prminst_deassert_hardreset() with parameters extracted + * from the hwmod @oh and the hardreset line data @ohri.  Only + * intended for use as an soc_ops function pointer.  Passes along the + * return value from omap4_prminst_deassert_hardreset().  XXX This + * function is scheduled for removal when the PRM code is moved into + * drivers/. + */ +static int _omap4_deassert_hardreset(struct omap_hwmod *oh, +				     struct omap_hwmod_rst_info *ohri) +{ +	if (!oh->clkdm) +		return -EINVAL; + +	if (ohri->st_shift) +		pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n", +		       oh->name, ohri->name); +	return omap4_prminst_deassert_hardreset(ohri->rst_shift, +				oh->clkdm->pwrdm.ptr->prcm_partition, +				oh->clkdm->pwrdm.ptr->prcm_offs, +				oh->prcm.omap4.rstctrl_offs); +} + +/** + * _omap4_is_hardreset_asserted - call OMAP4 PRM hardreset fn with hwmod args + * @oh: struct omap_hwmod * to test hardreset + * @ohri: hardreset line data + * + * Call omap4_prminst_is_hardreset_asserted() with parameters + * extracted from the hwmod @oh and the hardreset line data @ohri. + * Only intended for use as an soc_ops function pointer.  Passes along + * the return value from omap4_prminst_is_hardreset_asserted().  XXX + * This function is scheduled for removal when the PRM code is moved + * into drivers/. + */ +static int _omap4_is_hardreset_asserted(struct omap_hwmod *oh, +					struct omap_hwmod_rst_info *ohri) +{ +	if (!oh->clkdm) +		return -EINVAL; + +	return omap4_prminst_is_hardreset_asserted(ohri->rst_shift, +				oh->clkdm->pwrdm.ptr->prcm_partition, +				oh->clkdm->pwrdm.ptr->prcm_offs, +				oh->prcm.omap4.rstctrl_offs); +} +  /* Public functions */  u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs) @@ -2579,12 +2810,18 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),   *   * Intended to be called early in boot before the clock framework is   * initialized.  If @ois is not null, will register all omap_hwmods - * listed in @ois that are valid for this chip.  Returns 0. + * listed in @ois that are valid for this chip.  Returns -EINVAL if + * omap_hwmod_init() hasn't been called before calling this function, + * -ENOMEM if the link memory area can't be allocated, or 0 upon + * success.   */  int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois)  {  	int r, i; +	if (!inited) +		return -EINVAL; +  	if (!ois)  		return 0; @@ -3417,3 +3654,47 @@ int omap_hwmod_pad_route_irq(struct omap_hwmod *oh, int pad_idx, int irq_idx)  	return 0;  } + +/** + * omap_hwmod_init - initialize the hwmod code + * + * Sets up some function pointers needed by the hwmod code to operate on the + * currently-booted SoC.  Intended to be called once during kernel init + * before any hwmods are registered.  No return value. + */ +void __init omap_hwmod_init(void) +{ +	if (cpu_is_omap24xx() || cpu_is_omap34xx()) { +		soc_ops.wait_target_ready = _omap2_wait_target_ready; +		soc_ops.assert_hardreset = _omap2_assert_hardreset; +		soc_ops.deassert_hardreset = _omap2_deassert_hardreset; +		soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted; +	} else if (cpu_is_omap44xx() || soc_is_omap54xx()) { +		soc_ops.enable_module = _omap4_enable_module; +		soc_ops.disable_module = _omap4_disable_module; +		soc_ops.wait_target_ready = _omap4_wait_target_ready; +		soc_ops.assert_hardreset = _omap4_assert_hardreset; +		soc_ops.deassert_hardreset = _omap4_deassert_hardreset; +		soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted; +		soc_ops.init_clkdm = _init_clkdm; +	} else { +		WARN(1, "omap_hwmod: unknown SoC type\n"); +	} + +	inited = true; +} + +/** + * omap_hwmod_get_main_clk - get pointer to main clock name + * @oh: struct omap_hwmod * + * + * Returns the main clock name assocated with @oh upon success, + * or NULL if @oh is NULL. + */ +const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh) +{ +	if (!oh) +		return NULL; + +	return oh->main_clk; +} diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index a7640d1b215..50cfab61b0e 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c @@ -192,6 +192,11 @@ static struct omap_hwmod_class omap2420_mcbsp_hwmod_class = {  	.name = "mcbsp",  }; +static struct omap_hwmod_opt_clk mcbsp_opt_clks[] = { +	{ .role = "pad_fck", .clk = "mcbsp_clks" }, +	{ .role = "prcm_fck", .clk = "func_96m_ck" }, +}; +  /* mcbsp1 */  static struct omap_hwmod_irq_info omap2420_mcbsp1_irqs[] = {  	{ .name = "tx", .irq = 59 }, @@ -214,6 +219,8 @@ static struct omap_hwmod omap2420_mcbsp1_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_MCBSP1_SHIFT,  		},  	}, +	.opt_clks	= mcbsp_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp_opt_clks),  };  /* mcbsp2 */ @@ -238,6 +245,8 @@ static struct omap_hwmod omap2420_mcbsp2_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_MCBSP2_SHIFT,  		},  	}, +	.opt_clks	= mcbsp_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp_opt_clks),  };  static struct omap_hwmod_class_sysconfig omap2420_msdi_sysc = { @@ -585,5 +594,6 @@ static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = {  int __init omap2420_hwmod_init(void)  { +	omap_hwmod_init();  	return omap_hwmod_register_links(omap2420_hwmod_ocp_ifs);  } diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 4d726498123..58b5bc196d3 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c @@ -296,6 +296,11 @@ static struct omap_hwmod_class omap2430_mcbsp_hwmod_class = {  	.rev  = MCBSP_CONFIG_TYPE2,  }; +static struct omap_hwmod_opt_clk mcbsp_opt_clks[] = { +	{ .role = "pad_fck", .clk = "mcbsp_clks" }, +	{ .role = "prcm_fck", .clk = "func_96m_ck" }, +}; +  /* mcbsp1 */  static struct omap_hwmod_irq_info omap2430_mcbsp1_irqs[] = {  	{ .name = "tx",		.irq = 59 }, @@ -320,6 +325,8 @@ static struct omap_hwmod omap2430_mcbsp1_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_MCBSP1_SHIFT,  		},  	}, +	.opt_clks	= mcbsp_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp_opt_clks),  };  /* mcbsp2 */ @@ -345,6 +352,8 @@ static struct omap_hwmod omap2430_mcbsp2_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_MCBSP2_SHIFT,  		},  	}, +	.opt_clks	= mcbsp_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp_opt_clks),  };  /* mcbsp3 */ @@ -370,6 +379,8 @@ static struct omap_hwmod omap2430_mcbsp3_hwmod = {  			.idlest_idle_bit = OMAP2430_ST_MCBSP3_SHIFT,  		},  	}, +	.opt_clks	= mcbsp_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp_opt_clks),  };  /* mcbsp4 */ @@ -401,6 +412,8 @@ static struct omap_hwmod omap2430_mcbsp4_hwmod = {  			.idlest_idle_bit = OMAP2430_ST_MCBSP4_SHIFT,  		},  	}, +	.opt_clks	= mcbsp_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp_opt_clks),  };  /* mcbsp5 */ @@ -432,6 +445,8 @@ static struct omap_hwmod omap2430_mcbsp5_hwmod = {  			.idlest_idle_bit = OMAP2430_ST_MCBSP5_SHIFT,  		},  	}, +	.opt_clks	= mcbsp_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp_opt_clks),  };  /* MMC/SD/SDIO common */ @@ -938,5 +953,6 @@ static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {  int __init omap2430_hwmod_init(void)  { +	omap_hwmod_init();  	return omap_hwmod_register_links(omap2430_hwmod_ocp_ifs);  } diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c index 83eafd96eca..afad69c6ba6 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c @@ -68,7 +68,6 @@ static struct omap_hwmod_class_sysconfig omap2xxx_timer_sysc = {  struct omap_hwmod_class omap2xxx_timer_hwmod_class = {  	.name	= "timer",  	.sysc	= &omap2xxx_timer_sysc, -	.rev	= OMAP_TIMER_IP_VERSION_1,  };  /* @@ -257,7 +256,6 @@ struct omap_hwmod omap2xxx_timer2_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class,  }; @@ -276,7 +274,6 @@ struct omap_hwmod omap2xxx_timer3_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class,  }; @@ -295,7 +292,6 @@ struct omap_hwmod omap2xxx_timer4_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class,  }; @@ -314,7 +310,6 @@ struct omap_hwmod omap2xxx_timer5_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class,  }; @@ -333,7 +328,6 @@ struct omap_hwmod omap2xxx_timer6_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class,  }; @@ -352,7 +346,6 @@ struct omap_hwmod omap2xxx_timer7_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class,  }; @@ -371,7 +364,6 @@ struct omap_hwmod omap2xxx_timer8_hwmod = {  			.idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class,  }; diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index b26d3c9bca1..c9e38200216 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -14,6 +14,8 @@   *   * XXX these should be marked initdata for multi-OMAP kernels   */ +#include <linux/power/smartreflex.h> +  #include <plat/omap_hwmod.h>  #include <mach/irqs.h>  #include <plat/cpu.h> @@ -29,8 +31,6 @@  #include <plat/dmtimer.h>  #include "omap_hwmod_common_data.h" - -#include "smartreflex.h"  #include "prm-regbits-34xx.h"  #include "cm-regbits-34xx.h"  #include "wd_timer.h" @@ -129,7 +129,6 @@ static struct omap_hwmod_class_sysconfig omap3xxx_timer_1ms_sysc = {  static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = {  	.name = "timer",  	.sysc = &omap3xxx_timer_1ms_sysc, -	.rev = OMAP_TIMER_IP_VERSION_1,  };  static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = { @@ -145,12 +144,11 @@ static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = {  static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {  	.name = "timer",  	.sysc = &omap3xxx_timer_sysc, -	.rev =  OMAP_TIMER_IP_VERSION_1,  };  /* secure timers dev attribute */  static struct omap_timer_capability_dev_attr capability_secure_dev_attr = { -	.timer_capability	= OMAP_TIMER_SECURE, +	.timer_capability	= OMAP_TIMER_ALWON | OMAP_TIMER_SECURE,  };  /* always-on timers dev attribute */ @@ -195,7 +193,6 @@ static struct omap_hwmod omap3xxx_timer2_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap3xxx_timer_1ms_hwmod_class,  }; @@ -213,7 +210,6 @@ static struct omap_hwmod omap3xxx_timer3_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class,  }; @@ -231,7 +227,6 @@ static struct omap_hwmod omap3xxx_timer4_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class,  }; @@ -249,7 +244,6 @@ static struct omap_hwmod omap3xxx_timer5_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class,  }; @@ -267,7 +261,6 @@ static struct omap_hwmod omap3xxx_timer6_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class,  }; @@ -285,7 +278,6 @@ static struct omap_hwmod omap3xxx_timer7_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class,  }; @@ -527,11 +519,27 @@ static struct omap_hwmod omap36xx_uart4_hwmod = {  static struct omap_hwmod_irq_info am35xx_uart4_mpu_irqs[] = {  	{ .irq = INT_35XX_UART4_IRQ, }, +	{ .irq = -1 }  };  static struct omap_hwmod_dma_info am35xx_uart4_sdma_reqs[] = {  	{ .name = "rx", .dma_req = AM35XX_DMA_UART4_RX, },  	{ .name = "tx", .dma_req = AM35XX_DMA_UART4_TX, }, +	{ .dma_req = -1 } +}; + +/* + * XXX AM35xx UART4 cannot complete its softreset without uart1_fck or + * uart2_fck being enabled.  So we add uart1_fck as an optional clock, + * below, and set the HWMOD_CONTROL_OPT_CLKS_IN_RESET.  This really + * should not be needed.  The functional clock structure of the AM35xx + * UART4 is extremely unclear and opaque; it is unclear what the role + * of uart1/2_fck is for the UART4.  Any clarification from either + * empirical testing or the AM3505/3517 hardware designers would be + * most welcome. + */ +static struct omap_hwmod_opt_clk am35xx_uart4_opt_clks[] = { +	{ .role = "softreset_uart1_fck", .clk = "uart1_fck" },  };  static struct omap_hwmod am35xx_uart4_hwmod = { @@ -543,11 +551,14 @@ static struct omap_hwmod am35xx_uart4_hwmod = {  		.omap2 = {  			.module_offs = CORE_MOD,  			.prcm_reg_id = 1, -			.module_bit = OMAP3430_EN_UART4_SHIFT, +			.module_bit = AM35XX_EN_UART4_SHIFT,  			.idlest_reg_id = 1, -			.idlest_idle_bit = OMAP3430_EN_UART4_SHIFT, +			.idlest_idle_bit = AM35XX_ST_UART4_SHIFT,  		},  	}, +	.opt_clks	= am35xx_uart4_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(am35xx_uart4_opt_clks), +	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,  	.class		= &omap2_uart_class,  }; @@ -1074,6 +1085,17 @@ static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = {  	.rev  = MCBSP_CONFIG_TYPE3,  }; +/* McBSP functional clock mapping */ +static struct omap_hwmod_opt_clk mcbsp15_opt_clks[] = { +	{ .role = "pad_fck", .clk = "mcbsp_clks" }, +	{ .role = "prcm_fck", .clk = "core_96m_fck" }, +}; + +static struct omap_hwmod_opt_clk mcbsp234_opt_clks[] = { +	{ .role = "pad_fck", .clk = "mcbsp_clks" }, +	{ .role = "prcm_fck", .clk = "per_96m_fck" }, +}; +  /* mcbsp1 */  static struct omap_hwmod_irq_info omap3xxx_mcbsp1_irqs[] = {  	{ .name = "common", .irq = 16 }, @@ -1097,6 +1119,8 @@ static struct omap_hwmod omap3xxx_mcbsp1_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_MCBSP1_SHIFT,  		},  	}, +	.opt_clks	= mcbsp15_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp15_opt_clks),  };  /* mcbsp2 */ @@ -1126,6 +1150,8 @@ static struct omap_hwmod omap3xxx_mcbsp2_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT,  		},  	}, +	.opt_clks	= mcbsp234_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),  	.dev_attr	= &omap34xx_mcbsp2_dev_attr,  }; @@ -1156,6 +1182,8 @@ static struct omap_hwmod omap3xxx_mcbsp3_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT,  		},  	}, +	.opt_clks	= mcbsp234_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),  	.dev_attr	= &omap34xx_mcbsp3_dev_attr,  }; @@ -1188,6 +1216,8 @@ static struct omap_hwmod omap3xxx_mcbsp4_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_MCBSP4_SHIFT,  		},  	}, +	.opt_clks	= mcbsp234_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),  };  /* mcbsp5 */ @@ -1219,6 +1249,8 @@ static struct omap_hwmod omap3xxx_mcbsp5_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_MCBSP5_SHIFT,  		},  	}, +	.opt_clks	= mcbsp15_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(mcbsp15_opt_clks),  };  /* 'mcbsp sidetone' class */ @@ -1325,7 +1357,7 @@ static struct omap_hwmod_irq_info omap3_smartreflex_mpu_irqs[] = {  };  static struct omap_hwmod omap34xx_sr1_hwmod = { -	.name		= "sr1", +	.name		= "smartreflex_mpu_iva",  	.class		= &omap34xx_smartreflex_hwmod_class,  	.main_clk	= "sr1_fck",  	.prcm		= { @@ -1343,7 +1375,7 @@ static struct omap_hwmod omap34xx_sr1_hwmod = {  };  static struct omap_hwmod omap36xx_sr1_hwmod = { -	.name		= "sr1", +	.name		= "smartreflex_mpu_iva",  	.class		= &omap36xx_smartreflex_hwmod_class,  	.main_clk	= "sr1_fck",  	.prcm		= { @@ -1370,7 +1402,7 @@ static struct omap_hwmod_irq_info omap3_smartreflex_core_irqs[] = {  };  static struct omap_hwmod omap34xx_sr2_hwmod = { -	.name		= "sr2", +	.name		= "smartreflex_core",  	.class		= &omap34xx_smartreflex_hwmod_class,  	.main_clk	= "sr2_fck",  	.prcm		= { @@ -1388,7 +1420,7 @@ static struct omap_hwmod omap34xx_sr2_hwmod = {  };  static struct omap_hwmod omap36xx_sr2_hwmod = { -	.name		= "sr2", +	.name		= "smartreflex_core",  	.class		= &omap36xx_smartreflex_hwmod_class,  	.main_clk	= "sr2_fck",  	.prcm		= { @@ -1638,25 +1670,20 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {  /* usb_otg_hs */  static struct omap_hwmod_irq_info am35xx_usbhsotg_mpu_irqs[] = { -  	{ .name = "mc", .irq = 71 },  	{ .irq = -1 }  };  static struct omap_hwmod_class am35xx_usbotg_class = {  	.name = "am35xx_usbotg", -	.sysc = NULL,  };  static struct omap_hwmod am35xx_usbhsotg_hwmod = {  	.name		= "am35x_otg_hs",  	.mpu_irqs	= am35xx_usbhsotg_mpu_irqs, -	.main_clk	= NULL, -	.prcm = { -		.omap2 = { -		}, -	}, +	.main_clk	= "hsotgusb_fck",  	.class		= &am35xx_usbotg_class, +	.flags		= HWMOD_NO_IDLEST,  };  /* MMC/SD/SDIO common */ @@ -2097,9 +2124,10 @@ static struct omap_hwmod_ocp_if omap3xxx_usbhsotg__l3 = {  static struct omap_hwmod_ocp_if am35xx_usbhsotg__l3 = {  	.master		= &am35xx_usbhsotg_hwmod,  	.slave		= &omap3xxx_l3_main_hwmod, -	.clk		= "core_l3_ick", +	.clk		= "hsotgusb_ick",  	.user		= OCP_USER_MPU,  }; +  /* L4_CORE -> L4_WKUP interface */  static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {  	.master	= &omap3xxx_l4_core_hwmod, @@ -2243,6 +2271,7 @@ static struct omap_hwmod_addr_space am35xx_uart4_addr_space[] = {  		.pa_end		= OMAP3_UART4_AM35XX_BASE + SZ_1K - 1,  		.flags		= ADDR_MAP_ON_INIT | ADDR_TYPE_RT,  	}, +	{ }  };  static struct omap_hwmod_ocp_if am35xx_l4_core__uart4 = { @@ -2393,7 +2422,7 @@ static struct omap_hwmod_addr_space am35xx_usbhsotg_addrs[] = {  static struct omap_hwmod_ocp_if am35xx_l4_core__usbhsotg = {  	.master		= &omap3xxx_l4_core_hwmod,  	.slave		= &am35xx_usbhsotg_hwmod, -	.clk		= "l4_ick", +	.clk		= "hsotgusb_ick",  	.addr		= am35xx_usbhsotg_addrs,  	.user		= OCP_USER_MPU,  }; @@ -3138,6 +3167,107 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__counter_32k = {  	.user		= OCP_USER_MPU | OCP_USER_SDMA,  }; +/* am35xx has Davinci MDIO & EMAC */ +static struct omap_hwmod_class am35xx_mdio_class = { +	.name = "davinci_mdio", +}; + +static struct omap_hwmod am35xx_mdio_hwmod = { +	.name		= "davinci_mdio", +	.class		= &am35xx_mdio_class, +	.flags		= HWMOD_NO_IDLEST, +}; + +/* + * XXX Should be connected to an IPSS hwmod, not the L3 directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_mdio__l3 = { +	.master		= &am35xx_mdio_hwmod, +	.slave		= &omap3xxx_l3_main_hwmod, +	.clk		= "emac_fck", +	.user		= OCP_USER_MPU, +}; + +static struct omap_hwmod_addr_space am35xx_mdio_addrs[] = { +	{ +		.pa_start	= AM35XX_IPSS_MDIO_BASE, +		.pa_end		= AM35XX_IPSS_MDIO_BASE + SZ_4K - 1, +		.flags		= ADDR_TYPE_RT, +	}, +	{ } +}; + +/* l4_core -> davinci mdio  */ +/* + * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_l4_core__mdio = { +	.master		= &omap3xxx_l4_core_hwmod, +	.slave		= &am35xx_mdio_hwmod, +	.clk		= "emac_fck", +	.addr		= am35xx_mdio_addrs, +	.user		= OCP_USER_MPU, +}; + +static struct omap_hwmod_irq_info am35xx_emac_mpu_irqs[] = { +	{ .name = "rxthresh",	.irq = INT_35XX_EMAC_C0_RXTHRESH_IRQ }, +	{ .name = "rx_pulse",	.irq = INT_35XX_EMAC_C0_RX_PULSE_IRQ }, +	{ .name = "tx_pulse",	.irq = INT_35XX_EMAC_C0_TX_PULSE_IRQ }, +	{ .name = "misc_pulse",	.irq = INT_35XX_EMAC_C0_MISC_PULSE_IRQ }, +	{ .irq = -1 } +}; + +static struct omap_hwmod_class am35xx_emac_class = { +	.name = "davinci_emac", +}; + +static struct omap_hwmod am35xx_emac_hwmod = { +	.name		= "davinci_emac", +	.mpu_irqs	= am35xx_emac_mpu_irqs, +	.class		= &am35xx_emac_class, +	.flags		= HWMOD_NO_IDLEST, +}; + +/* l3_core -> davinci emac interface */ +/* + * XXX Should be connected to an IPSS hwmod, not the L3 directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_emac__l3 = { +	.master		= &am35xx_emac_hwmod, +	.slave		= &omap3xxx_l3_main_hwmod, +	.clk		= "emac_ick", +	.user		= OCP_USER_MPU, +}; + +static struct omap_hwmod_addr_space am35xx_emac_addrs[] = { +	{ +		.pa_start	= AM35XX_IPSS_EMAC_BASE, +		.pa_end		= AM35XX_IPSS_EMAC_BASE + 0x30000 - 1, +		.flags		= ADDR_TYPE_RT, +	}, +	{ } +}; + +/* l4_core -> davinci emac  */ +/* + * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_l4_core__emac = { +	.master		= &omap3xxx_l4_core_hwmod, +	.slave		= &am35xx_emac_hwmod, +	.clk		= "emac_ick", +	.addr		= am35xx_emac_addrs, +	.user		= OCP_USER_MPU, +}; +  static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {  	&omap3xxx_l3_main__l4_core,  	&omap3xxx_l3_main__l4_per, @@ -3266,6 +3396,10 @@ static struct omap_hwmod_ocp_if *am35xx_hwmod_ocp_ifs[] __initdata = {  	&omap3xxx_l4_core__usb_tll_hs,  	&omap3xxx_l4_core__es3plus_mmc1,  	&omap3xxx_l4_core__es3plus_mmc2, +	&am35xx_mdio__l3, +	&am35xx_l4_core__mdio, +	&am35xx_emac__l3, +	&am35xx_l4_core__emac,  	NULL  }; @@ -3283,6 +3417,8 @@ int __init omap3xxx_hwmod_init(void)  	struct omap_hwmod_ocp_if **h = NULL;  	unsigned int rev; +	omap_hwmod_init(); +  	/* Register hwmod links common to all OMAP3 */  	r = omap_hwmod_register_links(omap3xxx_hwmod_ocp_ifs);  	if (r < 0) diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index b7bcba5221b..242aee498ce 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -19,6 +19,7 @@   */  #include <linux/io.h> +#include <linux/power/smartreflex.h>  #include <plat/omap_hwmod.h>  #include <plat/cpu.h> @@ -32,8 +33,6 @@  #include <plat/common.h>  #include "omap_hwmod_common_data.h" - -#include "smartreflex.h"  #include "cm1_44xx.h"  #include "cm2_44xx.h"  #include "prm44xx.h" @@ -2544,14 +2543,12 @@ static struct omap_hwmod omap44xx_prcm_mpu_hwmod = {  static struct omap_hwmod omap44xx_cm_core_aon_hwmod = {  	.name		= "cm_core_aon",  	.class		= &omap44xx_prcm_hwmod_class, -	.clkdm_name	= "cm_clkdm",  };  /* cm_core */  static struct omap_hwmod omap44xx_cm_core_hwmod = {  	.name		= "cm_core",  	.class		= &omap44xx_prcm_hwmod_class, -	.clkdm_name	= "cm_clkdm",  };  /* prm */ @@ -2568,7 +2565,6 @@ static struct omap_hwmod_rst_info omap44xx_prm_resets[] = {  static struct omap_hwmod omap44xx_prm_hwmod = {  	.name		= "prm",  	.class		= &omap44xx_prcm_hwmod_class, -	.clkdm_name	= "prm_clkdm",  	.mpu_irqs	= omap44xx_prm_irqs,  	.rst_lines	= omap44xx_prm_resets,  	.rst_lines_cnt	= ARRAY_SIZE(omap44xx_prm_resets), @@ -2947,7 +2943,6 @@ static struct omap_hwmod omap44xx_timer2_hwmod = {  			.modulemode   = MODULEMODE_SWCTRL,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  };  /* timer3 */ @@ -2969,7 +2964,6 @@ static struct omap_hwmod omap44xx_timer3_hwmod = {  			.modulemode   = MODULEMODE_SWCTRL,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  };  /* timer4 */ @@ -2991,7 +2985,6 @@ static struct omap_hwmod omap44xx_timer4_hwmod = {  			.modulemode   = MODULEMODE_SWCTRL,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  };  /* timer5 */ @@ -3013,7 +3006,6 @@ static struct omap_hwmod omap44xx_timer5_hwmod = {  			.modulemode   = MODULEMODE_SWCTRL,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  };  /* timer6 */ @@ -3036,7 +3028,6 @@ static struct omap_hwmod omap44xx_timer6_hwmod = {  			.modulemode   = MODULEMODE_SWCTRL,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  };  /* timer7 */ @@ -3058,7 +3049,6 @@ static struct omap_hwmod omap44xx_timer7_hwmod = {  			.modulemode   = MODULEMODE_SWCTRL,  		},  	}, -	.dev_attr	= &capability_alwon_dev_attr,  };  /* timer8 */ @@ -6148,6 +6138,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {  int __init omap44xx_hwmod_init(void)  { +	omap_hwmod_init();  	return omap_hwmod_register_links(omap44xx_hwmod_ocp_ifs);  } diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.c b/arch/arm/mach-omap2/omap_hwmod_common_data.c index 51e5418899f..9f1ccdc8cc8 100644 --- a/arch/arm/mach-omap2/omap_hwmod_common_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_common_data.c @@ -47,6 +47,16 @@ struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2 = {  	.midle_shift	= SYSC_TYPE2_MIDLEMODE_SHIFT,  	.sidle_shift	= SYSC_TYPE2_SIDLEMODE_SHIFT,  	.srst_shift	= SYSC_TYPE2_SOFTRESET_SHIFT, +	.dmadisable_shift = SYSC_TYPE2_DMADISABLE_SHIFT, +}; + +/** + * struct omap_hwmod_sysc_type3 - TYPE3 sysconfig scheme. + * Used by some IPs on AM33xx + */ +struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3 = { +	.midle_shift	= SYSC_TYPE3_MIDLEMODE_SHIFT, +	.sidle_shift	= SYSC_TYPE3_SIDLEMODE_SHIFT,  };  struct omap_dss_dispc_dev_attr omap2_3_dss_dispc_dev_attr = { diff --git a/arch/arm/mach-omap2/omap_l3_noc.h b/arch/arm/mach-omap2/omap_l3_noc.h index 90b50984cd2..a6ce34dc481 100644 --- a/arch/arm/mach-omap2/omap_l3_noc.h +++ b/arch/arm/mach-omap2/omap_l3_noc.h @@ -51,7 +51,9 @@ static u32 l3_targ_inst_clk1[] = {  	0x200, /* DMM2 */  	0x300, /* ABE */  	0x400, /* L4CFG */ -	0x600  /* CLK2 PWR DISC */ +	0x600,  /* CLK2 PWR DISC */ +	0x0,	/* Host CLK1 */ +	0x900	/* L4 Wakeup */  };  static u32 l3_targ_inst_clk2[] = { @@ -72,11 +74,16 @@ static u32 l3_targ_inst_clk2[] = {  	0xE00, /* missing in TRM corresponds to AES2*/  	0xC00, /* L4 PER3 */  	0xA00, /* L4 PER1*/ -	0xB00 /* L4 PER2*/ +	0xB00, /* L4 PER2*/ +	0x0, /* HOST CLK2 */ +	0x1800, /* CAL */ +	0x1700 /* LLI */  };  static u32 l3_targ_inst_clk3[] = { -	0x0100	/* EMUSS */ +	0x0100	/* EMUSS */, +	0x0300, /* DEBUGSS_CT_TBR */ +	0x0 /* HOST CLK3 */  };  static struct l3_masters_data { @@ -110,13 +117,15 @@ static struct l3_masters_data {  	{ 0xC8, "USBHOSTFS"}  }; -static char *l3_targ_inst_name[L3_MODULES][18] = { +static char *l3_targ_inst_name[L3_MODULES][21] = {  	{  		"DMM1",  		"DMM2",  		"ABE",  		"L4CFG",  		"CLK2 PWR DISC", +		"HOST CLK1", +		"L4 WAKEUP"  	},  	{  		"CORTEX M3" , @@ -137,9 +146,14 @@ static char *l3_targ_inst_name[L3_MODULES][18] = {  		"L4 PER3",  		"L4 PER1",  		"L4 PER2", +		"HOST CLK2", +		"CAL", +		"LLI"  	},  	{  		"EMUSS", +		"DEBUG SOURCE", +		"HOST CLK3"  	},  }; diff --git a/arch/arm/mach-omap2/opp.c b/arch/arm/mach-omap2/opp.c index de6d4645174..d8f6dbf45d1 100644 --- a/arch/arm/mach-omap2/opp.c +++ b/arch/arm/mach-omap2/opp.c @@ -53,7 +53,7 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def,  	omap_table_init = 1;  	/* Lets now register with OPP library */ -	for (i = 0; i < opp_def_size; i++) { +	for (i = 0; i < opp_def_size; i++, opp_def++) {  		struct omap_hwmod *oh;  		struct device *dev; @@ -86,7 +86,6 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def,  					__func__, opp_def->freq,  					opp_def->hwmod_name, i, r);  		} -		opp_def++;  	}  	return 0; diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 78564895e91..686137d164d 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h @@ -15,12 +15,25 @@  #include "powerdomain.h" +#ifdef CONFIG_CPU_IDLE +extern int __init omap3_idle_init(void); +extern int __init omap4_idle_init(void); +#else +static inline int omap3_idle_init(void) +{ +	return 0; +} + +static inline int omap4_idle_init(void) +{ +	return 0; +} +#endif +  extern void *omap3_secure_ram_storage;  extern void omap3_pm_off_mode_enable(int);  extern void omap_sram_idle(void);  extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state); -extern int omap3_idle_init(void); -extern int omap4_idle_init(void);  extern int omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused);  extern int (*omap_pm_suspend)(void); @@ -88,7 +101,7 @@ extern void enable_omap3630_toggle_l2_on_restore(void);  static inline void enable_omap3630_toggle_l2_on_restore(void) { }  #endif		/* defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3) */ -#ifdef CONFIG_OMAP_SMARTREFLEX +#ifdef CONFIG_POWER_AVS_OMAP  extern int omap_devinit_smartreflex(void);  extern void omap_enable_smartreflex_on_init(void);  #else diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 3a595e89972..e4fc88c65db 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -70,34 +70,6 @@ void (*omap3_do_wfi_sram)(void);  static struct powerdomain *mpu_pwrdm, *neon_pwrdm;  static struct powerdomain *core_pwrdm, *per_pwrdm; -static struct powerdomain *cam_pwrdm; - -static void omap3_enable_io_chain(void) -{ -	int timeout = 0; - -	omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, -				   PM_WKEN); -	/* Do a readback to assure write has been done */ -	omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN); - -	while (!(omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN) & -		 OMAP3430_ST_IO_CHAIN_MASK)) { -		timeout++; -		if (timeout > 1000) { -			pr_err("Wake up daisy chain activation failed.\n"); -			return; -		} -		omap2_prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, -					   WKUP_MOD, PM_WKEN); -	} -} - -static void omap3_disable_io_chain(void) -{ -	omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, -				     PM_WKEN); -}  static void omap3_core_save_context(void)  { @@ -299,24 +271,22 @@ void omap_sram_idle(void)  	/* Enable IO-PAD and IO-CHAIN wakeups */  	per_next_state = pwrdm_read_next_pwrst(per_pwrdm);  	core_next_state = pwrdm_read_next_pwrst(core_pwrdm); -	if (omap3_has_io_wakeup() && -	    (per_next_state < PWRDM_POWER_ON || -	     core_next_state < PWRDM_POWER_ON)) { -		omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, PM_WKEN); -		if (omap3_has_io_chain_ctrl()) -			omap3_enable_io_chain(); -	} -	pwrdm_pre_transition(); +	if (mpu_next_state < PWRDM_POWER_ON) { +		pwrdm_pre_transition(mpu_pwrdm); +		pwrdm_pre_transition(neon_pwrdm); +	}  	/* PER */  	if (per_next_state < PWRDM_POWER_ON) { +		pwrdm_pre_transition(per_pwrdm);  		per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0;  		omap2_gpio_prepare_for_idle(per_going_off);  	}  	/* CORE */  	if (core_next_state < PWRDM_POWER_ON) { +		pwrdm_pre_transition(core_pwrdm);  		if (core_next_state == PWRDM_POWER_OFF) {  			omap3_core_save_context();  			omap3_cm_save_context(); @@ -369,26 +339,20 @@ void omap_sram_idle(void)  			omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK,  					       OMAP3430_GR_MOD,  					       OMAP3_PRM_VOLTCTRL_OFFSET); +		pwrdm_post_transition(core_pwrdm);  	}  	omap3_intc_resume_idle(); -	pwrdm_post_transition(); -  	/* PER */ -	if (per_next_state < PWRDM_POWER_ON) +	if (per_next_state < PWRDM_POWER_ON) {  		omap2_gpio_resume_after_idle(); - -	/* Disable IO-PAD and IO-CHAIN wakeup */ -	if (omap3_has_io_wakeup() && -	    (per_next_state < PWRDM_POWER_ON || -	     core_next_state < PWRDM_POWER_ON)) { -		omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, -					     PM_WKEN); -		if (omap3_has_io_chain_ctrl()) -			omap3_disable_io_chain(); +		pwrdm_post_transition(per_pwrdm);  	} -	clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]); +	if (mpu_next_state < PWRDM_POWER_ON) { +		pwrdm_post_transition(mpu_pwrdm); +		pwrdm_post_transition(neon_pwrdm); +	}  }  static void omap3_pm_idle(void) @@ -581,10 +545,13 @@ static void __init prcm_setup_regs(void)  			  OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);  	/* Don't attach IVA interrupts */ -	omap2_prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); -	omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); -	omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); -	omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); +	if (omap3_has_iva()) { +		omap2_prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); +		omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); +		omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); +		omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD, +					OMAP3430_PM_IVAGRPSEL); +	}  	/* Clear any pending 'reset' flags */  	omap2_prm_write_mod_reg(0xffffffff, MPU_MOD, OMAP2_RM_RSTST); @@ -598,7 +565,9 @@ static void __init prcm_setup_regs(void)  	/* Clear any pending PRCM interrupts */  	omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); -	omap3_iva_idle(); +	if (omap3_has_iva()) +		omap3_iva_idle(); +  	omap3_d2d_idle();  } @@ -749,7 +718,6 @@ int __init omap3_pm_init(void)  	neon_pwrdm = pwrdm_lookup("neon_pwrdm");  	per_pwrdm = pwrdm_lookup("per_pwrdm");  	core_pwrdm = pwrdm_lookup("core_pwrdm"); -	cam_pwrdm = pwrdm_lookup("cam_pwrdm");  	neon_clkdm = clkdm_lookup("neon_clkdm");  	mpu_clkdm = clkdm_lookup("mpu_clkdm"); diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 96114901b93..69b36e185e9 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c @@ -526,7 +526,8 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)   *   * Return the powerdomain @pwrdm's current power state.	Returns -EINVAL   * if the powerdomain pointer is null or returns the current power state - * upon success. + * upon success. Note that if the power domain only supports the ON state + * then just return ON as the current state.   */  int pwrdm_read_pwrst(struct powerdomain *pwrdm)  { @@ -535,6 +536,9 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)  	if (!pwrdm)  		return -EINVAL; +	if (pwrdm->pwrsts == PWRSTS_ON) +		return PWRDM_POWER_ON; +  	if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)  		ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm); @@ -981,15 +985,23 @@ int pwrdm_state_switch(struct powerdomain *pwrdm)  	return ret;  } -int pwrdm_pre_transition(void) +int pwrdm_pre_transition(struct powerdomain *pwrdm)  { -	pwrdm_for_each(_pwrdm_pre_transition_cb, NULL); +	if (pwrdm) +		_pwrdm_pre_transition_cb(pwrdm, NULL); +	else +		pwrdm_for_each(_pwrdm_pre_transition_cb, NULL); +  	return 0;  } -int pwrdm_post_transition(void) +int pwrdm_post_transition(struct powerdomain *pwrdm)  { -	pwrdm_for_each(_pwrdm_post_transition_cb, NULL); +	if (pwrdm) +		_pwrdm_post_transition_cb(pwrdm, NULL); +	else +		pwrdm_for_each(_pwrdm_post_transition_cb, NULL); +  	return 0;  } diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h index 8f88d65c46e..baee90608d1 100644 --- a/arch/arm/mach-omap2/powerdomain.h +++ b/arch/arm/mach-omap2/powerdomain.h @@ -67,9 +67,9 @@  /*   * Maximum number of clockdomains that can be associated with a powerdomain. - * CORE powerdomain on OMAP4 is the worst case + * PER powerdomain on AM33XX is the worst case   */ -#define PWRDM_MAX_CLKDMS	9 +#define PWRDM_MAX_CLKDMS	11  /* XXX A completely arbitrary number. What is reasonable here? */  #define PWRDM_TRANSITION_BAILOUT 100000 @@ -92,6 +92,15 @@ struct powerdomain;   * @pwrdm_clkdms: Clockdomains in this powerdomain   * @node: list_head linking all powerdomains   * @voltdm_node: list_head linking all powerdomains in a voltagedomain + * @pwrstctrl_offs: (AM33XX only) XXX_PWRSTCTRL reg offset from prcm_offs + * @pwrstst_offs: (AM33XX only) XXX_PWRSTST reg offset from prcm_offs + * @logicretstate_mask: (AM33XX only) mask for logic retention bitfield + *	in @pwrstctrl_offs + * @mem_on_mask: (AM33XX only) mask for mem on bitfield in @pwrstctrl_offs + * @mem_ret_mask: (AM33XX only) mask for mem ret bitfield in @pwrstctrl_offs + * @mem_pwrst_mask: (AM33XX only) mask for mem state bitfield in @pwrstst_offs + * @mem_retst_mask: (AM33XX only) mask for mem retention state bitfield + *	in @pwrstctrl_offs   * @state:   * @state_counter:   * @timer: @@ -121,6 +130,14 @@ struct powerdomain {  	unsigned ret_logic_off_counter;  	unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS]; +	const u8 pwrstctrl_offs; +	const u8 pwrstst_offs; +	const u32 logicretstate_mask; +	const u32 mem_on_mask[PWRDM_MAX_MEM_BANKS]; +	const u32 mem_ret_mask[PWRDM_MAX_MEM_BANKS]; +	const u32 mem_pwrst_mask[PWRDM_MAX_MEM_BANKS]; +	const u32 mem_retst_mask[PWRDM_MAX_MEM_BANKS]; +  #ifdef CONFIG_PM_DEBUG  	s64 timer;  	s64 state_timer[PWRDM_MAX_PWRSTS]; @@ -213,8 +230,8 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm);  int pwrdm_wait_transition(struct powerdomain *pwrdm);  int pwrdm_state_switch(struct powerdomain *pwrdm); -int pwrdm_pre_transition(void); -int pwrdm_post_transition(void); +int pwrdm_pre_transition(struct powerdomain *pwrdm); +int pwrdm_post_transition(struct powerdomain *pwrdm);  int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm);  int pwrdm_get_context_loss_count(struct powerdomain *pwrdm);  bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); @@ -222,10 +239,12 @@ bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm);  extern void omap242x_powerdomains_init(void);  extern void omap243x_powerdomains_init(void);  extern void omap3xxx_powerdomains_init(void); +extern void am33xx_powerdomains_init(void);  extern void omap44xx_powerdomains_init(void);  extern struct pwrdm_ops omap2_pwrdm_operations;  extern struct pwrdm_ops omap3_pwrdm_operations; +extern struct pwrdm_ops am33xx_pwrdm_operations;  extern struct pwrdm_ops omap4_pwrdm_operations;  /* Common Internal functions used across OMAP rev's */ diff --git a/arch/arm/mach-omap2/powerdomain33xx.c b/arch/arm/mach-omap2/powerdomain33xx.c new file mode 100644 index 00000000000..67c5663899b --- /dev/null +++ b/arch/arm/mach-omap2/powerdomain33xx.c @@ -0,0 +1,229 @@ +/* + * AM33XX Powerdomain control + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * Derived from mach-omap2/powerdomain44xx.c written by Rajendra Nayak + * <rnayak@ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/io.h> +#include <linux/errno.h> +#include <linux/delay.h> + +#include <plat/prcm.h> + +#include "powerdomain.h" +#include "prm33xx.h" +#include "prm-regbits-33xx.h" + + +static int am33xx_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) +{ +	am33xx_prm_rmw_reg_bits(OMAP_POWERSTATE_MASK, +				(pwrst << OMAP_POWERSTATE_SHIFT), +				pwrdm->prcm_offs, pwrdm->pwrstctrl_offs); +	return 0; +} + +static int am33xx_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) +{ +	u32 v; + +	v = am33xx_prm_read_reg(pwrdm->prcm_offs,  pwrdm->pwrstctrl_offs); +	v &= OMAP_POWERSTATE_MASK; +	v >>= OMAP_POWERSTATE_SHIFT; + +	return v; +} + +static int am33xx_pwrdm_read_pwrst(struct powerdomain *pwrdm) +{ +	u32 v; + +	v = am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstst_offs); +	v &= OMAP_POWERSTATEST_MASK; +	v >>= OMAP_POWERSTATEST_SHIFT; + +	return v; +} + +static int am33xx_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm) +{ +	u32 v; + +	v = am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstst_offs); +	v &= AM33XX_LASTPOWERSTATEENTERED_MASK; +	v >>= AM33XX_LASTPOWERSTATEENTERED_SHIFT; + +	return v; +} + +static int am33xx_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm) +{ +	am33xx_prm_rmw_reg_bits(AM33XX_LOWPOWERSTATECHANGE_MASK, +				(1 << AM33XX_LOWPOWERSTATECHANGE_SHIFT), +				pwrdm->prcm_offs, pwrdm->pwrstctrl_offs); +	return 0; +} + +static int am33xx_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm) +{ +	am33xx_prm_rmw_reg_bits(AM33XX_LASTPOWERSTATEENTERED_MASK, +				AM33XX_LASTPOWERSTATEENTERED_MASK, +				pwrdm->prcm_offs, pwrdm->pwrstst_offs); +	return 0; +} + +static int am33xx_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst) +{ +	u32 m; + +	m = pwrdm->logicretstate_mask; +	if (!m) +		return -EINVAL; + +	am33xx_prm_rmw_reg_bits(m, (pwrst << __ffs(m)), +				pwrdm->prcm_offs, pwrdm->pwrstctrl_offs); + +	return 0; +} + +static int am33xx_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm) +{ +	u32 v; + +	v = am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstst_offs); +	v &= AM33XX_LOGICSTATEST_MASK; +	v >>= AM33XX_LOGICSTATEST_SHIFT; + +	return v; +} + +static int am33xx_pwrdm_read_logic_retst(struct powerdomain *pwrdm) +{ +	u32 v, m; + +	m = pwrdm->logicretstate_mask; +	if (!m) +		return -EINVAL; + +	v = am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstctrl_offs); +	v &= m; +	v >>= __ffs(m); + +	return v; +} + +static int am33xx_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, +		u8 pwrst) +{ +	u32 m; + +	m = pwrdm->mem_on_mask[bank]; +	if (!m) +		return -EINVAL; + +	am33xx_prm_rmw_reg_bits(m, (pwrst << __ffs(m)), +				pwrdm->prcm_offs, pwrdm->pwrstctrl_offs); + +	return 0; +} + +static int am33xx_pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, +					u8 pwrst) +{ +	u32 m; + +	m = pwrdm->mem_ret_mask[bank]; +	if (!m) +		return -EINVAL; + +	am33xx_prm_rmw_reg_bits(m, (pwrst << __ffs(m)), +				pwrdm->prcm_offs, pwrdm->pwrstctrl_offs); + +	return 0; +} + +static int am33xx_pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank) +{ +	u32 m, v; + +	m = pwrdm->mem_pwrst_mask[bank]; +	if (!m) +		return -EINVAL; + +	v = am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstst_offs); +	v &= m; +	v >>= __ffs(m); + +	return v; +} + +static int am33xx_pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank) +{ +	u32 m, v; + +	m = pwrdm->mem_retst_mask[bank]; +	if (!m) +		return -EINVAL; + +	v = am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstctrl_offs); +	v &= m; +	v >>= __ffs(m); + +	return v; +} + +static int am33xx_pwrdm_wait_transition(struct powerdomain *pwrdm) +{ +	u32 c = 0; + +	/* +	 * REVISIT: pwrdm_wait_transition() may be better implemented +	 * via a callback and a periodic timer check -- how long do we expect +	 * powerdomain transitions to take? +	 */ + +	/* XXX Is this udelay() value meaningful? */ +	while ((am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstst_offs) +			& OMAP_INTRANSITION_MASK) && +			(c++ < PWRDM_TRANSITION_BAILOUT)) +		udelay(1); + +	if (c > PWRDM_TRANSITION_BAILOUT) { +		pr_err("powerdomain: %s: waited too long to complete transition\n", +		       pwrdm->name); +		return -EAGAIN; +	} + +	pr_debug("powerdomain: completed transition in %d loops\n", c); + +	return 0; +} + +struct pwrdm_ops am33xx_pwrdm_operations = { +	.pwrdm_set_next_pwrst		= am33xx_pwrdm_set_next_pwrst, +	.pwrdm_read_next_pwrst		= am33xx_pwrdm_read_next_pwrst, +	.pwrdm_read_pwrst		= am33xx_pwrdm_read_pwrst, +	.pwrdm_read_prev_pwrst		= am33xx_pwrdm_read_prev_pwrst, +	.pwrdm_set_logic_retst		= am33xx_pwrdm_set_logic_retst, +	.pwrdm_read_logic_pwrst		= am33xx_pwrdm_read_logic_pwrst, +	.pwrdm_read_logic_retst		= am33xx_pwrdm_read_logic_retst, +	.pwrdm_clear_all_prev_pwrst	= am33xx_pwrdm_clear_all_prev_pwrst, +	.pwrdm_set_lowpwrstchange	= am33xx_pwrdm_set_lowpwrstchange, +	.pwrdm_read_mem_pwrst		= am33xx_pwrdm_read_mem_pwrst, +	.pwrdm_read_mem_retst		= am33xx_pwrdm_read_mem_retst, +	.pwrdm_set_mem_onst		= am33xx_pwrdm_set_mem_onst, +	.pwrdm_set_mem_retst		= am33xx_pwrdm_set_mem_retst, +	.pwrdm_wait_transition		= am33xx_pwrdm_wait_transition, +}; diff --git a/arch/arm/mach-omap2/powerdomains33xx_data.c b/arch/arm/mach-omap2/powerdomains33xx_data.c new file mode 100644 index 00000000000..869adb82569 --- /dev/null +++ b/arch/arm/mach-omap2/powerdomains33xx_data.c @@ -0,0 +1,185 @@ +/* + * AM33XX Power domain data + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> +#include <linux/init.h> + +#include "powerdomain.h" +#include "prcm-common.h" +#include "prm-regbits-33xx.h" +#include "prm33xx.h" + +static struct powerdomain gfx_33xx_pwrdm = { +	.name			= "gfx_pwrdm", +	.voltdm			= { .name = "core" }, +	.prcm_offs		= AM33XX_PRM_GFX_MOD, +	.pwrstctrl_offs		= AM33XX_PM_GFX_PWRSTCTRL_OFFSET, +	.pwrstst_offs		= AM33XX_PM_GFX_PWRSTST_OFFSET, +	.pwrsts			= PWRSTS_OFF_RET_ON, +	.pwrsts_logic_ret	= PWRSTS_OFF_RET, +	.flags			= PWRDM_HAS_LOWPOWERSTATECHANGE, +	.banks			= 1, +	.logicretstate_mask	= AM33XX_LOGICRETSTATE_MASK, +	.mem_on_mask		= { +		[0]		= AM33XX_GFX_MEM_ONSTATE_MASK,	/* gfx_mem */ +	}, +	.mem_ret_mask		= { +		[0]		= AM33XX_GFX_MEM_RETSTATE_MASK,	/* gfx_mem */ +	}, +	.mem_pwrst_mask		= { +		[0]		= AM33XX_GFX_MEM_STATEST_MASK,	/* gfx_mem */ +	}, +	.mem_retst_mask		= { +		[0]		= AM33XX_GFX_MEM_RETSTATE_MASK,	/* gfx_mem */ +	}, +	.pwrsts_mem_ret		= { +		[0]		= PWRSTS_OFF_RET,	/* gfx_mem */ +	}, +	.pwrsts_mem_on		= { +		[0]		= PWRSTS_ON,		/* gfx_mem */ +	}, +}; + +static struct powerdomain rtc_33xx_pwrdm = { +	.name			= "rtc_pwrdm", +	.voltdm			= { .name = "rtc" }, +	.prcm_offs		= AM33XX_PRM_RTC_MOD, +	.pwrstctrl_offs		= AM33XX_PM_RTC_PWRSTCTRL_OFFSET, +	.pwrstst_offs		= AM33XX_PM_RTC_PWRSTST_OFFSET, +	.pwrsts			= PWRSTS_ON, +	.logicretstate_mask	= AM33XX_LOGICRETSTATE_MASK, +}; + +static struct powerdomain wkup_33xx_pwrdm = { +	.name			= "wkup_pwrdm", +	.voltdm			= { .name = "core" }, +	.prcm_offs		= AM33XX_PRM_WKUP_MOD, +	.pwrstctrl_offs		= AM33XX_PM_WKUP_PWRSTCTRL_OFFSET, +	.pwrstst_offs		= AM33XX_PM_WKUP_PWRSTST_OFFSET, +	.pwrsts			= PWRSTS_ON, +	.logicretstate_mask	= AM33XX_LOGICRETSTATE_3_3_MASK, +}; + +static struct powerdomain per_33xx_pwrdm = { +	.name			= "per_pwrdm", +	.voltdm			= { .name = "core" }, +	.prcm_offs		= AM33XX_PRM_PER_MOD, +	.pwrstctrl_offs		= AM33XX_PM_PER_PWRSTCTRL_OFFSET, +	.pwrstst_offs		= AM33XX_PM_PER_PWRSTST_OFFSET, +	.pwrsts			= PWRSTS_OFF_RET_ON, +	.pwrsts_logic_ret	= PWRSTS_OFF_RET, +	.flags			= PWRDM_HAS_LOWPOWERSTATECHANGE, +	.banks			= 3, +	.logicretstate_mask	= AM33XX_LOGICRETSTATE_3_3_MASK, +	.mem_on_mask		= { +		[0]		= AM33XX_PRUSS_MEM_ONSTATE_MASK, /* pruss_mem */ +		[1]		= AM33XX_PER_MEM_ONSTATE_MASK,	/* per_mem */ +		[2]		= AM33XX_RAM_MEM_ONSTATE_MASK,	/* ram_mem */ +	}, +	.mem_ret_mask		= { +		[0]		= AM33XX_PRUSS_MEM_RETSTATE_MASK, /* pruss_mem */ +		[1]		= AM33XX_PER_MEM_RETSTATE_MASK,	/* per_mem */ +		[2]		= AM33XX_RAM_MEM_RETSTATE_MASK,	/* ram_mem */ +	}, +	.mem_pwrst_mask		= { +		[0]		= AM33XX_PRUSS_MEM_STATEST_MASK, /* pruss_mem */ +		[1]		= AM33XX_PER_MEM_STATEST_MASK,	/* per_mem */ +		[2]		= AM33XX_RAM_MEM_STATEST_MASK,	/* ram_mem */ +	}, +	.mem_retst_mask		= { +		[0]		= AM33XX_PRUSS_MEM_RETSTATE_MASK, /* pruss_mem */ +		[1]		= AM33XX_PER_MEM_RETSTATE_MASK,	/* per_mem */ +		[2]		= AM33XX_RAM_MEM_RETSTATE_MASK,	/* ram_mem */ +	}, +	.pwrsts_mem_ret		= { +		[0]		= PWRSTS_OFF_RET,	/* pruss_mem */ +		[1]		= PWRSTS_OFF_RET,	/* per_mem */ +		[2]		= PWRSTS_OFF_RET,	/* ram_mem */ +	}, +	.pwrsts_mem_on		= { +		[0]		= PWRSTS_ON,		/* pruss_mem */ +		[1]		= PWRSTS_ON,		/* per_mem */ +		[2]		= PWRSTS_ON,		/* ram_mem */ +	}, +}; + +static struct powerdomain mpu_33xx_pwrdm = { +	.name			= "mpu_pwrdm", +	.voltdm			= { .name = "mpu" }, +	.prcm_offs		= AM33XX_PRM_MPU_MOD, +	.pwrstctrl_offs		= AM33XX_PM_MPU_PWRSTCTRL_OFFSET, +	.pwrstst_offs		= AM33XX_PM_MPU_PWRSTST_OFFSET, +	.pwrsts			= PWRSTS_OFF_RET_ON, +	.pwrsts_logic_ret	= PWRSTS_OFF_RET, +	.flags			= PWRDM_HAS_LOWPOWERSTATECHANGE, +	.banks			= 3, +	.logicretstate_mask	= AM33XX_LOGICRETSTATE_MASK, +	.mem_on_mask		= { +		[0]		= AM33XX_MPU_L1_ONSTATE_MASK,	/* mpu_l1 */ +		[1]		= AM33XX_MPU_L2_ONSTATE_MASK,	/* mpu_l2 */ +		[2]		= AM33XX_MPU_RAM_ONSTATE_MASK,	/* mpu_ram */ +	}, +	.mem_ret_mask		= { +		[0]		= AM33XX_MPU_L1_RETSTATE_MASK,	/* mpu_l1 */ +		[1]		= AM33XX_MPU_L2_RETSTATE_MASK,	/* mpu_l2 */ +		[2]		= AM33XX_MPU_RAM_RETSTATE_MASK,	/* mpu_ram */ +	}, +	.mem_pwrst_mask		= { +		[0]		= AM33XX_MPU_L1_STATEST_MASK,	/* mpu_l1 */ +		[1]		= AM33XX_MPU_L2_STATEST_MASK,	/* mpu_l2 */ +		[2]		= AM33XX_MPU_RAM_STATEST_MASK,	/* mpu_ram */ +	}, +	.mem_retst_mask		= { +		[0]		= AM33XX_MPU_L1_RETSTATE_MASK,	/* mpu_l1 */ +		[1]		= AM33XX_MPU_L2_RETSTATE_MASK,	/* mpu_l2 */ +		[2]		= AM33XX_MPU_RAM_RETSTATE_MASK,	/* mpu_ram */ +	}, +	.pwrsts_mem_ret		= { +		[0]		= PWRSTS_OFF_RET,	/* mpu_l1 */ +		[1]		= PWRSTS_OFF_RET,	/* mpu_l2 */ +		[2]		= PWRSTS_OFF_RET,	/* mpu_ram */ +	}, +	.pwrsts_mem_on		= { +		[0]		= PWRSTS_ON,		/* mpu_l1 */ +		[1]		= PWRSTS_ON,		/* mpu_l2 */ +		[2]		= PWRSTS_ON,		/* mpu_ram */ +	}, +}; + +static struct powerdomain cefuse_33xx_pwrdm = { +	.name		= "cefuse_pwrdm", +	.voltdm		= { .name = "core" }, +	.prcm_offs	= AM33XX_PRM_CEFUSE_MOD, +	.pwrstctrl_offs	= AM33XX_PM_CEFUSE_PWRSTCTRL_OFFSET, +	.pwrstst_offs	= AM33XX_PM_CEFUSE_PWRSTST_OFFSET, +	.pwrsts		= PWRSTS_OFF_ON, +}; + +static struct powerdomain *powerdomains_am33xx[] __initdata = { +	&gfx_33xx_pwrdm, +	&rtc_33xx_pwrdm, +	&wkup_33xx_pwrdm, +	&per_33xx_pwrdm, +	&mpu_33xx_pwrdm, +	&cefuse_33xx_pwrdm, +	NULL, +}; + +void __init am33xx_powerdomains_init(void) +{ +	pwrdm_register_platform_funcs(&am33xx_pwrdm_operations); +	pwrdm_register_pwrdms(powerdomains_am33xx); +	pwrdm_complete_init(); +} diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c index fb0a0a6869d..bb883e46307 100644 --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c @@ -71,6 +71,22 @@ static struct powerdomain mpu_3xxx_pwrdm = {  	.voltdm           = { .name = "mpu_iva" },  }; +static struct powerdomain mpu_am35x_pwrdm = { +	.name		  = "mpu_pwrdm", +	.prcm_offs	  = MPU_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.flags		  = PWRDM_HAS_MPU_QUIRK, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON, +	}, +	.voltdm           = { .name = "mpu_iva" }, +}; +  /*   * The USBTLL Save-and-Restore mechanism is broken on   * 3430s up to ES3.0 and 3630ES1.0. Hence this feature @@ -120,6 +136,23 @@ static struct powerdomain core_3xxx_es3_1_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain core_am35x_pwrdm = { +	.name		  = "core_pwrdm", +	.prcm_offs	  = CORE_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 2, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON,	 /* MEM1RETSTATE */ +		[1] = PWRSTS_ON,	 /* MEM2RETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON, /* MEM1ONSTATE */ +		[1] = PWRSTS_ON, /* MEM2ONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  static struct powerdomain dss_pwrdm = {  	.name		  = "dss_pwrdm",  	.prcm_offs	  = OMAP3430_DSS_MOD, @@ -135,6 +168,21 @@ static struct powerdomain dss_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain dss_am35x_pwrdm = { +	.name		  = "dss_pwrdm", +	.prcm_offs	  = OMAP3430_DSS_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, /* MEMRETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON,  /* MEMONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  /*   * Although the 34XX TRM Rev K Table 4-371 notes that retention is a   * possible SGX powerstate, the SGX device itself does not support @@ -156,6 +204,21 @@ static struct powerdomain sgx_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain sgx_am35x_pwrdm = { +	.name		  = "sgx_pwrdm", +	.prcm_offs	  = OMAP3430ES2_SGX_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, /* MEMRETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON,  /* MEMONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  static struct powerdomain cam_pwrdm = {  	.name		  = "cam_pwrdm",  	.prcm_offs	  = OMAP3430_CAM_MOD, @@ -186,6 +249,21 @@ static struct powerdomain per_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain per_am35x_pwrdm = { +	.name		  = "per_pwrdm", +	.prcm_offs	  = OMAP3430_PER_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, /* MEMRETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON,  /* MEMONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  static struct powerdomain emu_pwrdm = {  	.name		= "emu_pwrdm",  	.prcm_offs	= OMAP3430_EMU_MOD, @@ -200,6 +278,14 @@ static struct powerdomain neon_pwrdm = {  	.voltdm           = { .name = "mpu_iva" },  }; +static struct powerdomain neon_am35x_pwrdm = { +	.name		  = "neon_pwrdm", +	.prcm_offs	  = OMAP3430_NEON_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.voltdm           = { .name = "mpu_iva" }, +}; +  static struct powerdomain usbhost_pwrdm = {  	.name		  = "usbhost_pwrdm",  	.prcm_offs	  = OMAP3430ES2_USBHOST_MOD, @@ -293,6 +379,22 @@ static struct powerdomain *powerdomains_omap3430es3_1plus[] __initdata = {  	NULL  }; +static struct powerdomain *powerdomains_am35x[] __initdata = { +	&wkup_omap2_pwrdm, +	&mpu_am35x_pwrdm, +	&neon_am35x_pwrdm, +	&core_am35x_pwrdm, +	&sgx_am35x_pwrdm, +	&dss_am35x_pwrdm, +	&per_am35x_pwrdm, +	&emu_pwrdm, +	&dpll1_pwrdm, +	&dpll3_pwrdm, +	&dpll4_pwrdm, +	&dpll5_pwrdm, +	NULL +}; +  void __init omap3xxx_powerdomains_init(void)  {  	unsigned int rev; @@ -301,21 +403,34 @@ void __init omap3xxx_powerdomains_init(void)  		return;  	pwrdm_register_platform_funcs(&omap3_pwrdm_operations); -	pwrdm_register_pwrdms(powerdomains_omap3430_common);  	rev = omap_rev(); -	if (rev == OMAP3430_REV_ES1_0) -		pwrdm_register_pwrdms(powerdomains_omap3430es1); -	else if (rev == OMAP3430_REV_ES2_0 || rev == OMAP3430_REV_ES2_1 || -		 rev == OMAP3430_REV_ES3_0 || rev == OMAP3630_REV_ES1_0) -		pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0); -	else if (rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2 || -		 rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1 || -		 rev == OMAP3630_REV_ES1_1 || rev == OMAP3630_REV_ES1_2) -		pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus); -	else -		WARN(1, "OMAP3 powerdomain init: unknown chip type\n"); +	if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { +		pwrdm_register_pwrdms(powerdomains_am35x); +	} else { +		pwrdm_register_pwrdms(powerdomains_omap3430_common); + +		switch (rev) { +		case OMAP3430_REV_ES1_0: +			pwrdm_register_pwrdms(powerdomains_omap3430es1); +			break; +		case OMAP3430_REV_ES2_0: +		case OMAP3430_REV_ES2_1: +		case OMAP3430_REV_ES3_0: +		case OMAP3630_REV_ES1_0: +			pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0); +			break; +		case OMAP3430_REV_ES3_1: +		case OMAP3430_REV_ES3_1_2: +		case OMAP3630_REV_ES1_1: +		case OMAP3630_REV_ES1_2: +			pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus); +			break; +		default: +			WARN(1, "OMAP3 powerdomain init: unknown chip type\n"); +		} +	}  	pwrdm_complete_init();  } diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index 6da3ba483ad..e5f0503a68b 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h @@ -203,8 +203,8 @@  #define OMAP3430_EN_MMC2_SHIFT				25  #define OMAP3430_EN_MMC1_MASK				(1 << 24)  #define OMAP3430_EN_MMC1_SHIFT				24 -#define OMAP3430_EN_UART4_MASK				(1 << 23) -#define OMAP3430_EN_UART4_SHIFT				23 +#define AM35XX_EN_UART4_MASK				(1 << 23) +#define AM35XX_EN_UART4_SHIFT				23  #define OMAP3430_EN_MCSPI4_MASK				(1 << 21)  #define OMAP3430_EN_MCSPI4_SHIFT			21  #define OMAP3430_EN_MCSPI3_MASK				(1 << 20) @@ -410,13 +410,21 @@   */  #define MAX_MODULE_HARDRESET_WAIT		10000 +/* + * Maximum time(us) it takes to output the signal WUCLKOUT of the last + * pad of the I/O ring after asserting WUCLKIN high.  Tero measured + * the actual time at 7 to 8 microseconds on OMAP3 and 2 to 4 + * microseconds on OMAP4, so this timeout may be too high. + */ +#define MAX_IOPAD_LATCH_TIME			100 +  # ifndef __ASSEMBLER__  extern void __iomem *prm_base;  extern void __iomem *cm_base;  extern void __iomem *cm2_base;  extern void __iomem *prcm_mpu_base; -#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_ARCH_OMAP5) +#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5)  extern void omap_prm_base_init(void);  extern void omap_cm_base_init(void);  #else diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 480f40a5ee4..053e24ed3c4 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -35,6 +35,7 @@  #include "prm2xxx_3xxx.h"  #include "prm44xx.h"  #include "prminst44xx.h" +#include "cminst44xx.h"  #include "prm-regbits-24xx.h"  #include "prm-regbits-44xx.h"  #include "control.h" @@ -159,8 +160,30 @@ void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals)  	if (omap2_globals->prcm_mpu)  		prcm_mpu_base = omap2_globals->prcm_mpu; -	if (cpu_is_omap44xx()) { +	if (cpu_is_omap44xx() || soc_is_omap54xx()) {  		omap_prm_base_init();  		omap_cm_base_init();  	}  } + +/* + * Stubbed functions so that common files continue to build when + * custom builds are used + * XXX These are temporary and should be removed at the earliest possible + * opportunity + */ +int __weak omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, +					u16 clkctrl_offs) +{ +	return 0; +} + +void __weak omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, +				s16 cdoffs, u16 clkctrl_offs) +{ +} + +void __weak omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs, +				 u16 clkctrl_offs) +{ +} diff --git a/arch/arm/mach-omap2/prm-regbits-33xx.h b/arch/arm/mach-omap2/prm-regbits-33xx.h new file mode 100644 index 00000000000..0221b5c20e8 --- /dev/null +++ b/arch/arm/mach-omap2/prm-regbits-33xx.h @@ -0,0 +1,357 @@ +/* + * AM33XX PRM_XXX register bits + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_33XX_H +#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_33XX_H + +#include "prm.h" + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_ABBOFF_ACT_EXPORT_SHIFT			1 +#define AM33XX_ABBOFF_ACT_EXPORT_MASK			(1 << 1) + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_ABBOFF_SLEEP_EXPORT_SHIFT		2 +#define AM33XX_ABBOFF_SLEEP_EXPORT_MASK			(1 << 2) + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_AIPOFF_SHIFT				8 +#define AM33XX_AIPOFF_MASK				(1 << 8) + +/* Used by PM_WKUP_PWRSTST */ +#define AM33XX_DEBUGSS_MEM_STATEST_SHIFT		17 +#define AM33XX_DEBUGSS_MEM_STATEST_MASK			(0x3 << 17) + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_DISABLE_RTA_EXPORT_SHIFT			0 +#define AM33XX_DISABLE_RTA_EXPORT_MASK			(1 << 0) + +/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */ +#define AM33XX_DPLL_CORE_RECAL_EN_SHIFT			12 +#define AM33XX_DPLL_CORE_RECAL_EN_MASK			(1 << 12) + +/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */ +#define AM33XX_DPLL_CORE_RECAL_ST_SHIFT			12 +#define AM33XX_DPLL_CORE_RECAL_ST_MASK			(1 << 12) + +/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */ +#define AM33XX_DPLL_DDR_RECAL_EN_SHIFT			14 +#define AM33XX_DPLL_DDR_RECAL_EN_MASK			(1 << 14) + +/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */ +#define AM33XX_DPLL_DDR_RECAL_ST_SHIFT			14 +#define AM33XX_DPLL_DDR_RECAL_ST_MASK			(1 << 14) + +/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */ +#define AM33XX_DPLL_DISP_RECAL_EN_SHIFT			15 +#define AM33XX_DPLL_DISP_RECAL_EN_MASK			(1 << 15) + +/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */ +#define AM33XX_DPLL_DISP_RECAL_ST_SHIFT			13 +#define AM33XX_DPLL_DISP_RECAL_ST_MASK			(1 << 13) + +/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */ +#define AM33XX_DPLL_MPU_RECAL_EN_SHIFT			11 +#define AM33XX_DPLL_MPU_RECAL_EN_MASK			(1 << 11) + +/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */ +#define AM33XX_DPLL_MPU_RECAL_ST_SHIFT			11 +#define AM33XX_DPLL_MPU_RECAL_ST_MASK			(1 << 11) + +/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */ +#define AM33XX_DPLL_PER_RECAL_EN_SHIFT			13 +#define AM33XX_DPLL_PER_RECAL_EN_MASK			(1 << 13) + +/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */ +#define AM33XX_DPLL_PER_RECAL_ST_SHIFT			15 +#define AM33XX_DPLL_PER_RECAL_ST_MASK			(1 << 15) + +/* Used by RM_WKUP_RSTST */ +#define AM33XX_EMULATION_M3_RST_SHIFT			6 +#define AM33XX_EMULATION_M3_RST_MASK			(1 << 6) + +/* Used by RM_MPU_RSTST */ +#define AM33XX_EMULATION_MPU_RST_SHIFT			5 +#define AM33XX_EMULATION_MPU_RST_MASK			(1 << 5) + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_ENFUNC1_EXPORT_SHIFT			3 +#define AM33XX_ENFUNC1_EXPORT_MASK			(1 << 3) + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_ENFUNC3_EXPORT_SHIFT			5 +#define AM33XX_ENFUNC3_EXPORT_MASK			(1 << 5) + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_ENFUNC4_SHIFT				6 +#define AM33XX_ENFUNC4_MASK				(1 << 6) + +/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */ +#define AM33XX_ENFUNC5_SHIFT				7 +#define AM33XX_ENFUNC5_MASK				(1 << 7) + +/* Used by PRM_RSTST */ +#define AM33XX_EXTERNAL_WARM_RST_SHIFT			5 +#define AM33XX_EXTERNAL_WARM_RST_MASK			(1 << 5) + +/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */ +#define AM33XX_FORCEWKUP_EN_SHIFT			10 +#define AM33XX_FORCEWKUP_EN_MASK			(1 << 10) + +/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */ +#define AM33XX_FORCEWKUP_ST_SHIFT			10 +#define AM33XX_FORCEWKUP_ST_MASK			(1 << 10) + +/* Used by PM_GFX_PWRSTCTRL */ +#define AM33XX_GFX_MEM_ONSTATE_SHIFT			17 +#define AM33XX_GFX_MEM_ONSTATE_MASK			(0x3 << 17) + +/* Used by PM_GFX_PWRSTCTRL */ +#define AM33XX_GFX_MEM_RETSTATE_SHIFT			6 +#define AM33XX_GFX_MEM_RETSTATE_MASK			(1 << 6) + +/* Used by PM_GFX_PWRSTST */ +#define AM33XX_GFX_MEM_STATEST_SHIFT			4 +#define AM33XX_GFX_MEM_STATEST_MASK			(0x3 << 4) + +/* Used by RM_GFX_RSTCTRL, RM_GFX_RSTST */ +#define AM33XX_GFX_RST_SHIFT				0 +#define AM33XX_GFX_RST_MASK				(1 << 0) + +/* Used by PRM_RSTST */ +#define AM33XX_GLOBAL_COLD_RST_SHIFT			0 +#define AM33XX_GLOBAL_COLD_RST_MASK			(1 << 0) + +/* Used by PRM_RSTST */ +#define AM33XX_GLOBAL_WARM_SW_RST_SHIFT			1 +#define AM33XX_GLOBAL_WARM_SW_RST_MASK			(1 << 1) + +/* Used by RM_WKUP_RSTST */ +#define AM33XX_ICECRUSHER_M3_RST_SHIFT			7 +#define AM33XX_ICECRUSHER_M3_RST_MASK			(1 << 7) + +/* Used by RM_MPU_RSTST */ +#define AM33XX_ICECRUSHER_MPU_RST_SHIFT			6 +#define AM33XX_ICECRUSHER_MPU_RST_MASK			(1 << 6) + +/* Used by PRM_RSTST */ +#define AM33XX_ICEPICK_RST_SHIFT			9 +#define AM33XX_ICEPICK_RST_MASK				(1 << 9) + +/* Used by RM_PER_RSTCTRL */ +#define AM33XX_PRUSS_LRST_SHIFT				1 +#define AM33XX_PRUSS_LRST_MASK				(1 << 1) + +/* Used by PM_PER_PWRSTCTRL */ +#define AM33XX_PRUSS_MEM_ONSTATE_SHIFT			5 +#define AM33XX_PRUSS_MEM_ONSTATE_MASK			(0x3 << 5) + +/* Used by PM_PER_PWRSTCTRL */ +#define AM33XX_PRUSS_MEM_RETSTATE_SHIFT			7 +#define AM33XX_PRUSS_MEM_RETSTATE_MASK			(1 << 7) + +/* Used by PM_PER_PWRSTST */ +#define AM33XX_PRUSS_MEM_STATEST_SHIFT			23 +#define AM33XX_PRUSS_MEM_STATEST_MASK			(0x3 << 23) + +/* + * Used by PM_GFX_PWRSTST, PM_CEFUSE_PWRSTST, PM_PER_PWRSTST, PM_MPU_PWRSTST, + * PM_WKUP_PWRSTST, PM_RTC_PWRSTST + */ +#define AM33XX_INTRANSITION_SHIFT			20 +#define AM33XX_INTRANSITION_MASK			(1 << 20) + +/* Used by PM_CEFUSE_PWRSTST */ +#define AM33XX_LASTPOWERSTATEENTERED_SHIFT		24 +#define AM33XX_LASTPOWERSTATEENTERED_MASK		(0x3 << 24) + +/* Used by PM_GFX_PWRSTCTRL, PM_MPU_PWRSTCTRL, PM_RTC_PWRSTCTRL */ +#define AM33XX_LOGICRETSTATE_SHIFT			2 +#define AM33XX_LOGICRETSTATE_MASK			(1 << 2) + +/* Renamed from LOGICRETSTATE Used by PM_PER_PWRSTCTRL, PM_WKUP_PWRSTCTRL */ +#define AM33XX_LOGICRETSTATE_3_3_SHIFT			3 +#define AM33XX_LOGICRETSTATE_3_3_MASK			(1 << 3) + +/* + * Used by PM_GFX_PWRSTST, PM_CEFUSE_PWRSTST, PM_PER_PWRSTST, PM_MPU_PWRSTST, + * PM_WKUP_PWRSTST, PM_RTC_PWRSTST + */ +#define AM33XX_LOGICSTATEST_SHIFT			2 +#define AM33XX_LOGICSTATEST_MASK			(1 << 2) + +/* + * Used by PM_GFX_PWRSTCTRL, PM_CEFUSE_PWRSTCTRL, PM_PER_PWRSTCTRL, + * PM_MPU_PWRSTCTRL, PM_WKUP_PWRSTCTRL, PM_RTC_PWRSTCTRL + */ +#define AM33XX_LOWPOWERSTATECHANGE_SHIFT		4 +#define AM33XX_LOWPOWERSTATECHANGE_MASK			(1 << 4) + +/* Used by PM_MPU_PWRSTCTRL */ +#define AM33XX_MPU_L1_ONSTATE_SHIFT			18 +#define AM33XX_MPU_L1_ONSTATE_MASK			(0x3 << 18) + +/* Used by PM_MPU_PWRSTCTRL */ +#define AM33XX_MPU_L1_RETSTATE_SHIFT			22 +#define AM33XX_MPU_L1_RETSTATE_MASK			(1 << 22) + +/* Used by PM_MPU_PWRSTST */ +#define AM33XX_MPU_L1_STATEST_SHIFT			6 +#define AM33XX_MPU_L1_STATEST_MASK			(0x3 << 6) + +/* Used by PM_MPU_PWRSTCTRL */ +#define AM33XX_MPU_L2_ONSTATE_SHIFT			20 +#define AM33XX_MPU_L2_ONSTATE_MASK			(0x3 << 20) + +/* Used by PM_MPU_PWRSTCTRL */ +#define AM33XX_MPU_L2_RETSTATE_SHIFT			23 +#define AM33XX_MPU_L2_RETSTATE_MASK			(1 << 23) + +/* Used by PM_MPU_PWRSTST */ +#define AM33XX_MPU_L2_STATEST_SHIFT			8 +#define AM33XX_MPU_L2_STATEST_MASK			(0x3 << 8) + +/* Used by PM_MPU_PWRSTCTRL */ +#define AM33XX_MPU_RAM_ONSTATE_SHIFT			16 +#define AM33XX_MPU_RAM_ONSTATE_MASK			(0x3 << 16) + +/* Used by PM_MPU_PWRSTCTRL */ +#define AM33XX_MPU_RAM_RETSTATE_SHIFT			24 +#define AM33XX_MPU_RAM_RETSTATE_MASK			(1 << 24) + +/* Used by PM_MPU_PWRSTST */ +#define AM33XX_MPU_RAM_STATEST_SHIFT			4 +#define AM33XX_MPU_RAM_STATEST_MASK			(0x3 << 4) + +/* Used by PRM_RSTST */ +#define AM33XX_MPU_SECURITY_VIOL_RST_SHIFT		2 +#define AM33XX_MPU_SECURITY_VIOL_RST_MASK		(1 << 2) + +/* Used by PRM_SRAM_COUNT */ +#define AM33XX_PCHARGECNT_VALUE_SHIFT			0 +#define AM33XX_PCHARGECNT_VALUE_MASK			(0x3f << 0) + +/* Used by RM_PER_RSTCTRL */ +#define AM33XX_PCI_LRST_SHIFT				0 +#define AM33XX_PCI_LRST_MASK				(1 << 0) + +/* Renamed from PCI_LRST Used by RM_PER_RSTST */ +#define AM33XX_PCI_LRST_5_5_SHIFT			5 +#define AM33XX_PCI_LRST_5_5_MASK			(1 << 5) + +/* Used by PM_PER_PWRSTCTRL */ +#define AM33XX_PER_MEM_ONSTATE_SHIFT			25 +#define AM33XX_PER_MEM_ONSTATE_MASK			(0x3 << 25) + +/* Used by PM_PER_PWRSTCTRL */ +#define AM33XX_PER_MEM_RETSTATE_SHIFT			29 +#define AM33XX_PER_MEM_RETSTATE_MASK			(1 << 29) + +/* Used by PM_PER_PWRSTST */ +#define AM33XX_PER_MEM_STATEST_SHIFT			17 +#define AM33XX_PER_MEM_STATEST_MASK			(0x3 << 17) + +/* + * Used by PM_GFX_PWRSTCTRL, PM_CEFUSE_PWRSTCTRL, PM_PER_PWRSTCTRL, + * PM_MPU_PWRSTCTRL + */ +#define AM33XX_POWERSTATE_SHIFT				0 +#define AM33XX_POWERSTATE_MASK				(0x3 << 0) + +/* Used by PM_GFX_PWRSTST, PM_CEFUSE_PWRSTST, PM_PER_PWRSTST, PM_MPU_PWRSTST */ +#define AM33XX_POWERSTATEST_SHIFT			0 +#define AM33XX_POWERSTATEST_MASK			(0x3 << 0) + +/* Used by PM_PER_PWRSTCTRL */ +#define AM33XX_RAM_MEM_ONSTATE_SHIFT			30 +#define AM33XX_RAM_MEM_ONSTATE_MASK			(0x3 << 30) + +/* Used by PM_PER_PWRSTCTRL */ +#define AM33XX_RAM_MEM_RETSTATE_SHIFT			27 +#define AM33XX_RAM_MEM_RETSTATE_MASK			(1 << 27) + +/* Used by PM_PER_PWRSTST */ +#define AM33XX_RAM_MEM_STATEST_SHIFT			21 +#define AM33XX_RAM_MEM_STATEST_MASK			(0x3 << 21) + +/* Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_MPU_CTRL */ +#define AM33XX_RETMODE_ENABLE_SHIFT			0 +#define AM33XX_RETMODE_ENABLE_MASK			(1 << 0) + +/* Used by REVISION_PRM */ +#define AM33XX_REV_SHIFT				0 +#define AM33XX_REV_MASK					(0xff << 0) + +/* Used by PRM_RSTTIME */ +#define AM33XX_RSTTIME1_SHIFT				0 +#define AM33XX_RSTTIME1_MASK				(0xff << 0) + +/* Used by PRM_RSTTIME */ +#define AM33XX_RSTTIME2_SHIFT				8 +#define AM33XX_RSTTIME2_MASK				(0x1f << 8) + +/* Used by PRM_RSTCTRL */ +#define AM33XX_RST_GLOBAL_COLD_SW_SHIFT			1 +#define AM33XX_RST_GLOBAL_COLD_SW_MASK			(1 << 1) + +/* Used by PRM_RSTCTRL */ +#define AM33XX_RST_GLOBAL_WARM_SW_SHIFT			0 +#define AM33XX_RST_GLOBAL_WARM_SW_MASK			(1 << 0) + +/* Used by PRM_SRAM_COUNT */ +#define AM33XX_SLPCNT_VALUE_SHIFT			16 +#define AM33XX_SLPCNT_VALUE_MASK			(0xff << 16) + +/* Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_MPU_CTRL */ +#define AM33XX_SRAMLDO_STATUS_SHIFT			8 +#define AM33XX_SRAMLDO_STATUS_MASK			(1 << 8) + +/* Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_MPU_CTRL */ +#define AM33XX_SRAM_IN_TRANSITION_SHIFT			9 +#define AM33XX_SRAM_IN_TRANSITION_MASK			(1 << 9) + +/* Used by PRM_SRAM_COUNT */ +#define AM33XX_STARTUP_COUNT_SHIFT			24 +#define AM33XX_STARTUP_COUNT_MASK			(0xff << 24) + +/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */ +#define AM33XX_TRANSITION_EN_SHIFT			8 +#define AM33XX_TRANSITION_EN_MASK			(1 << 8) + +/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */ +#define AM33XX_TRANSITION_ST_SHIFT			8 +#define AM33XX_TRANSITION_ST_MASK			(1 << 8) + +/* Used by PRM_SRAM_COUNT */ +#define AM33XX_VSETUPCNT_VALUE_SHIFT			8 +#define AM33XX_VSETUPCNT_VALUE_MASK			(0xff << 8) + +/* Used by PRM_RSTST */ +#define AM33XX_WDT0_RST_SHIFT				3 +#define AM33XX_WDT0_RST_MASK				(1 << 3) + +/* Used by PRM_RSTST */ +#define AM33XX_WDT1_RST_SHIFT				4 +#define AM33XX_WDT1_RST_MASK				(1 << 4) + +/* Used by RM_WKUP_RSTCTRL */ +#define AM33XX_WKUP_M3_LRST_SHIFT			3 +#define AM33XX_WKUP_M3_LRST_MASK			(1 << 3) + +/* Renamed from WKUP_M3_LRST Used by RM_WKUP_RSTST */ +#define AM33XX_WKUP_M3_LRST_5_5_SHIFT			5 +#define AM33XX_WKUP_M3_LRST_5_5_MASK			(1 << 5) + +#endif diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index 21cb74003a5..a0309dea679 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c @@ -302,11 +302,59 @@ void omap3xxx_prm_restore_irqen(u32 *saved_mask)  				OMAP3_PRM_IRQENABLE_MPU_OFFSET);  } +/** + * omap3xxx_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain + * + * Clear any previously-latched I/O wakeup events and ensure that the + * I/O wakeup gates are aligned with the current mux settings.  Works + * by asserting WUCLKIN, waiting for WUCLKOUT to be asserted, and then + * deasserting WUCLKIN and clearing the ST_IO_CHAIN WKST bit.  No + * return value. + */ +void omap3xxx_prm_reconfigure_io_chain(void) +{ +	int i = 0; + +	omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, +				   PM_WKEN); + +	omap_test_timeout(omap2_prm_read_mod_reg(WKUP_MOD, PM_WKST) & +			  OMAP3430_ST_IO_CHAIN_MASK, +			  MAX_IOPAD_LATCH_TIME, i); +	if (i == MAX_IOPAD_LATCH_TIME) +		pr_warn("PRM: I/O chain clock line assertion timed out\n"); + +	omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, +				     PM_WKEN); + +	omap2_prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, WKUP_MOD, +				   PM_WKST); + +	omap2_prm_read_mod_reg(WKUP_MOD, PM_WKST); +} + +/** + * omap3xxx_prm_enable_io_wakeup - enable wakeup events from I/O wakeup latches + * + * Activates the I/O wakeup event latches and allows events logged by + * those latches to signal a wakeup event to the PRCM.  For I/O + * wakeups to occur, WAKEUPENABLE bits must be set in the pad mux + * registers, and omap3xxx_prm_reconfigure_io_chain() must be called. + * No return value. + */ +static void __init omap3xxx_prm_enable_io_wakeup(void) +{ +	if (omap3_has_io_wakeup()) +		omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, +					   PM_WKEN); +} +  static int __init omap3xxx_prcm_init(void)  {  	int ret = 0;  	if (cpu_is_omap34xx()) { +		omap3xxx_prm_enable_io_wakeup();  		ret = omap_prcm_register_chain_handler(&omap3_prcm_irq_setup);  		if (!ret)  			irq_set_status_flags(omap_prcm_event_to_irq("io"), diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.h b/arch/arm/mach-omap2/prm2xxx_3xxx.h index 70ac2a19dc5..c19d249b481 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.h +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.h @@ -228,68 +228,6 @@  #ifndef __ASSEMBLER__ -/* - * Stub omap2xxx/omap3xxx functions so that common files - * continue to build when custom builds are used - */ -#if defined(CONFIG_ARCH_OMAP4) && !(defined(CONFIG_ARCH_OMAP2) ||	\ -					defined(CONFIG_ARCH_OMAP3)) -static inline u32 omap2_prm_read_mod_reg(s16 module, u16 idx) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -static inline void omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -} -static inline u32 omap2_prm_rmw_mod_reg_bits(u32 mask, u32 bits, -		s16 module, s16 idx) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -static inline u32 omap2_prm_set_mod_reg_bits(u32 bits, s16 module, s16 idx) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -static inline u32 omap2_prm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -static inline u32 omap2_prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -static inline int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -static inline int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -static inline int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, -						u8 st_shift) -{ -	WARN(1, "prm: omap2xxx/omap3xxx specific function and " -		"not suppose to be used on omap4\n"); -	return 0; -} -#else  /* Power/reset management domain register get/set */  extern u32 omap2_prm_read_mod_reg(s16 module, u16 idx);  extern void omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx); @@ -315,15 +253,15 @@ extern u32 omap3_prm_vcvp_read(u8 offset);  extern void omap3_prm_vcvp_write(u32 val, u8 offset);  extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); +extern void omap3xxx_prm_reconfigure_io_chain(void); +  /* PRM interrupt-related functions */  extern void omap3xxx_prm_read_pending_irqs(unsigned long *events);  extern void omap3xxx_prm_ocp_barrier(void);  extern void omap3xxx_prm_save_and_clear_irqen(u32 *saved_mask);  extern void omap3xxx_prm_restore_irqen(u32 *saved_mask); -#endif	/* CONFIG_ARCH_OMAP4 */ - -#endif +#endif /* __ASSEMBLER */  /*   * Bits common to specific registers diff --git a/arch/arm/mach-omap2/prm33xx.c b/arch/arm/mach-omap2/prm33xx.c new file mode 100644 index 00000000000..e7dbb6cf125 --- /dev/null +++ b/arch/arm/mach-omap2/prm33xx.c @@ -0,0 +1,135 @@ +/* + * AM33XX PRM functions + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/errno.h> +#include <linux/err.h> +#include <linux/io.h> + +#include <plat/common.h> + +#include "common.h" +#include "prm33xx.h" +#include "prm-regbits-33xx.h" + +/* Read a register in a PRM instance */ +u32 am33xx_prm_read_reg(s16 inst, u16 idx) +{ +	return __raw_readl(prm_base + inst + idx); +} + +/* Write into a register in a PRM instance */ +void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx) +{ +	__raw_writel(val, prm_base + inst + idx); +} + +/* Read-modify-write a register in PRM. Caller must lock */ +u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx) +{ +	u32 v; + +	v = am33xx_prm_read_reg(inst, idx); +	v &= ~mask; +	v |= bits; +	am33xx_prm_write_reg(v, inst, idx); + +	return v; +} + +/** + * am33xx_prm_is_hardreset_asserted - read the HW reset line state of + * submodules contained in the hwmod module + * @shift: register bit shift corresponding to the reset line to check + * @inst: CM instance register offset (*_INST macro) + * @rstctrl_offs: RM_RSTCTRL register address offset for this module + * + * Returns 1 if the (sub)module hardreset line is currently asserted, + * 0 if the (sub)module hardreset line is not currently asserted, or + * -EINVAL upon parameter error. + */ +int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, u16 rstctrl_offs) +{ +	u32 v; + +	v = am33xx_prm_read_reg(inst, rstctrl_offs); +	v &= 1 << shift; +	v >>= shift; + +	return v; +} + +/** + * am33xx_prm_assert_hardreset - assert the HW reset line of a submodule + * @shift: register bit shift corresponding to the reset line to assert + * @inst: CM instance register offset (*_INST macro) + * @rstctrl_reg: RM_RSTCTRL register address for this module + * + * Some IPs like dsp, ipu or iva contain processors that require an HW + * reset line to be asserted / deasserted in order to fully enable the + * IP.  These modules may have multiple hard-reset lines that reset + * different 'submodules' inside the IP block.  This function will + * place the submodule into reset.  Returns 0 upon success or -EINVAL + * upon an argument error. + */ +int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs) +{ +	u32 mask = 1 << shift; + +	am33xx_prm_rmw_reg_bits(mask, mask, inst, rstctrl_offs); + +	return 0; +} + +/** + * am33xx_prm_deassert_hardreset - deassert a submodule hardreset line and + * wait + * @shift: register bit shift corresponding to the reset line to deassert + * @inst: CM instance register offset (*_INST macro) + * @rstctrl_reg: RM_RSTCTRL register address for this module + * @rstst_reg: RM_RSTST register address for this module + * + * Some IPs like dsp, ipu or iva contain processors that require an HW + * reset line to be asserted / deasserted in order to fully enable the + * IP.  These modules may have multiple hard-reset lines that reset + * different 'submodules' inside the IP block.  This function will + * take the submodule out of reset and wait until the PRCM indicates + * that the reset has completed before returning.  Returns 0 upon success or + * -EINVAL upon an argument error, -EEXIST if the submodule was already out + * of reset, or -EBUSY if the submodule did not exit reset promptly. + */ +int am33xx_prm_deassert_hardreset(u8 shift, s16 inst, +		u16 rstctrl_offs, u16 rstst_offs) +{ +	int c; +	u32 mask = 1 << shift; + +	/* Check the current status to avoid  de-asserting the line twice */ +	if (am33xx_prm_is_hardreset_asserted(shift, inst, rstctrl_offs) == 0) +		return -EEXIST; + +	/* Clear the reset status by writing 1 to the status bit */ +	am33xx_prm_rmw_reg_bits(0xffffffff, mask, inst, rstst_offs); +	/* de-assert the reset control line */ +	am33xx_prm_rmw_reg_bits(mask, 0, inst, rstctrl_offs); +	/* wait the status to be set */ + +	omap_test_timeout(am33xx_prm_is_hardreset_asserted(shift, inst, +							   rstst_offs), +			  MAX_MODULE_HARDRESET_WAIT, c); + +	return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0; +} diff --git a/arch/arm/mach-omap2/prm33xx.h b/arch/arm/mach-omap2/prm33xx.h new file mode 100644 index 00000000000..3f25c563a82 --- /dev/null +++ b/arch/arm/mach-omap2/prm33xx.h @@ -0,0 +1,129 @@ +/* + * AM33XX PRM instance offset macros + * + * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#ifndef __ARCH_ARM_MACH_OMAP2_PRM33XX_H +#define __ARCH_ARM_MACH_OMAP2_PRM33XX_H + +#include "prcm-common.h" +#include "prm.h" + +#define AM33XX_PRM_BASE               0x44E00000 + +#define AM33XX_PRM_REGADDR(inst, reg)                         \ +	AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRM_BASE + (inst) + (reg)) + + +/* PRM instances */ +#define AM33XX_PRM_OCP_SOCKET_MOD	0x0B00 +#define AM33XX_PRM_PER_MOD		0x0C00 +#define AM33XX_PRM_WKUP_MOD		0x0D00 +#define AM33XX_PRM_MPU_MOD		0x0E00 +#define AM33XX_PRM_DEVICE_MOD		0x0F00 +#define AM33XX_PRM_RTC_MOD		0x1000 +#define AM33XX_PRM_GFX_MOD		0x1100 +#define AM33XX_PRM_CEFUSE_MOD		0x1200 + +/* PRM */ + +/* PRM.OCP_SOCKET_PRM register offsets */ +#define AM33XX_REVISION_PRM_OFFSET		0x0000 +#define AM33XX_REVISION_PRM			AM33XX_PRM_REGADDR(AM33XX_PRM_OCP_SOCKET_MOD, 0x0000) +#define AM33XX_PRM_IRQSTATUS_MPU_OFFSET		0x0004 +#define AM33XX_PRM_IRQSTATUS_MPU		AM33XX_PRM_REGADDR(AM33XX_PRM_OCP_SOCKET_MOD, 0x0004) +#define AM33XX_PRM_IRQENABLE_MPU_OFFSET		0x0008 +#define AM33XX_PRM_IRQENABLE_MPU		AM33XX_PRM_REGADDR(AM33XX_PRM_OCP_SOCKET_MOD, 0x0008) +#define AM33XX_PRM_IRQSTATUS_M3_OFFSET		0x000c +#define AM33XX_PRM_IRQSTATUS_M3			AM33XX_PRM_REGADDR(AM33XX_PRM_OCP_SOCKET_MOD, 0x000c) +#define AM33XX_PRM_IRQENABLE_M3_OFFSET		0x0010 +#define AM33XX_PRM_IRQENABLE_M3			AM33XX_PRM_REGADDR(AM33XX_PRM_OCP_SOCKET_MOD, 0x0010) + +/* PRM.PER_PRM register offsets */ +#define AM33XX_RM_PER_RSTCTRL_OFFSET		0x0000 +#define AM33XX_RM_PER_RSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_PER_MOD, 0x0000) +#define AM33XX_RM_PER_RSTST_OFFSET		0x0004 +#define AM33XX_RM_PER_RSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_PER_MOD, 0x0004) +#define AM33XX_PM_PER_PWRSTST_OFFSET		0x0008 +#define AM33XX_PM_PER_PWRSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_PER_MOD, 0x0008) +#define AM33XX_PM_PER_PWRSTCTRL_OFFSET		0x000c +#define AM33XX_PM_PER_PWRSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_PER_MOD, 0x000c) + +/* PRM.WKUP_PRM register offsets */ +#define AM33XX_RM_WKUP_RSTCTRL_OFFSET		0x0000 +#define AM33XX_RM_WKUP_RSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_WKUP_MOD, 0x0000) +#define AM33XX_PM_WKUP_PWRSTCTRL_OFFSET		0x0004 +#define AM33XX_PM_WKUP_PWRSTCTRL		AM33XX_PRM_REGADDR(AM33XX_PRM_WKUP_MOD, 0x0004) +#define AM33XX_PM_WKUP_PWRSTST_OFFSET		0x0008 +#define AM33XX_PM_WKUP_PWRSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_WKUP_MOD, 0x0008) +#define AM33XX_RM_WKUP_RSTST_OFFSET		0x000c +#define AM33XX_RM_WKUP_RSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_WKUP_MOD, 0x000c) + +/* PRM.MPU_PRM register offsets */ +#define AM33XX_PM_MPU_PWRSTCTRL_OFFSET		0x0000 +#define AM33XX_PM_MPU_PWRSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_MPU_MOD, 0x0000) +#define AM33XX_PM_MPU_PWRSTST_OFFSET		0x0004 +#define AM33XX_PM_MPU_PWRSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_MPU_MOD, 0x0004) +#define AM33XX_RM_MPU_RSTST_OFFSET		0x0008 +#define AM33XX_RM_MPU_RSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_MPU_MOD, 0x0008) + +/* PRM.DEVICE_PRM register offsets */ +#define AM33XX_PRM_RSTCTRL_OFFSET		0x0000 +#define AM33XX_PRM_RSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x0000) +#define AM33XX_PRM_RSTTIME_OFFSET		0x0004 +#define AM33XX_PRM_RSTTIME			AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x0004) +#define AM33XX_PRM_RSTST_OFFSET			0x0008 +#define AM33XX_PRM_RSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x0008) +#define AM33XX_PRM_SRAM_COUNT_OFFSET		0x000c +#define AM33XX_PRM_SRAM_COUNT			AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x000c) +#define AM33XX_PRM_LDO_SRAM_CORE_SETUP_OFFSET	0x0010 +#define AM33XX_PRM_LDO_SRAM_CORE_SETUP		AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x0010) +#define AM33XX_PRM_LDO_SRAM_CORE_CTRL_OFFSET	0x0014 +#define AM33XX_PRM_LDO_SRAM_CORE_CTRL		AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x0014) +#define AM33XX_PRM_LDO_SRAM_MPU_SETUP_OFFSET	0x0018 +#define AM33XX_PRM_LDO_SRAM_MPU_SETUP		AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x0018) +#define AM33XX_PRM_LDO_SRAM_MPU_CTRL_OFFSET	0x001c +#define AM33XX_PRM_LDO_SRAM_MPU_CTRL		AM33XX_PRM_REGADDR(AM33XX_PRM_DEVICE_MOD, 0x001c) + +/* PRM.RTC_PRM register offsets */ +#define AM33XX_PM_RTC_PWRSTCTRL_OFFSET		0x0000 +#define AM33XX_PM_RTC_PWRSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_RTC_MOD, 0x0000) +#define AM33XX_PM_RTC_PWRSTST_OFFSET		0x0004 +#define AM33XX_PM_RTC_PWRSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_RTC_MOD, 0x0004) + +/* PRM.GFX_PRM register offsets */ +#define AM33XX_PM_GFX_PWRSTCTRL_OFFSET		0x0000 +#define AM33XX_PM_GFX_PWRSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_GFX_MOD, 0x0000) +#define AM33XX_RM_GFX_RSTCTRL_OFFSET		0x0004 +#define AM33XX_RM_GFX_RSTCTRL			AM33XX_PRM_REGADDR(AM33XX_PRM_GFX_MOD, 0x0004) +#define AM33XX_PM_GFX_PWRSTST_OFFSET		0x0010 +#define AM33XX_PM_GFX_PWRSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_GFX_MOD, 0x0010) +#define AM33XX_RM_GFX_RSTST_OFFSET		0x0014 +#define AM33XX_RM_GFX_RSTST			AM33XX_PRM_REGADDR(AM33XX_PRM_GFX_MOD, 0x0014) + +/* PRM.CEFUSE_PRM register offsets */ +#define AM33XX_PM_CEFUSE_PWRSTCTRL_OFFSET	0x0000 +#define AM33XX_PM_CEFUSE_PWRSTCTRL		AM33XX_PRM_REGADDR(AM33XX_PRM_CEFUSE_MOD, 0x0000) +#define AM33XX_PM_CEFUSE_PWRSTST_OFFSET		0x0004 +#define AM33XX_PM_CEFUSE_PWRSTST		AM33XX_PRM_REGADDR(AM33XX_PRM_CEFUSE_MOD, 0x0004) + +extern u32 am33xx_prm_read_reg(s16 inst, u16 idx); +extern void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx); +extern u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); +extern void am33xx_prm_global_warm_sw_reset(void); +extern int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, +		u16 rstctrl_offs); +extern int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs); +extern int am33xx_prm_deassert_hardreset(u8 shift, s16 inst, +		u16 rstctrl_offs, u16 rstst_offs); +#endif diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index f106d21ff58..bb727c2d933 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c @@ -233,10 +233,71 @@ void omap44xx_prm_restore_irqen(u32 *saved_mask)  				 OMAP4_PRM_IRQENABLE_MPU_2_OFFSET);  } +/** + * omap44xx_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain + * + * Clear any previously-latched I/O wakeup events and ensure that the + * I/O wakeup gates are aligned with the current mux settings.  Works + * by asserting WUCLKIN, waiting for WUCLKOUT to be asserted, and then + * deasserting WUCLKIN and waiting for WUCLKOUT to be deasserted. + * No return value. XXX Are the final two steps necessary? + */ +void omap44xx_prm_reconfigure_io_chain(void) +{ +	int i = 0; + +	/* Trigger WUCLKIN enable */ +	omap4_prm_rmw_inst_reg_bits(OMAP4430_WUCLK_CTRL_MASK, +				    OMAP4430_WUCLK_CTRL_MASK, +				    OMAP4430_PRM_DEVICE_INST, +				    OMAP4_PRM_IO_PMCTRL_OFFSET); +	omap_test_timeout( +		(((omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, +					   OMAP4_PRM_IO_PMCTRL_OFFSET) & +		   OMAP4430_WUCLK_STATUS_MASK) >> +		  OMAP4430_WUCLK_STATUS_SHIFT) == 1), +		MAX_IOPAD_LATCH_TIME, i); +	if (i == MAX_IOPAD_LATCH_TIME) +		pr_warn("PRM: I/O chain clock line assertion timed out\n"); + +	/* Trigger WUCLKIN disable */ +	omap4_prm_rmw_inst_reg_bits(OMAP4430_WUCLK_CTRL_MASK, 0x0, +				    OMAP4430_PRM_DEVICE_INST, +				    OMAP4_PRM_IO_PMCTRL_OFFSET); +	omap_test_timeout( +		(((omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, +					   OMAP4_PRM_IO_PMCTRL_OFFSET) & +		   OMAP4430_WUCLK_STATUS_MASK) >> +		  OMAP4430_WUCLK_STATUS_SHIFT) == 0), +		MAX_IOPAD_LATCH_TIME, i); +	if (i == MAX_IOPAD_LATCH_TIME) +		pr_warn("PRM: I/O chain clock line deassertion timed out\n"); + +	return; +} + +/** + * omap44xx_prm_enable_io_wakeup - enable wakeup events from I/O wakeup latches + * + * Activates the I/O wakeup event latches and allows events logged by + * those latches to signal a wakeup event to the PRCM.  For I/O wakeups + * to occur, WAKEUPENABLE bits must be set in the pad mux registers, and + * omap44xx_prm_reconfigure_io_chain() must be called.  No return value. + */ +static void __init omap44xx_prm_enable_io_wakeup(void) +{ +	omap4_prm_rmw_inst_reg_bits(OMAP4430_GLOBAL_WUEN_MASK, +				    OMAP4430_GLOBAL_WUEN_MASK, +				    OMAP4430_PRM_DEVICE_INST, +				    OMAP4_PRM_IO_PMCTRL_OFFSET); +} +  static int __init omap4xxx_prcm_init(void)  { -	if (cpu_is_omap44xx()) +	if (cpu_is_omap44xx()) { +		omap44xx_prm_enable_io_wakeup();  		return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup); +	}  	return 0;  }  subsys_initcall(omap4xxx_prcm_init); diff --git a/arch/arm/mach-omap2/prm44xx.h b/arch/arm/mach-omap2/prm44xx.h index 7978092946d..ee72ae6bd8c 100644 --- a/arch/arm/mach-omap2/prm44xx.h +++ b/arch/arm/mach-omap2/prm44xx.h @@ -763,6 +763,8 @@ extern u32 omap4_prm_vcvp_read(u8 offset);  extern void omap4_prm_vcvp_write(u32 val, u8 offset);  extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); +extern void omap44xx_prm_reconfigure_io_chain(void); +  /* PRM interrupt-related functions */  extern void omap44xx_prm_read_pending_irqs(unsigned long *events);  extern void omap44xx_prm_ocp_barrier(void); diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index dfe00ddb5c6..03b126d9ad9 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c @@ -85,7 +85,7 @@ static void omap_prcm_irq_handler(unsigned int irq, struct irq_desc *desc)  	unsigned long priority_pending[OMAP_PRCM_MAX_NR_PENDING_REG];  	struct irq_chip *chip = irq_desc_get_chip(desc);  	unsigned int virtirq; -	int nr_irqs = prcm_irq_setup->nr_regs * 32; +	int nr_irq = prcm_irq_setup->nr_regs * 32;  	/*  	 * If we are suspended, mask all interrupts from PRCM level, @@ -110,7 +110,7 @@ static void omap_prcm_irq_handler(unsigned int irq, struct irq_desc *desc)  		prcm_irq_setup->read_pending_irqs(pending);  		/* No bit set, then all IRQs are handled */ -		if (find_first_bit(pending, nr_irqs) >= nr_irqs) +		if (find_first_bit(pending, nr_irq) >= nr_irq)  			break;  		omap_prcm_events_filter_priority(pending, priority_pending); @@ -121,11 +121,11 @@ static void omap_prcm_irq_handler(unsigned int irq, struct irq_desc *desc)  		 */  		/* Serve priority events first */ -		for_each_set_bit(virtirq, priority_pending, nr_irqs) +		for_each_set_bit(virtirq, priority_pending, nr_irq)  			generic_handle_irq(prcm_irq_setup->base_irq + virtirq);  		/* Serve normal events next */ -		for_each_set_bit(virtirq, pending, nr_irqs) +		for_each_set_bit(virtirq, pending, nr_irq)  			generic_handle_irq(prcm_irq_setup->base_irq + virtirq);  	}  	if (chip->irq_ack) @@ -319,3 +319,65 @@ err:  	omap_prcm_irq_cleanup();  	return -ENOMEM;  } + +/* + * Stubbed functions so that common files continue to build when + * custom builds are used + * XXX These are temporary and should be removed at the earliest possible + * opportunity + */ +u32 __weak omap2_prm_read_mod_reg(s16 module, u16 idx) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + +void __weak omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +} + +u32 __weak omap2_prm_rmw_mod_reg_bits(u32 mask, u32 bits, +		s16 module, s16 idx) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + +u32 __weak omap2_prm_set_mod_reg_bits(u32 bits, s16 module, s16 idx) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + +u32 __weak omap2_prm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + +u32 __weak omap2_prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + +int __weak omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + +int __weak omap2_prm_assert_hardreset(s16 prm_mod, u8 shift) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + +int __weak omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, +						u8 st_shift) +{ +	WARN(1, "prm: omap2xxx/omap3xxx specific function called on non-omap2xxx/3xxx\n"); +	return 0; +} + diff --git a/arch/arm/mach-omap2/smartreflex-class3.c b/arch/arm/mach-omap2/smartreflex-class3.c index 955566eefac..1da8f03c479 100644 --- a/arch/arm/mach-omap2/smartreflex-class3.c +++ b/arch/arm/mach-omap2/smartreflex-class3.c @@ -11,36 +11,37 @@   * published by the Free Software Foundation.   */ -#include "smartreflex.h" +#include <linux/power/smartreflex.h> +#include "voltage.h" -static int sr_class3_enable(struct voltagedomain *voltdm) +static int sr_class3_enable(struct omap_sr *sr)  { -	unsigned long volt = voltdm_get_voltage(voltdm); +	unsigned long volt = voltdm_get_voltage(sr->voltdm);  	if (!volt) { -		pr_warning("%s: Curr voltage unknown. Cannot enable sr_%s\n", -				__func__, voltdm->name); +		pr_warning("%s: Curr voltage unknown. Cannot enable %s\n", +				__func__, sr->name);  		return -ENODATA;  	} -	omap_vp_enable(voltdm); -	return sr_enable(voltdm, volt); +	omap_vp_enable(sr->voltdm); +	return sr_enable(sr->voltdm, volt);  } -static int sr_class3_disable(struct voltagedomain *voltdm, int is_volt_reset) +static int sr_class3_disable(struct omap_sr *sr, int is_volt_reset)  { -	sr_disable_errgen(voltdm); -	omap_vp_disable(voltdm); -	sr_disable(voltdm); +	sr_disable_errgen(sr->voltdm); +	omap_vp_disable(sr->voltdm); +	sr_disable(sr->voltdm);  	if (is_volt_reset) -		voltdm_reset(voltdm); +		voltdm_reset(sr->voltdm);  	return 0;  } -static int sr_class3_configure(struct voltagedomain *voltdm) +static int sr_class3_configure(struct omap_sr *sr)  { -	return sr_configure_errgen(voltdm); +	return sr_configure_errgen(sr->voltdm);  }  /* SR class3 structure */ diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c deleted file mode 100644 index 008fbd7b935..00000000000 --- a/arch/arm/mach-omap2/smartreflex.c +++ /dev/null @@ -1,1165 +0,0 @@ -/* - * OMAP SmartReflex Voltage Control - * - * Author: Thara Gopinath	<thara@ti.com> - * - * Copyright (C) 2010 Texas Instruments, Inc. - * Thara Gopinath <thara@ti.com> - * - * Copyright (C) 2008 Nokia Corporation - * Kalle Jokiniemi - * - * Copyright (C) 2007 Texas Instruments, Inc. - * Lesly A M <x0080970@ti.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/module.h> -#include <linux/interrupt.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/debugfs.h> -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/pm_runtime.h> - -#include "common.h" - -#include "pm.h" -#include "smartreflex.h" - -#define SMARTREFLEX_NAME_LEN	16 -#define NVALUE_NAME_LEN		40 -#define SR_DISABLE_TIMEOUT	200 - -struct omap_sr { -	struct list_head		node; -	struct platform_device		*pdev; -	struct omap_sr_nvalue_table	*nvalue_table; -	struct voltagedomain		*voltdm; -	struct dentry			*dbg_dir; -	unsigned int			irq; -	int				srid; -	int				ip_type; -	int				nvalue_count; -	bool				autocomp_active; -	u32				clk_length; -	u32				err_weight; -	u32				err_minlimit; -	u32				err_maxlimit; -	u32				accum_data; -	u32				senn_avgweight; -	u32				senp_avgweight; -	u32				senp_mod; -	u32				senn_mod; -	void __iomem			*base; -}; - -/* sr_list contains all the instances of smartreflex module */ -static LIST_HEAD(sr_list); - -static struct omap_sr_class_data *sr_class; -static struct omap_sr_pmic_data *sr_pmic_data; -static struct dentry		*sr_dbg_dir; - -static inline void sr_write_reg(struct omap_sr *sr, unsigned offset, u32 value) -{ -	__raw_writel(value, (sr->base + offset)); -} - -static inline void sr_modify_reg(struct omap_sr *sr, unsigned offset, u32 mask, -					u32 value) -{ -	u32 reg_val; - -	/* -	 * Smartreflex error config register is special as it contains -	 * certain status bits which if written a 1 into means a clear -	 * of those bits. So in order to make sure no accidental write of -	 * 1 happens to those status bits, do a clear of them in the read -	 * value. This mean this API doesn't rewrite values in these bits -	 * if they are currently set, but does allow the caller to write -	 * those bits. -	 */ -	if (sr->ip_type == SR_TYPE_V1 && offset == ERRCONFIG_V1) -		mask |= ERRCONFIG_STATUS_V1_MASK; -	else if (sr->ip_type == SR_TYPE_V2 && offset == ERRCONFIG_V2) -		mask |= ERRCONFIG_VPBOUNDINTST_V2; - -	reg_val = __raw_readl(sr->base + offset); -	reg_val &= ~mask; - -	value &= mask; - -	reg_val |= value; - -	__raw_writel(reg_val, (sr->base + offset)); -} - -static inline u32 sr_read_reg(struct omap_sr *sr, unsigned offset) -{ -	return __raw_readl(sr->base + offset); -} - -static struct omap_sr *_sr_lookup(struct voltagedomain *voltdm) -{ -	struct omap_sr *sr_info; - -	if (!voltdm) { -		pr_err("%s: Null voltage domain passed!\n", __func__); -		return ERR_PTR(-EINVAL); -	} - -	list_for_each_entry(sr_info, &sr_list, node) { -		if (voltdm == sr_info->voltdm) -			return sr_info; -	} - -	return ERR_PTR(-ENODATA); -} - -static irqreturn_t sr_interrupt(int irq, void *data) -{ -	struct omap_sr *sr_info = data; -	u32 status = 0; - -	switch (sr_info->ip_type) { -	case SR_TYPE_V1: -		/* Read the status bits */ -		status = sr_read_reg(sr_info, ERRCONFIG_V1); - -		/* Clear them by writing back */ -		sr_write_reg(sr_info, ERRCONFIG_V1, status); -		break; -	case SR_TYPE_V2: -		/* Read the status bits */ -		status = sr_read_reg(sr_info, IRQSTATUS); - -		/* Clear them by writing back */ -		sr_write_reg(sr_info, IRQSTATUS, status); -		break; -	default: -		dev_err(&sr_info->pdev->dev, "UNKNOWN IP type %d\n", -			sr_info->ip_type); -		return IRQ_NONE; -	} - -	if (sr_class->notify) -		sr_class->notify(sr_info->voltdm, status); - -	return IRQ_HANDLED; -} - -static void sr_set_clk_length(struct omap_sr *sr) -{ -	struct clk *sys_ck; -	u32 sys_clk_speed; - -	if (cpu_is_omap34xx()) -		sys_ck = clk_get(NULL, "sys_ck"); -	else -		sys_ck = clk_get(NULL, "sys_clkin_ck"); - -	if (IS_ERR(sys_ck)) { -		dev_err(&sr->pdev->dev, "%s: unable to get sys clk\n", -			__func__); -		return; -	} - -	sys_clk_speed = clk_get_rate(sys_ck); -	clk_put(sys_ck); - -	switch (sys_clk_speed) { -	case 12000000: -		sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK; -		break; -	case 13000000: -		sr->clk_length = SRCLKLENGTH_13MHZ_SYSCLK; -		break; -	case 19200000: -		sr->clk_length = SRCLKLENGTH_19MHZ_SYSCLK; -		break; -	case 26000000: -		sr->clk_length = SRCLKLENGTH_26MHZ_SYSCLK; -		break; -	case 38400000: -		sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK; -		break; -	default: -		dev_err(&sr->pdev->dev, "%s: Invalid sysclk value: %d\n", -			__func__, sys_clk_speed); -		break; -	} -} - -static void sr_set_regfields(struct omap_sr *sr) -{ -	/* -	 * For time being these values are defined in smartreflex.h -	 * and populated during init. May be they can be moved to board -	 * file or pmic specific data structure. In that case these structure -	 * fields will have to be populated using the pdata or pmic structure. -	 */ -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) { -		sr->err_weight = OMAP3430_SR_ERRWEIGHT; -		sr->err_maxlimit = OMAP3430_SR_ERRMAXLIMIT; -		sr->accum_data = OMAP3430_SR_ACCUMDATA; -		if (!(strcmp(sr->voltdm->name, "mpu"))) { -			sr->senn_avgweight = OMAP3430_SR1_SENNAVGWEIGHT; -			sr->senp_avgweight = OMAP3430_SR1_SENPAVGWEIGHT; -		} else { -			sr->senn_avgweight = OMAP3430_SR2_SENNAVGWEIGHT; -			sr->senp_avgweight = OMAP3430_SR2_SENPAVGWEIGHT; -		} -	} -} - -static void sr_start_vddautocomp(struct omap_sr *sr) -{ -	if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) { -		dev_warn(&sr->pdev->dev, -			"%s: smartreflex class driver not registered\n", -			__func__); -		return; -	} - -	if (!sr_class->enable(sr->voltdm)) -		sr->autocomp_active = true; -} - -static void sr_stop_vddautocomp(struct omap_sr *sr) -{ -	if (!sr_class || !(sr_class->disable)) { -		dev_warn(&sr->pdev->dev, -			"%s: smartreflex class driver not registered\n", -			__func__); -		return; -	} - -	if (sr->autocomp_active) { -		sr_class->disable(sr->voltdm, 1); -		sr->autocomp_active = false; -	} -} - -/* - * This function handles the intializations which have to be done - * only when both sr device and class driver regiter has - * completed. This will be attempted to be called from both sr class - * driver register and sr device intializtion API's. Only one call - * will ultimately succeed. - * - * Currently this function registers interrupt handler for a particular SR - * if smartreflex class driver is already registered and has - * requested for interrupts and the SR interrupt line in present. - */ -static int sr_late_init(struct omap_sr *sr_info) -{ -	char *name; -	struct omap_sr_data *pdata = sr_info->pdev->dev.platform_data; -	struct resource *mem; -	int ret = 0; - -	if (sr_class->notify && sr_class->notify_flags && sr_info->irq) { -		name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name); -		if (name == NULL) { -			ret = -ENOMEM; -			goto error; -		} -		ret = request_irq(sr_info->irq, sr_interrupt, -				0, name, sr_info); -		if (ret) -			goto error; -		disable_irq(sr_info->irq); -	} - -	if (pdata && pdata->enable_on_init) -		sr_start_vddautocomp(sr_info); - -	return ret; - -error: -	iounmap(sr_info->base); -	mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0); -	release_mem_region(mem->start, resource_size(mem)); -	list_del(&sr_info->node); -	dev_err(&sr_info->pdev->dev, "%s: ERROR in registering" -		"interrupt handler. Smartreflex will" -		"not function as desired\n", __func__); -	kfree(name); -	kfree(sr_info); - -	return ret; -} - -static void sr_v1_disable(struct omap_sr *sr) -{ -	int timeout = 0; -	int errconf_val = ERRCONFIG_MCUACCUMINTST | ERRCONFIG_MCUVALIDINTST | -			ERRCONFIG_MCUBOUNDINTST; - -	/* Enable MCUDisableAcknowledge interrupt */ -	sr_modify_reg(sr, ERRCONFIG_V1, -			ERRCONFIG_MCUDISACKINTEN, ERRCONFIG_MCUDISACKINTEN); - -	/* SRCONFIG - disable SR */ -	sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0); - -	/* Disable all other SR interrupts and clear the status as needed */ -	if (sr_read_reg(sr, ERRCONFIG_V1) & ERRCONFIG_VPBOUNDINTST_V1) -		errconf_val |= ERRCONFIG_VPBOUNDINTST_V1; -	sr_modify_reg(sr, ERRCONFIG_V1, -			(ERRCONFIG_MCUACCUMINTEN | ERRCONFIG_MCUVALIDINTEN | -			ERRCONFIG_MCUBOUNDINTEN | ERRCONFIG_VPBOUNDINTEN_V1), -			errconf_val); - -	/* -	 * Wait for SR to be disabled. -	 * wait until ERRCONFIG.MCUDISACKINTST = 1. Typical latency is 1us. -	 */ -	omap_test_timeout((sr_read_reg(sr, ERRCONFIG_V1) & -			ERRCONFIG_MCUDISACKINTST), SR_DISABLE_TIMEOUT, -			timeout); - -	if (timeout >= SR_DISABLE_TIMEOUT) -		dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n", -			__func__); - -	/* Disable MCUDisableAcknowledge interrupt & clear pending interrupt */ -	sr_modify_reg(sr, ERRCONFIG_V1, ERRCONFIG_MCUDISACKINTEN, -			ERRCONFIG_MCUDISACKINTST); -} - -static void sr_v2_disable(struct omap_sr *sr) -{ -	int timeout = 0; - -	/* Enable MCUDisableAcknowledge interrupt */ -	sr_write_reg(sr, IRQENABLE_SET, IRQENABLE_MCUDISABLEACKINT); - -	/* SRCONFIG - disable SR */ -	sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0); - -	/* -	 * Disable all other SR interrupts and clear the status -	 * write to status register ONLY on need basis - only if status -	 * is set. -	 */ -	if (sr_read_reg(sr, ERRCONFIG_V2) & ERRCONFIG_VPBOUNDINTST_V2) -		sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2, -			ERRCONFIG_VPBOUNDINTST_V2); -	else -		sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2, -				0x0); -	sr_write_reg(sr, IRQENABLE_CLR, (IRQENABLE_MCUACCUMINT | -			IRQENABLE_MCUVALIDINT | -			IRQENABLE_MCUBOUNDSINT)); -	sr_write_reg(sr, IRQSTATUS, (IRQSTATUS_MCUACCUMINT | -			IRQSTATUS_MCVALIDINT | -			IRQSTATUS_MCBOUNDSINT)); - -	/* -	 * Wait for SR to be disabled. -	 * wait until IRQSTATUS.MCUDISACKINTST = 1. Typical latency is 1us. -	 */ -	omap_test_timeout((sr_read_reg(sr, IRQSTATUS) & -			IRQSTATUS_MCUDISABLEACKINT), SR_DISABLE_TIMEOUT, -			timeout); - -	if (timeout >= SR_DISABLE_TIMEOUT) -		dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n", -			__func__); - -	/* Disable MCUDisableAcknowledge interrupt & clear pending interrupt */ -	sr_write_reg(sr, IRQENABLE_CLR, IRQENABLE_MCUDISABLEACKINT); -	sr_write_reg(sr, IRQSTATUS, IRQSTATUS_MCUDISABLEACKINT); -} - -static u32 sr_retrieve_nvalue(struct omap_sr *sr, u32 efuse_offs) -{ -	int i; - -	if (!sr->nvalue_table) { -		dev_warn(&sr->pdev->dev, "%s: Missing ntarget value table\n", -			__func__); -		return 0; -	} - -	for (i = 0; i < sr->nvalue_count; i++) { -		if (sr->nvalue_table[i].efuse_offs == efuse_offs) -			return sr->nvalue_table[i].nvalue; -	} - -	return 0; -} - -/* Public Functions */ - -/** - * sr_configure_errgen() - Configures the smrtreflex to perform AVS using the - *			 error generator module. - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * - * This API is to be called from the smartreflex class driver to - * configure the error generator module inside the smartreflex module. - * SR settings if using the ERROR module inside Smartreflex. - * SR CLASS 3 by default uses only the ERROR module where as - * SR CLASS 2 can choose between ERROR module and MINMAXAVG - * module. Returns 0 on success and error value in case of failure. - */ -int sr_configure_errgen(struct voltagedomain *voltdm) -{ -	u32 sr_config, sr_errconfig, errconfig_offs; -	u32 vpboundint_en, vpboundint_st; -	u32 senp_en = 0, senn_en = 0; -	u8 senp_shift, senn_shift; -	struct omap_sr *sr = _sr_lookup(voltdm); - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return PTR_ERR(sr); -	} - -	if (!sr->clk_length) -		sr_set_clk_length(sr); - -	senp_en = sr->senp_mod; -	senn_en = sr->senn_mod; - -	sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) | -		SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN; - -	switch (sr->ip_type) { -	case SR_TYPE_V1: -		sr_config |= SRCONFIG_DELAYCTRL; -		senn_shift = SRCONFIG_SENNENABLE_V1_SHIFT; -		senp_shift = SRCONFIG_SENPENABLE_V1_SHIFT; -		errconfig_offs = ERRCONFIG_V1; -		vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V1; -		vpboundint_st = ERRCONFIG_VPBOUNDINTST_V1; -		break; -	case SR_TYPE_V2: -		senn_shift = SRCONFIG_SENNENABLE_V2_SHIFT; -		senp_shift = SRCONFIG_SENPENABLE_V2_SHIFT; -		errconfig_offs = ERRCONFIG_V2; -		vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V2; -		vpboundint_st = ERRCONFIG_VPBOUNDINTST_V2; -		break; -	default: -		dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex" -			"module without specifying the ip\n", __func__); -		return -EINVAL; -	} - -	sr_config |= ((senn_en << senn_shift) | (senp_en << senp_shift)); -	sr_write_reg(sr, SRCONFIG, sr_config); -	sr_errconfig = (sr->err_weight << ERRCONFIG_ERRWEIGHT_SHIFT) | -		(sr->err_maxlimit << ERRCONFIG_ERRMAXLIMIT_SHIFT) | -		(sr->err_minlimit <<  ERRCONFIG_ERRMINLIMIT_SHIFT); -	sr_modify_reg(sr, errconfig_offs, (SR_ERRWEIGHT_MASK | -		SR_ERRMAXLIMIT_MASK | SR_ERRMINLIMIT_MASK), -		sr_errconfig); - -	/* Enabling the interrupts if the ERROR module is used */ -	sr_modify_reg(sr, errconfig_offs, (vpboundint_en | vpboundint_st), -		      vpboundint_en); - -	return 0; -} - -/** - * sr_disable_errgen() - Disables SmartReflex AVS module's errgen component - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * - * This API is to be called from the smartreflex class driver to - * disable the error generator module inside the smartreflex module. - * - * Returns 0 on success and error value in case of failure. - */ -int sr_disable_errgen(struct voltagedomain *voltdm) -{ -	u32 errconfig_offs; -	u32 vpboundint_en, vpboundint_st; -	struct omap_sr *sr = _sr_lookup(voltdm); - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return PTR_ERR(sr); -	} - -	switch (sr->ip_type) { -	case SR_TYPE_V1: -		errconfig_offs = ERRCONFIG_V1; -		vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V1; -		vpboundint_st = ERRCONFIG_VPBOUNDINTST_V1; -		break; -	case SR_TYPE_V2: -		errconfig_offs = ERRCONFIG_V2; -		vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V2; -		vpboundint_st = ERRCONFIG_VPBOUNDINTST_V2; -		break; -	default: -		dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex" -			"module without specifying the ip\n", __func__); -		return -EINVAL; -	} - -	/* Disable the interrupts of ERROR module */ -	sr_modify_reg(sr, errconfig_offs, vpboundint_en | vpboundint_st, 0); - -	/* Disable the Sensor and errorgen */ -	sr_modify_reg(sr, SRCONFIG, SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN, 0); - -	return 0; -} - -/** - * sr_configure_minmax() - Configures the smrtreflex to perform AVS using the - *			 minmaxavg module. - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * - * This API is to be called from the smartreflex class driver to - * configure the minmaxavg module inside the smartreflex module. - * SR settings if using the ERROR module inside Smartreflex. - * SR CLASS 3 by default uses only the ERROR module where as - * SR CLASS 2 can choose between ERROR module and MINMAXAVG - * module. Returns 0 on success and error value in case of failure. - */ -int sr_configure_minmax(struct voltagedomain *voltdm) -{ -	u32 sr_config, sr_avgwt; -	u32 senp_en = 0, senn_en = 0; -	u8 senp_shift, senn_shift; -	struct omap_sr *sr = _sr_lookup(voltdm); - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return PTR_ERR(sr); -	} - -	if (!sr->clk_length) -		sr_set_clk_length(sr); - -	senp_en = sr->senp_mod; -	senn_en = sr->senn_mod; - -	sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) | -		SRCONFIG_SENENABLE | -		(sr->accum_data << SRCONFIG_ACCUMDATA_SHIFT); - -	switch (sr->ip_type) { -	case SR_TYPE_V1: -		sr_config |= SRCONFIG_DELAYCTRL; -		senn_shift = SRCONFIG_SENNENABLE_V1_SHIFT; -		senp_shift = SRCONFIG_SENPENABLE_V1_SHIFT; -		break; -	case SR_TYPE_V2: -		senn_shift = SRCONFIG_SENNENABLE_V2_SHIFT; -		senp_shift = SRCONFIG_SENPENABLE_V2_SHIFT; -		break; -	default: -		dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex" -			"module without specifying the ip\n", __func__); -		return -EINVAL; -	} - -	sr_config |= ((senn_en << senn_shift) | (senp_en << senp_shift)); -	sr_write_reg(sr, SRCONFIG, sr_config); -	sr_avgwt = (sr->senp_avgweight << AVGWEIGHT_SENPAVGWEIGHT_SHIFT) | -		(sr->senn_avgweight << AVGWEIGHT_SENNAVGWEIGHT_SHIFT); -	sr_write_reg(sr, AVGWEIGHT, sr_avgwt); - -	/* -	 * Enabling the interrupts if MINMAXAVG module is used. -	 * TODO: check if all the interrupts are mandatory -	 */ -	switch (sr->ip_type) { -	case SR_TYPE_V1: -		sr_modify_reg(sr, ERRCONFIG_V1, -			(ERRCONFIG_MCUACCUMINTEN | ERRCONFIG_MCUVALIDINTEN | -			ERRCONFIG_MCUBOUNDINTEN), -			(ERRCONFIG_MCUACCUMINTEN | ERRCONFIG_MCUACCUMINTST | -			 ERRCONFIG_MCUVALIDINTEN | ERRCONFIG_MCUVALIDINTST | -			 ERRCONFIG_MCUBOUNDINTEN | ERRCONFIG_MCUBOUNDINTST)); -		break; -	case SR_TYPE_V2: -		sr_write_reg(sr, IRQSTATUS, -			IRQSTATUS_MCUACCUMINT | IRQSTATUS_MCVALIDINT | -			IRQSTATUS_MCBOUNDSINT | IRQSTATUS_MCUDISABLEACKINT); -		sr_write_reg(sr, IRQENABLE_SET, -			IRQENABLE_MCUACCUMINT | IRQENABLE_MCUVALIDINT | -			IRQENABLE_MCUBOUNDSINT | IRQENABLE_MCUDISABLEACKINT); -		break; -	default: -		dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex" -			"module without specifying the ip\n", __func__); -		return -EINVAL; -	} - -	return 0; -} - -/** - * sr_enable() - Enables the smartreflex module. - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * @volt:	The voltage at which the Voltage domain associated with - *		the smartreflex module is operating at. - *		This is required only to program the correct Ntarget value. - * - * This API is to be called from the smartreflex class driver to - * enable a smartreflex module. Returns 0 on success. Returns error - * value if the voltage passed is wrong or if ntarget value is wrong. - */ -int sr_enable(struct voltagedomain *voltdm, unsigned long volt) -{ -	struct omap_volt_data *volt_data; -	struct omap_sr *sr = _sr_lookup(voltdm); -	u32 nvalue_reciprocal; -	int ret; - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return PTR_ERR(sr); -	} - -	volt_data = omap_voltage_get_voltdata(sr->voltdm, volt); - -	if (IS_ERR(volt_data)) { -		dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table" -			"for nominal voltage %ld\n", __func__, volt); -		return PTR_ERR(volt_data); -	} - -	nvalue_reciprocal = sr_retrieve_nvalue(sr, volt_data->sr_efuse_offs); - -	if (!nvalue_reciprocal) { -		dev_warn(&sr->pdev->dev, "%s: NVALUE = 0 at voltage %ld\n", -			__func__, volt); -		return -ENODATA; -	} - -	/* errminlimit is opp dependent and hence linked to voltage */ -	sr->err_minlimit = volt_data->sr_errminlimit; - -	pm_runtime_get_sync(&sr->pdev->dev); - -	/* Check if SR is already enabled. If yes do nothing */ -	if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE) -		return 0; - -	/* Configure SR */ -	ret = sr_class->configure(voltdm); -	if (ret) -		return ret; - -	sr_write_reg(sr, NVALUERECIPROCAL, nvalue_reciprocal); - -	/* SRCONFIG - enable SR */ -	sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, SRCONFIG_SRENABLE); -	return 0; -} - -/** - * sr_disable() - Disables the smartreflex module. - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * - * This API is to be called from the smartreflex class driver to - * disable a smartreflex module. - */ -void sr_disable(struct voltagedomain *voltdm) -{ -	struct omap_sr *sr = _sr_lookup(voltdm); - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return; -	} - -	/* Check if SR clocks are already disabled. If yes do nothing */ -	if (pm_runtime_suspended(&sr->pdev->dev)) -		return; - -	/* -	 * Disable SR if only it is indeed enabled. Else just -	 * disable the clocks. -	 */ -	if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE) { -		switch (sr->ip_type) { -		case SR_TYPE_V1: -			sr_v1_disable(sr); -			break; -		case SR_TYPE_V2: -			sr_v2_disable(sr); -			break; -		default: -			dev_err(&sr->pdev->dev, "UNKNOWN IP type %d\n", -				sr->ip_type); -		} -	} - -	pm_runtime_put_sync_suspend(&sr->pdev->dev); -} - -/** - * sr_register_class() - API to register a smartreflex class parameters. - * @class_data:	The structure containing various sr class specific data. - * - * This API is to be called by the smartreflex class driver to register itself - * with the smartreflex driver during init. Returns 0 on success else the - * error value. - */ -int sr_register_class(struct omap_sr_class_data *class_data) -{ -	struct omap_sr *sr_info; - -	if (!class_data) { -		pr_warning("%s:, Smartreflex class data passed is NULL\n", -			__func__); -		return -EINVAL; -	} - -	if (sr_class) { -		pr_warning("%s: Smartreflex class driver already registered\n", -			__func__); -		return -EBUSY; -	} - -	sr_class = class_data; - -	/* -	 * Call into late init to do intializations that require -	 * both sr driver and sr class driver to be initiallized. -	 */ -	list_for_each_entry(sr_info, &sr_list, node) -		sr_late_init(sr_info); - -	return 0; -} - -/** - * omap_sr_enable() -  API to enable SR clocks and to call into the - *			registered smartreflex class enable API. - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * - * This API is to be called from the kernel in order to enable - * a particular smartreflex module. This API will do the initial - * configurations to turn on the smartreflex module and in turn call - * into the registered smartreflex class enable API. - */ -void omap_sr_enable(struct voltagedomain *voltdm) -{ -	struct omap_sr *sr = _sr_lookup(voltdm); - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return; -	} - -	if (!sr->autocomp_active) -		return; - -	if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) { -		dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not" -			"registered\n", __func__); -		return; -	} - -	sr_class->enable(voltdm); -} - -/** - * omap_sr_disable() - API to disable SR without resetting the voltage - *			processor voltage - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * - * This API is to be called from the kernel in order to disable - * a particular smartreflex module. This API will in turn call - * into the registered smartreflex class disable API. This API will tell - * the smartreflex class disable not to reset the VP voltage after - * disabling smartreflex. - */ -void omap_sr_disable(struct voltagedomain *voltdm) -{ -	struct omap_sr *sr = _sr_lookup(voltdm); - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return; -	} - -	if (!sr->autocomp_active) -		return; - -	if (!sr_class || !(sr_class->disable)) { -		dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not" -			"registered\n", __func__); -		return; -	} - -	sr_class->disable(voltdm, 0); -} - -/** - * omap_sr_disable_reset_volt() - API to disable SR and reset the - *				voltage processor voltage - * @voltdm:	VDD pointer to which the SR module to be configured belongs to. - * - * This API is to be called from the kernel in order to disable - * a particular smartreflex module. This API will in turn call - * into the registered smartreflex class disable API. This API will tell - * the smartreflex class disable to reset the VP voltage after - * disabling smartreflex. - */ -void omap_sr_disable_reset_volt(struct voltagedomain *voltdm) -{ -	struct omap_sr *sr = _sr_lookup(voltdm); - -	if (IS_ERR(sr)) { -		pr_warning("%s: omap_sr struct for sr_%s not found\n", -			__func__, voltdm->name); -		return; -	} - -	if (!sr->autocomp_active) -		return; - -	if (!sr_class || !(sr_class->disable)) { -		dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not" -			"registered\n", __func__); -		return; -	} - -	sr_class->disable(voltdm, 1); -} - -/** - * omap_sr_register_pmic() - API to register pmic specific info. - * @pmic_data:	The structure containing pmic specific data. - * - * This API is to be called from the PMIC specific code to register with - * smartreflex driver pmic specific info. Currently the only info required - * is the smartreflex init on the PMIC side. - */ -void omap_sr_register_pmic(struct omap_sr_pmic_data *pmic_data) -{ -	if (!pmic_data) { -		pr_warning("%s: Trying to register NULL PMIC data structure" -			"with smartreflex\n", __func__); -		return; -	} - -	sr_pmic_data = pmic_data; -} - -/* PM Debug FS entries to enable and disable smartreflex. */ -static int omap_sr_autocomp_show(void *data, u64 *val) -{ -	struct omap_sr *sr_info = data; - -	if (!sr_info) { -		pr_warning("%s: omap_sr struct not found\n", __func__); -		return -EINVAL; -	} - -	*val = sr_info->autocomp_active; - -	return 0; -} - -static int omap_sr_autocomp_store(void *data, u64 val) -{ -	struct omap_sr *sr_info = data; - -	if (!sr_info) { -		pr_warning("%s: omap_sr struct not found\n", __func__); -		return -EINVAL; -	} - -	/* Sanity check */ -	if (val > 1) { -		pr_warning("%s: Invalid argument %lld\n", __func__, val); -		return -EINVAL; -	} - -	/* control enable/disable only if there is a delta in value */ -	if (sr_info->autocomp_active != val) { -		if (!val) -			sr_stop_vddautocomp(sr_info); -		else -			sr_start_vddautocomp(sr_info); -	} - -	return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(pm_sr_fops, omap_sr_autocomp_show, -			omap_sr_autocomp_store, "%llu\n"); - -static int __init omap_sr_probe(struct platform_device *pdev) -{ -	struct omap_sr *sr_info; -	struct omap_sr_data *pdata = pdev->dev.platform_data; -	struct resource *mem, *irq; -	struct dentry *nvalue_dir; -	struct omap_volt_data *volt_data; -	int i, ret = 0; -	char *name; - -	sr_info = kzalloc(sizeof(struct omap_sr), GFP_KERNEL); -	if (!sr_info) { -		dev_err(&pdev->dev, "%s: unable to allocate sr_info\n", -			__func__); -		return -ENOMEM; -	} - -	platform_set_drvdata(pdev, sr_info); - -	if (!pdata) { -		dev_err(&pdev->dev, "%s: platform data missing\n", __func__); -		ret = -EINVAL; -		goto err_free_devinfo; -	} - -	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!mem) { -		dev_err(&pdev->dev, "%s: no mem resource\n", __func__); -		ret = -ENODEV; -		goto err_free_devinfo; -	} - -	mem = request_mem_region(mem->start, resource_size(mem), -					dev_name(&pdev->dev)); -	if (!mem) { -		dev_err(&pdev->dev, "%s: no mem region\n", __func__); -		ret = -EBUSY; -		goto err_free_devinfo; -	} - -	irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - -	pm_runtime_enable(&pdev->dev); -	pm_runtime_irq_safe(&pdev->dev); - -	sr_info->pdev = pdev; -	sr_info->srid = pdev->id; -	sr_info->voltdm = pdata->voltdm; -	sr_info->nvalue_table = pdata->nvalue_table; -	sr_info->nvalue_count = pdata->nvalue_count; -	sr_info->senn_mod = pdata->senn_mod; -	sr_info->senp_mod = pdata->senp_mod; -	sr_info->autocomp_active = false; -	sr_info->ip_type = pdata->ip_type; -	sr_info->base = ioremap(mem->start, resource_size(mem)); -	if (!sr_info->base) { -		dev_err(&pdev->dev, "%s: ioremap fail\n", __func__); -		ret = -ENOMEM; -		goto err_release_region; -	} - -	if (irq) -		sr_info->irq = irq->start; - -	sr_set_clk_length(sr_info); -	sr_set_regfields(sr_info); - -	list_add(&sr_info->node, &sr_list); - -	/* -	 * Call into late init to do intializations that require -	 * both sr driver and sr class driver to be initiallized. -	 */ -	if (sr_class) { -		ret = sr_late_init(sr_info); -		if (ret) { -			pr_warning("%s: Error in SR late init\n", __func__); -			goto err_iounmap; -		} -	} - -	dev_info(&pdev->dev, "%s: SmartReflex driver initialized\n", __func__); -	if (!sr_dbg_dir) { -		sr_dbg_dir = debugfs_create_dir("smartreflex", NULL); -		if (IS_ERR_OR_NULL(sr_dbg_dir)) { -			ret = PTR_ERR(sr_dbg_dir); -			pr_err("%s:sr debugfs dir creation failed(%d)\n", -				__func__, ret); -			goto err_iounmap; -		} -	} - -	name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name); -	if (!name) { -		dev_err(&pdev->dev, "%s: Unable to alloc debugfs name\n", -			__func__); -		ret = -ENOMEM; -		goto err_iounmap; -	} -	sr_info->dbg_dir = debugfs_create_dir(name, sr_dbg_dir); -	kfree(name); -	if (IS_ERR_OR_NULL(sr_info->dbg_dir)) { -		dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n", -			__func__); -		ret = PTR_ERR(sr_info->dbg_dir); -		goto err_iounmap; -	} - -	(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, -			sr_info->dbg_dir, (void *)sr_info, &pm_sr_fops); -	(void) debugfs_create_x32("errweight", S_IRUGO, sr_info->dbg_dir, -			&sr_info->err_weight); -	(void) debugfs_create_x32("errmaxlimit", S_IRUGO, sr_info->dbg_dir, -			&sr_info->err_maxlimit); -	(void) debugfs_create_x32("errminlimit", S_IRUGO, sr_info->dbg_dir, -			&sr_info->err_minlimit); - -	nvalue_dir = debugfs_create_dir("nvalue", sr_info->dbg_dir); -	if (IS_ERR_OR_NULL(nvalue_dir)) { -		dev_err(&pdev->dev, "%s: Unable to create debugfs directory" -			"for n-values\n", __func__); -		ret = PTR_ERR(nvalue_dir); -		goto err_debugfs; -	} - -	omap_voltage_get_volttable(sr_info->voltdm, &volt_data); -	if (!volt_data) { -		dev_warn(&pdev->dev, "%s: No Voltage table for the" -			" corresponding vdd vdd_%s. Cannot create debugfs" -			"entries for n-values\n", -			__func__, sr_info->voltdm->name); -		ret = -ENODATA; -		goto err_debugfs; -	} - -	for (i = 0; i < sr_info->nvalue_count; i++) { -		char name[NVALUE_NAME_LEN + 1]; - -		snprintf(name, sizeof(name), "volt_%d", -			 volt_data[i].volt_nominal); -		(void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir, -				&(sr_info->nvalue_table[i].nvalue)); -	} - -	return ret; - -err_debugfs: -	debugfs_remove_recursive(sr_info->dbg_dir); -err_iounmap: -	list_del(&sr_info->node); -	iounmap(sr_info->base); -err_release_region: -	release_mem_region(mem->start, resource_size(mem)); -err_free_devinfo: -	kfree(sr_info); - -	return ret; -} - -static int __devexit omap_sr_remove(struct platform_device *pdev) -{ -	struct omap_sr_data *pdata = pdev->dev.platform_data; -	struct omap_sr *sr_info; -	struct resource *mem; - -	if (!pdata) { -		dev_err(&pdev->dev, "%s: platform data missing\n", __func__); -		return -EINVAL; -	} - -	sr_info = _sr_lookup(pdata->voltdm); -	if (IS_ERR(sr_info)) { -		dev_warn(&pdev->dev, "%s: omap_sr struct not found\n", -			__func__); -		return PTR_ERR(sr_info); -	} - -	if (sr_info->autocomp_active) -		sr_stop_vddautocomp(sr_info); -	if (sr_info->dbg_dir) -		debugfs_remove_recursive(sr_info->dbg_dir); - -	list_del(&sr_info->node); -	iounmap(sr_info->base); -	kfree(sr_info); -	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	release_mem_region(mem->start, resource_size(mem)); - -	return 0; -} - -static void __devexit omap_sr_shutdown(struct platform_device *pdev) -{ -	struct omap_sr_data *pdata = pdev->dev.platform_data; -	struct omap_sr *sr_info; - -	if (!pdata) { -		dev_err(&pdev->dev, "%s: platform data missing\n", __func__); -		return; -	} - -	sr_info = _sr_lookup(pdata->voltdm); -	if (IS_ERR(sr_info)) { -		dev_warn(&pdev->dev, "%s: omap_sr struct not found\n", -			__func__); -		return; -	} - -	if (sr_info->autocomp_active) -		sr_stop_vddautocomp(sr_info); - -	return; -} - -static struct platform_driver smartreflex_driver = { -	.remove         = __devexit_p(omap_sr_remove), -	.shutdown	= __devexit_p(omap_sr_shutdown), -	.driver		= { -		.name	= "smartreflex", -	}, -}; - -static int __init sr_init(void) -{ -	int ret = 0; - -	/* -	 * sr_init is a late init. If by then a pmic specific API is not -	 * registered either there is no need for anything to be done on -	 * the PMIC side or somebody has forgotten to register a PMIC -	 * handler. Warn for the second condition. -	 */ -	if (sr_pmic_data && sr_pmic_data->sr_pmic_init) -		sr_pmic_data->sr_pmic_init(); -	else -		pr_warning("%s: No PMIC hook to init smartreflex\n", __func__); - -	ret = platform_driver_probe(&smartreflex_driver, omap_sr_probe); -	if (ret) { -		pr_err("%s: platform driver register failed for SR\n", -			__func__); -		return ret; -	} - -	return 0; -} -late_initcall(sr_init); - -static void __exit sr_exit(void) -{ -	platform_driver_unregister(&smartreflex_driver); -} -module_exit(sr_exit); - -MODULE_DESCRIPTION("OMAP Smartreflex Driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:" DRIVER_NAME); -MODULE_AUTHOR("Texas Instruments Inc"); diff --git a/arch/arm/mach-omap2/smartreflex.h b/arch/arm/mach-omap2/smartreflex.h deleted file mode 100644 index 5809141171f..00000000000 --- a/arch/arm/mach-omap2/smartreflex.h +++ /dev/null @@ -1,256 +0,0 @@ -/* - * OMAP Smartreflex Defines and Routines - * - * Author: Thara Gopinath	<thara@ti.com> - * - * Copyright (C) 2010 Texas Instruments, Inc. - * Thara Gopinath <thara@ti.com> - * - * Copyright (C) 2008 Nokia Corporation - * Kalle Jokiniemi - * - * Copyright (C) 2007 Texas Instruments, Inc. - * Lesly A M <x0080970@ti.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_ARM_OMAP_SMARTREFLEX_H -#define __ASM_ARM_OMAP_SMARTREFLEX_H - -#include <linux/platform_device.h> - -#include "voltage.h" - -/* - * Different Smartreflex IPs version. The v1 is the 65nm version used in - * OMAP3430. The v2 is the update for the 45nm version of the IP - * used in OMAP3630 and OMAP4430 - */ -#define SR_TYPE_V1	1 -#define SR_TYPE_V2	2 - -/* SMART REFLEX REG ADDRESS OFFSET */ -#define SRCONFIG		0x00 -#define SRSTATUS		0x04 -#define SENVAL			0x08 -#define SENMIN			0x0C -#define SENMAX			0x10 -#define SENAVG			0x14 -#define AVGWEIGHT		0x18 -#define NVALUERECIPROCAL	0x1c -#define SENERROR_V1		0x20 -#define ERRCONFIG_V1		0x24 -#define IRQ_EOI			0x20 -#define IRQSTATUS_RAW		0x24 -#define IRQSTATUS		0x28 -#define IRQENABLE_SET		0x2C -#define IRQENABLE_CLR		0x30 -#define SENERROR_V2		0x34 -#define ERRCONFIG_V2		0x38 - -/* Bit/Shift Positions */ - -/* SRCONFIG */ -#define SRCONFIG_ACCUMDATA_SHIFT	22 -#define SRCONFIG_SRCLKLENGTH_SHIFT	12 -#define SRCONFIG_SENNENABLE_V1_SHIFT	5 -#define SRCONFIG_SENPENABLE_V1_SHIFT	3 -#define SRCONFIG_SENNENABLE_V2_SHIFT	1 -#define SRCONFIG_SENPENABLE_V2_SHIFT	0 -#define SRCONFIG_CLKCTRL_SHIFT		0 - -#define SRCONFIG_ACCUMDATA_MASK		(0x3ff << 22) - -#define SRCONFIG_SRENABLE		BIT(11) -#define SRCONFIG_SENENABLE		BIT(10) -#define SRCONFIG_ERRGEN_EN		BIT(9) -#define SRCONFIG_MINMAXAVG_EN		BIT(8) -#define SRCONFIG_DELAYCTRL		BIT(2) - -/* AVGWEIGHT */ -#define AVGWEIGHT_SENPAVGWEIGHT_SHIFT	2 -#define AVGWEIGHT_SENNAVGWEIGHT_SHIFT	0 - -/* NVALUERECIPROCAL */ -#define NVALUERECIPROCAL_SENPGAIN_SHIFT	20 -#define NVALUERECIPROCAL_SENNGAIN_SHIFT	16 -#define NVALUERECIPROCAL_RNSENP_SHIFT	8 -#define NVALUERECIPROCAL_RNSENN_SHIFT	0 - -/* ERRCONFIG */ -#define ERRCONFIG_ERRWEIGHT_SHIFT	16 -#define ERRCONFIG_ERRMAXLIMIT_SHIFT	8 -#define ERRCONFIG_ERRMINLIMIT_SHIFT	0 - -#define SR_ERRWEIGHT_MASK		(0x07 << 16) -#define SR_ERRMAXLIMIT_MASK		(0xff << 8) -#define SR_ERRMINLIMIT_MASK		(0xff << 0) - -#define ERRCONFIG_VPBOUNDINTEN_V1	BIT(31) -#define ERRCONFIG_VPBOUNDINTST_V1	BIT(30) -#define	ERRCONFIG_MCUACCUMINTEN		BIT(29) -#define ERRCONFIG_MCUACCUMINTST		BIT(28) -#define	ERRCONFIG_MCUVALIDINTEN		BIT(27) -#define ERRCONFIG_MCUVALIDINTST		BIT(26) -#define ERRCONFIG_MCUBOUNDINTEN		BIT(25) -#define	ERRCONFIG_MCUBOUNDINTST		BIT(24) -#define	ERRCONFIG_MCUDISACKINTEN	BIT(23) -#define ERRCONFIG_VPBOUNDINTST_V2	BIT(23) -#define ERRCONFIG_MCUDISACKINTST	BIT(22) -#define ERRCONFIG_VPBOUNDINTEN_V2	BIT(22) - -#define ERRCONFIG_STATUS_V1_MASK	(ERRCONFIG_VPBOUNDINTST_V1 | \ -					ERRCONFIG_MCUACCUMINTST | \ -					ERRCONFIG_MCUVALIDINTST | \ -					ERRCONFIG_MCUBOUNDINTST | \ -					ERRCONFIG_MCUDISACKINTST) -/* IRQSTATUS */ -#define IRQSTATUS_MCUACCUMINT		BIT(3) -#define IRQSTATUS_MCVALIDINT		BIT(2) -#define IRQSTATUS_MCBOUNDSINT		BIT(1) -#define IRQSTATUS_MCUDISABLEACKINT	BIT(0) - -/* IRQENABLE_SET and IRQENABLE_CLEAR */ -#define IRQENABLE_MCUACCUMINT		BIT(3) -#define IRQENABLE_MCUVALIDINT		BIT(2) -#define IRQENABLE_MCUBOUNDSINT		BIT(1) -#define IRQENABLE_MCUDISABLEACKINT	BIT(0) - -/* Common Bit values */ - -#define SRCLKLENGTH_12MHZ_SYSCLK	0x3c -#define SRCLKLENGTH_13MHZ_SYSCLK	0x41 -#define SRCLKLENGTH_19MHZ_SYSCLK	0x60 -#define SRCLKLENGTH_26MHZ_SYSCLK	0x82 -#define SRCLKLENGTH_38MHZ_SYSCLK	0xC0 - -/* - * 3430 specific values. Maybe these should be passed from board file or - * pmic structures. - */ -#define OMAP3430_SR_ACCUMDATA		0x1f4 - -#define OMAP3430_SR1_SENPAVGWEIGHT	0x03 -#define OMAP3430_SR1_SENNAVGWEIGHT	0x03 - -#define OMAP3430_SR2_SENPAVGWEIGHT	0x01 -#define OMAP3430_SR2_SENNAVGWEIGHT	0x01 - -#define OMAP3430_SR_ERRWEIGHT		0x04 -#define OMAP3430_SR_ERRMAXLIMIT		0x02 - -/** - * struct omap_sr_pmic_data - Strucutre to be populated by pmic code to pass - *				pmic specific info to smartreflex driver - * - * @sr_pmic_init:	API to initialize smartreflex on the PMIC side. - */ -struct omap_sr_pmic_data { -	void (*sr_pmic_init) (void); -}; - -/** - * struct omap_smartreflex_dev_attr - Smartreflex Device attribute. - * - * @sensor_voltdm_name:       Name of voltdomain of SR instance - */ -struct omap_smartreflex_dev_attr { -	const char      *sensor_voltdm_name; -}; - -#ifdef CONFIG_OMAP_SMARTREFLEX -/* - * The smart reflex driver supports CLASS1 CLASS2 and CLASS3 SR. - * The smartreflex class driver should pass the class type. - * Should be used to populate the class_type field of the - * omap_smartreflex_class_data structure. - */ -#define SR_CLASS1	0x1 -#define SR_CLASS2	0x2 -#define SR_CLASS3	0x3 - -/** - * struct omap_sr_class_data - Smartreflex class driver info - * - * @enable:		API to enable a particular class smaartreflex. - * @disable:		API to disable a particular class smartreflex. - * @configure:		API to configure a particular class smartreflex. - * @notify:		API to notify the class driver about an event in SR. - *			Not needed for class3. - * @notify_flags:	specify the events to be notified to the class driver - * @class_type:		specify which smartreflex class. - *			Can be used by the SR driver to take any class - *			based decisions. - */ -struct omap_sr_class_data { -	int (*enable)(struct voltagedomain *voltdm); -	int (*disable)(struct voltagedomain *voltdm, int is_volt_reset); -	int (*configure)(struct voltagedomain *voltdm); -	int (*notify)(struct voltagedomain *voltdm, u32 status); -	u8 notify_flags; -	u8 class_type; -}; - -/** - * struct omap_sr_nvalue_table	- Smartreflex n-target value info - * - * @efuse_offs:	The offset of the efuse where n-target values are stored. - * @nvalue:	The n-target value. - */ -struct omap_sr_nvalue_table { -	u32 efuse_offs; -	u32 nvalue; -}; - -/** - * struct omap_sr_data - Smartreflex platform data. - * - * @ip_type:		Smartreflex IP type. - * @senp_mod:		SENPENABLE value for the sr - * @senn_mod:		SENNENABLE value for sr - * @nvalue_count:	Number of distinct nvalues in the nvalue table - * @enable_on_init:	whether this sr module needs to enabled at - *			boot up or not. - * @nvalue_table:	table containing the  efuse offsets and nvalues - *			corresponding to them. - * @voltdm:		Pointer to the voltage domain associated with the SR - */ -struct omap_sr_data { -	int				ip_type; -	u32				senp_mod; -	u32				senn_mod; -	int				nvalue_count; -	bool				enable_on_init; -	struct omap_sr_nvalue_table	*nvalue_table; -	struct voltagedomain		*voltdm; -}; - -/* Smartreflex module enable/disable interface */ -void omap_sr_enable(struct voltagedomain *voltdm); -void omap_sr_disable(struct voltagedomain *voltdm); -void omap_sr_disable_reset_volt(struct voltagedomain *voltdm); - -/* API to register the pmic specific data with the smartreflex driver. */ -void omap_sr_register_pmic(struct omap_sr_pmic_data *pmic_data); - -/* Smartreflex driver hooks to be called from Smartreflex class driver */ -int sr_enable(struct voltagedomain *voltdm, unsigned long volt); -void sr_disable(struct voltagedomain *voltdm); -int sr_configure_errgen(struct voltagedomain *voltdm); -int sr_disable_errgen(struct voltagedomain *voltdm); -int sr_configure_minmax(struct voltagedomain *voltdm); - -/* API to register the smartreflex class driver with the smartreflex driver */ -int sr_register_class(struct omap_sr_class_data *class_data); -#else -static inline void omap_sr_enable(struct voltagedomain *voltdm) {} -static inline void omap_sr_disable(struct voltagedomain *voltdm) {} -static inline void omap_sr_disable_reset_volt( -		struct voltagedomain *voltdm) {} -static inline void omap_sr_register_pmic( -		struct omap_sr_pmic_data *pmic_data) {} -#endif -#endif diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c index a503e1e8358..d033a65f4e4 100644 --- a/arch/arm/mach-omap2/sr_device.c +++ b/arch/arm/mach-omap2/sr_device.c @@ -17,6 +17,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ +#include <linux/power/smartreflex.h>  #include <linux/err.h>  #include <linux/slab.h> @@ -24,7 +25,6 @@  #include <plat/omap_device.h> -#include "smartreflex.h"  #include "voltage.h"  #include "control.h"  #include "pm.h" @@ -36,7 +36,10 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data,  				struct omap_sr_data *sr_data)  {  	struct omap_sr_nvalue_table *nvalue_table; -	int i, count = 0; +	int i, j, count = 0; + +	sr_data->nvalue_count = 0; +	sr_data->nvalue_table = NULL;  	while (volt_data[count].volt_nominal)  		count++; @@ -44,8 +47,14 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data,  	nvalue_table = kzalloc(sizeof(struct omap_sr_nvalue_table)*count,  			GFP_KERNEL); -	for (i = 0; i < count; i++) { +	if (!nvalue_table) { +		pr_err("OMAP: SmartReflex: cannot allocate memory for n-value table\n"); +		return; +	} + +	for (i = 0, j = 0; i < count; i++) {  		u32 v; +  		/*  		 * In OMAP4 the efuse registers are 24 bit aligned.  		 * A __raw_readl will fail for non-32 bit aligned address @@ -58,15 +67,30 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data,  				omap_ctrl_readb(offset + 1) << 8 |  				omap_ctrl_readb(offset + 2) << 16;  		} else { -			 v = omap_ctrl_readl(volt_data[i].sr_efuse_offs); +			v = omap_ctrl_readl(volt_data[i].sr_efuse_offs);  		} -		nvalue_table[i].efuse_offs = volt_data[i].sr_efuse_offs; -		nvalue_table[i].nvalue = v; +		/* +		 * Many OMAP SoCs don't have the eFuse values set. +		 * For example, pretty much all OMAP3xxx before +		 * ES3.something. +		 * +		 * XXX There needs to be some way for board files or +		 * userspace to add these in. +		 */ +		if (v == 0) +			continue; + +		nvalue_table[j].nvalue = v; +		nvalue_table[j].efuse_offs = volt_data[i].sr_efuse_offs; +		nvalue_table[j].errminlimit = volt_data[i].sr_errminlimit; +		nvalue_table[j].volt_nominal = volt_data[i].volt_nominal; + +		j++;  	}  	sr_data->nvalue_table = nvalue_table; -	sr_data->nvalue_count = count; +	sr_data->nvalue_count = j;  }  static int __init sr_dev_init(struct omap_hwmod *oh, void *user) @@ -93,6 +117,7 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)  		goto exit;  	} +	sr_data->name = oh->name;  	sr_data->ip_type = oh->class->rev;  	sr_data->senn_mod = 0x1;  	sr_data->senp_mod = 0x1; @@ -106,7 +131,7 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)  	omap_voltage_get_volttable(sr_data->voltdm, &volt_data);  	if (!volt_data) { -		pr_warning("%s: No Voltage table registerd fo VDD%d." +		pr_warning("%s: No Voltage table registered fo VDD%d."  			"Something really wrong\n\n", __func__, i + 1);  		goto exit;  	} diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 9b7a0736061..2ff6d41ec6c 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -69,11 +69,6 @@  #define OMAP3_SECURE_TIMER	1  #endif -/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ -#define MAX_GPTIMER_ID		12 - -static u32 sys_timer_reserved; -  /* Clockevent code */  static struct omap_dm_timer clkev; @@ -174,14 +169,14 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,  		return -ENXIO;  	/* After the dmtimer is using hwmod these clocks won't be needed */ -	sprintf(name, "gpt%d_fck", gptimer_id); -	timer->fclk = clk_get(NULL, name); +	timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh));  	if (IS_ERR(timer->fclk))  		return -ENODEV;  	omap_hwmod_enable(oh); -	sys_timer_reserved |= (1 << (gptimer_id - 1)); +	if (omap_dm_timer_reserve_systimer(gptimer_id)) +		return -ENODEV;  	if (gptimer_id != 12) {  		struct clk *src; @@ -370,6 +365,11 @@ OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE,  OMAP_SYS_TIMER(3_secure)  #endif +#ifdef CONFIG_SOC_AM33XX +OMAP_SYS_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, 2, OMAP4_MPU_SOURCE) +OMAP_SYS_TIMER(3_am33xx) +#endif +  #ifdef CONFIG_ARCH_OMAP4  #ifdef CONFIG_LOCAL_TIMERS  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, @@ -395,65 +395,10 @@ static void __init omap4_timer_init(void)  OMAP_SYS_TIMER(4)  #endif -/** - * omap2_dm_timer_set_src - change the timer input clock source - * @pdev:	timer platform device pointer - * @source:	array index of parent clock source - */ -static int omap2_dm_timer_set_src(struct platform_device *pdev, int source) -{ -	int ret; -	struct dmtimer_platform_data *pdata = pdev->dev.platform_data; -	struct clk *fclk, *parent; -	char *parent_name = NULL; - -	fclk = clk_get(&pdev->dev, "fck"); -	if (IS_ERR_OR_NULL(fclk)) { -		dev_err(&pdev->dev, "%s: %d: clk_get() FAILED\n", -				__func__, __LINE__); -		return -EINVAL; -	} - -	switch (source) { -	case OMAP_TIMER_SRC_SYS_CLK: -		parent_name = "sys_ck"; -		break; - -	case OMAP_TIMER_SRC_32_KHZ: -		parent_name = "32k_ck"; -		break; - -	case OMAP_TIMER_SRC_EXT_CLK: -		if (pdata->timer_ip_version == OMAP_TIMER_IP_VERSION_1) { -			parent_name = "alt_ck"; -			break; -		} -		dev_err(&pdev->dev, "%s: %d: invalid clk src.\n", -			__func__, __LINE__); -		clk_put(fclk); -		return -EINVAL; -	} - -	parent = clk_get(&pdev->dev, parent_name); -	if (IS_ERR_OR_NULL(parent)) { -		dev_err(&pdev->dev, "%s: %d: clk_get() %s FAILED\n", -			__func__, __LINE__, parent_name); -		clk_put(fclk); -		return -EINVAL; -	} - -	ret = clk_set_parent(fclk, parent); -	if (IS_ERR_VALUE(ret)) { -		dev_err(&pdev->dev, "%s: clk_set_parent() to %s FAILED\n", -			__func__, parent_name); -		ret = -EINVAL; -	} - -	clk_put(parent); -	clk_put(fclk); - -	return ret; -} +#ifdef CONFIG_SOC_OMAP5 +OMAP_SYS_TIMER_INIT(5, 1, OMAP4_CLKEV_SOURCE, 2, OMAP4_MPU_SOURCE) +OMAP_SYS_TIMER(5) +#endif  /**   * omap_timer_init - build and register timer device with an @@ -475,7 +420,6 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused)  	struct dmtimer_platform_data *pdata;  	struct platform_device *pdev;  	struct omap_timer_capability_dev_attr *timer_dev_attr; -	struct powerdomain *pwrdm;  	pr_debug("%s: %s\n", __func__, oh->name); @@ -503,18 +447,9 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused)  	 */  	sscanf(oh->name, "timer%2d", &id); -	pdata->set_timer_src = omap2_dm_timer_set_src; -	pdata->timer_ip_version = oh->class->rev; +	if (timer_dev_attr) +		pdata->timer_capability = timer_dev_attr->timer_capability; -	/* Mark clocksource and clockevent timers as reserved */ -	if ((sys_timer_reserved >> (id - 1)) & 0x1) -		pdata->reserved = 1; - -	pwrdm = omap_hwmod_get_pwrdm(oh); -	pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm); -#ifdef CONFIG_PM -	pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count; -#endif  	pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata),  				 NULL, 0, 0); diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 43a97907533..de47f170ba5 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c @@ -49,6 +49,7 @@ static struct i2c_board_info __initdata omap4_i2c1_board_info[] = {  	},  }; +#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)  static int twl_set_voltage(void *data, int target_uV)  {  	struct voltagedomain *voltdm = (struct voltagedomain *)data; @@ -60,6 +61,7 @@ static int twl_get_voltage(void *data)  	struct voltagedomain *voltdm = (struct voltagedomain *)data;  	return voltdm_get_voltage(voltdm);  } +#endif  void __init omap_pmic_init(int bus, u32 clkrate,  			   const char *pmic_type, int pmic_irq, @@ -94,7 +96,7 @@ void __init omap4_pmic_init(const char *pmic_type,  void __init omap_pmic_late_init(void)  { -	/* Init the OMAP TWL parameters (if PMIC has been registerd) */ +	/* Init the OMAP TWL parameters (if PMIC has been registered) */  	if (pmic_i2c_board_info.irq)  		omap3_twl_init();  	if (omap4_i2c1_board_info[0].irq) @@ -213,10 +215,6 @@ static struct twl_regulator_driver_data omap3_vdd2_drvdata = {  void __init omap3_pmic_get_config(struct twl4030_platform_data *pmic_data,  				  u32 pdata_flags, u32 regulators_flags)  { -	if (!pmic_data->irq_base) -		pmic_data->irq_base = TWL4030_IRQ_BASE; -	if (!pmic_data->irq_end) -		pmic_data->irq_end = TWL4030_IRQ_END;  	if (!pmic_data->vdd1) {  		omap3_vdd1.driver_data = &omap3_vdd1_drvdata;  		omap3_vdd1_drvdata.data = voltdm_lookup("mpu_iva"); @@ -481,11 +479,6 @@ static struct regulator_init_data omap4_v2v1_idata = {  void __init omap4_pmic_get_config(struct twl4030_platform_data *pmic_data,  				  u32 pdata_flags, u32 regulators_flags)  { -	if (!pmic_data->irq_base) -		pmic_data->irq_base = TWL6030_IRQ_BASE; -	if (!pmic_data->irq_end) -		pmic_data->irq_end = TWL6030_IRQ_END; -  	if (!pmic_data->vdd1) {  		omap4_vdd1.driver_data = &omap4_vdd1_drvdata;  		omap4_vdd1_drvdata.data = voltdm_lookup("mpu"); diff --git a/arch/arm/mach-omap2/usb-fs.c b/arch/arm/mach-omap2/usb-fs.c deleted file mode 100644 index 1481078763b..00000000000 --- a/arch/arm/mach-omap2/usb-fs.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Platform level USB initialization for FS USB OTG controller on omap1 and 24xx - * - * Copyright (C) 2004 Texas Instruments, Inc. - * - * 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 - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/clk.h> -#include <linux/err.h> - -#include <asm/irq.h> - -#include <plat/usb.h> -#include <plat/board.h> - -#include "control.h" -#include "mux.h" - -#define INT_USB_IRQ_GEN		INT_24XX_USB_IRQ_GEN -#define INT_USB_IRQ_NISO	INT_24XX_USB_IRQ_NISO -#define INT_USB_IRQ_ISO		INT_24XX_USB_IRQ_ISO -#define INT_USB_IRQ_HGEN	INT_24XX_USB_IRQ_HGEN -#define INT_USB_IRQ_OTG		INT_24XX_USB_IRQ_OTG - -#if defined(CONFIG_ARCH_OMAP2) - -#ifdef	CONFIG_USB_GADGET_OMAP - -static struct resource udc_resources[] = { -	/* order is significant! */ -	{		/* registers */ -		.start		= UDC_BASE, -		.end		= UDC_BASE + 0xff, -		.flags		= IORESOURCE_MEM, -	}, {		/* general IRQ */ -		.start		= INT_USB_IRQ_GEN, -		.flags		= IORESOURCE_IRQ, -	}, {		/* PIO IRQ */ -		.start		= INT_USB_IRQ_NISO, -		.flags		= IORESOURCE_IRQ, -	}, {		/* SOF IRQ */ -		.start		= INT_USB_IRQ_ISO, -		.flags		= IORESOURCE_IRQ, -	}, -}; - -static u64 udc_dmamask = ~(u32)0; - -static struct platform_device udc_device = { -	.name		= "omap_udc", -	.id		= -1, -	.dev = { -		.dma_mask		= &udc_dmamask, -		.coherent_dma_mask	= 0xffffffff, -	}, -	.num_resources	= ARRAY_SIZE(udc_resources), -	.resource	= udc_resources, -}; - -static inline void udc_device_init(struct omap_usb_config *pdata) -{ -	pdata->udc_device = &udc_device; -} - -#else - -static inline void udc_device_init(struct omap_usb_config *pdata) -{ -} - -#endif - -#if	defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) - -/* The dmamask must be set for OHCI to work */ -static u64 ohci_dmamask = ~(u32)0; - -static struct resource ohci_resources[] = { -	{ -		.start	= OMAP_OHCI_BASE, -		.end	= OMAP_OHCI_BASE + 0xff, -		.flags	= IORESOURCE_MEM, -	}, -	{ -		.start	= INT_USB_IRQ_HGEN, -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device ohci_device = { -	.name			= "ohci", -	.id			= -1, -	.dev = { -		.dma_mask		= &ohci_dmamask, -		.coherent_dma_mask	= 0xffffffff, -	}, -	.num_resources	= ARRAY_SIZE(ohci_resources), -	.resource		= ohci_resources, -}; - -static inline void ohci_device_init(struct omap_usb_config *pdata) -{ -	pdata->ohci_device = &ohci_device; -} - -#else - -static inline void ohci_device_init(struct omap_usb_config *pdata) -{ -} - -#endif - -#if	defined(CONFIG_USB_OTG) && defined(CONFIG_ARCH_OMAP_OTG) - -static struct resource otg_resources[] = { -	/* order is significant! */ -	{ -		.start		= OTG_BASE, -		.end		= OTG_BASE + 0xff, -		.flags		= IORESOURCE_MEM, -	}, { -		.start		= INT_USB_IRQ_OTG, -		.flags		= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device otg_device = { -	.name		= "omap_otg", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(otg_resources), -	.resource	= otg_resources, -}; - -static inline void otg_device_init(struct omap_usb_config *pdata) -{ -	pdata->otg_device = &otg_device; -} - -#else - -static inline void otg_device_init(struct omap_usb_config *pdata) -{ -} - -#endif - -static void omap2_usb_devconf_clear(u8 port, u32 mask) -{ -	u32 r; - -	r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); -	r &= ~USBTXWRMODEI(port, mask); -	omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0); -} - -static void omap2_usb_devconf_set(u8 port, u32 mask) -{ -	u32 r; - -	r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); -	r |= USBTXWRMODEI(port, mask); -	omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0); -} - -static void omap2_usb2_disable_5pinbitll(void) -{ -	u32 r; - -	r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); -	r &= ~(USBTXWRMODEI(2, USB_BIDIR_TLL) | USBT2TLL5PI); -	omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0); -} - -static void omap2_usb2_enable_5pinunitll(void) -{ -	u32 r; - -	r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); -	r |= USBTXWRMODEI(2, USB_UNIDIR_TLL) | USBT2TLL5PI; -	omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0); -} - -static u32 __init omap2_usb0_init(unsigned nwires, unsigned is_device) -{ -	u32	syscon1 = 0; - -	omap2_usb_devconf_clear(0, USB_BIDIR_TLL); - -	if (nwires == 0) -		return 0; - -	if (is_device) -		omap_mux_init_signal("usb0_puen", 0); - -	omap_mux_init_signal("usb0_dat", 0); -	omap_mux_init_signal("usb0_txen", 0); -	omap_mux_init_signal("usb0_se0", 0); -	if (nwires != 3) -		omap_mux_init_signal("usb0_rcv", 0); - -	switch (nwires) { -	case 3: -		syscon1 = 2; -		omap2_usb_devconf_set(0, USB_BIDIR); -		break; -	case 4: -		syscon1 = 1; -		omap2_usb_devconf_set(0, USB_BIDIR); -		break; -	case 6: -		syscon1 = 3; -		omap_mux_init_signal("usb0_vp", 0); -		omap_mux_init_signal("usb0_vm", 0); -		omap2_usb_devconf_set(0, USB_UNIDIR); -		break; -	default: -		printk(KERN_ERR "illegal usb%d %d-wire transceiver\n", -			0, nwires); -	} - -	return syscon1 << 16; -} - -static u32 __init omap2_usb1_init(unsigned nwires) -{ -	u32	syscon1 = 0; - -	omap2_usb_devconf_clear(1, USB_BIDIR_TLL); - -	if (nwires == 0) -		return 0; - -	/* NOTE:  board-specific code must set up pin muxing for usb1, -	 * since each signal could come out on either of two balls. -	 */ - -	switch (nwires) { -	case 2: -		/* NOTE: board-specific code must override this setting if -		 * this TLL link is not using DP/DM -		 */ -		syscon1 = 1; -		omap2_usb_devconf_set(1, USB_BIDIR_TLL); -		break; -	case 3: -		syscon1 = 2; -		omap2_usb_devconf_set(1, USB_BIDIR); -		break; -	case 4: -		syscon1 = 1; -		omap2_usb_devconf_set(1, USB_BIDIR); -		break; -	case 6: -	default: -		printk(KERN_ERR "illegal usb%d %d-wire transceiver\n", -			1, nwires); -	} - -	return syscon1 << 20; -} - -static u32 __init omap2_usb2_init(unsigned nwires, unsigned alt_pingroup) -{ -	u32	syscon1 = 0; - -	omap2_usb2_disable_5pinbitll(); -	alt_pingroup = 0; - -	/* NOTE omap1 erratum: must leave USB2_UNI_R set if usb0 in use */ -	if (alt_pingroup || nwires == 0) -		return 0; - -	omap_mux_init_signal("usb2_dat", 0); -	omap_mux_init_signal("usb2_se0", 0); -	if (nwires > 2) -		omap_mux_init_signal("usb2_txen", 0); -	if (nwires > 3) -		omap_mux_init_signal("usb2_rcv", 0); - -	switch (nwires) { -	case 2: -		/* NOTE: board-specific code must override this setting if -		 * this TLL link is not using DP/DM -		 */ -		syscon1 = 1; -		omap2_usb_devconf_set(2, USB_BIDIR_TLL); -		break; -	case 3: -		syscon1 = 2; -		omap2_usb_devconf_set(2, USB_BIDIR); -		break; -	case 4: -		syscon1 = 1; -		omap2_usb_devconf_set(2, USB_BIDIR); -		break; -	case 5: -		/* NOTE: board-specific code must mux this setting depending -		 * on TLL link using DP/DM.  Something must also -		 * set up OTG_SYSCON2.HMC_TLL{ATTACH,SPEED} -		 * 2420: hdq_sio.usb2_tllse0 or vlynq_rx0.usb2_tllse0 -		 * 2430: hdq_sio.usb2_tllse0 or sdmmc2_dat0.usb2_tllse0 -		 */ - -		syscon1 = 3; -		omap2_usb2_enable_5pinunitll(); -		break; -	case 6: -	default: -		printk(KERN_ERR "illegal usb%d %d-wire transceiver\n", -			2, nwires); -	} - -	return syscon1 << 24; -} - -void __init omap2_usbfs_init(struct omap_usb_config *pdata) -{ -	struct clk *ick; - -	if (!cpu_is_omap24xx()) -		return; - -	ick = clk_get(NULL, "usb_l4_ick"); -	if (IS_ERR(ick)) -		return; - -	clk_enable(ick); -	pdata->usb0_init = omap2_usb0_init; -	pdata->usb1_init = omap2_usb1_init; -	pdata->usb2_init = omap2_usb2_init; -	udc_device_init(pdata); -	ohci_device_init(pdata); -	otg_device_init(pdata); -	omap_otg_init(pdata); -	clk_disable(ick); -	clk_put(ick); -} - -#endif diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h index 16a1b092cf3..0ac2caf1594 100644 --- a/arch/arm/mach-omap2/voltage.h +++ b/arch/arm/mach-omap2/voltage.h @@ -16,6 +16,8 @@  #include <linux/err.h> +#include <plat/voltage.h> +  #include "vc.h"  #include "vp.h" @@ -91,25 +93,6 @@ struct voltagedomain {  };  /** - * struct omap_volt_data - Omap voltage specific data. - * @voltage_nominal:	The possible voltage value in uV - * @sr_efuse_offs:	The offset of the efuse register(from system - *			control module base address) from where to read - *			the n-target value for the smartreflex module. - * @sr_errminlimit:	Error min limit value for smartreflex. This value - *			differs at differnet opp and thus is linked - *			with voltage. - * @vp_errorgain:	Error gain value for the voltage processor. This - *			field also differs according to the voltage/opp. - */ -struct omap_volt_data { -	u32	volt_nominal; -	u32	sr_efuse_offs; -	u8	sr_errminlimit; -	u8	vp_errgain; -}; - -/**   * struct omap_voltdm_pmic - PMIC specific data required by voltage driver.   * @slew_rate:	PMIC slew rate (in uv/us)   * @step_size:	PMIC voltage step size (in uv) @@ -156,6 +139,7 @@ int omap_voltage_late_init(void);  extern void omap2xxx_voltagedomains_init(void);  extern void omap3xxx_voltagedomains_init(void); +extern void am33xx_voltagedomains_init(void);  extern void omap44xx_voltagedomains_init(void);  struct voltagedomain *voltdm_lookup(const char *name); diff --git a/arch/arm/mach-omap2/voltagedomains33xx_data.c b/arch/arm/mach-omap2/voltagedomains33xx_data.c new file mode 100644 index 00000000000..965458dc0cb --- /dev/null +++ b/arch/arm/mach-omap2/voltagedomains33xx_data.c @@ -0,0 +1,43 @@ +/* + * AM33XX voltage domain data + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> +#include <linux/init.h> + +#include "voltage.h" + +static struct voltagedomain am33xx_voltdm_mpu = { +	.name		= "mpu", +}; + +static struct voltagedomain am33xx_voltdm_core = { +	.name		= "core", +}; + +static struct voltagedomain am33xx_voltdm_rtc = { +	.name		= "rtc", +}; + +static struct voltagedomain *voltagedomains_am33xx[] __initdata = { +	&am33xx_voltdm_mpu, +	&am33xx_voltdm_core, +	&am33xx_voltdm_rtc, +	NULL, +}; + +void __init am33xx_voltagedomains_init(void) +{ +	voltdm_init(voltagedomains_am33xx); +} diff --git a/arch/arm/mach-picoxcell/Makefile b/arch/arm/mach-picoxcell/Makefile index e5ec4a8d9bc..8e39f80fce1 100644 --- a/arch/arm/mach-picoxcell/Makefile +++ b/arch/arm/mach-picoxcell/Makefile @@ -1,2 +1 @@  obj-y	:= common.o -obj-y	+= time.o diff --git a/arch/arm/mach-picoxcell/common.c b/arch/arm/mach-picoxcell/common.c index a2e8ae8b582..8f9a0b47a7f 100644 --- a/arch/arm/mach-picoxcell/common.c +++ b/arch/arm/mach-picoxcell/common.c @@ -14,6 +14,7 @@  #include <linux/of_address.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h> +#include <linux/dw_apb_timer.h>  #include <asm/mach/arch.h>  #include <asm/hardware/vic.h> @@ -97,7 +98,7 @@ DT_MACHINE_START(PICOXCELL, "Picochip picoXcell")  	.nr_irqs	= NR_IRQS_LEGACY,  	.init_irq	= picoxcell_init_irq,  	.handle_irq	= vic_handle_irq, -	.timer		= &picoxcell_timer, +	.timer		= &dw_apb_timer,  	.init_machine	= picoxcell_init_machine,  	.dt_compat	= picoxcell_dt_match,  	.restart	= picoxcell_wdt_restart, diff --git a/arch/arm/mach-picoxcell/common.h b/arch/arm/mach-picoxcell/common.h index 83d55ab956a..a65cb02f84c 100644 --- a/arch/arm/mach-picoxcell/common.h +++ b/arch/arm/mach-picoxcell/common.h @@ -12,6 +12,6 @@  #include <asm/mach/time.h> -extern struct sys_timer picoxcell_timer; +extern struct sys_timer dw_apb_timer;  #endif /* __PICOXCELL_COMMON_H__ */ diff --git a/arch/arm/mach-picoxcell/time.c b/arch/arm/mach-picoxcell/time.c deleted file mode 100644 index 2ecba6743b8..00000000000 --- a/arch/arm/mach-picoxcell/time.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2011 Picochip Ltd., Jamie Iles - * - * 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. - * - * All enquiries to support@picochip.com - */ -#include <linux/dw_apb_timer.h> -#include <linux/of.h> -#include <linux/of_address.h> -#include <linux/of_irq.h> - -#include <asm/mach/time.h> -#include <asm/sched_clock.h> - -#include "common.h" - -static void timer_get_base_and_rate(struct device_node *np, -				    void __iomem **base, u32 *rate) -{ -	*base = of_iomap(np, 0); - -	if (!*base) -		panic("Unable to map regs for %s", np->name); - -	if (of_property_read_u32(np, "clock-freq", rate)) -		panic("No clock-freq property for %s", np->name); -} - -static void picoxcell_add_clockevent(struct device_node *event_timer) -{ -	void __iomem *iobase; -	struct dw_apb_clock_event_device *ced; -	u32 irq, rate; - -	irq = irq_of_parse_and_map(event_timer, 0); -	if (irq == NO_IRQ) -		panic("No IRQ for clock event timer"); - -	timer_get_base_and_rate(event_timer, &iobase, &rate); - -	ced = dw_apb_clockevent_init(0, event_timer->name, 300, iobase, irq, -				     rate); -	if (!ced) -		panic("Unable to initialise clockevent device"); - -	dw_apb_clockevent_register(ced); -} - -static void picoxcell_add_clocksource(struct device_node *source_timer) -{ -	void __iomem *iobase; -	struct dw_apb_clocksource *cs; -	u32 rate; - -	timer_get_base_and_rate(source_timer, &iobase, &rate); - -	cs = dw_apb_clocksource_init(300, source_timer->name, iobase, rate); -	if (!cs) -		panic("Unable to initialise clocksource device"); - -	dw_apb_clocksource_start(cs); -	dw_apb_clocksource_register(cs); -} - -static void __iomem *sched_io_base; - -static u32 picoxcell_read_sched_clock(void) -{ -	return __raw_readl(sched_io_base); -} - -static const struct of_device_id picoxcell_rtc_ids[] __initconst = { -	{ .compatible = "picochip,pc3x2-rtc" }, -	{ /* Sentinel */ }, -}; - -static void picoxcell_init_sched_clock(void) -{ -	struct device_node *sched_timer; -	u32 rate; - -	sched_timer = of_find_matching_node(NULL, picoxcell_rtc_ids); -	if (!sched_timer) -		panic("No RTC for sched clock to use"); - -	timer_get_base_and_rate(sched_timer, &sched_io_base, &rate); -	of_node_put(sched_timer); - -	setup_sched_clock(picoxcell_read_sched_clock, 32, rate); -} - -static const struct of_device_id picoxcell_timer_ids[] __initconst = { -	{ .compatible = "picochip,pc3x2-timer" }, -	{}, -}; - -static void __init picoxcell_timer_init(void) -{ -	struct device_node *event_timer, *source_timer; - -	event_timer = of_find_matching_node(NULL, picoxcell_timer_ids); -	if (!event_timer) -		panic("No timer for clockevent"); -	picoxcell_add_clockevent(event_timer); - -	source_timer = of_find_matching_node(event_timer, picoxcell_timer_ids); -	if (!source_timer) -		panic("No timer for clocksource"); -	picoxcell_add_clocksource(source_timer); - -	of_node_put(source_timer); - -	picoxcell_init_sched_clock(); -} - -struct sys_timer picoxcell_timer = { -	.init = picoxcell_timer_init, -}; diff --git a/arch/arm/mach-prima2/include/mach/gpio.h b/arch/arm/mach-prima2/include/mach/gpio.h new file mode 100644 index 00000000000..1904bb03876 --- /dev/null +++ b/arch/arm/mach-prima2/include/mach/gpio.h @@ -0,0 +1,13 @@ +#ifndef __MACH_GPIO_H +#define __MACH_GPIO_H + +/* Pull up/down values */ +enum sirfsoc_gpio_pull { +	SIRFSOC_GPIO_PULL_NONE, +	SIRFSOC_GPIO_PULL_UP, +	SIRFSOC_GPIO_PULL_DOWN, +}; + +void sirfsoc_gpio_set_pull(unsigned gpio, unsigned mode); + +#endif diff --git a/arch/arm/mach-prima2/include/mach/irqs.h b/arch/arm/mach-prima2/include/mach/irqs.h index bb354f952fd..f6014a07541 100644 --- a/arch/arm/mach-prima2/include/mach/irqs.h +++ b/arch/arm/mach-prima2/include/mach/irqs.h @@ -11,7 +11,7 @@  #define SIRFSOC_INTENAL_IRQ_START  0  #define SIRFSOC_INTENAL_IRQ_END    59 - +#define SIRFSOC_GPIO_IRQ_START     (SIRFSOC_INTENAL_IRQ_END + 1)  #define NR_IRQS	220  #endif diff --git a/arch/arm/mach-prima2/timer.c b/arch/arm/mach-prima2/timer.c index 0d024b1e916..f224107de7b 100644 --- a/arch/arm/mach-prima2/timer.c +++ b/arch/arm/mach-prima2/timer.c @@ -132,11 +132,11 @@ static void sirfsoc_clocksource_resume(struct clocksource *cs)  {  	int i; -	for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++) +	for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++)  		writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); -	writel_relaxed(sirfsoc_timer_reg_val[i - 2], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO); -	writel_relaxed(sirfsoc_timer_reg_val[i - 1], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI); +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO); +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI);  }  static struct clock_event_device sirfsoc_clockevent = { diff --git a/arch/arm/mach-pxa/eseries.h b/arch/arm/mach-pxa/eseries.h deleted file mode 100644 index b96949dd5ad..00000000000 --- a/arch/arm/mach-pxa/eseries.h +++ /dev/null @@ -1,14 +0,0 @@ -void __init eseries_fixup(struct tag *tags, char **cmdline, struct meminfo *mi); - -extern struct pxa2xx_udc_mach_info e7xx_udc_mach_info; -extern struct pxaficp_platform_data e7xx_ficp_platform_data; -extern int e7xx_irda_init(void); - -extern int eseries_tmio_enable(struct platform_device *dev); -extern int eseries_tmio_disable(struct platform_device *dev); -extern int eseries_tmio_suspend(struct platform_device *dev); -extern int eseries_tmio_resume(struct platform_device *dev); -extern void eseries_get_tmio_gpios(void); -extern struct resource eseries_tmio_resources[]; -extern struct platform_device e300_tc6387xb_device; - diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c index d3de84b0dcb..e6311988add 100644 --- a/arch/arm/mach-pxa/hx4700.c +++ b/arch/arm/mach-pxa/hx4700.c @@ -296,27 +296,11 @@ static struct asic3_led asic3_leds[ASIC3_NUM_LEDS] = {  static struct resource asic3_resources[] = {  	/* GPIO part */ -	[0] = { -		.start	= ASIC3_PHYS, -		.end	= ASIC3_PHYS + ASIC3_MAP_SIZE_16BIT - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= PXA_GPIO_TO_IRQ(GPIO12_HX4700_ASIC3_IRQ), -		.end	= PXA_GPIO_TO_IRQ(GPIO12_HX4700_ASIC3_IRQ), -		.flags	= IORESOURCE_IRQ, -	}, +	[0] = DEFINE_RES_MEM(ASIC3_PHYS, ASIC3_MAP_SIZE_16BIT), +	[1] = DEFINE_RES_IRQ(PXA_GPIO_TO_IRQ(GPIO12_HX4700_ASIC3_IRQ)),  	/* SD part */ -	[2] = { -		.start	= ASIC3_SD_PHYS, -		.end	= ASIC3_SD_PHYS + ASIC3_MAP_SIZE_16BIT - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[3] = { -		.start	= PXA_GPIO_TO_IRQ(GPIO66_HX4700_ASIC3_nSDIO_IRQ), -		.end	= PXA_GPIO_TO_IRQ(GPIO66_HX4700_ASIC3_nSDIO_IRQ), -		.flags	= IORESOURCE_IRQ, -	}, +	[2] = DEFINE_RES_MEM(ASIC3_SD_PHYS, ASIC3_MAP_SIZE_16BIT), +	[3] = DEFINE_RES_IRQ(PXA_GPIO_TO_IRQ(GPIO66_HX4700_ASIC3_nSDIO_IRQ)),  };  static struct asic3_platform_data asic3_platform_data = { @@ -343,11 +327,7 @@ static struct platform_device asic3 = {   */  static struct resource egpio_resources[] = { -	[0] = { -		.start = PXA_CS5_PHYS, -		.end   = PXA_CS5_PHYS + 0x4 - 1, -		.flags = IORESOURCE_MEM, -	}, +	[0] = DEFINE_RES_MEM(PXA_CS5_PHYS, 0x4),  };  static struct htc_egpio_chip egpio_chips[] = { @@ -537,11 +517,7 @@ static struct w100fb_mach_info w3220_info = {  };  static struct resource w3220_resources[] = { -	[0] = { -		.start	= ATI_W3220_PHYS, -		.end	= ATI_W3220_PHYS + 0x00ffffff, -		.flags	= IORESOURCE_MEM, -	}, +	[0] = DEFINE_RES_MEM(ATI_W3220_PHYS, SZ_16M),  };  static struct platform_device w3220 = { @@ -683,20 +659,12 @@ static struct pda_power_pdata power_supply_info = {  };  static struct resource power_supply_resources[] = { -	[0] = { -		.name  = "ac", -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | -		         IORESOURCE_IRQ_LOWEDGE, -		.start = PXA_GPIO_TO_IRQ(GPIOD9_nAC_IN), -		.end   = PXA_GPIO_TO_IRQ(GPIOD9_nAC_IN), -	}, -	[1] = { -		.name  = "usb", -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | -		         IORESOURCE_IRQ_LOWEDGE, -		.start = PXA_GPIO_TO_IRQ(GPIOD14_nUSBC_DETECT), -		.end   = PXA_GPIO_TO_IRQ(GPIOD14_nUSBC_DETECT), -	}, +	[0] = DEFINE_RES_NAMED(PXA_GPIO_TO_IRQ(GPIOD9_nAC_IN), 1, "ac", +		IORESOURCE_IRQ | +		IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE), +	[1] = DEFINE_RES_NAMED(PXA_GPIO_TO_IRQ(GPIOD14_nUSBC_DETECT), 1, "usb", +		IORESOURCE_IRQ | +		IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE),  };  static struct platform_device power_supply = { diff --git a/arch/arm/mach-pxa/include/mach/regs-ost.h b/arch/arm/mach-pxa/include/mach/regs-ost.h index a3e5f86ef67..628819995c5 100644 --- a/arch/arm/mach-pxa/include/mach/regs-ost.h +++ b/arch/arm/mach-pxa/include/mach/regs-ost.h @@ -7,17 +7,17 @@   * OS Timer & Match Registers   */ -#define OSMR0		__REG(0x40A00000)  /* */ -#define OSMR1		__REG(0x40A00004)  /* */ -#define OSMR2		__REG(0x40A00008)  /* */ -#define OSMR3		__REG(0x40A0000C)  /* */ -#define OSMR4		__REG(0x40A00080)  /* */ -#define OSCR		__REG(0x40A00010)  /* OS Timer Counter Register */ -#define OSCR4		__REG(0x40A00040)  /* OS Timer Counter Register */ -#define OMCR4		__REG(0x40A000C0)  /* */ -#define OSSR		__REG(0x40A00014)  /* OS Timer Status Register */ -#define OWER		__REG(0x40A00018)  /* OS Timer Watchdog Enable Register */ -#define OIER		__REG(0x40A0001C)  /* OS Timer Interrupt Enable Register */ +#define OSMR0		io_p2v(0x40A00000)  /* */ +#define OSMR1		io_p2v(0x40A00004)  /* */ +#define OSMR2		io_p2v(0x40A00008)  /* */ +#define OSMR3		io_p2v(0x40A0000C)  /* */ +#define OSMR4		io_p2v(0x40A00080)  /* */ +#define OSCR		io_p2v(0x40A00010)  /* OS Timer Counter Register */ +#define OSCR4		io_p2v(0x40A00040)  /* OS Timer Counter Register */ +#define OMCR4		io_p2v(0x40A000C0)  /* */ +#define OSSR		io_p2v(0x40A00014)  /* OS Timer Status Register */ +#define OWER		io_p2v(0x40A00018)  /* OS Timer Watchdog Enable Register */ +#define OIER		io_p2v(0x40A0001C)  /* OS Timer Interrupt Enable Register */  #define OSSR_M3		(1 << 3)	/* Match status channel 3 */  #define OSSR_M2		(1 << 2)	/* Match status channel 2 */ diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index 6bb3f47b1f1..0ca0db78790 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c @@ -456,7 +456,7 @@ static int lubbock_mci_init(struct device *dev,  	init_timer(&mmc_timer);  	mmc_timer.data = (unsigned long) data;  	return request_irq(LUBBOCK_SD_IRQ, lubbock_detect_int, -			IRQF_SAMPLE_RANDOM, "lubbock-sd-detect", data); +			   0, "lubbock-sd-detect", data);  }  static int lubbock_mci_get_ro(struct device *dev) diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index 2db697cd2b4..39561dcf65f 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c @@ -633,9 +633,8 @@ static struct platform_device bq24022 = {  static int magician_mci_init(struct device *dev,  				irq_handler_t detect_irq, void *data)  { -	return request_irq(IRQ_MAGICIAN_SD, detect_irq, -				IRQF_DISABLED | IRQF_SAMPLE_RANDOM, -				"mmc card detect", data); +	return request_irq(IRQ_MAGICIAN_SD, detect_irq, IRQF_DISABLED, +			   "mmc card detect", data);  }  static void magician_mci_exit(struct device *dev, void *data) diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index b4528899ef0..3fab583755d 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c @@ -77,9 +77,10 @@ static void do_gpio_reset(void)  static void do_hw_reset(void)  {  	/* Initialize the watchdog and let it fire */ -	OWER = OWER_WME; -	OSSR = OSSR_M3; -	OSMR3 = OSCR + 368640;	/* ... in 100 ms */ +	writel_relaxed(OWER_WME, OWER); +	writel_relaxed(OSSR_M3, OSSR); +	/* ... in 100 ms */ +	writel_relaxed(readl_relaxed(OSCR) + 368640, OSMR3);  }  void pxa_restart(char mode, const char *cmd) diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index 3d6c9bd90de..4bc47d63698 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c @@ -35,7 +35,7 @@  static u32 notrace pxa_read_sched_clock(void)  { -	return OSCR; +	return readl_relaxed(OSCR);  } @@ -47,8 +47,8 @@ pxa_ost0_interrupt(int irq, void *dev_id)  	struct clock_event_device *c = dev_id;  	/* Disarm the compare/match, signal the event. */ -	OIER &= ~OIER_E0; -	OSSR = OSSR_M0; +	writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); +	writel_relaxed(OSSR_M0, OSSR);  	c->event_handler(c);  	return IRQ_HANDLED; @@ -59,10 +59,10 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev)  {  	unsigned long next, oscr; -	OIER |= OIER_E0; -	next = OSCR + delta; -	OSMR0 = next; -	oscr = OSCR; +	writel_relaxed(readl_relaxed(OIER) | OIER_E0, OIER); +	next = readl_relaxed(OSCR) + delta; +	writel_relaxed(next, OSMR0); +	oscr = readl_relaxed(OSCR);  	return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0;  } @@ -72,15 +72,15 @@ pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev)  {  	switch (mode) {  	case CLOCK_EVT_MODE_ONESHOT: -		OIER &= ~OIER_E0; -		OSSR = OSSR_M0; +		writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); +		writel_relaxed(OSSR_M0, OSSR);  		break;  	case CLOCK_EVT_MODE_UNUSED:  	case CLOCK_EVT_MODE_SHUTDOWN:  		/* initializing, released, or preparing for suspend */ -		OIER &= ~OIER_E0; -		OSSR = OSSR_M0; +		writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); +		writel_relaxed(OSSR_M0, OSSR);  		break;  	case CLOCK_EVT_MODE_RESUME: @@ -108,8 +108,8 @@ static void __init pxa_timer_init(void)  {  	unsigned long clock_tick_rate = get_clock_tick_rate(); -	OIER = 0; -	OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; +	writel_relaxed(0, OIER); +	writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR);  	setup_sched_clock(pxa_read_sched_clock, 32, clock_tick_rate); @@ -122,7 +122,7 @@ static void __init pxa_timer_init(void)  	setup_irq(IRQ_OST0, &pxa_ost0_irq); -	clocksource_mmio_init(&OSCR, "oscr0", clock_tick_rate, 200, 32, +	clocksource_mmio_init(OSCR, "oscr0", clock_tick_rate, 200, 32,  		clocksource_mmio_readl_up);  	clockevents_register_device(&ckevt_pxa_osmr0);  } @@ -132,12 +132,12 @@ static unsigned long osmr[4], oier, oscr;  static void pxa_timer_suspend(void)  { -	osmr[0] = OSMR0; -	osmr[1] = OSMR1; -	osmr[2] = OSMR2; -	osmr[3] = OSMR3; -	oier = OIER; -	oscr = OSCR; +	osmr[0] = readl_relaxed(OSMR0); +	osmr[1] = readl_relaxed(OSMR1); +	osmr[2] = readl_relaxed(OSMR2); +	osmr[3] = readl_relaxed(OSMR3); +	oier = readl_relaxed(OIER); +	oscr = readl_relaxed(OSCR);  }  static void pxa_timer_resume(void) @@ -151,12 +151,12 @@ static void pxa_timer_resume(void)  	if (osmr[0] - oscr < MIN_OSCR_DELTA)  		osmr[0] += MIN_OSCR_DELTA; -	OSMR0 = osmr[0]; -	OSMR1 = osmr[1]; -	OSMR2 = osmr[2]; -	OSMR3 = osmr[3]; -	OIER = oier; -	OSCR = oscr; +	writel_relaxed(osmr[0], OSMR0); +	writel_relaxed(osmr[1], OSMR1); +	writel_relaxed(osmr[2], OSMR2); +	writel_relaxed(osmr[3], OSMR3); +	writel_relaxed(oier, OIER); +	writel_relaxed(oscr, OSCR);  }  #else  #define pxa_timer_suspend NULL diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c index 2b6ac00b2cd..166dd32cc1d 100644 --- a/arch/arm/mach-pxa/trizeps4.c +++ b/arch/arm/mach-pxa/trizeps4.c @@ -332,8 +332,8 @@ static int trizeps4_mci_init(struct device *dev, irq_handler_t mci_detect_int,  	int err;  	err = request_irq(TRIZEPS4_MMC_IRQ, mci_detect_int, -		IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_SAMPLE_RANDOM, -		"MMC card detect", data); +			  IRQF_DISABLED | IRQF_TRIGGER_RISING, +			  "MMC card detect", data);  	if (err) {  		printk(KERN_ERR "trizeps4_mci_init: MMC/SD: can't request"  						"MMC card detect IRQ\n"); diff --git a/arch/arm/mach-rpc/irq.c b/arch/arm/mach-rpc/irq.c index cf0e669eaf1..3e4fa849c64 100644 --- a/arch/arm/mach-rpc/irq.c +++ b/arch/arm/mach-rpc/irq.c @@ -163,6 +163,6 @@ void __init rpc_init_irq(void)  		}  	} -	init_FIQ(); +	init_FIQ(FIQ_START);  } diff --git a/arch/arm/mach-s3c24xx/clock-s3c2416.c b/arch/arm/mach-s3c24xx/clock-s3c2416.c index 8702ecfaab3..14a81c2317a 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2416.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2416.c @@ -144,7 +144,8 @@ static struct clk_lookup s3c2416_clk_lookup[] = {  	CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &hsmmc0_clk),  	CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &hsmmc_mux0.clk),  	CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &hsmmc_mux1.clk), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &hsspi_mux.clk), +	/* s3c2443-spi.0 is used on s3c2416 and s3c2450 as well */ +	CLKDEV_INIT("s3c2443-spi.0", "spi_busclk2", &hsspi_mux.clk),  };  void __init s3c2416_init_clocks(int xtal) diff --git a/arch/arm/mach-s3c24xx/clock-s3c2443.c b/arch/arm/mach-s3c24xx/clock-s3c2443.c index a4c5a520d99..7f689ce1be6 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2443.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2443.c @@ -181,7 +181,7 @@ static struct clk *clks[] __initdata = {  static struct clk_lookup s3c2443_clk_lookup[] = {  	CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_hsmmc), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_hsspi.clk), +	CLKDEV_INIT("s3c2443-spi.0", "spi_busclk2", &clk_hsspi.clk),  };  void __init s3c2443_init_clocks(int xtal) diff --git a/arch/arm/mach-s3c24xx/common-s3c2443.c b/arch/arm/mach-s3c24xx/common-s3c2443.c index aeeb2be283f..aeb4a24ff3e 100644 --- a/arch/arm/mach-s3c24xx/common-s3c2443.c +++ b/arch/arm/mach-s3c24xx/common-s3c2443.c @@ -559,7 +559,7 @@ static struct clk hsmmc1_clk = {  static struct clk hsspi_clk = {  	.name		= "spi", -	.devname	= "s3c64xx-spi.0", +	.devname	= "s3c2443-spi.0",  	.parent		= &clk_p,  	.enable		= s3c2443_clkcon_enable_p,  	.ctrlbit	= S3C2443_PCLKCON_HSSPI, @@ -633,7 +633,7 @@ static struct clk_lookup s3c2443_clk_lookup[] = {  	CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p),  	CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_esys_uart.clk),  	CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &hsmmc1_clk), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk0", &hsspi_clk), +	CLKDEV_INIT("s3c2443-spi.0", "spi_busclk0", &hsspi_clk),  };  void __init s3c2443_common_init_clocks(int xtal, pll_fn get_mpll, diff --git a/arch/arm/mach-s3c24xx/common-smdk.c b/arch/arm/mach-s3c24xx/common-smdk.c index 084604be6ad..87e75a250d5 100644 --- a/arch/arm/mach-s3c24xx/common-smdk.c +++ b/arch/arm/mach-s3c24xx/common-smdk.c @@ -182,19 +182,21 @@ static struct platform_device __initdata *smdk_devs[] = {  	&smdk_led7,  }; +static const struct gpio smdk_led_gpios[] = { +	{ S3C2410_GPF(4), GPIOF_OUT_INIT_HIGH, NULL }, +	{ S3C2410_GPF(5), GPIOF_OUT_INIT_HIGH, NULL }, +	{ S3C2410_GPF(6), GPIOF_OUT_INIT_HIGH, NULL }, +	{ S3C2410_GPF(7), GPIOF_OUT_INIT_HIGH, NULL }, +}; +  void __init smdk_machine_init(void)  {  	/* Configure the LEDs (even if we have no LED support)*/ -	s3c_gpio_cfgpin(S3C2410_GPF(4), S3C2410_GPIO_OUTPUT); -	s3c_gpio_cfgpin(S3C2410_GPF(5), S3C2410_GPIO_OUTPUT); -	s3c_gpio_cfgpin(S3C2410_GPF(6), S3C2410_GPIO_OUTPUT); -	s3c_gpio_cfgpin(S3C2410_GPF(7), S3C2410_GPIO_OUTPUT); - -	s3c2410_gpio_setpin(S3C2410_GPF(4), 1); -	s3c2410_gpio_setpin(S3C2410_GPF(5), 1); -	s3c2410_gpio_setpin(S3C2410_GPF(6), 1); -	s3c2410_gpio_setpin(S3C2410_GPF(7), 1); +	int ret = gpio_request_array(smdk_led_gpios, +				     ARRAY_SIZE(smdk_led_gpios)); +	if (!WARN_ON(ret < 0)) +		gpio_free_array(smdk_led_gpios, ARRAY_SIZE(smdk_led_gpios));  	if (machine_is_smdk2443())  		smdk_nand_info.twrph0 = 50; diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c index 56cdd34cce4..0c9e9a785ef 100644 --- a/arch/arm/mach-s3c24xx/common.c +++ b/arch/arm/mach-s3c24xx/common.c @@ -41,7 +41,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/regs-clock.h>  #include <mach/regs-gpio.h>  #include <plat/regs-serial.h> diff --git a/arch/arm/mach-s3c24xx/include/mach/bast-pmu.h b/arch/arm/mach-s3c24xx/include/mach/bast-pmu.h deleted file mode 100644 index 4c38b39b741..00000000000 --- a/arch/arm/mach-s3c24xx/include/mach/bast-pmu.h +++ /dev/null @@ -1,40 +0,0 @@ -/* arch/arm/mach-s3c2410/include/mach/bast-pmu.h - * - * Copyright (c) 2003-2004 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk> - *	Vincent Sanders <vince@simtec.co.uk> - * - * Machine BAST - Power Management chip - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#ifndef __ASM_ARCH_BASTPMU_H -#define __ASM_ARCH_BASTPMU_H "08_OCT_2004" - -#define BASTPMU_REG_IDENT	(0x00) -#define BASTPMU_REG_VERSION	(0x01) -#define BASTPMU_REG_DDCCTRL	(0x02) -#define BASTPMU_REG_POWER	(0x03) -#define BASTPMU_REG_RESET	(0x04) -#define BASTPMU_REG_GWO		(0x05) -#define BASTPMU_REG_WOL		(0x06) -#define BASTPMU_REG_WOR		(0x07) -#define BASTPMU_REG_UID		(0x09) - -#define BASTPMU_EEPROM		(0xC0) - -#define BASTPMU_EEP_UID		(BASTPMU_EEPROM + 0) -#define BASTPMU_EEP_WOL		(BASTPMU_EEPROM + 8) -#define BASTPMU_EEP_WOR		(BASTPMU_EEPROM + 9) - -#define BASTPMU_IDENT_0		0x53 -#define BASTPMU_IDENT_1		0x42 -#define BASTPMU_IDENT_2		0x50 -#define BASTPMU_IDENT_3		0x4d - -#define BASTPMU_RESET_GUARD	(0x55) - -#endif /* __ASM_ARCH_BASTPMU_H */ diff --git a/arch/arm/mach-s3c24xx/include/mach/gpio-nrs.h b/arch/arm/mach-s3c24xx/include/mach/gpio-nrs.h index 019ea86057f..3890a05948f 100644 --- a/arch/arm/mach-s3c24xx/include/mach/gpio-nrs.h +++ b/arch/arm/mach-s3c24xx/include/mach/gpio-nrs.h @@ -93,26 +93,5 @@ enum s3c_gpio_number {  #define S3C2410_GPL(_nr)	(S3C2410_GPIO_L_START + (_nr))  #define S3C2410_GPM(_nr)	(S3C2410_GPIO_M_START + (_nr)) -/* compatibility until drivers can be modified */ - -#define S3C2410_GPA0	S3C2410_GPA(0) -#define S3C2410_GPA1	S3C2410_GPA(1) -#define S3C2410_GPA3	S3C2410_GPA(3) -#define S3C2410_GPA7	S3C2410_GPA(7) - -#define S3C2410_GPE0	S3C2410_GPE(0) -#define S3C2410_GPE1	S3C2410_GPE(1) -#define S3C2410_GPE2	S3C2410_GPE(2) -#define S3C2410_GPE3	S3C2410_GPE(3) -#define S3C2410_GPE4	S3C2410_GPE(4) -#define S3C2410_GPE5	S3C2410_GPE(5) -#define S3C2410_GPE6	S3C2410_GPE(6) -#define S3C2410_GPE7	S3C2410_GPE(7) -#define S3C2410_GPE8	S3C2410_GPE(8) -#define S3C2410_GPE9	S3C2410_GPE(9) -#define S3C2410_GPE10	S3C2410_GPE(10) - -#define S3C2410_GPH10	S3C2410_GPH(10) -  #endif /* __MACH_GPIONRS_H */ diff --git a/arch/arm/mach-s3c24xx/include/mach/gta02.h b/arch/arm/mach-s3c24xx/include/mach/gta02.h index 3a56a229cac..21739348215 100644 --- a/arch/arm/mach-s3c24xx/include/mach/gta02.h +++ b/arch/arm/mach-s3c24xx/include/mach/gta02.h @@ -3,82 +3,13 @@  #include <mach/regs-gpio.h> -/* Different hardware revisions, passed in ATAG_REVISION by u-boot */ -#define GTA02v1_SYSTEM_REV	0x00000310 -#define GTA02v2_SYSTEM_REV	0x00000320 -#define GTA02v3_SYSTEM_REV	0x00000330 -#define GTA02v4_SYSTEM_REV	0x00000340 -#define GTA02v5_SYSTEM_REV	0x00000350 -/* since A7 is basically same as A6, we use A6 PCB ID */ -#define GTA02v6_SYSTEM_REV	0x00000360 - -#define GTA02_GPIO_n3DL_GSM	S3C2410_GPA(13)	/* v1 + v2 + v3 only */ - -#define GTA02_GPIO_PWR_LED1	S3C2410_GPB(0) -#define GTA02_GPIO_PWR_LED2	S3C2410_GPB(1)  #define GTA02_GPIO_AUX_LED	S3C2410_GPB(2) -#define GTA02_GPIO_VIBRATOR_ON	S3C2410_GPB(3) -#define GTA02_GPIO_MODEM_RST	S3C2410_GPB(5) -#define GTA02_GPIO_BT_EN	S3C2410_GPB(6) -#define GTA02_GPIO_MODEM_ON	S3C2410_GPB(7) -#define GTA02_GPIO_EXTINT8	S3C2410_GPB(8)  #define GTA02_GPIO_USB_PULLUP	S3C2410_GPB(9) - -#define GTA02_GPIO_PIO5		S3C2410_GPC(5)	/* v3 + v4 only */ - -#define GTA02v3_GPIO_nG1_CS	S3C2410_GPD(12)	/* v3 + v4 only */ -#define GTA02v3_GPIO_nG2_CS	S3C2410_GPD(13)	/* v3 + v4 only */ -#define GTA02v5_GPIO_HDQ	S3C2410_GPD(14)   /* v5 + */ - -#define GTA02_GPIO_nG1_INT	S3C2410_GPF(0) -#define GTA02_GPIO_IO1		S3C2410_GPF(1) -#define GTA02_GPIO_PIO_2	S3C2410_GPF(2)	/* v2 + v3 + v4 only */ -#define GTA02_GPIO_JACK_INSERT	S3C2410_GPF(4) -#define GTA02_GPIO_WLAN_GPIO1	S3C2410_GPF(5)	/* v2 + v3 + v4 only */  #define GTA02_GPIO_AUX_KEY	S3C2410_GPF(6)  #define GTA02_GPIO_HOLD_KEY	S3C2410_GPF(7) - -#define GTA02_GPIO_3D_IRQ	S3C2410_GPG(4) -#define GTA02v2_GPIO_nG2_INT	S3C2410_GPG(8)	/* v2 + v3 + v4 only */ -#define GTA02v3_GPIO_nUSB_OC	S3C2410_GPG(9)	/* v3 + v4 only */ -#define GTA02v3_GPIO_nUSB_FLT	S3C2410_GPG(10)	/* v3 + v4 only */ -#define GTA02v3_GPIO_nGSM_OC	S3C2410_GPG(11)	/* v3 + v4 only */ -  #define GTA02_GPIO_AMP_SHUT	S3C2410_GPJ(1)	/* v2 + v3 + v4 only */ -#define GTA02v1_GPIO_WLAN_GPIO10	S3C2410_GPJ(2)  #define GTA02_GPIO_HP_IN	S3C2410_GPJ(2)	/* v2 + v3 + v4 only */ -#define GTA02_GPIO_INT0		S3C2410_GPJ(3)	/* v2 + v3 + v4 only */ -#define GTA02_GPIO_nGSM_EN	S3C2410_GPJ(4) -#define GTA02_GPIO_3D_RESET	S3C2410_GPJ(5) -#define GTA02_GPIO_nDL_GSM	S3C2410_GPJ(6)	/* v4 + v5 only */ -#define GTA02_GPIO_WLAN_GPIO0	S3C2410_GPJ(7) -#define GTA02v1_GPIO_BAT_ID	S3C2410_GPJ(8) -#define GTA02_GPIO_KEEPACT	S3C2410_GPJ(8) -#define GTA02v1_GPIO_HP_IN	S3C2410_GPJ(10) -#define GTA02_CHIP_PWD		S3C2410_GPJ(11)	/* v2 + v3 + v4 only */ -#define GTA02_GPIO_nWLAN_RESET	S3C2410_GPJ(12)	/* v2 + v3 + v4 only */ -#define GTA02_IRQ_GSENSOR_1	IRQ_EINT0 -#define GTA02_IRQ_MODEM		IRQ_EINT1 -#define GTA02_IRQ_PIO_2		IRQ_EINT2	/* v2 + v3 + v4 only */ -#define GTA02_IRQ_nJACK_INSERT	IRQ_EINT4 -#define GTA02_IRQ_WLAN_GPIO1	IRQ_EINT5 -#define GTA02_IRQ_AUX		IRQ_EINT6 -#define GTA02_IRQ_nHOLD		IRQ_EINT7  #define GTA02_IRQ_PCF50633	IRQ_EINT9 -#define GTA02_IRQ_3D		IRQ_EINT12 -#define GTA02_IRQ_GSENSOR_2	IRQ_EINT16	/* v2 + v3 + v4 only */ -#define GTA02v3_IRQ_nUSB_OC	IRQ_EINT17	/* v3 + v4 only */ -#define GTA02v3_IRQ_nUSB_FLT	IRQ_EINT18	/* v3 + v4 only */ -#define GTA02v3_IRQ_nGSM_OC	IRQ_EINT19	/* v3 + v4 only */ - -/* returns 00 000 on GTA02 A5 and earlier, A6 returns 01 001 */ -#define GTA02_PCB_ID1_0		S3C2410_GPC(13) -#define GTA02_PCB_ID1_1		S3C2410_GPC(15) -#define GTA02_PCB_ID1_2		S3C2410_GPD(0) -#define GTA02_PCB_ID2_0		S3C2410_GPD(3) -#define GTA02_PCB_ID2_1		S3C2410_GPD(4) - -int gta02_get_pcb_revision(void);  #endif /* _GTA02_H */ diff --git a/arch/arm/mach-s3c24xx/include/mach/regs-gpio.h b/arch/arm/mach-s3c24xx/include/mach/regs-gpio.h index cac1ad6b582..a11a638bd59 100644 --- a/arch/arm/mach-s3c24xx/include/mach/regs-gpio.h +++ b/arch/arm/mach-s3c24xx/include/mach/regs-gpio.h @@ -302,7 +302,7 @@  /* S3C2410:   * Port G consists of 8 GPIO/IRQ/Special function   * - * GPGCON has 2 bits for each of the input pins on port F + * GPGCON has 2 bits for each of the input pins on port G   *   00 = 0 input, 1 output, 2 interrupt (EINT0..7), 3 special func   *   * pull up works like all other ports. @@ -366,7 +366,7 @@  /* Port H consists of11 GPIO/serial/Misc pins   * - * GPGCON has 2 bits for each of the input pins on port F + * GPHCON has 2 bits for each of the input pins on port H   *   00 = 0 input, 1 output, 2 interrupt (EINT0..7), 3 special func   *   * pull up works like all other ports. @@ -427,6 +427,19 @@   * for the 2412/2413 from the 2410/2440/2442  */ +/* + * Port J consists of 13 GPIO/Camera pins. GPJCON has 2 bits + * for each of the pins on port J. + *   00 - input, 01 output, 10 - camera + * + * Pull up works like all other ports. + */ + +#define S3C2413_GPJCON	   S3C2410_GPIOREG(0x80) +#define S3C2413_GPJDAT	   S3C2410_GPIOREG(0x84) +#define S3C2413_GPJUP	   S3C2410_GPIOREG(0x88) +#define S3C2413_GPJSLPCON  S3C2410_GPIOREG(0x8C) +  /* S3C2443 and above */  #define S3C2440_GPJCON	   S3C2410_GPIOREG(0xD0)  #define S3C2440_GPJDAT	   S3C2410_GPIOREG(0xD4) diff --git a/arch/arm/mach-s3c24xx/include/mach/regs-gpioj.h b/arch/arm/mach-s3c24xx/include/mach/regs-gpioj.h deleted file mode 100644 index 19575e06111..00000000000 --- a/arch/arm/mach-s3c24xx/include/mach/regs-gpioj.h +++ /dev/null @@ -1,70 +0,0 @@ -/* arch/arm/mach-s3c2410/include/mach/regs-gpioj.h - * - * Copyright (c) 2004 Simtec Electronics <linux@simtec.co.uk> - *		      http://www.simtec.co.uk/products/SWLINUX/ - * - * 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. - * - * S3C2440 GPIO J register definitions -*/ - - -#ifndef __ASM_ARCH_REGS_GPIOJ_H -#define __ASM_ARCH_REGS_GPIOJ_H "gpioj" - -/* Port J consists of 13 GPIO/Camera pins - * - * GPJCON has 2 bits for each of the input pins on port F - *   00 = 0 input, 1 output, 2 Camera - * - * pull up works like all other ports. -*/ - -#define S3C2413_GPJCON		S3C2410_GPIOREG(0x80) -#define S3C2413_GPJDAT		S3C2410_GPIOREG(0x84) -#define S3C2413_GPJUP		S3C2410_GPIOREG(0x88) -#define S3C2413_GPJSLPCON	S3C2410_GPIOREG(0x8C) - -#define S3C2440_GPJ0_OUTP       (0x01 << 0) -#define S3C2440_GPJ0_CAMDATA0   (0x02 << 0) - -#define S3C2440_GPJ1_OUTP       (0x01 << 2) -#define S3C2440_GPJ1_CAMDATA1   (0x02 << 2) - -#define S3C2440_GPJ2_OUTP       (0x01 << 4) -#define S3C2440_GPJ2_CAMDATA2   (0x02 << 4) - -#define S3C2440_GPJ3_OUTP       (0x01 << 6) -#define S3C2440_GPJ3_CAMDATA3   (0x02 << 6) - -#define S3C2440_GPJ4_OUTP       (0x01 << 8) -#define S3C2440_GPJ4_CAMDATA4   (0x02 << 8) - -#define S3C2440_GPJ5_OUTP       (0x01 << 10) -#define S3C2440_GPJ5_CAMDATA5   (0x02 << 10) - -#define S3C2440_GPJ6_OUTP       (0x01 << 12) -#define S3C2440_GPJ6_CAMDATA6   (0x02 << 12) - -#define S3C2440_GPJ7_OUTP       (0x01 << 14) -#define S3C2440_GPJ7_CAMDATA7   (0x02 << 14) - -#define S3C2440_GPJ8_OUTP       (0x01 << 16) -#define S3C2440_GPJ8_CAMPCLK    (0x02 << 16) - -#define S3C2440_GPJ9_OUTP       (0x01 << 18) -#define S3C2440_GPJ9_CAMVSYNC   (0x02 << 18) - -#define S3C2440_GPJ10_OUTP      (0x01 << 20) -#define S3C2440_GPJ10_CAMHREF   (0x02 << 20) - -#define S3C2440_GPJ11_OUTP      (0x01 << 22) -#define S3C2440_GPJ11_CAMCLKOUT (0x02 << 22) - -#define S3C2440_GPJ12_OUTP      (0x01 << 24) -#define S3C2440_GPJ12_CAMRESET  (0x02 << 24) - -#endif	/* __ASM_ARCH_REGS_GPIOJ_H */ - diff --git a/arch/arm/mach-s3c24xx/mach-gta02.c b/arch/arm/mach-s3c24xx/mach-gta02.c index 0f29f64a3ee..92e1f93a6bc 100644 --- a/arch/arm/mach-s3c24xx/mach-gta02.c +++ b/arch/arm/mach-s3c24xx/mach-gta02.c @@ -71,7 +71,6 @@  #include <mach/regs-irq.h>  #include <mach/regs-gpio.h> -#include <mach/regs-gpioj.h>  #include <mach/fb.h>  #include <plat/usb-control.h> diff --git a/arch/arm/mach-s3c24xx/mach-mini2440.c b/arch/arm/mach-s3c24xx/mach-mini2440.c index f092b188ab7..bd6d2525deb 100644 --- a/arch/arm/mach-s3c24xx/mach-mini2440.c +++ b/arch/arm/mach-s3c24xx/mach-mini2440.c @@ -634,8 +634,8 @@ static void __init mini2440_init(void)  	s3c_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND);  	/* Turn the backlight early on */ -	WARN_ON(gpio_request(S3C2410_GPG(4), "backlight")); -	gpio_direction_output(S3C2410_GPG(4), 1); +	WARN_ON(gpio_request_one(S3C2410_GPG(4), GPIOF_OUT_INIT_HIGH, NULL)); +	gpio_free(S3C2410_GPG(4));  	/* remove pullup on optional PWM backlight -- unused on 3.5 and 7"s */  	s3c_gpio_setpull(S3C2410_GPB(1), S3C_GPIO_PULL_UP); diff --git a/arch/arm/mach-s3c24xx/mach-qt2410.c b/arch/arm/mach-s3c24xx/mach-qt2410.c index b868dddcb83..678bbca2b5e 100644 --- a/arch/arm/mach-s3c24xx/mach-qt2410.c +++ b/arch/arm/mach-s3c24xx/mach-qt2410.c @@ -47,7 +47,6 @@  #include <asm/irq.h>  #include <asm/mach-types.h> -#include <mach/regs-gpio.h>  #include <mach/leds-gpio.h>  #include <mach/regs-lcd.h>  #include <plat/regs-serial.h> @@ -325,8 +324,9 @@ static void __init qt2410_machine_init(void)  	}  	s3c24xx_fb_set_platdata(&qt2410_fb_info); -	s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPIO_OUTPUT); -	s3c2410_gpio_setpin(S3C2410_GPB(0), 1); +	/* set initial state of the LED GPIO */ +	WARN_ON(gpio_request_one(S3C2410_GPB(0), GPIOF_OUT_INIT_HIGH, NULL)); +	gpio_free(S3C2410_GPB(0));  	s3c24xx_udc_set_platdata(&qt2410_udc_cfg);  	s3c_i2c0_set_platdata(NULL); diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c index a6762aae472..7ee73f27f20 100644 --- a/arch/arm/mach-s3c24xx/mach-rx1950.c +++ b/arch/arm/mach-s3c24xx/mach-rx1950.c @@ -42,7 +42,6 @@  #include <asm/mach-types.h>  #include <mach/regs-gpio.h> -#include <mach/regs-gpioj.h>  #include <mach/regs-lcd.h>  #include <mach/h1940.h>  #include <mach/fb.h> diff --git a/arch/arm/mach-s3c24xx/pm-s3c2410.c b/arch/arm/mach-s3c24xx/pm-s3c2410.c index 03f706dd600..949ae05e07c 100644 --- a/arch/arm/mach-s3c24xx/pm-s3c2410.c +++ b/arch/arm/mach-s3c24xx/pm-s3c2410.c @@ -77,8 +77,10 @@ static void s3c2410_pm_prepare(void)  		__raw_writel(calc, phys_to_virt(H1940_SUSPEND_CHECKSUM));  	} -	if ( machine_is_aml_m5900() ) -		s3c2410_gpio_setpin(S3C2410_GPF(2), 1); +	if (machine_is_aml_m5900()) { +		gpio_request_one(S3C2410_GPF(2), GPIOF_OUT_INIT_HIGH, NULL); +		gpio_free(S3C2410_GPF(2)); +	}  	if (machine_is_rx1950()) {  		/* According to S3C2442 user's manual, page 7-17, @@ -103,8 +105,10 @@ static void s3c2410_pm_resume(void)  	tmp &= S3C2410_GSTATUS2_OFFRESET;  	__raw_writel(tmp, S3C2410_GSTATUS2); -	if ( machine_is_aml_m5900() ) -		s3c2410_gpio_setpin(S3C2410_GPF(2), 0); +	if (machine_is_aml_m5900()) { +		gpio_request_one(S3C2410_GPF(2), GPIOF_OUT_INIT_LOW, NULL); +		gpio_free(S3C2410_GPF(2)); +	}  }  struct syscore_ops s3c2410_pm_syscore_ops = { diff --git a/arch/arm/mach-s3c24xx/pm-s3c2412.c b/arch/arm/mach-s3c24xx/pm-s3c2412.c index d04588506ec..c60f67a75af 100644 --- a/arch/arm/mach-s3c24xx/pm-s3c2412.c +++ b/arch/arm/mach-s3c24xx/pm-s3c2412.c @@ -26,7 +26,6 @@  #include <asm/irq.h>  #include <mach/regs-power.h> -#include <mach/regs-gpioj.h>  #include <mach/regs-gpio.h>  #include <mach/regs-dsc.h> diff --git a/arch/arm/mach-s3c24xx/s3c2412.c b/arch/arm/mach-s3c24xx/s3c2412.c index d4bc7f960bb..6c5f4031ff0 100644 --- a/arch/arm/mach-s3c24xx/s3c2412.c +++ b/arch/arm/mach-s3c24xx/s3c2412.c @@ -39,7 +39,6 @@  #include <plat/regs-serial.h>  #include <mach/regs-power.h>  #include <mach/regs-gpio.h> -#include <mach/regs-gpioj.h>  #include <mach/regs-dsc.h>  #include <plat/regs-spi.h>  #include <mach/regs-s3c2412.h> diff --git a/arch/arm/mach-s3c24xx/s3c244x.c b/arch/arm/mach-s3c24xx/s3c244x.c index 6f74118f60c..b0b60a1154d 100644 --- a/arch/arm/mach-s3c24xx/s3c244x.c +++ b/arch/arm/mach-s3c24xx/s3c244x.c @@ -36,7 +36,6 @@  #include <mach/regs-clock.h>  #include <plat/regs-serial.h>  #include <mach/regs-gpio.h> -#include <mach/regs-gpioj.h>  #include <mach/regs-dsc.h>  #include <plat/s3c2410.h> diff --git a/arch/arm/mach-s3c24xx/setup-spi.c b/arch/arm/mach-s3c24xx/setup-spi.c index 5712c85f39b..3d47e023ce9 100644 --- a/arch/arm/mach-s3c24xx/setup-spi.c +++ b/arch/arm/mach-s3c24xx/setup-spi.c @@ -13,20 +13,12 @@  #include <linux/platform_device.h>  #include <plat/gpio-cfg.h> -#include <plat/s3c64xx-spi.h>  #include <mach/hardware.h>  #include <mach/regs-gpio.h>  #ifdef CONFIG_S3C64XX_DEV_SPI0 -struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 13, -	.tx_st_done	= 21, -	.high_speed	= 1, -}; - -int s3c64xx_spi0_cfg_gpio(struct platform_device *pdev) +int s3c64xx_spi0_cfg_gpio(void)  {  	/* enable hsspi bit in misccr */  	s3c2410_modify_misccr(S3C2416_MISCCR_HSSPI_EN2, 1); diff --git a/arch/arm/mach-s3c24xx/setup-ts.c b/arch/arm/mach-s3c24xx/setup-ts.c index ed263866367..4e11affce3a 100644 --- a/arch/arm/mach-s3c24xx/setup-ts.c +++ b/arch/arm/mach-s3c24xx/setup-ts.c @@ -16,7 +16,6 @@  struct platform_device; /* don't need the contents */  #include <mach/hardware.h> -#include <mach/regs-gpio.h>  /**   * s3c24xx_ts_cfg_gpio - configure gpio for s3c2410 systems @@ -27,8 +26,5 @@ struct platform_device; /* don't need the contents */   */  void s3c24xx_ts_cfg_gpio(struct platform_device *dev)  { -	s3c2410_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON); -	s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON); -	s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON); -	s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON); +	s3c_gpio_cfgpin_range(S3C2410_GPG(12), 4, S3C_GPIO_SFN(3));  } diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index 52f079a691c..28041e83dc8 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c @@ -178,13 +178,13 @@ static struct clk init_clocks_off[] = {  		.ctrlbit	= S3C_CLKCON_PCLK_KEYPAD,  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s3c6410-spi.0",  		.parent		= &clk_p,  		.enable		= s3c64xx_pclk_ctrl,  		.ctrlbit	= S3C_CLKCON_PCLK_SPI0,  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s3c6410-spi.1",  		.parent		= &clk_p,  		.enable		= s3c64xx_pclk_ctrl,  		.ctrlbit	= S3C_CLKCON_PCLK_SPI1, @@ -331,7 +331,7 @@ static struct clk init_clocks_off[] = {  static struct clk clk_48m_spi0 = {  	.name		= "spi_48m", -	.devname	= "s3c64xx-spi.0", +	.devname	= "s3c6410-spi.0",  	.parent		= &clk_48m,  	.enable		= s3c64xx_sclk_ctrl,  	.ctrlbit	= S3C_CLKCON_SCLK_SPI0_48, @@ -339,7 +339,7 @@ static struct clk clk_48m_spi0 = {  static struct clk clk_48m_spi1 = {  	.name		= "spi_48m", -	.devname	= "s3c64xx-spi.1", +	.devname	= "s3c6410-spi.1",  	.parent		= &clk_48m,  	.enable		= s3c64xx_sclk_ctrl,  	.ctrlbit	= S3C_CLKCON_SCLK_SPI1_48, @@ -802,7 +802,7 @@ static struct clksrc_clk clk_sclk_mmc2 = {  static struct clksrc_clk clk_sclk_spi0 = {  	.clk	= {  		.name		= "spi-bus", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s3c6410-spi.0",  		.ctrlbit	= S3C_CLKCON_SCLK_SPI0,  		.enable		= s3c64xx_sclk_ctrl,  	}, @@ -814,7 +814,7 @@ static struct clksrc_clk clk_sclk_spi0 = {  static struct clksrc_clk clk_sclk_spi1 = {  	.clk	= {  		.name		= "spi-bus", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s3c6410-spi.1",  		.ctrlbit	= S3C_CLKCON_SCLK_SPI1,  		.enable		= s3c64xx_sclk_ctrl,  	}, @@ -858,10 +858,10 @@ static struct clk_lookup s3c64xx_clk_lookup[] = {  	CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),  	CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),  	CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_48m_spi0), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk2", &clk_48m_spi1), +	CLKDEV_INIT("s3c6410-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), +	CLKDEV_INIT("s3c6410-spi.0", "spi_busclk2", &clk_48m_spi0), +	CLKDEV_INIT("s3c6410-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), +	CLKDEV_INIT("s3c6410-spi.1", "spi_busclk2", &clk_48m_spi1),  };  #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1) diff --git a/arch/arm/mach-s3c64xx/include/mach/crag6410.h b/arch/arm/mach-s3c64xx/include/mach/crag6410.h index 4cb2f951f1e..4c3c9994fc2 100644 --- a/arch/arm/mach-s3c64xx/include/mach/crag6410.h +++ b/arch/arm/mach-s3c64xx/include/mach/crag6410.h @@ -13,9 +13,7 @@  #include <linux/gpio.h> -#define BANFF_PMIC_IRQ_BASE		IRQ_BOARD_START -#define GLENFARCLAS_PMIC_IRQ_BASE	(IRQ_BOARD_START + 64) -#define CODEC_IRQ_BASE			(IRQ_BOARD_START + 128) +#define GLENFARCLAS_PMIC_IRQ_BASE	IRQ_BOARD_START  #define PCA935X_GPIO_BASE		GPIO_BOARD_START  #define CODEC_GPIO_BASE			(GPIO_BOARD_START + 8) diff --git a/arch/arm/mach-s3c64xx/include/mach/dma.h b/arch/arm/mach-s3c64xx/include/mach/dma.h index fe1a98cf0e4..57b1ff4b2d7 100644 --- a/arch/arm/mach-s3c64xx/include/mach/dma.h +++ b/arch/arm/mach-s3c64xx/include/mach/dma.h @@ -21,6 +21,7 @@   */  enum dma_ch {  	/* DMA0/SDMA0 */ +	DMACH_DT_PROP = -1, /* not yet supported, do not use */  	DMACH_UART0 = 0,  	DMACH_UART0_SRC2,  	DMACH_UART1, diff --git a/arch/arm/mach-s3c64xx/include/mach/pm-core.h b/arch/arm/mach-s3c64xx/include/mach/pm-core.h index fcf3dcabb69..c0537f40a3d 100644 --- a/arch/arm/mach-s3c64xx/include/mach/pm-core.h +++ b/arch/arm/mach-s3c64xx/include/mach/pm-core.h @@ -12,6 +12,9 @@   * published by the Free Software Foundation.   */ +#ifndef __MACH_S3C64XX_PM_CORE_H +#define __MACH_S3C64XX_PM_CORE_H __FILE__ +  #include <mach/regs-gpio.h>  static inline void s3c_pm_debug_init_uart(void) @@ -113,3 +116,4 @@ static inline void samsung_pm_saved_gpios(void)  	__raw_writel(S3C64XX_SLPEN_USE_xSLP, S3C64XX_SLPEN);  } +#endif /* __MACH_S3C64XX_PM_CORE_H */ diff --git a/arch/arm/mach-s3c64xx/include/mach/spi-clocks.h b/arch/arm/mach-s3c64xx/include/mach/spi-clocks.h deleted file mode 100644 index 9d0c43b4b68..00000000000 --- a/arch/arm/mach-s3c64xx/include/mach/spi-clocks.h +++ /dev/null @@ -1,18 +0,0 @@ -/* linux/arch/arm/mach-s3c64xx/include/mach/spi-clocks.h - * - * Copyright (C) 2009 Samsung Electronics Ltd. - *	Jaswinder Singh <jassi.brar@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __S3C64XX_PLAT_SPI_CLKS_H -#define __S3C64XX_PLAT_SPI_CLKS_H __FILE__ - -#define S3C64XX_SPI_SRCCLK_PCLK		0 -#define S3C64XX_SPI_SRCCLK_SPIBUS	1 -#define S3C64XX_SPI_SRCCLK_48M		2 - -#endif /* __S3C64XX_PLAT_SPI_CLKS_H */ diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c index 7a27f5603c7..9e382e7c77c 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c @@ -29,7 +29,6 @@  #include <mach/crag6410.h>  static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = { -	.set_level = gpio_set_value,  	.line = S3C64XX_GPC(3),  }; @@ -39,6 +38,7 @@ static struct spi_board_info wm1253_devs[] = {  		.bus_num	= 0,  		.chip_select	= 0,  		.mode		= SPI_MODE_0, +		.irq		= S3C_EINT(5),  		.controller_data = &wm0010_spi_csinfo,  	},  }; @@ -168,7 +168,6 @@ static struct wm8994_pdata wm8994_pdata = {  	.gpio_defaults = {  		0x3,          /* IRQ out, active high, CMOS */  	}, -	.irq_base = CODEC_IRQ_BASE,  	.ldo = {  		 { .init_data = &wm8994_ldo1, },  		 { .init_data = &wm8994_ldo2, }, @@ -182,6 +181,11 @@ static const struct i2c_board_info wm1277_devs[] = {  	},  }; +static const struct i2c_board_info wm5102_devs[] = { +	{ I2C_BOARD_INFO("wm5102", 0x1a), +	  .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, }, +}; +  static const struct i2c_board_info wm6230_i2c_devs[] = {  	{ I2C_BOARD_INFO("wm9081", 0x6c),  	  .platform_data = &wm9081_pdata, }, @@ -209,6 +213,7 @@ static __devinitdata const struct {  	  .spi_devs = wm1253_devs, .num_spi_devs = ARRAY_SIZE(wm1253_devs) },  	{ .id = 0x32, .name = "XXXX-EV1 Caol Illa" },  	{ .id = 0x33, .name = "XXXX-EV1 Oban" }, +	{ .id = 0x34, .name = "WM0010-6320-CS42 Balblair" },  	{ .id = 0x39, .name = "1254-EV1 Dallas Dhu",  	  .i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs) },  	{ .id = 0x3a, .name = "1259-EV1 Tobermory", @@ -218,6 +223,8 @@ static __devinitdata const struct {  	{ .id = 0x3c, .name = "1273-EV1 Longmorn" },  	{ .id = 0x3d, .name = "1277-EV1 Littlemill",  	  .i2c_devs = wm1277_devs, .num_i2c_devs = ARRAY_SIZE(wm1277_devs) }, +	{ .id = 0x3e, .name = "WM5102-6271-EV1-CS127", +	  .i2c_devs = wm5102_devs, .num_i2c_devs = ARRAY_SIZE(wm5102_devs) },  };  static __devinit int wlf_gf_module_probe(struct i2c_client *i2c, diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index d0c352d861f..09cd81207a3 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c @@ -171,7 +171,7 @@ static struct fb_videomode crag6410_lcd_timing = {  };  /* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */ -static struct s3c_fb_platdata crag6410_lcd_pdata __initdata = { +static struct s3c_fb_platdata crag6410_lcd_pdata __devinitdata = {  	.setup_gpio	= s3c64xx_fb_gpio_setup_24bpp,  	.vtiming	= &crag6410_lcd_timing,  	.win[0]		= &crag6410_fb_win0, @@ -181,7 +181,7 @@ static struct s3c_fb_platdata crag6410_lcd_pdata __initdata = {  /* 2x6 keypad */ -static uint32_t crag6410_keymap[] __initdata = { +static uint32_t crag6410_keymap[] __devinitdata = {  	/* KEY(row, col, keycode) */  	KEY(0, 0, KEY_VOLUMEUP),  	KEY(0, 1, KEY_HOME), @@ -197,12 +197,12 @@ static uint32_t crag6410_keymap[] __initdata = {  	KEY(1, 5, KEY_CAMERA),  }; -static struct matrix_keymap_data crag6410_keymap_data __initdata = { +static struct matrix_keymap_data crag6410_keymap_data __devinitdata = {  	.keymap		= crag6410_keymap,  	.keymap_size	= ARRAY_SIZE(crag6410_keymap),  }; -static struct samsung_keypad_platdata crag6410_keypad_data __initdata = { +static struct samsung_keypad_platdata crag6410_keypad_data __devinitdata = {  	.keymap_data	= &crag6410_keymap_data,  	.rows		= 2,  	.cols		= 6, @@ -373,11 +373,11 @@ static struct wm831x_buckv_pdata vddarm_pdata = {  	.dvs_gpio = S3C64XX_GPK(0),  }; -static struct regulator_consumer_supply vddarm_consumers[] __initdata = { +static struct regulator_consumer_supply vddarm_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("vddarm", NULL),  }; -static struct regulator_init_data vddarm __initdata = { +static struct regulator_init_data vddarm __devinitdata = {  	.constraints = {  		.name = "VDDARM",  		.min_uV = 1000000, @@ -391,11 +391,11 @@ static struct regulator_init_data vddarm __initdata = {  	.driver_data = &vddarm_pdata,  }; -static struct regulator_consumer_supply vddint_consumers[] __initdata = { +static struct regulator_consumer_supply vddint_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("vddint", NULL),  }; -static struct regulator_init_data vddint __initdata = { +static struct regulator_init_data vddint __devinitdata = {  	.constraints = {  		.name = "VDDINT",  		.min_uV = 1000000, @@ -408,27 +408,27 @@ static struct regulator_init_data vddint __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddmem __initdata = { +static struct regulator_init_data vddmem __devinitdata = {  	.constraints = {  		.name = "VDDMEM",  		.always_on = 1,  	},  }; -static struct regulator_init_data vddsys __initdata = { +static struct regulator_init_data vddsys __devinitdata = {  	.constraints = {  		.name = "VDDSYS,VDDEXT,VDDPCM,VDDSS",  		.always_on = 1,  	},  }; -static struct regulator_consumer_supply vddmmc_consumers[] __initdata = { +static struct regulator_consumer_supply vddmmc_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),  	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.1"),  	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),  }; -static struct regulator_init_data vddmmc __initdata = { +static struct regulator_init_data vddmmc __devinitdata = {  	.constraints = {  		.name = "VDDMMC,UH",  		.always_on = 1, @@ -438,7 +438,7 @@ static struct regulator_init_data vddmmc __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddotgi __initdata = { +static struct regulator_init_data vddotgi __devinitdata = {  	.constraints = {  		.name = "VDDOTGi",  		.always_on = 1, @@ -446,7 +446,7 @@ static struct regulator_init_data vddotgi __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddotg __initdata = { +static struct regulator_init_data vddotg __devinitdata = {  	.constraints = {  		.name = "VDDOTG",  		.always_on = 1, @@ -454,7 +454,7 @@ static struct regulator_init_data vddotg __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddhi __initdata = { +static struct regulator_init_data vddhi __devinitdata = {  	.constraints = {  		.name = "VDDHI",  		.always_on = 1, @@ -462,7 +462,7 @@ static struct regulator_init_data vddhi __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddadc __initdata = { +static struct regulator_init_data vddadc __devinitdata = {  	.constraints = {  		.name = "VDDADC,VDDDAC",  		.always_on = 1, @@ -470,7 +470,7 @@ static struct regulator_init_data vddadc __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddmem0 __initdata = { +static struct regulator_init_data vddmem0 __devinitdata = {  	.constraints = {  		.name = "VDDMEM0",  		.always_on = 1, @@ -478,7 +478,7 @@ static struct regulator_init_data vddmem0 __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddpll __initdata = { +static struct regulator_init_data vddpll __devinitdata = {  	.constraints = {  		.name = "VDDPLL",  		.always_on = 1, @@ -486,7 +486,7 @@ static struct regulator_init_data vddpll __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddlcd __initdata = { +static struct regulator_init_data vddlcd __devinitdata = {  	.constraints = {  		.name = "VDDLCD",  		.always_on = 1, @@ -494,7 +494,7 @@ static struct regulator_init_data vddlcd __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddalive __initdata = { +static struct regulator_init_data vddalive __devinitdata = {  	.constraints = {  		.name = "VDDALIVE",  		.always_on = 1, @@ -502,30 +502,29 @@ static struct regulator_init_data vddalive __initdata = {  	.supply_regulator = "WALLVDD",  }; -static struct wm831x_backup_pdata banff_backup_pdata __initdata = { +static struct wm831x_backup_pdata banff_backup_pdata __devinitdata = {  	.charger_enable = 1,  	.vlim = 2500,  /* mV */  	.ilim = 200,   /* uA */  }; -static struct wm831x_status_pdata banff_red_led __initdata = { +static struct wm831x_status_pdata banff_red_led __devinitdata = {  	.name = "banff:red:",  	.default_src = WM831X_STATUS_MANUAL,  }; -static struct wm831x_status_pdata banff_green_led __initdata = { +static struct wm831x_status_pdata banff_green_led __devinitdata = {  	.name = "banff:green:",  	.default_src = WM831X_STATUS_MANUAL,  }; -static struct wm831x_touch_pdata touch_pdata __initdata = { +static struct wm831x_touch_pdata touch_pdata __devinitdata = {  	.data_irq = S3C_EINT(26),  	.pd_irq = S3C_EINT(27),  }; -static struct wm831x_pdata crag_pmic_pdata __initdata = { +static struct wm831x_pdata crag_pmic_pdata __devinitdata = {  	.wm831x_num = 1, -	.irq_base = BANFF_PMIC_IRQ_BASE,  	.gpio_base = BANFF_PMIC_GPIO_BASE,  	.soft_shutdown = true, @@ -568,7 +567,7 @@ static struct wm831x_pdata crag_pmic_pdata __initdata = {  	.touch = &touch_pdata,  }; -static struct i2c_board_info i2c_devs0[] __initdata = { +static struct i2c_board_info i2c_devs0[] __devinitdata = {  	{ I2C_BOARD_INFO("24c08", 0x50), },  	{ I2C_BOARD_INFO("tca6408", 0x20),  	  .platform_data = &crag6410_pca_data, @@ -583,12 +582,12 @@ static struct s3c2410_platform_i2c i2c0_pdata = {  	.frequency = 400000,  }; -static struct regulator_consumer_supply pvdd_1v2_consumers[] __initdata = { +static struct regulator_consumer_supply pvdd_1v2_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("DCVDD", "spi0.0"),  	REGULATOR_SUPPLY("AVDD", "spi0.0"),  }; -static struct regulator_init_data pvdd_1v2 __initdata = { +static struct regulator_init_data pvdd_1v2 __devinitdata = {  	.constraints = {  		.name = "PVDD_1V2",  		.valid_ops_mask = REGULATOR_CHANGE_STATUS, @@ -598,7 +597,7 @@ static struct regulator_init_data pvdd_1v2 __initdata = {  	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v2_consumers),  }; -static struct regulator_consumer_supply pvdd_1v8_consumers[] __initdata = { +static struct regulator_consumer_supply pvdd_1v8_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("LDOVDD", "1-001a"),  	REGULATOR_SUPPLY("PLLVDD", "1-001a"),  	REGULATOR_SUPPLY("DBVDD", "1-001a"), @@ -612,7 +611,7 @@ static struct regulator_consumer_supply pvdd_1v8_consumers[] __initdata = {  	REGULATOR_SUPPLY("DBVDD", "spi0.0"),  }; -static struct regulator_init_data pvdd_1v8 __initdata = { +static struct regulator_init_data pvdd_1v8 __devinitdata = {  	.constraints = {  		.name = "PVDD_1V8",  		.always_on = 1, @@ -622,12 +621,12 @@ static struct regulator_init_data pvdd_1v8 __initdata = {  	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v8_consumers),  }; -static struct regulator_consumer_supply pvdd_3v3_consumers[] __initdata = { +static struct regulator_consumer_supply pvdd_3v3_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("MICVDD", "1-001a"),  	REGULATOR_SUPPLY("AVDD1", "1-001a"),  }; -static struct regulator_init_data pvdd_3v3 __initdata = { +static struct regulator_init_data pvdd_3v3 __devinitdata = {  	.constraints = {  		.name = "PVDD_3V3",  		.always_on = 1, @@ -637,7 +636,7 @@ static struct regulator_init_data pvdd_3v3 __initdata = {  	.num_consumer_supplies = ARRAY_SIZE(pvdd_3v3_consumers),  }; -static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = { +static struct wm831x_pdata glenfarclas_pmic_pdata __devinitdata = {  	.wm831x_num = 2,  	.irq_base = GLENFARCLAS_PMIC_IRQ_BASE,  	.gpio_base = GLENFARCLAS_PMIC_GPIO_BASE, @@ -669,7 +668,7 @@ static struct wm1250_ev1_pdata wm1250_ev1_pdata = {  	},  }; -static struct i2c_board_info i2c_devs1[] __initdata = { +static struct i2c_board_info i2c_devs1[] __devinitdata = {  	{ I2C_BOARD_INFO("wm8311", 0x34),  	  .irq = S3C_EINT(0),  	  .platform_data = &glenfarclas_pmic_pdata }, @@ -799,7 +798,7 @@ static void __init crag6410_machine_init(void)  	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));  	samsung_keypad_set_platdata(&crag6410_keypad_data); -	s3c64xx_spi0_set_platdata(&s3c64xx_spi0_pdata, 0, 1); +	s3c64xx_spi0_set_platdata(NULL, 0, 1);  	platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices)); diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index df3103d450e..0fe4f1503f4 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c @@ -566,7 +566,6 @@ static struct wm831x_status_pdata wm1192_led8_pdata = {  static struct wm831x_pdata smdk6410_wm1192_pdata = {  	.pre_init = wm1192_pre_init, -	.irq_base = IRQ_BOARD_START,  	.backlight = &wm1192_backlight_pdata,  	.dcdc = { diff --git a/arch/arm/mach-s3c64xx/setup-spi.c b/arch/arm/mach-s3c64xx/setup-spi.c index d9592ad7a82..4dc53450d71 100644 --- a/arch/arm/mach-s3c64xx/setup-spi.c +++ b/arch/arm/mach-s3c64xx/setup-spi.c @@ -9,19 +9,10 @@   */  #include <linux/gpio.h> -#include <linux/platform_device.h> -  #include <plat/gpio-cfg.h> -#include <plat/s3c64xx-spi.h>  #ifdef CONFIG_S3C64XX_DEV_SPI0 -struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 13, -	.tx_st_done	= 21, -}; - -int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi0_cfg_gpio(void)  {  	s3c_gpio_cfgall_range(S3C64XX_GPC(0), 3,  				S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); @@ -30,13 +21,7 @@ int s3c64xx_spi0_cfg_gpio(struct platform_device *dev)  #endif  #ifdef CONFIG_S3C64XX_DEV_SPI1 -struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 13, -	.tx_st_done	= 21, -}; - -int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi1_cfg_gpio(void)  {  	s3c_gpio_cfgall_range(S3C64XX_GPC(4), 3,  				S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); diff --git a/arch/arm/mach-s5p64x0/clock-s5p6440.c b/arch/arm/mach-s5p64x0/clock-s5p6440.c index ee1e8e7f563..000445596ec 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6440.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6440.c @@ -227,13 +227,13 @@ static struct clk init_clocks_off[] = {  		.ctrlbit	= (1 << 17),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5p64x0-spi.0",  		.parent		= &clk_pclk_low.clk,  		.enable		= s5p64x0_pclk_ctrl,  		.ctrlbit	= (1 << 21),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5p64x0-spi.1",  		.parent		= &clk_pclk_low.clk,  		.enable		= s5p64x0_pclk_ctrl,  		.ctrlbit	= (1 << 22), @@ -467,7 +467,7 @@ static struct clksrc_clk clk_sclk_uclk = {  static struct clksrc_clk clk_sclk_spi0 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5p64x0-spi.0",  		.ctrlbit	= (1 << 20),  		.enable		= s5p64x0_sclk_ctrl,  	}, @@ -479,7 +479,7 @@ static struct clksrc_clk clk_sclk_spi0 = {  static struct clksrc_clk clk_sclk_spi1 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5p64x0-spi.1",  		.ctrlbit	= (1 << 21),  		.enable		= s5p64x0_sclk_ctrl,  	}, @@ -519,8 +519,8 @@ static struct clk_lookup s5p6440_clk_lookup[] = {  	CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk),  	CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk),  	CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), +	CLKDEV_INIT("s5p64x0-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), +	CLKDEV_INIT("s5p64x0-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),  	CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),  	CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),  	CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), diff --git a/arch/arm/mach-s5p64x0/clock-s5p6450.c b/arch/arm/mach-s5p64x0/clock-s5p6450.c index dae6a13f43b..f3e0ef3d27c 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6450.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6450.c @@ -236,13 +236,13 @@ static struct clk init_clocks_off[] = {  		.ctrlbit	= (1 << 17),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5p64x0-spi.0",  		.parent		= &clk_pclk_low.clk,  		.enable		= s5p64x0_pclk_ctrl,  		.ctrlbit	= (1 << 21),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5p64x0-spi.1",  		.parent		= &clk_pclk_low.clk,  		.enable		= s5p64x0_pclk_ctrl,  		.ctrlbit	= (1 << 22), @@ -528,7 +528,7 @@ static struct clksrc_clk clk_sclk_uclk = {  static struct clksrc_clk clk_sclk_spi0 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5p64x0-spi.0",  		.ctrlbit	= (1 << 20),  		.enable		= s5p64x0_sclk_ctrl,  	}, @@ -540,7 +540,7 @@ static struct clksrc_clk clk_sclk_spi0 = {  static struct clksrc_clk clk_sclk_spi1 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5p64x0-spi.1",  		.ctrlbit	= (1 << 21),  		.enable		= s5p64x0_sclk_ctrl,  	}, @@ -562,8 +562,8 @@ static struct clk_lookup s5p6450_clk_lookup[] = {  	CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk),  	CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk),  	CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), +	CLKDEV_INIT("s5p64x0-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), +	CLKDEV_INIT("s5p64x0-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),  	CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),  	CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),  	CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), diff --git a/arch/arm/mach-s5p64x0/dma.c b/arch/arm/mach-s5p64x0/dma.c index 2ee5dc069b3..9c4ce085f58 100644 --- a/arch/arm/mach-s5p64x0/dma.c +++ b/arch/arm/mach-s5p64x0/dma.c @@ -36,8 +36,6 @@  #include <plat/devs.h>  #include <plat/irqs.h> -static u64 dma_dmamask = DMA_BIT_MASK(32); -  static u8 s5p6440_pdma_peri[] = {  	DMACH_UART0_RX,  	DMACH_UART0_TX, diff --git a/arch/arm/mach-s5p64x0/include/mach/spi-clocks.h b/arch/arm/mach-s5p64x0/include/mach/spi-clocks.h deleted file mode 100644 index 170a20a9643..00000000000 --- a/arch/arm/mach-s5p64x0/include/mach/spi-clocks.h +++ /dev/null @@ -1,20 +0,0 @@ -/* linux/arch/arm/mach-s5p64x0/include/mach/spi-clocks.h - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Copyright (C) 2010 Samsung Electronics Co. Ltd. - *	Jaswinder Singh <jassi.brar@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#ifndef __ASM_ARCH_SPI_CLKS_H -#define __ASM_ARCH_SPI_CLKS_H __FILE__ - -#define S5P64X0_SPI_SRCCLK_PCLK		0 -#define S5P64X0_SPI_SRCCLK_SCLK		1 - -#endif /* __ASM_ARCH_SPI_CLKS_H */ diff --git a/arch/arm/mach-s5p64x0/setup-spi.c b/arch/arm/mach-s5p64x0/setup-spi.c index e9b84124035..7664356720c 100644 --- a/arch/arm/mach-s5p64x0/setup-spi.c +++ b/arch/arm/mach-s5p64x0/setup-spi.c @@ -9,21 +9,10 @@   */  #include <linux/gpio.h> -#include <linux/platform_device.h> -#include <linux/io.h> -  #include <plat/gpio-cfg.h> -#include <plat/cpu.h> -#include <plat/s3c64xx-spi.h>  #ifdef CONFIG_S3C64XX_DEV_SPI0 -struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { -	.fifo_lvl_mask	= 0x1ff, -	.rx_lvl_offset	= 15, -	.tx_st_done	= 25, -}; - -int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi0_cfg_gpio(void)  {  	if (soc_is_s5p6450())  		s3c_gpio_cfgall_range(S5P6450_GPC(0), 3, @@ -36,13 +25,7 @@ int s3c64xx_spi0_cfg_gpio(struct platform_device *dev)  #endif  #ifdef CONFIG_S3C64XX_DEV_SPI1 -struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 15, -	.tx_st_done	= 25, -}; - -int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi1_cfg_gpio(void)  {  	if (soc_is_s5p6450())  		s3c_gpio_cfgall_range(S5P6450_GPC(4), 3, diff --git a/arch/arm/mach-s5pc100/clock.c b/arch/arm/mach-s5pc100/clock.c index 16eca4ea201..926219791f0 100644 --- a/arch/arm/mach-s5pc100/clock.c +++ b/arch/arm/mach-s5pc100/clock.c @@ -564,19 +564,19 @@ static struct clk init_clocks_off[] = {  		.ctrlbit	= (1 << 5),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5pc100-spi.0",  		.parent		= &clk_div_d1_bus.clk,  		.enable		= s5pc100_d1_4_ctrl,  		.ctrlbit	= (1 << 6),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5pc100-spi.1",  		.parent		= &clk_div_d1_bus.clk,  		.enable		= s5pc100_d1_4_ctrl,  		.ctrlbit	= (1 << 7),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.2", +		.devname	= "s5pc100-spi.2",  		.parent		= &clk_div_d1_bus.clk,  		.enable		= s5pc100_d1_4_ctrl,  		.ctrlbit	= (1 << 8), @@ -702,7 +702,7 @@ static struct clk clk_hsmmc0 = {  static struct clk clk_48m_spi0 = {  	.name		= "spi_48m", -	.devname	= "s3c64xx-spi.0", +	.devname	= "s5pc100-spi.0",  	.parent		= &clk_mout_48m.clk,  	.enable		= s5pc100_sclk0_ctrl,  	.ctrlbit	= (1 << 7), @@ -710,7 +710,7 @@ static struct clk clk_48m_spi0 = {  static struct clk clk_48m_spi1 = {  	.name		= "spi_48m", -	.devname	= "s3c64xx-spi.1", +	.devname	= "s5pc100-spi.1",  	.parent		= &clk_mout_48m.clk,  	.enable		= s5pc100_sclk0_ctrl,  	.ctrlbit	= (1 << 8), @@ -718,7 +718,7 @@ static struct clk clk_48m_spi1 = {  static struct clk clk_48m_spi2 = {  	.name		= "spi_48m", -	.devname	= "s3c64xx-spi.2", +	.devname	= "s5pc100-spi.2",  	.parent		= &clk_mout_48m.clk,  	.enable		= s5pc100_sclk0_ctrl,  	.ctrlbit	= (1 << 9), @@ -1085,7 +1085,7 @@ static struct clksrc_clk clk_sclk_mmc2 = {  static struct clksrc_clk clk_sclk_spi0 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5pc100-spi.0",  		.ctrlbit	= (1 << 4),  		.enable		= s5pc100_sclk0_ctrl,  	}, @@ -1097,7 +1097,7 @@ static struct clksrc_clk clk_sclk_spi0 = {  static struct clksrc_clk clk_sclk_spi1 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5pc100-spi.1",  		.ctrlbit	= (1 << 5),  		.enable		= s5pc100_sclk0_ctrl,  	}, @@ -1109,7 +1109,7 @@ static struct clksrc_clk clk_sclk_spi1 = {  static struct clksrc_clk clk_sclk_spi2 = {  	.clk	= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.2", +		.devname	= "s5pc100-spi.2",  		.ctrlbit	= (1 << 6),  		.enable		= s5pc100_sclk0_ctrl,  	}, @@ -1315,12 +1315,12 @@ static struct clk_lookup s5pc100_clk_lookup[] = {  	CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),  	CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),  	CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_48m_spi0), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_sclk_spi0.clk), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_48m_spi1), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk2", &clk_sclk_spi1.clk), -	CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk1", &clk_48m_spi2), -	CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk2", &clk_sclk_spi2.clk), +	CLKDEV_INIT("s5pc100-spi.0", "spi_busclk1", &clk_48m_spi0), +	CLKDEV_INIT("s5pc100-spi.0", "spi_busclk2", &clk_sclk_spi0.clk), +	CLKDEV_INIT("s5pc100-spi.1", "spi_busclk1", &clk_48m_spi1), +	CLKDEV_INIT("s5pc100-spi.1", "spi_busclk2", &clk_sclk_spi1.clk), +	CLKDEV_INIT("s5pc100-spi.2", "spi_busclk1", &clk_48m_spi2), +	CLKDEV_INIT("s5pc100-spi.2", "spi_busclk2", &clk_sclk_spi2.clk),  };  void __init s5pc100_register_clocks(void) diff --git a/arch/arm/mach-s5pc100/dma.c b/arch/arm/mach-s5pc100/dma.c index afd8db2d599..b1418409709 100644 --- a/arch/arm/mach-s5pc100/dma.c +++ b/arch/arm/mach-s5pc100/dma.c @@ -33,8 +33,6 @@  #include <mach/irqs.h>  #include <mach/dma.h> -static u64 dma_dmamask = DMA_BIT_MASK(32); -  static u8 pdma0_peri[] = {  	DMACH_UART0_RX,  	DMACH_UART0_TX, diff --git a/arch/arm/mach-s5pc100/include/mach/spi-clocks.h b/arch/arm/mach-s5pc100/include/mach/spi-clocks.h deleted file mode 100644 index 65e426370bb..00000000000 --- a/arch/arm/mach-s5pc100/include/mach/spi-clocks.h +++ /dev/null @@ -1,18 +0,0 @@ -/* linux/arch/arm/mach-s5pc100/include/mach/spi-clocks.h - * - * Copyright (C) 2010 Samsung Electronics Co. Ltd. - *	Jaswinder Singh <jassi.brar@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __S5PC100_PLAT_SPI_CLKS_H -#define __S5PC100_PLAT_SPI_CLKS_H __FILE__ - -#define S5PC100_SPI_SRCCLK_PCLK		0 -#define S5PC100_SPI_SRCCLK_48M		1 -#define S5PC100_SPI_SRCCLK_SPIBUS	2 - -#endif /* __S5PC100_PLAT_SPI_CLKS_H */ diff --git a/arch/arm/mach-s5pc100/setup-spi.c b/arch/arm/mach-s5pc100/setup-spi.c index 431a6f747ca..183567961de 100644 --- a/arch/arm/mach-s5pc100/setup-spi.c +++ b/arch/arm/mach-s5pc100/setup-spi.c @@ -9,20 +9,10 @@   */  #include <linux/gpio.h> -#include <linux/platform_device.h> -  #include <plat/gpio-cfg.h> -#include <plat/s3c64xx-spi.h>  #ifdef CONFIG_S3C64XX_DEV_SPI0 -struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 13, -	.high_speed	= 1, -	.tx_st_done	= 21, -}; - -int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi0_cfg_gpio(void)  {  	s3c_gpio_cfgall_range(S5PC100_GPB(0), 3,  				S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); @@ -31,14 +21,7 @@ int s3c64xx_spi0_cfg_gpio(struct platform_device *dev)  #endif  #ifdef CONFIG_S3C64XX_DEV_SPI1 -struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 13, -	.high_speed	= 1, -	.tx_st_done	= 21, -}; - -int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi1_cfg_gpio(void)  {  	s3c_gpio_cfgall_range(S5PC100_GPB(4), 3,  				S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); @@ -47,14 +30,7 @@ int s3c64xx_spi1_cfg_gpio(struct platform_device *dev)  #endif  #ifdef CONFIG_S3C64XX_DEV_SPI2 -struct s3c64xx_spi_info s3c64xx_spi2_pdata __initdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 13, -	.high_speed	= 1, -	.tx_st_done	= 21, -}; - -int s3c64xx_spi2_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi2_cfg_gpio(void)  {  	s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3));  	s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP); diff --git a/arch/arm/mach-s5pv210/Kconfig b/arch/arm/mach-s5pv210/Kconfig index 88e983b0c82..77185c38188 100644 --- a/arch/arm/mach-s5pv210/Kconfig +++ b/arch/arm/mach-s5pv210/Kconfig @@ -152,6 +152,7 @@ config MACH_SMDKV210  	select S3C_DEV_I2C1  	select S3C_DEV_I2C2  	select S3C_DEV_RTC +	select S3C_DEV_USB_HSOTG  	select S3C_DEV_WDT  	select S5P_DEV_FIMC0  	select S5P_DEV_FIMC1 @@ -170,6 +171,7 @@ config MACH_SMDKV210  	select S5PV210_SETUP_IDE  	select S5PV210_SETUP_KEYPAD  	select S5PV210_SETUP_SDHCI +	select S5PV210_SETUP_USB_PHY  	help  	  Machine support for Samsung SMDKV210 diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index 09609d50961..fcdf52dbcc4 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c @@ -445,19 +445,19 @@ static struct clk init_clocks_off[] = {  		.ctrlbit	= (1 << 11),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5pv210-spi.0",  		.parent		= &clk_pclk_psys.clk,  		.enable		= s5pv210_clk_ip3_ctrl,  		.ctrlbit	= (1<<12),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5pv210-spi.1",  		.parent		= &clk_pclk_psys.clk,  		.enable		= s5pv210_clk_ip3_ctrl,  		.ctrlbit	= (1<<13),  	}, {  		.name		= "spi", -		.devname	= "s3c64xx-spi.2", +		.devname	= "s5pv210-spi.2",  		.parent		= &clk_pclk_psys.clk,  		.enable		= s5pv210_clk_ip3_ctrl,  		.ctrlbit	= (1<<14), @@ -1035,7 +1035,7 @@ static struct clksrc_clk clk_sclk_mmc3 = {  static struct clksrc_clk clk_sclk_spi0 = {  	.clk		= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.0", +		.devname	= "s5pv210-spi.0",  		.enable		= s5pv210_clk_mask0_ctrl,  		.ctrlbit	= (1 << 16),  	}, @@ -1047,7 +1047,7 @@ static struct clksrc_clk clk_sclk_spi0 = {  static struct clksrc_clk clk_sclk_spi1 = {  	.clk		= {  		.name		= "sclk_spi", -		.devname	= "s3c64xx-spi.1", +		.devname	= "s5pv210-spi.1",  		.enable		= s5pv210_clk_mask0_ctrl,  		.ctrlbit	= (1 << 17),  	}, @@ -1331,8 +1331,8 @@ static struct clk_lookup s5pv210_clk_lookup[] = {  	CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),  	CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.2", &clk_sclk_mmc3.clk),  	CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), -	CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), -	CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), +	CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), +	CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),  };  void __init s5pv210_register_clocks(void) diff --git a/arch/arm/mach-s5pv210/include/mach/spi-clocks.h b/arch/arm/mach-s5pv210/include/mach/spi-clocks.h deleted file mode 100644 index 02acded5f73..00000000000 --- a/arch/arm/mach-s5pv210/include/mach/spi-clocks.h +++ /dev/null @@ -1,17 +0,0 @@ -/* linux/arch/arm/mach-s5pv210/include/mach/spi-clocks.h - * - * Copyright (C) 2010 Samsung Electronics Co. Ltd. - *	Jaswinder Singh <jassi.brar@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __S5PV210_PLAT_SPI_CLKS_H -#define __S5PV210_PLAT_SPI_CLKS_H __FILE__ - -#define S5PV210_SPI_SRCCLK_PCLK		0 -#define S5PV210_SPI_SRCCLK_SCLK		1 - -#endif /* __S5PV210_PLAT_SPI_CLKS_H */ diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index af528f9e97f..78028df86c5 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c @@ -600,10 +600,17 @@ static void aquila_setup_sdhci(void)  	s3c_sdhci2_set_platdata(&aquila_hsmmc2_data);  }; +/* Audio device */ +static struct platform_device aquila_device_audio = { +	.name = "smdk-audio", +	.id = -1, +}; +  static struct platform_device *aquila_devices[] __initdata = {  	&aquila_i2c_gpio_pmic,  	&aquila_i2c_gpio5,  	&aquila_device_gpiokeys, +	&aquila_device_audio,  	&s3c_device_fb,  	&s5p_device_onenand,  	&s3c_device_hsmmc0, diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index bf5087c2b7f..822a5595068 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c @@ -859,12 +859,19 @@ static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = {  	.num_clients	= ARRAY_SIZE(goni_camera_sensors),  }; +/* Audio device */ +static struct platform_device goni_device_audio = { +	.name = "smdk-audio", +	.id = -1, +}; +  static struct platform_device *goni_devices[] __initdata = {  	&s3c_device_fb,  	&s5p_device_onenand,  	&goni_spi_gpio,  	&goni_i2c_gpio_pmic,  	&goni_i2c_gpio5, +	&goni_device_audio,  	&mmc2_fixed_voltage,  	&goni_device_gpiokeys,  	&s5p_device_mfc, @@ -901,7 +908,7 @@ static void __init goni_sound_init(void)  static void __init goni_map_io(void)  {  	s5pv210_init_io(NULL, 0); -	s3c24xx_init_clocks(24000000); +	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs));  	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);  } @@ -959,8 +966,6 @@ static void __init goni_machine_init(void)  	/* KEYPAD */  	samsung_keypad_set_platdata(&keypad_data); -	clk_xusbxti.rate = 24000000; -  	platform_add_devices(goni_devices, ARRAY_SIZE(goni_devices));  } diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 0d7ddec88eb..918b23d71fd 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c @@ -19,6 +19,7 @@  #include <linux/gpio.h>  #include <linux/delay.h>  #include <linux/pwm_backlight.h> +#include <linux/platform_data/s3c-hsotg.h>  #include <asm/hardware/vic.h>  #include <asm/mach/arch.h> @@ -47,6 +48,7 @@  #include <plat/backlight.h>  #include <plat/regs-fb-v4.h>  #include <plat/mfc.h> +#include <plat/clock.h>  #include "common.h" @@ -203,6 +205,9 @@ static struct s3c_fb_platdata smdkv210_lcd0_pdata __initdata = {  	.setup_gpio	= s5pv210_fb_gpio_setup_24bpp,  }; +/* USB OTG */ +static struct s3c_hsotg_plat smdkv210_hsotg_pdata; +  static struct platform_device *smdkv210_devices[] __initdata = {  	&s3c_device_adc,  	&s3c_device_cfcon, @@ -216,6 +221,7 @@ static struct platform_device *smdkv210_devices[] __initdata = {  	&s3c_device_i2c2,  	&s3c_device_rtc,  	&s3c_device_ts, +	&s3c_device_usb_hsotg,  	&s3c_device_wdt,  	&s5p_device_fimc0,  	&s5p_device_fimc1, @@ -279,7 +285,7 @@ static struct platform_pwm_backlight_data smdkv210_bl_data = {  static void __init smdkv210_map_io(void)  {  	s5pv210_init_io(NULL, 0); -	s3c24xx_init_clocks(24000000); +	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs));  	s5p_set_timer_source(S5P_PWM2, S5P_PWM4);  } @@ -314,6 +320,8 @@ static void __init smdkv210_machine_init(void)  	samsung_bl_set(&smdkv210_bl_gpio_info, &smdkv210_bl_data); +	s3c_hsotg_set_platdata(&smdkv210_hsotg_pdata); +  	platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));  } diff --git a/arch/arm/mach-s5pv210/setup-spi.c b/arch/arm/mach-s5pv210/setup-spi.c index f43c5048a37..81aecc162f8 100644 --- a/arch/arm/mach-s5pv210/setup-spi.c +++ b/arch/arm/mach-s5pv210/setup-spi.c @@ -9,20 +9,10 @@   */  #include <linux/gpio.h> -#include <linux/platform_device.h> -  #include <plat/gpio-cfg.h> -#include <plat/s3c64xx-spi.h>  #ifdef CONFIG_S3C64XX_DEV_SPI0 -struct s3c64xx_spi_info s3c64xx_spi0_pdata = { -	.fifo_lvl_mask	= 0x1ff, -	.rx_lvl_offset	= 15, -	.high_speed	= 1, -	.tx_st_done	= 25, -}; - -int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi0_cfg_gpio(void)  {  	s3c_gpio_cfgpin(S5PV210_GPB(0), S3C_GPIO_SFN(2));  	s3c_gpio_setpull(S5PV210_GPB(0), S3C_GPIO_PULL_UP); @@ -33,14 +23,7 @@ int s3c64xx_spi0_cfg_gpio(struct platform_device *dev)  #endif  #ifdef CONFIG_S3C64XX_DEV_SPI1 -struct s3c64xx_spi_info s3c64xx_spi1_pdata = { -	.fifo_lvl_mask	= 0x7f, -	.rx_lvl_offset	= 15, -	.high_speed	= 1, -	.tx_st_done	= 25, -}; - -int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) +int s3c64xx_spi1_cfg_gpio(void)  {  	s3c_gpio_cfgpin(S5PV210_GPB(4), S3C_GPIO_SFN(2));  	s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP); diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index d1dc7f1a239..d673211f121 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c @@ -362,7 +362,7 @@ static void __init assabet_init(void)  static void __init map_sa1100_gpio_regs( void )  {  	unsigned long phys = __PREG(GPLR) & PMD_MASK; -	unsigned long virt = io_p2v(phys); +	unsigned long virt = (unsigned long)io_p2v(phys);  	int prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_DOMAIN(DOMAIN_IO);  	pmd_t *pmd; diff --git a/arch/arm/mach-sa1100/cpu-sa1100.c b/arch/arm/mach-sa1100/cpu-sa1100.c index 19b2053f5af..e8f4d1e1923 100644 --- a/arch/arm/mach-sa1100/cpu-sa1100.c +++ b/arch/arm/mach-sa1100/cpu-sa1100.c @@ -87,6 +87,7 @@  #include <linux/types.h>  #include <linux/init.h>  #include <linux/cpufreq.h> +#include <linux/io.h>  #include <asm/cputype.h> diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c index 675bf8ef97e..48c45b0c92b 100644 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ b/arch/arm/mach-sa1100/cpu-sa1110.c @@ -19,6 +19,7 @@  #include <linux/cpufreq.h>  #include <linux/delay.h>  #include <linux/init.h> +#include <linux/io.h>  #include <linux/kernel.h>  #include <linux/moduleparam.h>  #include <linux/types.h> diff --git a/arch/arm/mach-sa1100/include/mach/SA-1100.h b/arch/arm/mach-sa1100/include/mach/SA-1100.h index 3f2d1b60188..0ac6cc08a19 100644 --- a/arch/arm/mach-sa1100/include/mach/SA-1100.h +++ b/arch/arm/mach-sa1100/include/mach/SA-1100.h @@ -830,14 +830,14 @@   *              	(read/write).   */ -#define OSMR0  		__REG(0x90000000)  /* OS timer Match Reg. 0 */ -#define OSMR1  		__REG(0x90000004)  /* OS timer Match Reg. 1 */ -#define OSMR2  		__REG(0x90000008)  /* OS timer Match Reg. 2 */ -#define OSMR3  		__REG(0x9000000c)  /* OS timer Match Reg. 3 */ -#define OSCR   	__REG(0x90000010)  /* OS timer Counter Reg. */ -#define OSSR   	__REG(0x90000014	)  /* OS timer Status Reg. */ -#define OWER   	__REG(0x90000018	)  /* OS timer Watch-dog Enable Reg. */ -#define OIER   	__REG(0x9000001C	)  /* OS timer Interrupt Enable Reg. */ +#define OSMR0  		io_p2v(0x90000000)  /* OS timer Match Reg. 0 */ +#define OSMR1  		io_p2v(0x90000004)  /* OS timer Match Reg. 1 */ +#define OSMR2  		io_p2v(0x90000008)  /* OS timer Match Reg. 2 */ +#define OSMR3  		io_p2v(0x9000000c)  /* OS timer Match Reg. 3 */ +#define OSCR   		io_p2v(0x90000010)  /* OS timer Counter Reg. */ +#define OSSR   		io_p2v(0x90000014)  /* OS timer Status Reg. */ +#define OWER   		io_p2v(0x90000018)  /* OS timer Watch-dog Enable Reg. */ +#define OIER  	 	io_p2v(0x9000001C)  /* OS timer Interrupt Enable Reg. */  #define OSSR_M(Nb)	        	/* Match detected [0..3]           */ \                  	(0x00000001 << (Nb)) diff --git a/arch/arm/mach-sa1100/include/mach/gpio.h b/arch/arm/mach-sa1100/include/mach/gpio.h index a38fc4f5424..6a9eecf3137 100644 --- a/arch/arm/mach-sa1100/include/mach/gpio.h +++ b/arch/arm/mach-sa1100/include/mach/gpio.h @@ -24,6 +24,7 @@  #ifndef __ASM_ARCH_SA1100_GPIO_H  #define __ASM_ARCH_SA1100_GPIO_H +#include <linux/io.h>  #include <mach/hardware.h>  #include <asm/irq.h>  #include <asm-generic/gpio.h> diff --git a/arch/arm/mach-sa1100/include/mach/hardware.h b/arch/arm/mach-sa1100/include/mach/hardware.h index 99f5856d8de..cbedd75a9d6 100644 --- a/arch/arm/mach-sa1100/include/mach/hardware.h +++ b/arch/arm/mach-sa1100/include/mach/hardware.h @@ -32,7 +32,7 @@  #define PIO_START       0x80000000	/* physical start of IO space */  #define io_p2v( x )             \ -   ( (((x)&0x00ffffff) | (((x)&0x30000000)>>VIO_SHIFT)) + VIO_BASE ) +   IOMEM( (((x)&0x00ffffff) | (((x)&0x30000000)>>VIO_SHIFT)) + VIO_BASE )  #define io_v2p( x )             \     ( (((x)&0x00ffffff) | (((x)&(0x30000000>>VIO_SHIFT))<<VIO_SHIFT)) + PIO_START ) @@ -47,6 +47,8 @@  #define CPU_SA1110_ID	(0x6901b110)  #define CPU_SA1110_MASK	(0xfffffff0) +#define __MREG(x)	IOMEM(io_p2v(x)) +  #ifndef __ASSEMBLY__  #include <asm/cputype.h> @@ -56,7 +58,7 @@  #define cpu_is_sa1100()	((read_cpuid_id() & CPU_SA1100_MASK) == CPU_SA1100_ID)  #define cpu_is_sa1110()	((read_cpuid_id() & CPU_SA1110_MASK) == CPU_SA1110_ID) -# define __REG(x)	(*((volatile unsigned long *)io_p2v(x))) +# define __REG(x)	(*((volatile unsigned long __iomem *)io_p2v(x)))  # define __PREG(x)	(io_v2p((unsigned long)&(x)))  static inline unsigned long get_clock_tick_rate(void) diff --git a/arch/arm/mach-sa1100/include/mach/uncompress.h b/arch/arm/mach-sa1100/include/mach/uncompress.h index 6cb39ddde65..5cf71da60e4 100644 --- a/arch/arm/mach-sa1100/include/mach/uncompress.h +++ b/arch/arm/mach-sa1100/include/mach/uncompress.h @@ -8,6 +8,8 @@  #include "hardware.h" +#define IOMEM(x)	(x) +  /*   * The following code assumes the serial port has already been   * initialized by the bootloader.  We search for the first enabled diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index 516ccc25d7f..2124f1fc2fb 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c @@ -12,6 +12,7 @@  #include <linux/init.h>  #include <linux/module.h>  #include <linux/interrupt.h> +#include <linux/io.h>  #include <linux/irq.h>  #include <linux/ioport.h>  #include <linux/syscore_ops.h> diff --git a/arch/arm/mach-sa1100/jornada720_ssp.c b/arch/arm/mach-sa1100/jornada720_ssp.c index b412fc09c80..7f07f08d896 100644 --- a/arch/arm/mach-sa1100/jornada720_ssp.c +++ b/arch/arm/mach-sa1100/jornada720_ssp.c @@ -18,6 +18,7 @@  #include <linux/module.h>  #include <linux/platform_device.h>  #include <linux/sched.h> +#include <linux/io.h>  #include <mach/hardware.h>  #include <mach/jornada720.h> diff --git a/arch/arm/mach-sa1100/leds-cerf.c b/arch/arm/mach-sa1100/leds-cerf.c index 040540fb7d8..30fc3b2bf55 100644 --- a/arch/arm/mach-sa1100/leds-cerf.c +++ b/arch/arm/mach-sa1100/leds-cerf.c @@ -4,6 +4,7 @@   * Author: ???   */  #include <linux/init.h> +#include <linux/io.h>  #include <mach/hardware.h>  #include <asm/leds.h> diff --git a/arch/arm/mach-sa1100/leds-lart.c b/arch/arm/mach-sa1100/leds-lart.c index a51830c60e5..50a5b143b46 100644 --- a/arch/arm/mach-sa1100/leds-lart.c +++ b/arch/arm/mach-sa1100/leds-lart.c @@ -10,6 +10,7 @@   *  pace of the LED.   */  #include <linux/init.h> +#include <linux/io.h>  #include <mach/hardware.h>  #include <asm/leds.h> diff --git a/arch/arm/mach-sa1100/pm.c b/arch/arm/mach-sa1100/pm.c index 690cf0ce5c0..6645d1e31f1 100644 --- a/arch/arm/mach-sa1100/pm.c +++ b/arch/arm/mach-sa1100/pm.c @@ -23,6 +23,7 @@   * 				Storage is local on the stack now.   */  #include <linux/init.h> +#include <linux/io.h>  #include <linux/suspend.h>  #include <linux/errno.h>  #include <linux/time.h> diff --git a/arch/arm/mach-sa1100/sleep.S b/arch/arm/mach-sa1100/sleep.S index 30cc6721665..85863741ef8 100644 --- a/arch/arm/mach-sa1100/sleep.S +++ b/arch/arm/mach-sa1100/sleep.S @@ -38,9 +38,9 @@ ENTRY(sa1100_finish_suspend)  	orr     r4, r4, #MDREFR_K1DB2  	ldr	r5, =PPCR -	@ Pre-load __udelay into the I-cache +	@ Pre-load __loop_udelay into the I-cache  	mov	r0, #1 -	bl	__udelay +	bl	__loop_udelay  	mov	r0, r0  	@ The following must all exist in a single cache line to @@ -53,11 +53,11 @@ ENTRY(sa1100_finish_suspend)  	@ delay 90us and set CPU PLL to lowest speed  	@ fixes resume problem on high speed SA1110  	mov	r0, #90 -	bl	__udelay +	bl	__loop_udelay  	mov	r1, #0  	str	r1, [r5]  	mov	r0, #90 -	bl	__udelay +	bl	__loop_udelay  	/*  	 * SA1110 SDRAM controller workaround.  register values: diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index 6af26e8d55e..80702c9ecc7 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c @@ -22,7 +22,7 @@  static u32 notrace sa1100_read_sched_clock(void)  { -	return OSCR; +	return readl_relaxed(OSCR);  }  #define MIN_OSCR_DELTA 2 @@ -32,8 +32,8 @@ static irqreturn_t sa1100_ost0_interrupt(int irq, void *dev_id)  	struct clock_event_device *c = dev_id;  	/* Disarm the compare/match, signal the event. */ -	OIER &= ~OIER_E0; -	OSSR = OSSR_M0; +	writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); +	writel_relaxed(OSSR_M0, OSSR);  	c->event_handler(c);  	return IRQ_HANDLED; @@ -44,10 +44,10 @@ sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c)  {  	unsigned long next, oscr; -	OIER |= OIER_E0; -	next = OSCR + delta; -	OSMR0 = next; -	oscr = OSCR; +	writel_relaxed(readl_relaxed(OIER) | OIER_E0, OIER); +	next = readl_relaxed(OSCR) + delta; +	writel_relaxed(next, OSMR0); +	oscr = readl_relaxed(OSCR);  	return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0;  } @@ -59,8 +59,8 @@ sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c)  	case CLOCK_EVT_MODE_ONESHOT:  	case CLOCK_EVT_MODE_UNUSED:  	case CLOCK_EVT_MODE_SHUTDOWN: -		OIER &= ~OIER_E0; -		OSSR = OSSR_M0; +		writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); +		writel_relaxed(OSSR_M0, OSSR);  		break;  	case CLOCK_EVT_MODE_RESUME: @@ -86,8 +86,8 @@ static struct irqaction sa1100_timer_irq = {  static void __init sa1100_timer_init(void)  { -	OIER = 0; -	OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; +	writel_relaxed(0, OIER); +	writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR);  	setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); @@ -100,7 +100,7 @@ static void __init sa1100_timer_init(void)  	setup_irq(IRQ_OST0, &sa1100_timer_irq); -	clocksource_mmio_init(&OSCR, "oscr", CLOCK_TICK_RATE, 200, 32, +	clocksource_mmio_init(OSCR, "oscr", CLOCK_TICK_RATE, 200, 32,  		clocksource_mmio_readl_up);  	clockevents_register_device(&ckevt_sa1100_osmr0);  } @@ -110,26 +110,26 @@ unsigned long osmr[4], oier;  static void sa1100_timer_suspend(void)  { -	osmr[0] = OSMR0; -	osmr[1] = OSMR1; -	osmr[2] = OSMR2; -	osmr[3] = OSMR3; -	oier = OIER; +	osmr[0] = readl_relaxed(OSMR0); +	osmr[1] = readl_relaxed(OSMR1); +	osmr[2] = readl_relaxed(OSMR2); +	osmr[3] = readl_relaxed(OSMR3); +	oier = readl_relaxed(OIER);  }  static void sa1100_timer_resume(void)  { -	OSSR = 0x0f; -	OSMR0 = osmr[0]; -	OSMR1 = osmr[1]; -	OSMR2 = osmr[2]; -	OSMR3 = osmr[3]; -	OIER = oier; +	writel_relaxed(0x0f, OSSR); +	writel_relaxed(osmr[0], OSMR0); +	writel_relaxed(osmr[1], OSMR1); +	writel_relaxed(osmr[2], OSMR2); +	writel_relaxed(osmr[3], OSMR3); +	writel_relaxed(oier, OIER);  	/*  	 * OSMR0 is the system timer: make sure OSCR is sufficiently behind  	 */ -	OSCR = OSMR0 - LATCH; +	writel_relaxed(OSMR0 - LATCH, OSCR);  }  #else  #define sa1100_timer_suspend NULL diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig index df33909205e..4cacc2d22fb 100644 --- a/arch/arm/mach-shmobile/Kconfig +++ b/arch/arm/mach-shmobile/Kconfig @@ -19,6 +19,7 @@ config ARCH_SH7372  	select CPU_V7  	select SH_CLK_CPG  	select ARCH_WANT_OPTIONAL_GPIOLIB +	select ARM_CPU_SUSPEND if PM || CPU_IDLE  config ARCH_SH73A0  	bool "SH-Mobile AG5 (R8A73A00)" @@ -58,6 +59,7 @@ config MACH_G4EVM  	bool "G4EVM board"  	depends on ARCH_SH7377  	select ARCH_REQUIRE_GPIOLIB +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_AP4EVB  	bool "AP4EVB board" @@ -65,6 +67,7 @@ config MACH_AP4EVB  	select ARCH_REQUIRE_GPIOLIB  	select SH_LCD_MIPI_DSI  	select SND_SOC_AK4642 if SND_SIMPLE_CARD +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  choice  	prompt "AP4EVB LCD panel selection" @@ -83,6 +86,7 @@ config MACH_AG5EVM  	bool "AG5EVM board"  	select ARCH_REQUIRE_GPIOLIB  	select SH_LCD_MIPI_DSI +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  	depends on ARCH_SH73A0  config MACH_MACKEREL @@ -90,15 +94,18 @@ config MACH_MACKEREL  	depends on ARCH_SH7372  	select ARCH_REQUIRE_GPIOLIB  	select SND_SOC_AK4642 if SND_SIMPLE_CARD +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_KOTA2  	bool "KOTA2 board"  	select ARCH_REQUIRE_GPIOLIB +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  	depends on ARCH_SH73A0  config MACH_BONITO  	bool "bonito board"  	select ARCH_REQUIRE_GPIOLIB +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  	depends on ARCH_R8A7740  config MACH_ARMADILLO800EVA @@ -106,22 +113,28 @@ config MACH_ARMADILLO800EVA  	depends on ARCH_R8A7740  	select ARCH_REQUIRE_GPIOLIB  	select USE_OF +	select REGULATOR_FIXED_VOLTAGE if REGULATOR +	select SND_SOC_WM8978 if SND_SIMPLE_CARD  config MACH_MARZEN  	bool "MARZEN board"  	depends on ARCH_R8A7779  	select ARCH_REQUIRE_GPIOLIB +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_KZM9D  	bool "KZM9D board"  	depends on ARCH_EMEV2  	select USE_OF +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_KZM9G  	bool "KZM-A9-GT board"  	depends on ARCH_SH73A0  	select ARCH_REQUIRE_GPIOLIB  	select USE_OF +	select SND_SOC_AK4642 if SND_SIMPLE_CARD +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  comment "SH-Mobile System Configuration" diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index 8aa1962c22a..0df5ae6740c 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile @@ -39,7 +39,9 @@ obj-$(CONFIG_ARCH_R8A7740)	+= entry-intc.o  # PM objects  obj-$(CONFIG_SUSPEND)		+= suspend.o  obj-$(CONFIG_CPU_IDLE)		+= cpuidle.o +obj-$(CONFIG_ARCH_SHMOBILE)	+= pm-rmobile.o  obj-$(CONFIG_ARCH_SH7372)	+= pm-sh7372.o sleep-sh7372.o +obj-$(CONFIG_ARCH_R8A7740)	+= pm-r8a7740.o  obj-$(CONFIG_ARCH_R8A7779)	+= pm-r8a7779.o  # Board objects diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 5a6f22f05e9..d82c010fdfc 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c @@ -27,6 +27,8 @@  #include <linux/delay.h>  #include <linux/io.h>  #include <linux/dma-mapping.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/serial_sci.h>  #include <linux/smsc911x.h>  #include <linux/gpio.h> @@ -52,6 +54,12 @@  #include <asm/hardware/cache-l2x0.h>  #include <asm/traps.h> +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  static struct resource smsc9220_resources[] = {  	[0] = {  		.start		= 0x14000000, @@ -142,6 +150,13 @@ static struct platform_device fsi_device = {  	.resource	= fsi_resources,  }; +/* Fixed 1.8V regulator to be used by MMCIF */ +static struct regulator_consumer_supply fixed1v8_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), +}; +  static struct resource sh_mmcif_resources[] = {  	[0] = {  		.name	= "MMCIF", @@ -364,6 +379,13 @@ static struct platform_device mipidsi0_device = {  	},  }; +/* Fixed 2.8V regulators to be used by SDHI0 */ +static struct regulator_consumer_supply fixed2v8_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), +}; +  /* SDHI0 */  static struct sh_mobile_sdhi_info sdhi0_info = {  	.dma_slave_tx	= SHDMA_SLAVE_SDHI0_TX, @@ -408,8 +430,57 @@ static struct platform_device sdhi0_device = {  	},  }; -void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state) +/* Fixed 3.3V regulator to be used by SDHI1 */ +static struct regulator_consumer_supply cn4_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), +}; + +static struct regulator_init_data cn4_power_init_data = { +	.constraints = { +		.valid_ops_mask = REGULATOR_CHANGE_STATUS, +	}, +	.num_consumer_supplies  = ARRAY_SIZE(cn4_power_consumers), +	.consumer_supplies      = cn4_power_consumers, +}; + +static struct fixed_voltage_config cn4_power_info = { +	.supply_name = "CN4 SD/MMC Vdd", +	.microvolts = 3300000, +	.gpio = GPIO_PORT114, +	.enable_high = 1, +	.init_data = &cn4_power_init_data, +}; + +static struct platform_device cn4_power = { +	.name = "reg-fixed-voltage", +	.id   = 2, +	.dev  = { +		.platform_data = &cn4_power_info, +	}, +}; + +static void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)  { +	static int power_gpio = -EINVAL; + +	if (power_gpio < 0) { +		int ret = gpio_request(GPIO_PORT114, "sdhi1_power"); +		if (!ret) { +			power_gpio = GPIO_PORT114; +			gpio_direction_output(power_gpio, 0); +		} +	} + +	/* +	 * If requesting the GPIO above failed, it means, that the regulator got +	 * probed and grabbed the GPIO, but we don't know, whether the sdhi +	 * driver already uses the regulator. If it doesn't, we have to toggle +	 * the GPIO ourselves, even though it is now owned by the fixed +	 * regulator driver. We have to live with the race in case the driver +	 * gets unloaded and the GPIO freed between these two steps. +	 */  	gpio_set_value(GPIO_PORT114, state);  } @@ -455,6 +526,7 @@ static struct platform_device sdhi1_device = {  };  static struct platform_device *ag5evm_devices[] __initdata = { +	&cn4_power,  	ð_device,  	&keysc_device,  	&fsi_device, @@ -468,6 +540,12 @@ static struct platform_device *ag5evm_devices[] __initdata = {  static void __init ag5evm_init(void)  { +	regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers, +				     ARRAY_SIZE(fixed1v8_power_consumers), 1800000); +	regulator_register_always_on(1, "fixed-2.8V", fixed2v8_power_consumers, +				     ARRAY_SIZE(fixed2v8_power_consumers), 3300000); +	regulator_register_fixed(3, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	sh73a0_pinmux_init();  	/* enable SCIFA2 */ @@ -562,8 +640,6 @@ static void __init ag5evm_init(void)  	gpio_request(GPIO_FN_SDHID1_2_PU, NULL);  	gpio_request(GPIO_FN_SDHID1_1_PU, NULL);  	gpio_request(GPIO_FN_SDHID1_0_PU, NULL); -	gpio_request(GPIO_PORT114, "sdhi1_power"); -	gpio_direction_output(GPIO_PORT114, 0);  #ifdef CONFIG_CACHE_L2X0  	/* Shared attribute override enable, 64K*8way */ diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index ace60246a5d..f172ca85905 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -34,6 +34,8 @@  #include <linux/i2c.h>  #include <linux/i2c/tsc2007.h>  #include <linux/io.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <linux/sh_intc.h>  #include <linux/sh_clk.h> @@ -159,6 +161,27 @@   * CN12: 3.3v   */ +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply fixed1v8_power_consumers[] = +{ +	/* J22 default position: 1.8V */ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), +}; + +static struct regulator_consumer_supply fixed3v3_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), +}; + +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  /* MTD */  static struct mtd_partition nor_flash_partitions[] = {  	{ @@ -1138,21 +1161,6 @@ static void __init fsi_init_pm_clock(void)  	clk_put(fsia_ick);  } -/* - * FIXME !! - * - * gpio_no_direction - * are quick_hack. - * - * current gpio frame work doesn't have - * the method to control only pull up/down/free. - * this function should be replaced by correct gpio function - */ -static void __init gpio_no_direction(u32 addr) -{ -	__raw_writeb(0x00, addr); -} -  /* TouchScreen */  #ifdef CONFIG_AP4EVB_QHD  # define GPIO_TSC_IRQ	GPIO_FN_IRQ28_123 @@ -1224,6 +1232,12 @@ static void __init ap4evb_init(void)  	u32 srcr4;  	struct clk *clk; +	regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers, +				     ARRAY_SIZE(fixed1v8_power_consumers), 1800000); +	regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers, +				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000); +	regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	/* External clock source */  	clk_set_rate(&sh7372_dv_clki_clk, 27000000); @@ -1302,8 +1316,8 @@ static void __init ap4evb_init(void)  	gpio_request(GPIO_PORT9, NULL);  	gpio_request(GPIO_PORT10, NULL); -	gpio_no_direction(GPIO_PORT9CR);  /* FSIAOBT needs no direction */ -	gpio_no_direction(GPIO_PORT10CR); /* FSIAOLR needs no direction */ +	gpio_direction_none(GPIO_PORT9CR);  /* FSIAOBT needs no direction */ +	gpio_direction_none(GPIO_PORT10CR); /* FSIAOLR needs no direction */  	/* card detect pin for MMC slot (CN7) */  	gpio_request(GPIO_PORT41, NULL); @@ -1447,14 +1461,14 @@ static void __init ap4evb_init(void)  	platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices)); -	sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc1_device); -	sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device); -	sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4lc, &lcdc1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4lc, &lcdc_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4mp, &fsi_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &sh_mmcif_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi0_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi1_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &ceu_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &sh_mmcif_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &sdhi0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &sdhi1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &ceu_device);  	hdmi_init_pm_clock();  	fsi_init_pm_clock(); diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index 9bd135531d7..cf10f92856d 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c @@ -28,6 +28,8 @@  #include <linux/platform_device.h>  #include <linux/gpio.h>  #include <linux/gpio_keys.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/sh_eth.h>  #include <linux/videodev2.h>  #include <linux/usb/renesas_usbhs.h> @@ -37,14 +39,20 @@  #include <linux/mmc/sh_mobile_sdhi.h>  #include <mach/common.h>  #include <mach/irqs.h> +#include <mach/r8a7740.h> +#include <media/mt9t112.h> +#include <media/sh_mobile_ceu.h> +#include <media/soc_camera.h>  #include <asm/page.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h>  #include <asm/hardware/cache-l2x0.h> -#include <mach/r8a7740.h>  #include <video/sh_mobile_lcdc.h> +#include <video/sh_mobile_hdmi.h> +#include <sound/sh_fsi.h> +#include <sound/simple_card.h>  /*   * CON1		Camera Module @@ -108,6 +116,14 @@   */  /* + * FSI-WM8978 + * + * this command is required when playback. + * + * # amixer set "Headphone" 50 + */ + +/*   * USB function   *   * When you use USB Function, @@ -117,14 +133,8 @@   * These are a little bit complex.   * see   *	usbhsf_power_ctrl() - * - * CAUTION - * - * It uses autonomy mode for USB hotplug at this point - * (= usbhs_private.platform_callback.get_vbus is NULL), - * since we don't know what's happen on PM control - * on this workaround.   */ +#define IRQ7		evt2irq(0x02e0)  #define USBCR1		0xe605810a  #define USBH		0xC6700000  #define USBH_USBCTR	0x10834 @@ -204,6 +214,20 @@ static void usbhsf_power_ctrl(struct platform_device *pdev,  	}  } +static int usbhsf_get_vbus(struct platform_device *pdev) +{ +	return gpio_get_value(GPIO_PORT209); +} + +static irqreturn_t usbhsf_interrupt(int irq, void *data) +{ +	struct platform_device *pdev = data; + +	renesas_usbhs_call_notify_hotplug(pdev); + +	return IRQ_HANDLED; +} +  static void usbhsf_hardware_exit(struct platform_device *pdev)  {  	struct usbhsf_private *priv = usbhsf_get_priv(pdev); @@ -227,11 +251,14 @@ static void usbhsf_hardware_exit(struct platform_device *pdev)  	priv->host	= NULL;  	priv->func	= NULL;  	priv->usbh_base	= NULL; + +	free_irq(IRQ7, pdev);  }  static int usbhsf_hardware_init(struct platform_device *pdev)  {  	struct usbhsf_private *priv = usbhsf_get_priv(pdev); +	int ret;  	priv->phy	= clk_get(&pdev->dev, "phy");  	priv->usb24	= clk_get(&pdev->dev, "usb24"); @@ -251,6 +278,14 @@ static int usbhsf_hardware_init(struct platform_device *pdev)  		return -EIO;  	} +	ret = request_irq(IRQ7, usbhsf_interrupt, IRQF_TRIGGER_NONE, +			  dev_name(&pdev->dev), pdev); +	if (ret) { +		dev_err(&pdev->dev, "request_irq err\n"); +		return ret; +	} +	irq_set_irq_type(IRQ7, IRQ_TYPE_EDGE_BOTH); +  	/* usb24 use 1/1 of parent clock (= usb24s = 24MHz) */  	clk_set_rate(priv->usb24,  		     clk_get_rate(clk_get_parent(priv->usb24))); @@ -262,6 +297,7 @@ static struct usbhsf_private usbhsf_private = {  	.info = {  		.platform_callback = {  			.get_id		= usbhsf_get_id, +			.get_vbus	= usbhsf_get_vbus,  			.hardware_init	= usbhsf_hardware_init,  			.hardware_exit	= usbhsf_hardware_exit,  			.power_ctrl	= usbhsf_power_ctrl, @@ -269,6 +305,8 @@ static struct usbhsf_private usbhsf_private = {  		.driver_param = {  			.buswait_bwait		= 5,  			.detection_delay	= 5, +			.d0_rx_id	= SHDMA_SLAVE_USBHS_RX, +			.d1_tx_id	= SHDMA_SLAVE_USBHS_TX,  		},  	}  }; @@ -384,6 +422,103 @@ static struct platform_device lcdc0_device = {  	},  }; +/* + * LCDC1/HDMI + */ +static struct sh_mobile_hdmi_info hdmi_info = { +	.flags		= HDMI_OUTPUT_PUSH_PULL | +			  HDMI_OUTPUT_POLARITY_HI | +			  HDMI_32BIT_REG | +			  HDMI_HAS_HTOP1 | +			  HDMI_SND_SRC_SPDIF, +}; + +static struct resource hdmi_resources[] = { +	[0] = { +		.name	= "HDMI", +		.start	= 0xe6be0000, +		.end	= 0xe6be03ff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= evt2irq(0x1700), +		.flags	= IORESOURCE_IRQ, +	}, +	[2] = { +		.name	= "HDMI emma3pf", +		.start	= 0xe6be4000, +		.end	= 0xe6be43ff, +		.flags	= IORESOURCE_MEM, +	}, +}; + +static struct platform_device hdmi_device = { +	.name		= "sh-mobile-hdmi", +	.num_resources	= ARRAY_SIZE(hdmi_resources), +	.resource	= hdmi_resources, +	.id             = -1, +	.dev	= { +		.platform_data	= &hdmi_info, +	}, +}; + +static const struct fb_videomode lcdc1_mode = { +	.name		= "HDMI 720p", +	.xres		= 1280, +	.yres		= 720, +	.pixclock	= 13468, +	.left_margin	= 220, +	.right_margin	= 110, +	.hsync_len	= 40, +	.upper_margin	= 20, +	.lower_margin	= 5, +	.vsync_len	= 5, +	.refresh	= 60, +	.sync		= FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, +}; + +static struct sh_mobile_lcdc_info hdmi_lcdc_info = { +	.clock_source	= LCDC_CLK_PERIPHERAL, /* HDMI clock */ +	.ch[0] = { +		.chan			= LCDC_CHAN_MAINLCD, +		.fourcc			= V4L2_PIX_FMT_RGB565, +		.interface_type		= RGB24, +		.clock_divider		= 1, +		.flags			= LCDC_FLAGS_DWPOL, +		.lcd_modes		= &lcdc1_mode, +		.num_modes		= 1, +		.tx_dev			= &hdmi_device, +		.panel_cfg = { +			.width	= 1280, +			.height = 720, +		}, +	}, +}; + +static struct resource hdmi_lcdc_resources[] = { +	[0] = { +		.name	= "LCDC1", +		.start	= 0xfe944000, +		.end	= 0xfe948000 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= intcs_evt2irq(0x1780), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device hdmi_lcdc_device = { +	.name		= "sh_mobile_lcdc_fb", +	.num_resources	= ARRAY_SIZE(hdmi_lcdc_resources), +	.resource	= hdmi_lcdc_resources, +	.id		= 1, +	.dev	= { +		.platform_data	= &hdmi_lcdc_info, +		.coherent_dma_mask = ~0, +	}, +}; +  /* GPIO KEY */  #define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 } @@ -407,6 +542,17 @@ static struct platform_device gpio_keys_device = {  	},  }; +/* Fixed 3.3V regulator to be used by SDHI0, SDHI1, MMCIF */ +static struct regulator_consumer_supply fixed3v3_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vmmc", "sh_mmcif"), +	REGULATOR_SUPPLY("vqmmc", "sh_mmcif"), +}; +  /* SDHI0 */  /*   * FIXME @@ -418,6 +564,8 @@ static struct platform_device gpio_keys_device = {   */  #define IRQ31	evt2irq(0x33E0)  static struct sh_mobile_sdhi_info sdhi0_info = { +	.dma_slave_tx	= SHDMA_SLAVE_SDHI0_TX, +	.dma_slave_rx	= SHDMA_SLAVE_SDHI0_RX,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |\  			  MMC_CAP_NEEDS_POLL,  	.tmio_ocr_mask	= MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, @@ -458,6 +606,8 @@ static struct platform_device sdhi0_device = {  /* SDHI1 */  static struct sh_mobile_sdhi_info sdhi1_info = { +	.dma_slave_tx	= SHDMA_SLAVE_SDHI1_TX, +	.dma_slave_rx	= SHDMA_SLAVE_SDHI1_RX,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,  	.tmio_ocr_mask	= MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,  	.tmio_flags	= TMIO_MMC_HAS_IDLE_WAIT, @@ -532,12 +682,209 @@ static struct platform_device sh_mmcif_device = {  	.resource	= sh_mmcif_resources,  }; +/* Camera */ +static int mt9t111_power(struct device *dev, int mode) +{ +	struct clk *mclk = clk_get(NULL, "video1"); + +	if (IS_ERR(mclk)) { +		dev_err(dev, "can't get video1 clock\n"); +		return -EINVAL; +	} + +	if (mode) { +		/* video1 (= CON1 camera) expect 24MHz */ +		clk_set_rate(mclk, clk_round_rate(mclk, 24000000)); +		clk_enable(mclk); +		gpio_direction_output(GPIO_PORT158, 1); +	} else { +		gpio_direction_output(GPIO_PORT158, 0); +		clk_disable(mclk); +	} + +	clk_put(mclk); + +	return 0; +} + +static struct i2c_board_info i2c_camera_mt9t111 = { +	I2C_BOARD_INFO("mt9t112", 0x3d), +}; + +static struct mt9t112_camera_info mt9t111_info = { +	.divider = { 16, 0, 0, 7, 0, 10, 14, 7, 7 }, +}; + +static struct soc_camera_link mt9t111_link = { +	.i2c_adapter_id	= 0, +	.bus_id		= 0, +	.board_info	= &i2c_camera_mt9t111, +	.power		= mt9t111_power, +	.priv		= &mt9t111_info, +}; + +static struct platform_device camera_device = { +	.name	= "soc-camera-pdrv", +	.id	= 0, +	.dev	= { +		.platform_data = &mt9t111_link, +	}, +}; + +/* CEU0 */ +static struct sh_mobile_ceu_info sh_mobile_ceu0_info = { +	.flags = SH_CEU_FLAG_LOWER_8BIT, +}; + +static struct resource ceu0_resources[] = { +	[0] = { +		.name	= "CEU", +		.start	= 0xfe910000, +		.end	= 0xfe91009f, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start  = intcs_evt2irq(0x0500), +		.flags  = IORESOURCE_IRQ, +	}, +	[2] = { +		/* place holder for contiguous memory */ +	}, +}; + +static struct platform_device ceu0_device = { +	.name		= "sh_mobile_ceu", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(ceu0_resources), +	.resource	= ceu0_resources, +	.dev	= { +		.platform_data		= &sh_mobile_ceu0_info, +		.coherent_dma_mask	= 0xffffffff, +	}, +}; + +/* FSI */ +static int fsi_hdmi_set_rate(struct device *dev, int rate, int enable) +{ +	struct clk *fsib; +	int ret; + +	/* it support 48KHz only */ +	if (48000 != rate) +		return -EINVAL; + +	fsib = clk_get(dev, "ickb"); +	if (IS_ERR(fsib)) +		return -EINVAL; + +	if (enable) { +		ret = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64; +		clk_enable(fsib); +	} else { +		ret = 0; +		clk_disable(fsib); +	} + +	clk_put(fsib); + +	return ret; +} + +static struct sh_fsi_platform_info fsi_info = { +	/* FSI-WM8978 */ +	.port_a = { +		.tx_id = SHDMA_SLAVE_FSIA_TX, +	}, +	/* FSI-HDMI */ +	.port_b = { +		.flags		= SH_FSI_FMT_SPDIF | +				  SH_FSI_ENABLE_STREAM_MODE, +		.set_rate	= fsi_hdmi_set_rate, +		.tx_id		= SHDMA_SLAVE_FSIB_TX, +	} +}; + +static struct resource fsi_resources[] = { +	[0] = { +		.name	= "FSI", +		.start	= 0xfe1f0000, +		.end	= 0xfe1f8400 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start  = evt2irq(0x1840), +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct platform_device fsi_device = { +	.name		= "sh_fsi2", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(fsi_resources), +	.resource	= fsi_resources, +	.dev	= { +		.platform_data	= &fsi_info, +	}, +}; + +/* FSI-WM8978 */ +static struct asoc_simple_dai_init_info fsi_wm8978_init_info = { +	.fmt		= SND_SOC_DAIFMT_I2S, +	.codec_daifmt	= SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_NB_NF, +	.cpu_daifmt	= SND_SOC_DAIFMT_CBS_CFS, +	.sysclk		= 12288000, +}; + +static struct asoc_simple_card_info fsi_wm8978_info = { +	.name		= "wm8978", +	.card		= "FSI2A-WM8978", +	.cpu_dai	= "fsia-dai", +	.codec		= "wm8978.0-001a", +	.platform	= "sh_fsi2", +	.codec_dai	= "wm8978-hifi", +	.init		= &fsi_wm8978_init_info, +}; + +static struct platform_device fsi_wm8978_device = { +	.name	= "asoc-simple-card", +	.id	= 0, +	.dev	= { +		.platform_data	= &fsi_wm8978_info, +	}, +}; + +/* FSI-HDMI */ +static struct asoc_simple_dai_init_info fsi2_hdmi_init_info = { +	.cpu_daifmt	= SND_SOC_DAIFMT_CBM_CFM, +}; + +static struct asoc_simple_card_info fsi2_hdmi_info = { +	.name		= "HDMI", +	.card		= "FSI2B-HDMI", +	.cpu_dai	= "fsib-dai", +	.codec		= "sh-mobile-hdmi", +	.platform	= "sh_fsi2", +	.codec_dai	= "sh_mobile_hdmi-hifi", +	.init		= &fsi2_hdmi_init_info, +}; + +static struct platform_device fsi_hdmi_device = { +	.name	= "asoc-simple-card", +	.id	= 1, +	.dev	= { +		.platform_data	= &fsi2_hdmi_info, +	}, +}; +  /* I2C */  static struct i2c_board_info i2c0_devices[] = {  	{  		I2C_BOARD_INFO("st1232-ts", 0x55),  		.irq = evt2irq(0x0340),  	}, +	{ +		I2C_BOARD_INFO("wm8978", 0x1a), +	},  };  /* @@ -549,6 +896,13 @@ static struct platform_device *eva_devices[] __initdata = {  	&sh_eth_device,  	&sdhi0_device,  	&sh_mmcif_device, +	&hdmi_device, +	&hdmi_lcdc_device, +	&camera_device, +	&ceu0_device, +	&fsi_device, +	&fsi_hdmi_device, +	&fsi_wm8978_device,  };  static void __init eva_clock_init(void) @@ -556,10 +910,14 @@ static void __init eva_clock_init(void)  	struct clk *system	= clk_get(NULL, "system_clk");  	struct clk *xtal1	= clk_get(NULL, "extal1");  	struct clk *usb24s	= clk_get(NULL, "usb24s"); +	struct clk *fsibck	= clk_get(NULL, "fsibck"); +	struct clk *fsib	= clk_get(&fsi_device.dev, "ickb");  	if (IS_ERR(system)	||  	    IS_ERR(xtal1)	|| -	    IS_ERR(usb24s)) { +	    IS_ERR(usb24s)	|| +	    IS_ERR(fsibck)	|| +	    IS_ERR(fsib)) {  		pr_err("armadillo800eva board clock init failed\n");  		goto clock_error;  	} @@ -570,6 +928,11 @@ static void __init eva_clock_init(void)  	/* usb24s use extal1 (= system) clock (= 24MHz) */  	clk_set_parent(usb24s, system); +	/* FSIBCK is 12.288MHz, and it is parent of FSI-B */ +	clk_set_parent(fsib, fsibck); +	clk_set_rate(fsibck, 12288000); +	clk_set_rate(fsib,   12288000); +  clock_error:  	if (!IS_ERR(system))  		clk_put(system); @@ -577,16 +940,26 @@ clock_error:  		clk_put(xtal1);  	if (!IS_ERR(usb24s))  		clk_put(usb24s); +	if (!IS_ERR(fsibck)) +		clk_put(fsibck); +	if (!IS_ERR(fsib)) +		clk_put(fsib);  }  /*   * board init   */ +#define GPIO_PORT7CR	0xe6050007 +#define GPIO_PORT8CR	0xe6050008  static void __init eva_init(void)  { -	eva_clock_init(); +	struct platform_device *usb = NULL; + +	regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers, +				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000);  	r8a7740_pinmux_init(); +	r8a7740_meram_workaround();  	/* SCIFA1 */  	gpio_request(GPIO_FN_SCIFA1_RXD, NULL); @@ -667,8 +1040,19 @@ static void __init eva_init(void)  		/* USB Host */  	} else {  		/* USB Func */ -		gpio_request(GPIO_FN_VBUS, NULL); +		/* +		 * A1 chip has 2 IRQ7 pin and it was controled by MSEL register. +		 * OTOH, usbhs interrupt needs its value (HI/LOW) to decide +		 * USB connection/disconnection (usbhsf_get_vbus()). +		 * This means we needs to select GPIO_FN_IRQ7_PORT209 first, +		 * and select GPIO_PORT209 here +		 */ +		gpio_request(GPIO_FN_IRQ7_PORT209, NULL); +		gpio_request(GPIO_PORT209, NULL); +		gpio_direction_input(GPIO_PORT209); +  		platform_device_register(&usbhsf_device); +		usb = &usbhsf_device;  	}  	/* SDHI0 */ @@ -706,6 +1090,48 @@ static void __init eva_init(void)  	gpio_request(GPIO_FN_MMC1_D6_PORT143,	NULL);  	gpio_request(GPIO_FN_MMC1_D7_PORT142,	NULL); +	/* CEU0 */ +	gpio_request(GPIO_FN_VIO0_D7,		NULL); +	gpio_request(GPIO_FN_VIO0_D6,		NULL); +	gpio_request(GPIO_FN_VIO0_D5,		NULL); +	gpio_request(GPIO_FN_VIO0_D4,		NULL); +	gpio_request(GPIO_FN_VIO0_D3,		NULL); +	gpio_request(GPIO_FN_VIO0_D2,		NULL); +	gpio_request(GPIO_FN_VIO0_D1,		NULL); +	gpio_request(GPIO_FN_VIO0_D0,		NULL); +	gpio_request(GPIO_FN_VIO0_CLK,		NULL); +	gpio_request(GPIO_FN_VIO0_HD,		NULL); +	gpio_request(GPIO_FN_VIO0_VD,		NULL); +	gpio_request(GPIO_FN_VIO0_FIELD,	NULL); +	gpio_request(GPIO_FN_VIO_CKO,		NULL); + +	/* CON1/CON15 Camera */ +	gpio_request(GPIO_PORT173, NULL); /* STANDBY */ +	gpio_request(GPIO_PORT172, NULL); /* RST */ +	gpio_request(GPIO_PORT158, NULL); /* CAM_PON */ +	gpio_direction_output(GPIO_PORT173, 0); +	gpio_direction_output(GPIO_PORT172, 1); +	gpio_direction_output(GPIO_PORT158, 0); /* see mt9t111_power() */ + +	/* FSI-WM8978 */ +	gpio_request(GPIO_FN_FSIAIBT,		NULL); +	gpio_request(GPIO_FN_FSIAILR,		NULL); +	gpio_request(GPIO_FN_FSIAOMC,		NULL); +	gpio_request(GPIO_FN_FSIAOSLD,		NULL); +	gpio_request(GPIO_FN_FSIAISLD_PORT5,	NULL); + +	gpio_request(GPIO_PORT7, NULL); +	gpio_request(GPIO_PORT8, NULL); +	gpio_direction_none(GPIO_PORT7CR); /* FSIAOBT needs no direction */ +	gpio_direction_none(GPIO_PORT8CR); /* FSIAOLR needs no direction */ + +	/* FSI-HDMI */ +	gpio_request(GPIO_FN_FSIBCK,		NULL); + +	/* HDMI */ +	gpio_request(GPIO_FN_HDMI_HPD,		NULL); +	gpio_request(GPIO_FN_HDMI_CEC,		NULL); +  	/*  	 * CAUTION  	 * @@ -752,6 +1178,13 @@ static void __init eva_init(void)  	platform_add_devices(eva_devices,  			     ARRAY_SIZE(eva_devices)); + +	eva_clock_init(); + +	rmobile_add_device_to_domain(&r8a7740_pd_a4lc, &lcdc0_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a4lc, &hdmi_lcdc_device); +	if (usb) +		rmobile_add_device_to_domain(&r8a7740_pd_a3sp, usb);  }  static void __init eva_earlytimer_init(void) diff --git a/arch/arm/mach-shmobile/board-bonito.c b/arch/arm/mach-shmobile/board-bonito.c index e9b32cfbf74..4129008eae2 100644 --- a/arch/arm/mach-shmobile/board-bonito.c +++ b/arch/arm/mach-shmobile/board-bonito.c @@ -26,6 +26,8 @@  #include <linux/irq.h>  #include <linux/platform_device.h>  #include <linux/gpio.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <linux/videodev2.h>  #include <mach/common.h> @@ -75,6 +77,12 @@   * S38.2 = OFF   */ +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  /*   * FPGA   */ @@ -360,6 +368,8 @@ static void __init bonito_init(void)  {  	u16 val; +	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	r8a7740_pinmux_init();  	bonito_fpga_init(); diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c index f1257321999..fa5dfc5c8ed 100644 --- a/arch/arm/mach-shmobile/board-g4evm.c +++ b/arch/arm/mach-shmobile/board-g4evm.c @@ -26,6 +26,8 @@  #include <linux/mtd/mtd.h>  #include <linux/mtd/partitions.h>  #include <linux/mtd/physmap.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/usb/r8a66597.h>  #include <linux/io.h>  #include <linux/input.h> @@ -196,6 +198,15 @@ static struct platform_device keysc_device = {  	},  }; +/* Fixed 3.3V regulator to be used by SDHI0 and SDHI1 */ +static struct regulator_consumer_supply fixed3v3_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), +}; +  /* SDHI */  static struct sh_mobile_sdhi_info sdhi0_info = {  	.tmio_caps	= MMC_CAP_SDIO_IRQ, @@ -271,26 +282,11 @@ static struct platform_device *g4evm_devices[] __initdata = {  #define GPIO_SDHID1_D3	0xe6052106  #define GPIO_SDHICMD1	0xe6052107 -/* - * FIXME !! - * - * gpio_pull_up is quick_hack. - * - * current gpio frame work doesn't have - * the method to control only pull up/down/free. - * this function should be replaced by correct gpio function - */ -static void __init gpio_pull_up(u32 addr) -{ -	u8 data = __raw_readb(addr); - -	data &= 0x0F; -	data |= 0xC0; -	__raw_writeb(data, addr); -} -  static void __init g4evm_init(void)  { +	regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers, +				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000); +  	sh7377_pinmux_init();  	/* Lit DS14 LED */ @@ -351,11 +347,11 @@ static void __init g4evm_init(void)  	gpio_request(GPIO_FN_SDHID0_3, NULL);  	gpio_request(GPIO_FN_SDHICMD0, NULL);  	gpio_request(GPIO_FN_SDHIWP0, NULL); -	gpio_pull_up(GPIO_SDHID0_D0); -	gpio_pull_up(GPIO_SDHID0_D1); -	gpio_pull_up(GPIO_SDHID0_D2); -	gpio_pull_up(GPIO_SDHID0_D3); -	gpio_pull_up(GPIO_SDHICMD0); +	gpio_request_pullup(GPIO_SDHID0_D0); +	gpio_request_pullup(GPIO_SDHID0_D1); +	gpio_request_pullup(GPIO_SDHID0_D2); +	gpio_request_pullup(GPIO_SDHID0_D3); +	gpio_request_pullup(GPIO_SDHICMD0);  	/* SDHI1 */  	gpio_request(GPIO_FN_SDHICLK1, NULL); @@ -364,11 +360,11 @@ static void __init g4evm_init(void)  	gpio_request(GPIO_FN_SDHID1_2, NULL);  	gpio_request(GPIO_FN_SDHID1_3, NULL);  	gpio_request(GPIO_FN_SDHICMD1, NULL); -	gpio_pull_up(GPIO_SDHID1_D0); -	gpio_pull_up(GPIO_SDHID1_D1); -	gpio_pull_up(GPIO_SDHID1_D2); -	gpio_pull_up(GPIO_SDHID1_D3); -	gpio_pull_up(GPIO_SDHICMD1); +	gpio_request_pullup(GPIO_SDHID1_D0); +	gpio_request_pullup(GPIO_SDHID1_D1); +	gpio_request_pullup(GPIO_SDHID1_D2); +	gpio_request_pullup(GPIO_SDHID1_D3); +	gpio_request_pullup(GPIO_SDHICMD1);  	sh7377_add_standard_devices(); diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index f60f1b281cc..21dbe54304d 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c @@ -27,6 +27,8 @@  #include <linux/platform_device.h>  #include <linux/delay.h>  #include <linux/io.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <linux/gpio.h>  #include <linux/input.h> @@ -49,6 +51,12 @@  #include <asm/hardware/cache-l2x0.h>  #include <asm/traps.h> +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  /* SMSC 9220 */  static struct resource smsc9220_resources[] = {  	[0] = { @@ -288,6 +296,13 @@ static struct platform_device leds_tpu30_device = {  	.resource	= tpu30_resources,  }; +/* Fixed 1.8V regulator to be used by MMCIF */ +static struct regulator_consumer_supply fixed1v8_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), +}; +  /* MMCIF */  static struct resource mmcif_resources[] = {  	[0] = { @@ -321,6 +336,15 @@ static struct platform_device mmcif_device = {  	.resource       = mmcif_resources,  }; +/* Fixed 3.3V regulator to be used by SDHI0 and SDHI1 */ +static struct regulator_consumer_supply fixed3v3_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), +}; +  /* SDHI0 */  static struct sh_mobile_sdhi_info sdhi0_info = {  	.tmio_caps      = MMC_CAP_SD_HIGHSPEED, @@ -411,6 +435,12 @@ static struct platform_device *kota2_devices[] __initdata = {  static void __init kota2_init(void)  { +	regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers, +				     ARRAY_SIZE(fixed1v8_power_consumers), 1800000); +	regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers, +				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000); +	regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	sh73a0_pinmux_init();  	/* SCIFA2 (UART2) */ diff --git a/arch/arm/mach-shmobile/board-kzm9d.c b/arch/arm/mach-shmobile/board-kzm9d.c index 6a33cf39342..2c986eaae7b 100644 --- a/arch/arm/mach-shmobile/board-kzm9d.c +++ b/arch/arm/mach-shmobile/board-kzm9d.c @@ -21,6 +21,8 @@  #include <linux/kernel.h>  #include <linux/interrupt.h>  #include <linux/platform_device.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <mach/common.h>  #include <mach/emev2.h> @@ -28,6 +30,12 @@  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  /* Ether */  static struct resource smsc911x_resources[] = {  	[0] = { @@ -63,6 +71,8 @@ static struct platform_device *kzm9d_devices[] __initdata = {  void __init kzm9d_add_standard_devices(void)  { +	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	emev2_add_standard_devices();  	platform_add_devices(kzm9d_devices, ARRAY_SIZE(kzm9d_devices)); diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c index c0ae815e7be..53b7ea92c32 100644 --- a/arch/arm/mach-shmobile/board-kzm9g.c +++ b/arch/arm/mach-shmobile/board-kzm9g.c @@ -30,9 +30,14 @@  #include <linux/mmc/sh_mobile_sdhi.h>  #include <linux/mfd/tmio.h>  #include <linux/platform_device.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <linux/usb/r8a66597.h> +#include <linux/usb/renesas_usbhs.h>  #include <linux/videodev2.h> +#include <sound/sh_fsi.h> +#include <sound/simple_card.h>  #include <mach/irqs.h>  #include <mach/sh73a0.h>  #include <mach/common.h> @@ -54,6 +59,20 @@  #define GPIO_PCF8575_PORT15	(GPIO_NR + 13)  #define GPIO_PCF8575_PORT16	(GPIO_NR + 14) +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; + +/* + * FSI-AK4648 + * + * this command is required when playback. + * + * # amixer set "LINEOUT Mixer DACL" on + */ +  /* SMSC 9221 */  static struct resource smsc9221_resources[] = {  	[0] = { @@ -112,6 +131,151 @@ static struct platform_device usb_host_device = {  	.resource	= usb_resources,  }; +/* USB Func CN17 */ +struct usbhs_private { +	unsigned int phy; +	unsigned int cr2; +	struct renesas_usbhs_platform_info info; +}; + +#define IRQ15			intcs_evt2irq(0x03e0) +#define USB_PHY_MODE		(1 << 4) +#define USB_PHY_INT_EN		((1 << 3) | (1 << 2)) +#define USB_PHY_ON		(1 << 1) +#define USB_PHY_OFF		(1 << 0) +#define USB_PHY_INT_CLR		(USB_PHY_ON | USB_PHY_OFF) + +#define usbhs_get_priv(pdev) \ +	container_of(renesas_usbhs_get_info(pdev), struct usbhs_private, info) + +static int usbhs_get_vbus(struct platform_device *pdev) +{ +	struct usbhs_private *priv = usbhs_get_priv(pdev); + +	return !((1 << 7) & __raw_readw(priv->cr2)); +} + +static void usbhs_phy_reset(struct platform_device *pdev) +{ +	struct usbhs_private *priv = usbhs_get_priv(pdev); + +	/* init phy */ +	__raw_writew(0x8a0a, priv->cr2); +} + +static int usbhs_get_id(struct platform_device *pdev) +{ +	return USBHS_GADGET; +} + +static irqreturn_t usbhs_interrupt(int irq, void *data) +{ +	struct platform_device *pdev = data; +	struct usbhs_private *priv = usbhs_get_priv(pdev); + +	renesas_usbhs_call_notify_hotplug(pdev); + +	/* clear status */ +	__raw_writew(__raw_readw(priv->phy) | USB_PHY_INT_CLR, priv->phy); + +	return IRQ_HANDLED; +} + +static int usbhs_hardware_init(struct platform_device *pdev) +{ +	struct usbhs_private *priv = usbhs_get_priv(pdev); +	int ret; + +	/* clear interrupt status */ +	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy); + +	ret = request_irq(IRQ15, usbhs_interrupt, IRQF_TRIGGER_HIGH, +			  dev_name(&pdev->dev), pdev); +	if (ret) { +		dev_err(&pdev->dev, "request_irq err\n"); +		return ret; +	} + +	/* enable USB phy interrupt */ +	__raw_writew(USB_PHY_MODE | USB_PHY_INT_EN, priv->phy); + +	return 0; +} + +static void usbhs_hardware_exit(struct platform_device *pdev) +{ +	struct usbhs_private *priv = usbhs_get_priv(pdev); + +	/* clear interrupt status */ +	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy); + +	free_irq(IRQ15, pdev); +} + +static u32 usbhs_pipe_cfg[] = { +	USB_ENDPOINT_XFER_CONTROL, +	USB_ENDPOINT_XFER_ISOC, +	USB_ENDPOINT_XFER_ISOC, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_INT, +	USB_ENDPOINT_XFER_INT, +	USB_ENDPOINT_XFER_INT, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +	USB_ENDPOINT_XFER_BULK, +}; + +static struct usbhs_private usbhs_private = { +	.phy	= 0xe60781e0,		/* USBPHYINT */ +	.cr2	= 0xe605810c,		/* USBCR2 */ +	.info = { +		.platform_callback = { +			.hardware_init	= usbhs_hardware_init, +			.hardware_exit	= usbhs_hardware_exit, +			.get_id		= usbhs_get_id, +			.phy_reset	= usbhs_phy_reset, +			.get_vbus	= usbhs_get_vbus, +		}, +		.driver_param = { +			.buswait_bwait	= 4, +			.has_otg	= 1, +			.pipe_type	= usbhs_pipe_cfg, +			.pipe_size	= ARRAY_SIZE(usbhs_pipe_cfg), +		}, +	}, +}; + +static struct resource usbhs_resources[] = { +	[0] = { +		.start	= 0xE6890000, +		.end	= 0xE68900e6 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= gic_spi(62), +		.end	= gic_spi(62), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device usbhs_device = { +	.name	= "renesas_usbhs", +	.id	= -1, +	.dev = { +		.dma_mask		= NULL, +		.coherent_dma_mask	= 0xffffffff, +		.platform_data		= &usbhs_private.info, +	}, +	.num_resources	= ARRAY_SIZE(usbhs_resources), +	.resource	= usbhs_resources, +}; +  /* LCDC */  static struct fb_videomode kzm_lcdc_mode = {  	.name		= "WVGA Panel", @@ -166,6 +330,13 @@ static struct platform_device lcdc_device = {  	},  }; +/* Fixed 1.8V regulator to be used by MMCIF */ +static struct regulator_consumer_supply fixed1v8_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), +}; +  /* MMCIF */  static struct resource sh_mmcif_resources[] = {  	[0] = { @@ -187,6 +358,8 @@ static struct resource sh_mmcif_resources[] = {  static struct sh_mmcif_plat_data sh_mmcif_platdata = {  	.ocr		= MMC_VDD_165_195,  	.caps		= MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, +	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX, +	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,  };  static struct platform_device mmc_device = { @@ -200,6 +373,15 @@ static struct platform_device mmc_device = {  	.resource	= sh_mmcif_resources,  }; +/* Fixed 2.8V regulators to be used by SDHI0 and SDHI2 */ +static struct regulator_consumer_supply fixed2v8_power_consumers[] = +{ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.2"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.2"), +}; +  /* SDHI */  static struct sh_mobile_sdhi_info sdhi0_info = {  	.tmio_flags	= TMIO_MMC_HAS_IDLE_WAIT, @@ -240,6 +422,50 @@ static struct platform_device sdhi0_device = {  	},  }; +/* Micro SD */ +static struct sh_mobile_sdhi_info sdhi2_info = { +	.tmio_flags	= TMIO_MMC_HAS_IDLE_WAIT | +			  TMIO_MMC_USE_GPIO_CD | +			  TMIO_MMC_WRPROTECT_DISABLE, +	.tmio_caps	= MMC_CAP_SD_HIGHSPEED, +	.tmio_ocr_mask	= MMC_VDD_27_28 | MMC_VDD_28_29, +	.cd_gpio	= GPIO_PORT13, +}; + +static struct resource sdhi2_resources[] = { +	[0] = { +		.name	= "SDHI2", +		.start	= 0xee140000, +		.end	= 0xee1400ff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.name	= SH_MOBILE_SDHI_IRQ_CARD_DETECT, +		.start	= gic_spi(103), +		.flags	= IORESOURCE_IRQ, +	}, +	[2] = { +		.name	= SH_MOBILE_SDHI_IRQ_SDCARD, +		.start	= gic_spi(104), +		.flags	= IORESOURCE_IRQ, +	}, +	[3] = { +		.name	= SH_MOBILE_SDHI_IRQ_SDIO, +		.start	= gic_spi(105), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device sdhi2_device = { +	.name		= "sh_mobile_sdhi", +	.id		= 2, +	.num_resources	= ARRAY_SIZE(sdhi2_resources), +	.resource	= sdhi2_resources, +	.dev	= { +		.platform_data	= &sdhi2_info, +	}, +}; +  /* KEY */  #define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 } @@ -267,11 +493,74 @@ static struct platform_device gpio_keys_device = {  	},  }; +/* FSI-AK4648 */ +static struct sh_fsi_platform_info fsi_info = { +	.port_a = { +		.tx_id = SHDMA_SLAVE_FSI2A_TX, +	}, +}; + +static struct resource fsi_resources[] = { +	[0] = { +		.name	= "FSI", +		.start	= 0xEC230000, +		.end	= 0xEC230400 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start  = gic_spi(146), +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct platform_device fsi_device = { +	.name		= "sh_fsi2", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(fsi_resources), +	.resource	= fsi_resources, +	.dev	= { +		.platform_data	= &fsi_info, +	}, +}; + +static struct asoc_simple_dai_init_info fsi2_ak4648_init_info = { +	.fmt		= SND_SOC_DAIFMT_LEFT_J, +	.codec_daifmt	= SND_SOC_DAIFMT_CBM_CFM, +	.cpu_daifmt	= SND_SOC_DAIFMT_CBS_CFS, +	.sysclk		= 11289600, +}; + +static struct asoc_simple_card_info fsi2_ak4648_info = { +	.name		= "AK4648", +	.card		= "FSI2A-AK4648", +	.cpu_dai	= "fsia-dai", +	.codec		= "ak4642-codec.0-0012", +	.platform	= "sh_fsi2", +	.codec_dai	= "ak4642-hifi", +	.init		= &fsi2_ak4648_init_info, +}; + +static struct platform_device fsi_ak4648_device = { +	.name	= "asoc-simple-card", +	.dev	= { +		.platform_data	= &fsi2_ak4648_info, +	}, +}; +  /* I2C */  static struct pcf857x_platform_data pcf8575_pdata = {  	.gpio_base	= GPIO_PCF8575_BASE,  }; +static struct i2c_board_info i2c0_devices[] = { +	{ +		I2C_BOARD_INFO("ak4648", 0x12), +	}, +	{ +		I2C_BOARD_INFO("r2025sd", 0x32), +	} +}; +  static struct i2c_board_info i2c1_devices[] = {  	{  		I2C_BOARD_INFO("st1232-ts", 0x55), @@ -289,10 +578,14 @@ static struct i2c_board_info i2c3_devices[] = {  static struct platform_device *kzm_devices[] __initdata = {  	&smsc_device,  	&usb_host_device, +	&usbhs_device,  	&lcdc_device,  	&mmc_device,  	&sdhi0_device, +	&sdhi2_device,  	&gpio_keys_device, +	&fsi_device, +	&fsi_ak4648_device,  };  /* @@ -350,6 +643,12 @@ device_initcall(as3711_enable_lcdc_backlight);  static void __init kzm_init(void)  { +	regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers, +				     ARRAY_SIZE(fixed1v8_power_consumers), 1800000); +	regulator_register_always_on(1, "fixed-2.8V", fixed2v8_power_consumers, +				     ARRAY_SIZE(fixed2v8_power_consumers), 2800000); +	regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	sh73a0_pinmux_init();  	/* enable SCIFA4 */ @@ -427,15 +726,36 @@ static void __init kzm_init(void)  	gpio_request(GPIO_PORT15, NULL);  	gpio_direction_output(GPIO_PORT15, 1); /* power */ +	/* enable Micro SD */ +	gpio_request(GPIO_FN_SDHID2_0,		NULL); +	gpio_request(GPIO_FN_SDHID2_1,		NULL); +	gpio_request(GPIO_FN_SDHID2_2,		NULL); +	gpio_request(GPIO_FN_SDHID2_3,		NULL); +	gpio_request(GPIO_FN_SDHICMD2,		NULL); +	gpio_request(GPIO_FN_SDHICLK2,		NULL); +	gpio_request(GPIO_PORT14, NULL); +	gpio_direction_output(GPIO_PORT14, 1); /* power */ +  	/* I2C 3 */  	gpio_request(GPIO_FN_PORT27_I2C_SCL3, NULL);  	gpio_request(GPIO_FN_PORT28_I2C_SDA3, NULL); +	/* enable FSI2 port A (ak4648) */ +	gpio_request(GPIO_FN_FSIACK,	NULL); +	gpio_request(GPIO_FN_FSIAILR,	NULL); +	gpio_request(GPIO_FN_FSIAIBT,	NULL); +	gpio_request(GPIO_FN_FSIAISLD,	NULL); +	gpio_request(GPIO_FN_FSIAOSLD,	NULL); + +	/* enable USB */ +	gpio_request(GPIO_FN_VBUS_0,	NULL); +  #ifdef CONFIG_CACHE_L2X0  	/* Early BRESP enable, Shared attribute override enable, 64K*8way */  	l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);  #endif +	i2c_register_board_info(0, i2c0_devices, ARRAY_SIZE(i2c0_devices));  	i2c_register_board_info(1, i2c1_devices, ARRAY_SIZE(i2c1_devices));  	i2c_register_board_info(3, i2c3_devices, ARRAY_SIZE(i2c3_devices)); diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 150122a4463..7ea2b31e319 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -41,6 +41,8 @@  #include <linux/mtd/physmap.h>  #include <linux/mtd/sh_flctl.h>  #include <linux/pm_clock.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <linux/sh_intc.h>  #include <linux/tca6416_keypad.h> @@ -203,31 +205,32 @@   * amixer set "HPOUTR Mixer DACH" on   */ -/* - * FIXME !! - * - * gpio_no_direction - * gpio_pull_down - * are quick_hack. - * - * current gpio frame work doesn't have - * the method to control only pull up/down/free. - * this function should be replaced by correct gpio function - */ -static void __init gpio_no_direction(u32 addr) +/* Fixed 3.3V and 1.8V regulators to be used by multiple devices */ +static struct regulator_consumer_supply fixed1v8_power_consumers[] =  { -	__raw_writeb(0x00, addr); -} +	/* +	 * J22 on mackerel switches mmcif.0 and sdhi.1 between 1.8V and 3.3V +	 * Since we cannot support both voltages, we support the default 1.8V +	 */ +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), +	REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), +}; -static void __init gpio_pull_down(u32 addr) +static struct regulator_consumer_supply fixed3v3_power_consumers[] =  { -	u8 data = __raw_readb(addr); - -	data &= 0x0F; -	data |= 0xA0; +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), +	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.2"), +	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.2"), +}; -	__raw_writeb(data, addr); -} +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +};  /* MTD */  static struct mtd_partition nor_flash_partitions[] = { @@ -1409,6 +1412,12 @@ static void __init mackerel_init(void)  	u32 srcr4;  	struct clk *clk; +	regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers, +				     ARRAY_SIZE(fixed1v8_power_consumers), 1800000); +	regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers, +				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000); +	regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	/* External clock source */  	clk_set_rate(&sh7372_dv_clki_clk, 27000000); @@ -1458,11 +1467,11 @@ static void __init mackerel_init(void)  	/* USBHS0 */  	gpio_request(GPIO_FN_VBUS0_0, NULL); -	gpio_pull_down(GPIO_PORT168CR); /* VBUS0_0 pull down */ +	gpio_request_pulldown(GPIO_PORT168CR); /* VBUS0_0 pull down */  	/* USBHS1 */  	gpio_request(GPIO_FN_VBUS0_1, NULL); -	gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ +	gpio_request_pulldown(GPIO_PORT167CR); /* VBUS0_1 pull down */  	gpio_request(GPIO_FN_IDIN_1_113, NULL);  	/* enable FSI2 port A (ak4643) */ @@ -1475,8 +1484,8 @@ static void __init mackerel_init(void)  	gpio_request(GPIO_PORT9,  NULL);  	gpio_request(GPIO_PORT10, NULL); -	gpio_no_direction(GPIO_PORT9CR);  /* FSIAOBT needs no direction */ -	gpio_no_direction(GPIO_PORT10CR); /* FSIAOLR needs no direction */ +	gpio_direction_none(GPIO_PORT9CR);  /* FSIAOBT needs no direction */ +	gpio_direction_none(GPIO_PORT10CR); /* FSIAOLR needs no direction */  	intc_set_priority(IRQ_FSI, 3); /* irq priority FSI(3) > SMSC911X(2) */ @@ -1614,20 +1623,20 @@ static void __init mackerel_init(void)  	platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices)); -	sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device); -	sh7372_add_device_to_domain(&sh7372_a4lc, &hdmi_lcdc_device); -	sh7372_add_device_to_domain(&sh7372_a4lc, &meram_device); -	sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs0_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs1_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &nand_flash_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &sh_mmcif_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4lc, &lcdc_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4lc, &hdmi_lcdc_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4lc, &meram_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4mp, &fsi_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &usbhs0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &usbhs1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &nand_flash_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &sh_mmcif_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &sdhi0_device);  #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) -	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &sdhi1_device);  #endif -	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi2_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &ceu_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &sdhi2_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &ceu_device);  	hdmi_init_pm_clock();  	sh7372_pm_init(); diff --git a/arch/arm/mach-shmobile/board-marzen.c b/arch/arm/mach-shmobile/board-marzen.c index 14de3787caf..3a528cf4366 100644 --- a/arch/arm/mach-shmobile/board-marzen.c +++ b/arch/arm/mach-shmobile/board-marzen.c @@ -27,6 +27,8 @@  #include <linux/io.h>  #include <linux/gpio.h>  #include <linux/dma-mapping.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <mach/hardware.h>  #include <mach/r8a7779.h> @@ -37,6 +39,12 @@  #include <asm/hardware/gic.h>  #include <asm/traps.h> +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  /* SMSC LAN89218 */  static struct resource smsc911x_resources[] = {  	[0] = { @@ -73,6 +81,8 @@ static struct platform_device *marzen_devices[] __initdata = {  static void __init marzen_init(void)  { +	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +  	r8a7779_pinmux_init();  	/* SCIF2 (CN18: DEBUG0) */ diff --git a/arch/arm/mach-shmobile/clock-r8a7740.c b/arch/arm/mach-shmobile/clock-r8a7740.c index 26eea5f2105..ad5fccc7b5e 100644 --- a/arch/arm/mach-shmobile/clock-r8a7740.c +++ b/arch/arm/mach-shmobile/clock-r8a7740.c @@ -43,7 +43,10 @@  /* CPG registers */  #define FRQCRA		0xe6150000  #define FRQCRB		0xe6150004 +#define VCLKCR1		0xE6150008 +#define VCLKCR2		0xE615000c  #define FRQCRC		0xe61500e0 +#define FSIACKCR	0xe6150018  #define PLLC01CR	0xe6150028  #define SUBCKCR		0xe6150080 @@ -54,6 +57,8 @@  #define MSTPSR2		0xe6150040  #define MSTPSR3		0xe6150048  #define MSTPSR4		0xe615004c +#define FSIBCKCR	0xe6150090 +#define HDMICKCR	0xe6150094  #define SMSTPCR0	0xe6150130  #define SMSTPCR1	0xe6150134  #define SMSTPCR2	0xe6150138 @@ -271,6 +276,13 @@ static struct clk usb24_clk = {  	.parent		= &usb24s_clk,  }; +/* External FSIACK/FSIBCK clock */ +static struct clk fsiack_clk = { +}; + +static struct clk fsibck_clk = { +}; +  struct clk *main_clks[] = {  	&extalr_clk,  	&extal1_clk, @@ -288,6 +300,8 @@ struct clk *main_clks[] = {  	&pllc1_div2_clk,  	&usb24s_clk,  	&usb24_clk, +	&fsiack_clk, +	&fsibck_clk,  };  static void div4_kick(struct clk *clk) @@ -313,6 +327,107 @@ static struct clk_div4_table div4_table = {  	.kick = div4_kick,  }; +/* DIV6 reparent */ +enum { +	DIV6_HDMI, +	DIV6_VCLK1, DIV6_VCLK2, +	DIV6_FSIA, DIV6_FSIB, +	DIV6_REPARENT_NR, +}; + +static struct clk *hdmi_parent[] = { +	[0] = &pllc1_div2_clk, +	[1] = &system_clk, +	[2] = &dv_clk +}; + +static struct clk *vclk_parents[8] = { +	[0] = &pllc1_div2_clk, +	[2] = &dv_clk, +	[3] = &usb24s_clk, +	[4] = &extal1_div2_clk, +	[5] = &extalr_clk, +}; + +static struct clk *fsia_parents[] = { +	[0] = &pllc1_div2_clk, +	[1] = &fsiack_clk, /* external clock */ +}; + +static struct clk *fsib_parents[] = { +	[0] = &pllc1_div2_clk, +	[1] = &fsibck_clk, /* external clock */ +}; + +static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = { +	[DIV6_HDMI] = SH_CLK_DIV6_EXT(HDMICKCR, 0, +				      hdmi_parent, ARRAY_SIZE(hdmi_parent), 6, 2), +	[DIV6_VCLK1] = SH_CLK_DIV6_EXT(VCLKCR1, 0, +				       vclk_parents, ARRAY_SIZE(vclk_parents), 12, 3), +	[DIV6_VCLK2] = SH_CLK_DIV6_EXT(VCLKCR2, 0, +				       vclk_parents, ARRAY_SIZE(vclk_parents), 12, 3), +	[DIV6_FSIA] = SH_CLK_DIV6_EXT(FSIACKCR, 0, +				      fsia_parents, ARRAY_SIZE(fsia_parents), 6, 2), +	[DIV6_FSIB] = SH_CLK_DIV6_EXT(FSIBCKCR, 0, +				      fsib_parents, ARRAY_SIZE(fsib_parents), 6, 2), +}; + +/* HDMI1/2 clock */ +static unsigned long hdmi12_recalc(struct clk *clk) +{ +	u32 val = __raw_readl(HDMICKCR); +	int shift = (int)clk->priv; + +	val >>= shift; +	val &= 0x3; + +	return clk->parent->rate / (1 << val); +}; + +static int hdmi12_set_rate(struct clk *clk, unsigned long rate) +{ +	u32 val, mask; +	int i, shift; + +	for (i = 0; i < 3; i++) +		if (rate == clk->parent->rate / (1 << i)) +			goto find; +	return -ENODEV; + +find: +	shift = (int)clk->priv; + +	val = __raw_readl(HDMICKCR); +	mask = ~(0x3 << shift); +	val = (val & mask) | i << shift; +	__raw_writel(val, HDMICKCR); + +	return 0; +}; + +static struct sh_clk_ops hdmi12_clk_ops = { +	.recalc		= hdmi12_recalc, +	.set_rate	= hdmi12_set_rate, +}; + +static struct clk hdmi1_clk = { +	.ops		= &hdmi12_clk_ops, +	.priv		= (void *)9, +	.parent		= &div6_reparent_clks[DIV6_HDMI],  /* late install */ +}; + +static struct clk hdmi2_clk = { +	.ops		= &hdmi12_clk_ops, +	.priv		= (void *)11, +	.parent		= &div6_reparent_clks[DIV6_HDMI], /* late install */ +}; + +static struct clk *late_main_clks[] = { +	&hdmi1_clk, +	&hdmi2_clk, +}; + +/* MSTP */  enum {  	DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_HP,  	DIV4_HPP, DIV4_USBP, DIV4_S, DIV4_ZB, DIV4_M3, DIV4_CP, @@ -343,11 +458,12 @@ static struct clk div6_clks[DIV6_NR] = {  };  enum { -	MSTP125, +	MSTP128, MSTP127, MSTP125,  	MSTP116, MSTP111, MSTP100, MSTP117,  	MSTP230,  	MSTP222, +	MSTP218, MSTP217, MSTP216, MSTP214,  	MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,  	MSTP329, MSTP328, MSTP323, MSTP320, @@ -360,6 +476,8 @@ enum {  };  static struct clk mstp_clks[MSTP_NR] = { +	[MSTP128] = SH_CLK_MSTP32(&div4_clks[DIV4_S],	SMSTPCR1, 28, 0), /* CEU21 */ +	[MSTP127] = SH_CLK_MSTP32(&div4_clks[DIV4_S],	SMSTPCR1, 27, 0), /* CEU20 */  	[MSTP125] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB],	SMSTPCR1, 25, 0), /* TMU0 */  	[MSTP117] = SH_CLK_MSTP32(&div4_clks[DIV4_B],	SMSTPCR1, 17, 0), /* LCDC1 */  	[MSTP116] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB],	SMSTPCR1, 16, 0), /* IIC0 */ @@ -368,6 +486,10 @@ static struct clk mstp_clks[MSTP_NR] = {  	[MSTP230] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB],	SMSTPCR2, 30, 0), /* SCIFA6 */  	[MSTP222] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB],	SMSTPCR2, 22, 0), /* SCIFA7 */ +	[MSTP218] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR2, 18, 0), /* DMAC1 */ +	[MSTP217] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR2, 17, 0), /* DMAC2 */ +	[MSTP216] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR2, 16, 0), /* DMAC3 */ +	[MSTP214] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR2, 14, 0), /* USBDMAC */  	[MSTP207] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB],	SMSTPCR2,  7, 0), /* SCIFA5 */  	[MSTP206] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB],	SMSTPCR2,  6, 0), /* SCIFB */  	[MSTP204] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB],	SMSTPCR2,  4, 0), /* SCIFA0 */ @@ -408,6 +530,12 @@ static struct clk_lookup lookups[] = {  	CLKDEV_CON_ID("pllc1_clk",		&pllc1_clk),  	CLKDEV_CON_ID("pllc1_div2_clk",		&pllc1_div2_clk),  	CLKDEV_CON_ID("usb24s",			&usb24s_clk), +	CLKDEV_CON_ID("hdmi1",			&hdmi1_clk), +	CLKDEV_CON_ID("hdmi2",			&hdmi2_clk), +	CLKDEV_CON_ID("video1",			&div6_reparent_clks[DIV6_VCLK1]), +	CLKDEV_CON_ID("video2",			&div6_reparent_clks[DIV6_VCLK2]), +	CLKDEV_CON_ID("fsiack",			&fsiack_clk), +	CLKDEV_CON_ID("fsibck",			&fsibck_clk),  	/* DIV4 clocks */  	CLKDEV_CON_ID("i_clk",			&div4_clks[DIV4_I]), @@ -430,6 +558,8 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("i2c-sh_mobile.0",	&mstp_clks[MSTP116]),  	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1",	&mstp_clks[MSTP117]),  	CLKDEV_DEV_ID("sh_tmu.0",		&mstp_clks[MSTP125]), +	CLKDEV_DEV_ID("sh_mobile_ceu.0",	&mstp_clks[MSTP127]), +	CLKDEV_DEV_ID("sh_mobile_ceu.1",	&mstp_clks[MSTP128]),  	CLKDEV_DEV_ID("sh-sci.4",		&mstp_clks[MSTP200]),  	CLKDEV_DEV_ID("sh-sci.3",		&mstp_clks[MSTP201]), @@ -438,7 +568,10 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh-sci.0",		&mstp_clks[MSTP204]),  	CLKDEV_DEV_ID("sh-sci.8",		&mstp_clks[MSTP206]),  	CLKDEV_DEV_ID("sh-sci.5",		&mstp_clks[MSTP207]), - +	CLKDEV_DEV_ID("sh-dma-engine.3",	&mstp_clks[MSTP214]), +	CLKDEV_DEV_ID("sh-dma-engine.2",	&mstp_clks[MSTP216]), +	CLKDEV_DEV_ID("sh-dma-engine.1",	&mstp_clks[MSTP217]), +	CLKDEV_DEV_ID("sh-dma-engine.0",	&mstp_clks[MSTP218]),  	CLKDEV_DEV_ID("sh-sci.7",		&mstp_clks[MSTP222]),  	CLKDEV_DEV_ID("sh-sci.6",		&mstp_clks[MSTP230]), @@ -459,6 +592,10 @@ static struct clk_lookup lookups[] = {  	CLKDEV_ICK_ID("phy",	"renesas_usbhs",	&mstp_clks[MSTP406]),  	CLKDEV_ICK_ID("pci",	"renesas_usbhs",	&div4_clks[DIV4_USBP]),  	CLKDEV_ICK_ID("usb24",	"renesas_usbhs",	&usb24_clk), +	CLKDEV_ICK_ID("ick",	"sh-mobile-hdmi",	&div6_reparent_clks[DIV6_HDMI]), + +	CLKDEV_ICK_ID("icka", "sh_fsi2",	&div6_reparent_clks[DIV6_FSIA]), +	CLKDEV_ICK_ID("ickb", "sh_fsi2",	&div6_reparent_clks[DIV6_FSIB]),  };  void __init r8a7740_clock_init(u8 md_ck) @@ -495,7 +632,14 @@ void __init r8a7740_clock_init(u8 md_ck)  		ret = sh_clk_div6_register(div6_clks, DIV6_NR);  	if (!ret) -		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); +		ret = sh_clk_div6_reparent_register(div6_reparent_clks, +						    DIV6_REPARENT_NR); + +	if (!ret) +		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR); + +	for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++) +		ret = clk_register(late_main_clks[k]);  	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); diff --git a/arch/arm/mach-shmobile/clock-r8a7779.c b/arch/arm/mach-shmobile/clock-r8a7779.c index 7d6e9fe47b5..339c62c824d 100644 --- a/arch/arm/mach-shmobile/clock-r8a7779.c +++ b/arch/arm/mach-shmobile/clock-r8a7779.c @@ -162,7 +162,7 @@ void __init r8a7779_clock_init(void)  		ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);  	if (!ret) -		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); +		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);  	for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)  		ret = clk_register(late_main_clks[k]); diff --git a/arch/arm/mach-shmobile/clock-sh7367.c b/arch/arm/mach-shmobile/clock-sh7367.c index 006e7b5d304..162b791b898 100644 --- a/arch/arm/mach-shmobile/clock-sh7367.c +++ b/arch/arm/mach-shmobile/clock-sh7367.c @@ -344,7 +344,7 @@ void __init sh7367_clock_init(void)  		ret = sh_clk_div6_register(div6_clks, DIV6_NR);  	if (!ret) -		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); +		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);  	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c index 94d1f88246d..5a2894b1c96 100644 --- a/arch/arm/mach-shmobile/clock-sh7372.c +++ b/arch/arm/mach-shmobile/clock-sh7372.c @@ -704,7 +704,7 @@ void __init sh7372_clock_init(void)  		ret = sh_clk_div6_reparent_register(div6_reparent_clks, DIV6_REPARENT_NR);  	if (!ret) -		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); +		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);  	for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)  		ret = clk_register(late_main_clks[k]); diff --git a/arch/arm/mach-shmobile/clock-sh7377.c b/arch/arm/mach-shmobile/clock-sh7377.c index 0798a15936c..85f2a3ec2c4 100644 --- a/arch/arm/mach-shmobile/clock-sh7377.c +++ b/arch/arm/mach-shmobile/clock-sh7377.c @@ -355,7 +355,7 @@ void __init sh7377_clock_init(void)  		ret = sh_clk_div6_register(div6_clks, DIV6_NR);  	if (!ret) -		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); +		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);  	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index 3946c4ba2aa..7f8da18a858 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c @@ -475,9 +475,9 @@ static struct clk *late_main_clks[] = {  enum { MSTP001,  	MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, -	MSTP219, MSTP218, +	MSTP219, MSTP218, MSTP217,  	MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, -	MSTP331, MSTP329, MSTP325, MSTP323, +	MSTP331, MSTP329, MSTP328, MSTP325, MSTP323, MSTP322,  	MSTP314, MSTP313, MSTP312, MSTP311,  	MSTP303, MSTP302, MSTP301, MSTP300,  	MSTP411, MSTP410, MSTP403, @@ -498,6 +498,7 @@ static struct clk mstp_clks[MSTP_NR] = {  	[MSTP100] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */  	[MSTP219] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 19, 0), /* SCIFA7 */  	[MSTP218] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 18, 0), /* SY-DMAC */ +	[MSTP217] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 17, 0), /* MP-DMAC */  	[MSTP207] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 7, 0), /* SCIFA5 */  	[MSTP206] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 6, 0), /* SCIFB */  	[MSTP204] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 4, 0), /* SCIFA0 */ @@ -507,8 +508,10 @@ static struct clk mstp_clks[MSTP_NR] = {  	[MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */  	[MSTP331] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 31, 0), /* SCIFA6 */  	[MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */ +	[MSTP328] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 28, 0), /*FSI*/  	[MSTP325] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 25, 0), /* IrDA */  	[MSTP323] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 23, 0), /* IIC1 */ +	[MSTP322] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 22, 0), /* USB */  	[MSTP314] = MSTP(&div6_clks[DIV6_SDHI0], SMSTPCR3, 14, 0), /* SDHI0 */  	[MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */  	[MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */ @@ -553,6 +556,7 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */  	CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */  	CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* SY-DMAC */ +	CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP217]), /* MP-DMAC */  	CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */  	CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */  	CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */ @@ -562,8 +566,10 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */  	CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP331]), /* SCIFA6 */  	CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]), /* CMT10 */ +	CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI */  	CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */  	CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* I2C1 */ +	CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */  	CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */  	CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ @@ -612,7 +618,7 @@ void __init sh73a0_clock_init(void)  		ret = sh_clk_div6_reparent_register(div6_clks, DIV6_NR);  	if (!ret) -		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); +		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);  	for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)  		ret = clk_register(late_main_clks[k]); diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index 01e2bc014f1..45e61dada03 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h @@ -77,6 +77,7 @@ extern void r8a7779_add_standard_devices(void);  extern void r8a7779_clock_init(void);  extern void r8a7779_pinmux_init(void);  extern void r8a7779_pm_init(void); +extern void r8a7740_meram_workaround(void);  extern unsigned int r8a7779_get_core_count(void);  extern int r8a7779_platform_cpu_kill(unsigned int cpu); diff --git a/arch/arm/mach-shmobile/include/mach/dma-register.h b/arch/arm/mach-shmobile/include/mach/dma-register.h new file mode 100644 index 00000000000..97c40bd9b94 --- /dev/null +++ b/arch/arm/mach-shmobile/include/mach/dma-register.h @@ -0,0 +1,84 @@ +/* + * SH-ARM CPU-specific DMA definitions, used by both DMA drivers + * + * Copyright (C) 2012 Renesas Solutions Corp + * + * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> + * + * Based on arch/sh/include/cpu-sh4/cpu/dma-register.h + * Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de> + * + * 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 DMA_REGISTER_H +#define DMA_REGISTER_H + +/* + *		Direct Memory Access Controller + */ + +/* Transmit sizes and respective CHCR register values */ +enum { +	XMIT_SZ_8BIT		= 0, +	XMIT_SZ_16BIT		= 1, +	XMIT_SZ_32BIT		= 2, +	XMIT_SZ_64BIT		= 7, +	XMIT_SZ_128BIT		= 3, +	XMIT_SZ_256BIT		= 4, +	XMIT_SZ_512BIT		= 5, +}; + +/* log2(size / 8) - used to calculate number of transfers */ +static const unsigned int dma_ts_shift[] = { +	[XMIT_SZ_8BIT]		= 0, +	[XMIT_SZ_16BIT]		= 1, +	[XMIT_SZ_32BIT]		= 2, +	[XMIT_SZ_64BIT]		= 3, +	[XMIT_SZ_128BIT]	= 4, +	[XMIT_SZ_256BIT]	= 5, +	[XMIT_SZ_512BIT]	= 6, +}; + +#define TS_LOW_BIT	0x3 /* --xx */ +#define TS_HI_BIT	0xc /* xx-- */ + +#define TS_LOW_SHIFT	(3) +#define TS_HI_SHIFT	(20 - 2)	/* 2 bits for shifted low TS */ + +#define TS_INDEX2VAL(i) \ +	((((i) & TS_LOW_BIT) << TS_LOW_SHIFT) |\ +	 (((i) & TS_HI_BIT)  << TS_HI_SHIFT)) + +#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz))) +#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz))) + + +/* + *		USB High-Speed DMAC + */ +/* Transmit sizes and respective CHCR register values */ +enum { +	USBTS_XMIT_SZ_8BYTE		= 0, +	USBTS_XMIT_SZ_16BYTE		= 1, +	USBTS_XMIT_SZ_32BYTE		= 2, +}; + +/* log2(size / 8) - used to calculate number of transfers */ +static const unsigned int dma_usbts_shift[] = { +	[USBTS_XMIT_SZ_8BYTE]	= 3, +	[USBTS_XMIT_SZ_16BYTE]	= 4, +	[USBTS_XMIT_SZ_32BYTE]	= 5, +}; + +#define USBTS_LOW_BIT	0x3 /* --xx */ +#define USBTS_HI_BIT	0x0 /* ---- */ + +#define USBTS_LOW_SHIFT	6 +#define USBTS_HI_SHIFT	0 + +#define USBTS_INDEX2VAL(i) (((i) & 3) << 6) + +#endif /* DMA_REGISTER_H */ diff --git a/arch/arm/mach-shmobile/include/mach/gpio.h b/arch/arm/mach-shmobile/include/mach/gpio.h index de795b42232..844507d937c 100644 --- a/arch/arm/mach-shmobile/include/mach/gpio.h +++ b/arch/arm/mach-shmobile/include/mach/gpio.h @@ -13,6 +13,7 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/sh_pfc.h> +#include <linux/io.h>  #ifdef CONFIG_GPIOLIB @@ -27,4 +28,35 @@ static inline int irq_to_gpio(unsigned int irq)  #endif /* CONFIG_GPIOLIB */ +/* + * FIXME !! + * + * current gpio frame work doesn't have + * the method to control only pull up/down/free. + * this function should be replaced by correct gpio function + */ +static inline void __init gpio_direction_none(u32 addr) +{ +	__raw_writeb(0x00, addr); +} + +static inline void __init gpio_request_pullup(u32 addr) +{ +	u8 data = __raw_readb(addr); + +	data &= 0x0F; +	data |= 0xC0; +	__raw_writeb(data, addr); +} + +static inline void __init gpio_request_pulldown(u32 addr) +{ +	u8 data = __raw_readb(addr); + +	data &= 0x0F; +	data |= 0xA0; + +	__raw_writeb(data, addr); +} +  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-shmobile/include/mach/pm-rmobile.h b/arch/arm/mach-shmobile/include/mach/pm-rmobile.h new file mode 100644 index 00000000000..5a402840fe2 --- /dev/null +++ b/arch/arm/mach-shmobile/include/mach/pm-rmobile.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2012 Renesas Solutions Corp. + * + * Kuninori Morimoto <morimoto.kuninori@renesas.com> + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + */ +#ifndef PM_RMOBILE_H +#define PM_RMOBILE_H + +#include <linux/pm_domain.h> + +struct platform_device; + +struct rmobile_pm_domain { +	struct generic_pm_domain genpd; +	struct dev_power_governor *gov; +	int (*suspend)(void); +	void (*resume)(void); +	unsigned int bit_shift; +	bool no_debug; +}; + +static inline +struct rmobile_pm_domain *to_rmobile_pd(struct generic_pm_domain *d) +{ +	return container_of(d, struct rmobile_pm_domain, genpd); +} + +#ifdef CONFIG_PM +extern void rmobile_init_pm_domain(struct rmobile_pm_domain *rmobile_pd); +extern void rmobile_add_device_to_domain(struct rmobile_pm_domain *rmobile_pd, +					struct platform_device *pdev); +extern void rmobile_pm_add_subdomain(struct rmobile_pm_domain *rmobile_pd, +				    struct rmobile_pm_domain *rmobile_sd); +#else +#define rmobile_init_pm_domain(pd) do { } while (0) +#define rmobile_add_device_to_domain(pd, pdev) do { } while (0) +#define rmobile_pm_add_subdomain(pd, sd) do { } while (0) +#endif /* CONFIG_PM */ + +#endif /* PM_RMOBILE_H */ diff --git a/arch/arm/mach-shmobile/include/mach/r8a7740.h b/arch/arm/mach-shmobile/include/mach/r8a7740.h index 9d447abb969..7143147780d 100644 --- a/arch/arm/mach-shmobile/include/mach/r8a7740.h +++ b/arch/arm/mach-shmobile/include/mach/r8a7740.h @@ -19,6 +19,8 @@  #ifndef __ASM_R8A7740_H__  #define __ASM_R8A7740_H__ +#include <mach/pm-rmobile.h> +  /*   * MD_CKx pin   */ @@ -139,7 +141,7 @@ enum {  	GPIO_FN_DBGMD10,	GPIO_FN_DBGMD11,	GPIO_FN_DBGMD20,  	GPIO_FN_DBGMD21, -	/* FSI */ +	/* FSI-A */  	GPIO_FN_FSIAISLD_PORT0,		/* FSIAISLD Port 0/5 */  	GPIO_FN_FSIAISLD_PORT5,  	GPIO_FN_FSIASPDIF_PORT9,	/* FSIASPDIF Port 9/18 */ @@ -150,6 +152,9 @@ enum {  	GPIO_FN_FSIACK,		GPIO_FN_FSIAILR,  	GPIO_FN_FSIAIBT, +	/* FSI-B */ +	GPIO_FN_FSIBCK, +  	/* FMSI */  	GPIO_FN_FMSISLD_PORT1, /* FMSISLD Port 1/6 */  	GPIO_FN_FMSISLD_PORT6, @@ -565,6 +570,10 @@ enum {  	GPIO_FN_RESETP_PULLUP,  	GPIO_FN_RESETP_PLAIN, +	/* HDMI */ +	GPIO_FN_HDMI_HPD, +	GPIO_FN_HDMI_CEC, +  	/* SDENC */  	GPIO_FN_SDENC_CPG,  	GPIO_FN_SDENC_DV_CLKI, @@ -581,4 +590,26 @@ enum {  	GPIO_FN_TRACEAUD_FROM_MEMC,  }; +/* DMA slave IDs */ +enum { +	SHDMA_SLAVE_INVALID, +	SHDMA_SLAVE_SDHI0_RX, +	SHDMA_SLAVE_SDHI0_TX, +	SHDMA_SLAVE_SDHI1_RX, +	SHDMA_SLAVE_SDHI1_TX, +	SHDMA_SLAVE_SDHI2_RX, +	SHDMA_SLAVE_SDHI2_TX, +	SHDMA_SLAVE_FSIA_RX, +	SHDMA_SLAVE_FSIA_TX, +	SHDMA_SLAVE_FSIB_TX, +	SHDMA_SLAVE_USBHS_TX, +	SHDMA_SLAVE_USBHS_RX, +}; + +#ifdef CONFIG_PM +extern struct rmobile_pm_domain r8a7740_pd_a4s; +extern struct rmobile_pm_domain r8a7740_pd_a3sp; +extern struct rmobile_pm_domain r8a7740_pd_a4lc; +#endif /* CONFIG_PM */ +  #endif /* __ASM_R8A7740_H__ */ diff --git a/arch/arm/mach-shmobile/include/mach/sh7372.h b/arch/arm/mach-shmobile/include/mach/sh7372.h index 915d0093da0..b59048e6d8f 100644 --- a/arch/arm/mach-shmobile/include/mach/sh7372.h +++ b/arch/arm/mach-shmobile/include/mach/sh7372.h @@ -13,6 +13,7 @@  #include <linux/sh_clk.h>  #include <linux/pm_domain.h> +#include <mach/pm-rmobile.h>  /*   * Pin Function Controller: @@ -477,42 +478,16 @@ extern struct clk sh7372_fsibck_clk;  extern struct clk sh7372_fsidiva_clk;  extern struct clk sh7372_fsidivb_clk; -struct platform_device; - -struct sh7372_pm_domain { -	struct generic_pm_domain genpd; -	struct dev_power_governor *gov; -	int (*suspend)(void); -	void (*resume)(void); -	unsigned int bit_shift; -	bool no_debug; -}; - -static inline struct sh7372_pm_domain *to_sh7372_pd(struct generic_pm_domain *d) -{ -	return container_of(d, struct sh7372_pm_domain, genpd); -} -  #ifdef CONFIG_PM -extern struct sh7372_pm_domain sh7372_a4lc; -extern struct sh7372_pm_domain sh7372_a4mp; -extern struct sh7372_pm_domain sh7372_d4; -extern struct sh7372_pm_domain sh7372_a4r; -extern struct sh7372_pm_domain sh7372_a3rv; -extern struct sh7372_pm_domain sh7372_a3ri; -extern struct sh7372_pm_domain sh7372_a4s; -extern struct sh7372_pm_domain sh7372_a3sp; -extern struct sh7372_pm_domain sh7372_a3sg; - -extern void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd); -extern void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd, -					struct platform_device *pdev); -extern void sh7372_pm_add_subdomain(struct sh7372_pm_domain *sh7372_pd, -				    struct sh7372_pm_domain *sh7372_sd); -#else -#define sh7372_init_pm_domain(pd) do { } while(0) -#define sh7372_add_device_to_domain(pd, pdev) do { } while(0) -#define sh7372_pm_add_subdomain(pd, sd) do { } while(0) +extern struct rmobile_pm_domain sh7372_pd_a4lc; +extern struct rmobile_pm_domain sh7372_pd_a4mp; +extern struct rmobile_pm_domain sh7372_pd_d4; +extern struct rmobile_pm_domain sh7372_pd_a4r; +extern struct rmobile_pm_domain sh7372_pd_a3rv; +extern struct rmobile_pm_domain sh7372_pd_a3ri; +extern struct rmobile_pm_domain sh7372_pd_a4s; +extern struct rmobile_pm_domain sh7372_pd_a3sp; +extern struct rmobile_pm_domain sh7372_pd_a3sg;  #endif /* CONFIG_PM */  extern void sh7372_intcs_suspend(void); diff --git a/arch/arm/mach-shmobile/include/mach/sh73a0.h b/arch/arm/mach-shmobile/include/mach/sh73a0.h index 398e2c10913..fe950f25d79 100644 --- a/arch/arm/mach-shmobile/include/mach/sh73a0.h +++ b/arch/arm/mach-shmobile/include/mach/sh73a0.h @@ -516,6 +516,13 @@ enum {  	SHDMA_SLAVE_SDHI2_RX,  	SHDMA_SLAVE_MMCIF_TX,  	SHDMA_SLAVE_MMCIF_RX, +	SHDMA_SLAVE_FSI2A_TX, +	SHDMA_SLAVE_FSI2A_RX, +	SHDMA_SLAVE_FSI2B_TX, +	SHDMA_SLAVE_FSI2B_RX, +	SHDMA_SLAVE_FSI2C_TX, +	SHDMA_SLAVE_FSI2C_RX, +	SHDMA_SLAVE_FSI2D_RX,  };  /* diff --git a/arch/arm/mach-shmobile/intc-r8a7740.c b/arch/arm/mach-shmobile/intc-r8a7740.c index 09c42afcb22..9a69a31918b 100644 --- a/arch/arm/mach-shmobile/intc-r8a7740.c +++ b/arch/arm/mach-shmobile/intc-r8a7740.c @@ -71,10 +71,12 @@ enum {  	DMAC3_1_DEI0, DMAC3_1_DEI1, DMAC3_1_DEI2, DMAC3_1_DEI3,  	DMAC3_2_DEI4, DMAC3_2_DEI5, DMAC3_2_DADERR,  	SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, +	HDMI,  	USBH_INT, USBH_OHCI, USBH_EHCI, USBH_PME, USBH_BIND,  	RSPI_OVRF, RSPI_SPTEF, RSPI_SPRF,  	SPU2_0, SPU2_1,  	FSI, FMSI, +	HDMI_SSS, HDMI_KEY,  	IPMMU,  	AP_ARM_CTIIRQ, AP_ARM_PMURQ,  	MFIS2, @@ -182,6 +184,7 @@ static struct intc_vect intca_vectors[] __initdata = {  	INTC_VECT(USBH_EHCI,		0x1580),  	INTC_VECT(USBH_PME,		0x15A0),  	INTC_VECT(USBH_BIND,		0x15C0), +	INTC_VECT(HDMI,			0x1700),  	INTC_VECT(RSPI_OVRF,		0x1780),  	INTC_VECT(RSPI_SPTEF,		0x17A0),  	INTC_VECT(RSPI_SPRF,		0x17C0), @@ -189,6 +192,8 @@ static struct intc_vect intca_vectors[] __initdata = {  	INTC_VECT(SPU2_1,		0x1820),  	INTC_VECT(FSI,			0x1840),  	INTC_VECT(FMSI,			0x1860), +	INTC_VECT(HDMI_SSS,		0x18A0), +	INTC_VECT(HDMI_KEY,		0x18C0),  	INTC_VECT(IPMMU,		0x1920),  	INTC_VECT(AP_ARM_CTIIRQ,	0x1980),  	INTC_VECT(AP_ARM_PMURQ,		0x19A0), @@ -304,11 +309,11 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = {  	    USBH_EHCI, USBH_PME, USBH_BIND, 0 } },  	  /* IMR3A3 / IMCR3A3 */  	{ /* IMR4A3 / IMCR4A3 */ 0xe6950090, 0xe69500d0, 8, -	  { 0, 0, 0, 0, +	  { HDMI, 0, 0, 0,  	    RSPI_OVRF, RSPI_SPTEF, RSPI_SPRF, 0 } },  	{ /* IMR5A3 / IMCR5A3 */ 0xe6950094, 0xe69500d4, 8,  	  { SPU2_0, SPU2_1, FSI, FMSI, -	    0, 0, 0, 0 } }, +	    0, HDMI_SSS, HDMI_KEY, 0 } },  	{ /* IMR6A3 / IMCR6A3 */ 0xe6950098, 0xe69500d8, 8,  	  { 0, IPMMU, 0, 0,  	    AP_ARM_CTIIRQ, AP_ARM_PMURQ, 0, 0 } }, @@ -353,10 +358,10 @@ static struct intc_prio_reg intca_prio_registers[] __initdata = {  	{ 0xe6950014, 0, 16, 4, /* IPRFA3 */ { USBH2, 0, 0, 0 } },  				/* IPRGA3 */  				/* IPRHA3 */ -				/* IPRIA3 */ +	{ 0xe6950020, 0, 16, 4, /* IPRIA3 */ { HDMI, 0, 0, 0 } },  	{ 0xe6950024, 0, 16, 4, /* IPRJA3 */ { RSPI, 0, 0, 0 } },  	{ 0xe6950028, 0, 16, 4, /* IPRKA3 */ { SPU2, 0, FSI, FMSI } }, -				/* IPRLA3 */ +	{ 0xe695002c, 0, 16, 4, /* IPRLA3 */ { 0, HDMI_SSS, HDMI_KEY, 0 } },  	{ 0xe6950030, 0, 16, 4, /* IPRMA3 */ { IPMMU, 0, 0, 0 } },  	{ 0xe6950034, 0, 16, 4, /* IPRNA3 */ { AP_ARM2, 0, 0, 0 } },  	{ 0xe6950038, 0, 16, 4, /* IPROA3 */ { MFIS2, CPORTR2S, diff --git a/arch/arm/mach-shmobile/pfc-r8a7740.c b/arch/arm/mach-shmobile/pfc-r8a7740.c index 670fe1869db..ce9e7fa5cc8 100644 --- a/arch/arm/mach-shmobile/pfc-r8a7740.c +++ b/arch/arm/mach-shmobile/pfc-r8a7740.c @@ -169,7 +169,7 @@ enum {  	DBGMD10_MARK,	DBGMD11_MARK,	DBGMD20_MARK,  	DBGMD21_MARK, -	/* FSI */ +	/* FSI-A */  	FSIAISLD_PORT0_MARK,	/* FSIAISLD Port 0/5 */  	FSIAISLD_PORT5_MARK,  	FSIASPDIF_PORT9_MARK,	/* FSIASPDIF Port 9/18 */ @@ -178,6 +178,9 @@ enum {  	FSIAOBT_MARK,	FSIAOSLD_MARK,	FSIAOMC_MARK,  	FSIACK_MARK,	FSIAILR_MARK,	FSIAIBT_MARK, +	/* FSI-B */ +	FSIBCK_MARK, +  	/* FMSI */  	FMSISLD_PORT1_MARK, /* FMSISLD Port 1/6 */  	FMSISLD_PORT6_MARK, @@ -560,6 +563,9 @@ enum {  	/* SDENC */  	SDENC_CPG_MARK,		SDENC_DV_CLKI_MARK, +	/* HDMI */ +	HDMI_HPD_MARK, HDMI_CEC_MARK, +  	/* DEBUG */  	EDEBGREQ_PULLUP_MARK,	/* for JTAG */  	EDEBGREQ_PULLDOWN_MARK, @@ -771,6 +777,7 @@ static pinmux_enum_t pinmux_data[] = {  	/* Port11 */  	PINMUX_DATA(FSIACK_MARK,		PORT11_FN1), +	PINMUX_DATA(FSIBCK_MARK,		PORT11_FN2),  	PINMUX_DATA(IRQ2_PORT11_MARK,		PORT11_FN0,	MSEL1CR_2_0),  	/* Port12 */ @@ -1254,7 +1261,7 @@ static pinmux_enum_t pinmux_data[] = {  	PINMUX_DATA(A21_MARK,			PORT120_FN1),  	PINMUX_DATA(MSIOF0_RSYNC_MARK,		PORT120_FN2),  	PINMUX_DATA(MSIOF1_TSYNC_PORT120_MARK,	PORT120_FN3,	MSEL4CR_10_0), -	PINMUX_DATA(IRQ7_PORT120_MARK,		PORT120_FN0,	MSEL1CR_7_0), +	PINMUX_DATA(IRQ7_PORT120_MARK,		PORT120_FN0,	MSEL1CR_7_1),  	/* Port121 */  	PINMUX_DATA(A20_MARK,			PORT121_FN1), @@ -1616,13 +1623,15 @@ static pinmux_enum_t pinmux_data[] = {  	/* Port209 */  	PINMUX_DATA(VBUS_MARK,			PORT209_FN1), -	PINMUX_DATA(IRQ7_PORT209_MARK,		PORT209_FN0,	MSEL1CR_7_1), +	PINMUX_DATA(IRQ7_PORT209_MARK,		PORT209_FN0,	MSEL1CR_7_0),  	/* Port210 */  	PINMUX_DATA(IRQ9_PORT210_MARK,		PORT210_FN0,	MSEL1CR_9_1), +	PINMUX_DATA(HDMI_HPD_MARK,		PORT210_FN1),  	/* Port211 */  	PINMUX_DATA(IRQ16_PORT211_MARK,		PORT211_FN0,	MSEL1CR_16_1), +	PINMUX_DATA(HDMI_CEC_MARK,		PORT211_FN1),  	/* LCDC select */  	PINMUX_DATA(LCDC0_SELECT_MARK,				MSEL3CR_6_0), @@ -1691,7 +1700,7 @@ static struct pinmux_gpio pinmux_gpios[] = {  	GPIO_FN(DBGMD10),	GPIO_FN(DBGMD11),	GPIO_FN(DBGMD20),  	GPIO_FN(DBGMD21), -	/* FSI */ +	/* FSI-A */  	GPIO_FN(FSIAISLD_PORT0),	/* FSIAISLD Port 0/5 */  	GPIO_FN(FSIAISLD_PORT5),  	GPIO_FN(FSIASPDIF_PORT9),	/* FSIASPDIF Port 9/18 */ @@ -1700,6 +1709,9 @@ static struct pinmux_gpio pinmux_gpios[] = {  	GPIO_FN(FSIAOBT),	GPIO_FN(FSIAOSLD),	GPIO_FN(FSIAOMC),  	GPIO_FN(FSIACK),	GPIO_FN(FSIAILR),	GPIO_FN(FSIAIBT), +	/* FSI-B */ +	GPIO_FN(FSIBCK), +  	/* FMSI */  	GPIO_FN(FMSISLD_PORT1), /* FMSISLD Port 1/6 */  	GPIO_FN(FMSISLD_PORT6), @@ -2097,6 +2109,10 @@ static struct pinmux_gpio pinmux_gpios[] = {  	GPIO_FN(SDENC_CPG),  	GPIO_FN(SDENC_DV_CLKI), +	/* HDMI */ +	GPIO_FN(HDMI_HPD), +	GPIO_FN(HDMI_CEC), +  	/* SYSC */  	GPIO_FN(RESETP_PULLUP),  	GPIO_FN(RESETP_PLAIN), diff --git a/arch/arm/mach-shmobile/pm-r8a7740.c b/arch/arm/mach-shmobile/pm-r8a7740.c new file mode 100644 index 00000000000..893504d012a --- /dev/null +++ b/arch/arm/mach-shmobile/pm-r8a7740.c @@ -0,0 +1,54 @@ +/* + * r8a7740 power management support + * + * Copyright (C) 2012  Renesas Solutions Corp. + * Copyright (C) 2012  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + */ +#include <linux/console.h> +#include <mach/pm-rmobile.h> + +#ifdef CONFIG_PM +static int r8a7740_pd_a4s_suspend(void) +{ +	/* +	 * The A4S domain contains the CPU core and therefore it should +	 * only be turned off if the CPU is in use. +	 */ +	return -EBUSY; +} + +struct rmobile_pm_domain r8a7740_pd_a4s = { +	.genpd.name	= "A4S", +	.bit_shift	= 10, +	.gov		= &pm_domain_always_on_gov, +	.no_debug	= true, +	.suspend	= r8a7740_pd_a4s_suspend, +}; + +static int r8a7740_pd_a3sp_suspend(void) +{ +	/* +	 * Serial consoles make use of SCIF hardware located in A3SP, +	 * keep such power domain on if "no_console_suspend" is set. +	 */ +	return console_suspend_enabled ? 0 : -EBUSY; +} + +struct rmobile_pm_domain r8a7740_pd_a3sp = { +	.genpd.name	= "A3SP", +	.bit_shift	= 11, +	.gov		= &pm_domain_always_on_gov, +	.no_debug	= true, +	.suspend	= r8a7740_pd_a3sp_suspend, +}; + +struct rmobile_pm_domain r8a7740_pd_a4lc = { +	.genpd.name	= "A4LC", +	.bit_shift	= 1, +}; + +#endif /* CONFIG_PM */ diff --git a/arch/arm/mach-shmobile/pm-rmobile.c b/arch/arm/mach-shmobile/pm-rmobile.c new file mode 100644 index 00000000000..a8562540f1d --- /dev/null +++ b/arch/arm/mach-shmobile/pm-rmobile.c @@ -0,0 +1,167 @@ +/* + * rmobile power management support + * + * Copyright (C) 2012  Renesas Solutions Corp. + * Copyright (C) 2012  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> + * + * based on pm-sh7372.c + *  Copyright (C) 2011 Magnus Damm + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + */ +#include <linux/console.h> +#include <linux/delay.h> +#include <linux/platform_device.h> +#include <linux/pm.h> +#include <linux/pm_clock.h> +#include <asm/io.h> +#include <mach/pm-rmobile.h> + +/* SYSC */ +#define SPDCR		0xe6180008 +#define SWUCR		0xe6180014 +#define PSTR		0xe6180080 + +#define PSTR_RETRIES	100 +#define PSTR_DELAY_US	10 + +#ifdef CONFIG_PM +static int rmobile_pd_power_down(struct generic_pm_domain *genpd) +{ +	struct rmobile_pm_domain *rmobile_pd = to_rmobile_pd(genpd); +	unsigned int mask = 1 << rmobile_pd->bit_shift; + +	if (rmobile_pd->suspend) { +		int ret = rmobile_pd->suspend(); + +		if (ret) +			return ret; +	} + +	if (__raw_readl(PSTR) & mask) { +		unsigned int retry_count; +		__raw_writel(mask, SPDCR); + +		for (retry_count = PSTR_RETRIES; retry_count; retry_count--) { +			if (!(__raw_readl(SPDCR) & mask)) +				break; +			cpu_relax(); +		} +	} + +	if (!rmobile_pd->no_debug) +		pr_debug("%s: Power off, 0x%08x -> PSTR = 0x%08x\n", +			 genpd->name, mask, __raw_readl(PSTR)); + +	return 0; +} + +static int __rmobile_pd_power_up(struct rmobile_pm_domain *rmobile_pd, +				 bool do_resume) +{ +	unsigned int mask = 1 << rmobile_pd->bit_shift; +	unsigned int retry_count; +	int ret = 0; + +	if (__raw_readl(PSTR) & mask) +		goto out; + +	__raw_writel(mask, SWUCR); + +	for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) { +		if (!(__raw_readl(SWUCR) & mask)) +			break; +		if (retry_count > PSTR_RETRIES) +			udelay(PSTR_DELAY_US); +		else +			cpu_relax(); +	} +	if (!retry_count) +		ret = -EIO; + +	if (!rmobile_pd->no_debug) +		pr_debug("%s: Power on, 0x%08x -> PSTR = 0x%08x\n", +			 rmobile_pd->genpd.name, mask, __raw_readl(PSTR)); + +out: +	if (ret == 0 && rmobile_pd->resume && do_resume) +		rmobile_pd->resume(); + +	return ret; +} + +static int rmobile_pd_power_up(struct generic_pm_domain *genpd) +{ +	return __rmobile_pd_power_up(to_rmobile_pd(genpd), true); +} + +static bool rmobile_pd_active_wakeup(struct device *dev) +{ +	bool (*active_wakeup)(struct device *dev); + +	active_wakeup = dev_gpd_data(dev)->ops.active_wakeup; +	return active_wakeup ? active_wakeup(dev) : true; +} + +static int rmobile_pd_stop_dev(struct device *dev) +{ +	int (*stop)(struct device *dev); + +	stop = dev_gpd_data(dev)->ops.stop; +	if (stop) { +		int ret = stop(dev); +		if (ret) +			return ret; +	} +	return pm_clk_suspend(dev); +} + +static int rmobile_pd_start_dev(struct device *dev) +{ +	int (*start)(struct device *dev); +	int ret; + +	ret = pm_clk_resume(dev); +	if (ret) +		return ret; + +	start = dev_gpd_data(dev)->ops.start; +	if (start) +		ret = start(dev); + +	return ret; +} + +void rmobile_init_pm_domain(struct rmobile_pm_domain *rmobile_pd) +{ +	struct generic_pm_domain *genpd = &rmobile_pd->genpd; +	struct dev_power_governor *gov = rmobile_pd->gov; + +	pm_genpd_init(genpd, gov ? : &simple_qos_governor, false); +	genpd->dev_ops.stop		= rmobile_pd_stop_dev; +	genpd->dev_ops.start		= rmobile_pd_start_dev; +	genpd->dev_ops.active_wakeup	= rmobile_pd_active_wakeup; +	genpd->dev_irq_safe		= true; +	genpd->power_off		= rmobile_pd_power_down; +	genpd->power_on			= rmobile_pd_power_up; +	__rmobile_pd_power_up(rmobile_pd, false); +} + +void rmobile_add_device_to_domain(struct rmobile_pm_domain *rmobile_pd, +				 struct platform_device *pdev) +{ +	struct device *dev = &pdev->dev; + +	pm_genpd_add_device(&rmobile_pd->genpd, dev); +	if (pm_clk_no_clocks(dev)) +		pm_clk_add(dev, NULL); +} + +void rmobile_pm_add_subdomain(struct rmobile_pm_domain *rmobile_pd, +			     struct rmobile_pm_domain *rmobile_sd) +{ +	pm_genpd_add_subdomain(&rmobile_pd->genpd, &rmobile_sd->genpd); +} +#endif /* CONFIG_PM */ diff --git a/arch/arm/mach-shmobile/pm-sh7372.c b/arch/arm/mach-shmobile/pm-sh7372.c index a3bdb12acde..79203706922 100644 --- a/arch/arm/mach-shmobile/pm-sh7372.c +++ b/arch/arm/mach-shmobile/pm-sh7372.c @@ -26,6 +26,7 @@  #include <asm/suspend.h>  #include <mach/common.h>  #include <mach/sh7372.h> +#include <mach/pm-rmobile.h>  /* DBG */  #define DBGREG1 0xe6100020 @@ -41,13 +42,10 @@  #define PLLC01STPCR 0xe61500c8  /* SYSC */ -#define SPDCR 0xe6180008 -#define SWUCR 0xe6180014  #define SBAR 0xe6180020  #define WUPRMSK 0xe6180028  #define WUPSMSK 0xe618002c  #define WUPSMSK2 0xe6180048 -#define PSTR 0xe6180080  #define WUPSFAC 0xe6180098  #define IRQCR 0xe618022c  #define IRQCR2 0xe6180238 @@ -71,188 +69,48 @@  /* AP-System Core */  #define APARMBAREA 0xe6f10020 -#define PSTR_RETRIES 100 -#define PSTR_DELAY_US 10 -  #ifdef CONFIG_PM -static int pd_power_down(struct generic_pm_domain *genpd) -{ -	struct sh7372_pm_domain *sh7372_pd = to_sh7372_pd(genpd); -	unsigned int mask = 1 << sh7372_pd->bit_shift; - -	if (sh7372_pd->suspend) { -		int ret = sh7372_pd->suspend(); - -		if (ret) -			return ret; -	} - -	if (__raw_readl(PSTR) & mask) { -		unsigned int retry_count; - -		__raw_writel(mask, SPDCR); - -		for (retry_count = PSTR_RETRIES; retry_count; retry_count--) { -			if (!(__raw_readl(SPDCR) & mask)) -				break; -			cpu_relax(); -		} -	} - -	if (!sh7372_pd->no_debug) -		pr_debug("%s: Power off, 0x%08x -> PSTR = 0x%08x\n", -			 genpd->name, mask, __raw_readl(PSTR)); - -	return 0; -} - -static int __pd_power_up(struct sh7372_pm_domain *sh7372_pd, bool do_resume) -{ -	unsigned int mask = 1 << sh7372_pd->bit_shift; -	unsigned int retry_count; -	int ret = 0; - -	if (__raw_readl(PSTR) & mask) -		goto out; - -	__raw_writel(mask, SWUCR); - -	for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) { -		if (!(__raw_readl(SWUCR) & mask)) -			break; -		if (retry_count > PSTR_RETRIES) -			udelay(PSTR_DELAY_US); -		else -			cpu_relax(); -	} -	if (!retry_count) -		ret = -EIO; - -	if (!sh7372_pd->no_debug) -		pr_debug("%s: Power on, 0x%08x -> PSTR = 0x%08x\n", -			 sh7372_pd->genpd.name, mask, __raw_readl(PSTR)); - - out: -	if (ret == 0 && sh7372_pd->resume && do_resume) -		sh7372_pd->resume(); - -	return ret; -} - -static int pd_power_up(struct generic_pm_domain *genpd) -{ -	 return __pd_power_up(to_sh7372_pd(genpd), true); -} - -static int sh7372_a4r_suspend(void) -{ -	sh7372_intcs_suspend(); -	__raw_writel(0x300fffff, WUPRMSK); /* avoid wakeup */ -	return 0; -} - -static bool pd_active_wakeup(struct device *dev) -{ -	bool (*active_wakeup)(struct device *dev); - -	active_wakeup = dev_gpd_data(dev)->ops.active_wakeup; -	return active_wakeup ? active_wakeup(dev) : true; -} - -static int sh7372_stop_dev(struct device *dev) -{ -	int (*stop)(struct device *dev); - -	stop = dev_gpd_data(dev)->ops.stop; -	if (stop) { -		int ret = stop(dev); -		if (ret) -			return ret; -	} -	return pm_clk_suspend(dev); -} - -static int sh7372_start_dev(struct device *dev) -{ -	int (*start)(struct device *dev); -	int ret; - -	ret = pm_clk_resume(dev); -	if (ret) -		return ret; - -	start = dev_gpd_data(dev)->ops.start; -	if (start) -		ret = start(dev); - -	return ret; -} - -void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd) -{ -	struct generic_pm_domain *genpd = &sh7372_pd->genpd; -	struct dev_power_governor *gov = sh7372_pd->gov; - -	pm_genpd_init(genpd, gov ? : &simple_qos_governor, false); -	genpd->dev_ops.stop = sh7372_stop_dev; -	genpd->dev_ops.start = sh7372_start_dev; -	genpd->dev_ops.active_wakeup = pd_active_wakeup; -	genpd->dev_irq_safe = true; -	genpd->power_off = pd_power_down; -	genpd->power_on = pd_power_up; -	__pd_power_up(sh7372_pd, false); -} - -void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd, -				 struct platform_device *pdev) -{ -	struct device *dev = &pdev->dev; - -	pm_genpd_add_device(&sh7372_pd->genpd, dev); -	if (pm_clk_no_clocks(dev)) -		pm_clk_add(dev, NULL); -} - -void sh7372_pm_add_subdomain(struct sh7372_pm_domain *sh7372_pd, -			     struct sh7372_pm_domain *sh7372_sd) -{ -	pm_genpd_add_subdomain(&sh7372_pd->genpd, &sh7372_sd->genpd); -} - -struct sh7372_pm_domain sh7372_a4lc = { +struct rmobile_pm_domain sh7372_pd_a4lc = {  	.genpd.name = "A4LC",  	.bit_shift = 1,  }; -struct sh7372_pm_domain sh7372_a4mp = { +struct rmobile_pm_domain sh7372_pd_a4mp = {  	.genpd.name = "A4MP",  	.bit_shift = 2,  }; -struct sh7372_pm_domain sh7372_d4 = { +struct rmobile_pm_domain sh7372_pd_d4 = {  	.genpd.name = "D4",  	.bit_shift = 3,  }; -struct sh7372_pm_domain sh7372_a4r = { +static int sh7372_a4r_pd_suspend(void) +{ +	sh7372_intcs_suspend(); +	__raw_writel(0x300fffff, WUPRMSK); /* avoid wakeup */ +	return 0; +} + +struct rmobile_pm_domain sh7372_pd_a4r = {  	.genpd.name = "A4R",  	.bit_shift = 5, -	.suspend = sh7372_a4r_suspend, +	.suspend = sh7372_a4r_pd_suspend,  	.resume = sh7372_intcs_resume,  }; -struct sh7372_pm_domain sh7372_a3rv = { +struct rmobile_pm_domain sh7372_pd_a3rv = {  	.genpd.name = "A3RV",  	.bit_shift = 6,  }; -struct sh7372_pm_domain sh7372_a3ri = { +struct rmobile_pm_domain sh7372_pd_a3ri = {  	.genpd.name = "A3RI",  	.bit_shift = 8,  }; -static int sh7372_a4s_suspend(void) +static int sh7372_pd_a4s_suspend(void)  {  	/*  	 * The A4S domain contains the CPU core and therefore it should @@ -261,15 +119,15 @@ static int sh7372_a4s_suspend(void)  	return -EBUSY;  } -struct sh7372_pm_domain sh7372_a4s = { +struct rmobile_pm_domain sh7372_pd_a4s = {  	.genpd.name = "A4S",  	.bit_shift = 10,  	.gov = &pm_domain_always_on_gov,  	.no_debug = true, -	.suspend = sh7372_a4s_suspend, +	.suspend = sh7372_pd_a4s_suspend,  }; -static int sh7372_a3sp_suspend(void) +static int sh7372_a3sp_pd_suspend(void)  {  	/*  	 * Serial consoles make use of SCIF hardware located in A3SP, @@ -278,32 +136,22 @@ static int sh7372_a3sp_suspend(void)  	return console_suspend_enabled ? 0 : -EBUSY;  } -struct sh7372_pm_domain sh7372_a3sp = { +struct rmobile_pm_domain sh7372_pd_a3sp = {  	.genpd.name = "A3SP",  	.bit_shift = 11,  	.gov = &pm_domain_always_on_gov,  	.no_debug = true, -	.suspend = sh7372_a3sp_suspend, +	.suspend = sh7372_a3sp_pd_suspend,  }; -struct sh7372_pm_domain sh7372_a3sg = { +struct rmobile_pm_domain sh7372_pd_a3sg = {  	.genpd.name = "A3SG",  	.bit_shift = 13,  }; -#else /* !CONFIG_PM */ - -static inline void sh7372_a3sp_init(void) {} - -#endif /* !CONFIG_PM */ +#endif /* CONFIG_PM */  #if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE) -static int sh7372_do_idle_core_standby(unsigned long unused) -{ -	cpu_do_idle(); /* WFI when SYSTBCR == 0x10 -> Core Standby */ -	return 0; -} -  static void sh7372_set_reset_vector(unsigned long address)  {  	/* set reset vector, translate 4k */ @@ -311,21 +159,6 @@ static void sh7372_set_reset_vector(unsigned long address)  	__raw_writel(0, APARMBAREA);  } -static void sh7372_enter_core_standby(void) -{ -	sh7372_set_reset_vector(__pa(sh7372_resume_core_standby_sysc)); - -	/* enter sleep mode with SYSTBCR to 0x10 */ -	__raw_writel(0x10, SYSTBCR); -	cpu_suspend(0, sh7372_do_idle_core_standby); -	__raw_writel(0, SYSTBCR); - -	 /* disable reset vector translation */ -	__raw_writel(0, SBAR); -} -#endif - -#ifdef CONFIG_SUSPEND  static void sh7372_enter_sysc(int pllc0_on, unsigned long sleep_mode)  {  	if (pllc0_on) @@ -465,22 +298,42 @@ static void sh7372_setup_sysc(unsigned long msk, unsigned long msk2)  static void sh7372_enter_a3sm_common(int pllc0_on)  { +	/* use INTCA together with SYSC for wakeup */ +	sh7372_setup_sysc(1 << 0, 0);  	sh7372_set_reset_vector(__pa(sh7372_resume_core_standby_sysc));  	sh7372_enter_sysc(pllc0_on, 1 << 12);  } +#endif /* CONFIG_SUSPEND || CONFIG_CPU_IDLE */ -static void sh7372_enter_a4s_common(int pllc0_on) +#ifdef CONFIG_CPU_IDLE +static int sh7372_do_idle_core_standby(unsigned long unused)  { -	sh7372_intca_suspend(); -	memcpy((void *)SMFRAM, sh7372_resume_core_standby_sysc, 0x100); -	sh7372_set_reset_vector(SMFRAM); -	sh7372_enter_sysc(pllc0_on, 1 << 10); -	sh7372_intca_resume(); +	cpu_do_idle(); /* WFI when SYSTBCR == 0x10 -> Core Standby */ +	return 0;  } -#endif +static void sh7372_enter_core_standby(void) +{ +	sh7372_set_reset_vector(__pa(sh7372_resume_core_standby_sysc)); -#ifdef CONFIG_CPU_IDLE +	/* enter sleep mode with SYSTBCR to 0x10 */ +	__raw_writel(0x10, SYSTBCR); +	cpu_suspend(0, sh7372_do_idle_core_standby); +	__raw_writel(0, SYSTBCR); + +	 /* disable reset vector translation */ +	__raw_writel(0, SBAR); +} + +static void sh7372_enter_a3sm_pll_on(void) +{ +	sh7372_enter_a3sm_common(1); +} + +static void sh7372_enter_a3sm_pll_off(void) +{ +	sh7372_enter_a3sm_common(0); +}  static void sh7372_cpuidle_setup(struct cpuidle_driver *drv)  { @@ -492,7 +345,24 @@ static void sh7372_cpuidle_setup(struct cpuidle_driver *drv)  	state->target_residency = 20 + 10;  	state->flags = CPUIDLE_FLAG_TIME_VALID;  	shmobile_cpuidle_modes[drv->state_count] = sh7372_enter_core_standby; +	drv->state_count++; + +	state = &drv->states[drv->state_count]; +	snprintf(state->name, CPUIDLE_NAME_LEN, "C3"); +	strncpy(state->desc, "A3SM PLL ON", CPUIDLE_DESC_LEN); +	state->exit_latency = 20; +	state->target_residency = 30 + 20; +	state->flags = CPUIDLE_FLAG_TIME_VALID; +	shmobile_cpuidle_modes[drv->state_count] = sh7372_enter_a3sm_pll_on; +	drv->state_count++; +	state = &drv->states[drv->state_count]; +	snprintf(state->name, CPUIDLE_NAME_LEN, "C4"); +	strncpy(state->desc, "A3SM PLL OFF", CPUIDLE_DESC_LEN); +	state->exit_latency = 120; +	state->target_residency = 30 + 120; +	state->flags = CPUIDLE_FLAG_TIME_VALID; +	shmobile_cpuidle_modes[drv->state_count] = sh7372_enter_a3sm_pll_off;  	drv->state_count++;  } @@ -505,6 +375,14 @@ static void sh7372_cpuidle_init(void) {}  #endif  #ifdef CONFIG_SUSPEND +static void sh7372_enter_a4s_common(int pllc0_on) +{ +	sh7372_intca_suspend(); +	memcpy((void *)SMFRAM, sh7372_resume_core_standby_sysc, 0x100); +	sh7372_set_reset_vector(SMFRAM); +	sh7372_enter_sysc(pllc0_on, 1 << 10); +	sh7372_intca_resume(); +}  static int sh7372_enter_suspend(suspend_state_t suspend_state)  { @@ -512,24 +390,21 @@ static int sh7372_enter_suspend(suspend_state_t suspend_state)  	/* check active clocks to determine potential wakeup sources */  	if (sh7372_sysc_valid(&msk, &msk2)) { -		/* convert INTC mask and sense to SYSC mask and sense */ -		sh7372_setup_sysc(msk, msk2); -  		if (!console_suspend_enabled && -		    sh7372_a4s.genpd.status == GPD_STATE_POWER_OFF) { +		    sh7372_pd_a4s.genpd.status == GPD_STATE_POWER_OFF) { +			/* convert INTC mask/sense to SYSC mask/sense */ +			sh7372_setup_sysc(msk, msk2); +  			/* enter A4S sleep with PLLC0 off */  			pr_debug("entering A4S\n");  			sh7372_enter_a4s_common(0); -		} else { -			/* enter A3SM sleep with PLLC0 off */ -			pr_debug("entering A3SM\n"); -			sh7372_enter_a3sm_common(0); +			return 0;  		} -	} else { -		/* default to Core Standby that supports all wakeup sources */ -		pr_debug("entering Core Standby\n"); -		sh7372_enter_core_standby();  	} + +	/* default to enter A3SM sleep with PLLC0 off */ +	pr_debug("entering A3SM\n"); +	sh7372_enter_a3sm_common(0);  	return 0;  } @@ -550,7 +425,7 @@ static int sh7372_pm_notifier_fn(struct notifier_block *notifier,  		 * executed during system suspend and resume, respectively, so  		 * that those functions don't crash while accessing the INTCS.  		 */ -		pm_genpd_poweron(&sh7372_a4r.genpd); +		pm_genpd_poweron(&sh7372_pd_a4r.genpd);  		break;  	case PM_POST_SUSPEND:  		pm_genpd_poweroff_unused(); diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c index ec4eb49c169..78948a9dba0 100644 --- a/arch/arm/mach-shmobile/setup-r8a7740.c +++ b/arch/arm/mach-shmobile/setup-r8a7740.c @@ -23,9 +23,14 @@  #include <linux/init.h>  #include <linux/io.h>  #include <linux/platform_device.h> +#include <linux/of_platform.h>  #include <linux/serial_sci.h> +#include <linux/sh_dma.h>  #include <linux/sh_timer.h> +#include <linux/dma-mapping.h> +#include <mach/dma-register.h>  #include <mach/r8a7740.h> +#include <mach/pm-rmobile.h>  #include <mach/common.h>  #include <mach/irqs.h>  #include <asm/mach-types.h> @@ -276,6 +281,272 @@ static struct platform_device *r8a7740_early_devices[] __initdata = {  	&cmt10_device,  }; +/* DMA */ +static const struct sh_dmae_slave_config r8a7740_dmae_slaves[] = { +	{ +		.slave_id	= SHDMA_SLAVE_SDHI0_TX, +		.addr		= 0xe6850030, +		.chcr		= CHCR_TX(XMIT_SZ_16BIT), +		.mid_rid	= 0xc1, +	}, { +		.slave_id	= SHDMA_SLAVE_SDHI0_RX, +		.addr		= 0xe6850030, +		.chcr		= CHCR_RX(XMIT_SZ_16BIT), +		.mid_rid	= 0xc2, +	}, { +		.slave_id	= SHDMA_SLAVE_SDHI1_TX, +		.addr		= 0xe6860030, +		.chcr		= CHCR_TX(XMIT_SZ_16BIT), +		.mid_rid	= 0xc9, +	}, { +		.slave_id	= SHDMA_SLAVE_SDHI1_RX, +		.addr		= 0xe6860030, +		.chcr		= CHCR_RX(XMIT_SZ_16BIT), +		.mid_rid	= 0xca, +	}, { +		.slave_id	= SHDMA_SLAVE_SDHI2_TX, +		.addr		= 0xe6870030, +		.chcr		= CHCR_TX(XMIT_SZ_16BIT), +		.mid_rid	= 0xcd, +	}, { +		.slave_id	= SHDMA_SLAVE_SDHI2_RX, +		.addr		= 0xe6870030, +		.chcr		= CHCR_RX(XMIT_SZ_16BIT), +		.mid_rid	= 0xce, +	}, { +		.slave_id	= SHDMA_SLAVE_FSIA_TX, +		.addr		= 0xfe1f0024, +		.chcr		= CHCR_TX(XMIT_SZ_32BIT), +		.mid_rid	= 0xb1, +	}, { +		.slave_id	= SHDMA_SLAVE_FSIA_RX, +		.addr		= 0xfe1f0020, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0xb2, +	}, { +		.slave_id	= SHDMA_SLAVE_FSIB_TX, +		.addr		= 0xfe1f0064, +		.chcr		= CHCR_TX(XMIT_SZ_32BIT), +		.mid_rid	= 0xb5, +	}, +}; + +#define DMA_CHANNEL(a, b, c)			\ +{						\ +	.offset		= a,			\ +	.dmars		= b,			\ +	.dmars_bit	= c,			\ +	.chclr_offset	= (0x220 - 0x20) + a	\ +} + +static const struct sh_dmae_channel r8a7740_dmae_channels[] = { +	DMA_CHANNEL(0x00, 0, 0), +	DMA_CHANNEL(0x10, 0, 8), +	DMA_CHANNEL(0x20, 4, 0), +	DMA_CHANNEL(0x30, 4, 8), +	DMA_CHANNEL(0x50, 8, 0), +	DMA_CHANNEL(0x60, 8, 8), +}; + +static struct sh_dmae_pdata dma_platform_data = { +	.slave		= r8a7740_dmae_slaves, +	.slave_num	= ARRAY_SIZE(r8a7740_dmae_slaves), +	.channel	= r8a7740_dmae_channels, +	.channel_num	= ARRAY_SIZE(r8a7740_dmae_channels), +	.ts_low_shift	= TS_LOW_SHIFT, +	.ts_low_mask	= TS_LOW_BIT << TS_LOW_SHIFT, +	.ts_high_shift	= TS_HI_SHIFT, +	.ts_high_mask	= TS_HI_BIT << TS_HI_SHIFT, +	.ts_shift	= dma_ts_shift, +	.ts_shift_num	= ARRAY_SIZE(dma_ts_shift), +	.dmaor_init	= DMAOR_DME, +	.chclr_present	= 1, +}; + +/* Resource order important! */ +static struct resource r8a7740_dmae0_resources[] = { +	{ +		/* Channel registers and DMAOR */ +		.start	= 0xfe008020, +		.end	= 0xfe00828f, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		/* DMARSx */ +		.start	= 0xfe009000, +		.end	= 0xfe00900b, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		.name	= "error_irq", +		.start	= evt2irq(0x20c0), +		.end	= evt2irq(0x20c0), +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		/* IRQ for channels 0-5 */ +		.start	= evt2irq(0x2000), +		.end	= evt2irq(0x20a0), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +/* Resource order important! */ +static struct resource r8a7740_dmae1_resources[] = { +	{ +		/* Channel registers and DMAOR */ +		.start	= 0xfe018020, +		.end	= 0xfe01828f, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		/* DMARSx */ +		.start	= 0xfe019000, +		.end	= 0xfe01900b, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		.name	= "error_irq", +		.start	= evt2irq(0x21c0), +		.end	= evt2irq(0x21c0), +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		/* IRQ for channels 0-5 */ +		.start	= evt2irq(0x2100), +		.end	= evt2irq(0x21a0), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +/* Resource order important! */ +static struct resource r8a7740_dmae2_resources[] = { +	{ +		/* Channel registers and DMAOR */ +		.start	= 0xfe028020, +		.end	= 0xfe02828f, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		/* DMARSx */ +		.start	= 0xfe029000, +		.end	= 0xfe02900b, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		.name	= "error_irq", +		.start	= evt2irq(0x22c0), +		.end	= evt2irq(0x22c0), +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		/* IRQ for channels 0-5 */ +		.start	= evt2irq(0x2200), +		.end	= evt2irq(0x22a0), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device dma0_device = { +	.name		= "sh-dma-engine", +	.id		= 0, +	.resource	= r8a7740_dmae0_resources, +	.num_resources	= ARRAY_SIZE(r8a7740_dmae0_resources), +	.dev		= { +		.platform_data	= &dma_platform_data, +	}, +}; + +static struct platform_device dma1_device = { +	.name		= "sh-dma-engine", +	.id		= 1, +	.resource	= r8a7740_dmae1_resources, +	.num_resources	= ARRAY_SIZE(r8a7740_dmae1_resources), +	.dev		= { +		.platform_data	= &dma_platform_data, +	}, +}; + +static struct platform_device dma2_device = { +	.name		= "sh-dma-engine", +	.id		= 2, +	.resource	= r8a7740_dmae2_resources, +	.num_resources	= ARRAY_SIZE(r8a7740_dmae2_resources), +	.dev		= { +		.platform_data	= &dma_platform_data, +	}, +}; + +/* USB-DMAC */ +static const struct sh_dmae_channel r8a7740_usb_dma_channels[] = { +	{ +		.offset = 0, +	}, { +		.offset = 0x20, +	}, +}; + +static const struct sh_dmae_slave_config r8a7740_usb_dma_slaves[] = { +	{ +		.slave_id	= SHDMA_SLAVE_USBHS_TX, +		.chcr		= USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE), +	}, { +		.slave_id	= SHDMA_SLAVE_USBHS_RX, +		.chcr		= USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE), +	}, +}; + +static struct sh_dmae_pdata usb_dma_platform_data = { +	.slave		= r8a7740_usb_dma_slaves, +	.slave_num	= ARRAY_SIZE(r8a7740_usb_dma_slaves), +	.channel	= r8a7740_usb_dma_channels, +	.channel_num	= ARRAY_SIZE(r8a7740_usb_dma_channels), +	.ts_low_shift	= USBTS_LOW_SHIFT, +	.ts_low_mask	= USBTS_LOW_BIT << USBTS_LOW_SHIFT, +	.ts_high_shift	= USBTS_HI_SHIFT, +	.ts_high_mask	= USBTS_HI_BIT << USBTS_HI_SHIFT, +	.ts_shift	= dma_usbts_shift, +	.ts_shift_num	= ARRAY_SIZE(dma_usbts_shift), +	.dmaor_init	= DMAOR_DME, +	.chcr_offset	= 0x14, +	.chcr_ie_bit	= 1 << 5, +	.dmaor_is_32bit	= 1, +	.needs_tend_set	= 1, +	.no_dmars	= 1, +	.slave_only	= 1, +}; + +static struct resource r8a7740_usb_dma_resources[] = { +	{ +		/* Channel registers and DMAOR */ +		.start	= 0xe68a0020, +		.end	= 0xe68a0064 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		/* VCR/SWR/DMICR */ +		.start	= 0xe68a0000, +		.end	= 0xe68a0014 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		/* IRQ for channels */ +		.start	= evt2irq(0x0a00), +		.end	= evt2irq(0x0a00), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device usb_dma_device = { +	.name		= "sh-dma-engine", +	.id		= 3, +	.resource	= r8a7740_usb_dma_resources, +	.num_resources	= ARRAY_SIZE(r8a7740_usb_dma_resources), +	.dev		= { +		.platform_data	= &usb_dma_platform_data, +	}, +}; +  /* I2C */  static struct resource i2c0_resources[] = {  	[0] = { @@ -322,8 +593,30 @@ static struct platform_device i2c1_device = {  static struct platform_device *r8a7740_late_devices[] __initdata = {  	&i2c0_device,  	&i2c1_device, +	&dma0_device, +	&dma1_device, +	&dma2_device, +	&usb_dma_device,  }; +/* + * r8a7740 chip has lasting errata on MERAM buffer. + * this is work-around for it. + * see + *	"Media RAM (MERAM)" on r8a7740 documentation + */ +#define MEBUFCNTR	0xFE950098 +void r8a7740_meram_workaround(void) +{ +	void __iomem *reg; + +	reg = ioremap_nocache(MEBUFCNTR, 4); +	if (reg) { +		iowrite32(0x01600164, reg); +		iounmap(reg); +	} +} +  #define ICCR	0x0004  #define ICSTART	0x0070 @@ -380,10 +673,31 @@ void __init r8a7740_add_standard_devices(void)  	r8a7740_i2c_workaround(&i2c0_device);  	r8a7740_i2c_workaround(&i2c1_device); +	/* PM domain */ +	rmobile_init_pm_domain(&r8a7740_pd_a4s); +	rmobile_init_pm_domain(&r8a7740_pd_a3sp); +	rmobile_init_pm_domain(&r8a7740_pd_a4lc); + +	rmobile_pm_add_subdomain(&r8a7740_pd_a4s, &r8a7740_pd_a3sp); + +	/* add devices */  	platform_add_devices(r8a7740_early_devices,  			    ARRAY_SIZE(r8a7740_early_devices));  	platform_add_devices(r8a7740_late_devices,  			     ARRAY_SIZE(r8a7740_late_devices)); + +	/* add devices to PM domain  */ + +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif0_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif1_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif2_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif3_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif4_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif5_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif6_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scif7_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&scifb_device); +	rmobile_add_device_to_domain(&r8a7740_pd_a3sp,	&i2c1_device);  }  static void __init r8a7740_earlytimer_init(void) @@ -403,3 +717,49 @@ void __init r8a7740_add_early_devices(void)  	/* override timer setup with soc-specific code */  	shmobile_timer.init = r8a7740_earlytimer_init;  } + +#ifdef CONFIG_USE_OF + +void __init r8a7740_add_early_devices_dt(void) +{ +	shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */ + +	early_platform_add_devices(r8a7740_early_devices, +				   ARRAY_SIZE(r8a7740_early_devices)); + +	/* setup early console here as well */ +	shmobile_setup_console(); +} + +static const struct of_dev_auxdata r8a7740_auxdata_lookup[] __initconst = { +	{ } +}; + +void __init r8a7740_add_standard_devices_dt(void) +{ +	/* clocks are setup late during boot in the case of DT */ +	r8a7740_clock_init(0); + +	platform_add_devices(r8a7740_early_devices, +			    ARRAY_SIZE(r8a7740_early_devices)); + +	of_platform_populate(NULL, of_default_bus_match_table, +			     r8a7740_auxdata_lookup, NULL); +} + +static const char *r8a7740_boards_compat_dt[] __initdata = { +	"renesas,r8a7740", +	NULL, +}; + +DT_MACHINE_START(SH7372_DT, "Generic R8A7740 (Flattened Device Tree)") +	.map_io		= r8a7740_map_io, +	.init_early	= r8a7740_add_early_devices_dt, +	.init_irq	= r8a7740_init_irq, +	.handle_irq	= shmobile_handle_irq_intc, +	.init_machine	= r8a7740_add_standard_devices_dt, +	.timer		= &shmobile_timer, +	.dt_compat	= r8a7740_boards_compat_dt, +MACHINE_END + +#endif /* CONFIG_USE_OF */ diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c index fafce9ce821..838a87be1d5 100644 --- a/arch/arm/mach-shmobile/setup-sh7372.c +++ b/arch/arm/mach-shmobile/setup-sh7372.c @@ -33,6 +33,7 @@  #include <linux/sh_timer.h>  #include <linux/pm_domain.h>  #include <linux/dma-mapping.h> +#include <mach/dma-register.h>  #include <mach/hardware.h>  #include <mach/irqs.h>  #include <mach/sh7372.h> @@ -335,151 +336,126 @@ static struct platform_device iic1_device = {  };  /* DMA */ -/* Transmit sizes and respective CHCR register values */ -enum { -	XMIT_SZ_8BIT		= 0, -	XMIT_SZ_16BIT		= 1, -	XMIT_SZ_32BIT		= 2, -	XMIT_SZ_64BIT		= 7, -	XMIT_SZ_128BIT		= 3, -	XMIT_SZ_256BIT		= 4, -	XMIT_SZ_512BIT		= 5, -}; - -/* log2(size / 8) - used to calculate number of transfers */ -#define TS_SHIFT {			\ -	[XMIT_SZ_8BIT]		= 0,	\ -	[XMIT_SZ_16BIT]		= 1,	\ -	[XMIT_SZ_32BIT]		= 2,	\ -	[XMIT_SZ_64BIT]		= 3,	\ -	[XMIT_SZ_128BIT]	= 4,	\ -	[XMIT_SZ_256BIT]	= 5,	\ -	[XMIT_SZ_512BIT]	= 6,	\ -} - -#define TS_INDEX2VAL(i) ((((i) & 3) << 3) | \ -			 (((i) & 0xc) << (20 - 2))) -  static const struct sh_dmae_slave_config sh7372_dmae_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_SCIF0_TX,  		.addr		= 0xe6c40020, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_TX(XMIT_SZ_8BIT),  		.mid_rid	= 0x21,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF0_RX,  		.addr		= 0xe6c40024, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x22,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF1_TX,  		.addr		= 0xe6c50020, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_TX(XMIT_SZ_8BIT),  		.mid_rid	= 0x25,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF1_RX,  		.addr		= 0xe6c50024, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x26,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF2_TX,  		.addr		= 0xe6c60020, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_TX(XMIT_SZ_8BIT),  		.mid_rid	= 0x29,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF2_RX,  		.addr		= 0xe6c60024, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x2a,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF3_TX,  		.addr		= 0xe6c70020, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_TX(XMIT_SZ_8BIT),  		.mid_rid	= 0x2d,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF3_RX,  		.addr		= 0xe6c70024, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x2e,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF4_TX,  		.addr		= 0xe6c80020, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_TX(XMIT_SZ_8BIT),  		.mid_rid	= 0x39,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF4_RX,  		.addr		= 0xe6c80024, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x3a,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF5_TX,  		.addr		= 0xe6cb0020, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_TX(XMIT_SZ_8BIT),  		.mid_rid	= 0x35,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF5_RX,  		.addr		= 0xe6cb0024, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x36,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF6_TX,  		.addr		= 0xe6c30040, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_TX(XMIT_SZ_8BIT),  		.mid_rid	= 0x3d,  	}, {  		.slave_id	= SHDMA_SLAVE_SCIF6_RX,  		.addr		= 0xe6c30060, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), +		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x3e,  	}, {  		.slave_id	= SHDMA_SLAVE_SDHI0_TX,  		.addr		= 0xe6850030, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT), +		.chcr		= CHCR_TX(XMIT_SZ_16BIT),  		.mid_rid	= 0xc1,  	}, {  		.slave_id	= SHDMA_SLAVE_SDHI0_RX,  		.addr		= 0xe6850030, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT), +		.chcr		= CHCR_RX(XMIT_SZ_16BIT),  		.mid_rid	= 0xc2,  	}, {  		.slave_id	= SHDMA_SLAVE_SDHI1_TX,  		.addr		= 0xe6860030, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT), +		.chcr		= CHCR_TX(XMIT_SZ_16BIT),  		.mid_rid	= 0xc9,  	}, {  		.slave_id	= SHDMA_SLAVE_SDHI1_RX,  		.addr		= 0xe6860030, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT), +		.chcr		= CHCR_RX(XMIT_SZ_16BIT),  		.mid_rid	= 0xca,  	}, {  		.slave_id	= SHDMA_SLAVE_SDHI2_TX,  		.addr		= 0xe6870030, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT), +		.chcr		= CHCR_TX(XMIT_SZ_16BIT),  		.mid_rid	= 0xcd,  	}, {  		.slave_id	= SHDMA_SLAVE_SDHI2_RX,  		.addr		= 0xe6870030, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT), +		.chcr		= CHCR_RX(XMIT_SZ_16BIT),  		.mid_rid	= 0xce,  	}, {  		.slave_id	= SHDMA_SLAVE_FSIA_TX,  		.addr		= 0xfe1f0024, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.chcr		= CHCR_TX(XMIT_SZ_32BIT),  		.mid_rid	= 0xb1,  	}, {  		.slave_id	= SHDMA_SLAVE_FSIA_RX,  		.addr		= 0xfe1f0020, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.chcr		= CHCR_RX(XMIT_SZ_32BIT),  		.mid_rid	= 0xb2,  	}, {  		.slave_id	= SHDMA_SLAVE_MMCIF_TX,  		.addr		= 0xe6bd0034, -		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.chcr		= CHCR_TX(XMIT_SZ_32BIT),  		.mid_rid	= 0xd1,  	}, {  		.slave_id	= SHDMA_SLAVE_MMCIF_RX,  		.addr		= 0xe6bd0034, -		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.chcr		= CHCR_RX(XMIT_SZ_32BIT),  		.mid_rid	= 0xd2,  	},  }; @@ -520,19 +496,17 @@ static const struct sh_dmae_channel sh7372_dmae_channels[] = {  	}  }; -static const unsigned int ts_shift[] = TS_SHIFT; -  static struct sh_dmae_pdata dma_platform_data = {  	.slave		= sh7372_dmae_slaves,  	.slave_num	= ARRAY_SIZE(sh7372_dmae_slaves),  	.channel	= sh7372_dmae_channels,  	.channel_num	= ARRAY_SIZE(sh7372_dmae_channels), -	.ts_low_shift	= 3, -	.ts_low_mask	= 0x18, -	.ts_high_shift	= (20 - 2),	/* 2 bits for shifted low TS */ -	.ts_high_mask	= 0x00300000, -	.ts_shift	= ts_shift, -	.ts_shift_num	= ARRAY_SIZE(ts_shift), +	.ts_low_shift	= TS_LOW_SHIFT, +	.ts_low_mask	= TS_LOW_BIT << TS_LOW_SHIFT, +	.ts_high_shift	= TS_HI_SHIFT, +	.ts_high_mask	= TS_HI_BIT << TS_HI_SHIFT, +	.ts_shift	= dma_ts_shift, +	.ts_shift_num	= ARRAY_SIZE(dma_ts_shift),  	.dmaor_init	= DMAOR_DME,  	.chclr_present	= 1,  }; @@ -654,17 +628,6 @@ static struct platform_device dma2_device = {  /*   * USB-DMAC   */ - -unsigned int usbts_shift[] = {3, 4, 5}; - -enum { -	XMIT_SZ_8BYTE		= 0, -	XMIT_SZ_16BYTE		= 1, -	XMIT_SZ_32BYTE		= 2, -}; - -#define USBTS_INDEX2VAL(i) (((i) & 3) << 6) -  static const struct sh_dmae_channel sh7372_usb_dmae_channels[] = {  	{  		.offset = 0, @@ -677,10 +640,10 @@ static const struct sh_dmae_channel sh7372_usb_dmae_channels[] = {  static const struct sh_dmae_slave_config sh7372_usb_dmae0_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_USB0_TX, -		.chcr		= USBTS_INDEX2VAL(XMIT_SZ_8BYTE), +		.chcr		= USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE),  	}, {  		.slave_id	= SHDMA_SLAVE_USB0_RX, -		.chcr		= USBTS_INDEX2VAL(XMIT_SZ_8BYTE), +		.chcr		= USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE),  	},  }; @@ -689,12 +652,12 @@ static struct sh_dmae_pdata usb_dma0_platform_data = {  	.slave_num	= ARRAY_SIZE(sh7372_usb_dmae0_slaves),  	.channel	= sh7372_usb_dmae_channels,  	.channel_num	= ARRAY_SIZE(sh7372_usb_dmae_channels), -	.ts_low_shift	= 6, -	.ts_low_mask	= 0xc0, -	.ts_high_shift	= 0, -	.ts_high_mask	= 0, -	.ts_shift	= usbts_shift, -	.ts_shift_num	= ARRAY_SIZE(usbts_shift), +	.ts_low_shift	= USBTS_LOW_SHIFT, +	.ts_low_mask	= USBTS_LOW_BIT << USBTS_LOW_SHIFT, +	.ts_high_shift	= USBTS_HI_SHIFT, +	.ts_high_mask	= USBTS_HI_BIT << USBTS_HI_SHIFT, +	.ts_shift	= dma_usbts_shift, +	.ts_shift_num	= ARRAY_SIZE(dma_usbts_shift),  	.dmaor_init	= DMAOR_DME,  	.chcr_offset	= 0x14,  	.chcr_ie_bit	= 1 << 5, @@ -739,10 +702,10 @@ static struct platform_device usb_dma0_device = {  static const struct sh_dmae_slave_config sh7372_usb_dmae1_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_USB1_TX, -		.chcr		= USBTS_INDEX2VAL(XMIT_SZ_8BYTE), +		.chcr		= USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE),  	}, {  		.slave_id	= SHDMA_SLAVE_USB1_RX, -		.chcr		= USBTS_INDEX2VAL(XMIT_SZ_8BYTE), +		.chcr		= USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE),  	},  }; @@ -751,12 +714,12 @@ static struct sh_dmae_pdata usb_dma1_platform_data = {  	.slave_num	= ARRAY_SIZE(sh7372_usb_dmae1_slaves),  	.channel	= sh7372_usb_dmae_channels,  	.channel_num	= ARRAY_SIZE(sh7372_usb_dmae_channels), -	.ts_low_shift	= 6, -	.ts_low_mask	= 0xc0, -	.ts_high_shift	= 0, -	.ts_high_mask	= 0, -	.ts_shift	= usbts_shift, -	.ts_shift_num	= ARRAY_SIZE(usbts_shift), +	.ts_low_shift	= USBTS_LOW_SHIFT, +	.ts_low_mask	= USBTS_LOW_BIT << USBTS_LOW_SHIFT, +	.ts_high_shift	= USBTS_HI_SHIFT, +	.ts_high_mask	= USBTS_HI_BIT << USBTS_HI_SHIFT, +	.ts_shift	= dma_usbts_shift, +	.ts_shift_num	= ARRAY_SIZE(dma_usbts_shift),  	.dmaor_init	= DMAOR_DME,  	.chcr_offset	= 0x14,  	.chcr_ie_bit	= 1 << 5, @@ -1038,21 +1001,21 @@ static struct platform_device *sh7372_late_devices[] __initdata = {  void __init sh7372_add_standard_devices(void)  { -	sh7372_init_pm_domain(&sh7372_a4lc); -	sh7372_init_pm_domain(&sh7372_a4mp); -	sh7372_init_pm_domain(&sh7372_d4); -	sh7372_init_pm_domain(&sh7372_a4r); -	sh7372_init_pm_domain(&sh7372_a3rv); -	sh7372_init_pm_domain(&sh7372_a3ri); -	sh7372_init_pm_domain(&sh7372_a4s); -	sh7372_init_pm_domain(&sh7372_a3sp); -	sh7372_init_pm_domain(&sh7372_a3sg); +	rmobile_init_pm_domain(&sh7372_pd_a4lc); +	rmobile_init_pm_domain(&sh7372_pd_a4mp); +	rmobile_init_pm_domain(&sh7372_pd_d4); +	rmobile_init_pm_domain(&sh7372_pd_a4r); +	rmobile_init_pm_domain(&sh7372_pd_a3rv); +	rmobile_init_pm_domain(&sh7372_pd_a3ri); +	rmobile_init_pm_domain(&sh7372_pd_a4s); +	rmobile_init_pm_domain(&sh7372_pd_a3sp); +	rmobile_init_pm_domain(&sh7372_pd_a3sg); -	sh7372_pm_add_subdomain(&sh7372_a4lc, &sh7372_a3rv); -	sh7372_pm_add_subdomain(&sh7372_a4r, &sh7372_a4lc); +	rmobile_pm_add_subdomain(&sh7372_pd_a4lc, &sh7372_pd_a3rv); +	rmobile_pm_add_subdomain(&sh7372_pd_a4r, &sh7372_pd_a4lc); -	sh7372_pm_add_subdomain(&sh7372_a4s, &sh7372_a3sg); -	sh7372_pm_add_subdomain(&sh7372_a4s, &sh7372_a3sp); +	rmobile_pm_add_subdomain(&sh7372_pd_a4s, &sh7372_pd_a3sg); +	rmobile_pm_add_subdomain(&sh7372_pd_a4s, &sh7372_pd_a3sp);  	platform_add_devices(sh7372_early_devices,  			    ARRAY_SIZE(sh7372_early_devices)); @@ -1060,30 +1023,30 @@ void __init sh7372_add_standard_devices(void)  	platform_add_devices(sh7372_late_devices,  			    ARRAY_SIZE(sh7372_late_devices)); -	sh7372_add_device_to_domain(&sh7372_a3rv, &vpu_device); -	sh7372_add_device_to_domain(&sh7372_a4mp, &spu0_device); -	sh7372_add_device_to_domain(&sh7372_a4mp, &spu1_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &scif0_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &scif1_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &scif2_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &scif3_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &scif4_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &scif5_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &scif6_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &iic1_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &dma0_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &dma1_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &dma2_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &usb_dma0_device); -	sh7372_add_device_to_domain(&sh7372_a3sp, &usb_dma1_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &iic0_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &veu0_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &veu1_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &veu2_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &veu3_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &jpu_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &tmu00_device); -	sh7372_add_device_to_domain(&sh7372_a4r, &tmu01_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3rv, &vpu_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4mp, &spu0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4mp, &spu1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif2_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif3_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif4_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif5_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif6_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &iic1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &dma0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &dma1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &dma2_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &usb_dma0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a3sp, &usb_dma1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &iic0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu0_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu1_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu2_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu3_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &jpu_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &tmu00_device); +	rmobile_add_device_to_domain(&sh7372_pd_a4r, &tmu01_device);  }  static void __init sh7372_earlytimer_init(void) diff --git a/arch/arm/mach-shmobile/setup-sh7377.c b/arch/arm/mach-shmobile/setup-sh7377.c index d576a6abbad..855b1506caf 100644 --- a/arch/arm/mach-shmobile/setup-sh7377.c +++ b/arch/arm/mach-shmobile/setup-sh7377.c @@ -22,6 +22,7 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/platform_device.h> +#include <linux/of_platform.h>  #include <linux/uio_driver.h>  #include <linux/delay.h>  #include <linux/input.h> @@ -500,3 +501,49 @@ void __init sh7377_add_early_devices(void)  	/* override timer setup with soc-specific code */  	shmobile_timer.init = sh7377_earlytimer_init;  } + +#ifdef CONFIG_USE_OF + +void __init sh7377_add_early_devices_dt(void) +{ +	shmobile_setup_delay(600, 1, 3); /* Cortex-A8 @ 600MHz */ + +	early_platform_add_devices(sh7377_early_devices, +				   ARRAY_SIZE(sh7377_early_devices)); + +	/* setup early console here as well */ +	shmobile_setup_console(); +} + +static const struct of_dev_auxdata sh7377_auxdata_lookup[] __initconst = { +	{ } +}; + +void __init sh7377_add_standard_devices_dt(void) +{ +	/* clocks are setup late during boot in the case of DT */ +	sh7377_clock_init(); + +	platform_add_devices(sh7377_early_devices, +			    ARRAY_SIZE(sh7377_early_devices)); + +	of_platform_populate(NULL, of_default_bus_match_table, +			     sh7377_auxdata_lookup, NULL); +} + +static const char *sh7377_boards_compat_dt[] __initdata = { +	"renesas,sh7377", +	NULL, +}; + +DT_MACHINE_START(SH7377_DT, "Generic SH7377 (Flattened Device Tree)") +	.map_io		= sh7377_map_io, +	.init_early	= sh7377_add_early_devices_dt, +	.init_irq	= sh7377_init_irq, +	.handle_irq	= shmobile_handle_irq_intc, +	.init_machine	= sh7377_add_standard_devices_dt, +	.timer		= &shmobile_timer, +	.dt_compat	= sh7377_boards_compat_dt, +MACHINE_END + +#endif /* CONFIG_USE_OF */ diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index 04a0dfe7549..d230af656fc 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c @@ -30,6 +30,7 @@  #include <linux/sh_dma.h>  #include <linux/sh_intc.h>  #include <linux/sh_timer.h> +#include <mach/dma-register.h>  #include <mach/hardware.h>  #include <mach/irqs.h>  #include <mach/sh73a0.h> @@ -415,32 +416,6 @@ static struct platform_device i2c4_device = {  	.num_resources	= ARRAY_SIZE(i2c4_resources),  }; -/* Transmit sizes and respective CHCR register values */ -enum { -	XMIT_SZ_8BIT		= 0, -	XMIT_SZ_16BIT		= 1, -	XMIT_SZ_32BIT		= 2, -	XMIT_SZ_64BIT		= 7, -	XMIT_SZ_128BIT		= 3, -	XMIT_SZ_256BIT		= 4, -	XMIT_SZ_512BIT		= 5, -}; - -/* log2(size / 8) - used to calculate number of transfers */ -#define TS_SHIFT {			\ -	[XMIT_SZ_8BIT]		= 0,	\ -	[XMIT_SZ_16BIT]		= 1,	\ -	[XMIT_SZ_32BIT]		= 2,	\ -	[XMIT_SZ_64BIT]		= 3,	\ -	[XMIT_SZ_128BIT]	= 4,	\ -	[XMIT_SZ_256BIT]	= 5,	\ -	[XMIT_SZ_512BIT]	= 6,	\ -} - -#define TS_INDEX2VAL(i) ((((i) & 3) << 3) | (((i) & 0xc) << (20 - 2))) -#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz))) -#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz))) -  static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_SCIF0_TX, @@ -604,19 +579,17 @@ static const struct sh_dmae_channel sh73a0_dmae_channels[] = {  	DMAE_CHANNEL(0x8980),  }; -static const unsigned int ts_shift[] = TS_SHIFT; -  static struct sh_dmae_pdata sh73a0_dmae_platform_data = {  	.slave          = sh73a0_dmae_slaves,  	.slave_num      = ARRAY_SIZE(sh73a0_dmae_slaves),  	.channel        = sh73a0_dmae_channels,  	.channel_num    = ARRAY_SIZE(sh73a0_dmae_channels), -	.ts_low_shift   = 3, -	.ts_low_mask    = 0x18, -	.ts_high_shift  = (20 - 2),     /* 2 bits for shifted low TS */ -	.ts_high_mask   = 0x00300000, -	.ts_shift       = ts_shift, -	.ts_shift_num   = ARRAY_SIZE(ts_shift), +	.ts_low_shift   = TS_LOW_SHIFT, +	.ts_low_mask    = TS_LOW_BIT << TS_LOW_SHIFT, +	.ts_high_shift  = TS_HI_SHIFT, +	.ts_high_mask   = TS_HI_BIT << TS_HI_SHIFT, +	.ts_shift       = dma_ts_shift, +	.ts_shift_num   = ARRAY_SIZE(dma_ts_shift),  	.dmaor_init     = DMAOR_DME,  }; @@ -651,6 +624,116 @@ static struct platform_device dma0_device = {  	},  }; +/* MPDMAC */ +static const struct sh_dmae_slave_config sh73a0_mpdma_slaves[] = { +	{ +		.slave_id	= SHDMA_SLAVE_FSI2A_RX, +		.addr		= 0xec230020, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0xd6, /* CHECK ME */ +	}, { +		.slave_id	= SHDMA_SLAVE_FSI2A_TX, +		.addr		= 0xec230024, +		.chcr		= CHCR_TX(XMIT_SZ_32BIT), +		.mid_rid	= 0xd5, /* CHECK ME */ +	}, { +		.slave_id	= SHDMA_SLAVE_FSI2C_RX, +		.addr		= 0xec230060, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0xda, /* CHECK ME */ +	}, { +		.slave_id	= SHDMA_SLAVE_FSI2C_TX, +		.addr		= 0xec230064, +		.chcr		= CHCR_TX(XMIT_SZ_32BIT), +		.mid_rid	= 0xd9, /* CHECK ME */ +	}, { +		.slave_id	= SHDMA_SLAVE_FSI2B_RX, +		.addr		= 0xec240020, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0x8e, /* CHECK ME */ +	}, { +		.slave_id	= SHDMA_SLAVE_FSI2B_TX, +		.addr		= 0xec240024, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0x8d, /* CHECK ME */ +	}, { +		.slave_id	= SHDMA_SLAVE_FSI2D_RX, +		.addr		=  0xec240060, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0x9a, /* CHECK ME */ +	}, +}; + +#define MPDMA_CHANNEL(a, b, c)			\ +{						\ +	.offset		= a,			\ +	.dmars		= b,			\ +	.dmars_bit	= c,			\ +	.chclr_offset	= (0x220 - 0x20) + a	\ +} + +static const struct sh_dmae_channel sh73a0_mpdma_channels[] = { +	MPDMA_CHANNEL(0x00, 0, 0), +	MPDMA_CHANNEL(0x10, 0, 8), +	MPDMA_CHANNEL(0x20, 4, 0), +	MPDMA_CHANNEL(0x30, 4, 8), +	MPDMA_CHANNEL(0x50, 8, 0), +	MPDMA_CHANNEL(0x70, 8, 8), +}; + +static struct sh_dmae_pdata sh73a0_mpdma_platform_data = { +	.slave		= sh73a0_mpdma_slaves, +	.slave_num	= ARRAY_SIZE(sh73a0_mpdma_slaves), +	.channel	= sh73a0_mpdma_channels, +	.channel_num	= ARRAY_SIZE(sh73a0_mpdma_channels), +	.ts_low_shift	= TS_LOW_SHIFT, +	.ts_low_mask	= TS_LOW_BIT << TS_LOW_SHIFT, +	.ts_high_shift	= TS_HI_SHIFT, +	.ts_high_mask	= TS_HI_BIT << TS_HI_SHIFT, +	.ts_shift	= dma_ts_shift, +	.ts_shift_num	= ARRAY_SIZE(dma_ts_shift), +	.dmaor_init	= DMAOR_DME, +	.chclr_present	= 1, +}; + +/* Resource order important! */ +static struct resource sh73a0_mpdma_resources[] = { +	{ +		/* Channel registers and DMAOR */ +		.start	= 0xec618020, +		.end	= 0xec61828f, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		/* DMARSx */ +		.start	= 0xec619000, +		.end	= 0xec61900b, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		.name	= "error_irq", +		.start	= gic_spi(181), +		.end	= gic_spi(181), +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		/* IRQ for channels 0-5 */ +		.start	= gic_spi(175), +		.end	= gic_spi(180), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device mpdma0_device = { +	.name		= "sh-dma-engine", +	.id		= 1, +	.resource	= sh73a0_mpdma_resources, +	.num_resources	= ARRAY_SIZE(sh73a0_mpdma_resources), +	.dev		= { +		.platform_data	= &sh73a0_mpdma_platform_data, +	}, +}; +  static struct platform_device *sh73a0_early_devices[] __initdata = {  	&scif0_device,  	&scif1_device, @@ -673,6 +756,7 @@ static struct platform_device *sh73a0_late_devices[] __initdata = {  	&i2c3_device,  	&i2c4_device,  	&dma0_device, +	&mpdma0_device,  };  #define SRCR2          0xe61580b0 diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile new file mode 100644 index 00000000000..4fb93240971 --- /dev/null +++ b/arch/arm/mach-socfpga/Makefile @@ -0,0 +1,5 @@ +# +# Makefile for the linux kernel. +# + +obj-y					:= socfpga.o diff --git a/arch/arm/mach-socfpga/Makefile.boot b/arch/arm/mach-socfpga/Makefile.boot new file mode 100644 index 00000000000..dae9661a768 --- /dev/null +++ b/arch/arm/mach-socfpga/Makefile.boot @@ -0,0 +1 @@ +zreladdr-y	:= 0x00008000 diff --git a/arch/arm/mach-socfpga/include/mach/debug-macro.S b/arch/arm/mach-socfpga/include/mach/debug-macro.S new file mode 100644 index 00000000000..d6f26d23374 --- /dev/null +++ b/arch/arm/mach-socfpga/include/mach/debug-macro.S @@ -0,0 +1,16 @@ +/* + *  Copyright (C) 1994-1999 Russell King + *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks + * + * 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. + */ + +		.macro	addruart, rp, rv, tmp +		mov	\rp, #DEBUG_LL_UART_OFFSET +		orr	\rp, \rp, #0x00c00000 +		orr	\rv, \rp, #0xfe000000	@ virtual base +		orr	\rp, \rp, #0xff000000	@ physical base +		.endm + diff --git a/arch/arm/mach-at91/include/mach/irqs.h b/arch/arm/mach-socfpga/include/mach/timex.h index ac8b7dfc85e..43df4354e46 100644 --- a/arch/arm/mach-at91/include/mach/irqs.h +++ b/arch/arm/mach-socfpga/include/mach/timex.h @@ -1,7 +1,5 @@  /* - * arch/arm/mach-at91/include/mach/irqs.h - * - *  Copyright (C) 2004 SAN People + *  Copyright (C) 2003 ARM Limited   *   * 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 @@ -18,31 +16,4 @@   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ -#ifndef __ASM_ARCH_IRQS_H -#define __ASM_ARCH_IRQS_H - -#include <linux/io.h> -#include <mach/at91_aic.h> - -#define NR_AIC_IRQS 32 - - -/* - * Acknowledge interrupt with AIC after interrupt has been handled. - *   (by kernel/irq.c) - */ -#define irq_finish(irq) do { at91_aic_write(AT91_AIC_EOICR, 0); } while (0) - - -/* - * IRQ interrupt symbols are the AT91xxx_ID_* symbols - * for IRQs handled directly through the AIC, or else the AT91_PIN_* - * symbols in gpio.h for ones handled indirectly as GPIOs. - * We make provision for 5 banks of GPIO. - */ -#define	NR_IRQS		(NR_AIC_IRQS + (5 * 32)) - -/* FIQ is AIC source 0. */ -#define FIQ_START AT91_ID_FIQ - -#endif +#define CLOCK_TICK_RATE		(50000000 / 16) diff --git a/arch/arm/mach-socfpga/include/mach/uncompress.h b/arch/arm/mach-socfpga/include/mach/uncompress.h new file mode 100644 index 00000000000..bbe20e69632 --- /dev/null +++ b/arch/arm/mach-socfpga/include/mach/uncompress.h @@ -0,0 +1,9 @@ +#ifndef __MACH_UNCOMPRESS_H +#define __MACH_UNCOMPRESS_H + +#define putc(c) +#define flush() +#define arch_decomp_setup() +#define arch_decomp_wdog() + +#endif diff --git a/arch/arm/mach-socfpga/socfpga.c b/arch/arm/mach-socfpga/socfpga.c new file mode 100644 index 00000000000..f01e1ebf539 --- /dev/null +++ b/arch/arm/mach-socfpga/socfpga.c @@ -0,0 +1,62 @@ +/* + *  Copyright (C) 2012 Altera Corporation + * + * 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, see <http://www.gnu.org/licenses/>. + */ +#include <linux/dw_apb_timer.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> + +#include <asm/hardware/cache-l2x0.h> +#include <asm/hardware/gic.h> +#include <asm/mach/arch.h> + +extern void socfpga_init_clocks(void); + +const static struct of_device_id irq_match[] = { +	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, +	{} +}; + +static void __init gic_init_irq(void) +{ +	of_irq_init(irq_match); +} + +static void socfpga_cyclone5_restart(char mode, const char *cmd) +{ +	/* TODO: */ +} + +static void __init socfpga_cyclone5_init(void) +{ +	l2x0_of_init(0, ~0UL); +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +	socfpga_init_clocks(); +} + +static const char *altera_dt_match[] = { +	"altr,socfpga", +	"altr,socfpga-cyclone5", +	NULL +}; + +DT_MACHINE_START(SOCFPGA, "Altera SOCFPGA") +	.init_irq	= gic_init_irq, +	.handle_irq     = gic_handle_irq, +	.timer		= &dw_apb_timer, +	.init_machine	= socfpga_cyclone5_init, +	.restart	= socfpga_cyclone5_restart, +	.dt_compat	= altera_dt_match, +MACHINE_END diff --git a/arch/arm/mach-spear3xx/spear300.c b/arch/arm/mach-spear3xx/spear300.c index 0f882ecb7d8..6ec30054996 100644 --- a/arch/arm/mach-spear3xx/spear300.c +++ b/arch/arm/mach-spear3xx/spear300.c @@ -120,182 +120,156 @@ struct pl08x_channel_data spear300_dma_info[] = {  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart0_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp0_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp0_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "irda",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "adc",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "to_jpeg",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "from_jpeg",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras0_rx",  		.min_signal = 0,  		.max_signal = 0,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras0_tx",  		.min_signal = 1,  		.max_signal = 1,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras1_rx",  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras1_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras2_rx",  		.min_signal = 4,  		.max_signal = 4,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras2_tx",  		.min_signal = 5,  		.max_signal = 5,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras3_rx",  		.min_signal = 6,  		.max_signal = 6,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras3_tx",  		.min_signal = 7,  		.max_signal = 7,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras4_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras4_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras5_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras5_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras6_rx",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras6_tx",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras7_rx",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras7_tx",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	},  }; diff --git a/arch/arm/mach-spear3xx/spear310.c b/arch/arm/mach-spear3xx/spear310.c index bbcf4571d36..1d0e435b904 100644 --- a/arch/arm/mach-spear3xx/spear310.c +++ b/arch/arm/mach-spear3xx/spear310.c @@ -205,182 +205,156 @@ struct pl08x_channel_data spear310_dma_info[] = {  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart0_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp0_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp0_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "irda",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "adc",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "to_jpeg",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "from_jpeg",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart1_rx",  		.min_signal = 0,  		.max_signal = 0,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart1_tx",  		.min_signal = 1,  		.max_signal = 1,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart2_rx",  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart2_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart3_rx",  		.min_signal = 4,  		.max_signal = 4,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart3_tx",  		.min_signal = 5,  		.max_signal = 5,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart4_rx",  		.min_signal = 6,  		.max_signal = 6,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart4_tx",  		.min_signal = 7,  		.max_signal = 7,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart5_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart5_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras5_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras5_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras6_rx",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras6_tx",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras7_rx",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras7_tx",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	},  }; diff --git a/arch/arm/mach-spear3xx/spear320.c b/arch/arm/mach-spear3xx/spear320.c index 88d483bcd66..fd823c62457 100644 --- a/arch/arm/mach-spear3xx/spear320.c +++ b/arch/arm/mach-spear3xx/spear320.c @@ -213,182 +213,156 @@ struct pl08x_channel_data spear320_dma_info[] = {  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart0_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp0_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp0_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c0_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c0_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "irda",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "adc",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "to_jpeg",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "from_jpeg",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp1_rx",  		.min_signal = 0,  		.max_signal = 0,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ssp1_tx",  		.min_signal = 1,  		.max_signal = 1,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ssp2_rx",  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ssp2_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "uart1_rx",  		.min_signal = 4,  		.max_signal = 4,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "uart1_tx",  		.min_signal = 5,  		.max_signal = 5,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "uart2_rx",  		.min_signal = 6,  		.max_signal = 6,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "uart2_tx",  		.min_signal = 7,  		.max_signal = 7,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "i2c1_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "i2c1_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "i2c2_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "i2c2_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "i2s_rx",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "i2s_tx",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "rs485_rx",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "rs485_tx",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	},  }; diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c index 66db5f13af8..98144baf888 100644 --- a/arch/arm/mach-spear3xx/spear3xx.c +++ b/arch/arm/mach-spear3xx/spear3xx.c @@ -46,7 +46,8 @@ struct pl022_ssp_controller pl022_plat_data = {  struct pl08x_platform_data pl080_plat_data = {  	.memcpy_channel = {  		.bus_id = "memcpy", -		.cctl = (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \ +		.cctl_memcpy = +			(PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \  			PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \  			PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \  			PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \ diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c index 9af67d003c6..5a5a52db252 100644 --- a/arch/arm/mach-spear6xx/spear6xx.c +++ b/arch/arm/mach-spear6xx/spear6xx.c @@ -36,336 +36,288 @@ static struct pl08x_channel_data spear600_dma_info[] = {  		.min_signal = 0,  		.max_signal = 0,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp1_tx",  		.min_signal = 1,  		.max_signal = 1,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart0_rx",  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart0_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart1_rx",  		.min_signal = 4,  		.max_signal = 4,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "uart1_tx",  		.min_signal = 5,  		.max_signal = 5,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp2_rx",  		.min_signal = 6,  		.max_signal = 6,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ssp2_tx",  		.min_signal = 7,  		.max_signal = 7,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ssp0_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ssp0_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "i2c_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "irda",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "adc",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "to_jpeg",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "from_jpeg",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 0, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras0_rx",  		.min_signal = 0,  		.max_signal = 0,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras0_tx",  		.min_signal = 1,  		.max_signal = 1,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras1_rx",  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras1_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras2_rx",  		.min_signal = 4,  		.max_signal = 4,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras2_tx",  		.min_signal = 5,  		.max_signal = 5,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras3_rx",  		.min_signal = 6,  		.max_signal = 6,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras3_tx",  		.min_signal = 7,  		.max_signal = 7,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras4_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras4_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras5_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras5_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras6_rx",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras6_tx",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras7_rx",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ras7_tx",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 1, -		.cctl = 0,  		.periph_buses = PL08X_AHB1,  	}, {  		.bus_id = "ext0_rx",  		.min_signal = 0,  		.max_signal = 0,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext0_tx",  		.min_signal = 1,  		.max_signal = 1,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext1_rx",  		.min_signal = 2,  		.max_signal = 2,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext1_tx",  		.min_signal = 3,  		.max_signal = 3,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext2_rx",  		.min_signal = 4,  		.max_signal = 4,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext2_tx",  		.min_signal = 5,  		.max_signal = 5,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext3_rx",  		.min_signal = 6,  		.max_signal = 6,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext3_tx",  		.min_signal = 7,  		.max_signal = 7,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext4_rx",  		.min_signal = 8,  		.max_signal = 8,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext4_tx",  		.min_signal = 9,  		.max_signal = 9,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext5_rx",  		.min_signal = 10,  		.max_signal = 10,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext5_tx",  		.min_signal = 11,  		.max_signal = 11,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext6_rx",  		.min_signal = 12,  		.max_signal = 12,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext6_tx",  		.min_signal = 13,  		.max_signal = 13,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext7_rx",  		.min_signal = 14,  		.max_signal = 14,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	}, {  		.bus_id = "ext7_tx",  		.min_signal = 15,  		.max_signal = 15,  		.muxval = 2, -		.cctl = 0,  		.periph_buses = PL08X_AHB2,  	},  }; @@ -373,7 +325,8 @@ static struct pl08x_channel_data spear600_dma_info[] = {  struct pl08x_platform_data pl080_plat_data = {  	.memcpy_channel = {  		.bus_id = "memcpy", -		.cctl = (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \ +		.cctl_memcpy = +			(PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \  			PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \  			PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \  			PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \ diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 6a113a9bb87..9077aaa398d 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -63,40 +63,15 @@ comment "Tegra board type"  config MACH_HARMONY         bool "Harmony board"         depends on ARCH_TEGRA_2x_SOC -       select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC         help           Support for nVidia Harmony development platform -config MACH_KAEN -       bool "Kaen board" -       depends on ARCH_TEGRA_2x_SOC -       select MACH_SEABOARD -       select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC -       help -         Support for the Kaen version of Seaboard -  config MACH_PAZ00         bool "Paz00 board"         depends on ARCH_TEGRA_2x_SOC         help           Support for the Toshiba AC100/Dynabook AZ netbook -config MACH_SEABOARD -       bool "Seaboard board" -       depends on ARCH_TEGRA_2x_SOC -       select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC -       help -         Support for nVidia Seaboard development platform. It will -	 also be included for some of the derivative boards that -	 have large similarities with the seaboard design. - -config MACH_TEGRA_DT -	bool "Generic Tegra20 board (FDT support)" -	depends on ARCH_TEGRA_2x_SOC -	select USE_OF -	help -	  Support for generic NVIDIA Tegra20 boards using Flattened Device Tree -  config MACH_TRIMSLICE         bool "TrimSlice board"         depends on ARCH_TEGRA_2x_SOC @@ -104,20 +79,6 @@ config MACH_TRIMSLICE         help           Support for CompuLab TrimSlice platform -config MACH_WARIO -       bool "Wario board" -       depends on ARCH_TEGRA_2x_SOC -       select MACH_SEABOARD -       help -         Support for the Wario version of Seaboard - -config MACH_VENTANA -       bool "Ventana board" -       depends on ARCH_TEGRA_2x_SOC -       select MACH_TEGRA_DT -       help -         Support for the nVidia Ventana development platform -  choice          prompt "Default low-level debug console UART"          default TEGRA_DEBUG_UART_NONE diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index 2eb4445ddb1..c3d7303b9ac 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile @@ -8,21 +8,24 @@ obj-y                                   += timer.o  obj-y					+= fuse.o  obj-y					+= pmc.o  obj-y					+= flowctrl.o +obj-y					+= powergate.o +obj-y					+= apbio.o  obj-$(CONFIG_CPU_IDLE)			+= cpuidle.o  obj-$(CONFIG_CPU_IDLE)			+= sleep.o -obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= powergate.o  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra2_clocks.o  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= tegra2_emc.o -obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= board-dt-tegra30.o  obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= tegra30_clocks.o  obj-$(CONFIG_SMP)			+= platsmp.o headsmp.o  obj-$(CONFIG_SMP)                       += reset.o  obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o -obj-$(CONFIG_TEGRA_SYSTEM_DMA)		+= dma.o apbio.o +obj-$(CONFIG_TEGRA_SYSTEM_DMA)		+= dma.o  obj-$(CONFIG_CPU_FREQ)                  += cpu-tegra.o  obj-$(CONFIG_TEGRA_PCI)			+= pcie.o  obj-$(CONFIG_USB_SUPPORT)		+= usb_phy.o +obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= board-dt-tegra20.o +obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= board-dt-tegra30.o +  obj-$(CONFIG_MACH_HARMONY)              += board-harmony.o  obj-$(CONFIG_MACH_HARMONY)              += board-harmony-pinmux.o  obj-$(CONFIG_MACH_HARMONY)              += board-harmony-pcie.o @@ -31,14 +34,5 @@ obj-$(CONFIG_MACH_HARMONY)              += board-harmony-power.o  obj-$(CONFIG_MACH_PAZ00)		+= board-paz00.o  obj-$(CONFIG_MACH_PAZ00)		+= board-paz00-pinmux.o -obj-$(CONFIG_MACH_SEABOARD)             += board-seaboard.o -obj-$(CONFIG_MACH_SEABOARD)             += board-seaboard-pinmux.o - -obj-$(CONFIG_MACH_TEGRA_DT)             += board-dt-tegra20.o -obj-$(CONFIG_MACH_TEGRA_DT)             += board-harmony-pinmux.o -obj-$(CONFIG_MACH_TEGRA_DT)             += board-seaboard-pinmux.o -obj-$(CONFIG_MACH_TEGRA_DT)             += board-paz00-pinmux.o -obj-$(CONFIG_MACH_TEGRA_DT)             += board-trimslice-pinmux.o -  obj-$(CONFIG_MACH_TRIMSLICE)            += board-trimslice.o  obj-$(CONFIG_MACH_TRIMSLICE)            += board-trimslice-pinmux.o diff --git a/arch/arm/mach-tegra/Makefile.boot b/arch/arm/mach-tegra/Makefile.boot index 9a82094092d..7a1bb62ddcf 100644 --- a/arch/arm/mach-tegra/Makefile.boot +++ b/arch/arm/mach-tegra/Makefile.boot @@ -2,9 +2,10 @@ zreladdr-$(CONFIG_ARCH_TEGRA_2x_SOC)	+= 0x00008000  params_phys-$(CONFIG_ARCH_TEGRA_2x_SOC)	:= 0x00000100  initrd_phys-$(CONFIG_ARCH_TEGRA_2x_SOC)	:= 0x00800000 -dtb-$(CONFIG_MACH_HARMONY) += tegra-harmony.dtb -dtb-$(CONFIG_MACH_PAZ00) += tegra-paz00.dtb -dtb-$(CONFIG_MACH_SEABOARD) += tegra-seaboard.dtb -dtb-$(CONFIG_MACH_TRIMSLICE) += tegra-trimslice.dtb -dtb-$(CONFIG_MACH_VENTANA) += tegra-ventana.dtb -dtb-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra-cardhu.dtb +dtb-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20-harmony.dtb +dtb-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20-paz00.dtb +dtb-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20-seaboard.dtb +dtb-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20-trimslice.dtb +dtb-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20-ventana.dtb +dtb-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20-whistler.dtb +dtb-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra30-cardhu.dtb diff --git a/arch/arm/mach-tegra/apbio.c b/arch/arm/mach-tegra/apbio.c index e75451e517b..dc0fe389be5 100644 --- a/arch/arm/mach-tegra/apbio.c +++ b/arch/arm/mach-tegra/apbio.c @@ -15,6 +15,9 @@  #include <linux/kernel.h>  #include <linux/io.h> +#include <mach/iomap.h> +#include <linux/of.h> +#include <linux/dmaengine.h>  #include <linux/dma-mapping.h>  #include <linux/spinlock.h>  #include <linux/completion.h> @@ -22,17 +25,21 @@  #include <linux/mutex.h>  #include <mach/dma.h> -#include <mach/iomap.h>  #include "apbio.h" +#if defined(CONFIG_TEGRA_SYSTEM_DMA) || defined(CONFIG_TEGRA20_APB_DMA)  static DEFINE_MUTEX(tegra_apb_dma_lock); - -static struct tegra_dma_channel *tegra_apb_dma;  static u32 *tegra_apb_bb;  static dma_addr_t tegra_apb_bb_phys;  static DECLARE_COMPLETION(tegra_apb_wait); +static u32 tegra_apb_readl_direct(unsigned long offset); +static void tegra_apb_writel_direct(u32 value, unsigned long offset); + +#if defined(CONFIG_TEGRA_SYSTEM_DMA) +static struct tegra_dma_channel *tegra_apb_dma; +  bool tegra_apb_init(void)  {  	struct tegra_dma_channel *ch; @@ -72,13 +79,13 @@ static void apb_dma_complete(struct tegra_dma_req *req)  	complete(&tegra_apb_wait);  } -u32 tegra_apb_readl(unsigned long offset) +static u32 tegra_apb_readl_using_dma(unsigned long offset)  {  	struct tegra_dma_req req;  	int ret;  	if (!tegra_apb_dma && !tegra_apb_init()) -		return readl(IO_TO_VIRT(offset)); +		return tegra_apb_readl_direct(offset);  	mutex_lock(&tegra_apb_dma_lock);  	req.complete = apb_dma_complete; @@ -108,13 +115,13 @@ u32 tegra_apb_readl(unsigned long offset)  	return *((u32 *)tegra_apb_bb);  } -void tegra_apb_writel(u32 value, unsigned long offset) +static void tegra_apb_writel_using_dma(u32 value, unsigned long offset)  {  	struct tegra_dma_req req;  	int ret;  	if (!tegra_apb_dma && !tegra_apb_init()) { -		writel(value, IO_TO_VIRT(offset)); +		tegra_apb_writel_direct(value, offset);  		return;  	} @@ -143,3 +150,176 @@ void tegra_apb_writel(u32 value, unsigned long offset)  	mutex_unlock(&tegra_apb_dma_lock);  } + +#else +static struct dma_chan *tegra_apb_dma_chan; +static struct dma_slave_config dma_sconfig; + +bool tegra_apb_dma_init(void) +{ +	dma_cap_mask_t mask; + +	mutex_lock(&tegra_apb_dma_lock); + +	/* Check to see if we raced to setup */ +	if (tegra_apb_dma_chan) +		goto skip_init; + +	dma_cap_zero(mask); +	dma_cap_set(DMA_SLAVE, mask); +	tegra_apb_dma_chan = dma_request_channel(mask, NULL, NULL); +	if (!tegra_apb_dma_chan) { +		/* +		 * This is common until the device is probed, so don't +		 * shout about it. +		 */ +		pr_debug("%s: can not allocate dma channel\n", __func__); +		goto err_dma_alloc; +	} + +	tegra_apb_bb = dma_alloc_coherent(NULL, sizeof(u32), +		&tegra_apb_bb_phys, GFP_KERNEL); +	if (!tegra_apb_bb) { +		pr_err("%s: can not allocate bounce buffer\n", __func__); +		goto err_buff_alloc; +	} + +	dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; +	dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; +	dma_sconfig.slave_id = TEGRA_DMA_REQ_SEL_CNTR; +	dma_sconfig.src_maxburst = 1; +	dma_sconfig.dst_maxburst = 1; + +skip_init: +	mutex_unlock(&tegra_apb_dma_lock); +	return true; + +err_buff_alloc: +	dma_release_channel(tegra_apb_dma_chan); +	tegra_apb_dma_chan = NULL; + +err_dma_alloc: +	mutex_unlock(&tegra_apb_dma_lock); +	return false; +} + +static void apb_dma_complete(void *args) +{ +	complete(&tegra_apb_wait); +} + +static int do_dma_transfer(unsigned long apb_add, +		enum dma_transfer_direction dir) +{ +	struct dma_async_tx_descriptor *dma_desc; +	int ret; + +	if (dir == DMA_DEV_TO_MEM) +		dma_sconfig.src_addr = apb_add; +	else +		dma_sconfig.dst_addr = apb_add; + +	ret = dmaengine_slave_config(tegra_apb_dma_chan, &dma_sconfig); +	if (ret) +		return ret; + +	dma_desc = dmaengine_prep_slave_single(tegra_apb_dma_chan, +			tegra_apb_bb_phys, sizeof(u32), dir, +			DMA_PREP_INTERRUPT |  DMA_CTRL_ACK); +	if (!dma_desc) +		return -EINVAL; + +	dma_desc->callback = apb_dma_complete; +	dma_desc->callback_param = NULL; + +	INIT_COMPLETION(tegra_apb_wait); + +	dmaengine_submit(dma_desc); +	dma_async_issue_pending(tegra_apb_dma_chan); +	ret = wait_for_completion_timeout(&tegra_apb_wait, +		msecs_to_jiffies(50)); + +	if (WARN(ret == 0, "apb read dma timed out")) { +		dmaengine_terminate_all(tegra_apb_dma_chan); +		return -EFAULT; +	} +	return 0; +} + +static u32 tegra_apb_readl_using_dma(unsigned long offset) +{ +	int ret; + +	if (!tegra_apb_dma_chan && !tegra_apb_dma_init()) +		return tegra_apb_readl_direct(offset); + +	mutex_lock(&tegra_apb_dma_lock); +	ret = do_dma_transfer(offset, DMA_DEV_TO_MEM); +	if (ret < 0) { +		pr_err("error in reading offset 0x%08lx using dma\n", offset); +		*(u32 *)tegra_apb_bb = 0; +	} +	mutex_unlock(&tegra_apb_dma_lock); +	return *((u32 *)tegra_apb_bb); +} + +static void tegra_apb_writel_using_dma(u32 value, unsigned long offset) +{ +	int ret; + +	if (!tegra_apb_dma_chan && !tegra_apb_dma_init()) { +		tegra_apb_writel_direct(value, offset); +		return; +	} + +	mutex_lock(&tegra_apb_dma_lock); +	*((u32 *)tegra_apb_bb) = value; +	ret = do_dma_transfer(offset, DMA_MEM_TO_DEV); +	if (ret < 0) +		pr_err("error in writing offset 0x%08lx using dma\n", offset); +	mutex_unlock(&tegra_apb_dma_lock); +} +#endif +#else +#define tegra_apb_readl_using_dma tegra_apb_readl_direct +#define tegra_apb_writel_using_dma tegra_apb_writel_direct +#endif + +typedef u32 (*apbio_read_fptr)(unsigned long offset); +typedef void (*apbio_write_fptr)(u32 value, unsigned long offset); + +static apbio_read_fptr apbio_read; +static apbio_write_fptr apbio_write; + +static u32 tegra_apb_readl_direct(unsigned long offset) +{ +	return readl(IO_TO_VIRT(offset)); +} + +static void tegra_apb_writel_direct(u32 value, unsigned long offset) +{ +	writel(value, IO_TO_VIRT(offset)); +} + +void tegra_apb_io_init(void) +{ +	/* Need to use dma only when it is Tegra20 based platform */ +	if (of_machine_is_compatible("nvidia,tegra20") || +			!of_have_populated_dt()) { +		apbio_read = tegra_apb_readl_using_dma; +		apbio_write = tegra_apb_writel_using_dma; +	} else { +		apbio_read = tegra_apb_readl_direct; +		apbio_write = tegra_apb_writel_direct; +	} +} + +u32 tegra_apb_readl(unsigned long offset) +{ +	return apbio_read(offset); +} + +void tegra_apb_writel(u32 value, unsigned long offset) +{ +	apbio_write(value, offset); +} diff --git a/arch/arm/mach-tegra/apbio.h b/arch/arm/mach-tegra/apbio.h index 8b49e8c89a6..f05d71c303c 100644 --- a/arch/arm/mach-tegra/apbio.h +++ b/arch/arm/mach-tegra/apbio.h @@ -16,24 +16,7 @@  #ifndef __MACH_TEGRA_APBIO_H  #define __MACH_TEGRA_APBIO_H -#ifdef CONFIG_TEGRA_SYSTEM_DMA - +void tegra_apb_io_init(void);  u32 tegra_apb_readl(unsigned long offset);  void tegra_apb_writel(u32 value, unsigned long offset); - -#else -#include <asm/io.h> -#include <mach/io.h> - -static inline u32 tegra_apb_readl(unsigned long offset) -{ -        return readl(IO_TO_VIRT(offset)); -} - -static inline void tegra_apb_writel(u32 value, unsigned long offset) -{ -        writel(value, IO_TO_VIRT(offset)); -} -#endif -  #endif diff --git a/arch/arm/mach-tegra/board-dt-tegra20.c b/arch/arm/mach-tegra/board-dt-tegra20.c index eb7249db50a..c0999633a9a 100644 --- a/arch/arm/mach-tegra/board-dt-tegra20.c +++ b/arch/arm/mach-tegra/board-dt-tegra20.c @@ -64,6 +64,8 @@ struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {  		       &tegra_ehci2_pdata),  	OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2",  		       &tegra_ehci3_pdata), +	OF_DEV_AUXDATA("nvidia,tegra20-apbdma", TEGRA_APB_DMA_BASE, "tegra-apbdma", NULL), +	OF_DEV_AUXDATA("nvidia,tegra20-pwm", TEGRA_PWFM_BASE, "tegra-pwm", NULL),  	{}  }; @@ -81,11 +83,6 @@ static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = {  	{ NULL,		NULL,		0,		0},  }; -static struct of_device_id tegra_dt_match_table[] __initdata = { -	{ .compatible = "simple-bus", }, -	{} -}; -  static void __init tegra_dt_init(void)  {  	tegra_clk_init_from_table(tegra_dt_clk_init_table); @@ -94,10 +91,74 @@ static void __init tegra_dt_init(void)  	 * Finished with the static registrations now; fill in the missing  	 * devices  	 */ -	of_platform_populate(NULL, tegra_dt_match_table, +	of_platform_populate(NULL, of_default_bus_match_table,  				tegra20_auxdata_lookup, NULL);  } +#ifdef CONFIG_MACH_TRIMSLICE +static void __init trimslice_init(void) +{ +	int ret; + +	ret = tegra_pcie_init(true, true); +	if (ret) +		pr_err("tegra_pci_init() failed: %d\n", ret); +} +#endif + +#ifdef CONFIG_MACH_HARMONY +static void __init harmony_init(void) +{ +	int ret; + +	ret = harmony_regulator_init(); +	if (ret) { +		pr_err("harmony_regulator_init() failed: %d\n", ret); +		return; +	} + +	ret = harmony_pcie_init(); +	if (ret) +		pr_err("harmony_pcie_init() failed: %d\n", ret); +} +#endif + +#ifdef CONFIG_MACH_PAZ00 +static void __init paz00_init(void) +{ +	tegra_paz00_wifikill_init(); +} +#endif + +static struct { +	char *machine; +	void (*init)(void); +} board_init_funcs[] = { +#ifdef CONFIG_MACH_TRIMSLICE +	{ "compulab,trimslice", trimslice_init }, +#endif +#ifdef CONFIG_MACH_HARMONY +	{ "nvidia,harmony", harmony_init }, +#endif +#ifdef CONFIG_MACH_PAZ00 +	{ "compal,paz00", paz00_init }, +#endif +}; + +static void __init tegra_dt_init_late(void) +{ +	int i; + +	tegra_init_late(); + +	for (i = 0; i < ARRAY_SIZE(board_init_funcs); i++) { +		if (of_machine_is_compatible(board_init_funcs[i].machine)) { +			board_init_funcs[i].init(); +			break; +		} +	} +} +  static const char *tegra20_dt_board_compat[] = {  	"nvidia,tegra20",  	NULL @@ -110,7 +171,7 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)")  	.handle_irq	= gic_handle_irq,  	.timer		= &tegra_timer,  	.init_machine	= tegra_dt_init, -	.init_late	= tegra_init_late, +	.init_late	= tegra_dt_init_late,  	.restart	= tegra_assert_system_reset,  	.dt_compat	= tegra20_dt_board_compat,  MACHINE_END diff --git a/arch/arm/mach-tegra/board-dt-tegra30.c b/arch/arm/mach-tegra/board-dt-tegra30.c index 4f76fa7a5da..53bf60f1158 100644 --- a/arch/arm/mach-tegra/board-dt-tegra30.c +++ b/arch/arm/mach-tegra/board-dt-tegra30.c @@ -33,14 +33,11 @@  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> +#include <mach/iomap.h> +  #include "board.h"  #include "clock.h" -static struct of_device_id tegra_dt_match_table[] __initdata = { -	{ .compatible = "simple-bus", }, -	{} -}; -  struct of_dev_auxdata tegra30_auxdata_lookup[] __initdata = {  	OF_DEV_AUXDATA("nvidia,tegra20-sdhci", 0x78000000, "sdhci-tegra.0", NULL),  	OF_DEV_AUXDATA("nvidia,tegra20-sdhci", 0x78000200, "sdhci-tegra.1", NULL), @@ -52,6 +49,8 @@ struct of_dev_auxdata tegra30_auxdata_lookup[] __initdata = {  	OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C700, "tegra-i2c.3", NULL),  	OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000D000, "tegra-i2c.4", NULL),  	OF_DEV_AUXDATA("nvidia,tegra30-ahub", 0x70080000, "tegra30-ahub", NULL), +	OF_DEV_AUXDATA("nvidia,tegra30-apbdma", 0x6000a000, "tegra-apbdma", NULL), +	OF_DEV_AUXDATA("nvidia,tegra30-pwm", TEGRA_PWFM_BASE, "tegra-pwm", NULL),  	{}  }; @@ -74,7 +73,7 @@ static void __init tegra30_dt_init(void)  {  	tegra_clk_init_from_table(tegra_dt_clk_init_table); -	of_platform_populate(NULL, tegra_dt_match_table, +	of_platform_populate(NULL, of_default_bus_match_table,  				tegra30_auxdata_lookup, NULL);  } diff --git a/arch/arm/mach-tegra/board-harmony-pcie.c b/arch/arm/mach-tegra/board-harmony-pcie.c index 33c4fedab84..e8c3fda9bec 100644 --- a/arch/arm/mach-tegra/board-harmony-pcie.c +++ b/arch/arm/mach-tegra/board-harmony-pcie.c @@ -27,14 +27,11 @@  #ifdef CONFIG_TEGRA_PCI -static int __init harmony_pcie_init(void) +int __init harmony_pcie_init(void)  {  	struct regulator *regulator = NULL;  	int err; -	if (!machine_is_harmony()) -		return 0; -  	err = gpio_request(TEGRA_GPIO_EN_VDD_1V05_GPIO, "EN_VDD_1V05");  	if (err)  		return err; @@ -62,7 +59,15 @@ err_reg:  	return err;  } +static int __init harmony_pcie_initcall(void) +{ +	if (!machine_is_harmony()) +		return 0; + +	return harmony_pcie_init(); +} +  /* PCI should be initialized after I2C, mfd and regulators */ -subsys_initcall_sync(harmony_pcie_init); +subsys_initcall_sync(harmony_pcie_initcall);  #endif diff --git a/arch/arm/mach-tegra/board-harmony-power.c b/arch/arm/mach-tegra/board-harmony-power.c index 82f32300796..8fd387bf31f 100644 --- a/arch/arm/mach-tegra/board-harmony-power.c +++ b/arch/arm/mach-tegra/board-harmony-power.c @@ -19,7 +19,12 @@  #include <linux/platform_device.h>  #include <linux/gpio.h>  #include <linux/regulator/machine.h> +#include <linux/regulator/fixed.h>  #include <linux/mfd/tps6586x.h> +#include <linux/of.h> +#include <linux/of_i2c.h> + +#include <asm/mach-types.h>  #include <mach/irqs.h> @@ -30,7 +35,9 @@ static struct regulator_consumer_supply tps658621_ldo0_supply[] = {  };  static struct regulator_init_data ldo0_data = { +	.supply_regulator = "vdd_sm2",  	.constraints = { +		.name = "vdd_ldo0",  		.min_uV = 3300 * 1000,  		.max_uV = 3300 * 1000,  		.valid_modes_mask = (REGULATOR_MODE_NORMAL | @@ -44,9 +51,11 @@ static struct regulator_init_data ldo0_data = {  	.consumer_supplies = tps658621_ldo0_supply,  }; -#define HARMONY_REGULATOR_INIT(_id, _minmv, _maxmv)			\ +#define HARMONY_REGULATOR_INIT(_id, _name, _supply, _minmv, _maxmv)	\  	static struct regulator_init_data _id##_data = {		\ +		.supply_regulator = _supply,				\  		.constraints = {					\ +			.name = _name,					\  			.min_uV = (_minmv)*1000,			\  			.max_uV = (_maxmv)*1000,			\  			.valid_modes_mask = (REGULATOR_MODE_NORMAL |	\ @@ -57,18 +66,18 @@ static struct regulator_init_data ldo0_data = {  		},							\  	} -HARMONY_REGULATOR_INIT(sm0, 725, 1500); -HARMONY_REGULATOR_INIT(sm1, 725, 1500); -HARMONY_REGULATOR_INIT(sm2, 3000, 4550); -HARMONY_REGULATOR_INIT(ldo1, 725, 1500); -HARMONY_REGULATOR_INIT(ldo2, 725, 1500); -HARMONY_REGULATOR_INIT(ldo3, 1250, 3300); -HARMONY_REGULATOR_INIT(ldo4, 1700, 2475); -HARMONY_REGULATOR_INIT(ldo5, 1250, 3300); -HARMONY_REGULATOR_INIT(ldo6, 1250, 3300); -HARMONY_REGULATOR_INIT(ldo7, 1250, 3300); -HARMONY_REGULATOR_INIT(ldo8, 1250, 3300); -HARMONY_REGULATOR_INIT(ldo9, 1250, 3300); +HARMONY_REGULATOR_INIT(sm0,  "vdd_sm0",  "vdd_sys", 725, 1500); +HARMONY_REGULATOR_INIT(sm1,  "vdd_sm1",  "vdd_sys", 725, 1500); +HARMONY_REGULATOR_INIT(sm2,  "vdd_sm2",  "vdd_sys", 3000, 4550); +HARMONY_REGULATOR_INIT(ldo1, "vdd_ldo1", "vdd_sm2", 725, 1500); +HARMONY_REGULATOR_INIT(ldo2, "vdd_ldo2", "vdd_sm2", 725, 1500); +HARMONY_REGULATOR_INIT(ldo3, "vdd_ldo3", "vdd_sm2", 1250, 3300); +HARMONY_REGULATOR_INIT(ldo4, "vdd_ldo4", "vdd_sm2", 1700, 2475); +HARMONY_REGULATOR_INIT(ldo5, "vdd_ldo5", NULL,	    1250, 3300); +HARMONY_REGULATOR_INIT(ldo6, "vdd_ldo6", "vdd_sm2", 1250, 3300); +HARMONY_REGULATOR_INIT(ldo7, "vdd_ldo7", "vdd_sm2", 1250, 3300); +HARMONY_REGULATOR_INIT(ldo8, "vdd_ldo8", "vdd_sm2", 1250, 3300); +HARMONY_REGULATOR_INIT(ldo9, "vdd_ldo9", "vdd_sm2", 1250, 3300);  #define TPS_REG(_id, _data)			\  	{					\ @@ -110,7 +119,28 @@ static struct i2c_board_info __initdata harmony_regulators[] = {  int __init harmony_regulator_init(void)  { -	i2c_register_board_info(3, harmony_regulators, 1); +	if (machine_is_harmony()) { +		regulator_register_always_on(0, "vdd_sys", +			NULL, 0, 5000000); +		i2c_register_board_info(3, harmony_regulators, 1); +	} else { /* Harmony, booted using device tree */ +		struct device_node *np; +		struct i2c_adapter *adapter; + +		np = of_find_node_by_path("/i2c@7000d000"); +		if (np == NULL) { +			pr_err("Could not find device_node for DVC I2C\n"); +			return -ENODEV; +		} + +		adapter = of_find_i2c_adapter_by_node(np); +		if (!adapter) { +			pr_err("Could not find i2c_adapter for DVC I2C\n"); +			return -ENODEV; +		} + +		i2c_new_device(adapter, harmony_regulators); +	}  	return 0;  } diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index bbc1907e98a..4b64af5cab2 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c @@ -148,7 +148,6 @@ static struct platform_device *paz00_devices[] __initdata = {  	&debug_uart,  	&tegra_sdhci_device4,  	&tegra_sdhci_device1, -	&wifi_rfkill_device,  	&leds_gpio,  	&gpio_keys_device,  }; @@ -201,6 +200,11 @@ static struct tegra_sdhci_platform_data sdhci_pdata4 = {  	.is_8bit	= 1,  }; +void __init tegra_paz00_wifikill_init(void) +{ +	platform_device_register(&wifi_rfkill_device); +} +  static void __init tegra_paz00_init(void)  {  	tegra_clk_init_from_table(paz00_clk_init_table); @@ -211,6 +215,7 @@ static void __init tegra_paz00_init(void)  	tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;  	platform_add_devices(paz00_devices, ARRAY_SIZE(paz00_devices)); +	tegra_paz00_wifikill_init();  	paz00_i2c_init();  	paz00_usb_init(); diff --git a/arch/arm/mach-tegra/board-seaboard-pinmux.c b/arch/arm/mach-tegra/board-seaboard-pinmux.c deleted file mode 100644 index 11fc8a568c6..00000000000 --- a/arch/arm/mach-tegra/board-seaboard-pinmux.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2010-2012 NVIDIA Corporation - * Copyright (C) 2011 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * 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. - * - */ - -#include <linux/kernel.h> - -#include "board-seaboard.h" -#include "board-pinmux.h" - -static unsigned long seaboard_pincfg_drive_sdio1[] = { -	TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE, 0), -	TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_SCHMITT, 0), -	TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_LOW_POWER_MODE, 3), -	TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH, 31), -	TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH, 31), -	TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING, 3), -	TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_SLEW_RATE_RISING, 3), -}; - -static struct pinctrl_map common_map[] = { -	TEGRA_MAP_MUXCONF("ata",   "ide",           none, driven), -	TEGRA_MAP_MUXCONF("atb",   "sdio4",         none, driven), -	TEGRA_MAP_MUXCONF("atc",   "nand",          none, driven), -	TEGRA_MAP_MUXCONF("atd",   "gmi",           none, driven), -	TEGRA_MAP_MUXCONF("ate",   "gmi",           none, tristate), -	TEGRA_MAP_MUXCONF("cdev1", "plla_out",      none, driven), -	TEGRA_MAP_MUXCONF("cdev2", "pllp_out4",     none, driven), -	TEGRA_MAP_MUXCONF("crtp",  "crt",           up,   tristate), -	TEGRA_MAP_MUXCONF("csus",  "vi_sensor_clk", none, tristate), -	TEGRA_MAP_MUXCONF("dap1",  "dap1",          none, driven), -	TEGRA_MAP_MUXCONF("dap2",  "dap2",          none, driven), -	TEGRA_MAP_MUXCONF("dap3",  "dap3",          none, tristate), -	TEGRA_MAP_MUXCONF("dap4",  "dap4",          none, driven), -	TEGRA_MAP_MUXCONF("dta",   "vi",            down, driven), -	TEGRA_MAP_MUXCONF("dtb",   "vi",            down, driven), -	TEGRA_MAP_MUXCONF("dtc",   "vi",            down, driven), -	TEGRA_MAP_MUXCONF("dtd",   "vi",            down, driven), -	TEGRA_MAP_MUXCONF("dte",   "vi",            down, tristate), -	TEGRA_MAP_MUXCONF("dtf",   "i2c3",          none, driven), -	TEGRA_MAP_MUXCONF("gma",   "sdio4",         none, driven), -	TEGRA_MAP_MUXCONF("gmb",   "gmi",           up,   tristate), -	TEGRA_MAP_MUXCONF("gmc",   "uartd",         none, driven), -	TEGRA_MAP_MUXCONF("gme",   "sdio4",         none, driven), -	TEGRA_MAP_MUXCONF("gpu",   "pwm",           none, driven), -	TEGRA_MAP_MUXCONF("gpu7",  "rtck",          none, driven), -	TEGRA_MAP_MUXCONF("gpv",   "pcie",          none, tristate), -	TEGRA_MAP_MUXCONF("hdint", "hdmi",          na,   tristate), -	TEGRA_MAP_MUXCONF("i2cp",  "i2cp",          none, driven), -	TEGRA_MAP_MUXCONF("irrx",  "uartb",         none, driven), -	TEGRA_MAP_MUXCONF("irtx",  "uartb",         none, driven), -	TEGRA_MAP_MUXCONF("kbca",  "kbc",           up,   driven), -	TEGRA_MAP_MUXCONF("kbcb",  "kbc",           up,   driven), -	TEGRA_MAP_MUXCONF("kbcc",  "kbc",           up,   driven), -	TEGRA_MAP_MUXCONF("kbcd",  "kbc",           up,   driven), -	TEGRA_MAP_MUXCONF("kbce",  "kbc",           up,   driven), -	TEGRA_MAP_MUXCONF("kbcf",  "kbc",           up,   driven), -	TEGRA_MAP_MUXCONF("lcsn",  "rsvd4",         na,   tristate), -	TEGRA_MAP_MUXCONF("ld0",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld1",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld10",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld11",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld12",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld13",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld14",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld15",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld16",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld17",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld2",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld3",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld4",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld5",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld6",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld7",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld8",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ld9",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("ldc",   "rsvd4",         na,   tristate), -	TEGRA_MAP_MUXCONF("ldi",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lhp0",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lhp1",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lhp2",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lhs",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lm0",   "rsvd4",         na,   driven), -	TEGRA_MAP_MUXCONF("lm1",   "crt",           na,   tristate), -	TEGRA_MAP_MUXCONF("lpp",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lpw1",  "rsvd4",         na,   tristate), -	TEGRA_MAP_MUXCONF("lsc0",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lsdi",  "rsvd4",         na,   tristate), -	TEGRA_MAP_MUXCONF("lspi",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lvp0",  "rsvd4",         na,   tristate), -	TEGRA_MAP_MUXCONF("lvp1",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lvs",   "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("owc",   "rsvd2",         none, tristate), -	TEGRA_MAP_MUXCONF("pmc",   "pwr_on",        na,   driven), -	TEGRA_MAP_MUXCONF("pta",   "hdmi",          none, driven), -	TEGRA_MAP_MUXCONF("rm",    "i2c1",          none, driven), -	TEGRA_MAP_MUXCONF("sdb",   "sdio3",         na,   driven), -	TEGRA_MAP_MUXCONF("sdc",   "sdio3",         none, driven), -	TEGRA_MAP_MUXCONF("sdd",   "sdio3",         none, driven), -	TEGRA_MAP_MUXCONF("sdio1", "sdio1",         up,   driven), -	TEGRA_MAP_MUXCONF("slxa",  "pcie",          up,   tristate), -	TEGRA_MAP_MUXCONF("slxd",  "spdif",         none, driven), -	TEGRA_MAP_MUXCONF("slxk",  "pcie",          none, driven), -	TEGRA_MAP_MUXCONF("spdi",  "rsvd2",         none, driven), -	TEGRA_MAP_MUXCONF("spdo",  "rsvd2",         none, driven), -	TEGRA_MAP_MUXCONF("spib",  "gmi",           none, tristate), -	TEGRA_MAP_MUXCONF("spid",  "spi1",          none, tristate), -	TEGRA_MAP_MUXCONF("spie",  "spi1",          none, tristate), -	TEGRA_MAP_MUXCONF("spif",  "spi1",          down, tristate), -	TEGRA_MAP_MUXCONF("spih",  "spi2_alt",      up,   tristate), -	TEGRA_MAP_MUXCONF("uaa",   "ulpi",          up,   driven), -	TEGRA_MAP_MUXCONF("uab",   "ulpi",          up,   driven), -	TEGRA_MAP_MUXCONF("uac",   "rsvd2",         none, driven), -	TEGRA_MAP_MUXCONF("uad",   "irda",          none, driven), -	TEGRA_MAP_MUXCONF("uca",   "uartc",         none, driven), -	TEGRA_MAP_MUXCONF("ucb",   "uartc",         none, driven), -	TEGRA_MAP_MUXCONF("uda",   "ulpi",          none, driven), -	TEGRA_MAP_CONF("ck32",    none, na), -	TEGRA_MAP_CONF("ddrc",    none, na), -	TEGRA_MAP_CONF("pmca",    none, na), -	TEGRA_MAP_CONF("pmcb",    none, na), -	TEGRA_MAP_CONF("pmcc",    none, na), -	TEGRA_MAP_CONF("pmcd",    none, na), -	TEGRA_MAP_CONF("pmce",    none, na), -	TEGRA_MAP_CONF("xm2c",    none, na), -	TEGRA_MAP_CONF("xm2d",    none, na), -	TEGRA_MAP_CONF("ls",      up,   na), -	TEGRA_MAP_CONF("lc",      up,   na), -	TEGRA_MAP_CONF("ld17_0",  down, na), -	TEGRA_MAP_CONF("ld19_18", down, na), -	TEGRA_MAP_CONF("ld21_20", down, na), -	TEGRA_MAP_CONF("ld23_22", down, na), -}; - -static struct pinctrl_map seaboard_map[] = { -	TEGRA_MAP_MUXCONF("ddc",   "rsvd2",         none, tristate), -	TEGRA_MAP_MUXCONF("gmd",   "sflash",        none, driven), -	TEGRA_MAP_MUXCONF("lpw0",  "hdmi",          na,   driven), -	TEGRA_MAP_MUXCONF("lpw2",  "hdmi",          na,   driven), -	TEGRA_MAP_MUXCONF("lsc1",  "hdmi",          na,   tristate), -	TEGRA_MAP_MUXCONF("lsck",  "hdmi",          na,   tristate), -	TEGRA_MAP_MUXCONF("lsda",  "hdmi",          na,   tristate), -	TEGRA_MAP_MUXCONF("slxc",  "spdif",         none, tristate), -	TEGRA_MAP_MUXCONF("spia",  "gmi",           up,   tristate), -	TEGRA_MAP_MUXCONF("spic",  "gmi",           up,   driven), -	TEGRA_MAP_MUXCONF("spig",  "spi2_alt",      up,   tristate), -	PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(PINMUX_DEV, "drive_sdio1", seaboard_pincfg_drive_sdio1), -}; - -static struct pinctrl_map ventana_map[] = { -	TEGRA_MAP_MUXCONF("ddc",   "rsvd2",         none, driven), -	TEGRA_MAP_MUXCONF("gmd",   "sflash",        none, tristate), -	TEGRA_MAP_MUXCONF("lpw0",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lpw2",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lsc1",  "displaya",      na,   driven), -	TEGRA_MAP_MUXCONF("lsck",  "displaya",      na,   tristate), -	TEGRA_MAP_MUXCONF("lsda",  "displaya",      na,   tristate), -	TEGRA_MAP_MUXCONF("slxc",  "sdio3",         none, driven), -	TEGRA_MAP_MUXCONF("spia",  "gmi",           none, tristate), -	TEGRA_MAP_MUXCONF("spic",  "gmi",           none, tristate), -	TEGRA_MAP_MUXCONF("spig",  "spi2_alt",      none, tristate), -}; - -static struct tegra_board_pinmux_conf common_conf = { -	.maps = common_map, -	.map_count = ARRAY_SIZE(common_map), -}; - -static struct tegra_board_pinmux_conf seaboard_conf = { -	.maps = seaboard_map, -	.map_count = ARRAY_SIZE(seaboard_map), -}; - -static struct tegra_board_pinmux_conf ventana_conf = { -	.maps = ventana_map, -	.map_count = ARRAY_SIZE(ventana_map), -}; - -void seaboard_pinmux_init(void) -{ -	tegra_board_pinmux_init(&common_conf, &seaboard_conf); -} - -void ventana_pinmux_init(void) -{ -	tegra_board_pinmux_init(&common_conf, &ventana_conf); -} diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c deleted file mode 100644 index 71e9f3fc7fb..00000000000 --- a/arch/arm/mach-tegra/board-seaboard.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (c) 2010, 2011 NVIDIA Corporation. - * Copyright (C) 2010, 2011 Google, Inc. - * - * 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. - * - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/serial_8250.h> -#include <linux/of_serial.h> -#include <linux/i2c.h> -#include <linux/delay.h> -#include <linux/input.h> -#include <linux/io.h> -#include <linux/gpio.h> -#include <linux/gpio_keys.h> -#include <linux/platform_data/tegra_usb.h> - -#include <sound/wm8903.h> - -#include <mach/iomap.h> -#include <mach/irqs.h> -#include <mach/sdhci.h> -#include <mach/tegra_wm8903_pdata.h> - -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/hardware/gic.h> - -#include "board.h" -#include "board-seaboard.h" -#include "clock.h" -#include "devices.h" -#include "gpio-names.h" - -static struct plat_serial8250_port debug_uart_platform_data[] = { -	{ -		/* Memory and IRQ filled in before registration */ -		.flags		= UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE, -		.type		= PORT_TEGRA, -		.handle_break	= tegra_serial_handle_break, -		.iotype		= UPIO_MEM, -		.regshift	= 2, -		.uartclk	= 216000000, -	}, { -		.flags		= 0, -	} -}; - -static struct platform_device debug_uart = { -	.name = "serial8250", -	.id = PLAT8250_DEV_PLATFORM, -	.dev = { -		.platform_data = debug_uart_platform_data, -	}, -}; - -static __initdata struct tegra_clk_init_table seaboard_clk_init_table[] = { -	/* name		parent		rate		enabled */ -	{ "uartb",	"pll_p",	216000000,	true}, -	{ "uartd",	"pll_p",	216000000,	true}, -	{ "pll_a",	"pll_p_out1",	56448000,	true }, -	{ "pll_a_out0",	"pll_a",	11289600,	true }, -	{ "cdev1",	NULL,		0,		true }, -	{ "i2s1",	"pll_a_out0",	11289600,	false}, -	{ "usbd",	"clk_m",	12000000,	true}, -	{ "usb3",	"clk_m",	12000000,	true}, -	{ NULL,		NULL,		0,		0}, -}; - -static struct gpio_keys_button seaboard_gpio_keys_buttons[] = { -	{ -		.code		= SW_LID, -		.gpio		= TEGRA_GPIO_LIDSWITCH, -		.active_low	= 0, -		.desc		= "Lid", -		.type		= EV_SW, -		.wakeup		= 1, -		.debounce_interval = 1, -	}, -	{ -		.code		= KEY_POWER, -		.gpio		= TEGRA_GPIO_POWERKEY, -		.active_low	= 1, -		.desc		= "Power", -		.type		= EV_KEY, -		.wakeup		= 1, -	}, -}; - -static struct gpio_keys_platform_data seaboard_gpio_keys = { -	.buttons	= seaboard_gpio_keys_buttons, -	.nbuttons	= ARRAY_SIZE(seaboard_gpio_keys_buttons), -}; - -static struct platform_device seaboard_gpio_keys_device = { -	.name		= "gpio-keys", -	.id		= -1, -	.dev		= { -		.platform_data = &seaboard_gpio_keys, -	} -}; - -static struct tegra_sdhci_platform_data sdhci_pdata1 = { -	.cd_gpio	= -1, -	.wp_gpio	= -1, -	.power_gpio	= -1, -}; - -static struct tegra_sdhci_platform_data sdhci_pdata3 = { -	.cd_gpio	= TEGRA_GPIO_SD2_CD, -	.wp_gpio	= TEGRA_GPIO_SD2_WP, -	.power_gpio	= TEGRA_GPIO_SD2_POWER, -}; - -static struct tegra_sdhci_platform_data sdhci_pdata4 = { -	.cd_gpio	= -1, -	.wp_gpio	= -1, -	.power_gpio	= -1, -	.is_8bit	= 1, -}; - -static struct tegra_wm8903_platform_data seaboard_audio_pdata = { -	.gpio_spkr_en		= TEGRA_GPIO_SPKR_EN, -	.gpio_hp_det		= TEGRA_GPIO_HP_DET, -	.gpio_hp_mute		= -1, -	.gpio_int_mic_en	= -1, -	.gpio_ext_mic_en	= -1, -}; - -static struct platform_device seaboard_audio_device = { -	.name	= "tegra-snd-wm8903", -	.id	= 0, -	.dev	= { -		.platform_data  = &seaboard_audio_pdata, -	}, -}; - -static struct platform_device *seaboard_devices[] __initdata = { -	&debug_uart, -	&tegra_pmu_device, -	&tegra_sdhci_device4, -	&tegra_sdhci_device3, -	&tegra_sdhci_device1, -	&seaboard_gpio_keys_device, -	&tegra_i2s_device1, -	&tegra_das_device, -	&seaboard_audio_device, -}; - -static struct i2c_board_info __initdata isl29018_device = { -	I2C_BOARD_INFO("isl29018", 0x44), -}; - -static struct i2c_board_info __initdata adt7461_device = { -	I2C_BOARD_INFO("adt7461", 0x4c), -}; - -static struct wm8903_platform_data wm8903_pdata = { -	.irq_active_low = 0, -	.micdet_cfg = 0, -	.micdet_delay = 100, -	.gpio_base = SEABOARD_GPIO_WM8903(0), -	.gpio_cfg = { -		0, -		0, -		WM8903_GPIO_CONFIG_ZERO, -		0, -		0, -	}, -}; - -static struct i2c_board_info __initdata wm8903_device = { -	I2C_BOARD_INFO("wm8903", 0x1a), -	.platform_data = &wm8903_pdata, -}; - -static int seaboard_ehci_init(void) -{ -	struct tegra_ehci_platform_data *pdata; - -	pdata = tegra_ehci1_device.dev.platform_data; -	pdata->vbus_gpio = TEGRA_GPIO_USB1; - -	platform_device_register(&tegra_ehci1_device); -	platform_device_register(&tegra_ehci3_device); - -	return 0; -} - -static void __init seaboard_i2c_init(void) -{ -	isl29018_device.irq = gpio_to_irq(TEGRA_GPIO_ISL29018_IRQ); -	i2c_register_board_info(0, &isl29018_device, 1); - -	wm8903_device.irq = gpio_to_irq(TEGRA_GPIO_CDC_IRQ); -	i2c_register_board_info(0, &wm8903_device, 1); - -	i2c_register_board_info(3, &adt7461_device, 1); - -	platform_device_register(&tegra_i2c_device1); -	platform_device_register(&tegra_i2c_device2); -	platform_device_register(&tegra_i2c_device3); -	platform_device_register(&tegra_i2c_device4); -} - -static void __init seaboard_common_init(void) -{ -	seaboard_pinmux_init(); - -	tegra_clk_init_from_table(seaboard_clk_init_table); - -	tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1; -	tegra_sdhci_device3.dev.platform_data = &sdhci_pdata3; -	tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4; - -	platform_add_devices(seaboard_devices, ARRAY_SIZE(seaboard_devices)); - -	seaboard_ehci_init(); -} - -static void __init tegra_seaboard_init(void) -{ -	/* Seaboard uses UARTD for the debug port. */ -	debug_uart_platform_data[0].membase = IO_ADDRESS(TEGRA_UARTD_BASE); -	debug_uart_platform_data[0].mapbase = TEGRA_UARTD_BASE; -	debug_uart_platform_data[0].irq = INT_UARTD; - -	seaboard_common_init(); - -	seaboard_i2c_init(); -} - -static void __init tegra_kaen_init(void) -{ -	/* Kaen uses UARTB for the debug port. */ -	debug_uart_platform_data[0].membase = IO_ADDRESS(TEGRA_UARTB_BASE); -	debug_uart_platform_data[0].mapbase = TEGRA_UARTB_BASE; -	debug_uart_platform_data[0].irq = INT_UARTB; - -	seaboard_audio_pdata.gpio_hp_mute = TEGRA_GPIO_KAEN_HP_MUTE; - -	seaboard_common_init(); - -	seaboard_i2c_init(); -} - -static void __init tegra_wario_init(void) -{ -	/* Wario uses UARTB for the debug port. */ -	debug_uart_platform_data[0].membase = IO_ADDRESS(TEGRA_UARTB_BASE); -	debug_uart_platform_data[0].mapbase = TEGRA_UARTB_BASE; -	debug_uart_platform_data[0].irq = INT_UARTB; - -	seaboard_common_init(); - -	seaboard_i2c_init(); -} - - -MACHINE_START(SEABOARD, "seaboard") -	.atag_offset    = 0x100, -	.map_io         = tegra_map_common_io, -	.init_early     = tegra20_init_early, -	.init_irq       = tegra_init_irq, -	.handle_irq	= gic_handle_irq, -	.timer          = &tegra_timer, -	.init_machine   = tegra_seaboard_init, -	.init_late	= tegra_init_late, -	.restart	= tegra_assert_system_reset, -MACHINE_END - -MACHINE_START(KAEN, "kaen") -	.atag_offset    = 0x100, -	.map_io         = tegra_map_common_io, -	.init_early     = tegra20_init_early, -	.init_irq       = tegra_init_irq, -	.handle_irq	= gic_handle_irq, -	.timer          = &tegra_timer, -	.init_machine   = tegra_kaen_init, -	.init_late	= tegra_init_late, -	.restart	= tegra_assert_system_reset, -MACHINE_END - -MACHINE_START(WARIO, "wario") -	.atag_offset    = 0x100, -	.map_io         = tegra_map_common_io, -	.init_early     = tegra20_init_early, -	.init_irq       = tegra_init_irq, -	.handle_irq	= gic_handle_irq, -	.timer          = &tegra_timer, -	.init_machine   = tegra_wario_init, -	.init_late	= tegra_init_late, -	.restart	= tegra_assert_system_reset, -MACHINE_END diff --git a/arch/arm/mach-tegra/board-seaboard.h b/arch/arm/mach-tegra/board-seaboard.h deleted file mode 100644 index 4c45d4ca3c4..00000000000 --- a/arch/arm/mach-tegra/board-seaboard.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * arch/arm/mach-tegra/board-seaboard.h - * - * Copyright (C) 2010 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * 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. - * - */ - -#ifndef _MACH_TEGRA_BOARD_SEABOARD_H -#define _MACH_TEGRA_BOARD_SEABOARD_H - -#include <mach/gpio-tegra.h> - -#define SEABOARD_GPIO_TPS6586X(_x_)	(TEGRA_NR_GPIOS + (_x_)) -#define SEABOARD_GPIO_WM8903(_x_)	(SEABOARD_GPIO_TPS6586X(4) + (_x_)) - -#define TEGRA_GPIO_SD2_CD		TEGRA_GPIO_PI5 -#define TEGRA_GPIO_SD2_WP		TEGRA_GPIO_PH1 -#define TEGRA_GPIO_SD2_POWER		TEGRA_GPIO_PI6 -#define TEGRA_GPIO_LIDSWITCH		TEGRA_GPIO_PC7 -#define TEGRA_GPIO_USB1			TEGRA_GPIO_PD0 -#define TEGRA_GPIO_POWERKEY		TEGRA_GPIO_PV2 -#define TEGRA_GPIO_BACKLIGHT		TEGRA_GPIO_PD4 -#define TEGRA_GPIO_LVDS_SHUTDOWN	TEGRA_GPIO_PB2 -#define TEGRA_GPIO_BACKLIGHT_PWM	TEGRA_GPIO_PU5 -#define TEGRA_GPIO_BACKLIGHT_VDD	TEGRA_GPIO_PW0 -#define TEGRA_GPIO_EN_VDD_PNL		TEGRA_GPIO_PC6 -#define TEGRA_GPIO_MAGNETOMETER		TEGRA_GPIO_PN5 -#define TEGRA_GPIO_ISL29018_IRQ		TEGRA_GPIO_PZ2 -#define TEGRA_GPIO_AC_ONLINE		TEGRA_GPIO_PV3 -#define TEGRA_GPIO_WWAN_PWR		SEABOARD_GPIO_TPS6586X(2) -#define TEGRA_GPIO_CDC_IRQ		TEGRA_GPIO_PX3 -#define TEGRA_GPIO_SPKR_EN		SEABOARD_GPIO_WM8903(2) -#define TEGRA_GPIO_HP_DET		TEGRA_GPIO_PX1 -#define TEGRA_GPIO_KAEN_HP_MUTE		TEGRA_GPIO_PA5 - -void seaboard_pinmux_init(void); - -#endif diff --git a/arch/arm/mach-tegra/board.h b/arch/arm/mach-tegra/board.h index 65014968fc6..f88e5143c76 100644 --- a/arch/arm/mach-tegra/board.h +++ b/arch/arm/mach-tegra/board.h @@ -46,5 +46,14 @@ int __init tegra_powergate_debugfs_init(void);  static inline int tegra_powergate_debugfs_init(void) { return 0; }  #endif +int __init harmony_regulator_init(void); +#ifdef CONFIG_TEGRA_PCI +int __init harmony_pcie_init(void); +#else +static inline int harmony_pcie_init(void) { return 0; } +#endif + +void __init tegra_paz00_wifikill_init(void); +  extern struct sys_timer tegra_timer;  #endif diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 204a5c8b0b5..96fef6bcc65 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -33,6 +33,7 @@  #include "clock.h"  #include "fuse.h"  #include "pmc.h" +#include "apbio.h"  /*   * Storage for debug-macro.S's state. @@ -127,6 +128,7 @@ static void __init tegra_init_cache(u32 tag_latency, u32 data_latency)  #ifdef CONFIG_ARCH_TEGRA_2x_SOC  void __init tegra20_init_early(void)  { +	tegra_apb_io_init();  	tegra_init_fuse();  	tegra2_init_clocks();  	tegra_clk_init_from_table(tegra20_clk_init_table); @@ -138,6 +140,7 @@ void __init tegra20_init_early(void)  #ifdef CONFIG_ARCH_TEGRA_3x_SOC  void __init tegra30_init_early(void)  { +	tegra_apb_io_init();  	tegra_init_fuse();  	tegra30_init_clocks();  	tegra_clk_init_from_table(tegra30_clk_init_table); diff --git a/arch/arm/mach-tegra/cpu-tegra.c b/arch/arm/mach-tegra/cpu-tegra.c index 7a065f0cf63..ceb52db1e2f 100644 --- a/arch/arm/mach-tegra/cpu-tegra.c +++ b/arch/arm/mach-tegra/cpu-tegra.c @@ -189,8 +189,8 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)  		return PTR_ERR(emc_clk);  	} -	clk_enable(emc_clk); -	clk_enable(cpu_clk); +	clk_prepare_enable(emc_clk); +	clk_prepare_enable(cpu_clk);  	cpufreq_frequency_table_cpuinfo(policy, freq_table);  	cpufreq_frequency_table_get_attr(freq_table, policy->cpu); @@ -212,7 +212,7 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)  static int tegra_cpu_exit(struct cpufreq_policy *policy)  {  	cpufreq_frequency_table_cpuinfo(policy, freq_table); -	clk_disable(emc_clk); +	clk_disable_unprepare(emc_clk);  	clk_put(emc_clk);  	clk_put(cpu_clk);  	return 0; diff --git a/arch/arm/mach-tegra/cpuidle.c b/arch/arm/mach-tegra/cpuidle.c index d83a8c0296f..566e2f88899 100644 --- a/arch/arm/mach-tegra/cpuidle.c +++ b/arch/arm/mach-tegra/cpuidle.c @@ -27,9 +27,9 @@  #include <linux/cpuidle.h>  #include <linux/hrtimer.h> -#include <mach/iomap.h> +#include <asm/proc-fns.h> -extern void tegra_cpu_wfi(void); +#include <mach/iomap.h>  static int tegra_idle_enter_lp3(struct cpuidle_device *dev,  				struct cpuidle_driver *drv, int index); @@ -64,7 +64,7 @@ static int tegra_idle_enter_lp3(struct cpuidle_device *dev,  	enter = ktime_get(); -	tegra_cpu_wfi(); +	cpu_do_idle();  	exit = ktime_sub(ktime_get(), enter);  	us = ktime_to_us(exit); diff --git a/arch/arm/mach-tegra/dma.c b/arch/arm/mach-tegra/dma.c index abea4f6e2dd..29c5114d607 100644 --- a/arch/arm/mach-tegra/dma.c +++ b/arch/arm/mach-tegra/dma.c @@ -714,13 +714,13 @@ int __init tegra_dma_init(void)  	bitmap_fill(channel_usage, NV_DMA_MAX_CHANNELS); -	c = clk_get_sys("tegra-dma", NULL); +	c = clk_get_sys("tegra-apbdma", NULL);  	if (IS_ERR(c)) {  		pr_err("Unable to get clock for APB DMA\n");  		ret = PTR_ERR(c);  		goto fail;  	} -	ret = clk_enable(c); +	ret = clk_prepare_enable(c);  	if (ret != 0) {  		pr_err("Unable to enable clock for APB DMA\n");  		goto fail; diff --git a/arch/arm/mach-tegra/pcie.c b/arch/arm/mach-tegra/pcie.c index 0e09137506e..d3ad5150d66 100644 --- a/arch/arm/mach-tegra/pcie.c +++ b/arch/arm/mach-tegra/pcie.c @@ -723,9 +723,9 @@ static int tegra_pcie_power_regate(void)  	tegra_pcie_xclk_clamp(false); -	clk_enable(tegra_pcie.afi_clk); -	clk_enable(tegra_pcie.pex_clk); -	return clk_enable(tegra_pcie.pll_e); +	clk_prepare_enable(tegra_pcie.afi_clk); +	clk_prepare_enable(tegra_pcie.pex_clk); +	return clk_prepare_enable(tegra_pcie.pll_e);  }  static int tegra_pcie_clocks_get(void) diff --git a/arch/arm/mach-tegra/powergate.c b/arch/arm/mach-tegra/powergate.c index f5b12fb4ff1..15d506501cc 100644 --- a/arch/arm/mach-tegra/powergate.c +++ b/arch/arm/mach-tegra/powergate.c @@ -146,7 +146,7 @@ int tegra_powergate_sequence_power_up(int id, struct clk *clk)  	if (ret)  		goto err_power; -	ret = clk_enable(clk); +	ret = clk_prepare_enable(clk);  	if (ret)  		goto err_clk; @@ -162,7 +162,7 @@ int tegra_powergate_sequence_power_up(int id, struct clk *clk)  	return 0;  err_clamp: -	clk_disable(clk); +	clk_disable_unprepare(clk);  err_clk:  	tegra_powergate_power_off(id);  err_power: diff --git a/arch/arm/mach-tegra/sleep.S b/arch/arm/mach-tegra/sleep.S index 5b20197bae7..d29b156a801 100644 --- a/arch/arm/mach-tegra/sleep.S +++ b/arch/arm/mach-tegra/sleep.S @@ -62,32 +62,3 @@  	movw	\reg, #:lower16:\val  	movt	\reg, #:upper16:\val  .endm - -/* - * tegra_cpu_wfi - * - * puts current CPU in clock-gated wfi using the flow controller - * - * corrupts r0-r3 - * must be called with MMU on - */ - -ENTRY(tegra_cpu_wfi) -	cpu_id	r0 -	cpu_to_halt_reg r1, r0 -	cpu_to_csr_reg r2, r0 -	mov32	r0, TEGRA_FLOW_CTRL_VIRT -	mov	r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG -	str	r3, [r0, r2]	@ clear event & interrupt status -	mov	r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT | FLOW_CTRL_JTAG_RESUME -	str	r3, [r0, r1]	@ put flow controller in wait irq mode -	dsb -	wfi -	mov	r3, #0 -	str	r3, [r0, r1]	@ clear flow controller halt status -	mov	r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG -	str	r3, [r0, r2]	@ clear event & interrupt status -	dsb -	mov	pc, lr -ENDPROC(tegra_cpu_wfi) - diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c index b59315ce369..a703844b206 100644 --- a/arch/arm/mach-tegra/tegra2_clocks.c +++ b/arch/arm/mach-tegra/tegra2_clocks.c @@ -69,6 +69,8 @@  #define PERIPH_CLK_SOURCE_MASK		(3<<30)  #define PERIPH_CLK_SOURCE_SHIFT		30 +#define PERIPH_CLK_SOURCE_PWM_MASK	(7<<28) +#define PERIPH_CLK_SOURCE_PWM_SHIFT	28  #define PERIPH_CLK_SOURCE_ENABLE	(1<<28)  #define PERIPH_CLK_SOURCE_DIVU71_MASK	0xFF  #define PERIPH_CLK_SOURCE_DIVU16_MASK	0xFFFF @@ -908,9 +910,20 @@ static void tegra2_periph_clk_init(struct clk *c)  	u32 val = clk_readl(c->reg);  	const struct clk_mux_sel *mux = NULL;  	const struct clk_mux_sel *sel; +	u32 shift; +	u32 mask; + +	if (c->flags & MUX_PWM) { +		shift = PERIPH_CLK_SOURCE_PWM_SHIFT; +		mask = PERIPH_CLK_SOURCE_PWM_MASK; +	} else { +		shift = PERIPH_CLK_SOURCE_SHIFT; +		mask = PERIPH_CLK_SOURCE_MASK; +	} +  	if (c->flags & MUX) {  		for (sel = c->inputs; sel->input != NULL; sel++) { -			if (val >> PERIPH_CLK_SOURCE_SHIFT == sel->value) +			if ((val & mask) >> shift == sel->value)  				mux = sel;  		}  		BUG_ON(!mux); @@ -1023,12 +1036,23 @@ static int tegra2_periph_clk_set_parent(struct clk *c, struct clk *p)  {  	u32 val;  	const struct clk_mux_sel *sel; +	u32 mask, shift; +  	pr_debug("%s: %s %s\n", __func__, c->name, p->name); + +	if (c->flags & MUX_PWM) { +		shift = PERIPH_CLK_SOURCE_PWM_SHIFT; +		mask = PERIPH_CLK_SOURCE_PWM_MASK; +	} else { +		shift = PERIPH_CLK_SOURCE_SHIFT; +		mask = PERIPH_CLK_SOURCE_MASK; +	} +  	for (sel = c->inputs; sel->input != NULL; sel++) {  		if (sel->input == p) {  			val = clk_readl(c->reg); -			val &= ~PERIPH_CLK_SOURCE_MASK; -			val |= (sel->value) << PERIPH_CLK_SOURCE_SHIFT; +			val &= ~mask; +			val |= (sel->value) << shift;  			if (c->refcnt)  				clk_enable(p); @@ -2149,14 +2173,14 @@ static struct clk tegra_clk_emc = {  	}  static struct clk tegra_list_clks[] = { -	PERIPH_CLK("apbdma",	"tegra-dma",		NULL,	34,	0,	108000000, mux_pclk,			0), +	PERIPH_CLK("apbdma",	"tegra-apbdma",		NULL,	34,	0,	108000000, mux_pclk,			0),  	PERIPH_CLK("rtc",	"rtc-tegra",		NULL,	4,	0,	32768,     mux_clk_32k,			PERIPH_NO_RESET),  	PERIPH_CLK("timer",	"timer",		NULL,	5,	0,	26000000,  mux_clk_m,			0),  	PERIPH_CLK("i2s1",	"tegra20-i2s.0",	NULL,	11,	0x100,	26000000,  mux_pllaout0_audio2x_pllp_clkm,	MUX | DIV_U71),  	PERIPH_CLK("i2s2",	"tegra20-i2s.1",	NULL,	18,	0x104,	26000000,  mux_pllaout0_audio2x_pllp_clkm,	MUX | DIV_U71),  	PERIPH_CLK("spdif_out",	"spdif_out",		NULL,	10,	0x108,	100000000, mux_pllaout0_audio2x_pllp_clkm,	MUX | DIV_U71),  	PERIPH_CLK("spdif_in",	"spdif_in",		NULL,	10,	0x10c,	100000000, mux_pllp_pllc_pllm,		MUX | DIV_U71), -	PERIPH_CLK("pwm",	"pwm",			NULL,	17,	0x110,	432000000, mux_pllp_pllc_audio_clkm_clk32,	MUX | DIV_U71), +	PERIPH_CLK("pwm",	"tegra-pwm",		NULL,	17,	0x110,	432000000, mux_pllp_pllc_audio_clkm_clk32,	MUX | DIV_U71 | MUX_PWM),  	PERIPH_CLK("spi",	"spi",			NULL,	43,	0x114,	40000000,  mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71),  	PERIPH_CLK("xio",	"xio",			NULL,	45,	0x120,	150000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71),  	PERIPH_CLK("twc",	"twc",			NULL,	16,	0x12c,	150000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71), @@ -2189,11 +2213,11 @@ static struct clk tegra_list_clks[] = {  	PERIPH_CLK("i2c2_i2c",	"tegra-i2c.1",		"i2c",	0,	0,	72000000,  mux_pllp_out3,			0),  	PERIPH_CLK("i2c3_i2c",	"tegra-i2c.2",		"i2c",	0,	0,	72000000,  mux_pllp_out3,			0),  	PERIPH_CLK("dvc_i2c",	"tegra-i2c.3",		"i2c",	0,	0,	72000000,  mux_pllp_out3,			0), -	PERIPH_CLK("uarta",	"uart.0",		NULL,	6,	0x178,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), -	PERIPH_CLK("uartb",	"uart.1",		NULL,	7,	0x17c,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), -	PERIPH_CLK("uartc",	"uart.2",		NULL,	55,	0x1a0,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), -	PERIPH_CLK("uartd",	"uart.3",		NULL,	65,	0x1c0,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), -	PERIPH_CLK("uarte",	"uart.4",		NULL,	66,	0x1c4,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), +	PERIPH_CLK("uarta",	"tegra-uart.0",		NULL,	6,	0x178,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), +	PERIPH_CLK("uartb",	"tegra-uart.1",		NULL,	7,	0x17c,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), +	PERIPH_CLK("uartc",	"tegra-uart.2",		NULL,	55,	0x1a0,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), +	PERIPH_CLK("uartd",	"tegra-uart.3",		NULL,	65,	0x1c0,	600000000, mux_pllp_pllc_pllm_clkm,	MUX), +	PERIPH_CLK("uarte",	"tegra-uart.4",		NULL,	66,	0x1c4,	600000000, mux_pllp_pllc_pllm_clkm,	MUX),  	PERIPH_CLK("3d",	"3d",			NULL,	24,	0x158,	300000000, mux_pllm_pllc_pllp_plla,	MUX | DIV_U71 | PERIPH_MANUAL_RESET), /* scales with voltage and process_id */  	PERIPH_CLK("2d",	"2d",			NULL,	21,	0x15c,	300000000, mux_pllm_pllc_pllp_plla,	MUX | DIV_U71), /* scales with voltage and process_id */  	PERIPH_CLK("vi",	"tegra_camera",		"vi",	20,	0x148,	150000000, mux_pllm_pllc_pllp_plla,	MUX | DIV_U71), /* scales with voltage and process_id */ @@ -2245,20 +2269,16 @@ static struct clk tegra_list_clks[] = {   * table under two names.   */  static struct clk_duplicate tegra_clk_duplicates[] = { -	CLK_DUPLICATE("uarta",	"tegra_uart.0",	NULL), -	CLK_DUPLICATE("uartb",	"tegra_uart.1",	NULL), -	CLK_DUPLICATE("uartc",	"tegra_uart.2",	NULL), -	CLK_DUPLICATE("uartd",	"tegra_uart.3",	NULL), -	CLK_DUPLICATE("uarte",	"tegra_uart.4",	NULL), +	CLK_DUPLICATE("uarta",  "serial8250.0", NULL), +	CLK_DUPLICATE("uartb",  "serial8250.1", NULL), +	CLK_DUPLICATE("uartc",  "serial8250.2", NULL), +	CLK_DUPLICATE("uartd",  "serial8250.3", NULL), +	CLK_DUPLICATE("uarte",  "serial8250.4", NULL),  	CLK_DUPLICATE("usbd", "utmip-pad", NULL),  	CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),  	CLK_DUPLICATE("usbd", "tegra-otg", NULL),  	CLK_DUPLICATE("hdmi", "tegradc.0", "hdmi"),  	CLK_DUPLICATE("hdmi", "tegradc.1", "hdmi"), -	CLK_DUPLICATE("pwm", "tegra_pwm.0", NULL), -	CLK_DUPLICATE("pwm", "tegra_pwm.1", NULL), -	CLK_DUPLICATE("pwm", "tegra_pwm.2", NULL), -	CLK_DUPLICATE("pwm", "tegra_pwm.3", NULL),  	CLK_DUPLICATE("host1x", "tegra_grhost", "host1x"),  	CLK_DUPLICATE("2d", "tegra_grhost", "gr2d"),  	CLK_DUPLICATE("3d", "tegra_grhost", "gr3d"), diff --git a/arch/arm/mach-tegra/tegra30_clocks.c b/arch/arm/mach-tegra/tegra30_clocks.c index e33fe4b14a2..6674f100e16 100644 --- a/arch/arm/mach-tegra/tegra30_clocks.c +++ b/arch/arm/mach-tegra/tegra30_clocks.c @@ -2871,7 +2871,7 @@ static struct clk tegra30_clk_twd = {  		},					\  	}  struct clk tegra_list_clks[] = { -	PERIPH_CLK("apbdma",	"tegra-dma",		NULL,	34,	0,	26000000,  mux_clk_m,			0), +	PERIPH_CLK("apbdma",	"tegra-apbdma",		NULL,	34,	0,	26000000,  mux_clk_m,			0),  	PERIPH_CLK("rtc",	"rtc-tegra",		NULL,	4,	0,	32768,     mux_clk_32k,			PERIPH_NO_RESET | PERIPH_ON_APB),  	PERIPH_CLK("kbc",	"tegra-kbc",		NULL,	36,	0,	32768,     mux_clk_32k,			PERIPH_NO_RESET | PERIPH_ON_APB),  	PERIPH_CLK("timer",	"timer",		NULL,	5,	0,	26000000,  mux_clk_m,			0), @@ -2886,7 +2886,7 @@ struct clk tegra_list_clks[] = {  	PERIPH_CLK("i2s4",	"tegra30-i2s.4",	NULL,	102,	0x3c0,	26000000,  mux_pllaout0_audio4_2x_pllp_clkm,	MUX | DIV_U71 | PERIPH_ON_APB),  	PERIPH_CLK("spdif_out",	"tegra30-spdif",	"spdif_out",	10,	0x108,	100000000, mux_pllaout0_audio_2x_pllp_clkm,	MUX | DIV_U71 | PERIPH_ON_APB),  	PERIPH_CLK("spdif_in",	"tegra30-spdif",	"spdif_in",	10,	0x10c,	100000000, mux_pllp_pllc_pllm,		MUX | DIV_U71 | PERIPH_ON_APB), -	PERIPH_CLK("pwm",	"pwm",			NULL,	17,	0x110,	432000000, mux_pllp_pllc_clk32_clkm,	MUX | MUX_PWM | DIV_U71 | PERIPH_ON_APB), +	PERIPH_CLK("pwm",	"tegra-pwm",		NULL,	17,	0x110,	432000000, mux_pllp_pllc_clk32_clkm,	MUX | MUX_PWM | DIV_U71 | PERIPH_ON_APB),  	PERIPH_CLK("d_audio",	"tegra30-ahub",		"d_audio", 106,	0x3d0,	48000000,  mux_plla_pllc_pllp_clkm,	MUX | DIV_U71),  	PERIPH_CLK("dam0",	"tegra30-dam.0",	NULL,   108,	0x3d8,	48000000,  mux_plla_pllc_pllp_clkm,	MUX | DIV_U71),  	PERIPH_CLK("dam1",	"tegra30-dam.1",	NULL,   109,	0x3dc,	48000000,  mux_plla_pllc_pllp_clkm,	MUX | DIV_U71), @@ -2924,16 +2924,11 @@ struct clk tegra_list_clks[] = {  	PERIPH_CLK("i2c3",	"tegra-i2c.2",		NULL,	67,	0x1b8,	26000000,  mux_pllp_clkm,		MUX | DIV_U16 | PERIPH_ON_APB),  	PERIPH_CLK("i2c4",	"tegra-i2c.3",		NULL,	103,	0x3c4,	26000000,  mux_pllp_clkm,		MUX | DIV_U16 | PERIPH_ON_APB),  	PERIPH_CLK("i2c5",	"tegra-i2c.4",		NULL,	47,	0x128,	26000000,  mux_pllp_clkm,		MUX | DIV_U16 | PERIPH_ON_APB), -	PERIPH_CLK("uarta",	"tegra_uart.0",		NULL,	6,	0x178,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uartb",	"tegra_uart.1",		NULL,	7,	0x17c,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uartc",	"tegra_uart.2",		NULL,	55,	0x1a0,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uartd",	"tegra_uart.3",		NULL,	65,	0x1c0,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uarte",	"tegra_uart.4",		NULL,	66,	0x1c4,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uarta_dbg",	"serial8250.0",		"uarta", 6,	0x178,	800000000, mux_pllp_clkm,		MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uartb_dbg",	"serial8250.0",		"uartb", 7,	0x17c,	800000000, mux_pllp_clkm,		MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uartc_dbg",	"serial8250.0",		"uartc", 55,	0x1a0,	800000000, mux_pllp_clkm,		MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uartd_dbg",	"serial8250.0",		"uartd", 65,	0x1c0,	800000000, mux_pllp_clkm,		MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), -	PERIPH_CLK("uarte_dbg",	"serial8250.0",		"uarte", 66,	0x1c4,	800000000, mux_pllp_clkm,		MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), +	PERIPH_CLK("uarta",	"tegra-uart.0",		NULL,	6,	0x178,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), +	PERIPH_CLK("uartb",	"tegra-uart.1",		NULL,	7,	0x17c,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), +	PERIPH_CLK("uartc",	"tegra-uart.2",		NULL,	55,	0x1a0,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), +	PERIPH_CLK("uartd",	"tegra-uart.3",		NULL,	65,	0x1c0,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB), +	PERIPH_CLK("uarte",	"tegra-uart.4",		NULL,	66,	0x1c4,	800000000, mux_pllp_pllc_pllm_clkm,	MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB),  	PERIPH_CLK_EX("vi",	"tegra_camera",		"vi",	20,	0x148,	425000000, mux_pllm_pllc_pllp_plla,	MUX | DIV_U71 | DIV_U71_INT,	&tegra_vi_clk_ops),  	PERIPH_CLK("3d",	"3d",			NULL,	24,	0x158,	520000000, mux_pllm_pllc_pllp_plla,	MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET),  	PERIPH_CLK("3d2",       "3d2",			NULL,	98,	0x3b0,	520000000, mux_pllm_pllc_pllp_plla,	MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET), @@ -2983,6 +2978,11 @@ struct clk tegra_list_clks[] = {   * table under two names.   */  struct clk_duplicate tegra_clk_duplicates[] = { +	CLK_DUPLICATE("uarta",  "serial8250.0", NULL), +	CLK_DUPLICATE("uartb",  "serial8250.1", NULL), +	CLK_DUPLICATE("uartc",  "serial8250.2", NULL), +	CLK_DUPLICATE("uartd",  "serial8250.3", NULL), +	CLK_DUPLICATE("uarte",  "serial8250.4", NULL),  	CLK_DUPLICATE("usbd", "utmip-pad", NULL),  	CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),  	CLK_DUPLICATE("usbd", "tegra-otg", NULL), @@ -2990,10 +2990,6 @@ struct clk_duplicate tegra_clk_duplicates[] = {  	CLK_DUPLICATE("hdmi", "tegradc.1", "hdmi"),  	CLK_DUPLICATE("dsib", "tegradc.0", "dsib"),  	CLK_DUPLICATE("dsia", "tegradc.1", "dsia"), -	CLK_DUPLICATE("pwm", "tegra_pwm.0", NULL), -	CLK_DUPLICATE("pwm", "tegra_pwm.1", NULL), -	CLK_DUPLICATE("pwm", "tegra_pwm.2", NULL), -	CLK_DUPLICATE("pwm", "tegra_pwm.3", NULL),  	CLK_DUPLICATE("bsev", "tegra-avp", "bsev"),  	CLK_DUPLICATE("bsev", "nvavp", "bsev"),  	CLK_DUPLICATE("vde", "tegra-aes", "vde"), diff --git a/arch/arm/mach-tegra/timer.c b/arch/arm/mach-tegra/timer.c index 315672c7bd4..57b5bdc13b9 100644 --- a/arch/arm/mach-tegra/timer.c +++ b/arch/arm/mach-tegra/timer.c @@ -189,7 +189,7 @@ static void __init tegra_init_timer(void)  			" Assuming 12Mhz input clock.\n");  		rate = 12000000;  	} else { -		clk_enable(clk); +		clk_prepare_enable(clk);  		rate = clk_get_rate(clk);  	} @@ -201,7 +201,7 @@ static void __init tegra_init_timer(void)  	if (IS_ERR(clk))  		pr_warn("Unable to get rtc-tegra clock\n");  	else -		clk_enable(clk); +		clk_prepare_enable(clk);  	switch (rate) {  	case 12000000: diff --git a/arch/arm/mach-tegra/usb_phy.c b/arch/arm/mach-tegra/usb_phy.c index 54e353c8e30..022b33a05c3 100644 --- a/arch/arm/mach-tegra/usb_phy.c +++ b/arch/arm/mach-tegra/usb_phy.c @@ -247,7 +247,7 @@ static void utmip_pad_power_on(struct tegra_usb_phy *phy)  	unsigned long val, flags;  	void __iomem *base = phy->pad_regs; -	clk_enable(phy->pad_clk); +	clk_prepare_enable(phy->pad_clk);  	spin_lock_irqsave(&utmip_pad_lock, flags); @@ -259,7 +259,7 @@ static void utmip_pad_power_on(struct tegra_usb_phy *phy)  	spin_unlock_irqrestore(&utmip_pad_lock, flags); -	clk_disable(phy->pad_clk); +	clk_disable_unprepare(phy->pad_clk);  }  static int utmip_pad_power_off(struct tegra_usb_phy *phy) @@ -272,7 +272,7 @@ static int utmip_pad_power_off(struct tegra_usb_phy *phy)  		return -EINVAL;  	} -	clk_enable(phy->pad_clk); +	clk_prepare_enable(phy->pad_clk);  	spin_lock_irqsave(&utmip_pad_lock, flags); @@ -284,7 +284,7 @@ static int utmip_pad_power_off(struct tegra_usb_phy *phy)  	spin_unlock_irqrestore(&utmip_pad_lock, flags); -	clk_disable(phy->pad_clk); +	clk_disable_unprepare(phy->pad_clk);  	return 0;  } @@ -580,7 +580,7 @@ static int ulpi_phy_power_on(struct tegra_usb_phy *phy)  	msleep(5);  	gpio_direction_output(config->reset_gpio, 1); -	clk_enable(phy->clk); +	clk_prepare_enable(phy->clk);  	msleep(1);  	val = readl(base + USB_SUSP_CTRL); @@ -689,7 +689,7 @@ struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,  		err = PTR_ERR(phy->pll_u);  		goto err0;  	} -	clk_enable(phy->pll_u); +	clk_prepare_enable(phy->pll_u);  	parent_rate = clk_get_rate(clk_get_parent(phy->pll_u));  	for (i = 0; i < ARRAY_SIZE(tegra_freq_table); i++) { @@ -735,7 +735,7 @@ struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,  	return phy;  err1: -	clk_disable(phy->pll_u); +	clk_disable_unprepare(phy->pll_u);  	clk_put(phy->pll_u);  err0:  	kfree(phy); @@ -810,7 +810,7 @@ void tegra_usb_phy_close(struct tegra_usb_phy *phy)  		clk_put(phy->clk);  	else  		utmip_pad_close(phy); -	clk_disable(phy->pll_u); +	clk_disable_unprepare(phy->pll_u);  	clk_put(phy->pll_u);  	kfree(phy);  } diff --git a/arch/arm/mach-u300/Makefile b/arch/arm/mach-u300/Makefile index fd3a5c382f4..7e47d37aeb0 100644 --- a/arch/arm/mach-u300/Makefile +++ b/arch/arm/mach-u300/Makefile @@ -2,7 +2,7 @@  # Makefile for the linux kernel, U300 machine.  # -obj-y		:= core.o clock.o timer.o +obj-y		:= core.o timer.o  obj-m		:=  obj-n		:=  obj-		:= diff --git a/arch/arm/mach-u300/clock.c b/arch/arm/mach-u300/clock.c deleted file mode 100644 index 5535dd0a78c..00000000000 --- a/arch/arm/mach-u300/clock.c +++ /dev/null @@ -1,1504 +0,0 @@ -/* - * - * arch/arm/mach-u300/clock.c - * - * - * Copyright (C) 2007-2009 ST-Ericsson AB - * License terms: GNU General Public License (GPL) version 2 - * Define clocks in the app platform. - * Author: Linus Walleij <linus.walleij@stericsson.com> - * Author: Jonas Aaberg <jonas.aberg@stericsson.com> - * - */ -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/list.h> -#include <linux/errno.h> -#include <linux/err.h> -#include <linux/string.h> -#include <linux/clk.h> -#include <linux/mutex.h> -#include <linux/spinlock.h> -#include <linux/debugfs.h> -#include <linux/device.h> -#include <linux/init.h> -#include <linux/timer.h> -#include <linux/io.h> -#include <linux/seq_file.h> -#include <linux/clkdev.h> - -#include <mach/hardware.h> -#include <mach/syscon.h> - -#include "clock.h" - -/* - * TODO: - * - move all handling of the CCR register into this file and create - *   a spinlock for the CCR register - * - switch to the clkdevice lookup mechanism that maps clocks to - *   device ID:s instead when it becomes available in kernel 2.6.29. - * - implement rate get/set for all clocks that need it. - */ - -/* - * Syscon clock I/O registers lock so clock requests don't collide - * NOTE: this is a local lock only used to lock access to clock and - * reset registers in syscon. - */ -static DEFINE_SPINLOCK(syscon_clkreg_lock); -static DEFINE_SPINLOCK(syscon_resetreg_lock); - -/* - * The clocking hierarchy currently looks like this. - * NOTE: the idea is NOT to show how the clocks are routed on the chip! - * The ideas is to show dependencies, so a clock higher up in the - * hierarchy has to be on in order for another clock to be on. Now, - * both CPU and DMA can actually be on top of the hierarchy, and that - * is not modeled currently. Instead we have the backbone AMBA bus on - * top. This bus cannot be programmed in any way but conceptually it - * needs to be active for the bridges and devices to transport data. - * - * Please be aware that a few clocks are hw controlled, which mean that - * the hw itself can turn on/off or change the rate of the clock when - * needed! - * - *  AMBA bus - *  | - *  +- CPU - *  +- FSMC NANDIF NAND Flash interface - *  +- SEMI Shared Memory interface - *  +- ISP Image Signal Processor (U335 only) - *  +- CDS (U335 only) - *  +- DMA Direct Memory Access Controller - *  +- AAIF APP/ACC Inteface (Mobile Scalable Link, MSL) - *  +- APEX - *  +- VIDEO_ENC AVE2/3 Video Encoder - *  +- XGAM Graphics Accelerator Controller - *  +- AHB - *  | - *  +- ahb:0 AHB Bridge - *  |  | - *  |  +- ahb:1 INTCON Interrupt controller - *  |  +- ahb:3 MSPRO  Memory Stick Pro controller - *  |  +- ahb:4 EMIF   External Memory interface - *  | - *  +- fast:0 FAST bridge - *  |  | - *  |  +- fast:1 MMCSD MMC/SD card reader controller - *  |  +- fast:2 I2S0  PCM I2S channel 0 controller - *  |  +- fast:3 I2S1  PCM I2S channel 1 controller - *  |  +- fast:4 I2C0  I2C channel 0 controller - *  |  +- fast:5 I2C1  I2C channel 1 controller - *  |  +- fast:6 SPI   SPI controller - *  |  +- fast:7 UART1 Secondary UART (U335 only) - *  | - *  +- slow:0 SLOW bridge - *     | - *     +- slow:1 SYSCON (not possible to control) - *     +- slow:2 WDOG Watchdog - *     +- slow:3 UART0 primary UART - *     +- slow:4 TIMER_APP Application timer - used in Linux - *     +- slow:5 KEYPAD controller - *     +- slow:6 GPIO controller - *     +- slow:7 RTC controller - *     +- slow:8 BT Bus Tracer (not used currently) - *     +- slow:9 EH Event Handler (not used currently) - *     +- slow:a TIMER_ACC Access style timer (not used currently) - *     +- slow:b PPM (U335 only, what is that?) - */ - -/* - * Reset control functions. We remember if a block has been - * taken out of reset and don't remove the reset assertion again - * and vice versa. Currently we only remove resets so the - * enablement function is defined out. - */ -static void syscon_block_reset_enable(struct clk *clk) -{ -	u16 val; -	unsigned long iflags; - -	/* Not all blocks support resetting */ -	if (!clk->res_reg || !clk->res_mask) -		return; -	spin_lock_irqsave(&syscon_resetreg_lock, iflags); -	val = readw(clk->res_reg); -	val |= clk->res_mask; -	writew(val, clk->res_reg); -	spin_unlock_irqrestore(&syscon_resetreg_lock, iflags); -	clk->reset = true; -} - -static void syscon_block_reset_disable(struct clk *clk) -{ -	u16 val; -	unsigned long iflags; - -	/* Not all blocks support resetting */ -	if (!clk->res_reg || !clk->res_mask) -		return; -	spin_lock_irqsave(&syscon_resetreg_lock, iflags); -	val = readw(clk->res_reg); -	val &= ~clk->res_mask; -	writew(val, clk->res_reg); -	spin_unlock_irqrestore(&syscon_resetreg_lock, iflags); -	clk->reset = false; -} - -int __clk_get(struct clk *clk) -{ -	u16 val; - -	/* The MMC and MSPRO clocks need some special set-up */ -	if (!strcmp(clk->name, "MCLK")) { -		/* Set default MMC clock divisor to 18.9 MHz */ -		writew(0x0054U, U300_SYSCON_VBASE + U300_SYSCON_MMF0R); -		val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR); -		/* Disable the MMC feedback clock */ -		val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE; -		/* Disable MSPRO frequency */ -		val &= ~U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE; -		writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR); -	} -	if (!strcmp(clk->name, "MSPRO")) { -		val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR); -		/* Disable the MMC feedback clock */ -		val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE; -		/* Enable MSPRO frequency */ -		val |= U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE; -		writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR); -	} -	return 1; -} -EXPORT_SYMBOL(__clk_get); - -void __clk_put(struct clk *clk) -{ -} -EXPORT_SYMBOL(__clk_put); - -static void syscon_clk_disable(struct clk *clk) -{ -	unsigned long iflags; - -	/* Don't touch the hardware controlled clocks */ -	if (clk->hw_ctrld) -		return; - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCDR); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} - -static void syscon_clk_enable(struct clk *clk) -{ -	unsigned long iflags; - -	/* Don't touch the hardware controlled clocks */ -	if (clk->hw_ctrld) -		return; - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCER); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} - -static u16 syscon_clk_get_rate(void) -{ -	u16 val; -	unsigned long iflags; - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val &= U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -	return val; -} - -#ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER -static void enable_i2s0_vcxo(void) -{ -	u16 val; -	unsigned long iflags; - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	/* Set I2S0 to use the VCXO 26 MHz clock */ -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val |= U300_SYSCON_CCR_TURN_VCXO_ON; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val |= U300_SYSCON_CCR_I2S0_USE_VCXO; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	val |= U300_SYSCON_CEFR_I2S0_CLK_EN; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} - -static void enable_i2s1_vcxo(void) -{ -	u16 val; -	unsigned long iflags; - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	/* Set I2S1 to use the VCXO 26 MHz clock */ -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val |= U300_SYSCON_CCR_TURN_VCXO_ON; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val |= U300_SYSCON_CCR_I2S1_USE_VCXO; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	val |= U300_SYSCON_CEFR_I2S1_CLK_EN; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} - -static void disable_i2s0_vcxo(void) -{ -	u16 val; -	unsigned long iflags; - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	/* Disable I2S0 use of the VCXO 26 MHz clock */ -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val &= ~U300_SYSCON_CCR_I2S0_USE_VCXO; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	/* Deactivate VCXO if no one else is using VCXO */ -	if (!(val & U300_SYSCON_CCR_I2S1_USE_VCXO)) -		val &= ~U300_SYSCON_CCR_TURN_VCXO_ON; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} - -static void disable_i2s1_vcxo(void) -{ -	u16 val; -	unsigned long iflags; - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	/* Disable I2S1 use of the VCXO 26 MHz clock */ -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val &= ~U300_SYSCON_CCR_I2S1_USE_VCXO; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	/* Deactivate VCXO if no one else is using VCXO */ -	if (!(val & U300_SYSCON_CCR_I2S0_USE_VCXO)) -		val &= ~U300_SYSCON_CCR_TURN_VCXO_ON; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} -#endif /* CONFIG_MACH_U300_USE_I2S_AS_MASTER */ - - -static void syscon_clk_rate_set_mclk(unsigned long rate) -{ -	u16 val; -	u32 reg; -	unsigned long iflags; - -	switch (rate) { -	case 18900000: -		val = 0x0054; -		break; -	case 20800000: -		val = 0x0044; -		break; -	case 23100000: -		val = 0x0043; -		break; -	case 26000000: -		val = 0x0033; -		break; -	case 29700000: -		val = 0x0032; -		break; -	case 34700000: -		val = 0x0022; -		break; -	case 41600000: -		val = 0x0021; -		break; -	case 52000000: -		val = 0x0011; -		break; -	case 104000000: -		val = 0x0000; -		break; -	default: -		printk(KERN_ERR "Trying to set MCLK to unknown speed! %ld\n", -		       rate); -		return; -	} - -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	reg = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) & -		~U300_SYSCON_MMF0R_MASK; -	writew(reg | val, U300_SYSCON_VBASE + U300_SYSCON_MMF0R); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} - -void syscon_clk_rate_set_cpuclk(unsigned long rate) -{ -	u16 val; -	unsigned long iflags; - -	switch (rate) { -	case 13000000: -		val = U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER; -		break; -	case 52000000: -		val = U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE; -		break; -	case 104000000: -		val = U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH; -		break; -	case 208000000: -		val = U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST; -		break; -	default: -		return; -	} -	spin_lock_irqsave(&syscon_clkreg_lock, iflags); -	val |= readw(U300_SYSCON_VBASE + U300_SYSCON_CCR) & -		~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK ; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); -} -EXPORT_SYMBOL(syscon_clk_rate_set_cpuclk); - -void clk_disable(struct clk *clk) -{ -	unsigned long iflags; - -	spin_lock_irqsave(&clk->lock, iflags); -	if (clk->usecount > 0 && !(--clk->usecount)) { -		/* some blocks lack clocking registers and cannot be disabled */ -		if (clk->disable) -			clk->disable(clk); -		if (likely((u32)clk->parent)) -			clk_disable(clk->parent); -	} -#ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER -	if (unlikely(!strcmp(clk->name, "I2S0"))) -		disable_i2s0_vcxo(); -	if (unlikely(!strcmp(clk->name, "I2S1"))) -		disable_i2s1_vcxo(); -#endif -	spin_unlock_irqrestore(&clk->lock, iflags); -} -EXPORT_SYMBOL(clk_disable); - -int clk_enable(struct clk *clk) -{ -	int ret = 0; -	unsigned long iflags; - -	spin_lock_irqsave(&clk->lock, iflags); -	if (clk->usecount++ == 0) { -		if (likely((u32)clk->parent)) -			ret = clk_enable(clk->parent); - -		if (unlikely(ret != 0)) -			clk->usecount--; -		else { -			/* remove reset line (we never enable reset again) */ -			syscon_block_reset_disable(clk); -			/* clocks without enable function are always on */ -			if (clk->enable) -				clk->enable(clk); -#ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER -			if (unlikely(!strcmp(clk->name, "I2S0"))) -				enable_i2s0_vcxo(); -			if (unlikely(!strcmp(clk->name, "I2S1"))) -				enable_i2s1_vcxo(); -#endif -		} -	} -	spin_unlock_irqrestore(&clk->lock, iflags); -	return ret; - -} -EXPORT_SYMBOL(clk_enable); - -/* Returns the clock rate in Hz */ -static unsigned long clk_get_rate_cpuclk(struct clk *clk) -{ -	u16 val; - -	val = syscon_clk_get_rate(); - -	switch (val) { -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: -		return 13000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: -		return 52000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: -		return 104000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: -		return 208000000; -	default: -		break; -	} -	return clk->rate; -} - -static unsigned long clk_get_rate_ahb_clk(struct clk *clk) -{ -	u16 val; - -	val = syscon_clk_get_rate(); - -	switch (val) { -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: -		return 6500000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: -		return 26000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: -		return 52000000; -	default: -		break; -	} -	return clk->rate; - -} - -static unsigned long clk_get_rate_emif_clk(struct clk *clk) -{ -	u16 val; - -	val = syscon_clk_get_rate(); - -	switch (val) { -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: -		return 13000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: -		return 52000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: -		return 104000000; -	default: -		break; -	} -	return clk->rate; - -} - -static unsigned long clk_get_rate_xgamclk(struct clk *clk) -{ -	u16 val; - -	val = syscon_clk_get_rate(); - -	switch (val) { -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: -		return 6500000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: -		return 26000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: -		return 52000000; -	default: -		break; -	} - -	return clk->rate; -} - -static unsigned long clk_get_rate_mclk(struct clk *clk) -{ -	u16 val; - -	val = syscon_clk_get_rate(); - -	switch (val) { -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: -		/* -		 * Here, the 208 MHz PLL gets shut down and the always -		 * on 13 MHz PLL used for RTC etc kicks into use -		 * instead. -		 */ -		return 13000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: -	{ -		/* -		 * This clock is under program control. The register is -		 * divided in two nybbles, bit 7-4 gives cycles-1 to count -		 * high, bit 3-0 gives cycles-1 to count low. Distribute -		 * these with no more than 1 cycle difference between -		 * low and high and add low and high to get the actual -		 * divisor. The base PLL is 208 MHz. Writing 0x00 will -		 * divide by 1 and 1 so the highest frequency possible -		 * is 104 MHz. -		 * -		 * e.g. 0x54 => -		 * f = 208 / ((5+1) + (4+1)) = 208 / 11 = 18.9 MHz -		 */ -		u16 val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) & -			U300_SYSCON_MMF0R_MASK; -		switch (val) { -		case 0x0054: -			return 18900000; -		case 0x0044: -			return 20800000; -		case 0x0043: -			return 23100000; -		case 0x0033: -			return 26000000; -		case 0x0032: -			return 29700000; -		case 0x0022: -			return 34700000; -		case 0x0021: -			return 41600000; -		case 0x0011: -			return 52000000; -		case 0x0000: -			return 104000000; -		default: -			break; -		} -	} -	default: -		break; -	} - -	return clk->rate; -} - -static unsigned long clk_get_rate_i2s_i2c_spi(struct clk *clk) -{ -	u16 val; - -	val = syscon_clk_get_rate(); - -	switch (val) { -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: -		return 13000000; -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: -	case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: -		return 26000000; -	default: -		break; -	} - -	return clk->rate; -} - -unsigned long clk_get_rate(struct clk *clk) -{ -	if (clk->get_rate) -		return clk->get_rate(clk); -	else -		return clk->rate; -} -EXPORT_SYMBOL(clk_get_rate); - -static unsigned long clk_round_rate_mclk(struct clk *clk, unsigned long rate) -{ -	if (rate <= 18900000) -		return 18900000; -	if (rate <= 20800000) -		return 20800000; -	if (rate <= 23100000) -		return 23100000; -	if (rate <= 26000000) -		return 26000000; -	if (rate <= 29700000) -		return 29700000; -	if (rate <= 34700000) -		return 34700000; -	if (rate <= 41600000) -		return 41600000; -	if (rate <= 52000000) -		return 52000000; -	return -EINVAL; -} - -static unsigned long clk_round_rate_cpuclk(struct clk *clk, unsigned long rate) -{ -	if (rate <= 13000000) -		return 13000000; -	if (rate <= 52000000) -		return 52000000; -	if (rate <= 104000000) -		return 104000000; -	if (rate <= 208000000) -		return 208000000; -	return -EINVAL; -} - -/* - * This adjusts a requested rate to the closest exact rate - * a certain clock can provide. For a fixed clock it's - * mostly clk->rate. - */ -long clk_round_rate(struct clk *clk, unsigned long rate) -{ -	/* TODO: get appropriate switches for EMIFCLK, AHBCLK and MCLK */ -	/* Else default to fixed value */ - -	if (clk->round_rate) { -		return (long) clk->round_rate(clk, rate); -	} else { -		printk(KERN_ERR "clock: Failed to round rate of %s\n", -		       clk->name); -	} -	return (long) clk->rate; -} -EXPORT_SYMBOL(clk_round_rate); - -static int clk_set_rate_mclk(struct clk *clk, unsigned long rate) -{ -	syscon_clk_rate_set_mclk(clk_round_rate(clk, rate)); -	return 0; -} - -static int clk_set_rate_cpuclk(struct clk *clk, unsigned long rate) -{ -	syscon_clk_rate_set_cpuclk(clk_round_rate(clk, rate)); -	return 0; -} - -int clk_set_rate(struct clk *clk, unsigned long rate) -{ -	/* TODO: set for EMIFCLK and AHBCLK */ -	/* Else assume the clock is fixed and fail */ -	if (clk->set_rate) { -		return clk->set_rate(clk, rate); -	} else { -		printk(KERN_ERR "clock: Failed to set %s to %ld hz\n", -		       clk->name, rate); -		return -EINVAL; -	} -} -EXPORT_SYMBOL(clk_set_rate); - -/* - * Clock definitions. The clock parents are set to respective - * bridge and the clock framework makes sure that the clocks have - * parents activated and are brought out of reset when in use. - * - * Clocks that have hw_ctrld = true are hw controlled, and the hw - * can by itself turn these clocks on and off. - * So in other words, we don't really have to care about them. - */ - -static struct clk amba_clk = { -	.name	    = "AMBA", -	.rate	    = 52000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = false, -	.lock       = __SPIN_LOCK_UNLOCKED(amba_clk.lock), -}; - -/* - * These blocks are connected directly to the AMBA bus - * with no bridge. - */ - -static struct clk cpu_clk = { -	.name	    = "CPU", -	.parent	    = &amba_clk, -	.rate	    = 208000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_CPU_RESET_EN, -	.set_rate   = clk_set_rate_cpuclk, -	.get_rate   = clk_get_rate_cpuclk, -	.round_rate = clk_round_rate_cpuclk, -	.lock       = __SPIN_LOCK_UNLOCKED(cpu_clk.lock), -}; - -static struct clk nandif_clk = { -	.name       = "FSMC", -	.parent	    = &amba_clk, -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_NANDIF_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_NANDIF_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(nandif_clk.lock), -}; - -static struct clk semi_clk = { -	.name       = "SEMI", -	.parent	    = &amba_clk, -	.rate       = 0, /* FIXME */ -	/* It is not possible to reset SEMI */ -	.hw_ctrld   = false, -	.reset	    = false, -	.clk_val    = U300_SYSCON_SBCER_SEMI_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(semi_clk.lock), -}; - -#ifdef CONFIG_MACH_U300_BS335 -static struct clk isp_clk = { -	.name	    = "ISP", -	.parent	    = &amba_clk, -	.rate	    = 0, /* FIXME */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_ISP_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_ISP_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(isp_clk.lock), -}; - -static struct clk cds_clk = { -	.name	    = "CDS", -	.parent	    = &amba_clk, -	.rate	    = 0, /* FIXME */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_CDS_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_CDS_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(cds_clk.lock), -}; -#endif - -static struct clk dma_clk = { -	.name       = "DMA", -	.parent	    = &amba_clk, -	.rate       = 52000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_DMAC_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_DMAC_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(dma_clk.lock), -}; - -static struct clk aaif_clk = { -	.name       = "AAIF", -	.parent	    = &amba_clk, -	.rate       = 52000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_AAIF_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_AAIF_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(aaif_clk.lock), -}; - -static struct clk apex_clk = { -	.name       = "APEX", -	.parent	    = &amba_clk, -	.rate       = 0, /* FIXME */ -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_APEX_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_APEX_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(apex_clk.lock), -}; - -static struct clk video_enc_clk = { -	.name       = "VIDEO_ENC", -	.parent	    = &amba_clk, -	.rate       = 208000000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = false, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	/* This has XGAM in the name but refers to the video encoder */ -	.res_mask   = U300_SYSCON_RRR_XGAM_VC_SYNC_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(video_enc_clk.lock), -}; - -static struct clk xgam_clk = { -	.name       = "XGAMCLK", -	.parent	    = &amba_clk, -	.rate       = 52000000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_XGAM_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_XGAM_CLK_EN, -	.get_rate   = clk_get_rate_xgamclk, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(xgam_clk.lock), -}; - -/* This clock is used to activate the video encoder */ -static struct clk ahb_clk = { -	.name	    = "AHB", -	.parent	    = &amba_clk, -	.rate	    = 52000000, /* this varies! */ -	.hw_ctrld   = false, /* This one is set to false due to HW bug */ -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_AHB_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_AHB_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_ahb_clk, -	.lock       = __SPIN_LOCK_UNLOCKED(ahb_clk.lock), -}; - - -/* - * Clocks on the AHB bridge - */ - -static struct clk ahb_subsys_clk = { -	.name	    = "AHB_SUBSYS", -	.parent	    = &amba_clk, -	.rate	    = 52000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = false, -	.clk_val    = U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_ahb_clk, -	.lock       = __SPIN_LOCK_UNLOCKED(ahb_subsys_clk.lock), -}; - -static struct clk intcon_clk = { -	.name	    = "INTCON", -	.parent	    = &ahb_subsys_clk, -	.rate	    = 52000000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_INTCON_RESET_EN, -	/* INTCON can be reset but not clock-gated */ -	.lock       = __SPIN_LOCK_UNLOCKED(intcon_clk.lock), - -}; - -static struct clk mspro_clk = { -	.name       = "MSPRO", -	.parent	    = &ahb_subsys_clk, -	.rate       = 0, /* FIXME */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_MSPRO_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_MSPRO_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(mspro_clk.lock), -}; - -static struct clk emif_clk = { -	.name	    = "EMIF", -	.parent	    = &ahb_subsys_clk, -	.rate	    = 104000000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RRR, -	.res_mask   = U300_SYSCON_RRR_EMIF_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_EMIF_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_emif_clk, -	.lock       = __SPIN_LOCK_UNLOCKED(emif_clk.lock), -}; - - -/* - * Clocks on the FAST bridge - */ -static struct clk fast_clk = { -	.name	    = "FAST_BRIDGE", -	.parent	    = &amba_clk, -	.rate	    = 13000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(fast_clk.lock), -}; - -/* - * The MMCI apb_pclk is hardwired to the same terminal as the - * external MCI clock. Thus this will be referenced twice. - */ -static struct clk mmcsd_clk = { -	.name       = "MCLK", -	.parent	    = &fast_clk, -	.rate       = 18900000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_MMC_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_MMC_CLK_EN, -	.get_rate   = clk_get_rate_mclk, -	.set_rate   = clk_set_rate_mclk, -	.round_rate = clk_round_rate_mclk, -	.disable    = syscon_clk_disable, -	.enable     = syscon_clk_enable, -	.lock       = __SPIN_LOCK_UNLOCKED(mmcsd_clk.lock), -}; - -static struct clk i2s0_clk = { -	.name       = "i2s0", -	.parent	    = &fast_clk, -	.rate       = 26000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_I2S0_CORE_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_i2s_i2c_spi, -	.lock       = __SPIN_LOCK_UNLOCKED(i2s0_clk.lock), -}; - -static struct clk i2s1_clk = { -	.name       = "i2s1", -	.parent	    = &fast_clk, -	.rate       = 26000000, /* this varies! */ -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_I2S1_CORE_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_i2s_i2c_spi, -	.lock       = __SPIN_LOCK_UNLOCKED(i2s1_clk.lock), -}; - -static struct clk i2c0_clk = { -	.name       = "I2C0", -	.parent	    = &fast_clk, -	.rate       = 26000000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_I2C0_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_I2C0_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_i2s_i2c_spi, -	.lock       = __SPIN_LOCK_UNLOCKED(i2c0_clk.lock), -}; - -static struct clk i2c1_clk = { -	.name       = "I2C1", -	.parent	    = &fast_clk, -	.rate       = 26000000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_I2C1_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_I2C1_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_i2s_i2c_spi, -	.lock       = __SPIN_LOCK_UNLOCKED(i2c1_clk.lock), -}; - -/* - * The SPI apb_pclk is hardwired to the same terminal as the - * external SPI clock. Thus this will be referenced twice. - */ -static struct clk spi_clk = { -	.name       = "SPI", -	.parent	    = &fast_clk, -	.rate       = 26000000, /* this varies! */ -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_SPI_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_SPI_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.get_rate   = clk_get_rate_i2s_i2c_spi, -	.lock       = __SPIN_LOCK_UNLOCKED(spi_clk.lock), -}; - -#ifdef CONFIG_MACH_U300_BS335 -static struct clk uart1_pclk = { -	.name	    = "UART1_PCLK", -	.parent	    = &fast_clk, -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RFR, -	.res_mask   = U300_SYSCON_RFR_UART1_RESET_ENABLE, -	.clk_val    = U300_SYSCON_SBCER_UART1_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(uart1_pclk.lock), -}; - -/* This one is hardwired to PLL13 */ -static struct clk uart1_clk = { -	.name	    = "UART1_CLK", -	.rate	    = 13000000, -	.hw_ctrld   = true, -	.lock       = __SPIN_LOCK_UNLOCKED(uart1_clk.lock), -}; -#endif - - -/* - * Clocks on the SLOW bridge - */ -static struct clk slow_clk = { -	.name	    = "SLOW_BRIDGE", -	.parent	    = &amba_clk, -	.rate	    = 13000000, -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(slow_clk.lock), -}; - -/* TODO: implement SYSCON clock? */ - -static struct clk wdog_clk = { -	.name	    = "WDOG", -	.parent	    = &slow_clk, -	.hw_ctrld   = false, -	.rate	    = 32768, -	.reset	    = false, -	/* This is always on, cannot be enabled/disabled or reset */ -	.lock       = __SPIN_LOCK_UNLOCKED(wdog_clk.lock), -}; - -static struct clk uart0_pclk = { -	.name	    = "UART0_PCLK", -	.parent	    = &slow_clk, -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_UART_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_UART_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(uart0_pclk.lock), -}; - -/* This one is hardwired to PLL13 */ -static struct clk uart0_clk = { -	.name	    = "UART0_CLK", -	.parent	    = &slow_clk, -	.rate	    = 13000000, -	.hw_ctrld   = true, -	.lock       = __SPIN_LOCK_UNLOCKED(uart0_clk.lock), -}; - -static struct clk keypad_clk = { -	.name       = "KEYPAD", -	.parent	    = &slow_clk, -	.rate       = 32768, -	.hw_ctrld   = false, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_KEYPAD_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_KEYPAD_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(keypad_clk.lock), -}; - -static struct clk gpio_clk = { -	.name       = "GPIO", -	.parent	    = &slow_clk, -	.rate       = 13000000, -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_GPIO_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_GPIO_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(gpio_clk.lock), -}; - -static struct clk rtc_clk = { -	.name	    = "RTC", -	.parent	    = &slow_clk, -	.rate	    = 32768, -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_RTC_RESET_EN, -	/* This clock is always on, cannot be enabled/disabled */ -	.lock       = __SPIN_LOCK_UNLOCKED(rtc_clk.lock), -}; - -static struct clk bustr_clk = { -	.name       = "BUSTR", -	.parent	    = &slow_clk, -	.rate       = 13000000, -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_BTR_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_BTR_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(bustr_clk.lock), -}; - -static struct clk evhist_clk = { -	.name       = "EVHIST", -	.parent	    = &slow_clk, -	.rate       = 13000000, -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_EH_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_EH_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(evhist_clk.lock), -}; - -static struct clk timer_clk = { -	.name       = "TIMER", -	.parent	    = &slow_clk, -	.rate       = 13000000, -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_ACC_TMR_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_ACC_TMR_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(timer_clk.lock), -}; - -/* - * There is a binary divider in the hardware that divides - * the 13MHz PLL by 13 down to 1 MHz. - */ -static struct clk app_timer_clk = { -	.name       = "TIMER_APP", -	.parent	    = &slow_clk, -	.rate       = 1000000, -	.hw_ctrld   = true, -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_APP_TMR_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_APP_TMR_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(app_timer_clk.lock), -}; - -#ifdef CONFIG_MACH_U300_BS335 -static struct clk ppm_clk = { -	.name	    = "PPM", -	.parent	    = &slow_clk, -	.rate	    = 0, /* FIXME */ -	.hw_ctrld   = true, /* TODO: Look up if it is hw ctrld or not */ -	.reset	    = true, -	.res_reg    = U300_SYSCON_VBASE + U300_SYSCON_RSR, -	.res_mask   = U300_SYSCON_RSR_PPM_RESET_EN, -	.clk_val    = U300_SYSCON_SBCER_PPM_CLK_EN, -	.enable     = syscon_clk_enable, -	.disable    = syscon_clk_disable, -	.lock       = __SPIN_LOCK_UNLOCKED(ppm_clk.lock), -}; -#endif - -#define DEF_LOOKUP(devid, clkref)		\ -	{					\ -	.dev_id = devid,			\ -	.clk = clkref,				\ -	} - -#define DEF_LOOKUP_CON(devid, conid, clkref)	\ -	{					\ -	.dev_id = devid,			\ -	.con_id = conid,			\ -	.clk = clkref,				\ -	} - -/* - * Here we only define clocks that are meaningful to - * look up through clockdevice. - */ -static struct clk_lookup lookups[] = { -	/* Connected directly to the AMBA bus */ -	DEF_LOOKUP("amba",      &amba_clk), -	DEF_LOOKUP("cpu",       &cpu_clk), -	DEF_LOOKUP("fsmc-nand", &nandif_clk), -	DEF_LOOKUP("semi",      &semi_clk), -#ifdef CONFIG_MACH_U300_BS335 -	DEF_LOOKUP("isp",       &isp_clk), -	DEF_LOOKUP("cds",       &cds_clk), -#endif -	DEF_LOOKUP("dma",       &dma_clk), -	DEF_LOOKUP("msl",       &aaif_clk), -	DEF_LOOKUP("apex",      &apex_clk), -	DEF_LOOKUP("video_enc", &video_enc_clk), -	DEF_LOOKUP("xgam",      &xgam_clk), -	DEF_LOOKUP("ahb",       &ahb_clk), -	/* AHB bridge clocks */ -	DEF_LOOKUP("ahb_subsys", &ahb_subsys_clk), -	DEF_LOOKUP("intcon",    &intcon_clk), -	DEF_LOOKUP_CON("intcon", "apb_pclk", &intcon_clk), -	DEF_LOOKUP("mspro",     &mspro_clk), -	DEF_LOOKUP("pl172",     &emif_clk), -	DEF_LOOKUP_CON("pl172", "apb_pclk", &emif_clk), -	/* FAST bridge clocks */ -	DEF_LOOKUP("fast",      &fast_clk), -	DEF_LOOKUP("mmci",      &mmcsd_clk), -	DEF_LOOKUP_CON("mmci", "apb_pclk", &mmcsd_clk), -	/* -	 * The .0 and .1 identifiers on these comes from the platform device -	 * .id field and are assigned when the platform devices are registered. -	 */ -	DEF_LOOKUP("i2s.0",     &i2s0_clk), -	DEF_LOOKUP("i2s.1",     &i2s1_clk), -	DEF_LOOKUP("stu300.0",  &i2c0_clk), -	DEF_LOOKUP("stu300.1",  &i2c1_clk), -	DEF_LOOKUP("pl022",     &spi_clk), -	DEF_LOOKUP_CON("pl022", "apb_pclk", &spi_clk), -#ifdef CONFIG_MACH_U300_BS335 -	DEF_LOOKUP("uart1",     &uart1_clk), -	DEF_LOOKUP_CON("uart1", "apb_pclk", &uart1_pclk), -#endif -	/* SLOW bridge clocks */ -	DEF_LOOKUP("slow",      &slow_clk), -	DEF_LOOKUP("coh901327_wdog",      &wdog_clk), -	DEF_LOOKUP("uart0",     &uart0_clk), -	DEF_LOOKUP_CON("uart0", "apb_pclk", &uart0_pclk), -	DEF_LOOKUP("apptimer",  &app_timer_clk), -	DEF_LOOKUP("coh901461-keypad",    &keypad_clk), -	DEF_LOOKUP("u300-gpio", &gpio_clk), -	DEF_LOOKUP("rtc-coh901331",      &rtc_clk), -	DEF_LOOKUP("bustr",     &bustr_clk), -	DEF_LOOKUP("evhist",    &evhist_clk), -	DEF_LOOKUP("timer",     &timer_clk), -#ifdef CONFIG_MACH_U300_BS335 -	DEF_LOOKUP("ppm",       &ppm_clk), -#endif -}; - -static void __init clk_register(void) -{ -	/* Register the lookups */ -	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); -} - -#if (defined(CONFIG_DEBUG_FS) && defined(CONFIG_U300_DEBUG)) -/* - * The following makes it possible to view the status (especially - * reference count and reset status) for the clocks in the platform - * by looking into the special file <debugfs>/u300_clocks - */ - -/* A list of all clocks in the platform */ -static struct clk *clks[] = { -	/* Top node clock for the AMBA bus */ -	&amba_clk, -	/* Connected directly to the AMBA bus */ -	&cpu_clk, -	&nandif_clk, -	&semi_clk, -#ifdef CONFIG_MACH_U300_BS335 -	&isp_clk, -	&cds_clk, -#endif -	&dma_clk, -	&aaif_clk, -	&apex_clk, -	&video_enc_clk, -	&xgam_clk, -	&ahb_clk, - -	/* AHB bridge clocks */ -	&ahb_subsys_clk, -	&intcon_clk, -	&mspro_clk, -	&emif_clk, -	/* FAST bridge clocks */ -	&fast_clk, -	&mmcsd_clk, -	&i2s0_clk, -	&i2s1_clk, -	&i2c0_clk, -	&i2c1_clk, -	&spi_clk, -#ifdef CONFIG_MACH_U300_BS335 -	&uart1_clk, -	&uart1_pclk, -#endif -	/* SLOW bridge clocks */ -	&slow_clk, -	&wdog_clk, -	&uart0_clk, -	&uart0_pclk, -	&app_timer_clk, -	&keypad_clk, -	&gpio_clk, -	&rtc_clk, -	&bustr_clk, -	&evhist_clk, -	&timer_clk, -#ifdef CONFIG_MACH_U300_BS335 -	&ppm_clk, -#endif -}; - -static int u300_clocks_show(struct seq_file *s, void *data) -{ -	struct clk *clk; -	int i; - -	seq_printf(s, "CLOCK           DEVICE          RESET STATE\t" \ -		   "ACTIVE\tUSERS\tHW CTRL FREQ\n"); -	seq_printf(s, "---------------------------------------------" \ -		   "-----------------------------------------\n"); -	for (i = 0; i < ARRAY_SIZE(clks); i++) { -		clk = clks[i]; -		if (clk != ERR_PTR(-ENOENT)) { -			/* Format clock and device name nicely */ -			char cdp[33]; -			int chars; - -			chars = snprintf(&cdp[0], 17, "%s", clk->name); -			while (chars < 16) { -				cdp[chars] = ' '; -				chars++; -			} -			chars = snprintf(&cdp[16], 17, "%s", clk->dev ? -					 dev_name(clk->dev) : "N/A"); -			while (chars < 16) { -				cdp[chars+16] = ' '; -				chars++; -			} -			cdp[32] = '\0'; -			if (clk->get_rate || clk->rate != 0) -				seq_printf(s, -					   "%s%s\t%s\t%d\t%s\t%lu Hz\n", -					   &cdp[0], -					   clk->reset ? -					   "ASSERTED" : "RELEASED", -					   clk->usecount ? "ON" : "OFF", -					   clk->usecount, -					   clk->hw_ctrld  ? "YES" : "NO ", -					   clk_get_rate(clk)); -			else -				seq_printf(s, -					   "%s%s\t%s\t%d\t%s\t" \ -					   "(unknown rate)\n", -					   &cdp[0], -					   clk->reset ? -					   "ASSERTED" : "RELEASED", -					   clk->usecount ? "ON" : "OFF", -					   clk->usecount, -					   clk->hw_ctrld  ? "YES" : "NO "); -		} -	} -	return 0; -} - -static int u300_clocks_open(struct inode *inode, struct file *file) -{ -	return single_open(file, u300_clocks_show, NULL); -} - -static const struct file_operations u300_clocks_operations = { -	.open		= u300_clocks_open, -	.read		= seq_read, -	.llseek		= seq_lseek, -	.release	= single_release, -}; - -static int __init init_clk_read_debugfs(void) -{ -	/* Expose a simple debugfs interface to view all clocks */ -	(void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO, -				   NULL, NULL, -				   &u300_clocks_operations); -	return 0; -} -/* - * This needs to come in after the core_initcall() for the - * overall clocks, because debugfs is not available until - * the subsystems come up. - */ -module_init(init_clk_read_debugfs); -#endif - -int __init u300_clock_init(void) -{ -	u16 val; - -	/* -	 * FIXME: shall all this powermanagement stuff really live here??? -	 */ - -	/* Set system to run at PLL208, max performance, a known state. */ -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	/* Wait for the PLL208 to lock if not locked in yet */ -	while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) & -		 U300_SYSCON_CSR_PLL208_LOCK_IND)); - -	/* Power management enable */ -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR); -	val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR); - -	clk_register(); - -	/* -	 * Some of these may be on when we boot the system so make sure they -	 * are turned OFF. -	 */ -	syscon_block_reset_enable(&timer_clk); -	timer_clk.disable(&timer_clk); - -	/* -	 * These shall be turned on by default when we boot the system -	 * so make sure they are ON. (Adding CPU here is a bit too much.) -	 * These clocks will be claimed by drivers later. -	 */ -	syscon_block_reset_disable(&semi_clk); -	syscon_block_reset_disable(&emif_clk); -	clk_enable(&semi_clk); -	clk_enable(&emif_clk); - -	return 0; -} diff --git a/arch/arm/mach-u300/clock.h b/arch/arm/mach-u300/clock.h deleted file mode 100644 index 4f50ca8f901..00000000000 --- a/arch/arm/mach-u300/clock.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * arch/arm/mach-u300/include/mach/clock.h - * - * Copyright (C) 2004 - 2005 Nokia corporation - * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> - * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc - * Copyright (C) 2007-2009 ST-Ericsson AB - * Adopted to ST-Ericsson U300 platforms by - * Jonas Aaberg <jonas.aberg@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. - * - */ - -#ifndef __MACH_CLOCK_H -#define __MACH_CLOCK_H - -#include <linux/clk.h> - -struct clk { -	struct list_head node; -	struct module *owner; -	struct device *dev; -	const char *name; -	struct clk *parent; - -	spinlock_t lock; -	unsigned long rate; -	bool reset; -	__u16 clk_val; -	__s8 usecount; -	void __iomem * res_reg; -	__u16 res_mask; - -	bool hw_ctrld; - -	void (*recalc) (struct clk *); -	int (*set_rate) (struct clk *, unsigned long); -	unsigned long (*get_rate) (struct clk *); -	unsigned long (*round_rate) (struct clk *, unsigned long); -	void (*init) (struct clk *); -	void (*enable) (struct clk *); -	void (*disable) (struct clk *); -}; - -int u300_clock_init(void); - -#endif diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index 33339745d43..03acf1883ec 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c @@ -30,6 +30,7 @@  #include <linux/pinctrl/consumer.h>  #include <linux/pinctrl/pinconf-generic.h>  #include <linux/dma-mapping.h> +#include <linux/platform_data/clk-u300.h>  #include <asm/types.h>  #include <asm/setup.h> @@ -44,7 +45,6 @@  #include <mach/dma_channels.h>  #include <mach/gpio-u300.h> -#include "clock.h"  #include "spi.h"  #include "i2c.h"  #include "u300-gpio.h" @@ -1658,12 +1658,20 @@ void __init u300_init_irq(void)  	int i;  	/* initialize clocking early, we want to clock the INTCON */ -	u300_clock_init(); +	u300_clk_init(U300_SYSCON_VBASE); + +	/* Bootstrap EMIF and SEMI clocks */ +	clk = clk_get_sys("pl172", NULL); +	BUG_ON(IS_ERR(clk)); +	clk_prepare_enable(clk); +	clk = clk_get_sys("semi", NULL); +	BUG_ON(IS_ERR(clk)); +	clk_prepare_enable(clk);  	/* Clock the interrupt controller */  	clk = clk_get_sys("intcon", NULL);  	BUG_ON(IS_ERR(clk)); -	clk_enable(clk); +	clk_prepare_enable(clk);  	for (i = 0; i < U300_VIC_IRQS_END; i++)  		set_bit(i, (unsigned long *) &mask[0]); @@ -1811,13 +1819,6 @@ void __init u300_init_devices(void)  	/* Check what platform we run and print some status information */  	u300_init_check_chip(); -	/* Set system to run at PLL208, max performance, a known state. */ -	val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); -	val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; -	writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); -	/* Wait for the PLL208 to lock if not locked in yet */ -	while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) & -		 U300_SYSCON_CSR_PLL208_LOCK_IND));  	/* Initialize SPI device with some board specifics */  	u300_spi_init(&pl022_device); diff --git a/arch/arm/mach-u300/timer.c b/arch/arm/mach-u300/timer.c index bc1c7897e82..56ac06d38ec 100644 --- a/arch/arm/mach-u300/timer.c +++ b/arch/arm/mach-u300/timer.c @@ -354,7 +354,7 @@ static void __init u300_timer_init(void)  	/* Clock the interrupt controller */  	clk = clk_get_sys("apptimer", NULL);  	BUG_ON(IS_ERR(clk)); -	clk_enable(clk); +	clk_prepare_enable(clk);  	rate = clk_get_rate(clk);  	setup_sched_clock(u300_read_sched_clock, 32, rate); diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 53d3d46dec1..c013bbf79ca 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig @@ -41,6 +41,7 @@ config MACH_HREFV60  config MACH_SNOWBALL  	bool "U8500 Snowball platform"  	select MACH_MOP500 +	select LEDS_GPIO  	help  	  Include support for the snowball development platform. diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 920251cf834..18ff781cfbe 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c @@ -80,7 +80,7 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {  };  #endif -static struct mmci_platform_data mop500_sdi0_data = { +struct mmci_platform_data mop500_sdi0_data = {  	.ios_handler	= mop500_sdi0_ios_handler,  	.ocr_mask	= MMC_VDD_29_30,  	.f_max		= 50000000, @@ -227,7 +227,7 @@ static struct stedma40_chan_cfg mop500_sdi4_dma_cfg_tx = {  };  #endif -static struct mmci_platform_data mop500_sdi4_data = { +struct mmci_platform_data mop500_sdi4_data = {  	.ocr_mask	= MMC_VDD_29_30,  	.f_max		= 50000000,  	.capabilities	= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA | diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 4fd93f5c49e..8674a890fd1 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -15,6 +15,7 @@  #include <linux/platform_device.h>  #include <linux/io.h>  #include <linux/i2c.h> +#include <linux/platform_data/i2c-nomadik.h>  #include <linux/gpio.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl022.h> @@ -25,6 +26,7 @@  #include <linux/mfd/tc3589x.h>  #include <linux/mfd/tps6105x.h>  #include <linux/mfd/abx500/ab8500-gpio.h> +#include <linux/mfd/abx500/ab8500-codec.h>  #include <linux/leds-lp5521.h>  #include <linux/input.h>  #include <linux/smsc911x.h> @@ -39,7 +41,6 @@  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> -#include <plat/i2c.h>  #include <plat/ste_dma40.h>  #include <plat/gpio-nomadik.h> @@ -58,7 +59,7 @@  static struct gpio_led snowball_led_array[] = {  	{  		.name = "user_led", -		.default_trigger = "none", +		.default_trigger = "heartbeat",  		.gpio = 142,  	},  }; @@ -97,6 +98,18 @@ static struct ab8500_gpio_platform_data ab8500_gpio_pdata = {  					0x7A, 0x00, 0x00},  }; +/* ab8500-codec */ +static struct ab8500_codec_platform_data ab8500_codec_pdata = { +	.amics =  { +		.mic1_type = AMIC_TYPE_DIFFERENTIAL, +		.mic2_type = AMIC_TYPE_DIFFERENTIAL, +		.mic1a_micbias = AMIC_MICBIAS_VAMIC1, +		.mic1b_micbias = AMIC_MICBIAS_VAMIC1, +		.mic2_micbias = AMIC_MICBIAS_VAMIC2 +	}, +	.ear_cmv = EAR_CMV_0_95V +}; +  static struct gpio_keys_button snowball_key_array[] = {  	{  		.gpio           = 32, @@ -195,24 +208,7 @@ static struct ab8500_platform_data ab8500_platdata = {  	.regulator	= ab8500_regulators,  	.num_regulator	= ARRAY_SIZE(ab8500_regulators),  	.gpio		= &ab8500_gpio_pdata, -}; - -static struct resource ab8500_resources[] = { -	[0] = { -		.start	= IRQ_DB8500_AB8500, -		.end	= IRQ_DB8500_AB8500, -		.flags	= IORESOURCE_IRQ -	} -}; - -struct platform_device ab8500_device = { -	.name = "ab8500-core", -	.id = 0, -	.dev = { -		.platform_data = &ab8500_platdata, -	}, -	.num_resources = 1, -	.resource = ab8500_resources, +	.codec		= &ab8500_codec_pdata,  };  /* @@ -331,43 +327,12 @@ static struct i2c_board_info __initdata mop500_i2c2_devices[] = {  	},  }; -#define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, t_out, _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,		\ -	/* Slave response timeout(ms) */\ -	.timeout	= t_out,	\ -	.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 8 and standard - * mode of operation - */ -U8500_I2C_CONTROLLER(0, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); -U8500_I2C_CONTROLLER(1, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); -U8500_I2C_CONTROLLER(2,	0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); -U8500_I2C_CONTROLLER(3,	0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); -  static void __init mop500_i2c_init(struct device *parent)  { -	db8500_add_i2c0(parent, &u8500_i2c0_data); -	db8500_add_i2c1(parent, &u8500_i2c1_data); -	db8500_add_i2c2(parent, &u8500_i2c2_data); -	db8500_add_i2c3(parent, &u8500_i2c3_data); +	db8500_add_i2c0(parent, NULL); +	db8500_add_i2c1(parent, NULL); +	db8500_add_i2c2(parent, NULL); +	db8500_add_i2c3(parent, NULL);  }  static struct gpio_keys_button mop500_gpio_keys[] = { @@ -460,7 +425,6 @@ static struct hash_platform_data u8500_hash1_platform_data = {  /* add any platform devices here - TODO */  static struct platform_device *mop500_platform_devs[] __initdata = {  	&mop500_gpio_keys_device, -	&ab8500_device,  };  #ifdef CONFIG_STE_DMA40 @@ -622,7 +586,6 @@ static struct platform_device *snowball_platform_devs[] __initdata = {  	&snowball_led_dev,  	&snowball_key_dev,  	&snowball_sbnet_dev, -	&ab8500_device,  };  static void __init mop500_init_machine(void) @@ -634,9 +597,8 @@ static void __init mop500_init_machine(void)  	mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;  	mop500_pinmaps_init(); -	parent = u8500_init_devices(); +	parent = u8500_init_devices(&ab8500_platdata); -	/* FIXME: parent of ab8500 should be prcmu */  	for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)  		mop500_platform_devs[i]->dev.parent = parent; @@ -669,7 +631,7 @@ static void __init snowball_init_machine(void)  	int i;  	snowball_pinmaps_init(); -	parent = u8500_init_devices(); +	parent = u8500_init_devices(&ab8500_platdata);  	for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)  		snowball_platform_devs[i]->dev.parent = parent; @@ -701,7 +663,7 @@ static void __init hrefv60_init_machine(void)  	mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;  	hrefv60_pinmaps_init(); -	parent = u8500_init_devices(); +	parent = u8500_init_devices(&ab8500_platdata);  	for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)  		mop500_platform_devs[i]->dev.parent = parent; @@ -776,6 +738,8 @@ struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {  	OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat),  	/* Requires DMA bindings. */  	OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0",  &ssp0_plat), +	OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0",  &mop500_sdi0_data), +	OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4",  &mop500_sdi4_data),  	/* Requires clock name bindings. */  	OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL),  	OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL), @@ -786,6 +750,11 @@ struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {  	OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL),  	OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL),  	OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL), +	OF_DEV_AUXDATA("st,nomadik-i2c", 0x80004000, "nmk-i2c.0", NULL), +	OF_DEV_AUXDATA("st,nomadik-i2c", 0x80122000, "nmk-i2c.1", NULL), +	OF_DEV_AUXDATA("st,nomadik-i2c", 0x80128000, "nmk-i2c.2", NULL), +	OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL), +	OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),  	/* Requires device name bindings. */  	OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL),  	{}, @@ -795,9 +764,6 @@ static const struct of_device_id u8500_local_bus_nodes[] = {  	/* only create devices below soc node */  	{ .compatible = "stericsson,db8500", },  	{ .compatible = "stericsson,db8500-prcmu", }, -	{ .compatible = "stericsson,db8500-prcmu-regulator", }, -	{ .compatible = "stericsson,ab8500", }, -	{ .compatible = "stericsson,ab8500-regulator", },  	{ .compatible = "simple-bus"},  	{ },  }; @@ -820,8 +786,6 @@ static void __init u8500_init_machine(void)  	for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)  		mop500_platform_devs[i]->dev.parent = parent; -	for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++) -		snowball_platform_devs[i]->dev.parent = parent;  	/* automatically probe child nodes of db8500 device */  	of_platform_populate(NULL, u8500_local_bus_nodes, u8500_auxdata_lookup, parent); @@ -840,18 +804,6 @@ static void __init u8500_init_machine(void)  		mop500_uib_init(); -	} else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { -		/* -		 * Devices to be DT:ed: -		 *   snowball_led_dev   = todo -		 *   snowball_key_dev   = todo -		 *   snowball_sbnet_dev = done -		 *   ab8500_device      = done -		 */ -		platform_add_devices(snowball_of_platform_devs, -				ARRAY_SIZE(snowball_of_platform_devs)); - -		snowball_sdi_init(parent);  	} else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {  		/*  		 * The HREFv60 board removed a GPIO expander and routed @@ -873,7 +825,6 @@ static void __init u8500_init_machine(void)  		mop500_uib_init();  	} -	mop500_i2c_init(parent);  	/* This board has full regulator constraints */  	regulator_has_full_constraints(); diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h index 2f87b25a908..b5bfc1a78b1 100644 --- a/arch/arm/mach-ux500/board-mop500.h +++ b/arch/arm/mach-ux500/board-mop500.h @@ -9,6 +9,7 @@  /* For NOMADIK_NR_GPIO */  #include <mach/irqs.h> +#include <linux/amba/mmci.h>  /* Snowball specific GPIO assignments, this board has no GPIO expander */  #define SNOWBALL_ACCEL_INT1_GPIO	163 @@ -78,6 +79,8 @@  struct device;  struct i2c_board_info; +extern struct mmci_platform_data mop500_sdi0_data; +extern struct mmci_platform_data mop500_sdi4_data;  extern void mop500_sdi_init(struct device *parent);  extern void snowball_sdi_init(struct device *parent); diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 33275eb4c68..db3c52d56ca 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -16,6 +16,7 @@  #include <linux/irq.h>  #include <linux/platform_device.h>  #include <linux/io.h> +#include <linux/mfd/abx500/ab8500.h>  #include <asm/mach/map.h>  #include <asm/pmu.h> @@ -115,7 +116,7 @@ static irqreturn_t db8500_pmu_handler(int irq, void *dev, irq_handler_t handler)  	return ret;  } -static struct arm_pmu_platdata db8500_pmu_platdata = { +struct arm_pmu_platdata db8500_pmu_platdata = {  	.handle_irq		= db8500_pmu_handler,  }; @@ -139,7 +140,6 @@ static struct platform_device *platform_devs[] __initdata = {  static struct platform_device *of_platform_devs[] __initdata = {  	&u8500_dma40_device, -	&db8500_pmu_device,  };  static resource_size_t __initdata db8500_gpio_base[] = { @@ -207,7 +207,7 @@ static struct device * __init db8500_soc_device_init(void)  /*   * This function is called from the board init   */ -struct device * __init u8500_init_devices(void) +struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500)  {  	struct device *parent;  	int i; @@ -224,6 +224,8 @@ struct device * __init u8500_init_devices(void)  	for (i = 0; i < ARRAY_SIZE(platform_devs); i++)  		platform_devs[i]->dev.parent = parent; +	db8500_prcmu_device.dev.platform_data = ab8500; +  	platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));  	return parent; @@ -237,7 +239,6 @@ struct device * __init u8500_of_init_devices(void)  	parent = db8500_soc_device_init(); -	db8500_add_rtc(parent);  	db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg);  	platform_device_register_data(parent, @@ -249,7 +250,7 @@ struct device * __init u8500_of_init_devices(void)  	/*  	 * Devices to be DT:ed:  	 *   u8500_dma40_device  = todo -	 *   db8500_pmu_device   = todo +	 *   db8500_pmu_device   = done  	 *   db8500_prcmu_device = done  	 */  	platform_add_devices(of_platform_devs, ARRAY_SIZE(of_platform_devs)); diff --git a/arch/arm/mach-ux500/devices-common.h b/arch/arm/mach-ux500/devices-common.h index 6e470656026..ecdd8386cff 100644 --- a/arch/arm/mach-ux500/devices-common.h +++ b/arch/arm/mach-ux500/devices-common.h @@ -12,7 +12,7 @@  #include <linux/dma-mapping.h>  #include <linux/sys_soc.h>  #include <linux/amba/bus.h> -#include <plat/i2c.h> +#include <linux/platform_data/i2c-nomadik.h>  #include <mach/crypto-ux500.h>  struct spi_master_cntlr; @@ -56,27 +56,15 @@ dbx500_add_uart(struct device *parent, const char *name, resource_size_t base,  struct nmk_i2c_controller; -static inline struct platform_device * +static inline struct amba_device *  dbx500_add_i2c(struct device *parent, int id, resource_size_t base, int irq,  	       struct nmk_i2c_controller *data)  { -	struct resource res[] = { -		DEFINE_RES_MEM(base, SZ_4K), -		DEFINE_RES_IRQ(irq), -	}; +	/* Conjure a name similar to what the platform device used to have */ +	char name[16]; -	struct platform_device_info pdevinfo = { -		.parent = parent, -		.name = "nmk-i2c", -		.id = id, -		.res = res, -		.num_res = ARRAY_SIZE(res), -		.data = data, -		.size_data = sizeof(*data), -		.dma_mask = DMA_BIT_MASK(32), -	}; - -	return platform_device_register_full(&pdevinfo); +	snprintf(name, sizeof(name), "nmk-i2c.%d", id); +	return amba_apb_device_add(parent, name, base, SZ_4K, irq, 0, data, 0);  }  static inline struct amba_device * diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h index 8b7ed82a286..7914e5eaa9c 100644 --- a/arch/arm/mach-ux500/include/mach/setup.h +++ b/arch/arm/mach-ux500/include/mach/setup.h @@ -13,11 +13,12 @@  #include <asm/mach/time.h>  #include <linux/init.h> +#include <linux/mfd/abx500/ab8500.h>  void __init ux500_map_io(void);  extern void __init u8500_map_io(void); -extern struct device * __init u8500_init_devices(void); +extern struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500);  extern void __init ux500_init_irq(void);  extern void __init ux500_init_late(void); diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index cf8730d35e7..fc3730f0165 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig @@ -2,7 +2,8 @@ menu "Versatile Express platform type"  	depends on ARCH_VEXPRESS  config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA -	bool +	bool "Enable A5 and A9 only errata work-arounds" +	default y  	select ARM_ERRATA_720789  	select ARM_ERRATA_751472  	select PL310_ERRATA_753970 if CACHE_PL310 @@ -14,7 +15,6 @@ config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA  config ARCH_VEXPRESS_CA9X4  	bool "Versatile Express Cortex-A9x4 tile" -	select ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA  	select ARM_GIC  	select CPU_V7  	select HAVE_SMP @@ -22,7 +22,6 @@ config ARCH_VEXPRESS_CA9X4  config ARCH_VEXPRESS_DT  	bool "Device Tree support for Versatile Express platforms" -	select ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA  	select ARM_GIC  	select ARM_PATCH_PHYS_VIRT  	select AUTO_ZRELADDR diff --git a/arch/arm/mach-vexpress/Makefile.boot b/arch/arm/mach-vexpress/Makefile.boot index 909f85ebf5f..318d308dfb9 100644 --- a/arch/arm/mach-vexpress/Makefile.boot +++ b/arch/arm/mach-vexpress/Makefile.boot @@ -6,4 +6,5 @@ initrd_phys-y	:= 0x60800000  dtb-$(CONFIG_ARCH_VEXPRESS_DT)	+= vexpress-v2p-ca5s.dtb \  				   vexpress-v2p-ca9.dtb \ -				   vexpress-v2p-ca15-tc1.dtb +				   vexpress-v2p-ca15-tc1.dtb \ +				   vexpress-v2p-ca15_a7.dtb diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index c65cc3b462a..61c492403b0 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c @@ -66,8 +66,15 @@ static void __init ct_ca9x4_init_irq(void)  static void ct_ca9x4_clcd_enable(struct clcd_fb *fb)  { -	v2m_cfg_write(SYS_CFG_MUXFPGA | SYS_CFG_SITE_DB1, 0); -	v2m_cfg_write(SYS_CFG_DVIMODE | SYS_CFG_SITE_DB1, 2); +	u32 site = v2m_get_master_site(); + +	/* +	 * Old firmware was using the "site" component of the command +	 * to control the DVI muxer (while it should be always 0 ie. MB). +	 * Newer firmware uses the data register. Keep both for compatibility. +	 */ +	v2m_cfg_write(SYS_CFG_MUXFPGA | SYS_CFG_SITE(site), site); +	v2m_cfg_write(SYS_CFG_DVIMODE | SYS_CFG_SITE(SYS_CFG_SITE_MB), 2);  }  static int ct_ca9x4_clcd_setup(struct clcd_fb *fb) @@ -105,43 +112,11 @@ static struct amba_device *ct_ca9x4_amba_devs[] __initdata = {  }; -static long ct_round(struct clk *clk, unsigned long rate) -{ -	return rate; -} - -static int ct_set(struct clk *clk, unsigned long rate) -{ -	return v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE_DB1 | 1, rate); -} - -static const struct clk_ops osc1_clk_ops = { -	.round	= ct_round, -	.set	= ct_set, -}; - -static struct clk osc1_clk = { -	.ops	= &osc1_clk_ops, -	.rate	= 24000000, -}; - -static struct clk ct_sp804_clk = { -	.rate	= 1000000, -}; - -static struct clk_lookup lookups[] = { -	{	/* CLCD */ -		.dev_id		= "ct:clcd", -		.clk		= &osc1_clk, -	}, {	/* SP804 timers */ -		.dev_id		= "sp804", -		.con_id		= "ct-timer0", -		.clk		= &ct_sp804_clk, -	}, {	/* SP804 timers */ -		.dev_id		= "sp804", -		.con_id		= "ct-timer1", -		.clk		= &ct_sp804_clk, -	}, +static struct v2m_osc ct_osc1 = { +	.osc = 1, +	.rate_min = 10000000, +	.rate_max = 80000000, +	.rate_default = 23750000,  };  static struct resource pmu_resources[] = { @@ -174,14 +149,10 @@ static struct platform_device pmu_device = {  	.resource	= pmu_resources,  }; -static void __init ct_ca9x4_init_early(void) -{ -	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); -} -  static void __init ct_ca9x4_init(void)  {  	int i; +	struct clk *clk;  #ifdef CONFIG_CACHE_L2X0  	void __iomem *l2x0_base = ioremap(CT_CA9X4_L2CC, SZ_4K); @@ -193,6 +164,10 @@ static void __init ct_ca9x4_init(void)  	l2x0_init(l2x0_base, 0x00400000, 0xfe0fffff);  #endif +	ct_osc1.site = v2m_get_master_site(); +	clk = v2m_osc_register("ct:osc1", &ct_osc1); +	clk_register_clkdev(clk, NULL, "ct:clcd"); +  	for (i = 0; i < ARRAY_SIZE(ct_ca9x4_amba_devs); i++)  		amba_device_register(ct_ca9x4_amba_devs[i], &iomem_resource); @@ -234,7 +209,6 @@ struct ct_desc ct_ca9x4_desc __initdata = {  	.id		= V2M_CT_ID_CA9,  	.name		= "CA9x4",  	.map_io		= ct_ca9x4_map_io, -	.init_early	= ct_ca9x4_init_early,  	.init_irq	= ct_ca9x4_init_irq,  	.init_tile	= ct_ca9x4_init,  #ifdef CONFIG_SMP diff --git a/arch/arm/mach-vexpress/include/mach/clkdev.h b/arch/arm/mach-vexpress/include/mach/clkdev.h deleted file mode 100644 index 3f8307d73ca..00000000000 --- a/arch/arm/mach-vexpress/include/mach/clkdev.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __ASM_MACH_CLKDEV_H -#define __ASM_MACH_CLKDEV_H - -#include <plat/clock.h> - -struct clk { -	const struct clk_ops	*ops; -	unsigned long		rate; -	const struct icst_params *params; -}; - -#define __clk_get(clk) ({ 1; }) -#define __clk_put(clk) do { } while (0) - -#endif diff --git a/arch/arm/mach-vexpress/include/mach/debug-macro.S b/arch/arm/mach-vexpress/include/mach/debug-macro.S index fa8224794e0..9f509f55d07 100644 --- a/arch/arm/mach-vexpress/include/mach/debug-macro.S +++ b/arch/arm/mach-vexpress/include/mach/debug-macro.S @@ -18,6 +18,8 @@  #define DEBUG_LL_VIRT_BASE		0xf8000000 +#if defined(CONFIG_DEBUG_VEXPRESS_UART0_DETECT) +  		.macro	addruart,rp,rv,tmp  		@ Make an educated guess regarding the memory map: @@ -41,3 +43,42 @@  		.endm  #include <asm/hardware/debug-pl01x.S> + +#elif defined(CONFIG_DEBUG_VEXPRESS_UART0_CA9) + +		.macro	addruart,rp,rv,tmp +		mov	\rp, #DEBUG_LL_UART_OFFSET +		orr	\rv, \rp, #DEBUG_LL_VIRT_BASE +		orr	\rp, \rp, #DEBUG_LL_PHYS_BASE +		.endm + +#include <asm/hardware/debug-pl01x.S> + +#elif defined(CONFIG_DEBUG_VEXPRESS_UART0_RS1) + +		.macro	addruart,rp,rv,tmp +		mov	\rp, #DEBUG_LL_UART_OFFSET_RS1 +		orr	\rv, \rp, #DEBUG_LL_VIRT_BASE +		orr	\rp, \rp, #DEBUG_LL_PHYS_BASE_RS1 +		.endm + +#include <asm/hardware/debug-pl01x.S> + +#else /* CONFIG_DEBUG_LL_UART_NONE */ + +		.macro	addruart, rp, rv, tmp +		/* Safe dummy values */ +		mov	\rp, #0 +		mov	\rv, #DEBUG_LL_VIRT_BASE +		.endm + +		.macro	senduart,rd,rx +		.endm + +		.macro	waituart,rd,rx +		.endm + +		.macro	busyuart,rd,rx +		.endm + +#endif diff --git a/arch/arm/mach-vexpress/include/mach/motherboard.h b/arch/arm/mach-vexpress/include/mach/motherboard.h index 31a92890893..1e388c7bf4d 100644 --- a/arch/arm/mach-vexpress/include/mach/motherboard.h +++ b/arch/arm/mach-vexpress/include/mach/motherboard.h @@ -1,6 +1,8 @@  #ifndef __MACH_MOTHERBOARD_H  #define __MACH_MOTHERBOARD_H +#include <linux/clk-provider.h> +  /*   * Physical addresses, offset from V2M_PA_CS0-3   */ @@ -104,9 +106,10 @@  #define SYS_CFG_REBOOT		(9 << 20)  #define SYS_CFG_DVIMODE		(11 << 20)  #define SYS_CFG_POWER		(12 << 20) -#define SYS_CFG_SITE_MB		(0 << 16) -#define SYS_CFG_SITE_DB1	(1 << 16) -#define SYS_CFG_SITE_DB2	(2 << 16) +#define SYS_CFG_SITE(n)		((n) << 16) +#define SYS_CFG_SITE_MB		0 +#define SYS_CFG_SITE_DB1	1 +#define SYS_CFG_SITE_DB2	2  #define SYS_CFG_STACK(n)	((n) << 12)  #define SYS_CFG_ERR		(1 << 1) @@ -122,6 +125,8 @@ void v2m_flags_set(u32 data);  #define SYS_MISC_MASTERSITE	(1 << 14)  #define SYS_PROCIDx_HBI_MASK	0xfff +int v2m_get_master_site(void); +  /*   * Core tile IDs   */ @@ -144,4 +149,21 @@ struct ct_desc {  extern struct ct_desc *ct_desc; +/* + * OSC clock provider + */ +struct v2m_osc { +	struct clk_hw hw; +	u8 site; /* 0 = motherboard, 1 = site 1, 2 = site 2 */ +	u8 stack; /* board stack position */ +	u16 osc; +	unsigned long rate_min; +	unsigned long rate_max; +	unsigned long rate_default; +}; + +#define to_v2m_osc(osc) container_of(osc, struct v2m_osc, hw) + +struct clk *v2m_osc_register(const char *name, struct v2m_osc *osc); +  #endif diff --git a/arch/arm/mach-vexpress/include/mach/uncompress.h b/arch/arm/mach-vexpress/include/mach/uncompress.h index 7dab5596b86..1e472eb0bbd 100644 --- a/arch/arm/mach-vexpress/include/mach/uncompress.h +++ b/arch/arm/mach-vexpress/include/mach/uncompress.h @@ -27,6 +27,7 @@  static unsigned long get_uart_base(void)  { +#if defined(CONFIG_DEBUG_VEXPRESS_UART0_DETECT)  	unsigned long mpcore_periph;  	/* @@ -42,6 +43,13 @@ static unsigned long get_uart_base(void)  		return UART_BASE;  	else  		return UART_BASE_RS1; +#elif defined(CONFIG_DEBUG_VEXPRESS_UART0_CA9) +	return UART_BASE; +#elif defined(CONFIG_DEBUG_VEXPRESS_UART0_RS1) +	return UART_BASE_RS1; +#else +	return 0; +#endif  }  /* @@ -51,6 +59,9 @@ static inline void putc(int c)  {  	unsigned long base = get_uart_base(); +	if (!base) +		return; +  	while (AMBA_UART_FR(base) & (1 << 5))  		barrier(); @@ -61,6 +72,9 @@ static inline void flush(void)  {  	unsigned long base = get_uart_base(); +	if (!base) +		return; +  	while (AMBA_UART_FR(base) & (1 << 3))  		barrier();  } diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index fde26adaef3..37608f22ee3 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -16,7 +16,10 @@  #include <linux/spinlock.h>  #include <linux/usb/isp1760.h>  #include <linux/clkdev.h> +#include <linux/clk-provider.h>  #include <linux/mtd/physmap.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <asm/arch_timer.h>  #include <asm/mach-types.h> @@ -81,16 +84,6 @@ static void __init v2m_sp804_init(void __iomem *base, unsigned int irq)  	sp804_clockevents_init(base + TIMER_1_BASE, irq, "v2m-timer0");  } -static void __init v2m_timer_init(void) -{ -	v2m_sysctl_init(ioremap(V2M_SYSCTL, SZ_4K)); -	v2m_sp804_init(ioremap(V2M_TIMER01, SZ_4K), IRQ_V2M_TIMER0); -} - -static struct sys_timer v2m_timer = { -	.init	= v2m_timer_init, -}; -  static DEFINE_SPINLOCK(v2m_cfg_lock); @@ -147,6 +140,13 @@ void __init v2m_flags_set(u32 data)  	writel(data, v2m_sysreg_base + V2M_SYS_FLAGSSET);  } +int v2m_get_master_site(void) +{ +	u32 misc = readl(v2m_sysreg_base + V2M_SYS_MISC); + +	return misc & SYS_MISC_MASTERSITE ? SYS_CFG_SITE_DB2 : SYS_CFG_SITE_DB1; +} +  static struct resource v2m_pcie_i2c_resource = {  	.start	= V2M_SERIAL_BUS_PCI, @@ -201,6 +201,11 @@ static struct platform_device v2m_eth_device = {  	.dev.platform_data = &v2m_eth_config,  }; +static struct regulator_consumer_supply v2m_eth_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  static struct resource v2m_usb_resources[] = {  	{  		.start	= V2M_ISP1761, @@ -319,98 +324,145 @@ static struct amba_device *v2m_amba_devs[] __initdata = {  }; -static long v2m_osc_round(struct clk *clk, unsigned long rate) +static unsigned long v2m_osc_recalc_rate(struct clk_hw *hw, +		unsigned long parent_rate)  { +	struct v2m_osc *osc = to_v2m_osc(hw); + +	return !parent_rate ? osc->rate_default : parent_rate; +} + +static long v2m_osc_round_rate(struct clk_hw *hw, unsigned long rate, +		unsigned long *parent_rate) +{ +	struct v2m_osc *osc = to_v2m_osc(hw); + +	if (WARN_ON(rate < osc->rate_min)) +		rate = osc->rate_min; + +	if (WARN_ON(rate > osc->rate_max)) +		rate = osc->rate_max; +  	return rate;  } -static int v2m_osc1_set(struct clk *clk, unsigned long rate) +static int v2m_osc_set_rate(struct clk_hw *hw, unsigned long rate, +		unsigned long parent_rate)  { -	return v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE_MB | 1, rate); +	struct v2m_osc *osc = to_v2m_osc(hw); + +	v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE(osc->site) | +			SYS_CFG_STACK(osc->stack) | osc->osc, rate); + +	return 0;  } -static const struct clk_ops osc1_clk_ops = { -	.round	= v2m_osc_round, -	.set	= v2m_osc1_set, +static struct clk_ops v2m_osc_ops = { +	.recalc_rate = v2m_osc_recalc_rate, +	.round_rate = v2m_osc_round_rate, +	.set_rate = v2m_osc_set_rate,  }; -static struct clk osc1_clk = { -	.ops	= &osc1_clk_ops, -	.rate	= 24000000, +struct clk * __init v2m_osc_register(const char *name, struct v2m_osc *osc) +{ +	struct clk_init_data init; + +	WARN_ON(osc->site > 2); +	WARN_ON(osc->stack > 15); +	WARN_ON(osc->osc > 4095); + +	init.name = name; +	init.ops = &v2m_osc_ops; +	init.flags = CLK_IS_ROOT; +	init.num_parents = 0; + +	osc->hw.init = &init; + +	return clk_register(NULL, &osc->hw); +} + +static struct v2m_osc v2m_mb_osc1 = { +	.site = SYS_CFG_SITE_MB, +	.osc = 1, +	.rate_min = 23750000, +	.rate_max = 63500000, +	.rate_default = 23750000,  }; -static struct clk osc2_clk = { -	.rate	= 24000000, +static const char *v2m_ref_clk_periphs[] __initconst = { +	"mb:wdt",   "1000f000.wdt",  "1c0f0000.wdt",	/* SP805 WDT */  }; -static struct clk v2m_sp804_clk = { -	.rate	= 1000000, +static const char *v2m_osc1_periphs[] __initconst = { +	"mb:clcd",  "1001f000.clcd", "1c1f0000.clcd",	/* PL111 CLCD */  }; -static struct clk v2m_ref_clk = { -	.rate   = 32768, +static const char *v2m_osc2_periphs[] __initconst = { +	"mb:mmci",  "10005000.mmci", "1c050000.mmci",	/* PL180 MMCI */ +	"mb:kmi0",  "10006000.kmi",  "1c060000.kmi",	/* PL050 KMI0 */ +	"mb:kmi1",  "10007000.kmi",  "1c070000.kmi",	/* PL050 KMI1 */ +	"mb:uart0", "10009000.uart", "1c090000.uart",	/* PL011 UART0 */ +	"mb:uart1", "1000a000.uart", "1c0a0000.uart",	/* PL011 UART1 */ +	"mb:uart2", "1000b000.uart", "1c0b0000.uart",	/* PL011 UART2 */ +	"mb:uart3", "1000c000.uart", "1c0c0000.uart",	/* PL011 UART3 */  }; -static struct clk dummy_apb_pclk; +static void __init v2m_clk_init(void) +{ +	struct clk *clk; +	int i; -static struct clk_lookup v2m_lookups[] = { -	{	/* AMBA bus clock */ -		.con_id		= "apb_pclk", -		.clk		= &dummy_apb_pclk, -	}, {	/* UART0 */ -		.dev_id		= "mb:uart0", -		.clk		= &osc2_clk, -	}, {	/* UART1 */ -		.dev_id		= "mb:uart1", -		.clk		= &osc2_clk, -	}, {	/* UART2 */ -		.dev_id		= "mb:uart2", -		.clk		= &osc2_clk, -	}, {	/* UART3 */ -		.dev_id		= "mb:uart3", -		.clk		= &osc2_clk, -	}, {	/* KMI0 */ -		.dev_id		= "mb:kmi0", -		.clk		= &osc2_clk, -	}, {	/* KMI1 */ -		.dev_id		= "mb:kmi1", -		.clk		= &osc2_clk, -	}, {	/* MMC0 */ -		.dev_id		= "mb:mmci", -		.clk		= &osc2_clk, -	}, {	/* CLCD */ -		.dev_id		= "mb:clcd", -		.clk		= &osc1_clk, -	}, {	/* SP805 WDT */ -		.dev_id		= "mb:wdt", -		.clk		= &v2m_ref_clk, -	}, {	/* SP804 timers */ -		.dev_id		= "sp804", -		.con_id		= "v2m-timer0", -		.clk		= &v2m_sp804_clk, -	}, {	/* SP804 timers */ -		.dev_id		= "sp804", -		.con_id		= "v2m-timer1", -		.clk		= &v2m_sp804_clk, -	}, +	clk = clk_register_fixed_rate(NULL, "dummy_apb_pclk", NULL, +			CLK_IS_ROOT, 0); +	WARN_ON(clk_register_clkdev(clk, "apb_pclk", NULL)); + +	clk = clk_register_fixed_rate(NULL, "mb:ref_clk", NULL, +			CLK_IS_ROOT, 32768); +	for (i = 0; i < ARRAY_SIZE(v2m_ref_clk_periphs); i++) +		WARN_ON(clk_register_clkdev(clk, NULL, v2m_ref_clk_periphs[i])); + +	clk = clk_register_fixed_rate(NULL, "mb:sp804_clk", NULL, +			CLK_IS_ROOT, 1000000); +	WARN_ON(clk_register_clkdev(clk, "v2m-timer0", "sp804")); +	WARN_ON(clk_register_clkdev(clk, "v2m-timer1", "sp804")); + +	clk = v2m_osc_register("mb:osc1", &v2m_mb_osc1); +	for (i = 0; i < ARRAY_SIZE(v2m_osc1_periphs); i++) +		WARN_ON(clk_register_clkdev(clk, NULL, v2m_osc1_periphs[i])); + +	clk = clk_register_fixed_rate(NULL, "mb:osc2", NULL, +			CLK_IS_ROOT, 24000000); +	for (i = 0; i < ARRAY_SIZE(v2m_osc2_periphs); i++) +		WARN_ON(clk_register_clkdev(clk, NULL, v2m_osc2_periphs[i])); +} + +static void __init v2m_timer_init(void) +{ +	v2m_sysctl_init(ioremap(V2M_SYSCTL, SZ_4K)); +	v2m_clk_init(); +	v2m_sp804_init(ioremap(V2M_TIMER01, SZ_4K), IRQ_V2M_TIMER0); +} + +static struct sys_timer v2m_timer = { +	.init	= v2m_timer_init,  };  static void __init v2m_init_early(void)  { -	ct_desc->init_early(); -	clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups)); +	if (ct_desc->init_early) +		ct_desc->init_early();  	versatile_sched_clock_init(v2m_sysreg_base + V2M_SYS_24MHZ, 24000000);  }  static void v2m_power_off(void)  { -	if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE_MB, 0)) +	if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE(SYS_CFG_SITE_MB), 0))  		printk(KERN_EMERG "Unable to shutdown\n");  }  static void v2m_restart(char str, const char *cmd)  { -	if (v2m_cfg_write(SYS_CFG_REBOOT | SYS_CFG_SITE_MB, 0)) +	if (v2m_cfg_write(SYS_CFG_REBOOT | SYS_CFG_SITE(SYS_CFG_SITE_MB), 0))  		printk(KERN_EMERG "Unable to reboot\n");  } @@ -458,6 +510,9 @@ static void __init v2m_init(void)  {  	int i; +	regulator_register_fixed(0, v2m_eth_supplies, +			ARRAY_SIZE(v2m_eth_supplies)); +  	platform_device_register(&v2m_pcie_i2c_device);  	platform_device_register(&v2m_ddc_i2c_device);  	platform_device_register(&v2m_flash_device); @@ -522,77 +577,6 @@ void __init v2m_dt_map_io(void)  #endif  } -static struct clk_lookup v2m_dt_lookups[] = { -	{	/* AMBA bus clock */ -		.con_id		= "apb_pclk", -		.clk		= &dummy_apb_pclk, -	}, {	/* SP804 timers */ -		.dev_id		= "sp804", -		.con_id		= "v2m-timer0", -		.clk		= &v2m_sp804_clk, -	}, {	/* SP804 timers */ -		.dev_id		= "sp804", -		.con_id		= "v2m-timer1", -		.clk		= &v2m_sp804_clk, -	}, {	/* PL180 MMCI */ -		.dev_id		= "mb:mmci", /* 10005000.mmci */ -		.clk		= &osc2_clk, -	}, {	/* PL050 KMI0 */ -		.dev_id		= "10006000.kmi", -		.clk		= &osc2_clk, -	}, {	/* PL050 KMI1 */ -		.dev_id		= "10007000.kmi", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART0 */ -		.dev_id		= "10009000.uart", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART1 */ -		.dev_id		= "1000a000.uart", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART2 */ -		.dev_id		= "1000b000.uart", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART3 */ -		.dev_id		= "1000c000.uart", -		.clk		= &osc2_clk, -	}, {	/* SP805 WDT */ -		.dev_id		= "1000f000.wdt", -		.clk		= &v2m_ref_clk, -	}, {	/* PL111 CLCD */ -		.dev_id		= "1001f000.clcd", -		.clk		= &osc1_clk, -	}, -	/* RS1 memory map */ -	{	/* PL180 MMCI */ -		.dev_id		= "mb:mmci", /* 1c050000.mmci */ -		.clk		= &osc2_clk, -	}, {	/* PL050 KMI0 */ -		.dev_id		= "1c060000.kmi", -		.clk		= &osc2_clk, -	}, {	/* PL050 KMI1 */ -		.dev_id		= "1c070000.kmi", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART0 */ -		.dev_id		= "1c090000.uart", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART1 */ -		.dev_id		= "1c0a0000.uart", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART2 */ -		.dev_id		= "1c0b0000.uart", -		.clk		= &osc2_clk, -	}, {	/* PL011 UART3 */ -		.dev_id		= "1c0c0000.uart", -		.clk		= &osc2_clk, -	}, {	/* SP805 WDT */ -		.dev_id		= "1c0f0000.wdt", -		.clk		= &v2m_ref_clk, -	}, {	/* PL111 CLCD */ -		.dev_id		= "1c1f0000.clcd", -		.clk		= &osc1_clk, -	}, -}; -  void __init v2m_dt_init_early(void)  {  	struct device_node *node; @@ -605,8 +589,8 @@ void __init v2m_dt_init_early(void)  	/* Confirm board type against DT property, if available */  	if (of_property_read_u32(allnodes, "arm,hbi", &dt_hbi) == 0) { -		u32 misc = readl(v2m_sysreg_base + V2M_SYS_MISC); -		u32 id = readl(v2m_sysreg_base + (misc & SYS_MISC_MASTERSITE ? +		int site = v2m_get_master_site(); +		u32 id = readl(v2m_sysreg_base + (site == SYS_CFG_SITE_DB2 ?  				V2M_SYS_PROCID1 : V2M_SYS_PROCID0));  		u32 hbi = id & SYS_PROCIDx_HBI_MASK; @@ -614,8 +598,6 @@ void __init v2m_dt_init_early(void)  			pr_warning("vexpress: DT HBI (%x) is not matching "  					"hardware (%x)!\n", dt_hbi, hbi);  	} - -	clkdev_add_table(v2m_dt_lookups, ARRAY_SIZE(v2m_dt_lookups));  }  static  struct of_device_id vexpress_irq_match[] __initdata = { @@ -637,6 +619,8 @@ static void __init v2m_dt_timer_init(void)  	node = of_find_compatible_node(NULL, NULL, "arm,sp810");  	v2m_sysctl_init(of_iomap(node, 0)); +	v2m_clk_init(); +  	err = of_property_read_string(of_aliases, "arm,v2m_timer", &path);  	if (WARN_ON(err))  		return; diff --git a/arch/arm/mach-vt8500/Makefile b/arch/arm/mach-vt8500/Makefile index 81aedb7c893..7ce51767c99 100644 --- a/arch/arm/mach-vt8500/Makefile +++ b/arch/arm/mach-vt8500/Makefile @@ -1,9 +1,7 @@ -obj-y += devices.o gpio.o irq.o timer.o +obj-y += devices.o gpio.o irq.o timer.o restart.o  obj-$(CONFIG_VTWM_VERSION_VT8500) += devices-vt8500.o  obj-$(CONFIG_VTWM_VERSION_WM8505) += devices-wm8505.o  obj-$(CONFIG_MACH_BV07) += bv07.o  obj-$(CONFIG_MACH_WM8505_7IN_NETBOOK) += wm8505_7in.o - -obj-$(CONFIG_HAVE_PWM) += pwm.o diff --git a/arch/arm/mach-vt8500/bv07.c b/arch/arm/mach-vt8500/bv07.c index a464c758441..f9fbeb2d10e 100644 --- a/arch/arm/mach-vt8500/bv07.c +++ b/arch/arm/mach-vt8500/bv07.c @@ -23,6 +23,7 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> +#include <mach/restart.h>  #include "devices.h" @@ -62,6 +63,7 @@ void __init bv07_init(void)  	else  		printk(KERN_ERR "PMC Hibernation register could not be remapped, not enabling power off!\n"); +	wmt_setup_restart();  	vt8500_set_resources();  	platform_add_devices(devices, ARRAY_SIZE(devices));  	vt8500_gpio_init(); @@ -69,6 +71,7 @@ void __init bv07_init(void)  MACHINE_START(BV07, "Benign BV07 Mini Netbook")  	.atag_offset	= 0x100, +	.restart	= wmt_restart,  	.reserve	= vt8500_reserve_mem,  	.map_io		= vt8500_map_io,  	.init_irq	= vt8500_init_irq, diff --git a/arch/arm/mach-vt8500/include/mach/restart.h b/arch/arm/mach-vt8500/include/mach/restart.h new file mode 100644 index 00000000000..89f9b787d2a --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/restart.h @@ -0,0 +1,17 @@ +/* linux/arch/arm/mach-vt8500/restart.h + * + * Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ + +void wmt_setup_restart(void); +void wmt_restart(char mode, const char *cmd); diff --git a/arch/arm/mach-vt8500/include/mach/system.h b/arch/arm/mach-vt8500/include/mach/system.h deleted file mode 100644 index 58fa8010ee6..00000000000 --- a/arch/arm/mach-vt8500/include/mach/system.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * arch/arm/mach-vt8500/include/mach/system.h - * - */ -#include <asm/io.h> - -/* PM Software Reset request register */ -#define VT8500_PMSR_VIRT	0xf8130060 - -static inline void arch_reset(char mode, const char *cmd) -{ -	writel(1, VT8500_PMSR_VIRT); -} diff --git a/arch/arm/mach-vt8500/pwm.c b/arch/arm/mach-vt8500/pwm.c deleted file mode 100644 index 8ad825e9359..00000000000 --- a/arch/arm/mach-vt8500/pwm.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * arch/arm/mach-vt8500/pwm.c - * - *  Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * 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. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/pwm.h> -#include <linux/delay.h> - -#include <asm/div64.h> - -#define VT8500_NR_PWMS 4 - -static DEFINE_MUTEX(pwm_lock); -static LIST_HEAD(pwm_list); - -struct pwm_device { -	struct list_head	node; -	struct platform_device	*pdev; - -	const char	*label; - -	void __iomem	*regbase; - -	unsigned int	use_count; -	unsigned int	pwm_id; -}; - -#define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t) -static inline void pwm_busy_wait(void __iomem *reg, u8 bitmask) -{ -	int loops = msecs_to_loops(10); -	while ((readb(reg) & bitmask) && --loops) -		cpu_relax(); - -	if (unlikely(!loops)) -		pr_warning("Waiting for status bits 0x%x to clear timed out\n", -			   bitmask); -} - -int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) -{ -	unsigned long long c; -	unsigned long period_cycles, prescale, pv, dc; - -	if (pwm == NULL || period_ns == 0 || duty_ns > period_ns) -		return -EINVAL; - -	c = 25000000/2; /* wild guess --- need to implement clocks */ -	c = c * period_ns; -	do_div(c, 1000000000); -	period_cycles = c; - -	if (period_cycles < 1) -		period_cycles = 1; -	prescale = (period_cycles - 1) / 4096; -	pv = period_cycles / (prescale + 1) - 1; -	if (pv > 4095) -		pv = 4095; - -	if (prescale > 1023) -		return -EINVAL; - -	c = (unsigned long long)pv * duty_ns; -	do_div(c, period_ns); -	dc = c; - -	pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 1)); -	writel(prescale, pwm->regbase + 0x4 + (pwm->pwm_id << 4)); - -	pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 2)); -	writel(pv, pwm->regbase + 0x8 + (pwm->pwm_id << 4)); - -	pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 3)); -	writel(dc, pwm->regbase + 0xc + (pwm->pwm_id << 4)); - -	return 0; -} -EXPORT_SYMBOL(pwm_config); - -int pwm_enable(struct pwm_device *pwm) -{ -	pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 0)); -	writel(5, pwm->regbase + (pwm->pwm_id << 4)); -	return 0; -} -EXPORT_SYMBOL(pwm_enable); - -void pwm_disable(struct pwm_device *pwm) -{ -	pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 0)); -	writel(0, pwm->regbase + (pwm->pwm_id << 4)); -} -EXPORT_SYMBOL(pwm_disable); - -struct pwm_device *pwm_request(int pwm_id, const char *label) -{ -	struct pwm_device *pwm; -	int found = 0; - -	mutex_lock(&pwm_lock); - -	list_for_each_entry(pwm, &pwm_list, node) { -		if (pwm->pwm_id == pwm_id) { -			found = 1; -			break; -		} -	} - -	if (found) { -		if (pwm->use_count == 0) { -			pwm->use_count++; -			pwm->label = label; -		} else { -			pwm = ERR_PTR(-EBUSY); -		} -	} else { -		pwm = ERR_PTR(-ENOENT); -	} - -	mutex_unlock(&pwm_lock); -	return pwm; -} -EXPORT_SYMBOL(pwm_request); - -void pwm_free(struct pwm_device *pwm) -{ -	mutex_lock(&pwm_lock); - -	if (pwm->use_count) { -		pwm->use_count--; -		pwm->label = NULL; -	} else { -		pr_warning("PWM device already freed\n"); -	} - -	mutex_unlock(&pwm_lock); -} -EXPORT_SYMBOL(pwm_free); - -static inline void __add_pwm(struct pwm_device *pwm) -{ -	mutex_lock(&pwm_lock); -	list_add_tail(&pwm->node, &pwm_list); -	mutex_unlock(&pwm_lock); -} - -static int __devinit pwm_probe(struct platform_device *pdev) -{ -	struct pwm_device *pwms; -	struct resource *r; -	int ret = 0; -	int i; - -	pwms = kzalloc(sizeof(struct pwm_device) * VT8500_NR_PWMS, GFP_KERNEL); -	if (pwms == NULL) { -		dev_err(&pdev->dev, "failed to allocate memory\n"); -		return -ENOMEM; -	} - -	for (i = 0; i < VT8500_NR_PWMS; i++) { -		pwms[i].use_count = 0; -		pwms[i].pwm_id = i; -		pwms[i].pdev = pdev; -	} - -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (r == NULL) { -		dev_err(&pdev->dev, "no memory resource defined\n"); -		ret = -ENODEV; -		goto err_free; -	} - -	r = request_mem_region(r->start, resource_size(r), pdev->name); -	if (r == NULL) { -		dev_err(&pdev->dev, "failed to request memory resource\n"); -		ret = -EBUSY; -		goto err_free; -	} - -	pwms[0].regbase = ioremap(r->start, resource_size(r)); -	if (pwms[0].regbase == NULL) { -		dev_err(&pdev->dev, "failed to ioremap() registers\n"); -		ret = -ENODEV; -		goto err_free_mem; -	} - -	for (i = 1; i < VT8500_NR_PWMS; i++) -		pwms[i].regbase = pwms[0].regbase; - -	for (i = 0; i < VT8500_NR_PWMS; i++) -		__add_pwm(&pwms[i]); - -	platform_set_drvdata(pdev, pwms); -	return 0; - -err_free_mem: -	release_mem_region(r->start, resource_size(r)); -err_free: -	kfree(pwms); -	return ret; -} - -static int __devexit pwm_remove(struct platform_device *pdev) -{ -	struct pwm_device *pwms; -	struct resource *r; -	int i; - -	pwms = platform_get_drvdata(pdev); -	if (pwms == NULL) -		return -ENODEV; - -	mutex_lock(&pwm_lock); - -	for (i = 0; i < VT8500_NR_PWMS; i++) -		list_del(&pwms[i].node); -	mutex_unlock(&pwm_lock); - -	iounmap(pwms[0].regbase); - -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	release_mem_region(r->start, resource_size(r)); - -	kfree(pwms); -	return 0; -} - -static struct platform_driver pwm_driver = { -	.driver		= { -		.name	= "vt8500-pwm", -		.owner	= THIS_MODULE, -	}, -	.probe		= pwm_probe, -	.remove		= __devexit_p(pwm_remove), -}; - -static int __init pwm_init(void) -{ -	return platform_driver_register(&pwm_driver); -} -arch_initcall(pwm_init); - -static void __exit pwm_exit(void) -{ -	platform_driver_unregister(&pwm_driver); -} -module_exit(pwm_exit); - -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-vt8500/restart.c b/arch/arm/mach-vt8500/restart.c new file mode 100644 index 00000000000..497e89a5e13 --- /dev/null +++ b/arch/arm/mach-vt8500/restart.c @@ -0,0 +1,54 @@ +/* linux/arch/arm/mach-vt8500/restart.c + * + * Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ +#include <asm/io.h> +#include <linux/of.h> +#include <linux/of_address.h> + +#define LEGACY_PMC_BASE		0xD8130000 +#define WMT_PRIZM_PMSR_REG	0x60 + +static void __iomem *pmc_base; + +void wmt_setup_restart(void) +{ +	struct device_node *np; + +	/* +	 * Check if Power Mgmt Controller node is present in device tree. If no +	 * device tree node, use the legacy PMSR value (valid for all current +	 * SoCs). +	 */ +	np = of_find_compatible_node(NULL, NULL, "wmt,prizm-pmc"); +	if (np) { +		pmc_base = of_iomap(np, 0); + +		if (!pmc_base) +			pr_err("%s:of_iomap(pmc) failed\n", __func__); + +		of_node_put(np); +	} else { +		pmc_base = ioremap(LEGACY_PMC_BASE, 0x1000); +		if (!pmc_base) { +			pr_err("%s:ioremap(rstc) failed\n", __func__); +			return; +		} +	} +} + +void wmt_restart(char mode, const char *cmd) +{ +	if (pmc_base) +		writel(1, pmc_base + WMT_PRIZM_PMSR_REG); +} diff --git a/arch/arm/mach-vt8500/wm8505_7in.c b/arch/arm/mach-vt8500/wm8505_7in.c index cf910a95608..db19886caf7 100644 --- a/arch/arm/mach-vt8500/wm8505_7in.c +++ b/arch/arm/mach-vt8500/wm8505_7in.c @@ -23,6 +23,7 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> +#include <mach/restart.h>  #include "devices.h" @@ -61,7 +62,7 @@ void __init wm8505_7in_init(void)  		pm_power_off = &vt8500_power_off;  	else  		printk(KERN_ERR "PMC Hibernation register could not be remapped, not enabling power off!\n"); - +	wmt_setup_restart();  	wm8505_set_resources();  	platform_add_devices(devices, ARRAY_SIZE(devices));  	vt8500_gpio_init(); @@ -69,6 +70,7 @@ void __init wm8505_7in_init(void)  MACHINE_START(WM8505_7IN_NETBOOK, "WM8505 7-inch generic netbook")  	.atag_offset	= 0x100, +	.restart	= wmt_restart,  	.reserve	= wm8505_reserve_mem,  	.map_io		= wm8505_map_io,  	.init_irq	= wm8505_init_irq, diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 806cc4f6351..119bc52ab93 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c @@ -14,6 +14,7 @@  #include <linux/percpu.h>  #include <asm/mmu_context.h> +#include <asm/thread_notify.h>  #include <asm/tlbflush.h>  static DEFINE_RAW_SPINLOCK(cpu_asid_lock); @@ -48,6 +49,40 @@ void cpu_set_reserved_ttbr0(void)  }  #endif +#ifdef CONFIG_PID_IN_CONTEXTIDR +static int contextidr_notifier(struct notifier_block *unused, unsigned long cmd, +			       void *t) +{ +	u32 contextidr; +	pid_t pid; +	struct thread_info *thread = t; + +	if (cmd != THREAD_NOTIFY_SWITCH) +		return NOTIFY_DONE; + +	pid = task_pid_nr(thread->task) << ASID_BITS; +	asm volatile( +	"	mrc	p15, 0, %0, c13, c0, 1\n" +	"	bfi	%1, %0, #0, %2\n" +	"	mcr	p15, 0, %1, c13, c0, 1\n" +	: "=r" (contextidr), "+r" (pid) +	: "I" (ASID_BITS)); +	isb(); + +	return NOTIFY_OK; +} + +static struct notifier_block contextidr_notifier_block = { +	.notifier_call = contextidr_notifier, +}; + +static int __init contextidr_notifier_init(void) +{ +	return thread_register_notifier(&contextidr_notifier_block); +} +arch_initcall(contextidr_notifier_init); +#endif +  /*   * We fork()ed a process, and we need a new context for the child   * to run in. diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 655878bcc96..c2cdf6500f7 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -22,13 +22,14 @@  #include <linux/memblock.h>  #include <linux/slab.h>  #include <linux/iommu.h> +#include <linux/io.h>  #include <linux/vmalloc.h> +#include <linux/sizes.h>  #include <asm/memory.h>  #include <asm/highmem.h>  #include <asm/cacheflush.h>  #include <asm/tlbflush.h> -#include <asm/sizes.h>  #include <asm/mach/arch.h>  #include <asm/dma-iommu.h>  #include <asm/mach/map.h> @@ -72,7 +73,7 @@ static dma_addr_t arm_dma_map_page(struct device *dev, struct page *page,  	     unsigned long offset, size_t size, enum dma_data_direction dir,  	     struct dma_attrs *attrs)  { -	if (!arch_is_coherent()) +	if (!arch_is_coherent() && !dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs))  		__dma_page_cpu_to_dev(page, offset, size, dir);  	return pfn_to_dma(dev, page_to_pfn(page)) + offset;  } @@ -95,7 +96,7 @@ static void arm_dma_unmap_page(struct device *dev, dma_addr_t handle,  		size_t size, enum dma_data_direction dir,  		struct dma_attrs *attrs)  { -	if (!arch_is_coherent()) +	if (!arch_is_coherent() && !dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs))  		__dma_page_dev_to_cpu(pfn_to_page(dma_to_pfn(dev, handle)),  				      handle & ~PAGE_MASK, size, dir);  } @@ -124,6 +125,7 @@ struct dma_map_ops arm_dma_ops = {  	.alloc			= arm_dma_alloc,  	.free			= arm_dma_free,  	.mmap			= arm_dma_mmap, +	.get_sgtable		= arm_dma_get_sgtable,  	.map_page		= arm_dma_map_page,  	.unmap_page		= arm_dma_unmap_page,  	.map_sg			= arm_dma_map_sg, @@ -217,115 +219,70 @@ static void __dma_free_buffer(struct page *page, size_t size)  }  #ifdef CONFIG_MMU +#ifdef CONFIG_HUGETLB_PAGE +#error ARM Coherent DMA allocator does not (yet) support huge TLB +#endif -#define CONSISTENT_OFFSET(x)	(((unsigned long)(x) - consistent_base) >> PAGE_SHIFT) -#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - consistent_base) >> PMD_SHIFT) - -/* - * These are the page tables (2MB each) covering uncached, DMA consistent allocations - */ -static pte_t **consistent_pte; - -#define DEFAULT_CONSISTENT_DMA_SIZE SZ_2M +static void *__alloc_from_contiguous(struct device *dev, size_t size, +				     pgprot_t prot, struct page **ret_page); -static unsigned long consistent_base = CONSISTENT_END - DEFAULT_CONSISTENT_DMA_SIZE; +static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, +				 pgprot_t prot, struct page **ret_page, +				 const void *caller); -void __init init_consistent_dma_size(unsigned long size) +static void * +__dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot, +	const void *caller)  { -	unsigned long base = CONSISTENT_END - ALIGN(size, SZ_2M); +	struct vm_struct *area; +	unsigned long addr; -	BUG_ON(consistent_pte); /* Check we're called before DMA region init */ -	BUG_ON(base < VMALLOC_END); +	/* +	 * DMA allocation can be mapped to user space, so lets +	 * set VM_USERMAP flags too. +	 */ +	area = get_vm_area_caller(size, VM_ARM_DMA_CONSISTENT | VM_USERMAP, +				  caller); +	if (!area) +		return NULL; +	addr = (unsigned long)area->addr; +	area->phys_addr = __pfn_to_phys(page_to_pfn(page)); -	/* Grow region to accommodate specified size  */ -	if (base < consistent_base) -		consistent_base = base; +	if (ioremap_page_range(addr, addr + size, area->phys_addr, prot)) { +		vunmap((void *)addr); +		return NULL; +	} +	return (void *)addr;  } -#include "vmregion.h" - -static struct arm_vmregion_head consistent_head = { -	.vm_lock	= __SPIN_LOCK_UNLOCKED(&consistent_head.vm_lock), -	.vm_list	= LIST_HEAD_INIT(consistent_head.vm_list), -	.vm_end		= CONSISTENT_END, -}; - -#ifdef CONFIG_HUGETLB_PAGE -#error ARM Coherent DMA allocator does not (yet) support huge TLB -#endif - -/* - * Initialise the consistent memory allocation. - */ -static int __init consistent_init(void) +static void __dma_free_remap(void *cpu_addr, size_t size)  { -	int ret = 0; -	pgd_t *pgd; -	pud_t *pud; -	pmd_t *pmd; -	pte_t *pte; -	int i = 0; -	unsigned long base = consistent_base; -	unsigned long num_ptes = (CONSISTENT_END - base) >> PMD_SHIFT; - -	if (IS_ENABLED(CONFIG_CMA) && !IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) -		return 0; - -	consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL); -	if (!consistent_pte) { -		pr_err("%s: no memory\n", __func__); -		return -ENOMEM; +	unsigned int flags = VM_ARM_DMA_CONSISTENT | VM_USERMAP; +	struct vm_struct *area = find_vm_area(cpu_addr); +	if (!area || (area->flags & flags) != flags) { +		WARN(1, "trying to free invalid coherent area: %p\n", cpu_addr); +		return;  	} - -	pr_debug("DMA memory: 0x%08lx - 0x%08lx:\n", base, CONSISTENT_END); -	consistent_head.vm_start = base; - -	do { -		pgd = pgd_offset(&init_mm, base); - -		pud = pud_alloc(&init_mm, pgd, base); -		if (!pud) { -			pr_err("%s: no pud tables\n", __func__); -			ret = -ENOMEM; -			break; -		} - -		pmd = pmd_alloc(&init_mm, pud, base); -		if (!pmd) { -			pr_err("%s: no pmd tables\n", __func__); -			ret = -ENOMEM; -			break; -		} -		WARN_ON(!pmd_none(*pmd)); - -		pte = pte_alloc_kernel(pmd, base); -		if (!pte) { -			pr_err("%s: no pte tables\n", __func__); -			ret = -ENOMEM; -			break; -		} - -		consistent_pte[i++] = pte; -		base += PMD_SIZE; -	} while (base < CONSISTENT_END); - -	return ret; +	unmap_kernel_range((unsigned long)cpu_addr, size); +	vunmap(cpu_addr);  } -core_initcall(consistent_init); - -static void *__alloc_from_contiguous(struct device *dev, size_t size, -				     pgprot_t prot, struct page **ret_page); -static struct arm_vmregion_head coherent_head = { -	.vm_lock	= __SPIN_LOCK_UNLOCKED(&coherent_head.vm_lock), -	.vm_list	= LIST_HEAD_INIT(coherent_head.vm_list), +struct dma_pool { +	size_t size; +	spinlock_t lock; +	unsigned long *bitmap; +	unsigned long nr_pages; +	void *vaddr; +	struct page *page;  }; -static size_t coherent_pool_size = DEFAULT_CONSISTENT_DMA_SIZE / 8; +static struct dma_pool atomic_pool = { +	.size = SZ_256K, +};  static int __init early_coherent_pool(char *p)  { -	coherent_pool_size = memparse(p, &p); +	atomic_pool.size = memparse(p, &p);  	return 0;  }  early_param("coherent_pool", early_coherent_pool); @@ -333,32 +290,45 @@ early_param("coherent_pool", early_coherent_pool);  /*   * Initialise the coherent pool for atomic allocations.   */ -static int __init coherent_init(void) +static int __init atomic_pool_init(void)  { +	struct dma_pool *pool = &atomic_pool;  	pgprot_t prot = pgprot_dmacoherent(pgprot_kernel); -	size_t size = coherent_pool_size; +	unsigned long nr_pages = pool->size >> PAGE_SHIFT; +	unsigned long *bitmap;  	struct page *page;  	void *ptr; +	int bitmap_size = BITS_TO_LONGS(nr_pages) * sizeof(long); -	if (!IS_ENABLED(CONFIG_CMA)) -		return 0; +	bitmap = kzalloc(bitmap_size, GFP_KERNEL); +	if (!bitmap) +		goto no_bitmap; -	ptr = __alloc_from_contiguous(NULL, size, prot, &page); +	if (IS_ENABLED(CONFIG_CMA)) +		ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page); +	else +		ptr = __alloc_remap_buffer(NULL, pool->size, GFP_KERNEL, prot, +					   &page, NULL);  	if (ptr) { -		coherent_head.vm_start = (unsigned long) ptr; -		coherent_head.vm_end = (unsigned long) ptr + size; -		printk(KERN_INFO "DMA: preallocated %u KiB pool for atomic coherent allocations\n", -		       (unsigned)size / 1024); +		spin_lock_init(&pool->lock); +		pool->vaddr = ptr; +		pool->page = page; +		pool->bitmap = bitmap; +		pool->nr_pages = nr_pages; +		pr_info("DMA: preallocated %u KiB pool for atomic coherent allocations\n", +		       (unsigned)pool->size / 1024);  		return 0;  	} -	printk(KERN_ERR "DMA: failed to allocate %u KiB pool for atomic coherent allocation\n", -	       (unsigned)size / 1024); +	kfree(bitmap); +no_bitmap: +	pr_err("DMA: failed to allocate %u KiB pool for atomic coherent allocation\n", +	       (unsigned)pool->size / 1024);  	return -ENOMEM;  }  /*   * CMA is activated by core_initcall, so we must be called after it.   */ -postcore_initcall(coherent_init); +postcore_initcall(atomic_pool_init);  struct dma_contig_early_reserve {  	phys_addr_t base; @@ -406,112 +376,6 @@ void __init dma_contiguous_remap(void)  	}  } -static void * -__dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot, -	const void *caller) -{ -	struct arm_vmregion *c; -	size_t align; -	int bit; - -	if (!consistent_pte) { -		pr_err("%s: not initialised\n", __func__); -		dump_stack(); -		return NULL; -	} - -	/* -	 * Align the virtual region allocation - maximum alignment is -	 * a section size, minimum is a page size.  This helps reduce -	 * fragmentation of the DMA space, and also prevents allocations -	 * smaller than a section from crossing a section boundary. -	 */ -	bit = fls(size - 1); -	if (bit > SECTION_SHIFT) -		bit = SECTION_SHIFT; -	align = 1 << bit; - -	/* -	 * Allocate a virtual address in the consistent mapping region. -	 */ -	c = arm_vmregion_alloc(&consistent_head, align, size, -			    gfp & ~(__GFP_DMA | __GFP_HIGHMEM), caller); -	if (c) { -		pte_t *pte; -		int idx = CONSISTENT_PTE_INDEX(c->vm_start); -		u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1); - -		pte = consistent_pte[idx] + off; -		c->priv = page; - -		do { -			BUG_ON(!pte_none(*pte)); - -			set_pte_ext(pte, mk_pte(page, prot), 0); -			page++; -			pte++; -			off++; -			if (off >= PTRS_PER_PTE) { -				off = 0; -				pte = consistent_pte[++idx]; -			} -		} while (size -= PAGE_SIZE); - -		dsb(); - -		return (void *)c->vm_start; -	} -	return NULL; -} - -static void __dma_free_remap(void *cpu_addr, size_t size) -{ -	struct arm_vmregion *c; -	unsigned long addr; -	pte_t *ptep; -	int idx; -	u32 off; - -	c = arm_vmregion_find_remove(&consistent_head, (unsigned long)cpu_addr); -	if (!c) { -		pr_err("%s: trying to free invalid coherent area: %p\n", -		       __func__, cpu_addr); -		dump_stack(); -		return; -	} - -	if ((c->vm_end - c->vm_start) != size) { -		pr_err("%s: freeing wrong coherent size (%ld != %d)\n", -		       __func__, c->vm_end - c->vm_start, size); -		dump_stack(); -		size = c->vm_end - c->vm_start; -	} - -	idx = CONSISTENT_PTE_INDEX(c->vm_start); -	off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1); -	ptep = consistent_pte[idx] + off; -	addr = c->vm_start; -	do { -		pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep); - -		ptep++; -		addr += PAGE_SIZE; -		off++; -		if (off >= PTRS_PER_PTE) { -			off = 0; -			ptep = consistent_pte[++idx]; -		} - -		if (pte_none(pte) || !pte_present(pte)) -			pr_crit("%s: bad page in kernel page table\n", -				__func__); -	} while (size -= PAGE_SIZE); - -	flush_tlb_kernel_range(c->vm_start, c->vm_end); - -	arm_vmregion_free(&consistent_head, c); -} -  static int __dma_update_pte(pte_t *pte, pgtable_t token, unsigned long addr,  			    void *data)  { @@ -552,16 +416,17 @@ static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp,  	return ptr;  } -static void *__alloc_from_pool(struct device *dev, size_t size, -			       struct page **ret_page, const void *caller) +static void *__alloc_from_pool(size_t size, struct page **ret_page)  { -	struct arm_vmregion *c; +	struct dma_pool *pool = &atomic_pool; +	unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; +	unsigned int pageno; +	unsigned long flags; +	void *ptr = NULL;  	size_t align; -	if (!coherent_head.vm_start) { -		printk(KERN_ERR "%s: coherent pool not initialised!\n", -		       __func__); -		dump_stack(); +	if (!pool->vaddr) { +		WARN(1, "coherent pool not initialised!\n");  		return NULL;  	} @@ -571,35 +436,41 @@ static void *__alloc_from_pool(struct device *dev, size_t size,  	 * size. This helps reduce fragmentation of the DMA space.  	 */  	align = PAGE_SIZE << get_order(size); -	c = arm_vmregion_alloc(&coherent_head, align, size, 0, caller); -	if (c) { -		void *ptr = (void *)c->vm_start; -		struct page *page = virt_to_page(ptr); -		*ret_page = page; -		return ptr; + +	spin_lock_irqsave(&pool->lock, flags); +	pageno = bitmap_find_next_zero_area(pool->bitmap, pool->nr_pages, +					    0, count, (1 << align) - 1); +	if (pageno < pool->nr_pages) { +		bitmap_set(pool->bitmap, pageno, count); +		ptr = pool->vaddr + PAGE_SIZE * pageno; +		*ret_page = pool->page + pageno;  	} -	return NULL; +	spin_unlock_irqrestore(&pool->lock, flags); + +	return ptr;  } -static int __free_from_pool(void *cpu_addr, size_t size) +static int __free_from_pool(void *start, size_t size)  { -	unsigned long start = (unsigned long)cpu_addr; -	unsigned long end = start + size; -	struct arm_vmregion *c; +	struct dma_pool *pool = &atomic_pool; +	unsigned long pageno, count; +	unsigned long flags; -	if (start < coherent_head.vm_start || end > coherent_head.vm_end) +	if (start < pool->vaddr || start > pool->vaddr + pool->size)  		return 0; -	c = arm_vmregion_find_remove(&coherent_head, (unsigned long)start); - -	if ((c->vm_end - c->vm_start) != size) { -		printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n", -		       __func__, c->vm_end - c->vm_start, size); -		dump_stack(); -		size = c->vm_end - c->vm_start; +	if (start + size > pool->vaddr + pool->size) { +		WARN(1, "freeing wrong coherent size from pool\n"); +		return 0;  	} -	arm_vmregion_free(&coherent_head, c); +	pageno = (start - pool->vaddr) >> PAGE_SHIFT; +	count = size >> PAGE_SHIFT; + +	spin_lock_irqsave(&pool->lock, flags); +	bitmap_clear(pool->bitmap, pageno, count); +	spin_unlock_irqrestore(&pool->lock, flags); +  	return 1;  } @@ -644,7 +515,7 @@ static inline pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot)  #define __get_dma_pgprot(attrs, prot)	__pgprot(0)  #define __alloc_remap_buffer(dev, size, gfp, prot, ret, c)	NULL -#define __alloc_from_pool(dev, size, ret_page, c)		NULL +#define __alloc_from_pool(size, ret_page)			NULL  #define __alloc_from_contiguous(dev, size, prot, ret)		NULL  #define __free_from_pool(cpu_addr, size)			0  #define __free_from_contiguous(dev, page, size)			do { } while (0) @@ -702,10 +573,10 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,  	if (arch_is_coherent() || nommu())  		addr = __alloc_simple_buffer(dev, size, gfp, &page); +	else if (gfp & GFP_ATOMIC) +		addr = __alloc_from_pool(size, &page);  	else if (!IS_ENABLED(CONFIG_CMA))  		addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller); -	else if (gfp & GFP_ATOMIC) -		addr = __alloc_from_pool(dev, size, &page, caller);  	else  		addr = __alloc_from_contiguous(dev, size, prot, &page); @@ -741,16 +612,22 @@ int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma,  {  	int ret = -ENXIO;  #ifdef CONFIG_MMU +	unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; +	unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;  	unsigned long pfn = dma_to_pfn(dev, dma_addr); +	unsigned long off = vma->vm_pgoff; +  	vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot);  	if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))  		return ret; -	ret = remap_pfn_range(vma, vma->vm_start, -			      pfn + vma->vm_pgoff, -			      vma->vm_end - vma->vm_start, -			      vma->vm_page_prot); +	if (off < nr_pages && nr_vma_pages <= (nr_pages - off)) { +		ret = remap_pfn_range(vma, vma->vm_start, +				      pfn + off, +				      vma->vm_end - vma->vm_start, +				      vma->vm_page_prot); +	}  #endif	/* CONFIG_MMU */  	return ret; @@ -785,6 +662,21 @@ void arm_dma_free(struct device *dev, size_t size, void *cpu_addr,  	}  } +int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, +		 void *cpu_addr, dma_addr_t handle, size_t size, +		 struct dma_attrs *attrs) +{ +	struct page *page = pfn_to_page(dma_to_pfn(dev, handle)); +	int ret; + +	ret = sg_alloc_table(sgt, 1, GFP_KERNEL); +	if (unlikely(ret)) +		return ret; + +	sg_set_page(sgt->sgl, page, PAGE_ALIGN(size), 0); +	return 0; +} +  static void dma_cache_maint_page(struct page *page, unsigned long offset,  	size_t size, enum dma_data_direction dir,  	void (*op)(const void *, size_t, int)) @@ -998,9 +890,6 @@ static int arm_dma_set_mask(struct device *dev, u64 dma_mask)  static int __init dma_debug_do_init(void)  { -#ifdef CONFIG_MMU -	arm_vmregion_create_proc("dma-mappings", &consistent_head); -#endif  	dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);  	return 0;  } @@ -1088,7 +977,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, gfp_t  	return pages;  error: -	while (--i) +	while (i--)  		if (pages[i])  			__free_pages(pages[i], 0);  	if (array_size <= PAGE_SIZE) @@ -1117,61 +1006,32 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages, size_t s   * Create a CPU mapping for a specified pages   */  static void * -__iommu_alloc_remap(struct page **pages, size_t size, gfp_t gfp, pgprot_t prot) +__iommu_alloc_remap(struct page **pages, size_t size, gfp_t gfp, pgprot_t prot, +		    const void *caller)  { -	struct arm_vmregion *c; -	size_t align; -	size_t count = size >> PAGE_SHIFT; -	int bit; +	unsigned int i, nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; +	struct vm_struct *area; +	unsigned long p; -	if (!consistent_pte[0]) { -		pr_err("%s: not initialised\n", __func__); -		dump_stack(); +	area = get_vm_area_caller(size, VM_ARM_DMA_CONSISTENT | VM_USERMAP, +				  caller); +	if (!area)  		return NULL; -	} -	/* -	 * Align the virtual region allocation - maximum alignment is -	 * a section size, minimum is a page size.  This helps reduce -	 * fragmentation of the DMA space, and also prevents allocations -	 * smaller than a section from crossing a section boundary. -	 */ -	bit = fls(size - 1); -	if (bit > SECTION_SHIFT) -		bit = SECTION_SHIFT; -	align = 1 << bit; - -	/* -	 * Allocate a virtual address in the consistent mapping region. -	 */ -	c = arm_vmregion_alloc(&consistent_head, align, size, -			    gfp & ~(__GFP_DMA | __GFP_HIGHMEM), NULL); -	if (c) { -		pte_t *pte; -		int idx = CONSISTENT_PTE_INDEX(c->vm_start); -		int i = 0; -		u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1); - -		pte = consistent_pte[idx] + off; -		c->priv = pages; +	area->pages = pages; +	area->nr_pages = nr_pages; +	p = (unsigned long)area->addr; -		do { -			BUG_ON(!pte_none(*pte)); - -			set_pte_ext(pte, mk_pte(pages[i], prot), 0); -			pte++; -			off++; -			i++; -			if (off >= PTRS_PER_PTE) { -				off = 0; -				pte = consistent_pte[++idx]; -			} -		} while (i < count); - -		dsb(); - -		return (void *)c->vm_start; +	for (i = 0; i < nr_pages; i++) { +		phys_addr_t phys = __pfn_to_phys(page_to_pfn(pages[i])); +		if (ioremap_page_range(p, p + PAGE_SIZE, phys, prot)) +			goto err; +		p += PAGE_SIZE;  	} +	return area->addr; +err: +	unmap_kernel_range((unsigned long)area->addr, size); +	vunmap(area->addr);  	return NULL;  } @@ -1230,6 +1090,19 @@ static int __iommu_remove_mapping(struct device *dev, dma_addr_t iova, size_t si  	return 0;  } +static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs) +{ +	struct vm_struct *area; + +	if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) +		return cpu_addr; + +	area = find_vm_area(cpu_addr); +	if (area && (area->flags & VM_ARM_DMA_CONSISTENT)) +		return area->pages; +	return NULL; +} +  static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,  	    dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs)  { @@ -1248,7 +1121,11 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,  	if (*handle == DMA_ERROR_CODE)  		goto err_buffer; -	addr = __iommu_alloc_remap(pages, size, gfp, prot); +	if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) +		return pages; + +	addr = __iommu_alloc_remap(pages, size, gfp, prot, +				   __builtin_return_address(0));  	if (!addr)  		goto err_mapping; @@ -1265,31 +1142,25 @@ static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma,  		    void *cpu_addr, dma_addr_t dma_addr, size_t size,  		    struct dma_attrs *attrs)  { -	struct arm_vmregion *c; +	unsigned long uaddr = vma->vm_start; +	unsigned long usize = vma->vm_end - vma->vm_start; +	struct page **pages = __iommu_get_pages(cpu_addr, attrs);  	vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot); -	c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr); - -	if (c) { -		struct page **pages = c->priv; -		unsigned long uaddr = vma->vm_start; -		unsigned long usize = vma->vm_end - vma->vm_start; -		int i = 0; - -		do { -			int ret; +	if (!pages) +		return -ENXIO; -			ret = vm_insert_page(vma, uaddr, pages[i++]); -			if (ret) { -				pr_err("Remapping memory, error: %d\n", ret); -				return ret; -			} +	do { +		int ret = vm_insert_page(vma, uaddr, *pages++); +		if (ret) { +			pr_err("Remapping memory failed: %d\n", ret); +			return ret; +		} +		uaddr += PAGE_SIZE; +		usize -= PAGE_SIZE; +	} while (usize > 0); -			uaddr += PAGE_SIZE; -			usize -= PAGE_SIZE; -		} while (usize > 0); -	}  	return 0;  } @@ -1300,16 +1171,35 @@ static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma,  void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr,  			  dma_addr_t handle, struct dma_attrs *attrs)  { -	struct arm_vmregion *c; +	struct page **pages = __iommu_get_pages(cpu_addr, attrs);  	size = PAGE_ALIGN(size); -	c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr); -	if (c) { -		struct page **pages = c->priv; -		__dma_free_remap(cpu_addr, size); -		__iommu_remove_mapping(dev, handle, size); -		__iommu_free_buffer(dev, pages, size); +	if (!pages) { +		WARN(1, "trying to free invalid coherent area: %p\n", cpu_addr); +		return;  	} + +	if (!dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) { +		unmap_kernel_range((unsigned long)cpu_addr, size); +		vunmap(cpu_addr); +	} + +	__iommu_remove_mapping(dev, handle, size); +	__iommu_free_buffer(dev, pages, size); +} + +static int arm_iommu_get_sgtable(struct device *dev, struct sg_table *sgt, +				 void *cpu_addr, dma_addr_t dma_addr, +				 size_t size, struct dma_attrs *attrs) +{ +	unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; +	struct page **pages = __iommu_get_pages(cpu_addr, attrs); + +	if (!pages) +		return -ENXIO; + +	return sg_alloc_table_from_pages(sgt, pages, count, 0, size, +					 GFP_KERNEL);  }  /* @@ -1317,7 +1207,7 @@ void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr,   */  static int __map_sg_chunk(struct device *dev, struct scatterlist *sg,  			  size_t size, dma_addr_t *handle, -			  enum dma_data_direction dir) +			  enum dma_data_direction dir, struct dma_attrs *attrs)  {  	struct dma_iommu_mapping *mapping = dev->archdata.mapping;  	dma_addr_t iova, iova_base; @@ -1336,7 +1226,8 @@ static int __map_sg_chunk(struct device *dev, struct scatterlist *sg,  		phys_addr_t phys = page_to_phys(sg_page(s));  		unsigned int len = PAGE_ALIGN(s->offset + s->length); -		if (!arch_is_coherent()) +		if (!arch_is_coherent() && +		    !dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs))  			__dma_page_cpu_to_dev(sg_page(s), s->offset, s->length, dir);  		ret = iommu_map(mapping->domain, iova, phys, len, 0); @@ -1383,7 +1274,7 @@ int arm_iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents,  		if (s->offset || (size & ~PAGE_MASK) || size + s->length > max) {  			if (__map_sg_chunk(dev, start, size, &dma->dma_address, -			    dir) < 0) +			    dir, attrs) < 0)  				goto bad_mapping;  			dma->dma_address += offset; @@ -1396,7 +1287,7 @@ int arm_iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents,  		}  		size += s->length;  	} -	if (__map_sg_chunk(dev, start, size, &dma->dma_address, dir) < 0) +	if (__map_sg_chunk(dev, start, size, &dma->dma_address, dir, attrs) < 0)  		goto bad_mapping;  	dma->dma_address += offset; @@ -1430,7 +1321,8 @@ void arm_iommu_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,  		if (sg_dma_len(s))  			__iommu_remove_mapping(dev, sg_dma_address(s),  					       sg_dma_len(s)); -		if (!arch_is_coherent()) +		if (!arch_is_coherent() && +		    !dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs))  			__dma_page_dev_to_cpu(sg_page(s), s->offset,  					      s->length, dir);  	} @@ -1492,7 +1384,7 @@ static dma_addr_t arm_iommu_map_page(struct device *dev, struct page *page,  	dma_addr_t dma_addr;  	int ret, len = PAGE_ALIGN(size + offset); -	if (!arch_is_coherent()) +	if (!arch_is_coherent() && !dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs))  		__dma_page_cpu_to_dev(page, offset, size, dir);  	dma_addr = __alloc_iova(mapping, len); @@ -1531,7 +1423,7 @@ static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle,  	if (!iova)  		return; -	if (!arch_is_coherent()) +	if (!arch_is_coherent() && !dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs))  		__dma_page_dev_to_cpu(page, offset, size, dir);  	iommu_unmap(mapping->domain, iova, len); @@ -1571,6 +1463,7 @@ struct dma_map_ops iommu_ops = {  	.alloc		= arm_iommu_alloc_attrs,  	.free		= arm_iommu_free_attrs,  	.mmap		= arm_iommu_mmap_attrs, +	.get_sgtable	= arm_iommu_get_sgtable,  	.map_page		= arm_iommu_map_page,  	.unmap_page		= arm_iommu_unmap_page, diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index f54d5921976..9aec41fa80a 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -21,13 +21,13 @@  #include <linux/gfp.h>  #include <linux/memblock.h>  #include <linux/dma-contiguous.h> +#include <linux/sizes.h>  #include <asm/mach-types.h>  #include <asm/memblock.h>  #include <asm/prom.h>  #include <asm/sections.h>  #include <asm/setup.h> -#include <asm/sizes.h>  #include <asm/tlb.h>  #include <asm/fixmap.h> diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 4f55f5062ab..566750fa57d 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@ -25,6 +25,7 @@  #include <linux/mm.h>  #include <linux/vmalloc.h>  #include <linux/io.h> +#include <linux/sizes.h>  #include <asm/cp15.h>  #include <asm/cputype.h> @@ -32,7 +33,6 @@  #include <asm/mmu_context.h>  #include <asm/pgalloc.h>  #include <asm/tlbflush.h> -#include <asm/sizes.h>  #include <asm/system_info.h>  #include <asm/mach/map.h> diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index 2e8a1efdf7b..6776160618e 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h @@ -59,6 +59,9 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page  #define VM_ARM_MTYPE(mt)		((mt) << 20)  #define VM_ARM_MTYPE_MASK	(0x1f << 20) +/* consistent regions used by dma_alloc_attrs() */ +#define VM_ARM_DMA_CONSISTENT	0x20000000 +  #endif  #ifdef CONFIG_ZONE_DMA diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index cf4528d5177..4c2d0451e84 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -16,13 +16,13 @@  #include <linux/memblock.h>  #include <linux/fs.h>  #include <linux/vmalloc.h> +#include <linux/sizes.h>  #include <asm/cp15.h>  #include <asm/cputype.h>  #include <asm/sections.h>  #include <asm/cachetype.h>  #include <asm/setup.h> -#include <asm/sizes.h>  #include <asm/smp_plat.h>  #include <asm/tlb.h>  #include <asm/highmem.h> @@ -422,12 +422,6 @@ static void __init build_mem_type_table(void)  	vecs_pgprot = kern_pgprot = user_pgprot = cp->pte;  	/* -	 * Only use write-through for non-SMP systems -	 */ -	if (!is_smp() && cpu_arch >= CPU_ARCH_ARMv5 && cachepolicy > CPOLICY_WRITETHROUGH) -		vecs_pgprot = cache_policies[CPOLICY_WRITETHROUGH].pte; - -	/*  	 * Enable CPU-specific coherency if supported.  	 * (Only available on XSC3 at the moment.)  	 */ diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 5900cd520e8..86b8b480634 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S @@ -107,6 +107,12 @@ ENTRY(cpu_v6_switch_mm)  	mcr	p15, 0, r2, c7, c5, 6		@ flush BTAC/BTB  	mcr	p15, 0, r2, c7, c10, 4		@ drain write buffer  	mcr	p15, 0, r0, c2, c0, 0		@ set TTB 0 +#ifdef CONFIG_PID_IN_CONTEXTIDR +	mrc	p15, 0, r2, c13, c0, 1		@ read current context ID +	bic	r2, r2, #0xff			@ extract the PID +	and	r1, r1, #0xff +	orr	r1, r1, r2			@ insert into new context ID +#endif  	mcr	p15, 0, r1, c13, c0, 1		@ set context ID  #endif  	mov	pc, lr diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S index 42ac069c801..fd045e70639 100644 --- a/arch/arm/mm/proc-v7-2level.S +++ b/arch/arm/mm/proc-v7-2level.S @@ -46,6 +46,11 @@ ENTRY(cpu_v7_switch_mm)  #ifdef CONFIG_ARM_ERRATA_430973  	mcr	p15, 0, r2, c7, c5, 6		@ flush BTAC/BTB  #endif +#ifdef CONFIG_PID_IN_CONTEXTIDR +	mrc	p15, 0, r2, c13, c0, 1		@ read current context ID +	lsr	r2, r2, #8			@ extract the PID +	bfi	r1, r2, #8, #24			@ insert into new context ID +#endif  #ifdef CONFIG_ARM_ERRATA_754322  	dsb  #endif diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S index 845f461f8ec..c2021139cb5 100644 --- a/arch/arm/mm/tlb-v7.S +++ b/arch/arm/mm/tlb-v7.S @@ -38,11 +38,19 @@ ENTRY(v7wbi_flush_user_tlb_range)  	dsb  	mov	r0, r0, lsr #PAGE_SHIFT		@ align address  	mov	r1, r1, lsr #PAGE_SHIFT +#ifdef CONFIG_ARM_ERRATA_720789 +	mov	r3, #0 +#else  	asid	r3, r3				@ mask ASID +#endif  	orr	r0, r3, r0, lsl #PAGE_SHIFT	@ Create initial MVA  	mov	r1, r1, lsl #PAGE_SHIFT  1: +#ifdef CONFIG_ARM_ERRATA_720789 +	ALT_SMP(mcr	p15, 0, r0, c8, c3, 3)	@ TLB invalidate U MVA all ASID (shareable) +#else  	ALT_SMP(mcr	p15, 0, r0, c8, c3, 1)	@ TLB invalidate U MVA (shareable) +#endif  	ALT_UP(mcr	p15, 0, r0, c8, c7, 1)	@ TLB invalidate U MVA  	add	r0, r0, #PAGE_SZ @@ -67,7 +75,11 @@ ENTRY(v7wbi_flush_kern_tlb_range)  	mov	r0, r0, lsl #PAGE_SHIFT  	mov	r1, r1, lsl #PAGE_SHIFT  1: +#ifdef CONFIG_ARM_ERRATA_720789 +	ALT_SMP(mcr	p15, 0, r0, c8, c3, 3)	@ TLB invalidate U MVA all ASID (shareable) +#else  	ALT_SMP(mcr	p15, 0, r0, c8, c3, 1)	@ TLB invalidate U MVA (shareable) +#endif  	ALT_UP(mcr	p15, 0, r0, c8, c7, 1)	@ TLB invalidate U MVA  	add	r0, r0, #PAGE_SZ  	cmp	r0, r1 diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index 4e0a371630b..99c63d4b6af 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c @@ -23,26 +23,37 @@  #include <asm/ptrace.h>  #ifdef CONFIG_HW_PERF_EVENTS + +/* + * OProfile has a curious naming scheme for the ARM PMUs, but they are + * part of the user ABI so we need to map from the perf PMU name for + * supported PMUs. + */ +static struct op_perf_name { +	char *perf_name; +	char *op_name; +} op_perf_name_map[] = { +	{ "xscale1",		"arm/xscale1"	}, +	{ "xscale1",		"arm/xscale2"	}, +	{ "v6",			"arm/armv6"	}, +	{ "v6mpcore",		"arm/mpcore"	}, +	{ "ARMv7 Cortex-A8",	"arm/armv7"	}, +	{ "ARMv7 Cortex-A9",	"arm/armv7-ca9"	}, +}; +  char *op_name_from_perf_id(void)  { -	enum arm_perf_pmu_ids id = armpmu_get_pmu_id(); +	int i; +	struct op_perf_name names; +	const char *perf_name = perf_pmu_name(); -	switch (id) { -	case ARM_PERF_PMU_ID_XSCALE1: -		return "arm/xscale1"; -	case ARM_PERF_PMU_ID_XSCALE2: -		return "arm/xscale2"; -	case ARM_PERF_PMU_ID_V6: -		return "arm/armv6"; -	case ARM_PERF_PMU_ID_V6MP: -		return "arm/mpcore"; -	case ARM_PERF_PMU_ID_CA8: -		return "arm/armv7"; -	case ARM_PERF_PMU_ID_CA9: -		return "arm/armv7-ca9"; -	default: -		return NULL; +	for (i = 0; i < ARRAY_SIZE(op_perf_name_map); ++i) { +		names = op_perf_name_map[i]; +		if (!strcmp(names.perf_name, perf_name)) +			return names.op_name;  	} + +	return NULL;  }  #endif diff --git a/arch/arm/plat-mxc/3ds_debugboard.c b/arch/arm/plat-mxc/3ds_debugboard.c index 5cac2c540f4..5c10ad05df7 100644 --- a/arch/arm/plat-mxc/3ds_debugboard.c +++ b/arch/arm/plat-mxc/3ds_debugboard.c @@ -12,9 +12,11 @@  #include <linux/interrupt.h>  #include <linux/irq.h> +#include <linux/irqdomain.h>  #include <linux/io.h>  #include <linux/platform_device.h>  #include <linux/gpio.h> +#include <linux/module.h>  #include <linux/smsc911x.h>  #include <linux/regulator/machine.h>  #include <linux/regulator/fixed.h> @@ -48,27 +50,22 @@  /* CPU ID and Personality ID */  #define MCU_BOARD_ID_REG	0x68 -#define MXC_IRQ_TO_EXPIO(irq)   ((irq) - MXC_BOARD_IRQ_START) -#define MXC_IRQ_TO_GPIO(irq)	((irq) - MXC_INTERNAL_IRQS) - -#define MXC_EXP_IO_BASE		(MXC_BOARD_IRQ_START)  #define MXC_MAX_EXP_IO_LINES	16  /* interrupts like external uart , external ethernet etc*/ -#define EXPIO_INT_ENET		(MXC_BOARD_IRQ_START + 0) -#define EXPIO_INT_XUART_A	(MXC_BOARD_IRQ_START + 1) -#define EXPIO_INT_XUART_B	(MXC_BOARD_IRQ_START + 2) -#define EXPIO_INT_BUTTON_A	(MXC_BOARD_IRQ_START + 3) -#define EXPIO_INT_BUTTON_B	(MXC_BOARD_IRQ_START + 4) +#define EXPIO_INT_ENET		0 +#define EXPIO_INT_XUART_A	1 +#define EXPIO_INT_XUART_B	2 +#define EXPIO_INT_BUTTON_A	3 +#define EXPIO_INT_BUTTON_B	4  static void __iomem *brd_io; +static struct irq_domain *domain;  static struct resource smsc911x_resources[] = {  	{  		.flags = IORESOURCE_MEM,  	} , { -		.start = EXPIO_INT_ENET, -		.end = EXPIO_INT_ENET,  		.flags = IORESOURCE_IRQ,  	},  }; @@ -100,11 +97,11 @@ static void mxc_expio_irq_handler(u32 irq, struct irq_desc *desc)  	imr_val = __raw_readw(brd_io + INTR_MASK_REG);  	int_valid = __raw_readw(brd_io + INTR_STATUS_REG) & ~imr_val; -	expio_irq = MXC_BOARD_IRQ_START; +	expio_irq = 0;  	for (; int_valid != 0; int_valid >>= 1, expio_irq++) {  		if ((int_valid & 1) == 0)  			continue; -		generic_handle_irq(expio_irq); +		generic_handle_irq(irq_find_mapping(domain, expio_irq));  	}  	desc->irq_data.chip->irq_ack(&desc->irq_data); @@ -118,7 +115,7 @@ static void mxc_expio_irq_handler(u32 irq, struct irq_desc *desc)  static void expio_mask_irq(struct irq_data *d)  {  	u16 reg; -	u32 expio = MXC_IRQ_TO_EXPIO(d->irq); +	u32 expio = d->hwirq;  	reg = __raw_readw(brd_io + INTR_MASK_REG);  	reg |= (1 << expio); @@ -127,7 +124,7 @@ static void expio_mask_irq(struct irq_data *d)  static void expio_ack_irq(struct irq_data *d)  { -	u32 expio = MXC_IRQ_TO_EXPIO(d->irq); +	u32 expio = d->hwirq;  	__raw_writew(1 << expio, brd_io + INTR_RESET_REG);  	__raw_writew(0, brd_io + INTR_RESET_REG); @@ -137,7 +134,7 @@ static void expio_ack_irq(struct irq_data *d)  static void expio_unmask_irq(struct irq_data *d)  {  	u16 reg; -	u32 expio = MXC_IRQ_TO_EXPIO(d->irq); +	u32 expio = d->hwirq;  	reg = __raw_readw(brd_io + INTR_MASK_REG);  	reg &= ~(1 << expio); @@ -155,8 +152,10 @@ static struct regulator_consumer_supply dummy_supplies[] = {  	REGULATOR_SUPPLY("vddvario", "smsc911x"),  }; -int __init mxc_expio_init(u32 base, u32 p_irq) +int __init mxc_expio_init(u32 base, u32 intr_gpio)  { +	u32 p_irq = gpio_to_irq(intr_gpio); +	int irq_base;  	int i;  	brd_io = ioremap(BOARD_IO_ADDR(base), SZ_4K); @@ -178,16 +177,23 @@ int __init mxc_expio_init(u32 base, u32 p_irq)  	/*  	 * Configure INT line as GPIO input  	 */ -	gpio_request(MXC_IRQ_TO_GPIO(p_irq), "expio_pirq"); -	gpio_direction_input(MXC_IRQ_TO_GPIO(p_irq)); +	gpio_request(intr_gpio, "expio_pirq"); +	gpio_direction_input(intr_gpio);  	/* disable the interrupt and clear the status */  	__raw_writew(0, brd_io + INTR_MASK_REG);  	__raw_writew(0xFFFF, brd_io + INTR_RESET_REG);  	__raw_writew(0, brd_io + INTR_RESET_REG);  	__raw_writew(0x1F, brd_io + INTR_MASK_REG); -	for (i = MXC_EXP_IO_BASE; -	     i < (MXC_EXP_IO_BASE + MXC_MAX_EXP_IO_LINES); i++) { + +	irq_base = irq_alloc_descs(-1, 0, MXC_MAX_EXP_IO_LINES, numa_node_id()); +	WARN_ON(irq_base < 0); + +	domain = irq_domain_add_legacy(NULL, MXC_MAX_EXP_IO_LINES, irq_base, 0, +				       &irq_domain_simple_ops, NULL); +	WARN_ON(!domain); + +	for (i = irq_base; i < irq_base + MXC_MAX_EXP_IO_LINES; i++) {  		irq_set_chip_and_handler(i, &expio_irq_chip, handle_level_irq);  		set_irq_flags(i, IRQF_VALID);  	} @@ -199,6 +205,8 @@ int __init mxc_expio_init(u32 base, u32 p_irq)  	smsc911x_resources[0].start = LAN9217_BASE_ADDR(base);  	smsc911x_resources[0].end = LAN9217_BASE_ADDR(base) + 0x100 - 1; +	smsc911x_resources[1].start = irq_find_mapping(domain, EXPIO_INT_ENET); +	smsc911x_resources[1].end = irq_find_mapping(domain, EXPIO_INT_ENET);  	platform_device_register(&smsc_lan9217_device);  	return 0; diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig index c722f9ce691..baf9064c084 100644 --- a/arch/arm/plat-mxc/Kconfig +++ b/arch/arm/plat-mxc/Kconfig @@ -47,12 +47,6 @@ config MXC_TZIC  config MXC_AVIC  	bool -config MXC_PWM -	tristate "Enable PWM driver" -	select HAVE_PWM -	help -	  Enable support for the i.MX PWM controller(s). -  config MXC_DEBUG_BOARD  	bool "Enable MXC debug board(for 3-stack)"  	help diff --git a/arch/arm/plat-mxc/Makefile b/arch/arm/plat-mxc/Makefile index e81290c27c6..6ac72003115 100644 --- a/arch/arm/plat-mxc/Makefile +++ b/arch/arm/plat-mxc/Makefile @@ -11,11 +11,11 @@ obj-$(CONFIG_MXC_AVIC) += avic.o  obj-$(CONFIG_IMX_HAVE_IOMUX_V1) += iomux-v1.o  obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o  obj-$(CONFIG_IRAM_ALLOC) += iram_alloc.o -obj-$(CONFIG_MXC_PWM)  += pwm.o  obj-$(CONFIG_MXC_ULPI) += ulpi.o  obj-$(CONFIG_MXC_USE_EPIT) += epit.o  obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o  obj-$(CONFIG_CPU_FREQ_IMX)    += cpufreq.o +obj-$(CONFIG_CPU_IDLE) += cpuidle.o  ifdef CONFIG_SND_IMX_SOC  obj-y += ssi-fiq.o  obj-y += ssi-fiq-ksym.o diff --git a/arch/arm/plat-mxc/avic.c b/arch/arm/plat-mxc/avic.c index 689f81f9593..cbd55c36def 100644 --- a/arch/arm/plat-mxc/avic.c +++ b/arch/arm/plat-mxc/avic.c @@ -19,11 +19,14 @@  #include <linux/module.h>  #include <linux/irq.h> +#include <linux/irqdomain.h>  #include <linux/io.h> +#include <linux/of.h>  #include <mach/common.h>  #include <asm/mach/irq.h>  #include <asm/exception.h>  #include <mach/hardware.h> +#include <mach/irqs.h>  #include "irq-common.h" @@ -50,15 +53,19 @@  #define AVIC_NUM_IRQS 64  void __iomem *avic_base; +static struct irq_domain *domain;  static u32 avic_saved_mask_reg[2];  #ifdef CONFIG_MXC_IRQ_PRIOR  static int avic_irq_set_priority(unsigned char irq, unsigned char prio)  { +	struct irq_data *d = irq_get_irq_data(irq);  	unsigned int temp;  	unsigned int mask = 0x0F << irq % 8 * 4; +	irq = d->hwirq; +  	if (irq >= AVIC_NUM_IRQS)  		return -EINVAL; @@ -75,8 +82,11 @@ static int avic_irq_set_priority(unsigned char irq, unsigned char prio)  #ifdef CONFIG_FIQ  static int avic_set_irq_fiq(unsigned int irq, unsigned int type)  { +	struct irq_data *d = irq_get_irq_data(irq);  	unsigned int irqt; +	irq = d->hwirq; +  	if (irq >= AVIC_NUM_IRQS)  		return -EINVAL; @@ -108,7 +118,7 @@ static void avic_irq_suspend(struct irq_data *d)  {  	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);  	struct irq_chip_type *ct = gc->chip_types; -	int idx = gc->irq_base >> 5; +	int idx = d->hwirq >> 5;  	avic_saved_mask_reg[idx] = __raw_readl(avic_base + ct->regs.mask);  	__raw_writel(gc->wake_active, avic_base + ct->regs.mask); @@ -118,7 +128,7 @@ static void avic_irq_resume(struct irq_data *d)  {  	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);  	struct irq_chip_type *ct = gc->chip_types; -	int idx = gc->irq_base >> 5; +	int idx = d->hwirq >> 5;  	__raw_writel(avic_saved_mask_reg[idx], avic_base + ct->regs.mask);  } @@ -128,11 +138,10 @@ static void avic_irq_resume(struct irq_data *d)  #define avic_irq_resume NULL  #endif -static __init void avic_init_gc(unsigned int irq_start) +static __init void avic_init_gc(int idx, unsigned int irq_start)  {  	struct irq_chip_generic *gc;  	struct irq_chip_type *ct; -	int idx = irq_start >> 5;  	gc = irq_alloc_generic_chip("mxc-avic", 1, irq_start, avic_base,  				    handle_level_irq); @@ -161,7 +170,7 @@ asmlinkage void __exception_irq_entry avic_handle_irq(struct pt_regs *regs)  		if (nivector == 0xffff)  			break; -		handle_IRQ(nivector, regs); +		handle_IRQ(irq_find_mapping(domain, nivector), regs);  	} while (1);  } @@ -172,6 +181,8 @@ asmlinkage void __exception_irq_entry avic_handle_irq(struct pt_regs *regs)   */  void __init mxc_init_irq(void __iomem *irqbase)  { +	struct device_node *np; +	int irq_base;  	int i;  	avic_base = irqbase; @@ -190,8 +201,16 @@ void __init mxc_init_irq(void __iomem *irqbase)  	__raw_writel(0, avic_base + AVIC_INTTYPEH);  	__raw_writel(0, avic_base + AVIC_INTTYPEL); -	for (i = 0; i < AVIC_NUM_IRQS; i += 32) -		avic_init_gc(i); +	irq_base = irq_alloc_descs(-1, 0, AVIC_NUM_IRQS, numa_node_id()); +	WARN_ON(irq_base < 0); + +	np = of_find_compatible_node(NULL, NULL, "fsl,avic"); +	domain = irq_domain_add_legacy(np, AVIC_NUM_IRQS, irq_base, 0, +				       &irq_domain_simple_ops, NULL); +	WARN_ON(!domain); + +	for (i = 0; i < AVIC_NUM_IRQS / 32; i++, irq_base += 32) +		avic_init_gc(i, irq_base);  	/* Set default priority value (0) for all IRQ's */  	for (i = 0; i < 8; i++) @@ -199,7 +218,7 @@ void __init mxc_init_irq(void __iomem *irqbase)  #ifdef CONFIG_FIQ  	/* Initialize FIQ */ -	init_FIQ(); +	init_FIQ(FIQ_START);  #endif  	printk(KERN_INFO "MXC IRQ initialized\n"); diff --git a/arch/arm/plat-mxc/cpuidle.c b/arch/arm/plat-mxc/cpuidle.c new file mode 100644 index 00000000000..d4cb511a44a --- /dev/null +++ b/arch/arm/plat-mxc/cpuidle.c @@ -0,0 +1,80 @@ +/* + * Copyright 2012 Freescale Semiconductor, Inc. + * Copyright 2012 Linaro Ltd. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/cpuidle.h> +#include <linux/err.h> +#include <linux/hrtimer.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/slab.h> + +static struct cpuidle_device __percpu * imx_cpuidle_devices; + +static void __init imx_cpuidle_devices_uninit(void) +{ +	int cpu_id; +	struct cpuidle_device *dev; + +	for_each_possible_cpu(cpu_id) { +		dev = per_cpu_ptr(imx_cpuidle_devices, cpu_id); +		cpuidle_unregister_device(dev); +	} + +	free_percpu(imx_cpuidle_devices); +} + +int __init imx_cpuidle_init(struct cpuidle_driver *drv) +{ +	struct cpuidle_device *dev; +	int cpu_id, ret; + +	if (drv->state_count > CPUIDLE_STATE_MAX) { +		pr_err("%s: state_count exceeds maximum\n", __func__); +		return -EINVAL; +	} + +	ret = cpuidle_register_driver(drv); +	if (ret) { +		pr_err("%s: Failed to register cpuidle driver with error: %d\n", +			 __func__, ret); +		return ret; +	} + +	imx_cpuidle_devices = alloc_percpu(struct cpuidle_device); +	if (imx_cpuidle_devices == NULL) { +		ret = -ENOMEM; +		goto unregister_drv; +	} + +	/* initialize state data for each cpuidle_device */ +	for_each_possible_cpu(cpu_id) { +		dev = per_cpu_ptr(imx_cpuidle_devices, cpu_id); +		dev->cpu = cpu_id; +		dev->state_count = drv->state_count; + +		ret = cpuidle_register_device(dev); +		if (ret) { +			pr_err("%s: Failed to register cpu %u, error: %d\n", +				__func__, cpu_id, ret); +			goto uninit; +		} +	} + +	return 0; + +uninit: +	imx_cpuidle_devices_uninit(); + +unregister_drv: +	cpuidle_unregister_driver(drv); +	return ret; +} diff --git a/arch/arm/plat-mxc/devices/platform-ipu-core.c b/arch/arm/plat-mxc/devices/platform-ipu-core.c index 79d340ae0af..d1e33cc6f12 100644 --- a/arch/arm/plat-mxc/devices/platform-ipu-core.c +++ b/arch/arm/plat-mxc/devices/platform-ipu-core.c @@ -30,8 +30,7 @@ const struct imx_ipu_core_data imx35_ipu_core_data __initconst =  static struct platform_device *imx_ipu_coredev __initdata;  struct platform_device *__init imx_add_ipu_core( -		const struct imx_ipu_core_data *data, -		const struct ipu_platform_data *pdata) +		const struct imx_ipu_core_data *data)  {  	/* The resource order is important! */  	struct resource res[] = { @@ -55,7 +54,7 @@ struct platform_device *__init imx_add_ipu_core(  	};  	return imx_ipu_coredev = imx_add_platform_device("ipu-core", -1, -			res, ARRAY_SIZE(res), pdata, sizeof(*pdata)); +			res, ARRAY_SIZE(res), NULL, 0);  }  struct platform_device *__init imx_alloc_mx3_camera( diff --git a/arch/arm/plat-mxc/devices/platform-mxc_rtc.c b/arch/arm/plat-mxc/devices/platform-mxc_rtc.c index 16d0ec4df5f..a5c9ad5721c 100644 --- a/arch/arm/plat-mxc/devices/platform-mxc_rtc.c +++ b/arch/arm/plat-mxc/devices/platform-mxc_rtc.c @@ -20,6 +20,11 @@ const struct imx_mxc_rtc_data imx31_mxc_rtc_data __initconst =  	imx_mxc_rtc_data_entry_single(MX31);  #endif /* ifdef CONFIG_SOC_IMX31 */ +#ifdef CONFIG_SOC_IMX35 +const struct imx_mxc_rtc_data imx35_mxc_rtc_data __initconst = +	imx_mxc_rtc_data_entry_single(MX35); +#endif /* ifdef CONFIG_SOC_IMX35 */ +  struct platform_device *__init imx_add_mxc_rtc(  		const struct imx_mxc_rtc_data *data)  { diff --git a/arch/arm/plat-mxc/devices/platform-spi_imx.c b/arch/arm/plat-mxc/devices/platform-spi_imx.c index 9bfae8bd5b8..9c50c14c8f9 100644 --- a/arch/arm/plat-mxc/devices/platform-spi_imx.c +++ b/arch/arm/plat-mxc/devices/platform-spi_imx.c @@ -95,7 +95,7 @@ const struct imx_spi_imx_data imx51_ecspi_data[] __initconst = {  #ifdef CONFIG_SOC_IMX53  /* i.mx53 has the i.mx35 type cspi */  const struct imx_spi_imx_data imx53_cspi_data __initconst = -	imx_spi_imx_data_entry_single(MX53, CSPI, "imx35-cspi", 0, , SZ_4K); +	imx_spi_imx_data_entry_single(MX53, CSPI, "imx35-cspi", 2, , SZ_4K);  /* i.mx53 has the i.mx51 type ecspi */  const struct imx_spi_imx_data imx53_ecspi_data[] __initconst = { diff --git a/arch/arm/plat-mxc/include/mach/3ds_debugboard.h b/arch/arm/plat-mxc/include/mach/3ds_debugboard.h index a384fdd49c6..9fd6cb3f8fa 100644 --- a/arch/arm/plat-mxc/include/mach/3ds_debugboard.h +++ b/arch/arm/plat-mxc/include/mach/3ds_debugboard.h @@ -13,6 +13,6 @@  #ifndef __ASM_ARCH_MXC_3DS_DB_H__  #define __ASM_ARCH_MXC_3DS_DB_H__ -extern int __init mxc_expio_init(u32 base, u32 p_irq); +extern int __init mxc_expio_init(u32 base, u32 intr_gpio);  #endif /* __ASM_ARCH_MXC_3DS_DB_H__ */ diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index e429ca1b814..7128e971041 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h @@ -54,6 +54,7 @@ extern void imx50_soc_init(void);  extern void imx51_soc_init(void);  extern void imx53_soc_init(void);  extern void imx51_init_late(void); +extern void imx53_init_late(void);  extern void epit_timer_init(void __iomem *base, int irq);  extern void mxc_timer_init(void __iomem *, int);  extern int mx1_clocks_init(unsigned long fref); @@ -67,6 +68,7 @@ extern int mx51_clocks_init(unsigned long ckil, unsigned long osc,  extern int mx53_clocks_init(unsigned long ckil, unsigned long osc,  			unsigned long ckih1, unsigned long ckih2);  extern int mx27_clocks_init_dt(void); +extern int mx31_clocks_init_dt(void);  extern int mx51_clocks_init_dt(void);  extern int mx53_clocks_init_dt(void);  extern int mx6q_clocks_init(void); @@ -95,7 +97,6 @@ enum mx3_cpu_pwr_mode {  };  extern void mx3_cpu_lp_set(enum mx3_cpu_pwr_mode mode); -extern void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode);  extern void imx_print_silicon_rev(const char *cpu, int srev);  void avic_handle_irq(struct pt_regs *); @@ -146,8 +147,12 @@ extern void imx6q_clock_map_io(void);  #ifdef CONFIG_PM  extern void imx6q_pm_init(void); +extern void imx51_pm_init(void); +extern void imx53_pm_init(void);  #else  static inline void imx6q_pm_init(void) {} +static inline void imx51_pm_init(void) {} +static inline void imx53_pm_init(void) {}  #endif  #ifdef CONFIG_NEON diff --git a/arch/arm/plat-mxc/include/mach/cpuidle.h b/arch/arm/plat-mxc/include/mach/cpuidle.h new file mode 100644 index 00000000000..bc932d1af37 --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/cpuidle.h @@ -0,0 +1,22 @@ +/* + * Copyright 2012 Freescale Semiconductor, Inc. + * Copyright 2012 Linaro Ltd. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/cpuidle.h> + +#ifdef CONFIG_CPU_IDLE +extern int imx_cpuidle_init(struct cpuidle_driver *drv); +#else +static inline int imx_cpuidle_init(struct cpuidle_driver *drv) +{ +	return -ENODEV; +} +#endif diff --git a/arch/arm/plat-mxc/include/mach/devices-common.h b/arch/arm/plat-mxc/include/mach/devices-common.h index 1b2258daa05..a7f5bb1084d 100644 --- a/arch/arm/plat-mxc/include/mach/devices-common.h +++ b/arch/arm/plat-mxc/include/mach/devices-common.h @@ -183,7 +183,6 @@ struct platform_device *__init imx_add_imx_udc(  		const struct imx_imx_udc_data *data,  		const struct imxusb_platform_data *pdata); -#include <mach/ipu.h>  #include <mach/mx3fb.h>  #include <mach/mx3_camera.h>  struct imx_ipu_core_data { @@ -192,8 +191,7 @@ struct imx_ipu_core_data {  	resource_size_t errirq;  };  struct platform_device *__init imx_add_ipu_core( -		const struct imx_ipu_core_data *data, -		const struct ipu_platform_data *pdata); +		const struct imx_ipu_core_data *data);  struct platform_device *__init imx_alloc_mx3_camera(  		const struct imx_ipu_core_data *data,  		const struct mx3_camera_pdata *pdata); diff --git a/arch/arm/plat-mxc/include/mach/hardware.h b/arch/arm/plat-mxc/include/mach/hardware.h index 0630513554d..ebf10654bb4 100644 --- a/arch/arm/plat-mxc/include/mach/hardware.h +++ b/arch/arm/plat-mxc/include/mach/hardware.h @@ -50,7 +50,7 @@   *	IO	0x00200000+0x100000	->	0xf4000000+0x100000   * mx21:   *	AIPI	0x10000000+0x100000	->	0xf4400000+0x100000 - *	SAHB1	0x80000000+0x100000	->	0xf4000000+0x100000 + *	SAHB1	0x80000000+0x100000	->	0xf5000000+0x100000   *	X_MEMC	0xdf000000+0x004000	->	0xf5f00000+0x004000   * mx25:   *	AIPS1	0x43f00000+0x100000	->	0xf5300000+0x100000 @@ -58,47 +58,50 @@   *	AVIC	0x68000000+0x100000	->	0xf5800000+0x100000   * mx27:   *	AIPI	0x10000000+0x100000	->	0xf4400000+0x100000 - *	SAHB1	0x80000000+0x100000	->	0xf4000000+0x100000 + *	SAHB1	0x80000000+0x100000	->	0xf5000000+0x100000   *	X_MEMC	0xd8000000+0x100000	->	0xf5c00000+0x100000   * mx31:   *	AIPS1	0x43f00000+0x100000	->	0xf5300000+0x100000   *	AIPS2	0x53f00000+0x100000	->	0xf5700000+0x100000   *	AVIC	0x68000000+0x100000	->	0xf5800000+0x100000 - *	X_MEMC	0xb8000000+0x010000	->	0xf4c00000+0x010000 + *	X_MEMC	0xb8000000+0x010000	->	0xf5c00000+0x010000   *	SPBA0	0x50000000+0x100000	->	0xf5400000+0x100000   * mx35:   *	AIPS1	0x43f00000+0x100000	->	0xf5300000+0x100000   *	AIPS2	0x53f00000+0x100000	->	0xf5700000+0x100000   *	AVIC	0x68000000+0x100000	->	0xf5800000+0x100000 - *	X_MEMC	0xb8000000+0x010000	->	0xf4c00000+0x010000 + *	X_MEMC	0xb8000000+0x010000	->	0xf5c00000+0x010000   *	SPBA0	0x50000000+0x100000	->	0xf5400000+0x100000   * mx50:   *	TZIC	0x0fffc000+0x004000	->	0xf4bfc000+0x004000 - *	SPBA0	0x50000000+0x100000	->	0xf5400000+0x100000   *	AIPS1	0x53f00000+0x100000	->	0xf5700000+0x100000 + *	SPBA0	0x50000000+0x100000	->	0xf5400000+0x100000   *	AIPS2	0x63f00000+0x100000	->	0xf5300000+0x100000   * mx51: - *	TZIC	0xe0000000+0x004000	->	0xf5000000+0x004000 + *	TZIC	0x0fffc000+0x004000	->	0xf4bfc000+0x004000   *	IRAM	0x1ffe0000+0x020000	->	0xf4fe0000+0x020000 + *	DEBUG	0x60000000+0x100000	->	0xf5000000+0x100000   *	SPBA0	0x70000000+0x100000	->	0xf5400000+0x100000   *	AIPS1	0x73f00000+0x100000	->	0xf5700000+0x100000 - *	AIPS2	0x83f00000+0x100000	->	0xf4300000+0x100000 + *	AIPS2	0x83f00000+0x100000	->	0xf5300000+0x100000   * mx53:   *	TZIC	0x0fffc000+0x004000	->	0xf4bfc000+0x004000 + *	DEBUG	0x40000000+0x100000	->	0xf5000000+0x100000   *	SPBA0	0x50000000+0x100000	->	0xf5400000+0x100000   *	AIPS1	0x53f00000+0x100000	->	0xf5700000+0x100000   *	AIPS2	0x63f00000+0x100000	->	0xf5300000+0x100000   * mx6q: - *	SCU	0x00a00000+0x001000	->	0xf4000000+0x001000 + *	SCU	0x00a00000+0x004000	->	0xf4000000+0x004000   *	CCM	0x020c4000+0x004000	->	0xf42c4000+0x004000 - *	ANATOP	0x020c8000+0x001000	->	0xf42c8000+0x001000 + *	ANATOP	0x020c8000+0x004000	->	0xf42c8000+0x004000   *	UART4	0x021f0000+0x004000	->	0xf42f0000+0x004000   */  #define IMX_IO_P2V(x)	(						\ -			0xf4000000 +					\ +			(((x) & 0x80000000) >> 7) |			\ +			(0xf4000000 +					\  			(((x) & 0x50000000) >> 6) +			\  			(((x) & 0x0b000000) >> 4) +			\ -			(((x) & 0x000fffff))) +			(((x) & 0x000fffff))))  #define IMX_IO_ADDRESS(x)	IOMEM(IMX_IO_P2V(x)) @@ -128,6 +131,4 @@  /* range e.g. GPIO_1_5 is gpio 5 under linux */  #define IMX_GPIO_NR(bank, nr)		(((bank) - 1) * 32 + (nr)) -#define IMX_GPIO_TO_IRQ(gpio)	(MXC_GPIO_IRQ_START + (gpio)) -  #endif /* __ASM_ARCH_MXC_HARDWARE_H__ */ diff --git a/arch/arm/plat-mxc/include/mach/i2c.h b/arch/arm/plat-mxc/include/mach/i2c.h index 375cdd0cf87..8289d915e61 100644 --- a/arch/arm/plat-mxc/include/mach/i2c.h +++ b/arch/arm/plat-mxc/include/mach/i2c.h @@ -15,7 +15,7 @@   *   **/  struct imxi2c_platform_data { -	int bitrate; +	u32 bitrate;  };  #endif /* __ASM_ARCH_I2C_H_ */ diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx3.h b/arch/arm/plat-mxc/include/mach/iomux-mx3.h index 63f22a009a6..d8b65b51f2a 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-mx3.h +++ b/arch/arm/plat-mxc/include/mach/iomux-mx3.h @@ -160,9 +160,6 @@ int mxc_iomux_mode(unsigned int pin_mode);  #define IOMUX_TO_GPIO(iomux_pin) \  	((iomux_pin & IOMUX_GPIONUM_MASK) >> IOMUX_GPIONUM_SHIFT) -#define IOMUX_TO_IRQ(iomux_pin) \ -	(((iomux_pin & IOMUX_GPIONUM_MASK) >> IOMUX_GPIONUM_SHIFT) + \ -	MXC_GPIO_IRQ_START)  /*   * This enumeration is constructed based on the Section diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx51.h b/arch/arm/plat-mxc/include/mach/iomux-mx51.h index 36c8989d9de..2623e7a2e19 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-mx51.h +++ b/arch/arm/plat-mxc/include/mach/iomux-mx51.h @@ -107,11 +107,13 @@  #define MX51_PAD_EIM_D25__UART2_CTS		IOMUX_PAD(0x414, 0x080, 4, __NA_, 0, MX51_UART_PAD_CTRL)  #define MX51_PAD_EIM_D25__UART3_RXD		IOMUX_PAD(0x414, 0x080, 3, 0x9f4, 0, MX51_UART_PAD_CTRL)  #define MX51_PAD_EIM_D25__USBOTG_DATA1		IOMUX_PAD(0x414, 0x080, 2, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_EIM_D25__GPT_CMPOUT1		IOMUX_PAD(0x414, 0x080, 5, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_EIM_D26__EIM_D26		IOMUX_PAD(0x418, 0x084, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_EIM_D26__KEY_COL7		IOMUX_PAD(0x418, 0x084, 1, 0x9cc, 0, NO_PAD_CTRL)  #define MX51_PAD_EIM_D26__UART2_RTS		IOMUX_PAD(0x418, 0x084, 4, 0x9e8, 3, MX51_UART_PAD_CTRL)  #define MX51_PAD_EIM_D26__UART3_TXD		IOMUX_PAD(0x418, 0x084, 3, __NA_, 0, MX51_UART_PAD_CTRL)  #define MX51_PAD_EIM_D26__USBOTG_DATA2		IOMUX_PAD(0x418, 0x084, 2, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_EIM_D26__GPT_CMPOUT2		IOMUX_PAD(0x418, 0x084, 5, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_EIM_D27__AUD6_RXC		IOMUX_PAD(0x41c, 0x088, 5, 0x8f4, 0, NO_PAD_CTRL)  #define MX51_PAD_EIM_D27__EIM_D27		IOMUX_PAD(0x41c, 0x088, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_EIM_D27__GPIO2_9		IOMUX_PAD(0x41c, 0x088, 1, __NA_, 0, MX51_GPIO_PAD_CTRL) @@ -228,6 +230,7 @@  #define MX51_PAD_EIM_CRE__EIM_CRE		IOMUX_PAD(0x4a0, 0x100, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_EIM_CRE__GPIO3_2		IOMUX_PAD(0x4a0, 0x100, 1, 0x97c, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_DRAM_CS1__DRAM_CS1		IOMUX_PAD(0x4d0, 0x104, 0, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_DRAM_CS1__CCM_CLKO		IOMUX_PAD(0x4d0, 0x104, 1, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_WE_B__GPIO3_3		IOMUX_PAD(0x4e4, 0x108, 3, 0x980, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_NANDF_WE_B__NANDF_WE_B		IOMUX_PAD(0x4e4, 0x108, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_WE_B__PATA_DIOW		IOMUX_PAD(0x4e4, 0x108, 1, __NA_, 0, NO_PAD_CTRL) @@ -256,12 +259,14 @@  #define MX51_PAD_NANDF_RB1__GPIO3_9		IOMUX_PAD(0x4fc, 0x120, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_NANDF_RB1__NANDF_RB1		IOMUX_PAD(0x4fc, 0x120, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_RB1__PATA_IORDY		IOMUX_PAD(0x4fc, 0x120, 1, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_NANDF_RB1__GPT_CMPOUT2		IOMUX_PAD(0x4fc, 0x120, 4, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_RB1__SD4_CMD		IOMUX_PAD(0x4fc, 0x120, 0x15, __NA_, 0, MX51_SDHCI_PAD_CTRL)  #define MX51_PAD_NANDF_RB2__DISP2_WAIT		IOMUX_PAD(0x500, 0x124, 5, 0x9a8, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_RB2__ECSPI2_SCLK		IOMUX_PAD(0x500, 0x124, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)  #define MX51_PAD_NANDF_RB2__FEC_COL		IOMUX_PAD(0x500, 0x124, 1, 0x94c, 0, MX51_PAD_CTRL_2)  #define MX51_PAD_NANDF_RB2__GPIO3_10		IOMUX_PAD(0x500, 0x124, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_NANDF_RB2__NANDF_RB2		IOMUX_PAD(0x500, 0x124, 0, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_NANDF_RB2__GPT_CMPOUT3		IOMUX_PAD(0x500, 0x124, 4, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_RB2__USBH3_H3_DP		IOMUX_PAD(0x500, 0x124, 0x17, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_RB2__USBH3_NXT		IOMUX_PAD(0x500, 0x124, 6, 0xa20, 0, NO_PAD_CTRL)  #define MX51_PAD_NANDF_RB3__DISP1_WAIT		IOMUX_PAD(0x504, 0x128, 5, __NA_, 0, NO_PAD_CTRL) @@ -637,7 +642,9 @@  #define MX51_PAD_DISP1_DAT23__DISP2_DAT17	IOMUX_PAD(0x728, 0x328, 5, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_DISP1_DAT23__DISP2_SER_CS	IOMUX_PAD(0x728, 0x328, 4, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_DI1_PIN3__DI1_PIN3		IOMUX_PAD(0x72c, 0x32c, 0, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_DI1_DISP_CLK__DI1_DISP_CLK	IOMUX_PAD(0x730, __NA_, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_DI1_PIN2__DI1_PIN2		IOMUX_PAD(0x734, 0x330, 0, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_DI1_PIN15__DI1_PIN15		IOMUX_PAD(0x738, __NA_, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_DI_GP2__DISP1_SER_CLK		IOMUX_PAD(0x740, 0x338, 0, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_DI_GP2__DISP2_WAIT		IOMUX_PAD(0x740, 0x338, 2, 0x9a8, 1, NO_PAD_CTRL)  #define MX51_PAD_DI_GP3__CSI1_DATA_EN		IOMUX_PAD(0x744, 0x33c, 3, 0x9a0, 1, NO_PAD_CTRL) @@ -780,6 +787,8 @@  #define MX51_PAD_GPIO1_2__PWM1_PWMO		IOMUX_PAD(0x7d4, 0x3cc, 1, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_3__GPIO1_3		IOMUX_PAD(0x7d8, 0x3d0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_GPIO1_3__I2C2_SDA		IOMUX_PAD(0x7d8, 0x3d0, 0x12, 0x9bc, 3, MX51_I2C_PAD_CTRL) +#define MX51_PAD_GPIO1_3__CCM_CLKO2		IOMUX_PAD(0x7d8, 0x3d0, 5, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_GPIO1_3__GPT_CLKIN		IOMUX_PAD(0x7d8, 0x3d0, 6, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_3__PLL2_BYP		IOMUX_PAD(0x7d8, 0x3d0, 7, 0x910, 1, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_3__PWM2_PWMO		IOMUX_PAD(0x7d8, 0x3d0, 1, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_PMIC_INT_REQ__PMIC_INT_REQ	IOMUX_PAD(0x7fc, 0x3d4, 0, __NA_, 0, NO_PAD_CTRL) @@ -788,13 +797,16 @@  #define MX51_PAD_GPIO1_4__EIM_RDY		IOMUX_PAD(0x804, 0x3d8, 3, 0x938, 1, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_4__GPIO1_4		IOMUX_PAD(0x804, 0x3d8, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_GPIO1_4__WDOG1_WDOG_B		IOMUX_PAD(0x804, 0x3d8, 2, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_GPIO1_4__GPT_CAPIN1		IOMUX_PAD(0x804, 0x3d8, 6, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_5__CSI2_MCLK		IOMUX_PAD(0x808, 0x3dc, 6, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_5__DISP2_PIN16		IOMUX_PAD(0x808, 0x3dc, 3, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_5__GPIO1_5		IOMUX_PAD(0x808, 0x3dc, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_GPIO1_5__WDOG2_WDOG_B		IOMUX_PAD(0x808, 0x3dc, 2, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_GPIO1_5__CCM_CLKO		IOMUX_PAD(0x808, 0x3dc, 5, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_6__DISP2_PIN17		IOMUX_PAD(0x80c, 0x3e0, 4, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_6__GPIO1_6		IOMUX_PAD(0x80c, 0x3e0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_GPIO1_6__REF_EN_B		IOMUX_PAD(0x80c, 0x3e0, 3, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_GPIO1_6__GPT_CAPIN2		IOMUX_PAD(0x80c, 0x3e0, 6, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_7__CCM_OUT_0		IOMUX_PAD(0x810, 0x3e4, 3, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_7__GPIO1_7		IOMUX_PAD(0x810, 0x3e4, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_GPIO1_7__SD2_WP		IOMUX_PAD(0x810, 0x3e4, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL) @@ -803,11 +815,13 @@  #define MX51_PAD_GPIO1_8__GPIO1_8		IOMUX_PAD(0x814, 0x3e8, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_GPIO1_8__SD2_CD		IOMUX_PAD(0x814, 0x3e8, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL)  #define MX51_PAD_GPIO1_8__USBH3_PWR		IOMUX_PAD(0x814, 0x3e8, 1, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_GPIO1_8__CCM_CLKO2		IOMUX_PAD(0x814, 0x3e8, 4, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_9__CCM_OUT_1		IOMUX_PAD(0x818, 0x3ec, 3, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_9__DISP2_D1_CS		IOMUX_PAD(0x818, 0x3ec, 2, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_9__DISP2_SER_CS		IOMUX_PAD(0x818, 0x3ec, 7, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_9__GPIO1_9		IOMUX_PAD(0x818, 0x3ec, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)  #define MX51_PAD_GPIO1_9__SD2_LCTL		IOMUX_PAD(0x818, 0x3ec, 6, __NA_, 0, NO_PAD_CTRL)  #define MX51_PAD_GPIO1_9__USBH3_OC		IOMUX_PAD(0x818, 0x3ec, 1, __NA_, 0, NO_PAD_CTRL) +#define MX51_PAD_GPIO1_9__CCM_CLKO		IOMUX_PAD(0x818, 0x3ec, 4, __NA_, 0, NO_PAD_CTRL)  #endif /* __MACH_IOMUX_MX51_H__ */ diff --git a/arch/arm/plat-mxc/include/mach/iomux-v1.h b/arch/arm/plat-mxc/include/mach/iomux-v1.h index f7d18046c04..02651a40fe2 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-v1.h +++ b/arch/arm/plat-mxc/include/mach/iomux-v1.h @@ -85,13 +85,6 @@  #define GPIO_BOUT_0	(2 << GPIO_BOUT_SHIFT)  #define GPIO_BOUT_1	(3 << GPIO_BOUT_SHIFT) -#define IRQ_GPIOA(x)  (MXC_GPIO_IRQ_START + x) -#define IRQ_GPIOB(x)  (IRQ_GPIOA(32) + x) -#define IRQ_GPIOC(x)  (IRQ_GPIOB(32) + x) -#define IRQ_GPIOD(x)  (IRQ_GPIOC(32) + x) -#define IRQ_GPIOE(x)  (IRQ_GPIOD(32) + x) -#define IRQ_GPIOF(x)  (IRQ_GPIOE(32) + x) -  extern int mxc_gpio_mode(int gpio_mode);  extern int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,  		const char *label); diff --git a/arch/arm/plat-mxc/include/mach/ipu.h b/arch/arm/plat-mxc/include/mach/ipu.h index a9221f1cc1a..539e559d18b 100644 --- a/arch/arm/plat-mxc/include/mach/ipu.h +++ b/arch/arm/plat-mxc/include/mach/ipu.h @@ -110,10 +110,6 @@ enum ipu_rotate_mode {  	IPU_ROTATE_90_LEFT = 7,  }; -struct ipu_platform_data { -	unsigned int	irq_base; -}; -  /*   * Enumeration of DI ports for ADC.   */ diff --git a/arch/arm/plat-mxc/include/mach/irqs.h b/arch/arm/plat-mxc/include/mach/irqs.h index fd9efb04465..d73f5e8ea9c 100644 --- a/arch/arm/plat-mxc/include/mach/irqs.h +++ b/arch/arm/plat-mxc/include/mach/irqs.h @@ -11,50 +11,6 @@  #ifndef __ASM_ARCH_MXC_IRQS_H__  #define __ASM_ARCH_MXC_IRQS_H__ -#include <asm-generic/gpio.h> - -/* - * SoCs with GIC interrupt controller have 160 IRQs, those with TZIC - * have 128 IRQs, and those with AVIC have 64. - * - * To support single image, the biggest number should be defined on - * top of the list. - */ -#if defined CONFIG_ARM_GIC -#define MXC_INTERNAL_IRQS	160 -#elif defined CONFIG_MXC_TZIC -#define MXC_INTERNAL_IRQS	128 -#else -#define MXC_INTERNAL_IRQS	64 -#endif - -#define MXC_GPIO_IRQ_START	MXC_INTERNAL_IRQS - -/* - * The next 16 interrupts are for board specific purposes.  Since - * the kernel can only run on one machine at a time, we can re-use - * these.  If you need more, increase MXC_BOARD_IRQS, but keep it - * within sensible limits. - */ -#define MXC_BOARD_IRQ_START	(MXC_INTERNAL_IRQS + ARCH_NR_GPIOS) - -#ifdef CONFIG_MACH_MX31ADS_WM1133_EV1 -#define MXC_BOARD_IRQS  80 -#else -#define MXC_BOARD_IRQS	16 -#endif - -#define MXC_IPU_IRQ_START	(MXC_BOARD_IRQ_START + MXC_BOARD_IRQS) - -#ifdef CONFIG_MX3_IPU_IRQS -#define MX3_IPU_IRQS CONFIG_MX3_IPU_IRQS -#else -#define MX3_IPU_IRQS 0 -#endif -/* REVISIT: Add IPU irqs on IMX51 */ - -#define NR_IRQS			(MXC_IPU_IRQ_START + MX3_IPU_IRQS) -  extern int imx_irq_set_priority(unsigned char irq, unsigned char prio);  /* all normal IRQs can be FIQs */ diff --git a/arch/arm/plat-mxc/include/mach/mx1.h b/arch/arm/plat-mxc/include/mach/mx1.h index 2b7c08d13e8..45bd31cc34d 100644 --- a/arch/arm/plat-mxc/include/mach/mx1.h +++ b/arch/arm/plat-mxc/include/mach/mx1.h @@ -78,61 +78,62 @@  #define MX1_IO_ADDRESS(x)		IOMEM(MX1_IO_P2V(x))  /* fixed interrput numbers */ -#define MX1_INT_SOFTINT		0 -#define MX1_INT_CSI		6 -#define MX1_DSPA_MAC_INT	7 -#define MX1_DSPA_INT		8 -#define MX1_COMP_INT		9 -#define MX1_MSHC_XINT		10 -#define MX1_GPIO_INT_PORTA	11 -#define MX1_GPIO_INT_PORTB	12 -#define MX1_GPIO_INT_PORTC	13 -#define MX1_INT_LCDC		14 -#define MX1_SIM_INT		15 -#define MX1_SIM_DATA_INT	16 -#define MX1_RTC_INT		17 -#define MX1_RTC_SAMINT		18 -#define MX1_INT_UART2PFERR	19 -#define MX1_INT_UART2RTS	20 -#define MX1_INT_UART2DTR	21 -#define MX1_INT_UART2UARTC	22 -#define MX1_INT_UART2TX		23 -#define MX1_INT_UART2RX		24 -#define MX1_INT_UART1PFERR	25 -#define MX1_INT_UART1RTS	26 -#define MX1_INT_UART1DTR	27 -#define MX1_INT_UART1UARTC	28 -#define MX1_INT_UART1TX		29 -#define MX1_INT_UART1RX		30 -#define MX1_VOICE_DAC_INT	31 -#define MX1_VOICE_ADC_INT	32 -#define MX1_PEN_DATA_INT	33 -#define MX1_PWM_INT		34 -#define MX1_SDHC_INT		35 -#define MX1_INT_I2C		39 -#define MX1_INT_CSPI2		40 -#define MX1_INT_CSPI1		41 -#define MX1_SSI_TX_INT		42 -#define MX1_SSI_TX_ERR_INT	43 -#define MX1_SSI_RX_INT		44 -#define MX1_SSI_RX_ERR_INT	45 -#define MX1_TOUCH_INT		46 -#define MX1_INT_USBD0		47 -#define MX1_INT_USBD1		48 -#define MX1_INT_USBD2		49 -#define MX1_INT_USBD3		50 -#define MX1_INT_USBD4		51 -#define MX1_INT_USBD5		52 -#define MX1_INT_USBD6		53 -#define MX1_BTSYS_INT		55 -#define MX1_BTTIM_INT		56 -#define MX1_BTWUI_INT		57 -#define MX1_TIM2_INT		58 -#define MX1_TIM1_INT		59 -#define MX1_DMA_ERR		60 -#define MX1_DMA_INT		61 -#define MX1_GPIO_INT_PORTD	62 -#define MX1_WDT_INT		63 +#include <asm/irq.h> +#define MX1_INT_SOFTINT		(NR_IRQS_LEGACY + 0) +#define MX1_INT_CSI		(NR_IRQS_LEGACY + 6) +#define MX1_DSPA_MAC_INT	(NR_IRQS_LEGACY + 7) +#define MX1_DSPA_INT		(NR_IRQS_LEGACY + 8) +#define MX1_COMP_INT		(NR_IRQS_LEGACY + 9) +#define MX1_MSHC_XINT		(NR_IRQS_LEGACY + 10) +#define MX1_GPIO_INT_PORTA	(NR_IRQS_LEGACY + 11) +#define MX1_GPIO_INT_PORTB	(NR_IRQS_LEGACY + 12) +#define MX1_GPIO_INT_PORTC	(NR_IRQS_LEGACY + 13) +#define MX1_INT_LCDC		(NR_IRQS_LEGACY + 14) +#define MX1_SIM_INT		(NR_IRQS_LEGACY + 15) +#define MX1_SIM_DATA_INT	(NR_IRQS_LEGACY + 16) +#define MX1_RTC_INT		(NR_IRQS_LEGACY + 17) +#define MX1_RTC_SAMINT		(NR_IRQS_LEGACY + 18) +#define MX1_INT_UART2PFERR	(NR_IRQS_LEGACY + 19) +#define MX1_INT_UART2RTS	(NR_IRQS_LEGACY + 20) +#define MX1_INT_UART2DTR	(NR_IRQS_LEGACY + 21) +#define MX1_INT_UART2UARTC	(NR_IRQS_LEGACY + 22) +#define MX1_INT_UART2TX		(NR_IRQS_LEGACY + 23) +#define MX1_INT_UART2RX		(NR_IRQS_LEGACY + 24) +#define MX1_INT_UART1PFERR	(NR_IRQS_LEGACY + 25) +#define MX1_INT_UART1RTS	(NR_IRQS_LEGACY + 26) +#define MX1_INT_UART1DTR	(NR_IRQS_LEGACY + 27) +#define MX1_INT_UART1UARTC	(NR_IRQS_LEGACY + 28) +#define MX1_INT_UART1TX		(NR_IRQS_LEGACY + 29) +#define MX1_INT_UART1RX		(NR_IRQS_LEGACY + 30) +#define MX1_VOICE_DAC_INT	(NR_IRQS_LEGACY + 31) +#define MX1_VOICE_ADC_INT	(NR_IRQS_LEGACY + 32) +#define MX1_PEN_DATA_INT	(NR_IRQS_LEGACY + 33) +#define MX1_PWM_INT		(NR_IRQS_LEGACY + 34) +#define MX1_SDHC_INT		(NR_IRQS_LEGACY + 35) +#define MX1_INT_I2C		(NR_IRQS_LEGACY + 39) +#define MX1_INT_CSPI2		(NR_IRQS_LEGACY + 40) +#define MX1_INT_CSPI1		(NR_IRQS_LEGACY + 41) +#define MX1_SSI_TX_INT		(NR_IRQS_LEGACY + 42) +#define MX1_SSI_TX_ERR_INT	(NR_IRQS_LEGACY + 43) +#define MX1_SSI_RX_INT		(NR_IRQS_LEGACY + 44) +#define MX1_SSI_RX_ERR_INT	(NR_IRQS_LEGACY + 45) +#define MX1_TOUCH_INT		(NR_IRQS_LEGACY + 46) +#define MX1_INT_USBD0		(NR_IRQS_LEGACY + 47) +#define MX1_INT_USBD1		(NR_IRQS_LEGACY + 48) +#define MX1_INT_USBD2		(NR_IRQS_LEGACY + 49) +#define MX1_INT_USBD3		(NR_IRQS_LEGACY + 50) +#define MX1_INT_USBD4		(NR_IRQS_LEGACY + 51) +#define MX1_INT_USBD5		(NR_IRQS_LEGACY + 52) +#define MX1_INT_USBD6		(NR_IRQS_LEGACY + 53) +#define MX1_BTSYS_INT		(NR_IRQS_LEGACY + 55) +#define MX1_BTTIM_INT		(NR_IRQS_LEGACY + 56) +#define MX1_BTWUI_INT		(NR_IRQS_LEGACY + 57) +#define MX1_TIM2_INT		(NR_IRQS_LEGACY + 58) +#define MX1_TIM1_INT		(NR_IRQS_LEGACY + 59) +#define MX1_DMA_ERR		(NR_IRQS_LEGACY + 60) +#define MX1_DMA_INT		(NR_IRQS_LEGACY + 61) +#define MX1_GPIO_INT_PORTD	(NR_IRQS_LEGACY + 62) +#define MX1_WDT_INT		(NR_IRQS_LEGACY + 63)  /* DMA */  #define MX1_DMA_REQ_UART3_T		2 diff --git a/arch/arm/plat-mxc/include/mach/mx21.h b/arch/arm/plat-mxc/include/mach/mx21.h index 6cd049ebbd8..468738aa997 100644 --- a/arch/arm/plat-mxc/include/mach/mx21.h +++ b/arch/arm/plat-mxc/include/mach/mx21.h @@ -99,59 +99,60 @@  #define MX21_IO_ADDRESS(x)		IOMEM(MX21_IO_P2V(x))  /* fixed interrupt numbers */ -#define MX21_INT_CSPI3		6 -#define MX21_INT_GPIO		8 -#define MX21_INT_FIRI		9 -#define MX21_INT_SDHC2		10 -#define MX21_INT_SDHC1		11 -#define MX21_INT_I2C		12 -#define MX21_INT_SSI2		13 -#define MX21_INT_SSI1		14 -#define MX21_INT_CSPI2		15 -#define MX21_INT_CSPI1		16 -#define MX21_INT_UART4		17 -#define MX21_INT_UART3		18 -#define MX21_INT_UART2		19 -#define MX21_INT_UART1		20 -#define MX21_INT_KPP		21 -#define MX21_INT_RTC		22 -#define MX21_INT_PWM		23 -#define MX21_INT_GPT3		24 -#define MX21_INT_GPT2		25 -#define MX21_INT_GPT1		26 -#define MX21_INT_WDOG		27 -#define MX21_INT_PCMCIA		28 -#define MX21_INT_NFC		29 -#define MX21_INT_BMI		30 -#define MX21_INT_CSI		31 -#define MX21_INT_DMACH0		32 -#define MX21_INT_DMACH1		33 -#define MX21_INT_DMACH2		34 -#define MX21_INT_DMACH3		35 -#define MX21_INT_DMACH4		36 -#define MX21_INT_DMACH5		37 -#define MX21_INT_DMACH6		38 -#define MX21_INT_DMACH7		39 -#define MX21_INT_DMACH8		40 -#define MX21_INT_DMACH9		41 -#define MX21_INT_DMACH10	42 -#define MX21_INT_DMACH11	43 -#define MX21_INT_DMACH12	44 -#define MX21_INT_DMACH13	45 -#define MX21_INT_DMACH14	46 -#define MX21_INT_DMACH15	47 -#define MX21_INT_EMMAENC	49 -#define MX21_INT_EMMADEC	50 -#define MX21_INT_EMMAPRP	51 -#define MX21_INT_EMMAPP		52 -#define MX21_INT_USBWKUP	53 -#define MX21_INT_USBDMA		54 -#define MX21_INT_USBHOST	55 -#define MX21_INT_USBFUNC	56 -#define MX21_INT_USBMNP		57 -#define MX21_INT_USBCTRL	58 -#define MX21_INT_SLCDC		60 -#define MX21_INT_LCDC		61 +#include <asm/irq.h> +#define MX21_INT_CSPI3		(NR_IRQS_LEGACY + 6) +#define MX21_INT_GPIO		(NR_IRQS_LEGACY + 8) +#define MX21_INT_FIRI		(NR_IRQS_LEGACY + 9) +#define MX21_INT_SDHC2		(NR_IRQS_LEGACY + 10) +#define MX21_INT_SDHC1		(NR_IRQS_LEGACY + 11) +#define MX21_INT_I2C		(NR_IRQS_LEGACY + 12) +#define MX21_INT_SSI2		(NR_IRQS_LEGACY + 13) +#define MX21_INT_SSI1		(NR_IRQS_LEGACY + 14) +#define MX21_INT_CSPI2		(NR_IRQS_LEGACY + 15) +#define MX21_INT_CSPI1		(NR_IRQS_LEGACY + 16) +#define MX21_INT_UART4		(NR_IRQS_LEGACY + 17) +#define MX21_INT_UART3		(NR_IRQS_LEGACY + 18) +#define MX21_INT_UART2		(NR_IRQS_LEGACY + 19) +#define MX21_INT_UART1		(NR_IRQS_LEGACY + 20) +#define MX21_INT_KPP		(NR_IRQS_LEGACY + 21) +#define MX21_INT_RTC		(NR_IRQS_LEGACY + 22) +#define MX21_INT_PWM		(NR_IRQS_LEGACY + 23) +#define MX21_INT_GPT3		(NR_IRQS_LEGACY + 24) +#define MX21_INT_GPT2		(NR_IRQS_LEGACY + 25) +#define MX21_INT_GPT1		(NR_IRQS_LEGACY + 26) +#define MX21_INT_WDOG		(NR_IRQS_LEGACY + 27) +#define MX21_INT_PCMCIA		(NR_IRQS_LEGACY + 28) +#define MX21_INT_NFC		(NR_IRQS_LEGACY + 29) +#define MX21_INT_BMI		(NR_IRQS_LEGACY + 30) +#define MX21_INT_CSI		(NR_IRQS_LEGACY + 31) +#define MX21_INT_DMACH0		(NR_IRQS_LEGACY + 32) +#define MX21_INT_DMACH1		(NR_IRQS_LEGACY + 33) +#define MX21_INT_DMACH2		(NR_IRQS_LEGACY + 34) +#define MX21_INT_DMACH3		(NR_IRQS_LEGACY + 35) +#define MX21_INT_DMACH4		(NR_IRQS_LEGACY + 36) +#define MX21_INT_DMACH5		(NR_IRQS_LEGACY + 37) +#define MX21_INT_DMACH6		(NR_IRQS_LEGACY + 38) +#define MX21_INT_DMACH7		(NR_IRQS_LEGACY + 39) +#define MX21_INT_DMACH8		(NR_IRQS_LEGACY + 40) +#define MX21_INT_DMACH9		(NR_IRQS_LEGACY + 41) +#define MX21_INT_DMACH10	(NR_IRQS_LEGACY + 42) +#define MX21_INT_DMACH11	(NR_IRQS_LEGACY + 43) +#define MX21_INT_DMACH12	(NR_IRQS_LEGACY + 44) +#define MX21_INT_DMACH13	(NR_IRQS_LEGACY + 45) +#define MX21_INT_DMACH14	(NR_IRQS_LEGACY + 46) +#define MX21_INT_DMACH15	(NR_IRQS_LEGACY + 47) +#define MX21_INT_EMMAENC	(NR_IRQS_LEGACY + 49) +#define MX21_INT_EMMADEC	(NR_IRQS_LEGACY + 50) +#define MX21_INT_EMMAPRP	(NR_IRQS_LEGACY + 51) +#define MX21_INT_EMMAPP		(NR_IRQS_LEGACY + 52) +#define MX21_INT_USBWKUP	(NR_IRQS_LEGACY + 53) +#define MX21_INT_USBDMA		(NR_IRQS_LEGACY + 54) +#define MX21_INT_USBHOST	(NR_IRQS_LEGACY + 55) +#define MX21_INT_USBFUNC	(NR_IRQS_LEGACY + 56) +#define MX21_INT_USBMNP		(NR_IRQS_LEGACY + 57) +#define MX21_INT_USBCTRL	(NR_IRQS_LEGACY + 58) +#define MX21_INT_SLCDC		(NR_IRQS_LEGACY + 60) +#define MX21_INT_LCDC		(NR_IRQS_LEGACY + 61)  /* fixed DMA request numbers */  #define MX21_DMA_REQ_CSPI3_RX	1 diff --git a/arch/arm/plat-mxc/include/mach/mx25.h b/arch/arm/plat-mxc/include/mach/mx25.h index ccebf5ba12f..627d94f1b01 100644 --- a/arch/arm/plat-mxc/include/mach/mx25.h +++ b/arch/arm/plat-mxc/include/mach/mx25.h @@ -61,40 +61,44 @@  #define MX25_IO_P2V(x)			IMX_IO_P2V(x)  #define MX25_IO_ADDRESS(x)		IOMEM(MX25_IO_P2V(x)) -#define MX25_INT_CSPI3		0 -#define MX25_INT_I2C1		3 -#define MX25_INT_I2C2		4 -#define MX25_INT_UART4		5 -#define MX25_INT_ESDHC2		8 -#define MX25_INT_ESDHC1		9 -#define MX25_INT_I2C3		10 -#define MX25_INT_SSI2		11 -#define MX25_INT_SSI1		12 -#define MX25_INT_CSPI2		13 -#define MX25_INT_CSPI1		14 -#define MX25_INT_GPIO3		16 -#define MX25_INT_CSI		17 -#define MX25_INT_UART3		18 -#define MX25_INT_GPIO4		23 -#define MX25_INT_KPP		24 -#define MX25_INT_DRYICE		25 -#define MX25_INT_PWM1		26 -#define MX25_INT_UART2		32 -#define MX25_INT_NFC		33 -#define MX25_INT_SDMA		34 -#define MX25_INT_USB_HS		35 -#define MX25_INT_PWM2		36 -#define MX25_INT_USB_OTG	37 -#define MX25_INT_LCDC		39 -#define MX25_INT_UART5		40 -#define MX25_INT_PWM3		41 -#define MX25_INT_PWM4		42 -#define MX25_INT_CAN1		43 -#define MX25_INT_CAN2		44 -#define MX25_INT_UART1		45 -#define MX25_INT_GPIO2		51 -#define MX25_INT_GPIO1		52 -#define MX25_INT_FEC		57 +/* + * Interrupt numbers + */ +#include <asm/irq.h> +#define MX25_INT_CSPI3		(NR_IRQS_LEGACY + 0) +#define MX25_INT_I2C1		(NR_IRQS_LEGACY + 3) +#define MX25_INT_I2C2		(NR_IRQS_LEGACY + 4) +#define MX25_INT_UART4		(NR_IRQS_LEGACY + 5) +#define MX25_INT_ESDHC2		(NR_IRQS_LEGACY + 8) +#define MX25_INT_ESDHC1		(NR_IRQS_LEGACY + 9) +#define MX25_INT_I2C3		(NR_IRQS_LEGACY + 10) +#define MX25_INT_SSI2		(NR_IRQS_LEGACY + 11) +#define MX25_INT_SSI1		(NR_IRQS_LEGACY + 12) +#define MX25_INT_CSPI2		(NR_IRQS_LEGACY + 13) +#define MX25_INT_CSPI1		(NR_IRQS_LEGACY + 14) +#define MX25_INT_GPIO3		(NR_IRQS_LEGACY + 16) +#define MX25_INT_CSI		(NR_IRQS_LEGACY + 17) +#define MX25_INT_UART3		(NR_IRQS_LEGACY + 18) +#define MX25_INT_GPIO4		(NR_IRQS_LEGACY + 23) +#define MX25_INT_KPP		(NR_IRQS_LEGACY + 24) +#define MX25_INT_DRYICE		(NR_IRQS_LEGACY + 25) +#define MX25_INT_PWM1		(NR_IRQS_LEGACY + 26) +#define MX25_INT_UART2		(NR_IRQS_LEGACY + 32) +#define MX25_INT_NFC		(NR_IRQS_LEGACY + 33) +#define MX25_INT_SDMA		(NR_IRQS_LEGACY + 34) +#define MX25_INT_USB_HS		(NR_IRQS_LEGACY + 35) +#define MX25_INT_PWM2		(NR_IRQS_LEGACY + 36) +#define MX25_INT_USB_OTG	(NR_IRQS_LEGACY + 37) +#define MX25_INT_LCDC		(NR_IRQS_LEGACY + 39) +#define MX25_INT_UART5		(NR_IRQS_LEGACY + 40) +#define MX25_INT_PWM3		(NR_IRQS_LEGACY + 41) +#define MX25_INT_PWM4		(NR_IRQS_LEGACY + 42) +#define MX25_INT_CAN1		(NR_IRQS_LEGACY + 43) +#define MX25_INT_CAN2		(NR_IRQS_LEGACY + 44) +#define MX25_INT_UART1		(NR_IRQS_LEGACY + 45) +#define MX25_INT_GPIO2		(NR_IRQS_LEGACY + 51) +#define MX25_INT_GPIO1		(NR_IRQS_LEGACY + 52) +#define MX25_INT_FEC		(NR_IRQS_LEGACY + 57)  #define MX25_DMA_REQ_SSI2_RX1	22  #define MX25_DMA_REQ_SSI2_TX1	23 diff --git a/arch/arm/plat-mxc/include/mach/mx27.h b/arch/arm/plat-mxc/include/mach/mx27.h index 6265357284d..e074616d54c 100644 --- a/arch/arm/plat-mxc/include/mach/mx27.h +++ b/arch/arm/plat-mxc/include/mach/mx27.h @@ -128,69 +128,70 @@  #define MX27_IO_ADDRESS(x)		IOMEM(MX27_IO_P2V(x))  /* fixed interrupt numbers */ -#define MX27_INT_I2C2		1 -#define MX27_INT_GPT6		2 -#define MX27_INT_GPT5		3 -#define MX27_INT_GPT4		4 -#define MX27_INT_RTIC		5 -#define MX27_INT_CSPI3		6 -#define MX27_INT_SDHC		7 -#define MX27_INT_GPIO		8 -#define MX27_INT_SDHC3		9 -#define MX27_INT_SDHC2		10 -#define MX27_INT_SDHC1		11 -#define MX27_INT_I2C1		12 -#define MX27_INT_SSI2		13 -#define MX27_INT_SSI1		14 -#define MX27_INT_CSPI2		15 -#define MX27_INT_CSPI1		16 -#define MX27_INT_UART4		17 -#define MX27_INT_UART3		18 -#define MX27_INT_UART2		19 -#define MX27_INT_UART1		20 -#define MX27_INT_KPP		21 -#define MX27_INT_RTC		22 -#define MX27_INT_PWM		23 -#define MX27_INT_GPT3		24 -#define MX27_INT_GPT2		25 -#define MX27_INT_GPT1		26 -#define MX27_INT_WDOG		27 -#define MX27_INT_PCMCIA		28 -#define MX27_INT_NFC		29 -#define MX27_INT_ATA		30 -#define MX27_INT_CSI		31 -#define MX27_INT_DMACH0		32 -#define MX27_INT_DMACH1		33 -#define MX27_INT_DMACH2		34 -#define MX27_INT_DMACH3		35 -#define MX27_INT_DMACH4		36 -#define MX27_INT_DMACH5		37 -#define MX27_INT_DMACH6		38 -#define MX27_INT_DMACH7		39 -#define MX27_INT_DMACH8		40 -#define MX27_INT_DMACH9		41 -#define MX27_INT_DMACH10	42 -#define MX27_INT_DMACH11	43 -#define MX27_INT_DMACH12	44 -#define MX27_INT_DMACH13	45 -#define MX27_INT_DMACH14	46 -#define MX27_INT_DMACH15	47 -#define MX27_INT_UART6		48 -#define MX27_INT_UART5		49 -#define MX27_INT_FEC		50 -#define MX27_INT_EMMAPRP	51 -#define MX27_INT_EMMAPP		52 -#define MX27_INT_VPU		53 -#define MX27_INT_USB_HS1	54 -#define MX27_INT_USB_HS2	55 -#define MX27_INT_USB_OTG	56 -#define MX27_INT_SCC_SMN	57 -#define MX27_INT_SCC_SCM	58 -#define MX27_INT_SAHARA		59 -#define MX27_INT_SLCDC		60 -#define MX27_INT_LCDC		61 -#define MX27_INT_IIM		62 -#define MX27_INT_CCM		63 +#include <asm/irq.h> +#define MX27_INT_I2C2		(NR_IRQS_LEGACY + 1) +#define MX27_INT_GPT6		(NR_IRQS_LEGACY + 2) +#define MX27_INT_GPT5		(NR_IRQS_LEGACY + 3) +#define MX27_INT_GPT4		(NR_IRQS_LEGACY + 4) +#define MX27_INT_RTIC		(NR_IRQS_LEGACY + 5) +#define MX27_INT_CSPI3		(NR_IRQS_LEGACY + 6) +#define MX27_INT_SDHC		(NR_IRQS_LEGACY + 7) +#define MX27_INT_GPIO		(NR_IRQS_LEGACY + 8) +#define MX27_INT_SDHC3		(NR_IRQS_LEGACY + 9) +#define MX27_INT_SDHC2		(NR_IRQS_LEGACY + 10) +#define MX27_INT_SDHC1		(NR_IRQS_LEGACY + 11) +#define MX27_INT_I2C1		(NR_IRQS_LEGACY + 12) +#define MX27_INT_SSI2		(NR_IRQS_LEGACY + 13) +#define MX27_INT_SSI1		(NR_IRQS_LEGACY + 14) +#define MX27_INT_CSPI2		(NR_IRQS_LEGACY + 15) +#define MX27_INT_CSPI1		(NR_IRQS_LEGACY + 16) +#define MX27_INT_UART4		(NR_IRQS_LEGACY + 17) +#define MX27_INT_UART3		(NR_IRQS_LEGACY + 18) +#define MX27_INT_UART2		(NR_IRQS_LEGACY + 19) +#define MX27_INT_UART1		(NR_IRQS_LEGACY + 20) +#define MX27_INT_KPP		(NR_IRQS_LEGACY + 21) +#define MX27_INT_RTC		(NR_IRQS_LEGACY + 22) +#define MX27_INT_PWM		(NR_IRQS_LEGACY + 23) +#define MX27_INT_GPT3		(NR_IRQS_LEGACY + 24) +#define MX27_INT_GPT2		(NR_IRQS_LEGACY + 25) +#define MX27_INT_GPT1		(NR_IRQS_LEGACY + 26) +#define MX27_INT_WDOG		(NR_IRQS_LEGACY + 27) +#define MX27_INT_PCMCIA		(NR_IRQS_LEGACY + 28) +#define MX27_INT_NFC		(NR_IRQS_LEGACY + 29) +#define MX27_INT_ATA		(NR_IRQS_LEGACY + 30) +#define MX27_INT_CSI		(NR_IRQS_LEGACY + 31) +#define MX27_INT_DMACH0		(NR_IRQS_LEGACY + 32) +#define MX27_INT_DMACH1		(NR_IRQS_LEGACY + 33) +#define MX27_INT_DMACH2		(NR_IRQS_LEGACY + 34) +#define MX27_INT_DMACH3		(NR_IRQS_LEGACY + 35) +#define MX27_INT_DMACH4		(NR_IRQS_LEGACY + 36) +#define MX27_INT_DMACH5		(NR_IRQS_LEGACY + 37) +#define MX27_INT_DMACH6		(NR_IRQS_LEGACY + 38) +#define MX27_INT_DMACH7		(NR_IRQS_LEGACY + 39) +#define MX27_INT_DMACH8		(NR_IRQS_LEGACY + 40) +#define MX27_INT_DMACH9		(NR_IRQS_LEGACY + 41) +#define MX27_INT_DMACH10	(NR_IRQS_LEGACY + 42) +#define MX27_INT_DMACH11	(NR_IRQS_LEGACY + 43) +#define MX27_INT_DMACH12	(NR_IRQS_LEGACY + 44) +#define MX27_INT_DMACH13	(NR_IRQS_LEGACY + 45) +#define MX27_INT_DMACH14	(NR_IRQS_LEGACY + 46) +#define MX27_INT_DMACH15	(NR_IRQS_LEGACY + 47) +#define MX27_INT_UART6		(NR_IRQS_LEGACY + 48) +#define MX27_INT_UART5		(NR_IRQS_LEGACY + 49) +#define MX27_INT_FEC		(NR_IRQS_LEGACY + 50) +#define MX27_INT_EMMAPRP	(NR_IRQS_LEGACY + 51) +#define MX27_INT_EMMAPP		(NR_IRQS_LEGACY + 52) +#define MX27_INT_VPU		(NR_IRQS_LEGACY + 53) +#define MX27_INT_USB_HS1	(NR_IRQS_LEGACY + 54) +#define MX27_INT_USB_HS2	(NR_IRQS_LEGACY + 55) +#define MX27_INT_USB_OTG	(NR_IRQS_LEGACY + 56) +#define MX27_INT_SCC_SMN	(NR_IRQS_LEGACY + 57) +#define MX27_INT_SCC_SCM	(NR_IRQS_LEGACY + 58) +#define MX27_INT_SAHARA		(NR_IRQS_LEGACY + 59) +#define MX27_INT_SLCDC		(NR_IRQS_LEGACY + 60) +#define MX27_INT_LCDC		(NR_IRQS_LEGACY + 61) +#define MX27_INT_IIM		(NR_IRQS_LEGACY + 62) +#define MX27_INT_CCM		(NR_IRQS_LEGACY + 63)  /* fixed DMA request numbers */  #define MX27_DMA_REQ_CSPI3_RX	1 diff --git a/arch/arm/plat-mxc/include/mach/mx2x.h b/arch/arm/plat-mxc/include/mach/mx2x.h index 6d07839fdec..11642f5b224 100644 --- a/arch/arm/plat-mxc/include/mach/mx2x.h +++ b/arch/arm/plat-mxc/include/mach/mx2x.h @@ -68,49 +68,50 @@  #define MX2x_CSI_BASE_ADDR			(MX2x_SAHB1_BASE_ADDR + 0x0000)  /* fixed interrupt numbers */ -#define MX2x_INT_CSPI3		6 -#define MX2x_INT_GPIO		8 -#define MX2x_INT_SDHC2		10 -#define MX2x_INT_SDHC1		11 -#define MX2x_INT_I2C		12 -#define MX2x_INT_SSI2		13 -#define MX2x_INT_SSI1		14 -#define MX2x_INT_CSPI2		15 -#define MX2x_INT_CSPI1		16 -#define MX2x_INT_UART4		17 -#define MX2x_INT_UART3		18 -#define MX2x_INT_UART2		19 -#define MX2x_INT_UART1		20 -#define MX2x_INT_KPP		21 -#define MX2x_INT_RTC		22 -#define MX2x_INT_PWM		23 -#define MX2x_INT_GPT3		24 -#define MX2x_INT_GPT2		25 -#define MX2x_INT_GPT1		26 -#define MX2x_INT_WDOG		27 -#define MX2x_INT_PCMCIA		28 -#define MX2x_INT_NANDFC		29 -#define MX2x_INT_CSI		31 -#define MX2x_INT_DMACH0		32 -#define MX2x_INT_DMACH1		33 -#define MX2x_INT_DMACH2		34 -#define MX2x_INT_DMACH3		35 -#define MX2x_INT_DMACH4		36 -#define MX2x_INT_DMACH5		37 -#define MX2x_INT_DMACH6		38 -#define MX2x_INT_DMACH7		39 -#define MX2x_INT_DMACH8		40 -#define MX2x_INT_DMACH9		41 -#define MX2x_INT_DMACH10	42 -#define MX2x_INT_DMACH11	43 -#define MX2x_INT_DMACH12	44 -#define MX2x_INT_DMACH13	45 -#define MX2x_INT_DMACH14	46 -#define MX2x_INT_DMACH15	47 -#define MX2x_INT_EMMAPRP	51 -#define MX2x_INT_EMMAPP		52 -#define MX2x_INT_SLCDC		60 -#define MX2x_INT_LCDC		61 +#include <asm/irq.h> +#define MX2x_INT_CSPI3		(NR_IRQS_LEGACY + 6) +#define MX2x_INT_GPIO		(NR_IRQS_LEGACY + 8) +#define MX2x_INT_SDHC2		(NR_IRQS_LEGACY + 10) +#define MX2x_INT_SDHC1		(NR_IRQS_LEGACY + 11) +#define MX2x_INT_I2C		(NR_IRQS_LEGACY + 12) +#define MX2x_INT_SSI2		(NR_IRQS_LEGACY + 13) +#define MX2x_INT_SSI1		(NR_IRQS_LEGACY + 14) +#define MX2x_INT_CSPI2		(NR_IRQS_LEGACY + 15) +#define MX2x_INT_CSPI1		(NR_IRQS_LEGACY + 16) +#define MX2x_INT_UART4		(NR_IRQS_LEGACY + 17) +#define MX2x_INT_UART3		(NR_IRQS_LEGACY + 18) +#define MX2x_INT_UART2		(NR_IRQS_LEGACY + 19) +#define MX2x_INT_UART1		(NR_IRQS_LEGACY + 20) +#define MX2x_INT_KPP		(NR_IRQS_LEGACY + 21) +#define MX2x_INT_RTC		(NR_IRQS_LEGACY + 22) +#define MX2x_INT_PWM		(NR_IRQS_LEGACY + 23) +#define MX2x_INT_GPT3		(NR_IRQS_LEGACY + 24) +#define MX2x_INT_GPT2		(NR_IRQS_LEGACY + 25) +#define MX2x_INT_GPT1		(NR_IRQS_LEGACY + 26) +#define MX2x_INT_WDOG		(NR_IRQS_LEGACY + 27) +#define MX2x_INT_PCMCIA		(NR_IRQS_LEGACY + 28) +#define MX2x_INT_NANDFC		(NR_IRQS_LEGACY + 29) +#define MX2x_INT_CSI		(NR_IRQS_LEGACY + 31) +#define MX2x_INT_DMACH0		(NR_IRQS_LEGACY + 32) +#define MX2x_INT_DMACH1		(NR_IRQS_LEGACY + 33) +#define MX2x_INT_DMACH2		(NR_IRQS_LEGACY + 34) +#define MX2x_INT_DMACH3		(NR_IRQS_LEGACY + 35) +#define MX2x_INT_DMACH4		(NR_IRQS_LEGACY + 36) +#define MX2x_INT_DMACH5		(NR_IRQS_LEGACY + 37) +#define MX2x_INT_DMACH6		(NR_IRQS_LEGACY + 38) +#define MX2x_INT_DMACH7		(NR_IRQS_LEGACY + 39) +#define MX2x_INT_DMACH8		(NR_IRQS_LEGACY + 40) +#define MX2x_INT_DMACH9		(NR_IRQS_LEGACY + 41) +#define MX2x_INT_DMACH10	(NR_IRQS_LEGACY + 42) +#define MX2x_INT_DMACH11	(NR_IRQS_LEGACY + 43) +#define MX2x_INT_DMACH12	(NR_IRQS_LEGACY + 44) +#define MX2x_INT_DMACH13	(NR_IRQS_LEGACY + 45) +#define MX2x_INT_DMACH14	(NR_IRQS_LEGACY + 46) +#define MX2x_INT_DMACH15	(NR_IRQS_LEGACY + 47) +#define MX2x_INT_EMMAPRP	(NR_IRQS_LEGACY + 51) +#define MX2x_INT_EMMAPP		(NR_IRQS_LEGACY + 52) +#define MX2x_INT_SLCDC		(NR_IRQS_LEGACY + 60) +#define MX2x_INT_LCDC		(NR_IRQS_LEGACY + 61)  /* fixed DMA request numbers */  #define MX2x_DMA_REQ_CSPI3_RX	1 diff --git a/arch/arm/plat-mxc/include/mach/mx31.h b/arch/arm/plat-mxc/include/mach/mx31.h index e27619e442c..dbced61d9fd 100644 --- a/arch/arm/plat-mxc/include/mach/mx31.h +++ b/arch/arm/plat-mxc/include/mach/mx31.h @@ -118,63 +118,67 @@  #define MX31_IO_P2V(x)			IMX_IO_P2V(x)  #define MX31_IO_ADDRESS(x)		IOMEM(MX31_IO_P2V(x)) -#define MX31_INT_I2C3		3 -#define MX31_INT_I2C2		4 -#define MX31_INT_MPEG4_ENCODER	5 -#define MX31_INT_RTIC		6 -#define MX31_INT_FIRI		7 -#define MX31_INT_SDHC2		8 -#define MX31_INT_SDHC1		9 -#define MX31_INT_I2C1		10 -#define MX31_INT_SSI2		11 -#define MX31_INT_SSI1		12 -#define MX31_INT_CSPI2		13 -#define MX31_INT_CSPI1		14 -#define MX31_INT_ATA		15 -#define MX31_INT_MBX		16 -#define MX31_INT_CSPI3		17 -#define MX31_INT_UART3		18 -#define MX31_INT_IIM		19 -#define MX31_INT_SIM2		20 -#define MX31_INT_SIM1		21 -#define MX31_INT_RNGA		22 -#define MX31_INT_EVTMON		23 -#define MX31_INT_KPP		24 -#define MX31_INT_RTC		25 -#define MX31_INT_PWM		26 -#define MX31_INT_EPIT2		27 -#define MX31_INT_EPIT1		28 -#define MX31_INT_GPT		29 -#define MX31_INT_POWER_FAIL	30 -#define MX31_INT_CCM_DVFS	31 -#define MX31_INT_UART2		32 -#define MX31_INT_NFC		33 -#define MX31_INT_SDMA		34 -#define MX31_INT_USB_HS1	35 -#define MX31_INT_USB_HS2	36 -#define MX31_INT_USB_OTG	37 -#define MX31_INT_MSHC1		39 -#define MX31_INT_MSHC2		40 -#define MX31_INT_IPU_ERR	41 -#define MX31_INT_IPU_SYN	42 -#define MX31_INT_UART1		45 -#define MX31_INT_UART4		46 -#define MX31_INT_UART5		47 -#define MX31_INT_ECT		48 -#define MX31_INT_SCC_SCM	49 -#define MX31_INT_SCC_SMN	50 -#define MX31_INT_GPIO2		51 -#define MX31_INT_GPIO1		52 -#define MX31_INT_CCM		53 -#define MX31_INT_PCMCIA		54 -#define MX31_INT_WDOG		55 -#define MX31_INT_GPIO3		56 -#define MX31_INT_EXT_POWER	58 -#define MX31_INT_EXT_TEMPER	59 -#define MX31_INT_EXT_SENSOR60	60 -#define MX31_INT_EXT_SENSOR61	61 -#define MX31_INT_EXT_WDOG	62 -#define MX31_INT_EXT_TV		63 +/* + * Interrupt numbers + */ +#include <asm/irq.h> +#define MX31_INT_I2C3		(NR_IRQS_LEGACY + 3) +#define MX31_INT_I2C2		(NR_IRQS_LEGACY + 4) +#define MX31_INT_MPEG4_ENCODER	(NR_IRQS_LEGACY + 5) +#define MX31_INT_RTIC		(NR_IRQS_LEGACY + 6) +#define MX31_INT_FIRI		(NR_IRQS_LEGACY + 7) +#define MX31_INT_SDHC2		(NR_IRQS_LEGACY + 8) +#define MX31_INT_SDHC1		(NR_IRQS_LEGACY + 9) +#define MX31_INT_I2C1		(NR_IRQS_LEGACY + 10) +#define MX31_INT_SSI2		(NR_IRQS_LEGACY + 11) +#define MX31_INT_SSI1		(NR_IRQS_LEGACY + 12) +#define MX31_INT_CSPI2		(NR_IRQS_LEGACY + 13) +#define MX31_INT_CSPI1		(NR_IRQS_LEGACY + 14) +#define MX31_INT_ATA		(NR_IRQS_LEGACY + 15) +#define MX31_INT_MBX		(NR_IRQS_LEGACY + 16) +#define MX31_INT_CSPI3		(NR_IRQS_LEGACY + 17) +#define MX31_INT_UART3		(NR_IRQS_LEGACY + 18) +#define MX31_INT_IIM		(NR_IRQS_LEGACY + 19) +#define MX31_INT_SIM2		(NR_IRQS_LEGACY + 20) +#define MX31_INT_SIM1		(NR_IRQS_LEGACY + 21) +#define MX31_INT_RNGA		(NR_IRQS_LEGACY + 22) +#define MX31_INT_EVTMON		(NR_IRQS_LEGACY + 23) +#define MX31_INT_KPP		(NR_IRQS_LEGACY + 24) +#define MX31_INT_RTC		(NR_IRQS_LEGACY + 25) +#define MX31_INT_PWM		(NR_IRQS_LEGACY + 26) +#define MX31_INT_EPIT2		(NR_IRQS_LEGACY + 27) +#define MX31_INT_EPIT1		(NR_IRQS_LEGACY + 28) +#define MX31_INT_GPT		(NR_IRQS_LEGACY + 29) +#define MX31_INT_POWER_FAIL	(NR_IRQS_LEGACY + 30) +#define MX31_INT_CCM_DVFS	(NR_IRQS_LEGACY + 31) +#define MX31_INT_UART2		(NR_IRQS_LEGACY + 32) +#define MX31_INT_NFC		(NR_IRQS_LEGACY + 33) +#define MX31_INT_SDMA		(NR_IRQS_LEGACY + 34) +#define MX31_INT_USB_HS1	(NR_IRQS_LEGACY + 35) +#define MX31_INT_USB_HS2	(NR_IRQS_LEGACY + 36) +#define MX31_INT_USB_OTG	(NR_IRQS_LEGACY + 37) +#define MX31_INT_MSHC1		(NR_IRQS_LEGACY + 39) +#define MX31_INT_MSHC2		(NR_IRQS_LEGACY + 40) +#define MX31_INT_IPU_ERR	(NR_IRQS_LEGACY + 41) +#define MX31_INT_IPU_SYN	(NR_IRQS_LEGACY + 42) +#define MX31_INT_UART1		(NR_IRQS_LEGACY + 45) +#define MX31_INT_UART4		(NR_IRQS_LEGACY + 46) +#define MX31_INT_UART5		(NR_IRQS_LEGACY + 47) +#define MX31_INT_ECT		(NR_IRQS_LEGACY + 48) +#define MX31_INT_SCC_SCM	(NR_IRQS_LEGACY + 49) +#define MX31_INT_SCC_SMN	(NR_IRQS_LEGACY + 50) +#define MX31_INT_GPIO2		(NR_IRQS_LEGACY + 51) +#define MX31_INT_GPIO1		(NR_IRQS_LEGACY + 52) +#define MX31_INT_CCM		(NR_IRQS_LEGACY + 53) +#define MX31_INT_PCMCIA		(NR_IRQS_LEGACY + 54) +#define MX31_INT_WDOG		(NR_IRQS_LEGACY + 55) +#define MX31_INT_GPIO3		(NR_IRQS_LEGACY + 56) +#define MX31_INT_EXT_POWER	(NR_IRQS_LEGACY + 58) +#define MX31_INT_EXT_TEMPER	(NR_IRQS_LEGACY + 59) +#define MX31_INT_EXT_SENSOR60	(NR_IRQS_LEGACY + 60) +#define MX31_INT_EXT_SENSOR61	(NR_IRQS_LEGACY + 61) +#define MX31_INT_EXT_WDOG	(NR_IRQS_LEGACY + 62) +#define MX31_INT_EXT_TV		(NR_IRQS_LEGACY + 63)  #define MX31_DMA_REQ_SDHC1	20  #define MX31_DMA_REQ_SDHC2	21 diff --git a/arch/arm/plat-mxc/include/mach/mx35.h b/arch/arm/plat-mxc/include/mach/mx35.h index 80965a99aa5..2af5d3a699c 100644 --- a/arch/arm/plat-mxc/include/mach/mx35.h +++ b/arch/arm/plat-mxc/include/mach/mx35.h @@ -120,60 +120,61 @@  /*   * Interrupt numbers   */ -#define MX35_INT_OWIRE		2 -#define MX35_INT_I2C3		3 -#define MX35_INT_I2C2		4 -#define MX35_INT_RTIC		6 -#define MX35_INT_ESDHC1		7 -#define MX35_INT_ESDHC2		8 -#define MX35_INT_ESDHC3		9 -#define MX35_INT_I2C1		10 -#define MX35_INT_SSI1		11 -#define MX35_INT_SSI2		12 -#define MX35_INT_CSPI2		13 -#define MX35_INT_CSPI1		14 -#define MX35_INT_ATA		15 -#define MX35_INT_GPU2D		16 -#define MX35_INT_ASRC		17 -#define MX35_INT_UART3		18 -#define MX35_INT_IIM		19 -#define MX35_INT_RNGA		22 -#define MX35_INT_EVTMON		23 -#define MX35_INT_KPP		24 -#define MX35_INT_RTC		25 -#define MX35_INT_PWM		26 -#define MX35_INT_EPIT2		27 -#define MX35_INT_EPIT1		28 -#define MX35_INT_GPT		29 -#define MX35_INT_POWER_FAIL	30 -#define MX35_INT_UART2		32 -#define MX35_INT_NFC		33 -#define MX35_INT_SDMA		34 -#define MX35_INT_USB_HS		35 -#define MX35_INT_USB_OTG	37 -#define MX35_INT_MSHC1		39 -#define MX35_INT_ESAI		40 -#define MX35_INT_IPU_ERR	41 -#define MX35_INT_IPU_SYN	42 -#define MX35_INT_CAN1		43 -#define MX35_INT_CAN2		44 -#define MX35_INT_UART1		45 -#define MX35_INT_MLB		46 -#define MX35_INT_SPDIF		47 -#define MX35_INT_ECT		48 -#define MX35_INT_SCC_SCM	49 -#define MX35_INT_SCC_SMN	50 -#define MX35_INT_GPIO2		51 -#define MX35_INT_GPIO1		52 -#define MX35_INT_WDOG		55 -#define MX35_INT_GPIO3		56 -#define MX35_INT_FEC		57 -#define MX35_INT_EXT_POWER	58 -#define MX35_INT_EXT_TEMPER	59 -#define MX35_INT_EXT_SENSOR60	60 -#define MX35_INT_EXT_SENSOR61	61 -#define MX35_INT_EXT_WDOG	62 -#define MX35_INT_EXT_TV		63 +#include <asm/irq.h> +#define MX35_INT_OWIRE		(NR_IRQS_LEGACY + 2) +#define MX35_INT_I2C3		(NR_IRQS_LEGACY + 3) +#define MX35_INT_I2C2		(NR_IRQS_LEGACY + 4) +#define MX35_INT_RTIC		(NR_IRQS_LEGACY + 6) +#define MX35_INT_ESDHC1		(NR_IRQS_LEGACY + 7) +#define MX35_INT_ESDHC2		(NR_IRQS_LEGACY + 8) +#define MX35_INT_ESDHC3		(NR_IRQS_LEGACY + 9) +#define MX35_INT_I2C1		(NR_IRQS_LEGACY + 10) +#define MX35_INT_SSI1		(NR_IRQS_LEGACY + 11) +#define MX35_INT_SSI2		(NR_IRQS_LEGACY + 12) +#define MX35_INT_CSPI2		(NR_IRQS_LEGACY + 13) +#define MX35_INT_CSPI1		(NR_IRQS_LEGACY + 14) +#define MX35_INT_ATA		(NR_IRQS_LEGACY + 15) +#define MX35_INT_GPU2D		(NR_IRQS_LEGACY + 16) +#define MX35_INT_ASRC		(NR_IRQS_LEGACY + 17) +#define MX35_INT_UART3		(NR_IRQS_LEGACY + 18) +#define MX35_INT_IIM		(NR_IRQS_LEGACY + 19) +#define MX35_INT_RNGA		(NR_IRQS_LEGACY + 22) +#define MX35_INT_EVTMON		(NR_IRQS_LEGACY + 23) +#define MX35_INT_KPP		(NR_IRQS_LEGACY + 24) +#define MX35_INT_RTC		(NR_IRQS_LEGACY + 25) +#define MX35_INT_PWM		(NR_IRQS_LEGACY + 26) +#define MX35_INT_EPIT2		(NR_IRQS_LEGACY + 27) +#define MX35_INT_EPIT1		(NR_IRQS_LEGACY + 28) +#define MX35_INT_GPT		(NR_IRQS_LEGACY + 29) +#define MX35_INT_POWER_FAIL	(NR_IRQS_LEGACY + 30) +#define MX35_INT_UART2		(NR_IRQS_LEGACY + 32) +#define MX35_INT_NFC		(NR_IRQS_LEGACY + 33) +#define MX35_INT_SDMA		(NR_IRQS_LEGACY + 34) +#define MX35_INT_USB_HS		(NR_IRQS_LEGACY + 35) +#define MX35_INT_USB_OTG	(NR_IRQS_LEGACY + 37) +#define MX35_INT_MSHC1		(NR_IRQS_LEGACY + 39) +#define MX35_INT_ESAI		(NR_IRQS_LEGACY + 40) +#define MX35_INT_IPU_ERR	(NR_IRQS_LEGACY + 41) +#define MX35_INT_IPU_SYN	(NR_IRQS_LEGACY + 42) +#define MX35_INT_CAN1		(NR_IRQS_LEGACY + 43) +#define MX35_INT_CAN2		(NR_IRQS_LEGACY + 44) +#define MX35_INT_UART1		(NR_IRQS_LEGACY + 45) +#define MX35_INT_MLB		(NR_IRQS_LEGACY + 46) +#define MX35_INT_SPDIF		(NR_IRQS_LEGACY + 47) +#define MX35_INT_ECT		(NR_IRQS_LEGACY + 48) +#define MX35_INT_SCC_SCM	(NR_IRQS_LEGACY + 49) +#define MX35_INT_SCC_SMN	(NR_IRQS_LEGACY + 50) +#define MX35_INT_GPIO2		(NR_IRQS_LEGACY + 51) +#define MX35_INT_GPIO1		(NR_IRQS_LEGACY + 52) +#define MX35_INT_WDOG		(NR_IRQS_LEGACY + 55) +#define MX35_INT_GPIO3		(NR_IRQS_LEGACY + 56) +#define MX35_INT_FEC		(NR_IRQS_LEGACY + 57) +#define MX35_INT_EXT_POWER	(NR_IRQS_LEGACY + 58) +#define MX35_INT_EXT_TEMPER	(NR_IRQS_LEGACY + 59) +#define MX35_INT_EXT_SENSOR60	(NR_IRQS_LEGACY + 60) +#define MX35_INT_EXT_SENSOR61	(NR_IRQS_LEGACY + 61) +#define MX35_INT_EXT_WDOG	(NR_IRQS_LEGACY + 62) +#define MX35_INT_EXT_TV		(NR_IRQS_LEGACY + 63)  #define MX35_DMA_REQ_SSI2_RX1   22  #define MX35_DMA_REQ_SSI2_TX1   23 diff --git a/arch/arm/plat-mxc/include/mach/mx3x.h b/arch/arm/plat-mxc/include/mach/mx3x.h index 30dbf424583..96fb4fbc8ad 100644 --- a/arch/arm/plat-mxc/include/mach/mx3x.h +++ b/arch/arm/plat-mxc/include/mach/mx3x.h @@ -143,44 +143,45 @@  /*   * Interrupt numbers   */ -#define MX3x_INT_I2C3		3 -#define MX3x_INT_I2C2		4 -#define MX3x_INT_RTIC		6 -#define MX3x_INT_I2C		10 -#define MX3x_INT_CSPI2		13 -#define MX3x_INT_CSPI1		14 -#define MX3x_INT_ATA		15 -#define MX3x_INT_UART3		18 -#define MX3x_INT_IIM		19 -#define MX3x_INT_RNGA		22 -#define MX3x_INT_EVTMON		23 -#define MX3x_INT_KPP		24 -#define MX3x_INT_RTC		25 -#define MX3x_INT_PWM		26 -#define MX3x_INT_EPIT2		27 -#define MX3x_INT_EPIT1		28 -#define MX3x_INT_GPT		29 -#define MX3x_INT_POWER_FAIL	30 -#define MX3x_INT_UART2		32 -#define MX3x_INT_NANDFC		33 -#define MX3x_INT_SDMA		34 -#define MX3x_INT_MSHC1		39 -#define MX3x_INT_IPU_ERR	41 -#define MX3x_INT_IPU_SYN	42 -#define MX3x_INT_UART1		45 -#define MX3x_INT_ECT		48 -#define MX3x_INT_SCC_SCM	49 -#define MX3x_INT_SCC_SMN	50 -#define MX3x_INT_GPIO2		51 -#define MX3x_INT_GPIO1		52 -#define MX3x_INT_WDOG		55 -#define MX3x_INT_GPIO3		56 -#define MX3x_INT_EXT_POWER	58 -#define MX3x_INT_EXT_TEMPER	59 -#define MX3x_INT_EXT_SENSOR60	60 -#define MX3x_INT_EXT_SENSOR61	61 -#define MX3x_INT_EXT_WDOG	62 -#define MX3x_INT_EXT_TV		63 +#include <asm/irq.h> +#define MX3x_INT_I2C3		(NR_IRQS_LEGACY + 3) +#define MX3x_INT_I2C2		(NR_IRQS_LEGACY + 4) +#define MX3x_INT_RTIC		(NR_IRQS_LEGACY + 6) +#define MX3x_INT_I2C		(NR_IRQS_LEGACY + 10) +#define MX3x_INT_CSPI2		(NR_IRQS_LEGACY + 13) +#define MX3x_INT_CSPI1		(NR_IRQS_LEGACY + 14) +#define MX3x_INT_ATA		(NR_IRQS_LEGACY + 15) +#define MX3x_INT_UART3		(NR_IRQS_LEGACY + 18) +#define MX3x_INT_IIM		(NR_IRQS_LEGACY + 19) +#define MX3x_INT_RNGA		(NR_IRQS_LEGACY + 22) +#define MX3x_INT_EVTMON		(NR_IRQS_LEGACY + 23) +#define MX3x_INT_KPP		(NR_IRQS_LEGACY + 24) +#define MX3x_INT_RTC		(NR_IRQS_LEGACY + 25) +#define MX3x_INT_PWM		(NR_IRQS_LEGACY + 26) +#define MX3x_INT_EPIT2		(NR_IRQS_LEGACY + 27) +#define MX3x_INT_EPIT1		(NR_IRQS_LEGACY + 28) +#define MX3x_INT_GPT		(NR_IRQS_LEGACY + 29) +#define MX3x_INT_POWER_FAIL	(NR_IRQS_LEGACY + 30) +#define MX3x_INT_UART2		(NR_IRQS_LEGACY + 32) +#define MX3x_INT_NANDFC		(NR_IRQS_LEGACY + 33) +#define MX3x_INT_SDMA		(NR_IRQS_LEGACY + 34) +#define MX3x_INT_MSHC1		(NR_IRQS_LEGACY + 39) +#define MX3x_INT_IPU_ERR	(NR_IRQS_LEGACY + 41) +#define MX3x_INT_IPU_SYN	(NR_IRQS_LEGACY + 42) +#define MX3x_INT_UART1		(NR_IRQS_LEGACY + 45) +#define MX3x_INT_ECT		(NR_IRQS_LEGACY + 48) +#define MX3x_INT_SCC_SCM	(NR_IRQS_LEGACY + 49) +#define MX3x_INT_SCC_SMN	(NR_IRQS_LEGACY + 50) +#define MX3x_INT_GPIO2		(NR_IRQS_LEGACY + 51) +#define MX3x_INT_GPIO1		(NR_IRQS_LEGACY + 52) +#define MX3x_INT_WDOG		(NR_IRQS_LEGACY + 55) +#define MX3x_INT_GPIO3		(NR_IRQS_LEGACY + 56) +#define MX3x_INT_EXT_POWER	(NR_IRQS_LEGACY + 58) +#define MX3x_INT_EXT_TEMPER	(NR_IRQS_LEGACY + 59) +#define MX3x_INT_EXT_SENSOR60	(NR_IRQS_LEGACY + 60) +#define MX3x_INT_EXT_SENSOR61	(NR_IRQS_LEGACY + 61) +#define MX3x_INT_EXT_WDOG	(NR_IRQS_LEGACY + 62) +#define MX3x_INT_EXT_TV		(NR_IRQS_LEGACY + 63)  #define MX3x_PROD_SIGNATURE		0x1	/* For MX31 */ diff --git a/arch/arm/plat-mxc/include/mach/mx50.h b/arch/arm/plat-mxc/include/mach/mx50.h index 5f2da75a47f..09ac19c1570 100644 --- a/arch/arm/plat-mxc/include/mach/mx50.h +++ b/arch/arm/plat-mxc/include/mach/mx50.h @@ -188,99 +188,100 @@  /*   * Interrupt numbers   */ -#define MX50_INT_MMC_SDHC1	1 -#define MX50_INT_MMC_SDHC2	2 -#define MX50_INT_MMC_SDHC3	3 -#define MX50_INT_MMC_SDHC4	4 -#define MX50_INT_DAP		5 -#define MX50_INT_SDMA		6 -#define MX50_INT_IOMUX		7 -#define MX50_INT_UART4		13 -#define MX50_INT_USB_H1		14 -#define MX50_INT_USB_OTG	18 -#define MX50_INT_DATABAHN	19 -#define MX50_INT_ELCDIF		20 -#define MX50_INT_EPXP		21 -#define MX50_INT_SRTC_NTZ	24 -#define MX50_INT_SRTC_TZ	25 -#define MX50_INT_EPDC		27 -#define MX50_INT_NIC		28 -#define MX50_INT_SSI1		29 -#define MX50_INT_SSI2		30 -#define MX50_INT_UART1		31 -#define MX50_INT_UART2		32 -#define MX50_INT_UART3		33 -#define MX50_INT_RESV34		34 -#define MX50_INT_RESV35		35 -#define MX50_INT_CSPI1		36 -#define MX50_INT_CSPI2		37 -#define MX50_INT_CSPI		38 -#define MX50_INT_GPT		39 -#define MX50_INT_EPIT1		40 -#define MX50_INT_GPIO1_INT7	42 -#define MX50_INT_GPIO1_INT6	43 -#define MX50_INT_GPIO1_INT5	44 -#define MX50_INT_GPIO1_INT4	45 -#define MX50_INT_GPIO1_INT3	46 -#define MX50_INT_GPIO1_INT2	47 -#define MX50_INT_GPIO1_INT1	48 -#define MX50_INT_GPIO1_INT0	49 -#define MX50_INT_GPIO1_LOW	50 -#define MX50_INT_GPIO1_HIGH	51 -#define MX50_INT_GPIO2_LOW	52 -#define MX50_INT_GPIO2_HIGH	53 -#define MX50_INT_GPIO3_LOW	54 -#define MX50_INT_GPIO3_HIGH	55 -#define MX50_INT_GPIO4_LOW	56 -#define MX50_INT_GPIO4_HIGH	57 -#define MX50_INT_WDOG1		58 -#define MX50_INT_KPP		60 -#define MX50_INT_PWM1		61 -#define MX50_INT_I2C1		62 -#define MX50_INT_I2C2		63 -#define MX50_INT_I2C3		64 -#define MX50_INT_RESV65		65 -#define MX50_INT_DCDC		66 -#define MX50_INT_THERMAL_ALARM	67 -#define MX50_INT_ANA3		68 -#define MX50_INT_ANA4		69 -#define MX50_INT_CCM1		71 -#define MX50_INT_CCM2		72 -#define MX50_INT_GPC1		73 -#define MX50_INT_GPC2		74 -#define MX50_INT_SRC		75 -#define MX50_INT_NM		76 -#define MX50_INT_PMU		77 -#define MX50_INT_CTI_IRQ	78 -#define MX50_INT_CTI1_TG0	79 -#define MX50_INT_CTI1_TG1	80 -#define MX50_INT_GPU2_IRQ	84 -#define MX50_INT_GPU2_BUSY	85 -#define MX50_INT_UART5		86 -#define MX50_INT_FEC		87 -#define MX50_INT_OWIRE		88 -#define MX50_INT_CTI1_TG2	89 -#define MX50_INT_SJC		90 -#define MX50_INT_DCP_CHAN1_3	91 -#define MX50_INT_DCP_CHAN0	92 -#define MX50_INT_PWM2		94 -#define MX50_INT_RNGB		97 -#define MX50_INT_CTI1_TG3	98 -#define MX50_INT_RAWNAND_BCH	100 -#define MX50_INT_RAWNAND_GPMI	102 -#define MX50_INT_GPIO5_LOW	103 -#define MX50_INT_GPIO5_HIGH	104 -#define MX50_INT_GPIO6_LOW	105 -#define MX50_INT_GPIO6_HIGH	106 -#define MX50_INT_MSHC		109 -#define MX50_INT_APBHDMA_CHAN0	110 -#define MX50_INT_APBHDMA_CHAN1	111 -#define MX50_INT_APBHDMA_CHAN2	112 -#define MX50_INT_APBHDMA_CHAN3	113 -#define MX50_INT_APBHDMA_CHAN4	114 -#define MX50_INT_APBHDMA_CHAN5	115 -#define MX50_INT_APBHDMA_CHAN6	116 -#define MX50_INT_APBHDMA_CHAN7	117 +#include <asm/irq.h> +#define MX50_INT_MMC_SDHC1	(NR_IRQS_LEGACY + 1) +#define MX50_INT_MMC_SDHC2	(NR_IRQS_LEGACY + 2) +#define MX50_INT_MMC_SDHC3	(NR_IRQS_LEGACY + 3) +#define MX50_INT_MMC_SDHC4	(NR_IRQS_LEGACY + 4) +#define MX50_INT_DAP		(NR_IRQS_LEGACY + 5) +#define MX50_INT_SDMA		(NR_IRQS_LEGACY + 6) +#define MX50_INT_IOMUX		(NR_IRQS_LEGACY + 7) +#define MX50_INT_UART4		(NR_IRQS_LEGACY + 13) +#define MX50_INT_USB_H1		(NR_IRQS_LEGACY + 14) +#define MX50_INT_USB_OTG	(NR_IRQS_LEGACY + 18) +#define MX50_INT_DATABAHN	(NR_IRQS_LEGACY + 19) +#define MX50_INT_ELCDIF		(NR_IRQS_LEGACY + 20) +#define MX50_INT_EPXP		(NR_IRQS_LEGACY + 21) +#define MX50_INT_SRTC_NTZ	(NR_IRQS_LEGACY + 24) +#define MX50_INT_SRTC_TZ	(NR_IRQS_LEGACY + 25) +#define MX50_INT_EPDC		(NR_IRQS_LEGACY + 27) +#define MX50_INT_NIC		(NR_IRQS_LEGACY + 28) +#define MX50_INT_SSI1		(NR_IRQS_LEGACY + 29) +#define MX50_INT_SSI2		(NR_IRQS_LEGACY + 30) +#define MX50_INT_UART1		(NR_IRQS_LEGACY + 31) +#define MX50_INT_UART2		(NR_IRQS_LEGACY + 32) +#define MX50_INT_UART3		(NR_IRQS_LEGACY + 33) +#define MX50_INT_RESV34		(NR_IRQS_LEGACY + 34) +#define MX50_INT_RESV35		(NR_IRQS_LEGACY + 35) +#define MX50_INT_CSPI1		(NR_IRQS_LEGACY + 36) +#define MX50_INT_CSPI2		(NR_IRQS_LEGACY + 37) +#define MX50_INT_CSPI		(NR_IRQS_LEGACY + 38) +#define MX50_INT_GPT		(NR_IRQS_LEGACY + 39) +#define MX50_INT_EPIT1		(NR_IRQS_LEGACY + 40) +#define MX50_INT_GPIO1_INT7	(NR_IRQS_LEGACY + 42) +#define MX50_INT_GPIO1_INT6	(NR_IRQS_LEGACY + 43) +#define MX50_INT_GPIO1_INT5	(NR_IRQS_LEGACY + 44) +#define MX50_INT_GPIO1_INT4	(NR_IRQS_LEGACY + 45) +#define MX50_INT_GPIO1_INT3	(NR_IRQS_LEGACY + 46) +#define MX50_INT_GPIO1_INT2	(NR_IRQS_LEGACY + 47) +#define MX50_INT_GPIO1_INT1	(NR_IRQS_LEGACY + 48) +#define MX50_INT_GPIO1_INT0	(NR_IRQS_LEGACY + 49) +#define MX50_INT_GPIO1_LOW	(NR_IRQS_LEGACY + 50) +#define MX50_INT_GPIO1_HIGH	(NR_IRQS_LEGACY + 51) +#define MX50_INT_GPIO2_LOW	(NR_IRQS_LEGACY + 52) +#define MX50_INT_GPIO2_HIGH	(NR_IRQS_LEGACY + 53) +#define MX50_INT_GPIO3_LOW	(NR_IRQS_LEGACY + 54) +#define MX50_INT_GPIO3_HIGH	(NR_IRQS_LEGACY + 55) +#define MX50_INT_GPIO4_LOW	(NR_IRQS_LEGACY + 56) +#define MX50_INT_GPIO4_HIGH	(NR_IRQS_LEGACY + 57) +#define MX50_INT_WDOG1		(NR_IRQS_LEGACY + 58) +#define MX50_INT_KPP		(NR_IRQS_LEGACY + 60) +#define MX50_INT_PWM1		(NR_IRQS_LEGACY + 61) +#define MX50_INT_I2C1		(NR_IRQS_LEGACY + 62) +#define MX50_INT_I2C2		(NR_IRQS_LEGACY + 63) +#define MX50_INT_I2C3		(NR_IRQS_LEGACY + 64) +#define MX50_INT_RESV65		(NR_IRQS_LEGACY + 65) +#define MX50_INT_DCDC		(NR_IRQS_LEGACY + 66) +#define MX50_INT_THERMAL_ALARM	(NR_IRQS_LEGACY + 67) +#define MX50_INT_ANA3		(NR_IRQS_LEGACY + 68) +#define MX50_INT_ANA4		(NR_IRQS_LEGACY + 69) +#define MX50_INT_CCM1		(NR_IRQS_LEGACY + 71) +#define MX50_INT_CCM2		(NR_IRQS_LEGACY + 72) +#define MX50_INT_GPC1		(NR_IRQS_LEGACY + 73) +#define MX50_INT_GPC2		(NR_IRQS_LEGACY + 74) +#define MX50_INT_SRC		(NR_IRQS_LEGACY + 75) +#define MX50_INT_NM		(NR_IRQS_LEGACY + 76) +#define MX50_INT_PMU		(NR_IRQS_LEGACY + 77) +#define MX50_INT_CTI_IRQ	(NR_IRQS_LEGACY + 78) +#define MX50_INT_CTI1_TG0	(NR_IRQS_LEGACY + 79) +#define MX50_INT_CTI1_TG1	(NR_IRQS_LEGACY + 80) +#define MX50_INT_GPU2_IRQ	(NR_IRQS_LEGACY + 84) +#define MX50_INT_GPU2_BUSY	(NR_IRQS_LEGACY + 85) +#define MX50_INT_UART5		(NR_IRQS_LEGACY + 86) +#define MX50_INT_FEC		(NR_IRQS_LEGACY + 87) +#define MX50_INT_OWIRE		(NR_IRQS_LEGACY + 88) +#define MX50_INT_CTI1_TG2	(NR_IRQS_LEGACY + 89) +#define MX50_INT_SJC		(NR_IRQS_LEGACY + 90) +#define MX50_INT_DCP_CHAN1_3	(NR_IRQS_LEGACY + 91) +#define MX50_INT_DCP_CHAN0	(NR_IRQS_LEGACY + 92) +#define MX50_INT_PWM2		(NR_IRQS_LEGACY + 94) +#define MX50_INT_RNGB		(NR_IRQS_LEGACY + 97) +#define MX50_INT_CTI1_TG3	(NR_IRQS_LEGACY + 98) +#define MX50_INT_RAWNAND_BCH	(NR_IRQS_LEGACY + 100) +#define MX50_INT_RAWNAND_GPMI	(NR_IRQS_LEGACY + 102) +#define MX50_INT_GPIO5_LOW	(NR_IRQS_LEGACY + 103) +#define MX50_INT_GPIO5_HIGH	(NR_IRQS_LEGACY + 104) +#define MX50_INT_GPIO6_LOW	(NR_IRQS_LEGACY + 105) +#define MX50_INT_GPIO6_HIGH	(NR_IRQS_LEGACY + 106) +#define MX50_INT_MSHC		(NR_IRQS_LEGACY + 109) +#define MX50_INT_APBHDMA_CHAN0	(NR_IRQS_LEGACY + 110) +#define MX50_INT_APBHDMA_CHAN1	(NR_IRQS_LEGACY + 111) +#define MX50_INT_APBHDMA_CHAN2	(NR_IRQS_LEGACY + 112) +#define MX50_INT_APBHDMA_CHAN3	(NR_IRQS_LEGACY + 113) +#define MX50_INT_APBHDMA_CHAN4	(NR_IRQS_LEGACY + 114) +#define MX50_INT_APBHDMA_CHAN5	(NR_IRQS_LEGACY + 115) +#define MX50_INT_APBHDMA_CHAN6	(NR_IRQS_LEGACY + 116) +#define MX50_INT_APBHDMA_CHAN7	(NR_IRQS_LEGACY + 117)  #if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS)  extern int mx50_revision(void); diff --git a/arch/arm/plat-mxc/include/mach/mx51.h b/arch/arm/plat-mxc/include/mach/mx51.h index cdf07c65ec1..af844f76261 100644 --- a/arch/arm/plat-mxc/include/mach/mx51.h +++ b/arch/arm/plat-mxc/include/mach/mx51.h @@ -232,110 +232,111 @@  /*   * Interrupt numbers   */ -#define MX51_INT_BASE			0 -#define MX51_INT_RESV0			0 -#define MX51_INT_ESDHC1			1 -#define MX51_INT_ESDHC2			2 -#define MX51_INT_ESDHC3			3 -#define MX51_INT_ESDHC4			4 -#define MX51_INT_RESV5			5 -#define MX51_INT_SDMA			6 -#define MX51_INT_IOMUX			7 -#define MX51_INT_NFC			8 -#define MX51_INT_VPU			9 -#define MX51_INT_IPU_ERR		10 -#define MX51_INT_IPU_SYN		11 -#define MX51_INT_GPU			12 -#define MX51_INT_RESV13			13 -#define MX51_INT_USB_HS1		14 -#define MX51_INT_EMI			15 -#define MX51_INT_USB_HS2		16 -#define MX51_INT_USB_HS3		17 -#define MX51_INT_USB_OTG		18 -#define MX51_INT_SAHARA_H0		19 -#define MX51_INT_SAHARA_H1		20 -#define MX51_INT_SCC_SMN		21 -#define MX51_INT_SCC_STZ		22 -#define MX51_INT_SCC_SCM		23 -#define MX51_INT_SRTC_NTZ		24 -#define MX51_INT_SRTC_TZ		25 -#define MX51_INT_RTIC			26 -#define MX51_INT_CSU			27 -#define MX51_INT_SLIM_B			28 -#define MX51_INT_SSI1			29 -#define MX51_INT_SSI2			30 -#define MX51_INT_UART1			31 -#define MX51_INT_UART2			32 -#define MX51_INT_UART3			33 -#define MX51_INT_RESV34			34 -#define MX51_INT_RESV35			35 -#define MX51_INT_ECSPI1			36 -#define MX51_INT_ECSPI2			37 -#define MX51_INT_CSPI			38 -#define MX51_INT_GPT			39 -#define MX51_INT_EPIT1			40 -#define MX51_INT_EPIT2			41 -#define MX51_INT_GPIO1_INT7		42 -#define MX51_INT_GPIO1_INT6		43 -#define MX51_INT_GPIO1_INT5		44 -#define MX51_INT_GPIO1_INT4		45 -#define MX51_INT_GPIO1_INT3		46 -#define MX51_INT_GPIO1_INT2		47 -#define MX51_INT_GPIO1_INT1		48 -#define MX51_INT_GPIO1_INT0		49 -#define MX51_INT_GPIO1_LOW		50 -#define MX51_INT_GPIO1_HIGH		51 -#define MX51_INT_GPIO2_LOW		52 -#define MX51_INT_GPIO2_HIGH		53 -#define MX51_INT_GPIO3_LOW		54 -#define MX51_INT_GPIO3_HIGH		55 -#define MX51_INT_GPIO4_LOW		56 -#define MX51_INT_GPIO4_HIGH		57 -#define MX51_INT_WDOG1			58 -#define MX51_INT_WDOG2			59 -#define MX51_INT_KPP			60 -#define MX51_INT_PWM1			61 -#define MX51_INT_I2C1			62 -#define MX51_INT_I2C2			63 -#define MX51_INT_HS_I2C			64 -#define MX51_INT_RESV65			65 -#define MX51_INT_RESV66			66 -#define MX51_INT_SIM_IPB		67 -#define MX51_INT_SIM_DAT		68 -#define MX51_INT_IIM			69 -#define MX51_INT_ATA			70 -#define MX51_INT_CCM1			71 -#define MX51_INT_CCM2			72 -#define MX51_INT_GPC1				73 -#define MX51_INT_GPC2			74 -#define MX51_INT_SRC			75 -#define MX51_INT_NM			76 -#define MX51_INT_PMU			77 -#define MX51_INT_CTI_IRQ		78 -#define MX51_INT_CTI1_TG0		79 -#define MX51_INT_CTI1_TG1		80 -#define MX51_INT_MCG_ERR		81 -#define MX51_INT_MCG_TMR		82 -#define MX51_INT_MCG_FUNC		83 -#define MX51_INT_GPU2_IRQ		84 -#define MX51_INT_GPU2_BUSY		85 -#define MX51_INT_RESV86			86 -#define MX51_INT_FEC			87 -#define MX51_INT_OWIRE			88 -#define MX51_INT_CTI1_TG2		89 -#define MX51_INT_SJC			90 -#define MX51_INT_SPDIF			91 -#define MX51_INT_TVE			92 -#define MX51_INT_FIRI			93 -#define MX51_INT_PWM2			94 -#define MX51_INT_SLIM_EXP		95 -#define MX51_INT_SSI3			96 -#define MX51_INT_EMI_BOOT		97 -#define MX51_INT_CTI1_TG3		98 -#define MX51_INT_SMC_RX			99 -#define MX51_INT_VPU_IDLE		100 -#define MX51_INT_EMI_NFC		101 -#define MX51_INT_GPU_IDLE		102 +#include <asm/irq.h> +#define MX51_INT_BASE			(NR_IRQS_LEGACY + 0) +#define MX51_INT_RESV0			(NR_IRQS_LEGACY + 0) +#define MX51_INT_ESDHC1			(NR_IRQS_LEGACY + 1) +#define MX51_INT_ESDHC2			(NR_IRQS_LEGACY + 2) +#define MX51_INT_ESDHC3			(NR_IRQS_LEGACY + 3) +#define MX51_INT_ESDHC4			(NR_IRQS_LEGACY + 4) +#define MX51_INT_RESV5			(NR_IRQS_LEGACY + 5) +#define MX51_INT_SDMA			(NR_IRQS_LEGACY + 6) +#define MX51_INT_IOMUX			(NR_IRQS_LEGACY + 7) +#define MX51_INT_NFC			(NR_IRQS_LEGACY + 8) +#define MX51_INT_VPU			(NR_IRQS_LEGACY + 9) +#define MX51_INT_IPU_ERR		(NR_IRQS_LEGACY + 10) +#define MX51_INT_IPU_SYN		(NR_IRQS_LEGACY + 11) +#define MX51_INT_GPU			(NR_IRQS_LEGACY + 12) +#define MX51_INT_RESV13			(NR_IRQS_LEGACY + 13) +#define MX51_INT_USB_HS1		(NR_IRQS_LEGACY + 14) +#define MX51_INT_EMI			(NR_IRQS_LEGACY + 15) +#define MX51_INT_USB_HS2		(NR_IRQS_LEGACY + 16) +#define MX51_INT_USB_HS3		(NR_IRQS_LEGACY + 17) +#define MX51_INT_USB_OTG		(NR_IRQS_LEGACY + 18) +#define MX51_INT_SAHARA_H0		(NR_IRQS_LEGACY + 19) +#define MX51_INT_SAHARA_H1		(NR_IRQS_LEGACY + 20) +#define MX51_INT_SCC_SMN		(NR_IRQS_LEGACY + 21) +#define MX51_INT_SCC_STZ		(NR_IRQS_LEGACY + 22) +#define MX51_INT_SCC_SCM		(NR_IRQS_LEGACY + 23) +#define MX51_INT_SRTC_NTZ		(NR_IRQS_LEGACY + 24) +#define MX51_INT_SRTC_TZ		(NR_IRQS_LEGACY + 25) +#define MX51_INT_RTIC			(NR_IRQS_LEGACY + 26) +#define MX51_INT_CSU			(NR_IRQS_LEGACY + 27) +#define MX51_INT_SLIM_B			(NR_IRQS_LEGACY + 28) +#define MX51_INT_SSI1			(NR_IRQS_LEGACY + 29) +#define MX51_INT_SSI2			(NR_IRQS_LEGACY + 30) +#define MX51_INT_UART1			(NR_IRQS_LEGACY + 31) +#define MX51_INT_UART2			(NR_IRQS_LEGACY + 32) +#define MX51_INT_UART3			(NR_IRQS_LEGACY + 33) +#define MX51_INT_RESV34			(NR_IRQS_LEGACY + 34) +#define MX51_INT_RESV35			(NR_IRQS_LEGACY + 35) +#define MX51_INT_ECSPI1			(NR_IRQS_LEGACY + 36) +#define MX51_INT_ECSPI2			(NR_IRQS_LEGACY + 37) +#define MX51_INT_CSPI			(NR_IRQS_LEGACY + 38) +#define MX51_INT_GPT			(NR_IRQS_LEGACY + 39) +#define MX51_INT_EPIT1			(NR_IRQS_LEGACY + 40) +#define MX51_INT_EPIT2			(NR_IRQS_LEGACY + 41) +#define MX51_INT_GPIO1_INT7		(NR_IRQS_LEGACY + 42) +#define MX51_INT_GPIO1_INT6		(NR_IRQS_LEGACY + 43) +#define MX51_INT_GPIO1_INT5		(NR_IRQS_LEGACY + 44) +#define MX51_INT_GPIO1_INT4		(NR_IRQS_LEGACY + 45) +#define MX51_INT_GPIO1_INT3		(NR_IRQS_LEGACY + 46) +#define MX51_INT_GPIO1_INT2		(NR_IRQS_LEGACY + 47) +#define MX51_INT_GPIO1_INT1		(NR_IRQS_LEGACY + 48) +#define MX51_INT_GPIO1_INT0		(NR_IRQS_LEGACY + 49) +#define MX51_INT_GPIO1_LOW		(NR_IRQS_LEGACY + 50) +#define MX51_INT_GPIO1_HIGH		(NR_IRQS_LEGACY + 51) +#define MX51_INT_GPIO2_LOW		(NR_IRQS_LEGACY + 52) +#define MX51_INT_GPIO2_HIGH		(NR_IRQS_LEGACY + 53) +#define MX51_INT_GPIO3_LOW		(NR_IRQS_LEGACY + 54) +#define MX51_INT_GPIO3_HIGH		(NR_IRQS_LEGACY + 55) +#define MX51_INT_GPIO4_LOW		(NR_IRQS_LEGACY + 56) +#define MX51_INT_GPIO4_HIGH		(NR_IRQS_LEGACY + 57) +#define MX51_INT_WDOG1			(NR_IRQS_LEGACY + 58) +#define MX51_INT_WDOG2			(NR_IRQS_LEGACY + 59) +#define MX51_INT_KPP			(NR_IRQS_LEGACY + 60) +#define MX51_INT_PWM1			(NR_IRQS_LEGACY + 61) +#define MX51_INT_I2C1			(NR_IRQS_LEGACY + 62) +#define MX51_INT_I2C2			(NR_IRQS_LEGACY + 63) +#define MX51_INT_HS_I2C			(NR_IRQS_LEGACY + 64) +#define MX51_INT_RESV65			(NR_IRQS_LEGACY + 65) +#define MX51_INT_RESV66			(NR_IRQS_LEGACY + 66) +#define MX51_INT_SIM_IPB		(NR_IRQS_LEGACY + 67) +#define MX51_INT_SIM_DAT		(NR_IRQS_LEGACY + 68) +#define MX51_INT_IIM			(NR_IRQS_LEGACY + 69) +#define MX51_INT_ATA			(NR_IRQS_LEGACY + 70) +#define MX51_INT_CCM1			(NR_IRQS_LEGACY + 71) +#define MX51_INT_CCM2			(NR_IRQS_LEGACY + 72) +#define MX51_INT_GPC1			(NR_IRQS_LEGACY + 73) +#define MX51_INT_GPC2			(NR_IRQS_LEGACY + 74) +#define MX51_INT_SRC			(NR_IRQS_LEGACY + 75) +#define MX51_INT_NM			(NR_IRQS_LEGACY + 76) +#define MX51_INT_PMU			(NR_IRQS_LEGACY + 77) +#define MX51_INT_CTI_IRQ		(NR_IRQS_LEGACY + 78) +#define MX51_INT_CTI1_TG0		(NR_IRQS_LEGACY + 79) +#define MX51_INT_CTI1_TG1		(NR_IRQS_LEGACY + 80) +#define MX51_INT_MCG_ERR		(NR_IRQS_LEGACY + 81) +#define MX51_INT_MCG_TMR		(NR_IRQS_LEGACY + 82) +#define MX51_INT_MCG_FUNC		(NR_IRQS_LEGACY + 83) +#define MX51_INT_GPU2_IRQ		(NR_IRQS_LEGACY + 84) +#define MX51_INT_GPU2_BUSY		(NR_IRQS_LEGACY + 85) +#define MX51_INT_RESV86			(NR_IRQS_LEGACY + 86) +#define MX51_INT_FEC			(NR_IRQS_LEGACY + 87) +#define MX51_INT_OWIRE			(NR_IRQS_LEGACY + 88) +#define MX51_INT_CTI1_TG2		(NR_IRQS_LEGACY + 89) +#define MX51_INT_SJC			(NR_IRQS_LEGACY + 90) +#define MX51_INT_SPDIF			(NR_IRQS_LEGACY + 91) +#define MX51_INT_TVE			(NR_IRQS_LEGACY + 92) +#define MX51_INT_FIRI			(NR_IRQS_LEGACY + 93) +#define MX51_INT_PWM2			(NR_IRQS_LEGACY + 94) +#define MX51_INT_SLIM_EXP		(NR_IRQS_LEGACY + 95) +#define MX51_INT_SSI3			(NR_IRQS_LEGACY + 96) +#define MX51_INT_EMI_BOOT		(NR_IRQS_LEGACY + 97) +#define MX51_INT_CTI1_TG3		(NR_IRQS_LEGACY + 98) +#define MX51_INT_SMC_RX			(NR_IRQS_LEGACY + 99) +#define MX51_INT_VPU_IDLE		(NR_IRQS_LEGACY + 100) +#define MX51_INT_EMI_NFC		(NR_IRQS_LEGACY + 101) +#define MX51_INT_GPU_IDLE		(NR_IRQS_LEGACY + 102)  #if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS)  extern int mx51_revision(void); diff --git a/arch/arm/plat-mxc/include/mach/mx53.h b/arch/arm/plat-mxc/include/mach/mx53.h index a37e8c35399..f829d1c2250 100644 --- a/arch/arm/plat-mxc/include/mach/mx53.h +++ b/arch/arm/plat-mxc/include/mach/mx53.h @@ -229,113 +229,114 @@  /*   * Interrupt numbers   */ -#define MX53_INT_RESV0		0 -#define MX53_INT_ESDHC1	1 -#define MX53_INT_ESDHC2	2 -#define MX53_INT_ESDHC3	3 -#define MX53_INT_ESDHC4	4 -#define MX53_INT_DAP	5 -#define MX53_INT_SDMA	6 -#define MX53_INT_IOMUX	7 -#define MX53_INT_NFC	8 -#define MX53_INT_VPU	9 -#define MX53_INT_IPU_ERR	10 -#define MX53_INT_IPU_SYN	11 -#define MX53_INT_GPU	12 -#define MX53_INT_UART4	13 -#define MX53_INT_USB_H1	14 -#define MX53_INT_EMI	15 -#define MX53_INT_USB_H2	16 -#define MX53_INT_USB_H3	17 -#define MX53_INT_USB_OTG	18 -#define MX53_INT_SAHARA_H0	19 -#define MX53_INT_SAHARA_H1	20 -#define MX53_INT_SCC_SMN	21 -#define MX53_INT_SCC_STZ	22 -#define MX53_INT_SCC_SCM	23 -#define MX53_INT_SRTC_NTZ	24 -#define MX53_INT_SRTC_TZ	25 -#define MX53_INT_RTIC	26 -#define MX53_INT_CSU	27 -#define MX53_INT_SATA	28 -#define MX53_INT_SSI1	29 -#define MX53_INT_SSI2	30 -#define MX53_INT_UART1	31 -#define MX53_INT_UART2	32 -#define MX53_INT_UART3	33 -#define MX53_INT_RTC	34 -#define MX53_INT_PTP	35 -#define MX53_INT_ECSPI1	36 -#define MX53_INT_ECSPI2	37 -#define MX53_INT_CSPI	38 -#define MX53_INT_GPT	39 -#define MX53_INT_EPIT1	40 -#define MX53_INT_EPIT2	41 -#define MX53_INT_GPIO1_INT7	42 -#define MX53_INT_GPIO1_INT6	43 -#define MX53_INT_GPIO1_INT5	44 -#define MX53_INT_GPIO1_INT4	45 -#define MX53_INT_GPIO1_INT3	46 -#define MX53_INT_GPIO1_INT2	47 -#define MX53_INT_GPIO1_INT1	48 -#define MX53_INT_GPIO1_INT0	49 -#define MX53_INT_GPIO1_LOW	50 -#define MX53_INT_GPIO1_HIGH	51 -#define MX53_INT_GPIO2_LOW	52 -#define MX53_INT_GPIO2_HIGH	53 -#define MX53_INT_GPIO3_LOW	54 -#define MX53_INT_GPIO3_HIGH	55 -#define MX53_INT_GPIO4_LOW	56 -#define MX53_INT_GPIO4_HIGH	57 -#define MX53_INT_WDOG1	58 -#define MX53_INT_WDOG2	59 -#define MX53_INT_KPP	60 -#define MX53_INT_PWM1	61 -#define MX53_INT_I2C1	62 -#define MX53_INT_I2C2	63 -#define MX53_INT_I2C3	64 -#define MX53_INT_MLB	65 -#define MX53_INT_ASRC	66 -#define MX53_INT_SPDIF	67 -#define MX53_INT_SIM_DAT	68 -#define MX53_INT_IIM	69 -#define MX53_INT_ATA	70 -#define MX53_INT_CCM1	71 -#define MX53_INT_CCM2	72 -#define MX53_INT_GPC1	73 -#define MX53_INT_GPC2	74 -#define MX53_INT_SRC	75 -#define MX53_INT_NM		76 -#define MX53_INT_PMU	77 -#define MX53_INT_CTI_IRQ	78 -#define MX53_INT_CTI1_TG0	79 -#define MX53_INT_CTI1_TG1	80 -#define MX53_INT_ESAI	81 -#define MX53_INT_CAN1	82 -#define MX53_INT_CAN2	83 -#define MX53_INT_GPU2_IRQ	84 -#define MX53_INT_GPU2_BUSY	85 -#define MX53_INT_UART5	86 -#define MX53_INT_FEC	87 -#define MX53_INT_OWIRE	88 -#define MX53_INT_CTI1_TG2	89 -#define MX53_INT_SJC	90 -#define MX53_INT_TVE	92 -#define MX53_INT_FIRI	93 -#define MX53_INT_PWM2	94 -#define MX53_INT_SLIM_EXP	95 -#define MX53_INT_SSI3	96 -#define MX53_INT_EMI_BOOT	97 -#define MX53_INT_CTI1_TG3	98 -#define MX53_INT_SMC_RX	99 -#define MX53_INT_VPU_IDLE	100 -#define MX53_INT_EMI_NFC	101 -#define MX53_INT_GPU_IDLE	102 -#define MX53_INT_GPIO5_LOW	103 -#define MX53_INT_GPIO5_HIGH	104 -#define MX53_INT_GPIO6_LOW	105 -#define MX53_INT_GPIO6_HIGH	106 -#define MX53_INT_GPIO7_LOW	107 -#define MX53_INT_GPIO7_HIGH	108 +#include <asm/irq.h> +#define MX53_INT_RESV0		(NR_IRQS_LEGACY + 0) +#define MX53_INT_ESDHC1		(NR_IRQS_LEGACY + 1) +#define MX53_INT_ESDHC2		(NR_IRQS_LEGACY + 2) +#define MX53_INT_ESDHC3		(NR_IRQS_LEGACY + 3) +#define MX53_INT_ESDHC4		(NR_IRQS_LEGACY + 4) +#define MX53_INT_DAP		(NR_IRQS_LEGACY + 5) +#define MX53_INT_SDMA		(NR_IRQS_LEGACY + 6) +#define MX53_INT_IOMUX		(NR_IRQS_LEGACY + 7) +#define MX53_INT_NFC		(NR_IRQS_LEGACY + 8) +#define MX53_INT_VPU		(NR_IRQS_LEGACY + 9) +#define MX53_INT_IPU_ERR	(NR_IRQS_LEGACY + 10) +#define MX53_INT_IPU_SYN	(NR_IRQS_LEGACY + 11) +#define MX53_INT_GPU		(NR_IRQS_LEGACY + 12) +#define MX53_INT_UART4		(NR_IRQS_LEGACY + 13) +#define MX53_INT_USB_H1		(NR_IRQS_LEGACY + 14) +#define MX53_INT_EMI		(NR_IRQS_LEGACY + 15) +#define MX53_INT_USB_H2		(NR_IRQS_LEGACY + 16) +#define MX53_INT_USB_H3		(NR_IRQS_LEGACY + 17) +#define MX53_INT_USB_OTG	(NR_IRQS_LEGACY + 18) +#define MX53_INT_SAHARA_H0	(NR_IRQS_LEGACY + 19) +#define MX53_INT_SAHARA_H1	(NR_IRQS_LEGACY + 20) +#define MX53_INT_SCC_SMN	(NR_IRQS_LEGACY + 21) +#define MX53_INT_SCC_STZ	(NR_IRQS_LEGACY + 22) +#define MX53_INT_SCC_SCM	(NR_IRQS_LEGACY + 23) +#define MX53_INT_SRTC_NTZ	(NR_IRQS_LEGACY + 24) +#define MX53_INT_SRTC_TZ	(NR_IRQS_LEGACY + 25) +#define MX53_INT_RTIC		(NR_IRQS_LEGACY + 26) +#define MX53_INT_CSU		(NR_IRQS_LEGACY + 27) +#define MX53_INT_SATA		(NR_IRQS_LEGACY + 28) +#define MX53_INT_SSI1		(NR_IRQS_LEGACY + 29) +#define MX53_INT_SSI2		(NR_IRQS_LEGACY + 30) +#define MX53_INT_UART1		(NR_IRQS_LEGACY + 31) +#define MX53_INT_UART2		(NR_IRQS_LEGACY + 32) +#define MX53_INT_UART3		(NR_IRQS_LEGACY + 33) +#define MX53_INT_RTC		(NR_IRQS_LEGACY + 34) +#define MX53_INT_PTP		(NR_IRQS_LEGACY + 35) +#define MX53_INT_ECSPI1		(NR_IRQS_LEGACY + 36) +#define MX53_INT_ECSPI2		(NR_IRQS_LEGACY + 37) +#define MX53_INT_CSPI		(NR_IRQS_LEGACY + 38) +#define MX53_INT_GPT		(NR_IRQS_LEGACY + 39) +#define MX53_INT_EPIT1		(NR_IRQS_LEGACY + 40) +#define MX53_INT_EPIT2		(NR_IRQS_LEGACY + 41) +#define MX53_INT_GPIO1_INT7	(NR_IRQS_LEGACY + 42) +#define MX53_INT_GPIO1_INT6	(NR_IRQS_LEGACY + 43) +#define MX53_INT_GPIO1_INT5	(NR_IRQS_LEGACY + 44) +#define MX53_INT_GPIO1_INT4	(NR_IRQS_LEGACY + 45) +#define MX53_INT_GPIO1_INT3	(NR_IRQS_LEGACY + 46) +#define MX53_INT_GPIO1_INT2	(NR_IRQS_LEGACY + 47) +#define MX53_INT_GPIO1_INT1	(NR_IRQS_LEGACY + 48) +#define MX53_INT_GPIO1_INT0	(NR_IRQS_LEGACY + 49) +#define MX53_INT_GPIO1_LOW	(NR_IRQS_LEGACY + 50) +#define MX53_INT_GPIO1_HIGH	(NR_IRQS_LEGACY + 51) +#define MX53_INT_GPIO2_LOW	(NR_IRQS_LEGACY + 52) +#define MX53_INT_GPIO2_HIGH	(NR_IRQS_LEGACY + 53) +#define MX53_INT_GPIO3_LOW	(NR_IRQS_LEGACY + 54) +#define MX53_INT_GPIO3_HIGH	(NR_IRQS_LEGACY + 55) +#define MX53_INT_GPIO4_LOW	(NR_IRQS_LEGACY + 56) +#define MX53_INT_GPIO4_HIGH	(NR_IRQS_LEGACY + 57) +#define MX53_INT_WDOG1		(NR_IRQS_LEGACY + 58) +#define MX53_INT_WDOG2		(NR_IRQS_LEGACY + 59) +#define MX53_INT_KPP		(NR_IRQS_LEGACY + 60) +#define MX53_INT_PWM1		(NR_IRQS_LEGACY + 61) +#define MX53_INT_I2C1		(NR_IRQS_LEGACY + 62) +#define MX53_INT_I2C2		(NR_IRQS_LEGACY + 63) +#define MX53_INT_I2C3		(NR_IRQS_LEGACY + 64) +#define MX53_INT_MLB		(NR_IRQS_LEGACY + 65) +#define MX53_INT_ASRC		(NR_IRQS_LEGACY + 66) +#define MX53_INT_SPDIF		(NR_IRQS_LEGACY + 67) +#define MX53_INT_SIM_DAT	(NR_IRQS_LEGACY + 68) +#define MX53_INT_IIM		(NR_IRQS_LEGACY + 69) +#define MX53_INT_ATA		(NR_IRQS_LEGACY + 70) +#define MX53_INT_CCM1		(NR_IRQS_LEGACY + 71) +#define MX53_INT_CCM2		(NR_IRQS_LEGACY + 72) +#define MX53_INT_GPC1		(NR_IRQS_LEGACY + 73) +#define MX53_INT_GPC2		(NR_IRQS_LEGACY + 74) +#define MX53_INT_SRC		(NR_IRQS_LEGACY + 75) +#define MX53_INT_NM		(NR_IRQS_LEGACY + 76) +#define MX53_INT_PMU		(NR_IRQS_LEGACY + 77) +#define MX53_INT_CTI_IRQ	(NR_IRQS_LEGACY + 78) +#define MX53_INT_CTI1_TG0	(NR_IRQS_LEGACY + 79) +#define MX53_INT_CTI1_TG1	(NR_IRQS_LEGACY + 80) +#define MX53_INT_ESAI		(NR_IRQS_LEGACY + 81) +#define MX53_INT_CAN1		(NR_IRQS_LEGACY + 82) +#define MX53_INT_CAN2		(NR_IRQS_LEGACY + 83) +#define MX53_INT_GPU2_IRQ	(NR_IRQS_LEGACY + 84) +#define MX53_INT_GPU2_BUSY	(NR_IRQS_LEGACY + 85) +#define MX53_INT_UART5		(NR_IRQS_LEGACY + 86) +#define MX53_INT_FEC		(NR_IRQS_LEGACY + 87) +#define MX53_INT_OWIRE		(NR_IRQS_LEGACY + 88) +#define MX53_INT_CTI1_TG2	(NR_IRQS_LEGACY + 89) +#define MX53_INT_SJC		(NR_IRQS_LEGACY + 90) +#define MX53_INT_TVE		(NR_IRQS_LEGACY + 92) +#define MX53_INT_FIRI		(NR_IRQS_LEGACY + 93) +#define MX53_INT_PWM2		(NR_IRQS_LEGACY + 94) +#define MX53_INT_SLIM_EXP	(NR_IRQS_LEGACY + 95) +#define MX53_INT_SSI3		(NR_IRQS_LEGACY + 96) +#define MX53_INT_EMI_BOOT	(NR_IRQS_LEGACY + 97) +#define MX53_INT_CTI1_TG3	(NR_IRQS_LEGACY + 98) +#define MX53_INT_SMC_RX		(NR_IRQS_LEGACY + 99) +#define MX53_INT_VPU_IDLE	(NR_IRQS_LEGACY + 100) +#define MX53_INT_EMI_NFC	(NR_IRQS_LEGACY + 101) +#define MX53_INT_GPU_IDLE	(NR_IRQS_LEGACY + 102) +#define MX53_INT_GPIO5_LOW	(NR_IRQS_LEGACY + 103) +#define MX53_INT_GPIO5_HIGH	(NR_IRQS_LEGACY + 104) +#define MX53_INT_GPIO6_LOW	(NR_IRQS_LEGACY + 105) +#define MX53_INT_GPIO6_HIGH	(NR_IRQS_LEGACY + 106) +#define MX53_INT_GPIO7_LOW	(NR_IRQS_LEGACY + 107) +#define MX53_INT_GPIO7_HIGH	(NR_IRQS_LEGACY + 108)  #endif /* ifndef __MACH_MX53_H__ */ diff --git a/arch/arm/plat-mxc/include/mach/mxc_ehci.h b/arch/arm/plat-mxc/include/mach/mxc_ehci.h index 9ffd1bbe615..7eb9d132967 100644 --- a/arch/arm/plat-mxc/include/mach/mxc_ehci.h +++ b/arch/arm/plat-mxc/include/mach/mxc_ehci.h @@ -20,13 +20,15 @@  #define MXC_EHCI_INTERFACE_MASK		(0xf)  #define MXC_EHCI_POWER_PINS_ENABLED	(1 << 5) -#define MXC_EHCI_TTL_ENABLED		(1 << 6) +#define MXC_EHCI_PWR_PIN_ACTIVE_HIGH	(1 << 6) +#define MXC_EHCI_OC_PIN_ACTIVE_LOW	(1 << 7) +#define MXC_EHCI_TTL_ENABLED		(1 << 8) -#define MXC_EHCI_INTERNAL_PHY		(1 << 7) -#define MXC_EHCI_IPPUE_DOWN		(1 << 8) -#define MXC_EHCI_IPPUE_UP		(1 << 9) -#define MXC_EHCI_WAKEUP_ENABLED	(1 << 10) -#define MXC_EHCI_ITC_NO_THRESHOLD	(1 << 11) +#define MXC_EHCI_INTERNAL_PHY		(1 << 9) +#define MXC_EHCI_IPPUE_DOWN		(1 << 10) +#define MXC_EHCI_IPPUE_UP		(1 << 11) +#define MXC_EHCI_WAKEUP_ENABLED		(1 << 12) +#define MXC_EHCI_ITC_NO_THRESHOLD	(1 << 13)  #define MXC_USBCTRL_OFFSET		0  #define MXC_USB_PHY_CTR_FUNC_OFFSET	0x8 diff --git a/arch/arm/plat-mxc/pwm.c b/arch/arm/plat-mxc/pwm.c deleted file mode 100644 index c0cab2270dd..00000000000 --- a/arch/arm/plat-mxc/pwm.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - * simple driver for PWM (Pulse Width Modulator) controller - * - * 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. - * - * Derived from pxa PWM driver by eric miao <eric.miao@marvell.com> - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/pwm.h> -#include <mach/hardware.h> - - -/* i.MX1 and i.MX21 share the same PWM function block: */ - -#define MX1_PWMC    0x00   /* PWM Control Register */ -#define MX1_PWMS    0x04   /* PWM Sample Register */ -#define MX1_PWMP    0x08   /* PWM Period Register */ - - -/* i.MX27, i.MX31, i.MX35 share the same PWM function block: */ - -#define MX3_PWMCR                 0x00    /* PWM Control Register */ -#define MX3_PWMSAR                0x0C    /* PWM Sample Register */ -#define MX3_PWMPR                 0x10    /* PWM Period Register */ -#define MX3_PWMCR_PRESCALER(x)    (((x - 1) & 0xFFF) << 4) -#define MX3_PWMCR_DOZEEN                (1 << 24) -#define MX3_PWMCR_WAITEN                (1 << 23) -#define MX3_PWMCR_DBGEN			(1 << 22) -#define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) -#define MX3_PWMCR_CLKSRC_IPG      (1 << 16) -#define MX3_PWMCR_EN              (1 << 0) - - - -struct pwm_device { -	struct list_head	node; -	struct platform_device *pdev; - -	const char	*label; -	struct clk	*clk; - -	int		clk_enabled; -	void __iomem	*mmio_base; - -	unsigned int	use_count; -	unsigned int	pwm_id; -}; - -int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) -{ -	if (pwm == NULL || period_ns == 0 || duty_ns > period_ns) -		return -EINVAL; - -	if (!(cpu_is_mx1() || cpu_is_mx21())) { -		unsigned long long c; -		unsigned long period_cycles, duty_cycles, prescale; -		u32 cr; - -		c = clk_get_rate(pwm->clk); -		c = c * period_ns; -		do_div(c, 1000000000); -		period_cycles = c; - -		prescale = period_cycles / 0x10000 + 1; - -		period_cycles /= prescale; -		c = (unsigned long long)period_cycles * duty_ns; -		do_div(c, period_ns); -		duty_cycles = c; - -		/* -		 * according to imx pwm RM, the real period value should be -		 * PERIOD value in PWMPR plus 2. -		 */ -		if (period_cycles > 2) -			period_cycles -= 2; -		else -			period_cycles = 0; - -		writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); -		writel(period_cycles, pwm->mmio_base + MX3_PWMPR); - -		cr = MX3_PWMCR_PRESCALER(prescale) | -			MX3_PWMCR_DOZEEN | MX3_PWMCR_WAITEN | -			MX3_PWMCR_DBGEN | MX3_PWMCR_EN; - -		if (cpu_is_mx25()) -			cr |= MX3_PWMCR_CLKSRC_IPG; -		else -			cr |= MX3_PWMCR_CLKSRC_IPG_HIGH; - -		writel(cr, pwm->mmio_base + MX3_PWMCR); -	} else if (cpu_is_mx1() || cpu_is_mx21()) { -		/* The PWM subsystem allows for exact frequencies. However, -		 * I cannot connect a scope on my device to the PWM line and -		 * thus cannot provide the program the PWM controller -		 * exactly. Instead, I'm relying on the fact that the -		 * Bootloader (u-boot or WinCE+haret) has programmed the PWM -		 * function group already. So I'll just modify the PWM sample -		 * register to follow the ratio of duty_ns vs. period_ns -		 * accordingly. -		 * -		 * This is good enough for programming the brightness of -		 * the LCD backlight. -		 * -		 * The real implementation would divide PERCLK[0] first by -		 * both the prescaler (/1 .. /128) and then by CLKSEL -		 * (/2 .. /16). -		 */ -		u32 max = readl(pwm->mmio_base + MX1_PWMP); -		u32 p = max * duty_ns / period_ns; -		writel(max - p, pwm->mmio_base + MX1_PWMS); -	} else { -		BUG(); -	} - -	return 0; -} -EXPORT_SYMBOL(pwm_config); - -int pwm_enable(struct pwm_device *pwm) -{ -	int rc = 0; - -	if (!pwm->clk_enabled) { -		rc = clk_prepare_enable(pwm->clk); -		if (!rc) -			pwm->clk_enabled = 1; -	} -	return rc; -} -EXPORT_SYMBOL(pwm_enable); - -void pwm_disable(struct pwm_device *pwm) -{ -	writel(0, pwm->mmio_base + MX3_PWMCR); - -	if (pwm->clk_enabled) { -		clk_disable_unprepare(pwm->clk); -		pwm->clk_enabled = 0; -	} -} -EXPORT_SYMBOL(pwm_disable); - -static DEFINE_MUTEX(pwm_lock); -static LIST_HEAD(pwm_list); - -struct pwm_device *pwm_request(int pwm_id, const char *label) -{ -	struct pwm_device *pwm; -	int found = 0; - -	mutex_lock(&pwm_lock); - -	list_for_each_entry(pwm, &pwm_list, node) { -		if (pwm->pwm_id == pwm_id) { -			found = 1; -			break; -		} -	} - -	if (found) { -		if (pwm->use_count == 0) { -			pwm->use_count++; -			pwm->label = label; -		} else -			pwm = ERR_PTR(-EBUSY); -	} else -		pwm = ERR_PTR(-ENOENT); - -	mutex_unlock(&pwm_lock); -	return pwm; -} -EXPORT_SYMBOL(pwm_request); - -void pwm_free(struct pwm_device *pwm) -{ -	mutex_lock(&pwm_lock); - -	if (pwm->use_count) { -		pwm->use_count--; -		pwm->label = NULL; -	} else -		pr_warning("PWM device already freed\n"); - -	mutex_unlock(&pwm_lock); -} -EXPORT_SYMBOL(pwm_free); - -static int __devinit mxc_pwm_probe(struct platform_device *pdev) -{ -	struct pwm_device *pwm; -	struct resource *r; -	int ret = 0; - -	pwm = kzalloc(sizeof(struct pwm_device), GFP_KERNEL); -	if (pwm == NULL) { -		dev_err(&pdev->dev, "failed to allocate memory\n"); -		return -ENOMEM; -	} - -	pwm->clk = clk_get(&pdev->dev, "pwm"); - -	if (IS_ERR(pwm->clk)) { -		ret = PTR_ERR(pwm->clk); -		goto err_free; -	} - -	pwm->clk_enabled = 0; - -	pwm->use_count = 0; -	pwm->pwm_id = pdev->id; -	pwm->pdev = pdev; - -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (r == NULL) { -		dev_err(&pdev->dev, "no memory resource defined\n"); -		ret = -ENODEV; -		goto err_free_clk; -	} - -	r = request_mem_region(r->start, resource_size(r), pdev->name); -	if (r == NULL) { -		dev_err(&pdev->dev, "failed to request memory resource\n"); -		ret = -EBUSY; -		goto err_free_clk; -	} - -	pwm->mmio_base = ioremap(r->start, resource_size(r)); -	if (pwm->mmio_base == NULL) { -		dev_err(&pdev->dev, "failed to ioremap() registers\n"); -		ret = -ENODEV; -		goto err_free_mem; -	} - -	mutex_lock(&pwm_lock); -	list_add_tail(&pwm->node, &pwm_list); -	mutex_unlock(&pwm_lock); - -	platform_set_drvdata(pdev, pwm); -	return 0; - -err_free_mem: -	release_mem_region(r->start, resource_size(r)); -err_free_clk: -	clk_put(pwm->clk); -err_free: -	kfree(pwm); -	return ret; -} - -static int __devexit mxc_pwm_remove(struct platform_device *pdev) -{ -	struct pwm_device *pwm; -	struct resource *r; - -	pwm = platform_get_drvdata(pdev); -	if (pwm == NULL) -		return -ENODEV; - -	mutex_lock(&pwm_lock); -	list_del(&pwm->node); -	mutex_unlock(&pwm_lock); - -	iounmap(pwm->mmio_base); - -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	release_mem_region(r->start, resource_size(r)); - -	clk_put(pwm->clk); - -	kfree(pwm); -	return 0; -} - -static struct platform_driver mxc_pwm_driver = { -	.driver		= { -		.name	= "mxc_pwm", -	}, -	.probe		= mxc_pwm_probe, -	.remove		= __devexit_p(mxc_pwm_remove), -}; - -static int __init mxc_pwm_init(void) -{ -	return platform_driver_register(&mxc_pwm_driver); -} -arch_initcall(mxc_pwm_init); - -static void __exit mxc_pwm_exit(void) -{ -	platform_driver_unregister(&mxc_pwm_driver); -} -module_exit(mxc_pwm_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); diff --git a/arch/arm/plat-mxc/time.c b/arch/arm/plat-mxc/time.c index 00e8e659e66..a17abcf9832 100644 --- a/arch/arm/plat-mxc/time.c +++ b/arch/arm/plat-mxc/time.c @@ -160,7 +160,8 @@ static const char *clock_event_mode_label[] = {  	[CLOCK_EVT_MODE_PERIODIC] = "CLOCK_EVT_MODE_PERIODIC",  	[CLOCK_EVT_MODE_ONESHOT]  = "CLOCK_EVT_MODE_ONESHOT",  	[CLOCK_EVT_MODE_SHUTDOWN] = "CLOCK_EVT_MODE_SHUTDOWN", -	[CLOCK_EVT_MODE_UNUSED]   = "CLOCK_EVT_MODE_UNUSED" +	[CLOCK_EVT_MODE_UNUSED]   = "CLOCK_EVT_MODE_UNUSED", +	[CLOCK_EVT_MODE_RESUME]   = "CLOCK_EVT_MODE_RESUME",  };  #endif /* DEBUG */ diff --git a/arch/arm/plat-mxc/tzic.c b/arch/arm/plat-mxc/tzic.c index 98308ec1f32..3ed1adbc09f 100644 --- a/arch/arm/plat-mxc/tzic.c +++ b/arch/arm/plat-mxc/tzic.c @@ -15,12 +15,15 @@  #include <linux/device.h>  #include <linux/errno.h>  #include <linux/io.h> +#include <linux/irqdomain.h> +#include <linux/of.h>  #include <asm/mach/irq.h>  #include <asm/exception.h>  #include <mach/hardware.h>  #include <mach/common.h> +#include <mach/irqs.h>  #include "irq-common.h" @@ -49,6 +52,7 @@  #define TZIC_ID0	0x0FD0	/* Indentification Register 0 */  void __iomem *tzic_base; /* Used as irq controller base in entry-macro.S */ +static struct irq_domain *domain;  #define TZIC_NUM_IRQS 128 @@ -77,15 +81,14 @@ static int tzic_set_irq_fiq(unsigned int irq, unsigned int type)  static void tzic_irq_suspend(struct irq_data *d)  {  	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); -	int idx = gc->irq_base >> 5; +	int idx = d->hwirq >> 5;  	__raw_writel(gc->wake_active, tzic_base + TZIC_WAKEUP0(idx));  }  static void tzic_irq_resume(struct irq_data *d)  { -	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); -	int idx = gc->irq_base >> 5; +	int idx = d->hwirq >> 5;  	__raw_writel(__raw_readl(tzic_base + TZIC_ENSET0(idx)),  		     tzic_base + TZIC_WAKEUP0(idx)); @@ -102,11 +105,10 @@ static struct mxc_extra_irq tzic_extra_irq = {  #endif  }; -static __init void tzic_init_gc(unsigned int irq_start) +static __init void tzic_init_gc(int idx, unsigned int irq_start)  {  	struct irq_chip_generic *gc;  	struct irq_chip_type *ct; -	int idx = irq_start >> 5;  	gc = irq_alloc_generic_chip("tzic", 1, irq_start, tzic_base,  				    handle_level_irq); @@ -140,7 +142,8 @@ asmlinkage void __exception_irq_entry tzic_handle_irq(struct pt_regs *regs)  			while (stat) {  				handled = 1;  				irqofs = fls(stat) - 1; -				handle_IRQ(irqofs + i * 32, regs); +				handle_IRQ(irq_find_mapping(domain, +						irqofs + i * 32), regs);  				stat &= ~(1 << irqofs);  			}  		} @@ -154,6 +157,8 @@ asmlinkage void __exception_irq_entry tzic_handle_irq(struct pt_regs *regs)   */  void __init tzic_init_irq(void __iomem *irqbase)  { +	struct device_node *np; +	int irq_base;  	int i;  	tzic_base = irqbase; @@ -175,12 +180,20 @@ void __init tzic_init_irq(void __iomem *irqbase)  	/* all IRQ no FIQ Warning :: No selection */ -	for (i = 0; i < TZIC_NUM_IRQS; i += 32) -		tzic_init_gc(i); +	irq_base = irq_alloc_descs(-1, 0, TZIC_NUM_IRQS, numa_node_id()); +	WARN_ON(irq_base < 0); + +	np = of_find_compatible_node(NULL, NULL, "fsl,tzic"); +	domain = irq_domain_add_legacy(np, TZIC_NUM_IRQS, irq_base, 0, +				       &irq_domain_simple_ops, NULL); +	WARN_ON(!domain); + +	for (i = 0; i < 4; i++, irq_base += 32) +		tzic_init_gc(i, irq_base);  #ifdef CONFIG_FIQ  	/* Initialize FIQ */ -	init_FIQ(); +	init_FIQ(FIQ_START);  #endif  	pr_info("TrustZone Interrupt Controller (TZIC) initialized\n"); @@ -190,6 +203,10 @@ void __init tzic_init_irq(void __iomem *irqbase)   * tzic_enable_wake() - enable wakeup interrupt   *   * @return			0 if successful; non-zero otherwise + * + * This function provides an interrupt synchronization point that is required + * by tzic enabled platforms before entering imx specific low power modes (ie, + * those low power modes beyond the WAIT_CLOCKED basic ARM WFI only mode).   */  int tzic_enable_wake(void)  { diff --git a/arch/arm/plat-nomadik/include/plat/i2c.h b/arch/arm/plat-nomadik/include/plat/i2c.h deleted file mode 100644 index 8ba70ffc31e..00000000000 --- a/arch/arm/plat-nomadik/include/plat/i2c.h +++ /dev/null @@ -1,39 +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 version 2, as - * published by the Free Software Foundation. - */ -#ifndef __PLAT_I2C_H -#define __PLAT_I2C_H - -enum i2c_freq_mode { -	I2C_FREQ_MODE_STANDARD,		/* up to 100 Kb/s */ -	I2C_FREQ_MODE_FAST,		/* up to 400 Kb/s */ -	I2C_FREQ_MODE_HIGH_SPEED,	/* up to 3.4 Mb/s */ -	I2C_FREQ_MODE_FAST_PLUS,	/* up to 1 Mb/s */ -}; - -/** - * struct nmk_i2c_controller - client specific controller configuration - * @clk_freq:	clock frequency for the operation mode - * @slsu:	Slave data setup time in ns. - *		The needed setup time for three modes of operation - *		are 250ns, 100ns and 10ns respectively thus leading - *		to the values of 14, 6, 2 for a 48 MHz i2c clk - * @tft:	Tx FIFO Threshold in bytes - * @rft:	Rx FIFO Threshold in bytes - * @timeout	Slave response timeout(ms) - * @sm:		speed mode - */ -struct nmk_i2c_controller { -	unsigned long	clk_freq; -	unsigned short	slsu; -	unsigned char	tft; -	unsigned char	rft; -	int timeout; -	enum i2c_freq_mode	sm; -}; - -#endif	/* __PLAT_I2C_H */ diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index ad95c7a5d00..dd36eba9506 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig @@ -29,7 +29,7 @@ config ARCH_OMAP2PLUS  	select USE_OF  	select PROC_DEVICETREE if PROC_FS  	help -	  "Systems based on OMAP2, OMAP3 or OMAP4" +	  "Systems based on OMAP2, OMAP3, OMAP4 or OMAP5"  endchoice @@ -45,31 +45,30 @@ config OMAP_DEBUG_LEDS  	depends on OMAP_DEBUG_DEVICES  	default y if LEDS_CLASS -config OMAP_SMARTREFLEX -	bool "SmartReflex support" -	depends on (ARCH_OMAP3 || ARCH_OMAP4) && PM +config POWER_AVS_OMAP +	bool "AVS(Adaptive Voltage Scaling) support for OMAP IP versions 1&2" +	depends on POWER_AVS && (ARCH_OMAP3 || ARCH_OMAP4) && PM  	help -	  Say Y if you want to enable SmartReflex. - -	  SmartReflex can perform continuous dynamic voltage -	  scaling around the nominal operating point voltage -	  according to silicon characteristics and operating -	  conditions. Enabling SmartReflex reduces power -	  consumption. +	  Say Y to enable AVS(Adaptive Voltage Scaling) +	  support on OMAP containing the version 1 or +	  version 2 of the SmartReflex IP. +	  V1 is the 65nm version used in OMAP3430. +	  V2 is the update for the 45nm version of the IP used in OMAP3630 +	  and OMAP4430  	  Please note, that by default SmartReflex is only -	  initialized. To enable the automatic voltage -	  compensation for vdd mpu  and vdd core from user space, +	  initialized and not enabled. To enable the automatic voltage +	  compensation for vdd mpu and vdd core from user space,  	  user must write 1 to -		/debug/voltage/vdd_<X>/smartreflex/autocomp, -	  where X is mpu or core for OMAP3. +		/debug/smartreflex/sr_<X>/autocomp, +	  where X is mpu_iva or core for OMAP3.  	  Optionally autocompensation can be enabled in the kernel  	  by default during system init via the enable_on_init flag  	  which an be passed as platform data to the smartreflex driver. -config OMAP_SMARTREFLEX_CLASS3 +config POWER_AVS_OMAP_CLASS3  	bool "Class 3 mode of Smartreflex Implementation" -	depends on OMAP_SMARTREFLEX && TWL4030_CORE +	depends on POWER_AVS_OMAP && TWL4030_CORE  	help  	  Say Y to enable Class 3 implementation of Smartreflex @@ -150,7 +149,7 @@ config OMAP_32K_TIMER  	  This timer saves power compared to the OMAP_MPU_TIMER, and has  	  support for no tick during idle. The 32KHz timer provides less  	  intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is -	  currently only available for OMAP16XX, 24XX, 34XX and OMAP4. +	  currently only available for OMAP16XX, 24XX, 34XX and OMAP4/5.  config OMAP3_L2_AUX_SECURE_SAVE_RESTORE  	bool "OMAP3 HS/EMU save and restore for L2 AUX control register" diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index ed8605f0115..961bf859bc0 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile @@ -4,15 +4,13 @@  # Common support  obj-y := common.o sram.o clock.o devices.o dma.o mux.o \ -	 usb.o fb.o counter_32k.o +	 fb.o counter_32k.o  obj-m :=  obj-n :=  obj-  :=  # omap_device support (OMAP2+ only at the moment) -obj-$(CONFIG_ARCH_OMAP2) += omap_device.o -obj-$(CONFIG_ARCH_OMAP3) += omap_device.o -obj-$(CONFIG_ARCH_OMAP4) += omap_device.o +obj-$(CONFIG_ARCH_OMAP2PLUS) += omap_device.o  obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o  obj-$(CONFIG_OMAP_DEBUG_DEVICES) += debug-devices.o diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index 0a9b9a97011..89a3723b353 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c @@ -77,3 +77,12 @@ void __init omap_init_consistent_dma_size(void)  	init_consistent_dma_size(CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE << 20);  #endif  } + +/* + * Stub function for OMAP2 so that common files + * continue to build when custom builds are used + */ +int __weak omap_secure_ram_reserve_memblock(void) +{ +	return 0; +} diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index 2132c4f389e..dbf1e03029a 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c @@ -29,7 +29,10 @@  #include <plat/clock.h>  /* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */ -#define OMAP2_32KSYNCNT_CR_OFF		0x10 +#define OMAP2_32KSYNCNT_REV_OFF		0x0 +#define OMAP2_32KSYNCNT_REV_SCHEME	(0x3 << 30) +#define OMAP2_32KSYNCNT_CR_OFF_LOW	0x10 +#define OMAP2_32KSYNCNT_CR_OFF_HIGH	0x30  /*   * 32KHz clocksource ... always available, on pretty most chips except @@ -84,9 +87,16 @@ int __init omap_init_clocksource_32k(void __iomem *vbase)  	int ret;  	/* -	 * 32k sync Counter register offset is at 0x10 +	 * 32k sync Counter IP register offsets vary between the +	 * highlander version and the legacy ones. +	 * The 'SCHEME' bits(30-31) of the revision register is used +	 * to identify the version.  	 */ -	sync32k_cnt_reg = vbase + OMAP2_32KSYNCNT_CR_OFF; +	if (__raw_readl(vbase + OMAP2_32KSYNCNT_REV_OFF) & +						OMAP2_32KSYNCNT_REV_SCHEME) +		sync32k_cnt_reg = vbase + OMAP2_32KSYNCNT_CR_OFF_HIGH; +	else +		sync32k_cnt_reg = vbase + OMAP2_32KSYNCNT_CR_OFF_LOW;  	/*  	 * 120000 rough estimate from the calculations in diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index cb16ade437c..7fe626761e5 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c @@ -573,22 +573,25 @@ EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);  static inline void omap_enable_channel_irq(int lch)  { -	u32 status; -  	/* Clear CSR */  	if (cpu_class_is_omap1()) -		status = p->dma_read(CSR, lch); -	else if (cpu_class_is_omap2()) +		p->dma_read(CSR, lch); +	else  		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);  	/* Enable some nice interrupts. */  	p->dma_write(dma_chan[lch].enabled_irqs, CICR, lch);  } -static void omap_disable_channel_irq(int lch) +static inline void omap_disable_channel_irq(int lch)  { -	if (cpu_class_is_omap2()) -		p->dma_write(0, CICR, lch); +	/* disable channel interrupts */ +	p->dma_write(0, CICR, lch); +	/* Clear CSR */ +	if (cpu_class_is_omap1()) +		p->dma_read(CSR, lch); +	else +		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);  }  void omap_enable_dma_irq(int lch, u16 bits) @@ -632,14 +635,14 @@ static inline void disable_lnk(int lch)  	l = p->dma_read(CLNK_CTRL, lch);  	/* Disable interrupts */ +	omap_disable_channel_irq(lch); +  	if (cpu_class_is_omap1()) { -		p->dma_write(0, CICR, lch);  		/* Set the STOP_LNK bit */  		l |= 1 << 14;  	}  	if (cpu_class_is_omap2()) { -		omap_disable_channel_irq(lch);  		/* Clear the ENABLE_LNK bit */  		l &= ~(1 << 15);  	} @@ -657,6 +660,9 @@ static inline void omap2_enable_irq_lch(int lch)  		return;  	spin_lock_irqsave(&dma_chan_lock, flags); +	/* clear IRQ STATUS */ +	p->dma_write(1 << lch, IRQSTATUS_L0, lch); +	/* Enable interrupt */  	val = p->dma_read(IRQENABLE_L0, lch);  	val |= 1 << lch;  	p->dma_write(val, IRQENABLE_L0, lch); @@ -672,9 +678,12 @@ static inline void omap2_disable_irq_lch(int lch)  		return;  	spin_lock_irqsave(&dma_chan_lock, flags); +	/* Disable interrupt */  	val = p->dma_read(IRQENABLE_L0, lch);  	val &= ~(1 << lch);  	p->dma_write(val, IRQENABLE_L0, lch); +	/* clear IRQ STATUS */ +	p->dma_write(1 << lch, IRQSTATUS_L0, lch);  	spin_unlock_irqrestore(&dma_chan_lock, flags);  } @@ -745,11 +754,8 @@ int omap_request_dma(int dev_id, const char *dev_name,  	}  	if (cpu_class_is_omap2()) { -		omap2_enable_irq_lch(free_ch);  		omap_enable_channel_irq(free_ch); -		/* Clear the CSR register and IRQ status register */ -		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, free_ch); -		p->dma_write(1 << free_ch, IRQSTATUS_L0, 0); +		omap2_enable_irq_lch(free_ch);  	}  	*dma_ch_out = free_ch; @@ -768,27 +774,19 @@ void omap_free_dma(int lch)  		return;  	} -	if (cpu_class_is_omap1()) { -		/* Disable all DMA interrupts for the channel. */ -		p->dma_write(0, CICR, lch); -		/* Make sure the DMA transfer is stopped. */ -		p->dma_write(0, CCR, lch); -	} - -	if (cpu_class_is_omap2()) { +	/* Disable interrupt for logical channel */ +	if (cpu_class_is_omap2())  		omap2_disable_irq_lch(lch); -		/* Clear the CSR register and IRQ status register */ -		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch); -		p->dma_write(1 << lch, IRQSTATUS_L0, lch); +	/* Disable all DMA interrupts for the channel. */ +	omap_disable_channel_irq(lch); -		/* Disable all DMA interrupts for the channel. */ -		p->dma_write(0, CICR, lch); +	/* Make sure the DMA transfer is stopped. */ +	p->dma_write(0, CCR, lch); -		/* Make sure the DMA transfer is stopped. */ -		p->dma_write(0, CCR, lch); +	/* Clear registers */ +	if (cpu_class_is_omap2())  		omap_clear_dma(lch); -	}  	spin_lock_irqsave(&dma_chan_lock, flags);  	dma_chan[lch].dev_id = -1; @@ -943,8 +941,7 @@ void omap_stop_dma(int lch)  	u32 l;  	/* Disable all interrupts on the channel */ -	if (cpu_class_is_omap1()) -		p->dma_write(0, CICR, lch); +	omap_disable_channel_irq(lch);  	l = p->dma_read(CCR, lch);  	if (IS_DMA_ERRATA(DMA_ERRATA_i541) && diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 3b0cfeb33d0..626ad8cad7a 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c @@ -37,14 +37,16 @@  #include <linux/module.h>  #include <linux/io.h> -#include <linux/slab.h> +#include <linux/device.h>  #include <linux/err.h>  #include <linux/pm_runtime.h>  #include <plat/dmtimer.h> +#include <plat/omap-pm.h>  #include <mach/hardware.h> +static u32 omap_reserved_systimers;  static LIST_HEAD(omap_timer_list);  static DEFINE_SPINLOCK(dm_timer_lock); @@ -133,17 +135,22 @@ static void omap_dm_timer_reset(struct omap_dm_timer *timer)  int omap_dm_timer_prepare(struct omap_dm_timer *timer)  { -	struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data;  	int ret; -	timer->fclk = clk_get(&timer->pdev->dev, "fck"); -	if (WARN_ON_ONCE(IS_ERR_OR_NULL(timer->fclk))) { -		timer->fclk = NULL; -		dev_err(&timer->pdev->dev, ": No fclk handle.\n"); -		return -EINVAL; +	/* +	 * FIXME: OMAP1 devices do not use the clock framework for dmtimers so +	 * do not call clk_get() for these devices. +	 */ +	if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { +		timer->fclk = clk_get(&timer->pdev->dev, "fck"); +		if (WARN_ON_ONCE(IS_ERR_OR_NULL(timer->fclk))) { +			timer->fclk = NULL; +			dev_err(&timer->pdev->dev, ": No fclk handle.\n"); +			return -EINVAL; +		}  	} -	if (pdata->needs_manual_reset) +	if (timer->capability & OMAP_TIMER_NEEDS_RESET)  		omap_dm_timer_reset(timer);  	ret = omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); @@ -152,6 +159,21 @@ int omap_dm_timer_prepare(struct omap_dm_timer *timer)  	return ret;  } +static inline u32 omap_dm_timer_reserved_systimer(int id) +{ +	return (omap_reserved_systimers & (1 << (id - 1))) ? 1 : 0; +} + +int omap_dm_timer_reserve_systimer(int id) +{ +	if (omap_dm_timer_reserved_systimer(id)) +		return -ENODEV; + +	omap_reserved_systimers |= (1 << (id - 1)); + +	return 0; +} +  struct omap_dm_timer *omap_dm_timer_request(void)  {  	struct omap_dm_timer *timer = NULL, *t; @@ -325,10 +347,9 @@ int omap_dm_timer_start(struct omap_dm_timer *timer)  	omap_dm_timer_enable(timer); -	if (timer->loses_context) { -		u32 ctx_loss_cnt_after = -			timer->get_context_loss_count(&timer->pdev->dev); -		if (ctx_loss_cnt_after != timer->ctx_loss_count) +	if (!(timer->capability & OMAP_TIMER_ALWON)) { +		if (omap_pm_get_dev_context_loss_count(&timer->pdev->dev) != +				timer->ctx_loss_count)  			omap_timer_restore_context(timer);  	} @@ -347,20 +368,18 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_start);  int omap_dm_timer_stop(struct omap_dm_timer *timer)  {  	unsigned long rate = 0; -	struct dmtimer_platform_data *pdata;  	if (unlikely(!timer))  		return -EINVAL; -	pdata = timer->pdev->dev.platform_data; -	if (!pdata->needs_manual_reset) +	if (!(timer->capability & OMAP_TIMER_NEEDS_RESET))  		rate = clk_get_rate(timer->fclk);  	__omap_dm_timer_stop(timer, timer->posted, rate); -	if (timer->loses_context && timer->get_context_loss_count) +	if (!(timer->capability & OMAP_TIMER_ALWON))  		timer->ctx_loss_count = -			timer->get_context_loss_count(&timer->pdev->dev); +			omap_pm_get_dev_context_loss_count(&timer->pdev->dev);  	/*  	 * Since the register values are computed and written within @@ -378,6 +397,8 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_stop);  int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)  {  	int ret; +	char *parent_name = NULL; +	struct clk *fclk, *parent;  	struct dmtimer_platform_data *pdata;  	if (unlikely(!timer)) @@ -388,7 +409,49 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)  	if (source < 0 || source >= 3)  		return -EINVAL; -	ret = pdata->set_timer_src(timer->pdev, source); +	/* +	 * FIXME: Used for OMAP1 devices only because they do not currently +	 * use the clock framework to set the parent clock. To be removed +	 * once OMAP1 migrated to using clock framework for dmtimers +	 */ +	if (pdata->set_timer_src) +		return pdata->set_timer_src(timer->pdev, source); + +	fclk = clk_get(&timer->pdev->dev, "fck"); +	if (IS_ERR_OR_NULL(fclk)) { +		pr_err("%s: fck not found\n", __func__); +		return -EINVAL; +	} + +	switch (source) { +	case OMAP_TIMER_SRC_SYS_CLK: +		parent_name = "timer_sys_ck"; +		break; + +	case OMAP_TIMER_SRC_32_KHZ: +		parent_name = "timer_32k_ck"; +		break; + +	case OMAP_TIMER_SRC_EXT_CLK: +		parent_name = "timer_ext_ck"; +		break; +	} + +	parent = clk_get(&timer->pdev->dev, parent_name); +	if (IS_ERR_OR_NULL(parent)) { +		pr_err("%s: %s not found\n", __func__, parent_name); +		ret = -EINVAL; +		goto out; +	} + +	ret = clk_set_parent(fclk, parent); +	if (IS_ERR_VALUE(ret)) +		pr_err("%s: failed to set %s as parent\n", __func__, +			parent_name); + +	clk_put(parent); +out: +	clk_put(fclk);  	return ret;  } @@ -431,10 +494,9 @@ int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,  	omap_dm_timer_enable(timer); -	if (timer->loses_context) { -		u32 ctx_loss_cnt_after = -			timer->get_context_loss_count(&timer->pdev->dev); -		if (ctx_loss_cnt_after != timer->ctx_loss_count) +	if (!(timer->capability & OMAP_TIMER_ALWON)) { +		if (omap_pm_get_dev_context_loss_count(&timer->pdev->dev) != +				timer->ctx_loss_count)  			omap_timer_restore_context(timer);  	} @@ -627,68 +689,57 @@ EXPORT_SYMBOL_GPL(omap_dm_timers_active);   */  static int __devinit omap_dm_timer_probe(struct platform_device *pdev)  { -	int ret;  	unsigned long flags;  	struct omap_dm_timer *timer; -	struct resource *mem, *irq, *ioarea; +	struct resource *mem, *irq; +	struct device *dev = &pdev->dev;  	struct dmtimer_platform_data *pdata = pdev->dev.platform_data;  	if (!pdata) { -		dev_err(&pdev->dev, "%s: no platform data.\n", __func__); +		dev_err(dev, "%s: no platform data.\n", __func__);  		return -ENODEV;  	}  	irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);  	if (unlikely(!irq)) { -		dev_err(&pdev->dev, "%s: no IRQ resource.\n", __func__); +		dev_err(dev, "%s: no IRQ resource.\n", __func__);  		return -ENODEV;  	}  	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	if (unlikely(!mem)) { -		dev_err(&pdev->dev, "%s: no memory resource.\n", __func__); +		dev_err(dev, "%s: no memory resource.\n", __func__);  		return -ENODEV;  	} -	ioarea = request_mem_region(mem->start, resource_size(mem), -			pdev->name); -	if (!ioarea) { -		dev_err(&pdev->dev, "%s: region already claimed.\n", __func__); -		return -EBUSY; -	} - -	timer = kzalloc(sizeof(struct omap_dm_timer), GFP_KERNEL); +	timer = devm_kzalloc(dev, sizeof(struct omap_dm_timer), GFP_KERNEL);  	if (!timer) { -		dev_err(&pdev->dev, "%s: no memory for omap_dm_timer.\n", -			__func__); -		ret = -ENOMEM; -		goto err_free_ioregion; +		dev_err(dev, "%s: memory alloc failed!\n", __func__); +		return  -ENOMEM;  	} -	timer->io_base = ioremap(mem->start, resource_size(mem)); +	timer->io_base = devm_request_and_ioremap(dev, mem);  	if (!timer->io_base) { -		dev_err(&pdev->dev, "%s: ioremap failed.\n", __func__); -		ret = -ENOMEM; -		goto err_free_mem; +		dev_err(dev, "%s: region already claimed.\n", __func__); +		return -ENOMEM;  	}  	timer->id = pdev->id;  	timer->irq = irq->start; -	timer->reserved = pdata->reserved; +	timer->reserved = omap_dm_timer_reserved_systimer(timer->id);  	timer->pdev = pdev; -	timer->loses_context = pdata->loses_context; -	timer->get_context_loss_count = pdata->get_context_loss_count; +	timer->capability = pdata->timer_capability;  	/* Skip pm_runtime_enable for OMAP1 */ -	if (!pdata->needs_manual_reset) { -		pm_runtime_enable(&pdev->dev); -		pm_runtime_irq_safe(&pdev->dev); +	if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { +		pm_runtime_enable(dev); +		pm_runtime_irq_safe(dev);  	}  	if (!timer->reserved) { -		pm_runtime_get_sync(&pdev->dev); +		pm_runtime_get_sync(dev);  		__omap_dm_timer_init_regs(timer); -		pm_runtime_put(&pdev->dev); +		pm_runtime_put(dev);  	}  	/* add the timer element to the list */ @@ -696,17 +747,9 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev)  	list_add_tail(&timer->node, &omap_timer_list);  	spin_unlock_irqrestore(&dm_timer_lock, flags); -	dev_dbg(&pdev->dev, "Device Probed.\n"); +	dev_dbg(dev, "Device Probed.\n");  	return 0; - -err_free_mem: -	kfree(timer); - -err_free_ioregion: -	release_mem_region(mem->start, resource_size(mem)); - -	return ret;  }  /** @@ -727,7 +770,6 @@ static int __devexit omap_dm_timer_remove(struct platform_device *pdev)  	list_for_each_entry(timer, &omap_timer_list, node)  		if (timer->pdev->id == pdev->id) {  			list_del(&timer->node); -			kfree(timer);  			ret = 0;  			break;  		} diff --git a/arch/arm/plat-omap/include/plat/board.h b/arch/arm/plat-omap/include/plat/board.h index 4814c5b6530..e62f20a5c0a 100644 --- a/arch/arm/plat-omap/include/plat/board.h +++ b/arch/arm/plat-omap/include/plat/board.h @@ -57,44 +57,6 @@ struct omap_camera_sensor_config {  	int (*power_off)(void * data);  }; -struct omap_usb_config { -	/* Configure drivers according to the connectors on your board: -	 *  - "A" connector (rectagular) -	 *	... for host/OHCI use, set "register_host". -	 *  - "B" connector (squarish) or "Mini-B" -	 *	... for device/gadget use, set "register_dev". -	 *  - "Mini-AB" connector (very similar to Mini-B) -	 *	... for OTG use as device OR host, initialize "otg" -	 */ -	unsigned	register_host:1; -	unsigned	register_dev:1; -	u8		otg;	/* port number, 1-based:  usb1 == 2 */ - -	u8		hmc_mode; - -	/* implicitly true if otg:  host supports remote wakeup? */ -	u8		rwc; - -	/* signaling pins used to talk to transceiver on usbN: -	 *  0 == usbN unused -	 *  2 == usb0-only, using internal transceiver -	 *  3 == 3 wire bidirectional -	 *  4 == 4 wire bidirectional -	 *  6 == 6 wire unidirectional (or TLL) -	 */ -	u8		pins[3]; - -	struct platform_device *udc_device; -	struct platform_device *ohci_device; -	struct platform_device *otg_device; - -	u32 (*usb0_init)(unsigned nwires, unsigned is_device); -	u32 (*usb1_init)(unsigned nwires); -	u32 (*usb2_init)(unsigned nwires, unsigned alt_pingroup); - -	int (*ocpi_enable)(void); -}; -  struct omap_lcd_config {  	char panel_name[16];  	char ctrl_name[16]; diff --git a/arch/arm/plat-omap/include/plat/clkdev_omap.h b/arch/arm/plat-omap/include/plat/clkdev_omap.h index d0ed8c443a6..025d85a3ee8 100644 --- a/arch/arm/plat-omap/include/plat/clkdev_omap.h +++ b/arch/arm/plat-omap/include/plat/clkdev_omap.h @@ -39,6 +39,7 @@ struct omap_clk {  #define CK_443X		(1 << 11)  #define CK_TI816X	(1 << 12)  #define CK_446X		(1 << 13) +#define CK_AM33XX	(1 << 14)	/* AM33xx specific clocks */  #define CK_1710		(1 << 15)	/* 1710 extra for rate selection */ diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h index d0ef57c1d71..656b9862279 100644 --- a/arch/arm/plat-omap/include/plat/clock.h +++ b/arch/arm/plat-omap/include/plat/clock.h @@ -156,7 +156,6 @@ struct dpll_data {  	u8			min_divider;  	u16			max_divider;  	u8			modes; -#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)  	void __iomem		*autoidle_reg;  	void __iomem		*idlest_reg;  	u32			autoidle_mask; @@ -167,7 +166,6 @@ struct dpll_data {  	u8			auto_recal_bit;  	u8			recal_en_bit;  	u8			recal_st_bit; -#  endif  	u8			flags;  }; diff --git a/arch/arm/plat-omap/include/plat/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h index de6c0a08f46..68b180edcff 100644 --- a/arch/arm/plat-omap/include/plat/cpu.h +++ b/arch/arm/plat-omap/include/plat/cpu.h @@ -9,7 +9,7 @@   *   * Written by Tony Lindgren <tony.lindgren@nokia.com>   * - * Added OMAP4 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com> + * Added OMAP4/5 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -70,6 +70,7 @@ unsigned int omap_rev(void);   * cpu_is_omap443x():	True for OMAP4430   * cpu_is_omap446x():	True for OMAP4460   * cpu_is_omap447x():	True for OMAP4470 + * soc_is_omap543x():	True for OMAP5430, OMAP5432   */  #define GET_OMAP_CLASS	(omap_rev() & 0xff) @@ -122,6 +123,7 @@ IS_OMAP_CLASS(24xx, 0x24)  IS_OMAP_CLASS(34xx, 0x34)  IS_OMAP_CLASS(44xx, 0x44)  IS_AM_CLASS(35xx, 0x35) +IS_OMAP_CLASS(54xx, 0x54)  IS_AM_CLASS(33xx, 0x33)  IS_TI_CLASS(81xx, 0x81) @@ -133,6 +135,7 @@ IS_OMAP_SUBCLASS(363x, 0x363)  IS_OMAP_SUBCLASS(443x, 0x443)  IS_OMAP_SUBCLASS(446x, 0x446)  IS_OMAP_SUBCLASS(447x, 0x447) +IS_OMAP_SUBCLASS(543x, 0x543)  IS_TI_SUBCLASS(816x, 0x816)  IS_TI_SUBCLASS(814x, 0x814) @@ -150,12 +153,14 @@ IS_AM_SUBCLASS(335x, 0x335)  #define cpu_is_ti816x()			0  #define cpu_is_ti814x()			0  #define soc_is_am35xx()			0 -#define cpu_is_am33xx()			0 -#define cpu_is_am335x()			0 +#define soc_is_am33xx()			0 +#define soc_is_am335x()			0  #define cpu_is_omap44xx()		0  #define cpu_is_omap443x()		0  #define cpu_is_omap446x()		0  #define cpu_is_omap447x()		0 +#define soc_is_omap54xx()		0 +#define soc_is_omap543x()		0  #if defined(MULTI_OMAP1)  # if defined(CONFIG_ARCH_OMAP730) @@ -238,9 +243,7 @@ IS_AM_SUBCLASS(335x, 0x335)  /*   * Macros to detect individual cpu types.   * These are only rarely needed. - * cpu_is_omap330():	True for OMAP330 - * cpu_is_omap730():	True for OMAP730 - * cpu_is_omap850():	True for OMAP850 + * cpu_is_omap310():	True for OMAP310   * cpu_is_omap1510():	True for OMAP1510   * cpu_is_omap1610():	True for OMAP1610   * cpu_is_omap1611():	True for OMAP1611 @@ -262,8 +265,6 @@ static inline int is_omap ##type (void)			\  }  IS_OMAP_TYPE(310, 0x0310) -IS_OMAP_TYPE(730, 0x0730) -IS_OMAP_TYPE(850, 0x0850)  IS_OMAP_TYPE(1510, 0x1510)  IS_OMAP_TYPE(1610, 0x1610)  IS_OMAP_TYPE(1611, 0x1611) @@ -277,8 +278,6 @@ IS_OMAP_TYPE(2430, 0x2430)  IS_OMAP_TYPE(3430, 0x3430)  #define cpu_is_omap310()		0 -#define cpu_is_omap730()		0 -#define cpu_is_omap850()		0  #define cpu_is_omap1510()		0  #define cpu_is_omap1610()		0  #define cpu_is_omap5912()		0 @@ -291,22 +290,13 @@ IS_OMAP_TYPE(3430, 0x3430)  #define cpu_is_omap2430()		0  #define cpu_is_omap3430()		0  #define cpu_is_omap3630()		0 +#define soc_is_omap5430()		0  /*   * Whether we have MULTI_OMAP1 or not, we still need to distinguish - * between 730 vs 850, 330 vs. 1510 and 1611B/5912 vs. 1710. + * between 310 vs. 1510 and 1611B/5912 vs. 1710.   */ -#if defined(CONFIG_ARCH_OMAP730) -# undef  cpu_is_omap730 -# define cpu_is_omap730()		is_omap730() -#endif - -#if defined(CONFIG_ARCH_OMAP850) -# undef  cpu_is_omap850 -# define cpu_is_omap850()		is_omap850() -#endif -  #if defined(CONFIG_ARCH_OMAP15XX)  # undef  cpu_is_omap310  # undef  cpu_is_omap1510 @@ -344,8 +334,6 @@ IS_OMAP_TYPE(3430, 0x3430)  # undef cpu_is_ti816x  # undef cpu_is_ti814x  # undef soc_is_am35xx -# undef cpu_is_am33xx -# undef cpu_is_am335x  # define cpu_is_omap3430()		is_omap3430()  # undef cpu_is_omap3630  # define cpu_is_omap3630()		is_omap363x() @@ -353,8 +341,13 @@ IS_OMAP_TYPE(3430, 0x3430)  # define cpu_is_ti816x()		is_ti816x()  # define cpu_is_ti814x()		is_ti814x()  # define soc_is_am35xx()		is_am35xx() -# define cpu_is_am33xx()		is_am33xx() -# define cpu_is_am335x()		is_am335x() +#endif + +# if defined(CONFIG_SOC_AM33XX) +# undef soc_is_am33xx +# undef soc_is_am335x +# define soc_is_am33xx()		is_am33xx() +# define soc_is_am335x()		is_am335x()  #endif  # if defined(CONFIG_ARCH_OMAP4) @@ -368,11 +361,18 @@ IS_OMAP_TYPE(3430, 0x3430)  # define cpu_is_omap447x()		is_omap447x()  # endif +# if defined(CONFIG_SOC_OMAP5) +# undef soc_is_omap54xx +# undef soc_is_omap543x +# define soc_is_omap54xx()		is_omap54xx() +# define soc_is_omap543x()		is_omap543x() +#endif +  /* Macros to detect if we have OMAP1 or OMAP2 */  #define cpu_class_is_omap1()	(cpu_is_omap7xx() || cpu_is_omap15xx() || \  				cpu_is_omap16xx())  #define cpu_class_is_omap2()	(cpu_is_omap24xx() || cpu_is_omap34xx() || \ -				cpu_is_omap44xx()) +				cpu_is_omap44xx() || soc_is_omap54xx())  /* Various silicon revisions for omap2 */  #define OMAP242X_CLASS		0x24200024 @@ -408,7 +408,7 @@ IS_OMAP_TYPE(3430, 0x3430)  #define AM35XX_REV_ES1_0	AM35XX_CLASS  #define AM35XX_REV_ES1_1	(AM35XX_CLASS | (0x1 << 8)) -#define AM335X_CLASS		0x33500034 +#define AM335X_CLASS		0x33500033  #define AM335X_REV_ES1_0	AM335X_CLASS  #define OMAP443X_CLASS		0x44300044 @@ -425,9 +425,14 @@ IS_OMAP_TYPE(3430, 0x3430)  #define OMAP447X_CLASS		0x44700044  #define OMAP4470_REV_ES1_0	(OMAP447X_CLASS | (0x10 << 8)) +#define OMAP54XX_CLASS		0x54000054 +#define OMAP5430_REV_ES1_0	(OMAP54XX_CLASS | (0x30 << 16) | (0x10 << 8)) +#define OMAP5432_REV_ES1_0	(OMAP54XX_CLASS | (0x32 << 16) | (0x10 << 8)) +  void omap2xxx_check_revision(void);  void omap3xxx_check_revision(void);  void omap4xxx_check_revision(void); +void omap5xxx_check_revision(void);  void omap3xxx_check_features(void);  void ti81xx_check_features(void);  void omap4xxx_check_features(void); diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index 5da73562e48..19e7fa577bd 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h @@ -55,23 +55,17 @@  #define OMAP_TIMER_TRIGGER_OVERFLOW		0x01  #define OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE	0x02 -/* - * IP revision identifier so that Highlander IP - * in OMAP4 can be distinguished. - */ -#define OMAP_TIMER_IP_VERSION_1                        0x1 -  /* timer capabilities used in hwmod database */  #define OMAP_TIMER_SECURE				0x80000000  #define OMAP_TIMER_ALWON				0x40000000  #define OMAP_TIMER_HAS_PWM				0x20000000 +#define OMAP_TIMER_NEEDS_RESET				0x10000000  struct omap_timer_capability_dev_attr {  	u32 timer_capability;  };  struct omap_dm_timer; -struct clk;  struct timer_regs {  	u32 tidr; @@ -96,16 +90,12 @@ struct timer_regs {  };  struct dmtimer_platform_data { +	/* set_timer_src - Only used for OMAP1 devices */  	int (*set_timer_src)(struct platform_device *pdev, int source); -	int timer_ip_version; -	u32 needs_manual_reset:1; -	bool reserved; - -	bool loses_context; - -	int (*get_context_loss_count)(struct device *dev); +	u32 timer_capability;  }; +int omap_dm_timer_reserve_systimer(int id);  struct omap_dm_timer *omap_dm_timer_request(void);  struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id);  int omap_dm_timer_free(struct omap_dm_timer *timer); @@ -272,13 +262,11 @@ struct omap_dm_timer {  	unsigned reserved:1;  	unsigned posted:1;  	struct timer_regs context; -	bool loses_context;  	int ctx_loss_count;  	int revision; +	u32 capability;  	struct platform_device *pdev;  	struct list_head node; - -	int (*get_context_loss_count)(struct device *dev);  };  int omap_dm_timer_prepare(struct omap_dm_timer *timer); diff --git a/arch/arm/plat-omap/include/plat/dsp.h b/arch/arm/plat-omap/include/plat/dsp.h index 9c604b390f9..5927709b190 100644 --- a/arch/arm/plat-omap/include/plat/dsp.h +++ b/arch/arm/plat-omap/include/plat/dsp.h @@ -18,6 +18,9 @@ struct omap_dsp_platform_data {  	u32 (*dsp_cm_read)(s16 , u16);  	u32 (*dsp_cm_rmw_bits)(u32, u32, s16, s16); +	void (*set_bootaddr)(u32); +	void (*set_bootmode)(u8); +  	phys_addr_t phys_mempool_base;  	phys_addr_t phys_mempool_size;  }; diff --git a/arch/arm/plat-omap/include/plat/hardware.h b/arch/arm/plat-omap/include/plat/hardware.h index e897978371c..ddbde38e1e3 100644 --- a/arch/arm/plat-omap/include/plat/hardware.h +++ b/arch/arm/plat-omap/include/plat/hardware.h @@ -288,5 +288,6 @@  #include <plat/omap44xx.h>  #include <plat/ti81xx.h>  #include <plat/am33xx.h> +#include <plat/omap54xx.h>  #endif	/* __ASM_ARCH_OMAP_HARDWARE_H */ diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h index 5493bd95da5..eb3e4d55534 100644 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ b/arch/arm/plat-omap/include/plat/mmc.h @@ -81,8 +81,6 @@ struct omap_mmc_platform_data {  	/* Return context loss count due to PM states changing */  	int (*get_context_loss_count)(struct device *dev); -	u64 dma_mask; -  	/* Integrating attributes from the omap_hwmod layer */  	u8 controller_flags; diff --git a/arch/arm/plat-omap/include/plat/multi.h b/arch/arm/plat-omap/include/plat/multi.h index 999ffba2690..045e320f106 100644 --- a/arch/arm/plat-omap/include/plat/multi.h +++ b/arch/arm/plat-omap/include/plat/multi.h @@ -99,4 +99,13 @@  # endif  #endif +#ifdef CONFIG_SOC_OMAP5 +# ifdef OMAP_NAME +#  undef  MULTI_OMAP2 +#  define MULTI_OMAP2 +# else +#  define OMAP_NAME omap5 +# endif +#endif +  #endif	/* __PLAT_OMAP_MULTI_H */ diff --git a/arch/arm/plat-omap/include/plat/mux.h b/arch/arm/plat-omap/include/plat/mux.h index aeba71796ad..32394895920 100644 --- a/arch/arm/plat-omap/include/plat/mux.h +++ b/arch/arm/plat-omap/include/plat/mux.h @@ -99,7 +99,7 @@  /*   * OMAP730/850 has a slightly different config for the pin mux. - * - config regs are the OMAP7XX_IO_CONF_x regs (see omap730.h) regs and + * - config regs are the OMAP7XX_IO_CONF_x regs (see omap7xx.h) regs and   *   not the FUNC_MUX_CTRL_x regs from hardware.h   * - for pull-up/down, only has one enable bit which is is in the same register   *   as mux config diff --git a/arch/arm/plat-omap/include/plat/omap-secure.h b/arch/arm/plat-omap/include/plat/omap-secure.h index 8c7994ce986..0e4acd2d2de 100644 --- a/arch/arm/plat-omap/include/plat/omap-secure.h +++ b/arch/arm/plat-omap/include/plat/omap-secure.h @@ -3,12 +3,7 @@  #include <linux/types.h> -#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)  extern int omap_secure_ram_reserve_memblock(void); -#else -static inline void omap_secure_ram_reserve_memblock(void) -{ } -#endif  #ifdef CONFIG_OMAP4_ERRATA_I688  extern int omap_barrier_reserve_memblock(void); diff --git a/arch/arm/plat-omap/include/plat/omap54xx.h b/arch/arm/plat-omap/include/plat/omap54xx.h new file mode 100644 index 00000000000..a2582bb3cab --- /dev/null +++ b/arch/arm/plat-omap/include/plat/omap54xx.h @@ -0,0 +1,32 @@ +/*: + * Address mappings and base address for OMAP5 interconnects + * and peripherals. + * + * Copyright (C) 2012 Texas Instruments + *	Santosh Shilimkar <santosh.shilimkar@ti.com> + *	Sricharan <r.sricharan@ti.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef __ASM_SOC_OMAP54XX_H +#define __ASM_SOC_OMAP54XX_H + +/* + * Please place only base defines here and put the rest in device + * specific headers. + */ +#define L4_54XX_BASE			0x4a000000 +#define L4_WK_54XX_BASE			0x4ae00000 +#define L4_PER_54XX_BASE		0x48000000 +#define L3_54XX_BASE			0x44000000 +#define OMAP54XX_32KSYNCT_BASE		0x4ae04000 +#define OMAP54XX_CM_CORE_AON_BASE	0x4a004000 +#define OMAP54XX_CM_CORE_BASE		0x4a008000 +#define OMAP54XX_PRM_BASE		0x4ae06000 +#define OMAP54XX_PRCM_MPU_BASE		0x48243000 +#define OMAP54XX_SCM_BASE		0x4a002000 +#define OMAP54XX_CTRL_BASE		0x4a002800 + +#endif /* __ASM_SOC_OMAP555554XX_H */ diff --git a/arch/arm/plat-omap/include/plat/omap730.h b/arch/arm/plat-omap/include/plat/omap730.h deleted file mode 100644 index 14272bc1a6f..00000000000 --- a/arch/arm/plat-omap/include/plat/omap730.h +++ /dev/null @@ -1,102 +0,0 @@ -/* arch/arm/plat-omap/include/mach/omap730.h - * - * Hardware definitions for TI OMAP730 processor. - * - * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP730_H -#define __ASM_ARCH_OMAP730_H - -/* - * ---------------------------------------------------------------------------- - * Base addresses - * ---------------------------------------------------------------------------- - */ - -/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */ - -#define OMAP730_DSP_BASE	0xE0000000 -#define OMAP730_DSP_SIZE	0x50000 -#define OMAP730_DSP_START	0xE0000000 - -#define OMAP730_DSPREG_BASE	0xE1000000 -#define OMAP730_DSPREG_SIZE	SZ_128K -#define OMAP730_DSPREG_START	0xE1000000 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 specific configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_CONFIG_BASE	0xfffe1000 -#define OMAP730_IO_CONF_0	0xfffe1070 -#define OMAP730_IO_CONF_1	0xfffe1074 -#define OMAP730_IO_CONF_2	0xfffe1078 -#define OMAP730_IO_CONF_3	0xfffe107c -#define OMAP730_IO_CONF_4	0xfffe1080 -#define OMAP730_IO_CONF_5	0xfffe1084 -#define OMAP730_IO_CONF_6	0xfffe1088 -#define OMAP730_IO_CONF_7	0xfffe108c -#define OMAP730_IO_CONF_8	0xfffe1090 -#define OMAP730_IO_CONF_9	0xfffe1094 -#define OMAP730_IO_CONF_10	0xfffe1098 -#define OMAP730_IO_CONF_11	0xfffe109c -#define OMAP730_IO_CONF_12	0xfffe10a0 -#define OMAP730_IO_CONF_13	0xfffe10a4 - -#define OMAP730_MODE_1		0xfffe1010 -#define OMAP730_MODE_2		0xfffe1014 - -/* CSMI specials: in terms of base + offset */ -#define OMAP730_MODE2_OFFSET	0x14 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 traffic controller configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_FLASH_CFG_0	0xfffecc10 -#define OMAP730_FLASH_ACFG_0	0xfffecc50 -#define OMAP730_FLASH_CFG_1	0xfffecc14 -#define OMAP730_FLASH_ACFG_1	0xfffecc54 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 DSP control registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_ICR_BASE	0xfffbb800 -#define OMAP730_DSP_M_CTL	0xfffbb804 -#define OMAP730_DSP_MMU_BASE	0xfffed200 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 PCC_UPLD configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_PCC_UPLD_CTRL_BASE	(0xfffe0900) -#define OMAP730_PCC_UPLD_CTRL		(OMAP730_PCC_UPLD_CTRL_BASE + 0x00) - -#endif /*  __ASM_ARCH_OMAP730_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap850.h b/arch/arm/plat-omap/include/plat/omap850.h deleted file mode 100644 index c33f6798171..00000000000 --- a/arch/arm/plat-omap/include/plat/omap850.h +++ /dev/null @@ -1,102 +0,0 @@ -/* arch/arm/plat-omap/include/mach/omap850.h - * - * Hardware definitions for TI OMAP850 processor. - * - * Derived from omap730.h by Zebediah C. McClure <zmc@lurian.net> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP850_H -#define __ASM_ARCH_OMAP850_H - -/* - * ---------------------------------------------------------------------------- - * Base addresses - * ---------------------------------------------------------------------------- - */ - -/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */ - -#define OMAP850_DSP_BASE	0xE0000000 -#define OMAP850_DSP_SIZE	0x50000 -#define OMAP850_DSP_START	0xE0000000 - -#define OMAP850_DSPREG_BASE	0xE1000000 -#define OMAP850_DSPREG_SIZE	SZ_128K -#define OMAP850_DSPREG_START	0xE1000000 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 specific configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_CONFIG_BASE	0xfffe1000 -#define OMAP850_IO_CONF_0	0xfffe1070 -#define OMAP850_IO_CONF_1	0xfffe1074 -#define OMAP850_IO_CONF_2	0xfffe1078 -#define OMAP850_IO_CONF_3	0xfffe107c -#define OMAP850_IO_CONF_4	0xfffe1080 -#define OMAP850_IO_CONF_5	0xfffe1084 -#define OMAP850_IO_CONF_6	0xfffe1088 -#define OMAP850_IO_CONF_7	0xfffe108c -#define OMAP850_IO_CONF_8	0xfffe1090 -#define OMAP850_IO_CONF_9	0xfffe1094 -#define OMAP850_IO_CONF_10	0xfffe1098 -#define OMAP850_IO_CONF_11	0xfffe109c -#define OMAP850_IO_CONF_12	0xfffe10a0 -#define OMAP850_IO_CONF_13	0xfffe10a4 - -#define OMAP850_MODE_1		0xfffe1010 -#define OMAP850_MODE_2		0xfffe1014 - -/* CSMI specials: in terms of base + offset */ -#define OMAP850_MODE2_OFFSET	0x14 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 traffic controller configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_FLASH_CFG_0	0xfffecc10 -#define OMAP850_FLASH_ACFG_0	0xfffecc50 -#define OMAP850_FLASH_CFG_1	0xfffecc14 -#define OMAP850_FLASH_ACFG_1	0xfffecc54 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 DSP control registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_ICR_BASE	0xfffbb800 -#define OMAP850_DSP_M_CTL	0xfffbb804 -#define OMAP850_DSP_MMU_BASE	0xfffed200 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 PCC_UPLD configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_PCC_UPLD_CTRL_BASE	(0xfffe0900) -#define OMAP850_PCC_UPLD_CTRL		(OMAP850_PCC_UPLD_CTRL_BASE + 0x00) - -#endif /*  __ASM_ARCH_OMAP850_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index c835b7194ff..6132972aff3 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h @@ -41,6 +41,7 @@ struct omap_device;  extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1;  extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2; +extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3;  /*   * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant @@ -69,6 +70,17 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2;  #define SYSC_TYPE2_SIDLEMODE_MASK	(0x3 << SYSC_TYPE2_SIDLEMODE_SHIFT)  #define SYSC_TYPE2_MIDLEMODE_SHIFT	4  #define SYSC_TYPE2_MIDLEMODE_MASK	(0x3 << SYSC_TYPE2_MIDLEMODE_SHIFT) +#define SYSC_TYPE2_DMADISABLE_SHIFT	16 +#define SYSC_TYPE2_DMADISABLE_MASK	(0x1 << SYSC_TYPE2_DMADISABLE_SHIFT) + +/* + * OCP SYSCONFIG bit shifts/masks TYPE3. + * This is applicable for some IPs present in AM33XX + */ +#define SYSC_TYPE3_SIDLEMODE_SHIFT	0 +#define SYSC_TYPE3_SIDLEMODE_MASK	(0x3 << SYSC_TYPE3_SIDLEMODE_SHIFT) +#define SYSC_TYPE3_MIDLEMODE_SHIFT	2 +#define SYSC_TYPE3_MIDLEMODE_MASK	(0x3 << SYSC_TYPE3_MIDLEMODE_SHIFT)  /* OCP SYSSTATUS bit shifts/masks */  #define SYSS_RESETDONE_SHIFT		0 @@ -283,6 +295,7 @@ struct omap_hwmod_ocp_if {  #define SYSS_HAS_RESET_STATUS	(1 << 7)  #define SYSC_NO_CACHE		(1 << 8)  /* XXX SW flag, belongs elsewhere */  #define SYSC_HAS_RESET_STATUS	(1 << 9) +#define SYSC_HAS_DMADISABLE	(1 << 10)  /* omap_hwmod_sysconfig.clockact flags */  #define CLOCKACT_TEST_BOTH	0x0 @@ -298,6 +311,7 @@ struct omap_hwmod_ocp_if {   * @enwkup_shift: Offset of the enawakeup bit   * @srst_shift: Offset of the softreset bit   * @autoidle_shift: Offset of the autoidle bit + * @dmadisable_shift: Offset of the dmadisable bit   */  struct omap_hwmod_sysc_fields {  	u8 midle_shift; @@ -306,6 +320,7 @@ struct omap_hwmod_sysc_fields {  	u8 enwkup_shift;  	u8 srst_shift;  	u8 autoidle_shift; +	u8 dmadisable_shift;  };  /** @@ -374,11 +389,13 @@ struct omap_hwmod_omap2_prcm {   * struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data   * @clkctrl_reg: PRCM address of the clock control register   * @rstctrl_reg: address of the XXX_RSTCTRL register located in the PRM + * @rstst_reg: (AM33XX only) address of the XXX_RSTST register in the PRM   * @submodule_wkdep_bit: bit shift of the WKDEP range   */  struct omap_hwmod_omap4_prcm {  	u16		clkctrl_offs;  	u16		rstctrl_offs; +	u16		rstst_offs;  	u16		context_offs;  	u8		submodule_wkdep_bit;  	u8		modulemode; @@ -629,6 +646,10 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh);  int omap_hwmod_pad_route_irq(struct omap_hwmod *oh, int pad_idx, int irq_idx); +extern void __init omap_hwmod_init(void); + +const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh); +  /*   * Chip variant-specific hwmod init routines - XXX should be converted   * to use initcalls once the initial boot ordering is straightened out diff --git a/arch/arm/plat-omap/include/plat/sdrc.h b/arch/arm/plat-omap/include/plat/sdrc.h index 9bb978ecd88..36d6a766621 100644 --- a/arch/arm/plat-omap/include/plat/sdrc.h +++ b/arch/arm/plat-omap/include/plat/sdrc.h @@ -123,7 +123,7 @@ struct omap_sdrc_params {  	u32 mr;  }; -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) +#ifdef CONFIG_SOC_HAS_OMAP2_SDRC  void omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0,  			    struct omap_sdrc_params *sdrc_cs1);  #else diff --git a/arch/arm/plat-omap/include/plat/serial.h b/arch/arm/plat-omap/include/plat/serial.h index b073e5f2b19..65fce44dce3 100644 --- a/arch/arm/plat-omap/include/plat/serial.h +++ b/arch/arm/plat-omap/include/plat/serial.h @@ -60,6 +60,17 @@  /* AM3505/3517 UART4 */  #define AM35XX_UART4_BASE	0x4809E000	/* Only on AM3505/3517 */ +/* AM33XX serial port */ +#define AM33XX_UART1_BASE	0x44E09000 + +/* OMAP5 serial ports */ +#define OMAP5_UART1_BASE	OMAP2_UART1_BASE +#define OMAP5_UART2_BASE	OMAP2_UART2_BASE +#define OMAP5_UART3_BASE	OMAP4_UART3_BASE +#define OMAP5_UART4_BASE	OMAP4_UART4_BASE +#define OMAP5_UART5_BASE	0x48066000 +#define OMAP5_UART6_BASE	0x48068000 +  /* External port on Zoom2/3 */  #define ZOOM_UART_BASE		0x10000000  #define ZOOM_UART_VIRT		0xfa400000 @@ -93,6 +104,9 @@  #define TI81XXUART1		81  #define TI81XXUART2		82  #define TI81XXUART3		83 +#define AM33XXUART1		84 +#define OMAP5UART3		OMAP4UART3 +#define OMAP5UART4		OMAP4UART4  #define ZOOM_UART		95		/* Only on zoom2/3 */  /* This is only used by 8250.c for omap1510 */ diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h index cc3f11ba7a9..b8d19a13678 100644 --- a/arch/arm/plat-omap/include/plat/uncompress.h +++ b/arch/arm/plat-omap/include/plat/uncompress.h @@ -95,6 +95,9 @@ static inline void flush(void)  	_DEBUG_LL_ENTRY(mach, OMAP4_UART##p##_BASE, OMAP_PORT_SHIFT,	\  		OMAP4UART##p) +#define DEBUG_LL_OMAP5(p, mach)						\ +	_DEBUG_LL_ENTRY(mach, OMAP5_UART##p##_BASE, OMAP_PORT_SHIFT,	\ +		OMAP5UART##p)  /* Zoom2/3 shift is different for UART1 and external port */  #define DEBUG_LL_ZOOM(mach)						\  	_DEBUG_LL_ENTRY(mach, ZOOM_UART_BASE, ZOOM_PORT_SHIFT, ZOOM_UART) @@ -103,6 +106,10 @@ static inline void flush(void)  	_DEBUG_LL_ENTRY(mach, TI81XX_UART##p##_BASE, OMAP_PORT_SHIFT,	\  		TI81XXUART##p) +#define DEBUG_LL_AM33XX(p, mach)					\ +	_DEBUG_LL_ENTRY(mach, AM33XX_UART##p##_BASE, OMAP_PORT_SHIFT,	\ +		AM33XXUART##p) +  static inline void __arch_decomp_setup(unsigned long arch_id)  {  	int port = 0; @@ -173,6 +180,9 @@ static inline void __arch_decomp_setup(unsigned long arch_id)  		DEBUG_LL_OMAP4(3, omap_4430sdp);  		DEBUG_LL_OMAP4(3, omap4_panda); +		/* omap5 based boards using UART3 */ +		DEBUG_LL_OMAP5(3, omap5_sevm); +  		/* zoom2/3 external uart */  		DEBUG_LL_ZOOM(omap_zoom2);  		DEBUG_LL_ZOOM(omap_zoom3); @@ -183,6 +193,8 @@ static inline void __arch_decomp_setup(unsigned long arch_id)  		/* TI8148 base boards using UART1 */  		DEBUG_LL_TI81XX(1, ti8148evm); +		/* AM33XX base boards using UART1 */ +		DEBUG_LL_AM33XX(1, am335xevm);  	} while (0);  } diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h index 762eeb0626c..548a4c8d63d 100644 --- a/arch/arm/plat-omap/include/plat/usb.h +++ b/arch/arm/plat-omap/include/plat/usb.h @@ -44,6 +44,8 @@ struct usbhs_omap_board_data {  	struct regulator		*regulator[OMAP3_HS_USB_PORTS];  }; +#ifdef CONFIG_ARCH_OMAP2PLUS +  struct ehci_hcd_omap_platform_data {  	enum usbhs_omap_port_mode	port_mode[OMAP3_HS_USB_PORTS];  	int				reset_gpio_port[OMAP3_HS_USB_PORTS]; @@ -64,26 +66,6 @@ struct usbhs_omap_platform_data {  };  /*-------------------------------------------------------------------------*/ -#define OMAP1_OTG_BASE			0xfffb0400 -#define OMAP1_UDC_BASE			0xfffb4000 -#define OMAP1_OHCI_BASE			0xfffba000 - -#define OMAP2_OHCI_BASE			0x4805e000 -#define OMAP2_UDC_BASE			0x4805e200 -#define OMAP2_OTG_BASE			0x4805e300 - -#ifdef CONFIG_ARCH_OMAP1 - -#define OTG_BASE			OMAP1_OTG_BASE -#define UDC_BASE			OMAP1_UDC_BASE -#define OMAP_OHCI_BASE			OMAP1_OHCI_BASE - -#else - -#define OTG_BASE			OMAP2_OTG_BASE -#define UDC_BASE			OMAP2_UDC_BASE -#define OMAP_OHCI_BASE			OMAP2_OHCI_BASE -  struct omap_musb_board_data {  	u8	interface_type;  	u8	mode; @@ -107,44 +89,6 @@ extern int omap4430_phy_init(struct device *dev);  extern int omap4430_phy_exit(struct device *dev);  extern int omap4430_phy_suspend(struct device *dev, int suspend); -/* - * NOTE: Please update omap USB drivers to use ioremap + read/write - */ - -#define OMAP2_L4_IO_OFFSET	0xb2000000 -#define OMAP2_L4_IO_ADDRESS(pa)	IOMEM((pa) + OMAP2_L4_IO_OFFSET) - -static inline u8 omap_readb(u32 pa) -{ -	return __raw_readb(OMAP2_L4_IO_ADDRESS(pa)); -} - -static inline u16 omap_readw(u32 pa) -{ -	return __raw_readw(OMAP2_L4_IO_ADDRESS(pa)); -} - -static inline u32 omap_readl(u32 pa) -{ -	return __raw_readl(OMAP2_L4_IO_ADDRESS(pa)); -} - -static inline void omap_writeb(u8 v, u32 pa) -{ -	__raw_writeb(v, OMAP2_L4_IO_ADDRESS(pa)); -} - - -static inline void omap_writew(u16 v, u32 pa) -{ -	__raw_writew(v, OMAP2_L4_IO_ADDRESS(pa)); -} - -static inline void omap_writel(u32 v, u32 pa) -{ -	__raw_writel(v, OMAP2_L4_IO_ADDRESS(pa)); -} -  #endif  extern void am35x_musb_reset(void); @@ -153,142 +97,6 @@ extern void am35x_musb_clear_irq(void);  extern void am35x_set_mode(u8 musb_mode);  extern void ti81xx_musb_phy_power(u8 on); -/* - * FIXME correct answer depends on hmc_mode, - * as does (on omap1) any nonzero value for config->otg port number - */ -#ifdef	CONFIG_USB_GADGET_OMAP -#define	is_usb0_device(config)	1 -#else -#define	is_usb0_device(config)	0 -#endif - -void omap_otg_init(struct omap_usb_config *config); - -#if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE) -void omap1_usb_init(struct omap_usb_config *pdata); -#else -static inline void omap1_usb_init(struct omap_usb_config *pdata) -{ -} -#endif - -#if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_ARCH_OMAP_OTG_MODULE) -void omap2_usbfs_init(struct omap_usb_config *pdata); -#else -static inline void omap2_usbfs_init(struct omap_usb_config *pdata) -{ -} -#endif - -/*-------------------------------------------------------------------------*/ - -/* - * OTG and transceiver registers, for OMAPs starting with ARM926 - */ -#define OTG_REV				(OTG_BASE + 0x00) -#define OTG_SYSCON_1			(OTG_BASE + 0x04) -#	define	 USB2_TRX_MODE(w)	(((w)>>24)&0x07) -#	define	 USB1_TRX_MODE(w)	(((w)>>20)&0x07) -#	define	 USB0_TRX_MODE(w)	(((w)>>16)&0x07) -#	define	 OTG_IDLE_EN		(1 << 15) -#	define	 HST_IDLE_EN		(1 << 14) -#	define	 DEV_IDLE_EN		(1 << 13) -#	define	 OTG_RESET_DONE		(1 << 2) -#	define	 OTG_SOFT_RESET		(1 << 1) -#define OTG_SYSCON_2			(OTG_BASE + 0x08) -#	define	 OTG_EN			(1 << 31) -#	define	 USBX_SYNCHRO		(1 << 30) -#	define	 OTG_MST16		(1 << 29) -#	define	 SRP_GPDATA		(1 << 28) -#	define	 SRP_GPDVBUS		(1 << 27) -#	define	 SRP_GPUVBUS(w)		(((w)>>24)&0x07) -#	define	 A_WAIT_VRISE(w)	(((w)>>20)&0x07) -#	define	 B_ASE_BRST(w)		(((w)>>16)&0x07) -#	define	 SRP_DPW		(1 << 14) -#	define	 SRP_DATA		(1 << 13) -#	define	 SRP_VBUS		(1 << 12) -#	define	 OTG_PADEN		(1 << 10) -#	define	 HMC_PADEN		(1 << 9) -#	define	 UHOST_EN		(1 << 8) -#	define	 HMC_TLLSPEED		(1 << 7) -#	define	 HMC_TLLATTACH		(1 << 6) -#	define	 OTG_HMC(w)		(((w)>>0)&0x3f) -#define OTG_CTRL			(OTG_BASE + 0x0c) -#	define	 OTG_USB2_EN		(1 << 29) -#	define	 OTG_USB2_DP		(1 << 28) -#	define	 OTG_USB2_DM		(1 << 27) -#	define	 OTG_USB1_EN		(1 << 26) -#	define	 OTG_USB1_DP		(1 << 25) -#	define	 OTG_USB1_DM		(1 << 24) -#	define	 OTG_USB0_EN		(1 << 23) -#	define	 OTG_USB0_DP		(1 << 22) -#	define	 OTG_USB0_DM		(1 << 21) -#	define	 OTG_ASESSVLD		(1 << 20) -#	define	 OTG_BSESSEND		(1 << 19) -#	define	 OTG_BSESSVLD		(1 << 18) -#	define	 OTG_VBUSVLD		(1 << 17) -#	define	 OTG_ID			(1 << 16) -#	define	 OTG_DRIVER_SEL		(1 << 15) -#	define	 OTG_A_SETB_HNPEN	(1 << 12) -#	define	 OTG_A_BUSREQ		(1 << 11) -#	define	 OTG_B_HNPEN		(1 << 9) -#	define	 OTG_B_BUSREQ		(1 << 8) -#	define	 OTG_BUSDROP		(1 << 7) -#	define	 OTG_PULLDOWN		(1 << 5) -#	define	 OTG_PULLUP		(1 << 4) -#	define	 OTG_DRV_VBUS		(1 << 3) -#	define	 OTG_PD_VBUS		(1 << 2) -#	define	 OTG_PU_VBUS		(1 << 1) -#	define	 OTG_PU_ID		(1 << 0) -#define OTG_IRQ_EN			(OTG_BASE + 0x10)	/* 16-bit */ -#	define	 DRIVER_SWITCH		(1 << 15) -#	define	 A_VBUS_ERR		(1 << 13) -#	define	 A_REQ_TMROUT		(1 << 12) -#	define	 A_SRP_DETECT		(1 << 11) -#	define	 B_HNP_FAIL		(1 << 10) -#	define	 B_SRP_TMROUT		(1 << 9) -#	define	 B_SRP_DONE		(1 << 8) -#	define	 B_SRP_STARTED		(1 << 7) -#	define	 OPRT_CHG		(1 << 0) -#define OTG_IRQ_SRC			(OTG_BASE + 0x14)	/* 16-bit */ -	// same bits as in IRQ_EN -#define OTG_OUTCTRL			(OTG_BASE + 0x18)	/* 16-bit */ -#	define	 OTGVPD			(1 << 14) -#	define	 OTGVPU			(1 << 13) -#	define	 OTGPUID		(1 << 12) -#	define	 USB2VDR		(1 << 10) -#	define	 USB2PDEN		(1 << 9) -#	define	 USB2PUEN		(1 << 8) -#	define	 USB1VDR		(1 << 6) -#	define	 USB1PDEN		(1 << 5) -#	define	 USB1PUEN		(1 << 4) -#	define	 USB0VDR		(1 << 2) -#	define	 USB0PDEN		(1 << 1) -#	define	 USB0PUEN		(1 << 0) -#define OTG_TEST			(OTG_BASE + 0x20)	/* 16-bit */ -#define OTG_VENDOR_CODE			(OTG_BASE + 0xfc)	/* 16-bit */ - -/*-------------------------------------------------------------------------*/ - -/* OMAP1 */ -#define	USB_TRANSCEIVER_CTRL		(0xfffe1000 + 0x0064) -#	define	CONF_USB2_UNI_R		(1 << 8) -#	define	CONF_USB1_UNI_R		(1 << 7) -#	define	CONF_USB_PORT0_R(x)	(((x)>>4)&0x7) -#	define	CONF_USB0_ISOLATE_R	(1 << 3) -#	define	CONF_USB_PWRDN_DM_R	(1 << 2) -#	define	CONF_USB_PWRDN_DP_R	(1 << 1) - -/* OMAP2 */ -#	define	USB_UNIDIR			0x0 -#	define	USB_UNIDIR_TLL			0x1 -#	define	USB_BIDIR			0x2 -#	define	USB_BIDIR_TLL			0x3 -#	define	USBTXWRMODEI(port, x)	((x) << (22 - (port * 2))) -#	define	USBT2TLL5PI		(1 << 17) -#	define	USB0PUENACTLOI		(1 << 16) -#	define	USBSTANDBYCTRL		(1 << 15)  /* AM35x */  /* USB 2.0 PHY Control */  #define CONF2_PHY_GPIOMODE	(1 << 23) diff --git a/arch/arm/plat-omap/include/plat/voltage.h b/arch/arm/plat-omap/include/plat/voltage.h index 0a6a482ec01..5be4d5def42 100644 --- a/arch/arm/plat-omap/include/plat/voltage.h +++ b/arch/arm/plat-omap/include/plat/voltage.h @@ -11,10 +11,29 @@  #ifndef __ARCH_ARM_OMAP_VOLTAGE_H  #define __ARCH_ARM_OMAP_VOLTAGE_H +/** + * struct omap_volt_data - Omap voltage specific data. + * @voltage_nominal:	The possible voltage value in uV + * @sr_efuse_offs:	The offset of the efuse register(from system + *			control module base address) from where to read + *			the n-target value for the smartreflex module. + * @sr_errminlimit:	Error min limit value for smartreflex. This value + *			differs at differnet opp and thus is linked + *			with voltage. + * @vp_errorgain:	Error gain value for the voltage processor. This + *			field also differs according to the voltage/opp. + */ +struct omap_volt_data { +	u32	volt_nominal; +	u32	sr_efuse_offs; +	u8	sr_errminlimit; +	u8	vp_errgain; +};  struct voltagedomain;  struct voltagedomain *voltdm_lookup(const char *name);  int voltdm_scale(struct voltagedomain *voltdm, unsigned long target_volt);  unsigned long voltdm_get_voltage(struct voltagedomain *voltdm); - +struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm, +		unsigned long volt);  #endif diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index ad32621aa52..5e13c3884aa 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -282,6 +282,8 @@ static int omap_mbox_startup(struct omap_mbox *mbox)  		}  		mbox->rxq = mq;  		mq->mbox = mbox; + +		omap_mbox_enable_irq(mbox, IRQ_RX);  	}  	mutex_unlock(&mbox_configured_lock);  	return 0; @@ -305,6 +307,7 @@ static void omap_mbox_fini(struct omap_mbox *mbox)  	mutex_lock(&mbox_configured_lock);  	if (!--mbox->use_count) { +		omap_mbox_disable_irq(mbox, IRQ_RX);  		free_irq(mbox->irq, mbox);  		tasklet_kill(&mbox->txq->tasklet);  		flush_work_sync(&mbox->rxq->work); @@ -338,13 +341,15 @@ struct omap_mbox *omap_mbox_get(const char *name, struct notifier_block *nb)  	if (!mbox)  		return ERR_PTR(-ENOENT); -	ret = omap_mbox_startup(mbox); -	if (ret) -		return ERR_PTR(-ENODEV); -  	if (nb)  		blocking_notifier_chain_register(&mbox->notifier, nb); +	ret = omap_mbox_startup(mbox); +	if (ret) { +		blocking_notifier_chain_unregister(&mbox->notifier, nb); +		return ERR_PTR(-ENODEV); +	} +  	return mbox;  }  EXPORT_SYMBOL(omap_mbox_get); diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 477363c163e..766181cb5c9 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c @@ -6,8 +6,8 @@   * Copyright (C) 2005 Nokia Corporation   * Written by Tony Lindgren <tony@atomide.com>   * - * Copyright (C) 2009 Texas Instruments - * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> + * Copyright (C) 2009-2012 Texas Instruments + * Added OMAP4/5 support - Santosh Shilimkar <santosh.shilimkar@ti.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 @@ -44,6 +44,7 @@  #else  #define OMAP4_SRAM_PUB_PA	(OMAP4_SRAM_PA + 0x4000)  #endif +#define OMAP5_SRAM_PA		0x40300000  #if defined(CONFIG_ARCH_OMAP2PLUS)  #define SRAM_BOOTLOADER_SZ	0x00 @@ -85,7 +86,7 @@ static int is_sram_locked(void)  			__raw_writel(0xCFDE, OMAP24XX_VA_READPERM0);  /* all i-read */  			__raw_writel(0xCFDE, OMAP24XX_VA_WRITEPERM0); /* all i-write */  		} -		if (cpu_is_omap34xx() && !cpu_is_am33xx()) { +		if (cpu_is_omap34xx()) {  			__raw_writel(0xFFFF, OMAP34XX_VA_REQINFOPERM0); /* all q-vects */  			__raw_writel(0xFFFF, OMAP34XX_VA_READPERM0);  /* all i-read */  			__raw_writel(0xFFFF, OMAP34XX_VA_WRITEPERM0); /* all i-write */ @@ -118,12 +119,15 @@ static void __init omap_detect_sram(void)  			} else if (cpu_is_omap44xx()) {  				omap_sram_start = OMAP4_SRAM_PUB_PA;  				omap_sram_size = 0xa000; /* 40K */ +			} else if (soc_is_omap54xx()) { +				omap_sram_start = OMAP5_SRAM_PA; +				omap_sram_size = SZ_128K; /* 128KB */  			} else {  				omap_sram_start = OMAP2_SRAM_PUB_PA;  				omap_sram_size = 0x800; /* 2K */  			}  		} else { -			if (cpu_is_am33xx()) { +			if (soc_is_am33xx()) {  				omap_sram_start = AM33XX_SRAM_PA;  				omap_sram_size = 0x10000; /* 64K */  			} else if (cpu_is_omap34xx()) { @@ -132,6 +136,9 @@ static void __init omap_detect_sram(void)  			} else if (cpu_is_omap44xx()) {  				omap_sram_start = OMAP4_SRAM_PA;  				omap_sram_size = 0xe000; /* 56K */ +			} else if (soc_is_omap54xx()) { +				omap_sram_start = OMAP5_SRAM_PA; +				omap_sram_size = SZ_128K; /* 128KB */  			} else {  				omap_sram_start = OMAP2_SRAM_PA;  				if (cpu_is_omap242x()) @@ -386,7 +393,7 @@ int __init omap_sram_init(void)  		omap242x_sram_init();  	else if (cpu_is_omap2430())  		omap243x_sram_init(); -	else if (cpu_is_am33xx()) +	else if (soc_is_am33xx())  		am33xx_sram_init();  	else if (cpu_is_omap34xx())  		omap34xx_sram_init(); diff --git a/arch/arm/plat-omap/usb.c b/arch/arm/plat-omap/usb.c deleted file mode 100644 index daa0327381b..00000000000 --- a/arch/arm/plat-omap/usb.c +++ /dev/null @@ -1,145 +0,0 @@ - /* - * arch/arm/plat-omap/usb.c -- platform level USB initialization - * - * Copyright (C) 2004 Texas Instruments, Inc. - * - * 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 - */ - -#undef	DEBUG - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/io.h> - -#include <plat/usb.h> -#include <plat/board.h> - -#include <mach/hardware.h> - -#ifdef	CONFIG_ARCH_OMAP_OTG - -void __init -omap_otg_init(struct omap_usb_config *config) -{ -	u32		syscon; -	int		alt_pingroup = 0; - -	/* NOTE:  no bus or clock setup (yet?) */ - -	syscon = omap_readl(OTG_SYSCON_1) & 0xffff; -	if (!(syscon & OTG_RESET_DONE)) -		pr_debug("USB resets not complete?\n"); - -	//omap_writew(0, OTG_IRQ_EN); - -	/* pin muxing and transceiver pinouts */ -	if (config->pins[0] > 2)	/* alt pingroup 2 */ -		alt_pingroup = 1; -	syscon |= config->usb0_init(config->pins[0], is_usb0_device(config)); -	syscon |= config->usb1_init(config->pins[1]); -	syscon |= config->usb2_init(config->pins[2], alt_pingroup); -	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); -	omap_writel(syscon, OTG_SYSCON_1); - -	syscon = config->hmc_mode; -	syscon |= USBX_SYNCHRO | (4 << 16) /* B_ASE0_BRST */; -#ifdef	CONFIG_USB_OTG -	if (config->otg) -		syscon |= OTG_EN; -#endif -	if (cpu_class_is_omap1()) -		pr_debug("USB_TRANSCEIVER_CTRL = %03x\n", -			 omap_readl(USB_TRANSCEIVER_CTRL)); -	pr_debug("OTG_SYSCON_2 = %08x\n", omap_readl(OTG_SYSCON_2)); -	omap_writel(syscon, OTG_SYSCON_2); - -	printk("USB: hmc %d", config->hmc_mode); -	if (!alt_pingroup) -		printk(", usb2 alt %d wires", config->pins[2]); -	else if (config->pins[0]) -		printk(", usb0 %d wires%s", config->pins[0], -			is_usb0_device(config) ? " (dev)" : ""); -	if (config->pins[1]) -		printk(", usb1 %d wires", config->pins[1]); -	if (!alt_pingroup && config->pins[2]) -		printk(", usb2 %d wires", config->pins[2]); -	if (config->otg) -		printk(", Mini-AB on usb%d", config->otg - 1); -	printk("\n"); - -	if (cpu_class_is_omap1()) { -		u16 w; - -		/* leave USB clocks/controllers off until needed */ -		w = omap_readw(ULPD_SOFT_REQ); -		w &= ~SOFT_USB_CLK_REQ; -		omap_writew(w, ULPD_SOFT_REQ); - -		w = omap_readw(ULPD_CLOCK_CTRL); -		w &= ~USB_MCLK_EN; -		w |= DIS_USB_PVCI_CLK; -		omap_writew(w, ULPD_CLOCK_CTRL); -	} -	syscon = omap_readl(OTG_SYSCON_1); -	syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN; - -#ifdef	CONFIG_USB_GADGET_OMAP -	if (config->otg || config->register_dev) { -		struct platform_device *udc_device = config->udc_device; -		int status; - -		syscon &= ~DEV_IDLE_EN; -		udc_device->dev.platform_data = config; -		status = platform_device_register(udc_device); -		if (status) -			pr_debug("can't register UDC device, %d\n", status); -	} -#endif - -#if	defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) -	if (config->otg || config->register_host) { -		struct platform_device *ohci_device = config->ohci_device; -		int status; - -		syscon &= ~HST_IDLE_EN; -		ohci_device->dev.platform_data = config; -		status = platform_device_register(ohci_device); -		if (status) -			pr_debug("can't register OHCI device, %d\n", status); -	} -#endif - -#ifdef	CONFIG_USB_OTG -	if (config->otg) { -		struct platform_device *otg_device = config->otg_device; -		int status; - -		syscon &= ~OTG_IDLE_EN; -		otg_device->dev.platform_data = config; -		status = platform_device_register(otg_device); -		if (status) -			pr_debug("can't register OTG device, %d\n", status); -	} -#endif -	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); -	omap_writel(syscon, OTG_SYSCON_1); -} - -#else -void omap_otg_init(struct omap_usb_config *config) {} -#endif diff --git a/arch/arm/plat-pxa/Makefile b/arch/arm/plat-pxa/Makefile index f302d048392..af8e484001e 100644 --- a/arch/arm/plat-pxa/Makefile +++ b/arch/arm/plat-pxa/Makefile @@ -8,5 +8,4 @@ obj-$(CONFIG_PXA3xx)		+= mfp.o  obj-$(CONFIG_PXA95x)		+= mfp.o  obj-$(CONFIG_ARCH_MMP)		+= mfp.o -obj-$(CONFIG_HAVE_PWM)		+= pwm.o  obj-$(CONFIG_PXA_SSP)		+= ssp.o diff --git a/arch/arm/plat-pxa/pwm.c b/arch/arm/plat-pxa/pwm.c deleted file mode 100644 index ef32686feef..00000000000 --- a/arch/arm/plat-pxa/pwm.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * linux/arch/arm/mach-pxa/pwm.c - * - * simple driver for PWM (Pulse Width Modulator) controller - * - * 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. - * - * 2008-02-13	initial version - * 		eric miao <eric.miao@marvell.com> - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/pwm.h> - -#include <asm/div64.h> - -#define HAS_SECONDARY_PWM	0x10 -#define PWM_ID_BASE(d)		((d) & 0xf) - -static const struct platform_device_id pwm_id_table[] = { -	/*   PWM    has_secondary_pwm? */ -	{ "pxa25x-pwm", 0 }, -	{ "pxa27x-pwm", 0 | HAS_SECONDARY_PWM }, -	{ "pxa168-pwm", 1 }, -	{ "pxa910-pwm", 1 }, -	{ }, -}; -MODULE_DEVICE_TABLE(platform, pwm_id_table); - -/* PWM registers and bits definitions */ -#define PWMCR		(0x00) -#define PWMDCR		(0x04) -#define PWMPCR		(0x08) - -#define PWMCR_SD	(1 << 6) -#define PWMDCR_FD	(1 << 10) - -struct pwm_device { -	struct list_head	node; -	struct pwm_device	*secondary; -	struct platform_device	*pdev; - -	const char	*label; -	struct clk	*clk; -	int		clk_enabled; -	void __iomem	*mmio_base; - -	unsigned int	use_count; -	unsigned int	pwm_id; -}; - -/* - * period_ns = 10^9 * (PRESCALE + 1) * (PV + 1) / PWM_CLK_RATE - * duty_ns   = 10^9 * (PRESCALE + 1) * DC / PWM_CLK_RATE - */ -int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) -{ -	unsigned long long c; -	unsigned long period_cycles, prescale, pv, dc; - -	if (pwm == NULL || period_ns == 0 || duty_ns > period_ns) -		return -EINVAL; - -	c = clk_get_rate(pwm->clk); -	c = c * period_ns; -	do_div(c, 1000000000); -	period_cycles = c; - -	if (period_cycles < 1) -		period_cycles = 1; -	prescale = (period_cycles - 1) / 1024; -	pv = period_cycles / (prescale + 1) - 1; - -	if (prescale > 63) -		return -EINVAL; - -	if (duty_ns == period_ns) -		dc = PWMDCR_FD; -	else -		dc = (pv + 1) * duty_ns / period_ns; - -	/* NOTE: the clock to PWM has to be enabled first -	 * before writing to the registers -	 */ -	clk_enable(pwm->clk); -	__raw_writel(prescale, pwm->mmio_base + PWMCR); -	__raw_writel(dc, pwm->mmio_base + PWMDCR); -	__raw_writel(pv, pwm->mmio_base + PWMPCR); -	clk_disable(pwm->clk); - -	return 0; -} -EXPORT_SYMBOL(pwm_config); - -int pwm_enable(struct pwm_device *pwm) -{ -	int rc = 0; - -	if (!pwm->clk_enabled) { -		rc = clk_enable(pwm->clk); -		if (!rc) -			pwm->clk_enabled = 1; -	} -	return rc; -} -EXPORT_SYMBOL(pwm_enable); - -void pwm_disable(struct pwm_device *pwm) -{ -	if (pwm->clk_enabled) { -		clk_disable(pwm->clk); -		pwm->clk_enabled = 0; -	} -} -EXPORT_SYMBOL(pwm_disable); - -static DEFINE_MUTEX(pwm_lock); -static LIST_HEAD(pwm_list); - -struct pwm_device *pwm_request(int pwm_id, const char *label) -{ -	struct pwm_device *pwm; -	int found = 0; - -	mutex_lock(&pwm_lock); - -	list_for_each_entry(pwm, &pwm_list, node) { -		if (pwm->pwm_id == pwm_id) { -			found = 1; -			break; -		} -	} - -	if (found) { -		if (pwm->use_count == 0) { -			pwm->use_count++; -			pwm->label = label; -		} else -			pwm = ERR_PTR(-EBUSY); -	} else -		pwm = ERR_PTR(-ENOENT); - -	mutex_unlock(&pwm_lock); -	return pwm; -} -EXPORT_SYMBOL(pwm_request); - -void pwm_free(struct pwm_device *pwm) -{ -	mutex_lock(&pwm_lock); - -	if (pwm->use_count) { -		pwm->use_count--; -		pwm->label = NULL; -	} else -		pr_warning("PWM device already freed\n"); - -	mutex_unlock(&pwm_lock); -} -EXPORT_SYMBOL(pwm_free); - -static inline void __add_pwm(struct pwm_device *pwm) -{ -	mutex_lock(&pwm_lock); -	list_add_tail(&pwm->node, &pwm_list); -	mutex_unlock(&pwm_lock); -} - -static int __devinit pwm_probe(struct platform_device *pdev) -{ -	const struct platform_device_id *id = platform_get_device_id(pdev); -	struct pwm_device *pwm, *secondary = NULL; -	struct resource *r; -	int ret = 0; - -	pwm = kzalloc(sizeof(struct pwm_device), GFP_KERNEL); -	if (pwm == NULL) { -		dev_err(&pdev->dev, "failed to allocate memory\n"); -		return -ENOMEM; -	} - -	pwm->clk = clk_get(&pdev->dev, NULL); -	if (IS_ERR(pwm->clk)) { -		ret = PTR_ERR(pwm->clk); -		goto err_free; -	} -	pwm->clk_enabled = 0; - -	pwm->use_count = 0; -	pwm->pwm_id = PWM_ID_BASE(id->driver_data) + pdev->id; -	pwm->pdev = pdev; - -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (r == NULL) { -		dev_err(&pdev->dev, "no memory resource defined\n"); -		ret = -ENODEV; -		goto err_free_clk; -	} - -	r = request_mem_region(r->start, resource_size(r), pdev->name); -	if (r == NULL) { -		dev_err(&pdev->dev, "failed to request memory resource\n"); -		ret = -EBUSY; -		goto err_free_clk; -	} - -	pwm->mmio_base = ioremap(r->start, resource_size(r)); -	if (pwm->mmio_base == NULL) { -		dev_err(&pdev->dev, "failed to ioremap() registers\n"); -		ret = -ENODEV; -		goto err_free_mem; -	} - -	if (id->driver_data & HAS_SECONDARY_PWM) { -		secondary = kzalloc(sizeof(struct pwm_device), GFP_KERNEL); -		if (secondary == NULL) { -			ret = -ENOMEM; -			goto err_free_mem; -		} - -		*secondary = *pwm; -		pwm->secondary = secondary; - -		/* registers for the second PWM has offset of 0x10 */ -		secondary->mmio_base = pwm->mmio_base + 0x10; -		secondary->pwm_id = pdev->id + 2; -	} - -	__add_pwm(pwm); -	if (secondary) -		__add_pwm(secondary); - -	platform_set_drvdata(pdev, pwm); -	return 0; - -err_free_mem: -	release_mem_region(r->start, resource_size(r)); -err_free_clk: -	clk_put(pwm->clk); -err_free: -	kfree(pwm); -	return ret; -} - -static int __devexit pwm_remove(struct platform_device *pdev) -{ -	struct pwm_device *pwm; -	struct resource *r; - -	pwm = platform_get_drvdata(pdev); -	if (pwm == NULL) -		return -ENODEV; - -	mutex_lock(&pwm_lock); - -	if (pwm->secondary) { -		list_del(&pwm->secondary->node); -		kfree(pwm->secondary); -	} - -	list_del(&pwm->node); -	mutex_unlock(&pwm_lock); - -	iounmap(pwm->mmio_base); - -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	release_mem_region(r->start, resource_size(r)); - -	clk_put(pwm->clk); -	kfree(pwm); -	return 0; -} - -static struct platform_driver pwm_driver = { -	.driver		= { -		.name	= "pxa25x-pwm", -		.owner	= THIS_MODULE, -	}, -	.probe		= pwm_probe, -	.remove		= __devexit_p(pwm_remove), -	.id_table	= pwm_id_table, -}; - -static int __init pwm_init(void) -{ -	return platform_driver_register(&pwm_driver); -} -arch_initcall(pwm_init); - -static void __exit pwm_exit(void) -{ -	platform_driver_unregister(&pwm_driver); -} -module_exit(pwm_exit); - -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c index bc42c04091f..fe57bbbf166 100644 --- a/arch/arm/plat-s3c24xx/irq.c +++ b/arch/arm/plat-s3c24xx/irq.c @@ -533,7 +533,7 @@ void __init s3c24xx_init_irq(void)  	int i;  #ifdef CONFIG_FIQ -	init_FIQ(); +	init_FIQ(FIQ_START);  #endif  	irqdbf("s3c2410_init_irq: clearing interrupt status flags\n"); diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig index a2fae4ea093..7aca31c1df1 100644 --- a/arch/arm/plat-samsung/Kconfig +++ b/arch/arm/plat-samsung/Kconfig @@ -78,6 +78,10 @@ config S5P_HRT  # clock options +config SAMSUNG_CLOCK +	bool +	default y if !COMMON_CLK +  config SAMSUNG_CLKSRC  	bool  	help @@ -491,14 +495,6 @@ config S5P_SLEEP  	  Internal config node to apply common S5P sleep management code.  	  Can be selected by S5P and newer SoCs with similar sleep procedure. -comment "Power Domain" - -config SAMSUNG_PD -	bool "Samsung Power Domain" -	depends on PM_RUNTIME -	help -	  Say Y here if you want to control Power Domain by Runtime PM. -  config DEBUG_S3C_UART  	depends on PLAT_SAMSUNG  	int diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile index 860b2db4db1..9e40e8d0074 100644 --- a/arch/arm/plat-samsung/Makefile +++ b/arch/arm/plat-samsung/Makefile @@ -15,8 +15,8 @@ obj-y				+= init.o cpu.o  obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET)   += time.o  obj-$(CONFIG_S5P_HRT) 		+= s5p-time.o -obj-y				+= clock.o -obj-y				+= pwm-clock.o +obj-$(CONFIG_SAMSUNG_CLOCK)	+= clock.o +obj-$(CONFIG_SAMSUNG_CLOCK)	+= pwm-clock.o  obj-$(CONFIG_SAMSUNG_CLKSRC)	+= clock-clksrc.o  obj-$(CONFIG_S5P_CLOCK)		+= s5p-clock.o @@ -59,11 +59,3 @@ obj-$(CONFIG_SAMSUNG_WAKEMASK)	+= wakeup-mask.o  obj-$(CONFIG_S5P_PM)		+= s5p-pm.o s5p-irq-pm.o  obj-$(CONFIG_S5P_SLEEP)		+= s5p-sleep.o - -# PD support - -obj-$(CONFIG_SAMSUNG_PD)	+= pd.o - -# PWM support - -obj-$(CONFIG_HAVE_PWM)		+= pwm.o diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 6303974c2ee..74e31ce3553 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c @@ -1513,7 +1513,7 @@ static struct resource s3c64xx_spi0_resource[] = {  };  struct platform_device s3c64xx_device_spi0 = { -	.name		= "s3c64xx-spi", +	.name		= "s3c6410-spi",  	.id		= 0,  	.num_resources	= ARRAY_SIZE(s3c64xx_spi0_resource),  	.resource	= s3c64xx_spi0_resource, @@ -1523,13 +1523,10 @@ struct platform_device s3c64xx_device_spi0 = {  	},  }; -void __init s3c64xx_spi0_set_platdata(struct s3c64xx_spi_info *pd, -				      int src_clk_nr, int num_cs) +void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, +						int num_cs)  { -	if (!pd) { -		pr_err("%s:Need to pass platform data\n", __func__); -		return; -	} +	struct s3c64xx_spi_info pd;  	/* Reject invalid configuration */  	if (!num_cs || src_clk_nr < 0) { @@ -1537,12 +1534,11 @@ void __init s3c64xx_spi0_set_platdata(struct s3c64xx_spi_info *pd,  		return;  	} -	pd->num_cs = num_cs; -	pd->src_clk_nr = src_clk_nr; -	if (!pd->cfg_gpio) -		pd->cfg_gpio = s3c64xx_spi0_cfg_gpio; +	pd.num_cs = num_cs; +	pd.src_clk_nr = src_clk_nr; +	pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio; -	s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi0); +	s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi0);  }  #endif /* CONFIG_S3C64XX_DEV_SPI0 */ @@ -1555,7 +1551,7 @@ static struct resource s3c64xx_spi1_resource[] = {  };  struct platform_device s3c64xx_device_spi1 = { -	.name		= "s3c64xx-spi", +	.name		= "s3c6410-spi",  	.id		= 1,  	.num_resources	= ARRAY_SIZE(s3c64xx_spi1_resource),  	.resource	= s3c64xx_spi1_resource, @@ -1565,26 +1561,20 @@ struct platform_device s3c64xx_device_spi1 = {  	},  }; -void __init s3c64xx_spi1_set_platdata(struct s3c64xx_spi_info *pd, -				      int src_clk_nr, int num_cs) +void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, +						int num_cs)  { -	if (!pd) { -		pr_err("%s:Need to pass platform data\n", __func__); -		return; -	} -  	/* Reject invalid configuration */  	if (!num_cs || src_clk_nr < 0) {  		pr_err("%s: Invalid SPI configuration\n", __func__);  		return;  	} -	pd->num_cs = num_cs; -	pd->src_clk_nr = src_clk_nr; -	if (!pd->cfg_gpio) -		pd->cfg_gpio = s3c64xx_spi1_cfg_gpio; +	pd.num_cs = num_cs; +	pd.src_clk_nr = src_clk_nr; +	pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio; -	s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi1); +	s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1);  }  #endif /* CONFIG_S3C64XX_DEV_SPI1 */ @@ -1597,7 +1587,7 @@ static struct resource s3c64xx_spi2_resource[] = {  };  struct platform_device s3c64xx_device_spi2 = { -	.name		= "s3c64xx-spi", +	.name		= "s3c6410-spi",  	.id		= 2,  	.num_resources	= ARRAY_SIZE(s3c64xx_spi2_resource),  	.resource	= s3c64xx_spi2_resource, @@ -1607,13 +1597,10 @@ struct platform_device s3c64xx_device_spi2 = {  	},  }; -void __init s3c64xx_spi2_set_platdata(struct s3c64xx_spi_info *pd, -				      int src_clk_nr, int num_cs) +void __init s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, +						int num_cs)  { -	if (!pd) { -		pr_err("%s:Need to pass platform data\n", __func__); -		return; -	} +	struct s3c64xx_spi_info pd;  	/* Reject invalid configuration */  	if (!num_cs || src_clk_nr < 0) { @@ -1621,11 +1608,10 @@ void __init s3c64xx_spi2_set_platdata(struct s3c64xx_spi_info *pd,  		return;  	} -	pd->num_cs = num_cs; -	pd->src_clk_nr = src_clk_nr; -	if (!pd->cfg_gpio) -		pd->cfg_gpio = s3c64xx_spi2_cfg_gpio; +	pd.num_cs = num_cs; +	pd.src_clk_nr = src_clk_nr; +	pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio; -	s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi2); +	s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2);  }  #endif /* CONFIG_S3C64XX_DEV_SPI2 */ diff --git a/arch/arm/plat-samsung/dma-ops.c b/arch/arm/plat-samsung/dma-ops.c index eb9f4f53400..c38d7548924 100644 --- a/arch/arm/plat-samsung/dma-ops.c +++ b/arch/arm/plat-samsung/dma-ops.c @@ -19,72 +19,79 @@  #include <mach/dma.h>  static unsigned samsung_dmadev_request(enum dma_ch dma_ch, -				struct samsung_dma_info *info) +				struct samsung_dma_req *param)  { -	struct dma_chan *chan;  	dma_cap_mask_t mask; -	struct dma_slave_config slave_config;  	void *filter_param;  	dma_cap_zero(mask); -	dma_cap_set(info->cap, mask); +	dma_cap_set(param->cap, mask);  	/*  	 * If a dma channel property of a device node from device tree is  	 * specified, use that as the fliter parameter.  	 */ -	filter_param = (dma_ch == DMACH_DT_PROP) ? (void *)info->dt_dmach_prop : -				(void *)dma_ch; -	chan = dma_request_channel(mask, pl330_filter, filter_param); +	filter_param = (dma_ch == DMACH_DT_PROP) ? +		(void *)param->dt_dmach_prop : (void *)dma_ch; +	return (unsigned)dma_request_channel(mask, pl330_filter, filter_param); +} + +static int samsung_dmadev_release(unsigned ch, void *param) +{ +	dma_release_channel((struct dma_chan *)ch); -	if (info->direction == DMA_DEV_TO_MEM) { +	return 0; +} + +static int samsung_dmadev_config(unsigned ch, +				struct samsung_dma_config *param) +{ +	struct dma_chan *chan = (struct dma_chan *)ch; +	struct dma_slave_config slave_config; + +	if (param->direction == DMA_DEV_TO_MEM) {  		memset(&slave_config, 0, sizeof(struct dma_slave_config)); -		slave_config.direction = info->direction; -		slave_config.src_addr = info->fifo; -		slave_config.src_addr_width = info->width; +		slave_config.direction = param->direction; +		slave_config.src_addr = param->fifo; +		slave_config.src_addr_width = param->width;  		slave_config.src_maxburst = 1;  		dmaengine_slave_config(chan, &slave_config); -	} else if (info->direction == DMA_MEM_TO_DEV) { +	} else if (param->direction == DMA_MEM_TO_DEV) {  		memset(&slave_config, 0, sizeof(struct dma_slave_config)); -		slave_config.direction = info->direction; -		slave_config.dst_addr = info->fifo; -		slave_config.dst_addr_width = info->width; +		slave_config.direction = param->direction; +		slave_config.dst_addr = param->fifo; +		slave_config.dst_addr_width = param->width;  		slave_config.dst_maxburst = 1;  		dmaengine_slave_config(chan, &slave_config); +	} else { +		pr_warn("unsupported direction\n"); +		return -EINVAL;  	} -	return (unsigned)chan; -} - -static int samsung_dmadev_release(unsigned ch, -			struct s3c2410_dma_client *client) -{ -	dma_release_channel((struct dma_chan *)ch); -  	return 0;  }  static int samsung_dmadev_prepare(unsigned ch, -			struct samsung_dma_prep_info *info) +			struct samsung_dma_prep *param)  {  	struct scatterlist sg;  	struct dma_chan *chan = (struct dma_chan *)ch;  	struct dma_async_tx_descriptor *desc; -	switch (info->cap) { +	switch (param->cap) {  	case DMA_SLAVE:  		sg_init_table(&sg, 1); -		sg_dma_len(&sg) = info->len; -		sg_set_page(&sg, pfn_to_page(PFN_DOWN(info->buf)), -			    info->len, offset_in_page(info->buf)); -		sg_dma_address(&sg) = info->buf; +		sg_dma_len(&sg) = param->len; +		sg_set_page(&sg, pfn_to_page(PFN_DOWN(param->buf)), +			    param->len, offset_in_page(param->buf)); +		sg_dma_address(&sg) = param->buf;  		desc = dmaengine_prep_slave_sg(chan, -			&sg, 1, info->direction, DMA_PREP_INTERRUPT); +			&sg, 1, param->direction, DMA_PREP_INTERRUPT);  		break;  	case DMA_CYCLIC: -		desc = dmaengine_prep_dma_cyclic(chan, -			info->buf, info->len, info->period, info->direction); +		desc = dmaengine_prep_dma_cyclic(chan, param->buf, +			param->len, param->period, param->direction);  		break;  	default:  		dev_err(&chan->dev->device, "unsupported format\n"); @@ -96,8 +103,8 @@ static int samsung_dmadev_prepare(unsigned ch,  		return -EFAULT;  	} -	desc->callback = info->fp; -	desc->callback_param = info->fp_param; +	desc->callback = param->fp; +	desc->callback_param = param->fp_param;  	dmaengine_submit((struct dma_async_tx_descriptor *)desc); @@ -119,6 +126,7 @@ static inline int samsung_dmadev_flush(unsigned ch)  static struct samsung_dma_ops dmadev_ops = {  	.request	= samsung_dmadev_request,  	.release	= samsung_dmadev_release, +	.config		= samsung_dmadev_config,  	.prepare	= samsung_dmadev_prepare,  	.trigger	= samsung_dmadev_trigger,  	.started	= NULL, diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index 0721293fad6..ace4451b765 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h @@ -132,6 +132,10 @@ IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)  #define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE } +#ifndef KHZ +#define KHZ (1000) +#endif +  #ifndef MHZ  #define MHZ (1000*1000)  #endif diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index 61ca2f356c5..5da4b4f38f4 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h @@ -131,7 +131,6 @@ extern struct platform_device exynos4_device_ohci;  extern struct platform_device exynos4_device_pcm0;  extern struct platform_device exynos4_device_pcm1;  extern struct platform_device exynos4_device_pcm2; -extern struct platform_device exynos4_device_pd[];  extern struct platform_device exynos4_device_spdif;  extern struct platform_device exynos_device_drm; diff --git a/arch/arm/plat-samsung/include/plat/dma-ops.h b/arch/arm/plat-samsung/include/plat/dma-ops.h index 71a6827c770..f5144cdd300 100644 --- a/arch/arm/plat-samsung/include/plat/dma-ops.h +++ b/arch/arm/plat-samsung/include/plat/dma-ops.h @@ -16,7 +16,13 @@  #include <linux/dmaengine.h>  #include <mach/dma.h> -struct samsung_dma_prep_info { +struct samsung_dma_req { +	enum dma_transaction_type cap; +	struct property *dt_dmach_prop; +	struct s3c2410_dma_client *client; +}; + +struct samsung_dma_prep {  	enum dma_transaction_type cap;  	enum dma_transfer_direction direction;  	dma_addr_t buf; @@ -26,19 +32,17 @@ struct samsung_dma_prep_info {  	void *fp_param;  }; -struct samsung_dma_info { -	enum dma_transaction_type cap; +struct samsung_dma_config {  	enum dma_transfer_direction direction;  	enum dma_slave_buswidth width;  	dma_addr_t fifo; -	struct s3c2410_dma_client *client; -	struct property *dt_dmach_prop;  };  struct samsung_dma_ops { -	unsigned (*request)(enum dma_ch ch, struct samsung_dma_info *info); -	int (*release)(unsigned ch, struct s3c2410_dma_client *client); -	int (*prepare)(unsigned ch, struct samsung_dma_prep_info *info); +	unsigned (*request)(enum dma_ch ch, struct samsung_dma_req *param); +	int (*release)(unsigned ch, void *param); +	int (*config)(unsigned ch, struct samsung_dma_config *param); +	int (*prepare)(unsigned ch, struct samsung_dma_prep *param);  	int (*trigger)(unsigned ch);  	int (*started)(unsigned ch);  	int (*flush)(unsigned ch); diff --git a/arch/arm/plat-samsung/include/plat/fb.h b/arch/arm/plat-samsung/include/plat/fb.h index 536002ff2ab..b885322717a 100644 --- a/arch/arm/plat-samsung/include/plat/fb.h +++ b/arch/arm/plat-samsung/include/plat/fb.h @@ -43,7 +43,6 @@ struct s3c_fb_pd_win {   * @setup_gpio: Setup the external GPIO pins to the right state to transfer   *		the data from the display system to the connected display   *		device. - * @default_win: default window layer number to be used for UI layer.   * @vidcon0: The base vidcon0 values to control the panel data format.   * @vidcon1: The base vidcon1 values to control the panel data output.   * @vtiming: Video timing when connected to a RGB type panel. diff --git a/arch/arm/plat-samsung/include/plat/gpio-cfg.h b/arch/arm/plat-samsung/include/plat/gpio-cfg.h index df8155b9d4d..08740eed050 100644 --- a/arch/arm/plat-samsung/include/plat/gpio-cfg.h +++ b/arch/arm/plat-samsung/include/plat/gpio-cfg.h @@ -24,7 +24,7 @@  #ifndef __PLAT_GPIO_CFG_H  #define __PLAT_GPIO_CFG_H __FILE__ -#include<linux/types.h> +#include <linux/types.h>  typedef unsigned int __bitwise__ samsung_gpio_pull_t;  typedef unsigned int __bitwise__ s5p_gpio_drvstr_t; diff --git a/arch/arm/plat-samsung/include/plat/pd.h b/arch/arm/plat-samsung/include/plat/pd.h deleted file mode 100644 index abb4bc32716..00000000000 --- a/arch/arm/plat-samsung/include/plat/pd.h +++ /dev/null @@ -1,30 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/pd.h - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#ifndef __ASM_PLAT_SAMSUNG_PD_H -#define __ASM_PLAT_SAMSUNG_PD_H __FILE__ - -struct samsung_pd_info { -	int (*enable)(struct device *dev); -	int (*disable)(struct device *dev); -	void __iomem *base; -}; - -enum exynos4_pd_block { -	PD_MFC, -	PD_G3D, -	PD_LCD0, -	PD_LCD1, -	PD_TV, -	PD_CAM, -	PD_GPS -}; - -#endif /* __ASM_PLAT_SAMSUNG_PD_H */ diff --git a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h index fa95e9a0097..ceba18d23a5 100644 --- a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h +++ b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h @@ -18,7 +18,6 @@ struct platform_device;   * @fb_delay: Slave specific feedback delay.   *            Refer to FB_CLK_SEL register definition in SPI chapter.   * @line: Custom 'identity' of the CS line. - * @set_level: CS line control.   *   * This is per SPI-Slave Chipselect information.   * Allocate and initialize one in machine init code and make the @@ -27,57 +26,41 @@ struct platform_device;  struct s3c64xx_spi_csinfo {  	u8 fb_delay;  	unsigned line; -	void (*set_level)(unsigned line_id, int lvl);  };  /**   * struct s3c64xx_spi_info - SPI Controller defining structure   * @src_clk_nr: Clock source index for the CLK_CFG[SPI_CLKSEL] field. - * @clk_from_cmu: If the SPI clock/prescalar control block is present - *     by the platform's clock-management-unit and not in SPI controller.   * @num_cs: Number of CS this controller emulates.   * @cfg_gpio: Configure pins for this SPI controller. - * @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6 - * @rx_lvl_offset: Depends on tx fifo_lvl field and bus number - * @high_speed: If the controller supports HIGH_SPEED_EN bit - * @tx_st_done: Depends on tx fifo_lvl field   */  struct s3c64xx_spi_info {  	int src_clk_nr; -	bool clk_from_cmu; -  	int num_cs; - -	int (*cfg_gpio)(struct platform_device *pdev); - -	/* Following two fields are for future compatibility */ -	int fifo_lvl_mask; -	int rx_lvl_offset; -	int high_speed; -	int tx_st_done; +	int (*cfg_gpio)(void);  };  /**   * s3c64xx_spi_set_platdata - SPI Controller configure callback by the board   *				initialization code. - * @pd: SPI platform data to set. + * @cfg_gpio: Pointer to gpio setup function.   * @src_clk_nr: Clock the SPI controller is to use to generate SPI clocks.   * @num_cs: Number of elements in the 'cs' array.   *   * Call this from machine init code for each SPI Controller that   * has some chips attached to it.   */ -extern void s3c64xx_spi0_set_platdata(struct s3c64xx_spi_info *pd, -				      int src_clk_nr, int num_cs); -extern void s3c64xx_spi1_set_platdata(struct s3c64xx_spi_info *pd, -				      int src_clk_nr, int num_cs); -extern void s3c64xx_spi2_set_platdata(struct s3c64xx_spi_info *pd, -				      int src_clk_nr, int num_cs); +extern void s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, +						int num_cs); +extern void s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, +						int num_cs); +extern void s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, +						int num_cs);  /* defined by architecture to configure gpio */ -extern int s3c64xx_spi0_cfg_gpio(struct platform_device *dev); -extern int s3c64xx_spi1_cfg_gpio(struct platform_device *dev); -extern int s3c64xx_spi2_cfg_gpio(struct platform_device *dev); +extern int s3c64xx_spi0_cfg_gpio(void); +extern int s3c64xx_spi1_cfg_gpio(void); +extern int s3c64xx_spi2_cfg_gpio(void);  extern struct s3c64xx_spi_info s3c64xx_spi0_pdata;  extern struct s3c64xx_spi_info s3c64xx_spi1_pdata; diff --git a/arch/arm/plat-samsung/pd.c b/arch/arm/plat-samsung/pd.c deleted file mode 100644 index 312b510d86b..00000000000 --- a/arch/arm/plat-samsung/pd.c +++ /dev/null @@ -1,95 +0,0 @@ -/* linux/arch/arm/plat-samsung/pd.c - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Samsung Power domain support - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#include <linux/init.h> -#include <linux/export.h> -#include <linux/platform_device.h> -#include <linux/err.h> -#include <linux/pm_runtime.h> - -#include <plat/pd.h> - -static int samsung_pd_probe(struct platform_device *pdev) -{ -	struct samsung_pd_info *pdata = pdev->dev.platform_data; -	struct device *dev = &pdev->dev; - -	if (!pdata) { -		dev_err(dev, "no device data specified\n"); -		return -ENOENT; -	} - -	pm_runtime_set_active(dev); -	pm_runtime_enable(dev); - -	dev_info(dev, "power domain registered\n"); -	return 0; -} - -static int __devexit samsung_pd_remove(struct platform_device *pdev) -{ -	struct device *dev = &pdev->dev; - -	pm_runtime_disable(dev); -	return 0; -} - -static int samsung_pd_runtime_suspend(struct device *dev) -{ -	struct samsung_pd_info *pdata = dev->platform_data; -	int ret = 0; - -	if (pdata->disable) -		ret = pdata->disable(dev); - -	dev_dbg(dev, "suspended\n"); -	return ret; -} - -static int samsung_pd_runtime_resume(struct device *dev) -{ -	struct samsung_pd_info *pdata = dev->platform_data; -	int ret = 0; - -	if (pdata->enable) -		ret = pdata->enable(dev); - -	dev_dbg(dev, "resumed\n"); -	return ret; -} - -static const struct dev_pm_ops samsung_pd_pm_ops = { -	.runtime_suspend	= samsung_pd_runtime_suspend, -	.runtime_resume		= samsung_pd_runtime_resume, -}; - -static struct platform_driver samsung_pd_driver = { -	.driver		= { -		.name		= "samsung-pd", -		.owner		= THIS_MODULE, -		.pm		= &samsung_pd_pm_ops, -	}, -	.probe		= samsung_pd_probe, -	.remove		= __devexit_p(samsung_pd_remove), -}; - -static int __init samsung_pd_init(void) -{ -	int ret; - -	ret = platform_driver_register(&samsung_pd_driver); -	if (ret) -		printk(KERN_ERR "%s: failed to add PD driver\n", __func__); - -	return ret; -} -arch_initcall(samsung_pd_init); diff --git a/arch/arm/plat-samsung/pwm.c b/arch/arm/plat-samsung/pwm.c deleted file mode 100644 index c559d8438c7..00000000000 --- a/arch/arm/plat-samsung/pwm.c +++ /dev/null @@ -1,420 +0,0 @@ -/* arch/arm/plat-s3c/pwm.c - * - * Copyright (c) 2007 Ben Dooks - * Copyright (c) 2008 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk>, <ben-linux@fluff.org> - * - * S3C series PWM device core - * - * 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. -*/ - -#include <linux/export.h> -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/pwm.h> - -#include <mach/map.h> - -#include <plat/regs-timer.h> - -struct pwm_device { -	struct list_head	 list; -	struct platform_device	*pdev; - -	struct clk		*clk_div; -	struct clk		*clk; -	const char		*label; - -	unsigned int		 period_ns; -	unsigned int		 duty_ns; - -	unsigned char		 tcon_base; -	unsigned char		 running; -	unsigned char		 use_count; -	unsigned char		 pwm_id; -}; - -#define pwm_dbg(_pwm, msg...) dev_dbg(&(_pwm)->pdev->dev, msg) - -static struct clk *clk_scaler[2]; - -static inline int pwm_is_tdiv(struct pwm_device *pwm) -{ -	return clk_get_parent(pwm->clk) == pwm->clk_div; -} - -static DEFINE_MUTEX(pwm_lock); -static LIST_HEAD(pwm_list); - -struct pwm_device *pwm_request(int pwm_id, const char *label) -{ -	struct pwm_device *pwm; -	int found = 0; - -	mutex_lock(&pwm_lock); - -	list_for_each_entry(pwm, &pwm_list, list) { -		if (pwm->pwm_id == pwm_id) { -			found = 1; -			break; -		} -	} - -	if (found) { -		if (pwm->use_count == 0) { -			pwm->use_count = 1; -			pwm->label = label; -		} else -			pwm = ERR_PTR(-EBUSY); -	} else -		pwm = ERR_PTR(-ENOENT); - -	mutex_unlock(&pwm_lock); -	return pwm; -} - -EXPORT_SYMBOL(pwm_request); - - -void pwm_free(struct pwm_device *pwm) -{ -	mutex_lock(&pwm_lock); - -	if (pwm->use_count) { -		pwm->use_count--; -		pwm->label = NULL; -	} else -		printk(KERN_ERR "PWM%d device already freed\n", pwm->pwm_id); - -	mutex_unlock(&pwm_lock); -} - -EXPORT_SYMBOL(pwm_free); - -#define pwm_tcon_start(pwm) (1 << (pwm->tcon_base + 0)) -#define pwm_tcon_invert(pwm) (1 << (pwm->tcon_base + 2)) -#define pwm_tcon_autoreload(pwm) (1 << (pwm->tcon_base + 3)) -#define pwm_tcon_manulupdate(pwm) (1 << (pwm->tcon_base + 1)) - -int pwm_enable(struct pwm_device *pwm) -{ -	unsigned long flags; -	unsigned long tcon; - -	local_irq_save(flags); - -	tcon = __raw_readl(S3C2410_TCON); -	tcon |= pwm_tcon_start(pwm); -	__raw_writel(tcon, S3C2410_TCON); - -	local_irq_restore(flags); - -	pwm->running = 1; -	return 0; -} - -EXPORT_SYMBOL(pwm_enable); - -void pwm_disable(struct pwm_device *pwm) -{ -	unsigned long flags; -	unsigned long tcon; - -	local_irq_save(flags); - -	tcon = __raw_readl(S3C2410_TCON); -	tcon &= ~pwm_tcon_start(pwm); -	__raw_writel(tcon, S3C2410_TCON); - -	local_irq_restore(flags); - -	pwm->running = 0; -} - -EXPORT_SYMBOL(pwm_disable); - -static unsigned long pwm_calc_tin(struct pwm_device *pwm, unsigned long freq) -{ -	unsigned long tin_parent_rate; -	unsigned int div; - -	tin_parent_rate = clk_get_rate(clk_get_parent(pwm->clk_div)); -	pwm_dbg(pwm, "tin parent at %lu\n", tin_parent_rate); - -	for (div = 2; div <= 16; div *= 2) { -		if ((tin_parent_rate / (div << 16)) < freq) -			return tin_parent_rate / div; -	} - -	return tin_parent_rate / 16; -} - -#define NS_IN_HZ (1000000000UL) - -int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) -{ -	unsigned long tin_rate; -	unsigned long tin_ns; -	unsigned long period; -	unsigned long flags; -	unsigned long tcon; -	unsigned long tcnt; -	long tcmp; - -	/* We currently avoid using 64bit arithmetic by using the -	 * fact that anything faster than 1Hz is easily representable -	 * by 32bits. */ - -	if (period_ns > NS_IN_HZ || duty_ns > NS_IN_HZ) -		return -ERANGE; - -	if (duty_ns > period_ns) -		return -EINVAL; - -	if (period_ns == pwm->period_ns && -	    duty_ns == pwm->duty_ns) -		return 0; - -	/* The TCMP and TCNT can be read without a lock, they're not -	 * shared between the timers. */ - -	tcmp = __raw_readl(S3C2410_TCMPB(pwm->pwm_id)); -	tcnt = __raw_readl(S3C2410_TCNTB(pwm->pwm_id)); - -	period = NS_IN_HZ / period_ns; - -	pwm_dbg(pwm, "duty_ns=%d, period_ns=%d (%lu)\n", -		duty_ns, period_ns, period); - -	/* Check to see if we are changing the clock rate of the PWM */ - -	if (pwm->period_ns != period_ns) { -		if (pwm_is_tdiv(pwm)) { -			tin_rate = pwm_calc_tin(pwm, period); -			clk_set_rate(pwm->clk_div, tin_rate); -		} else -			tin_rate = clk_get_rate(pwm->clk); - -		pwm->period_ns = period_ns; - -		pwm_dbg(pwm, "tin_rate=%lu\n", tin_rate); - -		tin_ns = NS_IN_HZ / tin_rate; -		tcnt = period_ns / tin_ns; -	} else -		tin_ns = NS_IN_HZ / clk_get_rate(pwm->clk); - -	/* Note, counters count down */ - -	tcmp = duty_ns / tin_ns; -	tcmp = tcnt - tcmp; -	/* the pwm hw only checks the compare register after a decrement, -	   so the pin never toggles if tcmp = tcnt */ -	if (tcmp == tcnt) -		tcmp--; - -	pwm_dbg(pwm, "tin_ns=%lu, tcmp=%ld/%lu\n", tin_ns, tcmp, tcnt); - -	if (tcmp < 0) -		tcmp = 0; - -	/* Update the PWM register block. */ - -	local_irq_save(flags); - -	__raw_writel(tcmp, S3C2410_TCMPB(pwm->pwm_id)); -	__raw_writel(tcnt, S3C2410_TCNTB(pwm->pwm_id)); - -	tcon = __raw_readl(S3C2410_TCON); -	tcon |= pwm_tcon_manulupdate(pwm); -	tcon |= pwm_tcon_autoreload(pwm); -	__raw_writel(tcon, S3C2410_TCON); - -	tcon &= ~pwm_tcon_manulupdate(pwm); -	__raw_writel(tcon, S3C2410_TCON); - -	local_irq_restore(flags); - -	return 0; -} - -EXPORT_SYMBOL(pwm_config); - -static int pwm_register(struct pwm_device *pwm) -{ -	pwm->duty_ns = -1; -	pwm->period_ns = -1; - -	mutex_lock(&pwm_lock); -	list_add_tail(&pwm->list, &pwm_list); -	mutex_unlock(&pwm_lock); - -	return 0; -} - -static int s3c_pwm_probe(struct platform_device *pdev) -{ -	struct device *dev = &pdev->dev; -	struct pwm_device *pwm; -	unsigned long flags; -	unsigned long tcon; -	unsigned int id = pdev->id; -	int ret; - -	if (id == 4) { -		dev_err(dev, "TIMER4 is currently not supported\n"); -		return -ENXIO; -	} - -	pwm = kzalloc(sizeof(struct pwm_device), GFP_KERNEL); -	if (pwm == NULL) { -		dev_err(dev, "failed to allocate pwm_device\n"); -		return -ENOMEM; -	} - -	pwm->pdev = pdev; -	pwm->pwm_id = id; - -	/* calculate base of control bits in TCON */ -	pwm->tcon_base = id == 0 ? 0 : (id * 4) + 4; - -	pwm->clk = clk_get(dev, "pwm-tin"); -	if (IS_ERR(pwm->clk)) { -		dev_err(dev, "failed to get pwm tin clk\n"); -		ret = PTR_ERR(pwm->clk); -		goto err_alloc; -	} - -	pwm->clk_div = clk_get(dev, "pwm-tdiv"); -	if (IS_ERR(pwm->clk_div)) { -		dev_err(dev, "failed to get pwm tdiv clk\n"); -		ret = PTR_ERR(pwm->clk_div); -		goto err_clk_tin; -	} - -	clk_enable(pwm->clk); -	clk_enable(pwm->clk_div); - -	local_irq_save(flags); - -	tcon = __raw_readl(S3C2410_TCON); -	tcon |= pwm_tcon_invert(pwm); -	__raw_writel(tcon, S3C2410_TCON); - -	local_irq_restore(flags); - - -	ret = pwm_register(pwm); -	if (ret) { -		dev_err(dev, "failed to register pwm\n"); -		goto err_clk_tdiv; -	} - -	pwm_dbg(pwm, "config bits %02x\n", -		(__raw_readl(S3C2410_TCON) >> pwm->tcon_base) & 0x0f); - -	dev_info(dev, "tin at %lu, tdiv at %lu, tin=%sclk, base %d\n", -		 clk_get_rate(pwm->clk), -		 clk_get_rate(pwm->clk_div), -		 pwm_is_tdiv(pwm) ? "div" : "ext", pwm->tcon_base); - -	platform_set_drvdata(pdev, pwm); -	return 0; - - err_clk_tdiv: -	clk_disable(pwm->clk_div); -	clk_disable(pwm->clk); -	clk_put(pwm->clk_div); - - err_clk_tin: -	clk_put(pwm->clk); - - err_alloc: -	kfree(pwm); -	return ret; -} - -static int __devexit s3c_pwm_remove(struct platform_device *pdev) -{ -	struct pwm_device *pwm = platform_get_drvdata(pdev); - -	clk_disable(pwm->clk_div); -	clk_disable(pwm->clk); -	clk_put(pwm->clk_div); -	clk_put(pwm->clk); -	kfree(pwm); - -	return 0; -} - -#ifdef CONFIG_PM -static int s3c_pwm_suspend(struct platform_device *pdev, pm_message_t state) -{ -	struct pwm_device *pwm = platform_get_drvdata(pdev); - -	/* No one preserve these values during suspend so reset them -	 * Otherwise driver leaves PWM unconfigured if same values -	 * passed to pwm_config -	 */ -	pwm->period_ns = 0; -	pwm->duty_ns = 0; - -	return 0; -} - -static int s3c_pwm_resume(struct platform_device *pdev) -{ -	struct pwm_device *pwm = platform_get_drvdata(pdev); -	unsigned long tcon; - -	/* Restore invertion */ -	tcon = __raw_readl(S3C2410_TCON); -	tcon |= pwm_tcon_invert(pwm); -	__raw_writel(tcon, S3C2410_TCON); - -	return 0; -} - -#else -#define s3c_pwm_suspend NULL -#define s3c_pwm_resume NULL -#endif - -static struct platform_driver s3c_pwm_driver = { -	.driver		= { -		.name	= "s3c24xx-pwm", -		.owner	= THIS_MODULE, -	}, -	.probe		= s3c_pwm_probe, -	.remove		= __devexit_p(s3c_pwm_remove), -	.suspend	= s3c_pwm_suspend, -	.resume		= s3c_pwm_resume, -}; - -static int __init pwm_init(void) -{ -	int ret; - -	clk_scaler[0] = clk_get(NULL, "pwm-scaler0"); -	clk_scaler[1] = clk_get(NULL, "pwm-scaler1"); - -	if (IS_ERR(clk_scaler[0]) || IS_ERR(clk_scaler[1])) { -		printk(KERN_ERR "%s: failed to get scaler clocks\n", __func__); -		return -EINVAL; -	} - -	ret = platform_driver_register(&s3c_pwm_driver); -	if (ret) -		printk(KERN_ERR "%s: failed to add pwm driver\n", __func__); - -	return ret; -} - -arch_initcall(pwm_init); diff --git a/arch/arm/plat-samsung/s3c-dma-ops.c b/arch/arm/plat-samsung/s3c-dma-ops.c index 78149491282..f99448c48d3 100644 --- a/arch/arm/plat-samsung/s3c-dma-ops.c +++ b/arch/arm/plat-samsung/s3c-dma-ops.c @@ -36,30 +36,26 @@ static void s3c_dma_cb(struct s3c2410_dma_chan *channel, void *param,  }  static unsigned s3c_dma_request(enum dma_ch dma_ch, -				 struct samsung_dma_info *info) +					struct samsung_dma_req *param)  {  	struct cb_data *data; -	if (s3c2410_dma_request(dma_ch, info->client, NULL) < 0) { -		s3c2410_dma_free(dma_ch, info->client); +	if (s3c2410_dma_request(dma_ch, param->client, NULL) < 0) { +		s3c2410_dma_free(dma_ch, param->client);  		return 0;  	} +	if (param->cap == DMA_CYCLIC) +		s3c2410_dma_setflags(dma_ch, S3C2410_DMAF_CIRCULAR); +  	data = kzalloc(sizeof(struct cb_data), GFP_KERNEL);  	data->ch = dma_ch;  	list_add_tail(&data->node, &dma_list); -	s3c2410_dma_devconfig(dma_ch, info->direction, info->fifo); - -	if (info->cap == DMA_CYCLIC) -		s3c2410_dma_setflags(dma_ch, S3C2410_DMAF_CIRCULAR); - -	s3c2410_dma_config(dma_ch, info->width); -  	return (unsigned)dma_ch;  } -static int s3c_dma_release(unsigned ch, struct s3c2410_dma_client *client) +static int s3c_dma_release(unsigned ch, void *param)  {  	struct cb_data *data; @@ -68,16 +64,24 @@ static int s3c_dma_release(unsigned ch, struct s3c2410_dma_client *client)  			break;  	list_del(&data->node); -	s3c2410_dma_free(ch, client); +	s3c2410_dma_free(ch, param);  	kfree(data);  	return 0;  } -static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep_info *info) +static int s3c_dma_config(unsigned ch, struct samsung_dma_config *param) +{ +	s3c2410_dma_devconfig(ch, param->direction, param->fifo); +	s3c2410_dma_config(ch, param->width); + +	return 0; +} + +static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep *param)  {  	struct cb_data *data; -	int len = (info->cap == DMA_CYCLIC) ? info->period : info->len; +	int len = (param->cap == DMA_CYCLIC) ? param->period : param->len;  	list_for_each_entry(data, &dma_list, node)  		if (data->ch == ch) @@ -85,11 +89,11 @@ static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep_info *info)  	if (!data->fp) {  		s3c2410_dma_set_buffdone_fn(ch, s3c_dma_cb); -		data->fp = info->fp; -		data->fp_param = info->fp_param; +		data->fp = param->fp; +		data->fp_param = param->fp_param;  	} -	s3c2410_dma_enqueue(ch, (void *)data, info->buf, len); +	s3c2410_dma_enqueue(ch, (void *)data, param->buf, len);  	return 0;  } @@ -117,6 +121,7 @@ static inline int s3c_dma_stop(unsigned ch)  static struct samsung_dma_ops s3c_dma_ops = {  	.request	= s3c_dma_request,  	.release	= s3c_dma_release, +	.config		= s3c_dma_config,  	.prepare	= s3c_dma_prepare,  	.trigger	= s3c_dma_trigger,  	.started	= s3c_dma_started, diff --git a/arch/arm/plat-spear/include/plat/keyboard.h b/arch/arm/plat-spear/include/plat/keyboard.h index 0562f134621..9248e3a7e33 100644 --- a/arch/arm/plat-spear/include/plat/keyboard.h +++ b/arch/arm/plat-spear/include/plat/keyboard.h @@ -149,6 +149,7 @@ int _name[] = { \   * keymap: pointer to keymap data (table and size)   * rep: enables key autorepeat   * mode: choose keyboard support(9x9, 6x6, 2x2) + * suspended_rate: rate at which keyboard would operate in suspended mode   *   * This structure is supposed to be used by platform code to supply   * keymaps to drivers that implement keyboards. @@ -157,6 +158,7 @@ struct kbd_platform_data {  	const struct matrix_keymap_data *keymap;  	bool rep;  	unsigned int mode; +	unsigned int suspended_rate;  };  #endif /* __PLAT_KEYBOARD_H */ diff --git a/arch/arm/plat-spear/include/plat/pl080.h b/arch/arm/plat-spear/include/plat/pl080.h index 2bc6b54460a..eb6590ded40 100644 --- a/arch/arm/plat-spear/include/plat/pl080.h +++ b/arch/arm/plat-spear/include/plat/pl080.h @@ -14,8 +14,8 @@  #ifndef __PLAT_PL080_H  #define __PLAT_PL080_H -struct pl08x_dma_chan; -int pl080_get_signal(struct pl08x_dma_chan *ch); -void pl080_put_signal(struct pl08x_dma_chan *ch); +struct pl08x_channel_data; +int pl080_get_signal(const struct pl08x_channel_data *cd); +void pl080_put_signal(const struct pl08x_channel_data *cd, int signal);  #endif /* __PLAT_PL080_H */ diff --git a/arch/arm/plat-spear/pl080.c b/arch/arm/plat-spear/pl080.c index 12cf27f935f..cfa1199d0f4 100644 --- a/arch/arm/plat-spear/pl080.c +++ b/arch/arm/plat-spear/pl080.c @@ -27,9 +27,8 @@ struct {  	unsigned char val;  } signals[16] = {{0, 0}, }; -int pl080_get_signal(struct pl08x_dma_chan *ch) +int pl080_get_signal(const struct pl08x_channel_data *cd)  { -	const struct pl08x_channel_data *cd = ch->cd;  	unsigned int signal = cd->min_signal, val;  	unsigned long flags; @@ -63,18 +62,17 @@ int pl080_get_signal(struct pl08x_dma_chan *ch)  	return signal;  } -void pl080_put_signal(struct pl08x_dma_chan *ch) +void pl080_put_signal(const struct pl08x_channel_data *cd, int signal)  { -	const struct pl08x_channel_data *cd = ch->cd;  	unsigned long flags;  	spin_lock_irqsave(&lock, flags);  	/* if signal is not used */ -	if (!signals[cd->min_signal].busy) +	if (!signals[signal].busy)  		BUG(); -	signals[cd->min_signal].busy--; +	signals[signal].busy--;  	spin_unlock_irqrestore(&lock, flags);  } diff --git a/arch/arm/plat-versatile/Kconfig b/arch/arm/plat-versatile/Kconfig index 81ee7cc3445..8d5c10a5084 100644 --- a/arch/arm/plat-versatile/Kconfig +++ b/arch/arm/plat-versatile/Kconfig @@ -1,5 +1,8 @@  if PLAT_VERSATILE +config PLAT_VERSATILE_CLOCK +	bool +  config PLAT_VERSATILE_CLCD  	bool diff --git a/arch/arm/plat-versatile/Makefile b/arch/arm/plat-versatile/Makefile index a5cb1945bdc..272769a8a7d 100644 --- a/arch/arm/plat-versatile/Makefile +++ b/arch/arm/plat-versatile/Makefile @@ -1,4 +1,4 @@ -obj-y	:= clock.o +obj-$(CONFIG_PLAT_VERSATILE_CLOCK) += clock.o  obj-$(CONFIG_PLAT_VERSATILE_CLCD) += clcd.o  obj-$(CONFIG_PLAT_VERSATILE_FPGA_IRQ) += fpga-irq.o  obj-$(CONFIG_PLAT_VERSATILE_LEDS) += leds.o diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c index 49c7db48c7f..d7c5c171f5a 100644 --- a/arch/arm/plat-versatile/platsmp.c +++ b/arch/arm/plat-versatile/platsmp.c @@ -85,7 +85,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)  	 * the boot monitor to read the system wide flags register,  	 * and branch to the address found there.  	 */ -	gic_raise_softirq(cpumask_of(cpu), 1); +	gic_raise_softirq(cpumask_of(cpu), 0);  	timeout = jiffies + (1 * HZ);  	while (time_before(jiffies, timeout)) { diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S index 4fa9903b83c..cc926c98598 100644 --- a/arch/arm/vfp/entry.S +++ b/arch/arm/vfp/entry.S @@ -7,18 +7,20 @@   * 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. - * - * Basic entry code, called from the kernel's undefined instruction trap. - *  r0  = faulted instruction - *  r5  = faulted PC+4 - *  r9  = successful return - *  r10 = thread_info structure - *  lr  = failure return   */  #include <asm/thread_info.h>  #include <asm/vfpmacros.h>  #include "../kernel/entry-header.S" +@ VFP entry point. +@ +@  r0  = instruction opcode (32-bit ARM or two 16-bit Thumb) +@  r2  = PC value to resume execution after successful emulation +@  r9  = normal "successful" return address +@  r10 = this threads thread_info structure +@  lr  = unrecognised instruction return address +@  IRQs disabled. +@  ENTRY(do_vfp)  #ifdef CONFIG_PREEMPT  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index 2d30c7f6edd..ea0349f6358 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S @@ -16,6 +16,7 @@   */  #include <asm/thread_info.h>  #include <asm/vfpmacros.h> +#include <linux/kern_levels.h>  #include "../kernel/entry-header.S"  	.macro	DBGSTR, str @@ -24,7 +25,7 @@  	add	r0, pc, #4  	bl	printk  	b	1f -	.asciz  "<7>VFP: \str\n" +	.asciz  KERN_DEBUG "VFP: \str\n"  	.balign 4  1:	ldmfd	sp!, {r0-r3, ip, lr}  #endif @@ -37,7 +38,7 @@  	add	r0, pc, #4  	bl	printk  	b	1f -	.asciz  "<7>VFP: \str\n" +	.asciz  KERN_DEBUG "VFP: \str\n"  	.balign 4  1:	ldmfd	sp!, {r0-r3, ip, lr}  #endif @@ -52,7 +53,7 @@  	add	r0, pc, #4  	bl	printk  	b	1f -	.asciz  "<7>VFP: \str\n" +	.asciz  KERN_DEBUG "VFP: \str\n"  	.balign 4  1:	ldmfd	sp!, {r0-r3, ip, lr}  #endif @@ -61,13 +62,13 @@  @ VFP hardware support entry point.  @ -@  r0  = faulted instruction -@  r2  = faulted PC+4 -@  r9  = successful return +@  r0  = instruction opcode (32-bit ARM or two 16-bit Thumb) +@  r2  = PC value to resume execution after successful emulation +@  r9  = normal "successful" return address  @  r10 = vfp_state union  @  r11 = CPU number -@  lr  = failure return - +@  lr  = unrecognised instruction return address +@  IRQs enabled.  ENTRY(vfp_support_entry)  	DBGSTR3	"instr %08x pc %08x state %p", r0, r2, r10 @@ -161,9 +162,12 @@ vfp_hw_state_valid:  					@ exception before retrying branch  					@ out before setting an FPEXC that  					@ stops us reading stuff -	VFPFMXR	FPEXC, r1		@ restore FPEXC last -	sub	r2, r2, #4 -	str	r2, [sp, #S_PC]		@ retry the instruction +	VFPFMXR	FPEXC, r1		@ Restore FPEXC last +	sub	r2, r2, #4		@ Retry current instruction - if Thumb +	str	r2, [sp, #S_PC]		@ mode it's two 16-bit instructions, +					@ else it's one 32-bit instruction, so +					@ always subtract 4 from the following +					@ instruction address.  #ifdef CONFIG_PREEMPT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 586961929e9..fb849d044bd 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c @@ -457,10 +457,16 @@ static int vfp_pm_suspend(void)  		/* disable, just in case */  		fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN); +	} else if (vfp_current_hw_state[ti->cpu]) { +#ifndef CONFIG_SMP +		fmxr(FPEXC, fpexc | FPEXC_EN); +		vfp_save_state(vfp_current_hw_state[ti->cpu], fpexc); +		fmxr(FPEXC, fpexc); +#endif  	}  	/* clear any information we had about last context state */ -	memset(vfp_current_hw_state, 0, sizeof(vfp_current_hw_state)); +	vfp_current_hw_state[ti->cpu] = NULL;  	return 0;  }  |