diff options
Diffstat (limited to 'arch')
38 files changed, 1874 insertions, 321 deletions
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index f37cf9fa5fa..2458b69e2be 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -63,15 +63,17 @@ dtb-$(CONFIG_ARCH_MXS) += imx23-evk.dtb \  	imx28-m28evk.dtb \  	imx28-tx28.dtb  dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \ +	omap3-beagle.dtb \  	omap3-beagle-xm.dtb \  	omap3-evm.dtb \  	omap3-tobi.dtb \  	omap4-panda.dtb \ -	omap4-pandaES.dtb \ -	omap4-var_som.dtb \ +	omap4-panda-es.dtb \ +	omap4-var-som.dtb \  	omap4-sdp.dtb \  	omap5-evm.dtb \  	am335x-evm.dtb \ +	am335x-evmsk.dtb \  	am335x-bone.dtb  dtb-$(CONFIG_ARCH_PRIMA2) += prima2-evb.dtb  dtb-$(CONFIG_ARCH_U8500) += snowball.dtb diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts index c634f87e230..2c338889df1 100644 --- a/arch/arm/boot/dts/am335x-bone.dts +++ b/arch/arm/boot/dts/am335x-bone.dts @@ -13,11 +13,31 @@  	model = "TI AM335x BeagleBone";  	compatible = "ti,am335x-bone", "ti,am33xx"; +	cpus { +		cpu@0 { +			cpu0-supply = <&dcdc2_reg>; +		}; +	}; +  	memory {  		device_type = "memory";  		reg = <0x80000000 0x10000000>; /* 256 MB */  	}; +	am33xx_pinmux: pinmux@44e10800 { +		pinctrl-names = "default"; +		pinctrl-0 = <&user_leds_s0>; + +		user_leds_s0: user_leds_s0 { +			pinctrl-single,pins = < +				0x54 0x7	/* gpmc_a5.gpio1_21, OUTPUT | MODE7 */ +				0x58 0x17	/* gpmc_a6.gpio1_22, OUTPUT_PULLUP | MODE7 */ +				0x5c 0x7	/* gpmc_a7.gpio1_23, OUTPUT | MODE7 */ +				0x60 0x17	/* gpmc_a8.gpio1_24, OUTPUT_PULLUP | MODE7 */ +			>; +		}; +	}; +  	ocp {  		uart1: serial@44e09000 {  			status = "okay"; @@ -33,6 +53,36 @@  		};  	}; + +	leds { +		compatible = "gpio-leds"; + +		led@2 { +			label = "beaglebone:green:heartbeat"; +			gpios = <&gpio2 21 0>; +			linux,default-trigger = "heartbeat"; +			default-state = "off"; +		}; + +		led@3 { +			label = "beaglebone:green:mmc0"; +			gpios = <&gpio2 22 0>; +			linux,default-trigger = "mmc0"; +			default-state = "off"; +		}; + +		led@4 { +			label = "beaglebone:green:usr2"; +			gpios = <&gpio2 23 0>; +			default-state = "off"; +		}; + +		led@5 { +			label = "beaglebone:green:usr3"; +			gpios = <&gpio2 24 0>; +			default-state = "off"; +		}; +	};  };  /include/ "tps65217.dtsi" diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts index 185d6325a45..9f65f17ebdf 100644 --- a/arch/arm/boot/dts/am335x-evm.dts +++ b/arch/arm/boot/dts/am335x-evm.dts @@ -13,11 +13,39 @@  	model = "TI AM335x EVM";  	compatible = "ti,am335x-evm", "ti,am33xx"; +	cpus { +		cpu@0 { +			cpu0-supply = <&vdd1_reg>; +		}; +	}; +  	memory {  		device_type = "memory";  		reg = <0x80000000 0x10000000>; /* 256 MB */  	}; +	am33xx_pinmux: pinmux@44e10800 { +		pinctrl-names = "default"; +		pinctrl-0 = <&matrix_keypad_s0 &volume_keys_s0>; + +		matrix_keypad_s0: matrix_keypad_s0 { +			pinctrl-single,pins = < +				0x54 0x7	/* gpmc_a5.gpio1_21, OUTPUT | MODE7 */ +				0x58 0x7	/* gpmc_a6.gpio1_22, OUTPUT | MODE7 */ +				0x64 0x27	/* gpmc_a9.gpio1_25, INPUT | MODE7 */ +				0x68 0x27	/* gpmc_a10.gpio1_26, INPUT | MODE7 */ +				0x6c 0x27	/* gpmc_a11.gpio1_27, INPUT | MODE7 */ +			>; +		}; + +		volume_keys_s0: volume_keys_s0 { +			pinctrl-single,pins = < +				0x150 0x27	/* spi0_sclk.gpio0_2, INPUT | MODE7 */ +				0x154 0x27	/* spi0_d0.gpio0_3, INPUT | MODE7 */ +			>; +		}; +	}; +  	ocp {  		uart1: serial@44e09000 {  			status = "okay"; @@ -31,6 +59,49 @@  				reg = <0x2d>;  			};  		}; + +		i2c2: i2c@4802a000 { +			status = "okay"; +			clock-frequency = <100000>; + +			lis331dlh: lis331dlh@18 { +				compatible = "st,lis331dlh", "st,lis3lv02d"; +				reg = <0x18>; +				Vdd-supply = <&lis3_reg>; +				Vdd_IO-supply = <&lis3_reg>; + +				st,click-single-x; +				st,click-single-y; +				st,click-single-z; +				st,click-thresh-x = <10>; +				st,click-thresh-y = <10>; +				st,click-thresh-z = <10>; +				st,irq1-click; +				st,irq2-click; +				st,wakeup-x-lo; +				st,wakeup-x-hi; +				st,wakeup-y-lo; +				st,wakeup-y-hi; +				st,wakeup-z-lo; +				st,wakeup-z-hi; +				st,min-limit-x = <120>; +				st,min-limit-y = <120>; +				st,min-limit-z = <140>; +				st,max-limit-x = <550>; +				st,max-limit-y = <550>; +				st,max-limit-z = <750>; +			}; + +			tsl2550: tsl2550@39 { +				compatible = "taos,tsl2550"; +				reg = <0x39>; +			}; + +			tmp275: tmp275@48 { +				compatible = "ti,tmp275"; +				reg = <0x48>; +			}; +		};  	};  	vbat: fixedregulator@0 { @@ -40,6 +111,53 @@  		regulator-max-microvolt = <5000000>;  		regulator-boot-on;  	}; + +	lis3_reg: fixedregulator@1 { +		compatible = "regulator-fixed"; +		regulator-name = "lis3_reg"; +		regulator-boot-on; +	}; + +	matrix_keypad: matrix_keypad@0 { +		compatible = "gpio-matrix-keypad"; +		debounce-delay-ms = <5>; +		col-scan-delay-us = <2>; + +		row-gpios = <&gpio2 25 0	/* Bank1, pin25 */ +			     &gpio2 26 0	/* Bank1, pin26 */ +			     &gpio2 27 0>;	/* Bank1, pin27 */ + +		col-gpios = <&gpio2 21 0	/* Bank1, pin21 */ +			     &gpio2 22 0>;	/* Bank1, pin22 */ + +		linux,keymap = <0x0000008b	/* MENU */ +				0x0100009e	/* BACK */ +				0x02000069	/* LEFT */ +				0x0001006a	/* RIGHT */ +				0x0101001c	/* ENTER */ +				0x0201006c>;	/* DOWN */ +	}; + +	gpio_keys: volume_keys@0 { +		compatible = "gpio-keys"; +		#address-cells = <1>; +		#size-cells = <0>; +		autorepeat; + +		switch@9 { +			label = "volume-up"; +			linux,code = <115>; +			gpios = <&gpio1 2 1>; +			gpio-key,wakeup; +		}; + +		switch@10 { +			label = "volume-down"; +			linux,code = <114>; +			gpios = <&gpio1 3 1>; +			gpio-key,wakeup; +		}; +	};  };  /include/ "tps65910.dtsi" diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts new file mode 100644 index 00000000000..f5a6162a4ff --- /dev/null +++ b/arch/arm/boot/dts/am335x-evmsk.dts @@ -0,0 +1,250 @@ +/* + * 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. + */ + +/* + * AM335x Starter Kit + * http://www.ti.com/tool/tmdssk3358 + */ + +/dts-v1/; + +/include/ "am33xx.dtsi" + +/ { +	model = "TI AM335x EVM-SK"; +	compatible = "ti,am335x-evmsk", "ti,am33xx"; + +	cpus { +		cpu@0 { +			cpu0-supply = <&vdd1_reg>; +		}; +	}; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; + +	am33xx_pinmux: pinmux@44e10800 { +		pinctrl-names = "default"; +		pinctrl-0 = <&user_leds_s0 &gpio_keys_s0>; + +		user_leds_s0: user_leds_s0 { +			pinctrl-single,pins = < +				0x10 0x7	/* gpmc_ad4.gpio1_4, OUTPUT | MODE7 */ +				0x14 0x7	/* gpmc_ad5.gpio1_5, OUTPUT | MODE7 */ +				0x18 0x7	/* gpmc_ad6.gpio1_6, OUTPUT | MODE7 */ +				0x1c 0x7	/* gpmc_ad7.gpio1_7, OUTPUT | MODE7 */ +			>; +		}; + +		gpio_keys_s0: gpio_keys_s0 { +			pinctrl-single,pins = < +				0x94 0x27	/* gpmc_oen_ren.gpio2_3, INPUT | MODE7 */ +				0x90 0x27	/* gpmc_advn_ale.gpio2_2, INPUT | MODE7 */ +				0x70 0x27	/* gpmc_wait0.gpio0_30, INPUT | MODE7 */ +				0x9c 0x27	/* gpmc_ben0_cle.gpio2_5, INPUT | MODE7 */ +			>; +		}; +	}; + +	ocp { +		uart1: serial@44e09000 { +			status = "okay"; +		}; + +		i2c1: i2c@44e0b000 { +			status = "okay"; +			clock-frequency = <400000>; + +			tps: tps@2d { +				reg = <0x2d>; +			}; + +			lis331dlh: lis331dlh@18 { +				compatible = "st,lis331dlh", "st,lis3lv02d"; +				reg = <0x18>; +				Vdd-supply = <&lis3_reg>; +				Vdd_IO-supply = <&lis3_reg>; + +				st,click-single-x; +				st,click-single-y; +				st,click-single-z; +				st,click-thresh-x = <10>; +				st,click-thresh-y = <10>; +				st,click-thresh-z = <10>; +				st,irq1-click; +				st,irq2-click; +				st,wakeup-x-lo; +				st,wakeup-x-hi; +				st,wakeup-y-lo; +				st,wakeup-y-hi; +				st,wakeup-z-lo; +				st,wakeup-z-hi; +				st,min-limit-x = <120>; +				st,min-limit-y = <120>; +				st,min-limit-z = <140>; +				st,max-limit-x = <550>; +				st,max-limit-y = <550>; +				st,max-limit-z = <750>; +			}; +		}; +	}; + +	vbat: fixedregulator@0 { +		compatible = "regulator-fixed"; +		regulator-name = "vbat"; +		regulator-min-microvolt = <5000000>; +		regulator-max-microvolt = <5000000>; +		regulator-boot-on; +	}; + +	lis3_reg: fixedregulator@1 { +		compatible = "regulator-fixed"; +		regulator-name = "lis3_reg"; +		regulator-boot-on; +	}; + +	leds { +		compatible = "gpio-leds"; + +		led@1 { +			label = "evmsk:green:usr0"; +			gpios = <&gpio2 4 0>; +			default-state = "off"; +		}; + +		led@2 { +			label = "evmsk:green:usr1"; +			gpios = <&gpio2 5 0>; +			default-state = "off"; +		}; + +		led@3 { +			label = "evmsk:green:mmc0"; +			gpios = <&gpio2 6 0>; +			linux,default-trigger = "mmc0"; +			default-state = "off"; +		}; + +		led@4 { +			label = "evmsk:green:heartbeat"; +			gpios = <&gpio2 7 0>; +			linux,default-trigger = "heartbeat"; +			default-state = "off"; +		}; +	}; + +	gpio_buttons: gpio_buttons@0 { +		compatible = "gpio-keys"; +		#address-cells = <1>; +		#size-cells = <0>; + +		switch@1 { +			label = "button0"; +			linux,code = <0x100>; +			gpios = <&gpio3 3 0>; +		}; + +		switch@2 { +			label = "button1"; +			linux,code = <0x101>; +			gpios = <&gpio3 2 0>; +		}; + +		switch@3 { +			label = "button2"; +			linux,code = <0x102>; +			gpios = <&gpio1 30 0>; +			gpio-key,wakeup; +		}; + +		switch@4 { +			label = "button3"; +			linux,code = <0x103>; +			gpios = <&gpio3 5 0>; +		}; +	}; +}; + +/include/ "tps65910.dtsi" + +&tps { +	vcc1-supply = <&vbat>; +	vcc2-supply = <&vbat>; +	vcc3-supply = <&vbat>; +	vcc4-supply = <&vbat>; +	vcc5-supply = <&vbat>; +	vcc6-supply = <&vbat>; +	vcc7-supply = <&vbat>; +	vccio-supply = <&vbat>; + +	regulators { +		vrtc_reg: regulator@0 { +			regulator-always-on; +		}; + +		vio_reg: regulator@1 { +			regulator-always-on; +		}; + +		vdd1_reg: regulator@2 { +			/* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */ +			regulator-name = "vdd_mpu"; +			regulator-min-microvolt = <912500>; +			regulator-max-microvolt = <1312500>; +			regulator-boot-on; +			regulator-always-on; +		}; + +		vdd2_reg: regulator@3 { +			/* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */ +			regulator-name = "vdd_core"; +			regulator-min-microvolt = <912500>; +			regulator-max-microvolt = <1150000>; +			regulator-boot-on; +			regulator-always-on; +		}; + +		vdd3_reg: regulator@4 { +			regulator-always-on; +		}; + +		vdig1_reg: regulator@5 { +			regulator-always-on; +		}; + +		vdig2_reg: regulator@6 { +			regulator-always-on; +		}; + +		vpll_reg: regulator@7 { +			regulator-always-on; +		}; + +		vdac_reg: regulator@8 { +			regulator-always-on; +		}; + +		vaux1_reg: regulator@9 { +			regulator-always-on; +		}; + +		vaux2_reg: regulator@10 { +			regulator-always-on; +		}; + +		vaux33_reg: regulator@11 { +			regulator-always-on; +		}; + +		vmmc_reg: regulator@12 { +			regulator-always-on; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index bb31bff0199..20a3f29a6bf 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi @@ -12,6 +12,7 @@  / {  	compatible = "ti,am33xx"; +	interrupt-parent = <&intc>;  	aliases {  		serial0 = &uart1; @@ -25,6 +26,21 @@  	cpus {  		cpu@0 {  			compatible = "arm,cortex-a8"; + +			/* +			 * To consider voltage drop between PMIC and SoC, +			 * tolerance value is reduced to 2% from 4% and +			 * voltage value is increased as a precaution. +			 */ +			operating-points = < +				/* kHz    uV */ +				720000  1285000 +				600000  1225000 +				500000  1125000 +				275000  1125000 +			>; +			voltage-tolerance = <2>; /* 2 percentage */ +			clock-latency = <300000>; /* From omap-cpufreq driver */  		};  	}; @@ -40,6 +56,15 @@  		};  	}; +	am33xx_pinmux: pinmux@44e10800 { +		compatible = "pinctrl-single"; +		reg = <0x44e10800 0x0238>; +		#address-cells = <1>; +		#size-cells = <0>; +		pinctrl-single,register-width = <32>; +		pinctrl-single,function-mask = <0x7f>; +	}; +  	/*  	 * XXX: Use a flat representation of the AM33XX interconnect.  	 * The real AM33XX interconnect network is quite complex.Since @@ -70,7 +95,6 @@  			interrupt-controller;  			#interrupt-cells = <1>;  			reg = <0x44e07000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <96>;  		}; @@ -82,7 +106,6 @@  			interrupt-controller;  			#interrupt-cells = <1>;  			reg = <0x4804c000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <98>;  		}; @@ -94,7 +117,6 @@  			interrupt-controller;  			#interrupt-cells = <1>;  			reg = <0x481ac000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <32>;  		}; @@ -106,7 +128,6 @@  			interrupt-controller;  			#interrupt-cells = <1>;  			reg = <0x481ae000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <62>;  		}; @@ -115,7 +136,6 @@  			ti,hwmods = "uart1";  			clock-frequency = <48000000>;  			reg = <0x44e09000 0x2000>; -			interrupt-parent = <&intc>;  			interrupts = <72>;  			status = "disabled";  		}; @@ -125,7 +145,6 @@  			ti,hwmods = "uart2";  			clock-frequency = <48000000>;  			reg = <0x48022000 0x2000>; -			interrupt-parent = <&intc>;  			interrupts = <73>;  			status = "disabled";  		}; @@ -135,7 +154,6 @@  			ti,hwmods = "uart3";  			clock-frequency = <48000000>;  			reg = <0x48024000 0x2000>; -			interrupt-parent = <&intc>;  			interrupts = <74>;  			status = "disabled";  		}; @@ -145,7 +163,6 @@  			ti,hwmods = "uart4";  			clock-frequency = <48000000>;  			reg = <0x481a6000 0x2000>; -			interrupt-parent = <&intc>;  			interrupts = <44>;  			status = "disabled";  		}; @@ -155,7 +172,6 @@  			ti,hwmods = "uart5";  			clock-frequency = <48000000>;  			reg = <0x481a8000 0x2000>; -			interrupt-parent = <&intc>;  			interrupts = <45>;  			status = "disabled";  		}; @@ -165,7 +181,6 @@  			ti,hwmods = "uart6";  			clock-frequency = <48000000>;  			reg = <0x481aa000 0x2000>; -			interrupt-parent = <&intc>;  			interrupts = <46>;  			status = "disabled";  		}; @@ -176,7 +191,6 @@  			#size-cells = <0>;  			ti,hwmods = "i2c1";  			reg = <0x44e0b000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <70>;  			status = "disabled";  		}; @@ -187,7 +201,6 @@  			#size-cells = <0>;  			ti,hwmods = "i2c2";  			reg = <0x4802a000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <71>;  			status = "disabled";  		}; @@ -198,7 +211,6 @@  			#size-cells = <0>;  			ti,hwmods = "i2c3";  			reg = <0x4819c000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <30>;  			status = "disabled";  		}; @@ -207,8 +219,124 @@  			compatible = "ti,omap3-wdt";  			ti,hwmods = "wd_timer2";  			reg = <0x44e35000 0x1000>; -			interrupt-parent = <&intc>;  			interrupts = <91>;  		}; + +		dcan0: d_can@481cc000 { +			compatible = "bosch,d_can"; +			ti,hwmods = "d_can0"; +			reg = <0x481cc000 0x2000>; +			interrupts = <52>; +			status = "disabled"; +		}; + +		dcan1: d_can@481d0000 { +			compatible = "bosch,d_can"; +			ti,hwmods = "d_can1"; +			reg = <0x481d0000 0x2000>; +			interrupts = <55>; +			status = "disabled"; +		}; + +		timer1: timer@44e31000 { +			compatible = "ti,omap2-timer"; +			reg = <0x44e31000 0x400>; +			interrupts = <67>; +			ti,hwmods = "timer1"; +			ti,timer-alwon; +		}; + +		timer2: timer@48040000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48040000 0x400>; +			interrupts = <68>; +			ti,hwmods = "timer2"; +		}; + +		timer3: timer@48042000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48042000 0x400>; +			interrupts = <69>; +			ti,hwmods = "timer3"; +		}; + +		timer4: timer@48044000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48044000 0x400>; +			interrupts = <92>; +			ti,hwmods = "timer4"; +			ti,timer-pwm; +		}; + +		timer5: timer@48046000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48046000 0x400>; +			interrupts = <93>; +			ti,hwmods = "timer5"; +			ti,timer-pwm; +		}; + +		timer6: timer@48048000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48048000 0x400>; +			interrupts = <94>; +			ti,hwmods = "timer6"; +			ti,timer-pwm; +		}; + +		timer7: timer@4804a000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4804a000 0x400>; +			interrupts = <95>; +			ti,hwmods = "timer7"; +			ti,timer-pwm; +		}; + +		rtc@44e3e000 { +			compatible = "ti,da830-rtc"; +			reg = <0x44e3e000 0x1000>; +			interrupts = <75 +				      76>; +			ti,hwmods = "rtc"; +		}; + +		spi0: spi@48030000 { +			compatible = "ti,omap4-mcspi"; +			#address-cells = <1>; +			#size-cells = <0>; +			reg = <0x48030000 0x400>; +			interrupt = <65>; +			ti,spi-num-cs = <2>; +			ti,hwmods = "spi0"; +			status = "disabled"; +		}; + +		spi1: spi@481a0000 { +			compatible = "ti,omap4-mcspi"; +			#address-cells = <1>; +			#size-cells = <0>; +			reg = <0x481a0000 0x400>; +			interrupt = <125>; +			ti,spi-num-cs = <2>; +			ti,hwmods = "spi1"; +			status = "disabled"; +		}; + +		usb@47400000 { +			compatible = "ti,musb-am33xx"; +			reg = <0x47400000 0x1000	/* usbss */ +			       0x47401000 0x800		/* musb instance 0 */ +			       0x47401800 0x800>;	/* musb instance 1 */ +			interrupts = <17		/* usbss */ +				      18		/* musb instance 0 */ +				      19>;		/* musb instance 1 */ +			multipoint = <1>; +			num-eps = <16>; +			ram-bits = <12>; +			port0-mode = <3>; +			port1-mode = <3>; +			power = <250>; +			ti,hwmods = "usb_otg_hs"; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap2.dtsi b/arch/arm/boot/dts/omap2.dtsi index 581cb081cb0..761c4b69b25 100644 --- a/arch/arm/boot/dts/omap2.dtsi +++ b/arch/arm/boot/dts/omap2.dtsi @@ -12,6 +12,7 @@  / {  	compatible = "ti,omap2430", "ti,omap2420", "ti,omap2"; +	interrupt-parent = <&intc>;  	aliases {  		serial0 = &uart1; @@ -65,5 +66,90 @@  			ti,hwmods = "uart3";  			clock-frequency = <48000000>;  		}; + +		timer2: timer@4802a000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4802a000 0x400>; +			interrupts = <38>; +			ti,hwmods = "timer2"; +		}; + +		timer3: timer@48078000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48078000 0x400>; +			interrupts = <39>; +			ti,hwmods = "timer3"; +		}; + +		timer4: timer@4807a000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4807a000 0x400>; +			interrupts = <40>; +			ti,hwmods = "timer4"; +		}; + +		timer5: timer@4807c000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4807c000 0x400>; +			interrupts = <41>; +			ti,hwmods = "timer5"; +			ti,timer-dsp; +		}; + +		timer6: timer@4807e000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4807e000 0x400>; +			interrupts = <42>; +			ti,hwmods = "timer6"; +			ti,timer-dsp; +		}; + +		timer7: timer@48080000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48080000 0x400>; +			interrupts = <43>; +			ti,hwmods = "timer7"; +			ti,timer-dsp; +		}; + +		timer8: timer@48082000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48082000 0x400>; +			interrupts = <44>; +			ti,hwmods = "timer8"; +			ti,timer-dsp; +		}; + +		timer9: timer@48084000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48084000 0x400>; +			interrupts = <45>; +			ti,hwmods = "timer9"; +			ti,timer-pwm; +		}; + +		timer10: timer@48086000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48086000 0x400>; +			interrupts = <46>; +			ti,hwmods = "timer10"; +			ti,timer-pwm; +		}; + +		timer11: timer@48088000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48088000 0x400>; +			interrupts = <47>; +			ti,hwmods = "timer11"; +			ti,timer-pwm; +		}; + +		timer12: timer@4808a000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4808a000 0x400>; +			interrupts = <48>; +			ti,hwmods = "timer12"; +			ti,timer-pwm; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap2420.dtsi b/arch/arm/boot/dts/omap2420.dtsi index bfd76b4a0dd..af656090890 100644 --- a/arch/arm/boot/dts/omap2420.dtsi +++ b/arch/arm/boot/dts/omap2420.dtsi @@ -14,6 +14,12 @@  	compatible = "ti,omap2420", "ti,omap2";  	ocp { +		counter32k: counter@48004000 { +			compatible = "ti,omap-counter32k"; +			reg = <0x48004000 0x20>; +			ti,hwmods = "counter_32k"; +		}; +  		omap2420_pmx: pinmux@48000030 {  			compatible = "ti,omap2420-padconf", "pinctrl-single";  			reg = <0x48000030 0x0113>; @@ -30,7 +36,6 @@  			interrupts = <59>, /* TX interrupt */  				     <60>; /* RX interrupt */  			interrupt-names = "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,hwmods = "mcbsp1";  		}; @@ -41,8 +46,15 @@  			interrupts = <62>, /* TX interrupt */  				     <63>; /* RX interrupt */  			interrupt-names = "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,hwmods = "mcbsp2";  		}; + +		timer1: timer@48028000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48028000 0x400>; +			interrupts = <37>; +			ti,hwmods = "timer1"; +			ti,timer-alwon; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap2430.dtsi b/arch/arm/boot/dts/omap2430.dtsi index 4565d9750f4..c3924457c9b 100644 --- a/arch/arm/boot/dts/omap2430.dtsi +++ b/arch/arm/boot/dts/omap2430.dtsi @@ -14,6 +14,12 @@  	compatible = "ti,omap2430", "ti,omap2";  	ocp { +		counter32k: counter@49020000 { +			compatible = "ti,omap-counter32k"; +			reg = <0x49020000 0x20>; +			ti,hwmods = "counter_32k"; +		}; +  		omap2430_pmx: pinmux@49002030 {  			compatible = "ti,omap2430-padconf", "pinctrl-single";  			reg = <0x49002030 0x0154>; @@ -32,7 +38,6 @@  				     <60>, /* RX interrupt */  				     <61>; /* RX overflow interrupt */  			interrupt-names = "common", "tx", "rx", "rx_overflow"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp1";  		}; @@ -45,7 +50,6 @@  				     <62>, /* TX interrupt */  				     <63>; /* RX interrupt */  			interrupt-names = "common", "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp2";  		}; @@ -58,7 +62,6 @@  				     <89>, /* TX interrupt */  				     <90>; /* RX interrupt */  			interrupt-names = "common", "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp3";  		}; @@ -71,7 +74,6 @@  				     <54>, /* TX interrupt */  				     <55>; /* RX interrupt */  			interrupt-names = "common", "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp4";  		}; @@ -84,9 +86,16 @@  				     <81>, /* TX interrupt */  				     <82>; /* RX interrupt */  			interrupt-names = "common", "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp5";  		}; + +		timer1: timer@49018000 { +			compatible = "ti,omap2-timer"; +			reg = <0x49018000 0x400>; +			interrupts = <37>; +			ti,hwmods = "timer1"; +			ti,timer-alwon; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap3-beagle-xm.dts b/arch/arm/boot/dts/omap3-beagle-xm.dts index c38cf76df81..3705a81c1fc 100644 --- a/arch/arm/boot/dts/omap3-beagle-xm.dts +++ b/arch/arm/boot/dts/omap3-beagle-xm.dts @@ -55,12 +55,6 @@  		interrupts = <7>; /* SYS_NIRQ cascaded to intc */  		interrupt-parent = <&intc>; -		vsim: regulator-vsim { -			compatible = "ti,twl4030-vsim"; -			regulator-min-microvolt = <1800000>; -			regulator-max-microvolt = <3000000>; -		}; -  		twl_audio: audio {  			compatible = "ti,twl4030-audio";  			codec { diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts new file mode 100644 index 00000000000..f624dc85d44 --- /dev/null +++ b/arch/arm/boot/dts/omap3-beagle.dts @@ -0,0 +1,67 @@ +/* + * 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/ "omap3.dtsi" + +/ { +	model = "TI OMAP3 BeagleBoard"; +	compatible = "ti,omap3-beagle", "ti,omap3"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; + +	leds { +		compatible = "gpio-leds"; +		pmu_stat { +			label = "beagleboard::pmu_stat"; +			gpios = <&twl_gpio 19 0>; /* LEDB */ +		}; + +		heartbeat { +			label = "beagleboard::usr0"; +			gpios = <&gpio5 22 0>; /* 150 -> D6 LED */ +			linux,default-trigger = "heartbeat"; +		}; + +		mmc { +			label = "beagleboard::usr1"; +			gpios = <&gpio5 21 0>; /* 149 -> D7 LED */ +			linux,default-trigger = "mmc0"; +		}; +	}; + +}; + +&i2c1 { +	clock-frequency = <2600000>; + +	twl: twl@48 { +		reg = <0x48>; +		interrupts = <7>; /* SYS_NIRQ cascaded to intc */ +		interrupt-parent = <&intc>; +	}; +}; + +/include/ "twl4030.dtsi" + +&mmc1 { +	vmmc-supply = <&vmmc1>; +	vmmc_aux-supply = <&vsim>; +	bus-width = <8>; +}; + +&mmc2 { +	status = "disabled"; +}; + +&mmc3 { +	status = "disabled"; +}; diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 696e929d030..1acc26148ff 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -12,6 +12,7 @@  / {  	compatible = "ti,omap3430", "ti,omap3"; +	interrupt-parent = <&intc>;  	aliases {  		serial0 = &uart1; @@ -60,6 +61,12 @@  		ranges;  		ti,hwmods = "l3_main"; +		counter32k: counter@48320000 { +			compatible = "ti,omap-counter32k"; +			reg = <0x48320000 0x20>; +			ti,hwmods = "counter_32k"; +		}; +  		intc: interrupt-controller@48200000 {  			compatible = "ti,omap2-intc";  			interrupt-controller; @@ -240,7 +247,6 @@  				     <59>, /* TX interrupt */  				     <60>; /* RX interrupt */  			interrupt-names = "common", "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp1";  		}; @@ -255,7 +261,6 @@  				     <63>, /* RX interrupt */  				     <4>;  /* Sidetone */  			interrupt-names = "common", "tx", "rx", "sidetone"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <1280>;  			ti,hwmods = "mcbsp2", "mcbsp2_sidetone";  		}; @@ -270,7 +275,6 @@  				     <90>, /* RX interrupt */  				     <5>;  /* Sidetone */  			interrupt-names = "common", "tx", "rx", "sidetone"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp3", "mcbsp3_sidetone";  		}; @@ -283,7 +287,6 @@  				     <54>, /* TX interrupt */  				     <55>; /* RX interrupt */  			interrupt-names = "common", "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp4";  		}; @@ -296,9 +299,103 @@  				     <81>, /* TX interrupt */  				     <82>; /* RX interrupt */  			interrupt-names = "common", "tx", "rx"; -			interrupt-parent = <&intc>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp5";  		}; + +		timer1: timer@48318000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48318000 0x400>; +			interrupts = <37>; +			ti,hwmods = "timer1"; +			ti,timer-alwon; +		}; + +		timer2: timer@49032000 { +			compatible = "ti,omap2-timer"; +			reg = <0x49032000 0x400>; +			interrupts = <38>; +			ti,hwmods = "timer2"; +		}; + +		timer3: timer@49034000 { +			compatible = "ti,omap2-timer"; +			reg = <0x49034000 0x400>; +			interrupts = <39>; +			ti,hwmods = "timer3"; +		}; + +		timer4: timer@49036000 { +			compatible = "ti,omap2-timer"; +			reg = <0x49036000 0x400>; +			interrupts = <40>; +			ti,hwmods = "timer4"; +		}; + +		timer5: timer@49038000 { +			compatible = "ti,omap2-timer"; +			reg = <0x49038000 0x400>; +			interrupts = <41>; +			ti,hwmods = "timer5"; +			ti,timer-dsp; +		}; + +		timer6: timer@4903a000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4903a000 0x400>; +			interrupts = <42>; +			ti,hwmods = "timer6"; +			ti,timer-dsp; +		}; + +		timer7: timer@4903c000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4903c000 0x400>; +			interrupts = <43>; +			ti,hwmods = "timer7"; +			ti,timer-dsp; +		}; + +		timer8: timer@4903e000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4903e000 0x400>; +			interrupts = <44>; +			ti,hwmods = "timer8"; +			ti,timer-pwm; +			ti,timer-dsp; +		}; + +		timer9: timer@49040000 { +			compatible = "ti,omap2-timer"; +			reg = <0x49040000 0x400>; +			interrupts = <45>; +			ti,hwmods = "timer9"; +			ti,timer-pwm; +		}; + +		timer10: timer@48086000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48086000 0x400>; +			interrupts = <46>; +			ti,hwmods = "timer10"; +			ti,timer-pwm; +		}; + +		timer11: timer@48088000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48088000 0x400>; +			interrupts = <47>; +			ti,hwmods = "timer11"; +			ti,timer-pwm; +		}; + +		timer12: timer@48304000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48304000 0x400>; +			interrupts = <95>; +			ti,hwmods = "timer12"; +			ti,timer-alwon; +			ti,timer-secure; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap4-panda-a4.dts b/arch/arm/boot/dts/omap4-panda-a4.dts new file mode 100644 index 00000000000..75466d2abfb --- /dev/null +++ b/arch/arm/boot/dts/omap4-panda-a4.dts @@ -0,0 +1,17 @@ +/* + * 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" + +/* Pandaboard Rev A4+ have external pullups on SCL & SDA */ +&dss_hdmi_pins { +	pinctrl-single,pins = < +		0x5a 0x118	/* hdmi_cec.hdmi_cec INPUT PULLUP | MODE 0 */ +		0x5c 0x100	/* hdmi_scl.hdmi_scl INPUT | MODE 0 */ +		0x5e 0x100	/* hdmi_sda.hdmi_sda INPUT | MODE 0 */ +		>; +}; diff --git a/arch/arm/boot/dts/omap4-pandaES.dts b/arch/arm/boot/dts/omap4-panda-es.dts index d4ba43a48d9..73bc1a67e44 100644 --- a/arch/arm/boot/dts/omap4-pandaES.dts +++ b/arch/arm/boot/dts/omap4-panda-es.dts @@ -22,3 +22,12 @@  		"AFML", "Line In",  		"AFMR", "Line In";  }; + +/* PandaboardES has external pullups on SCL & SDA */ +&dss_hdmi_pins { +	pinctrl-single,pins = < +		0x5a 0x118	/* hdmi_cec.hdmi_cec INPUT PULLUP | MODE 0 */ +		0x5c 0x100	/* hdmi_scl.hdmi_scl INPUT | MODE 0 */ +		0x5e 0x100	/* hdmi_sda.hdmi_sda INPUT | MODE 0 */ +		>; +}; diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index e8f927cbb37..4122efe31cf 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts @@ -65,6 +65,8 @@  			&twl6040_pins  			&mcpdm_pins  			&mcbsp1_pins +			&dss_hdmi_pins +			&tpd12s015_pins  	>;  	twl6040_pins: pinmux_twl6040_pins { @@ -92,6 +94,22 @@  			0xc4 0x100	/* abe_mcbsp1_fsx.abe_mcbsp1_fsx INPUT | MODE0 */  		>;  	}; + +	dss_hdmi_pins: pinmux_dss_hdmi_pins { +		pinctrl-single,pins = < +			0x5a 0x118	/* hdmi_cec.hdmi_cec INPUT PULLUP | MODE 0 */ +			0x5c 0x118	/* hdmi_scl.hdmi_scl INPUT PULLUP | MODE 0 */ +			0x5e 0x118	/* hdmi_sda.hdmi_sda INPUT PULLUP | MODE 0 */ +		>; +	}; + +	tpd12s015_pins: pinmux_tpd12s015_pins { +		pinctrl-single,pins = < +			0x22 0x3	/* gpmc_a17.gpio_41 OUTPUT | MODE3 */ +			0x48 0x3	/* gpmc_nbe1.gpio_60 OUTPUT | MODE3 */ +			0x58 0x10b	/* hdmi_hpd.gpio_63 INPUT PULLDOWN | MODE3 */ +		>; +	};  };  &i2c1 { @@ -184,3 +202,7 @@  &dmic {  	status = "disabled";  }; + +&twl_usb_comparator { +	usb-supply = <&vusb>; +}; diff --git a/arch/arm/boot/dts/omap4-sdp-es23plus.dts b/arch/arm/boot/dts/omap4-sdp-es23plus.dts new file mode 100644 index 00000000000..b4a40ffbce3 --- /dev/null +++ b/arch/arm/boot/dts/omap4-sdp-es23plus.dts @@ -0,0 +1,17 @@ +/* + * 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-sdp.dts" + +/* SDP boards with 4430 ES2.3+ or 4460 have external pullups on SCL & SDA */ +&dss_hdmi_pins { +	pinctrl-single,pins = < +		0x5a 0x118	/* hdmi_cec.hdmi_cec INPUT PULLUP | MODE 0 */ +		0x5c 0x100	/* hdmi_scl.hdmi_scl INPUT | MODE 0 */ +		0x5e 0x100	/* hdmi_sda.hdmi_sda INPUT | MODE 0 */ +		>; +}; diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index 5b7e04fbff5..43e5258a937 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts @@ -124,6 +124,8 @@  			&dmic_pins  			&mcbsp1_pins  			&mcbsp2_pins +			&dss_hdmi_pins +			&tpd12s015_pins  	>;  	uart2_pins: pinmux_uart2_pins { @@ -194,6 +196,22 @@  			0xbc 0x100	/* abe_mcbsp2_fsx.abe_mcbsp2_fsx INPUT | MODE0 */  		>;  	}; + +	dss_hdmi_pins: pinmux_dss_hdmi_pins { +		pinctrl-single,pins = < +			0x5a 0x118	/* hdmi_cec.hdmi_cec INPUT PULLUP | MODE 0 */ +			0x5c 0x118	/* hdmi_scl.hdmi_scl INPUT PULLUP | MODE 0 */ +			0x5e 0x118	/* hdmi_sda.hdmi_sda INPUT PULLUP | MODE 0 */ +		>; +	}; + +	tpd12s015_pins: pinmux_tpd12s015_pins { +		pinctrl-single,pins = < +			0x22 0x3	/* gpmc_a17.gpio_41 OUTPUT | MODE3 */ +			0x48 0x3	/* gpmc_nbe1.gpio_60 OUTPUT | MODE3 */ +			0x58 0x10b	/* hdmi_hpd.gpio_63 INPUT PULLDOWN | MODE3 */ +		>; +	};  };  &i2c1 { @@ -406,3 +424,7 @@  &mcbsp3 {  	status = "disabled";  }; + +&twl_usb_comparator { +	usb-supply = <&vusb>; +}; diff --git a/arch/arm/boot/dts/omap4-var_som.dts b/arch/arm/boot/dts/omap4-var-som.dts index 6601e6af609..6601e6af609 100644 --- a/arch/arm/boot/dts/omap4-var_som.dts +++ b/arch/arm/boot/dts/omap4-var-som.dts diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index 3883f94fdbd..739bb79e410 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi @@ -95,6 +95,12 @@  		ranges;  		ti,hwmods = "l3_main_1", "l3_main_2", "l3_main_3"; +		counter32k: counter@4a304000 { +			compatible = "ti,omap-counter32k"; +			reg = <0x4a304000 0x20>; +			ti,hwmods = "counter_32k"; +		}; +  		omap4_pmx_core: pinmux@4a100040 {  			compatible = "ti,omap4-padconf", "pinctrl-single";  			reg = <0x4a100040 0x0196>; @@ -340,7 +346,6 @@  			      <0x49032000 0x7f>; /* L3 Interconnect */  			reg-names = "mpu", "dma";  			interrupts = <0 112 0x4>; -			interrupt-parent = <&gic>;  			ti,hwmods = "mcpdm";  		}; @@ -350,7 +355,6 @@  			      <0x4902e000 0x7f>; /* L3 Interconnect */  			reg-names = "mpu", "dma";  			interrupts = <0 114 0x4>; -			interrupt-parent = <&gic>;  			ti,hwmods = "dmic";  		}; @@ -361,7 +365,6 @@  			reg-names = "mpu", "dma";  			interrupts = <0 17 0x4>;  			interrupt-names = "common"; -			interrupt-parent = <&gic>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp1";  		}; @@ -373,7 +376,6 @@  			reg-names = "mpu", "dma";  			interrupts = <0 22 0x4>;  			interrupt-names = "common"; -			interrupt-parent = <&gic>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp2";  		}; @@ -385,7 +387,6 @@  			reg-names = "mpu", "dma";  			interrupts = <0 23 0x4>;  			interrupt-names = "common"; -			interrupt-parent = <&gic>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp3";  		}; @@ -396,7 +397,6 @@  			reg-names = "mpu";  			interrupts = <0 16 0x4>;  			interrupt-names = "common"; -			interrupt-parent = <&gic>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp4";  		}; @@ -431,12 +431,103 @@  			hw-caps-temp-alert;  		}; -		ocp2scp { +		ocp2scp@4a0ad000 {  			compatible = "ti,omap-ocp2scp"; +			reg = <0x4a0ad000 0x1f>;  			#address-cells = <1>;  			#size-cells = <1>;  			ranges;  			ti,hwmods = "ocp2scp_usb_phy";  		}; + +		timer1: timer@4a318000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4a318000 0x80>; +			interrupts = <0 37 0x4>; +			ti,hwmods = "timer1"; +			ti,timer-alwon; +		}; + +		timer2: timer@48032000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48032000 0x80>; +			interrupts = <0 38 0x4>; +			ti,hwmods = "timer2"; +		}; + +		timer3: timer@48034000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48034000 0x80>; +			interrupts = <0 39 0x4>; +			ti,hwmods = "timer3"; +		}; + +		timer4: timer@48036000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48036000 0x80>; +			interrupts = <0 40 0x4>; +			ti,hwmods = "timer4"; +		}; + +		timer5: timer@40138000 { +			compatible = "ti,omap2-timer"; +			reg = <0x40138000 0x80>, +			      <0x49038000 0x80>; +			interrupts = <0 41 0x4>; +			ti,hwmods = "timer5"; +			ti,timer-dsp; +		}; + +		timer6: timer@4013a000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4013a000 0x80>, +			      <0x4903a000 0x80>; +			interrupts = <0 42 0x4>; +			ti,hwmods = "timer6"; +			ti,timer-dsp; +		}; + +		timer7: timer@4013c000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4013c000 0x80>, +			      <0x4903c000 0x80>; +			interrupts = <0 43 0x4>; +			ti,hwmods = "timer7"; +			ti,timer-dsp; +		}; + +		timer8: timer@4013e000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4013e000 0x80>, +			      <0x4903e000 0x80>; +			interrupts = <0 44 0x4>; +			ti,hwmods = "timer8"; +			ti,timer-pwm; +			ti,timer-dsp; +		}; + +		timer9: timer@4803e000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4803e000 0x80>; +			interrupts = <0 45 0x4>; +			ti,hwmods = "timer9"; +			ti,timer-pwm; +		}; + +		timer10: timer@48086000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48086000 0x80>; +			interrupts = <0 46 0x4>; +			ti,hwmods = "timer10"; +			ti,timer-pwm; +		}; + +		timer11: timer@48088000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48088000 0x80>; +			interrupts = <0 47 0x4>; +			ti,hwmods = "timer11"; +			ti,timer-pwm; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap5-evm.dts b/arch/arm/boot/dts/omap5-evm.dts index c663eba7316..8722c15bbba 100644 --- a/arch/arm/boot/dts/omap5-evm.dts +++ b/arch/arm/boot/dts/omap5-evm.dts @@ -8,6 +8,7 @@  /dts-v1/;  /include/ "omap5.dtsi" +/include/ "samsung_k3pe0e000b.dtsi"  / {  	model = "TI OMAP5 EVM board"; @@ -15,7 +16,7 @@  	memory {  		device_type = "memory"; -		reg = <0x80000000 0x40000000>; /* 1 GB */ +		reg = <0x80000000 0x80000000>; /* 2 GB */  	};  	vmmcsd_fixed: fixedregulator-mmcsd { @@ -140,3 +141,13 @@  &mcbsp3 {  	status = "disabled";  }; + +&emif1 { +	cs1-used; +	device-handle = <&samsung_K3PE0E000B>; +}; + +&emif2 { +	cs1-used; +	device-handle = <&samsung_K3PE0E000B>; +}; diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi index 42c78beb4fd..790bb2a4b34 100644 --- a/arch/arm/boot/dts/omap5.dtsi +++ b/arch/arm/boot/dts/omap5.dtsi @@ -77,6 +77,12 @@  		ranges;  		ti,hwmods = "l3_main_1", "l3_main_2", "l3_main_3"; +		counter32k: counter@4ae04000 { +			compatible = "ti,omap-counter32k"; +			reg = <0x4ae04000 0x40>; +			ti,hwmods = "counter_32k"; +		}; +  		omap5_pmx_core: pinmux@4a002840 {  			compatible = "ti,omap4-padconf", "pinctrl-single";  			reg = <0x4a002840 0x01b6>; @@ -104,6 +110,8 @@  		gpio1: gpio@4ae10000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x4ae10000 0x200>; +			interrupts = <0 29 0x4>;  			ti,hwmods = "gpio1";  			gpio-controller;  			#gpio-cells = <2>; @@ -113,6 +121,8 @@  		gpio2: gpio@48055000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x48055000 0x200>; +			interrupts = <0 30 0x4>;  			ti,hwmods = "gpio2";  			gpio-controller;  			#gpio-cells = <2>; @@ -122,6 +132,8 @@  		gpio3: gpio@48057000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x48057000 0x200>; +			interrupts = <0 31 0x4>;  			ti,hwmods = "gpio3";  			gpio-controller;  			#gpio-cells = <2>; @@ -131,6 +143,8 @@  		gpio4: gpio@48059000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x48059000 0x200>; +			interrupts = <0 32 0x4>;  			ti,hwmods = "gpio4";  			gpio-controller;  			#gpio-cells = <2>; @@ -140,6 +154,8 @@  		gpio5: gpio@4805b000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x4805b000 0x200>; +			interrupts = <0 33 0x4>;  			ti,hwmods = "gpio5";  			gpio-controller;  			#gpio-cells = <2>; @@ -149,6 +165,8 @@  		gpio6: gpio@4805d000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x4805d000 0x200>; +			interrupts = <0 34 0x4>;  			ti,hwmods = "gpio6";  			gpio-controller;  			#gpio-cells = <2>; @@ -158,6 +176,8 @@  		gpio7: gpio@48051000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x48051000 0x200>; +			interrupts = <0 35 0x4>;  			ti,hwmods = "gpio7";  			gpio-controller;  			#gpio-cells = <2>; @@ -167,6 +187,8 @@  		gpio8: gpio@48053000 {  			compatible = "ti,omap4-gpio"; +			reg = <0x48053000 0x200>; +			interrupts = <0 121 0x4>;  			ti,hwmods = "gpio8";  			gpio-controller;  			#gpio-cells = <2>; @@ -176,6 +198,8 @@  		i2c1: i2c@48070000 {  			compatible = "ti,omap4-i2c"; +			reg = <0x48070000 0x100>; +			interrupts = <0 56 0x4>;  			#address-cells = <1>;  			#size-cells = <0>;  			ti,hwmods = "i2c1"; @@ -183,6 +207,8 @@  		i2c2: i2c@48072000 {  			compatible = "ti,omap4-i2c"; +			reg = <0x48072000 0x100>; +			interrupts = <0 57 0x4>;  			#address-cells = <1>;  			#size-cells = <0>;  			ti,hwmods = "i2c2"; @@ -190,20 +216,26 @@  		i2c3: i2c@48060000 {  			compatible = "ti,omap4-i2c"; +			reg = <0x48060000 0x100>; +			interrupts = <0 61 0x4>;  			#address-cells = <1>;  			#size-cells = <0>;  			ti,hwmods = "i2c3";  		}; -		i2c4: i2c@4807A000 { +		i2c4: i2c@4807a000 {  			compatible = "ti,omap4-i2c"; +			reg = <0x4807a000 0x100>; +			interrupts = <0 62 0x4>;  			#address-cells = <1>;  			#size-cells = <0>;  			ti,hwmods = "i2c4";  		}; -		i2c5: i2c@4807C000 { +		i2c5: i2c@4807c000 {  			compatible = "ti,omap4-i2c"; +			reg = <0x4807c000 0x100>; +			interrupts = <0 60 0x4>;  			#address-cells = <1>;  			#size-cells = <0>;  			ti,hwmods = "i2c5"; @@ -211,42 +243,56 @@  		uart1: serial@4806a000 {  			compatible = "ti,omap4-uart"; +			reg = <0x4806a000 0x100>; +			interrupts = <0 72 0x4>;  			ti,hwmods = "uart1";  			clock-frequency = <48000000>;  		};  		uart2: serial@4806c000 {  			compatible = "ti,omap4-uart"; +			reg = <0x4806c000 0x100>; +			interrupts = <0 73 0x4>;  			ti,hwmods = "uart2";  			clock-frequency = <48000000>;  		};  		uart3: serial@48020000 {  			compatible = "ti,omap4-uart"; +			reg = <0x48020000 0x100>; +			interrupts = <0 74 0x4>;  			ti,hwmods = "uart3";  			clock-frequency = <48000000>;  		};  		uart4: serial@4806e000 {  			compatible = "ti,omap4-uart"; +			reg = <0x4806e000 0x100>; +			interrupts = <0 70 0x4>;  			ti,hwmods = "uart4";  			clock-frequency = <48000000>;  		};  		uart5: serial@48066000 { -			compatible = "ti,omap5-uart"; +			compatible = "ti,omap4-uart"; +			reg = <0x48066000 0x100>; +			interrupts = <0 105 0x4>;  			ti,hwmods = "uart5";  			clock-frequency = <48000000>;  		};  		uart6: serial@48068000 { -			compatible = "ti,omap6-uart"; +			compatible = "ti,omap4-uart"; +			reg = <0x48068000 0x100>; +			interrupts = <0 106 0x4>;  			ti,hwmods = "uart6";  			clock-frequency = <48000000>;  		};  		mmc1: mmc@4809c000 {  			compatible = "ti,omap4-hsmmc"; +			reg = <0x4809c000 0x400>; +			interrupts = <0 83 0x4>;  			ti,hwmods = "mmc1";  			ti,dual-volt;  			ti,needs-special-reset; @@ -254,24 +300,32 @@  		mmc2: mmc@480b4000 {  			compatible = "ti,omap4-hsmmc"; +			reg = <0x480b4000 0x400>; +			interrupts = <0 86 0x4>;  			ti,hwmods = "mmc2";  			ti,needs-special-reset;  		};  		mmc3: mmc@480ad000 {  			compatible = "ti,omap4-hsmmc"; +			reg = <0x480ad000 0x400>; +			interrupts = <0 94 0x4>;  			ti,hwmods = "mmc3";  			ti,needs-special-reset;  		};  		mmc4: mmc@480d1000 {  			compatible = "ti,omap4-hsmmc"; +			reg = <0x480d1000 0x400>; +			interrupts = <0 96 0x4>;  			ti,hwmods = "mmc4";  			ti,needs-special-reset;  		};  		mmc5: mmc@480d5000 {  			compatible = "ti,omap4-hsmmc"; +			reg = <0x480d5000 0x400>; +			interrupts = <0 59 0x4>;  			ti,hwmods = "mmc5";  			ti,needs-special-reset;  		}; @@ -287,7 +341,6 @@  			      <0x49032000 0x7f>; /* L3 Interconnect */  			reg-names = "mpu", "dma";  			interrupts = <0 112 0x4>; -			interrupt-parent = <&gic>;  			ti,hwmods = "mcpdm";  		}; @@ -297,7 +350,6 @@  			      <0x4902e000 0x7f>; /* L3 Interconnect */  			reg-names = "mpu", "dma";  			interrupts = <0 114 0x4>; -			interrupt-parent = <&gic>;  			ti,hwmods = "dmic";  		}; @@ -308,7 +360,6 @@  			reg-names = "mpu", "dma";  			interrupts = <0 17 0x4>;  			interrupt-names = "common"; -			interrupt-parent = <&gic>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp1";  		}; @@ -320,7 +371,6 @@  			reg-names = "mpu", "dma";  			interrupts = <0 22 0x4>;  			interrupt-names = "common"; -			interrupt-parent = <&gic>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp2";  		}; @@ -332,9 +382,119 @@  			reg-names = "mpu", "dma";  			interrupts = <0 23 0x4>;  			interrupt-names = "common"; -			interrupt-parent = <&gic>;  			ti,buffer-size = <128>;  			ti,hwmods = "mcbsp3";  		}; + +		timer1: timer@4ae18000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4ae18000 0x80>; +			interrupts = <0 37 0x4>; +			ti,hwmods = "timer1"; +			ti,timer-alwon; +		}; + +		timer2: timer@48032000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48032000 0x80>; +			interrupts = <0 38 0x4>; +			ti,hwmods = "timer2"; +		}; + +		timer3: timer@48034000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48034000 0x80>; +			interrupts = <0 39 0x4>; +			ti,hwmods = "timer3"; +		}; + +		timer4: timer@48036000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48036000 0x80>; +			interrupts = <0 40 0x4>; +			ti,hwmods = "timer4"; +		}; + +		timer5: timer@40138000 { +			compatible = "ti,omap2-timer"; +			reg = <0x40138000 0x80>, +			      <0x49038000 0x80>; +			interrupts = <0 41 0x4>; +			ti,hwmods = "timer5"; +			ti,timer-dsp; +		}; + +		timer6: timer@4013a000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4013a000 0x80>, +			      <0x4903a000 0x80>; +			interrupts = <0 42 0x4>; +			ti,hwmods = "timer6"; +			ti,timer-dsp; +			ti,timer-pwm; +		}; + +		timer7: timer@4013c000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4013c000 0x80>, +			      <0x4903c000 0x80>; +			interrupts = <0 43 0x4>; +			ti,hwmods = "timer7"; +			ti,timer-dsp; +		}; + +		timer8: timer@4013e000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4013e000 0x80>, +			      <0x4903e000 0x80>; +			interrupts = <0 44 0x4>; +			ti,hwmods = "timer8"; +			ti,timer-dsp; +			ti,timer-pwm; +		}; + +		timer9: timer@4803e000 { +			compatible = "ti,omap2-timer"; +			reg = <0x4803e000 0x80>; +			interrupts = <0 45 0x4>; +			ti,hwmods = "timer9"; +		}; + +		timer10: timer@48086000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48086000 0x80>; +			interrupts = <0 46 0x4>; +			ti,hwmods = "timer10"; +		}; + +		timer11: timer@48088000 { +			compatible = "ti,omap2-timer"; +			reg = <0x48088000 0x80>; +			interrupts = <0 47 0x4>; +			ti,hwmods = "timer11"; +			ti,timer-pwm; +		}; + +		emif1: emif@0x4c000000 { +			compatible	= "ti,emif-4d5"; +			ti,hwmods	= "emif1"; +			phy-type	= <2>; /* DDR PHY type: Intelli PHY */ +			reg = <0x4c000000 0x400>; +			interrupts = <0 110 0x4>; +			hw-caps-read-idle-ctrl; +			hw-caps-ll-interface; +			hw-caps-temp-alert; +		}; + +		emif2: emif@0x4d000000 { +			compatible	= "ti,emif-4d5"; +			ti,hwmods	= "emif2"; +			phy-type	= <2>; /* DDR PHY type: Intelli PHY */ +			reg = <0x4d000000 0x400>; +			interrupts = <0 111 0x4>; +			hw-caps-read-idle-ctrl; +			hw-caps-ll-interface; +			hw-caps-temp-alert; +		};  	};  }; diff --git a/arch/arm/boot/dts/samsung_k3pe0e000b.dtsi b/arch/arm/boot/dts/samsung_k3pe0e000b.dtsi new file mode 100644 index 00000000000..9657a5cbc3a --- /dev/null +++ b/arch/arm/boot/dts/samsung_k3pe0e000b.dtsi @@ -0,0 +1,67 @@ +/* + * Timings and Geometry for Samsung K3PE0E000B memory part + */ + +/ { +	samsung_K3PE0E000B: lpddr2 { +		compatible	= "Samsung,K3PE0E000B","jedec,lpddr2-s4"; +		density		= <4096>; +		io-width	= <32>; + +		tRPab-min-tck	= <3>; +		tRCD-min-tck	= <3>; +		tWR-min-tck	= <3>; +		tRASmin-min-tck	= <3>; +		tRRD-min-tck	= <2>; +		tWTR-min-tck	= <2>; +		tXP-min-tck	= <2>; +		tRTP-min-tck	= <2>; +		tCKE-min-tck	= <3>; +		tCKESR-min-tck	= <3>; +		tFAW-min-tck	= <8>; + +		timings_samsung_K3PE0E000B_533MHz: lpddr2-timings@0 { +			compatible	= "jedec,lpddr2-timings"; +			min-freq	= <10000000>; +			max-freq	= <533333333>; +			tRPab		= <21000>; +			tRCD		= <18000>; +			tWR		= <15000>; +			tRAS-min	= <42000>; +			tRRD		= <10000>; +			tWTR		= <7500>; +			tXP		= <7500>; +			tRTP		= <7500>; +			tCKESR		= <15000>; +			tDQSCK-max	= <5500>; +			tFAW		= <50000>; +			tZQCS		= <90000>; +			tZQCL		= <360000>; +			tZQinit		= <1000000>; +			tRAS-max-ns	= <70000>; +			tDQSCK-max-derated = <6000>; +		}; + +		timings_samsung_K3PE0E000B_266MHz: lpddr2-timings@1 { +			compatible	= "jedec,lpddr2-timings"; +			min-freq	= <10000000>; +			max-freq	= <266666666>; +			tRPab		= <21000>; +			tRCD		= <18000>; +			tWR		= <15000>; +			tRAS-min	= <42000>; +			tRRD		= <10000>; +			tWTR		= <7500>; +			tXP		= <7500>; +			tRTP		= <7500>; +			tCKESR		= <15000>; +			tDQSCK-max	= <5500>; +			tFAW		= <50000>; +			tZQCS		= <90000>; +			tZQCL		= <360000>; +			tZQinit		= <1000000>; +			tRAS-max-ns	= <70000>; +			tDQSCK-max-derated = <6000>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/twl4030.dtsi b/arch/arm/boot/dts/twl4030.dtsi index ff000172c93..63411b03693 100644 --- a/arch/arm/boot/dts/twl4030.dtsi +++ b/arch/arm/boot/dts/twl4030.dtsi @@ -37,6 +37,24 @@  		regulator-max-microvolt = <3150000>;  	}; +	vusb1v5: regulator-vusb1v5 { +		compatible = "ti,twl4030-vusb1v5"; +	}; + +	vusb1v8: regulator-vusb1v8 { +		compatible = "ti,twl4030-vusb1v8"; +	}; + +	vusb3v1: regulator-vusb3v1 { +		compatible = "ti,twl4030-vusb3v1"; +	}; + +	vsim: regulator-vsim { +		compatible = "ti,twl4030-vsim"; +		regulator-min-microvolt = <1800000>; +		regulator-max-microvolt = <3000000>; +	}; +  	twl_gpio: gpio {  		compatible = "ti,twl4030-gpio";  		gpio-controller; @@ -44,4 +62,13 @@  		interrupt-controller;  		#interrupt-cells = <1>;  	}; + +	twl4030-usb { +		compatible = "ti,twl4030-usb"; +		interrupts = <10>, <4>; +		usb1v5-supply = <&vusb1v5>; +		usb1v8-supply = <&vusb1v8>; +		usb3v1-supply = <&vusb3v1>; +		usb_mode = <1>; +	};  }; diff --git a/arch/arm/boot/dts/twl6030.dtsi b/arch/arm/boot/dts/twl6030.dtsi index 123e2c40218..9996cfc5ee8 100644 --- a/arch/arm/boot/dts/twl6030.dtsi +++ b/arch/arm/boot/dts/twl6030.dtsi @@ -86,4 +86,9 @@  	clk32kg: regulator-clk32kg {  		compatible = "ti,twl6030-clk32kg";  	}; + +	twl_usb_comparator: usb-comparator { +		compatible = "ti,twl6030-usb"; +		interrupts = <4>, <10>; +	};  }; diff --git a/arch/arm/mach-omap1/timer.c b/arch/arm/mach-omap1/timer.c index cdeb9d3ef64..bde7a35e500 100644 --- a/arch/arm/mach-omap1/timer.c +++ b/arch/arm/mach-omap1/timer.c @@ -25,6 +25,7 @@  #include <linux/err.h>  #include <linux/slab.h>  #include <linux/platform_device.h> +#include <linux/platform_data/dmtimer-omap.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c index 89368195bf0..41152fadd4c 100644 --- a/arch/arm/mach-omap1/timer32k.c +++ b/arch/arm/mach-omap1/timer32k.c @@ -51,7 +51,6 @@  #include <asm/mach/time.h>  #include <plat/counter-32k.h> -#include <plat/dmtimer.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index 699caec8f9e..ebbc2adb499 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c @@ -297,6 +297,6 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= cm_t3517_init,  	.init_late	= am35xx_init_late, -	.timer		= &omap3_timer, +	.timer		= &omap3_gp_timer,  	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 475e14f0721..aa6e4a19dd9 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -97,6 +97,23 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  	.dt_compat	= omap3_boards_compat,  	.restart	= omap3xxx_restart,  MACHINE_END + +static const char *omap3_gp_boards_compat[] __initdata = { +	"ti,omap3-beagle", +	NULL, +}; + +DT_MACHINE_START(OMAP3_GP_DT, "Generic OMAP3-GP (Flattened Device Tree)") +	.reserve	= omap_reserve, +	.map_io		= omap3_map_io, +	.init_early	= omap3430_init_early, +	.init_irq	= omap_intc_of_init, +	.handle_irq	= omap3_intc_handle_irq, +	.init_machine	= omap_generic_init, +	.timer		= &omap3_secure_timer, +	.dt_compat	= omap3_gp_boards_compat, +	.restart	= omap_prcm_restart, +MACHINE_END  #endif  #ifdef CONFIG_SOC_AM33XX diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 08c586451f9..3bbcde87dea 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -82,6 +82,7 @@ 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_gp_timer;  extern struct sys_timer omap3_am33xx_timer;  extern struct sys_timer omap4_timer;  extern struct sys_timer omap5_timer; diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index a8b3368dca3..e8efe3d1da6 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c @@ -17,7 +17,6 @@  #include <linux/platform_data/spi-omap2-mcspi.h>  #include <plat-omap/dma-omap.h> -#include <plat/dmtimer.h>  #include "omap_hwmod.h"  #include "l3_2xxx.h" diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index dc768c50e52..32d17e3fd72 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c @@ -18,7 +18,6 @@  #include <linux/platform_data/spi-omap2-mcspi.h>  #include <plat-omap/dma-omap.h> -#include <plat/dmtimer.h>  #include "omap_hwmod.h"  #include "mmc.h" 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 a0116d08cf4..0db8f450bad 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c @@ -58,8 +58,9 @@ static struct omap_hwmod_class_sysconfig omap2xxx_timer_sysc = {  	.syss_offs	= 0x0014,  	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY |  			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | -			   SYSC_HAS_AUTOIDLE), +			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),  	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), +	.clockact       = CLOCKACT_TEST_ICLK,  	.sysc_fields	= &omap_hwmod_sysc_type1,  }; @@ -268,6 +269,7 @@ struct omap_hwmod omap2xxx_timer1_hwmod = {  	},  	.dev_attr	= &capability_alwon_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer2 */ @@ -286,6 +288,7 @@ struct omap_hwmod omap2xxx_timer2_hwmod = {  		},  	},  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer3 */ @@ -304,6 +307,7 @@ struct omap_hwmod omap2xxx_timer3_hwmod = {  		},  	},  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer4 */ @@ -322,6 +326,7 @@ struct omap_hwmod omap2xxx_timer4_hwmod = {  		},  	},  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer5 */ @@ -341,6 +346,7 @@ struct omap_hwmod omap2xxx_timer5_hwmod = {  	},  	.dev_attr	= &capability_dsp_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer6 */ @@ -360,6 +366,7 @@ struct omap_hwmod omap2xxx_timer6_hwmod = {  	},  	.dev_attr	= &capability_dsp_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer7 */ @@ -379,6 +386,7 @@ struct omap_hwmod omap2xxx_timer7_hwmod = {  	},  	.dev_attr	= &capability_dsp_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer8 */ @@ -398,6 +406,7 @@ struct omap_hwmod omap2xxx_timer8_hwmod = {  	},  	.dev_attr	= &capability_dsp_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer9 */ @@ -417,6 +426,7 @@ struct omap_hwmod omap2xxx_timer9_hwmod = {  	},  	.dev_attr	= &capability_pwm_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer10 */ @@ -436,6 +446,7 @@ struct omap_hwmod omap2xxx_timer10_hwmod = {  	},  	.dev_attr	= &capability_pwm_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer11 */ @@ -455,6 +466,7 @@ struct omap_hwmod omap2xxx_timer11_hwmod = {  	},  	.dev_attr	= &capability_pwm_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer12 */ @@ -474,6 +486,7 @@ struct omap_hwmod omap2xxx_timer12_hwmod = {  	},  	.dev_attr	= &capability_pwm_dev_attr,  	.class		= &omap2xxx_timer_hwmod_class, +	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,  };  /* wd_timer2 */ diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index abe66ced903..addc1c24ca2 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -153,29 +153,16 @@ static struct omap_hwmod omap3xxx_debugss_hwmod = {  };  /* timer class */ -static struct omap_hwmod_class_sysconfig omap3xxx_timer_1ms_sysc = { -	.rev_offs	= 0x0000, -	.sysc_offs	= 0x0010, -	.syss_offs	= 0x0014, -	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY | -				SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | -				SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE), -	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), -	.sysc_fields	= &omap_hwmod_sysc_type1, -}; - -static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = { -	.name = "timer", -	.sysc = &omap3xxx_timer_1ms_sysc, -}; -  static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = {  	.rev_offs	= 0x0000,  	.sysc_offs	= 0x0010,  	.syss_offs	= 0x0014, -	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | -			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), +	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY | +			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | +			   SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE | +			   SYSS_HAS_RESET_STATUS),  	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), +	.clockact	= CLOCKACT_TEST_ICLK,  	.sysc_fields	= &omap_hwmod_sysc_type1,  }; @@ -224,7 +211,8 @@ static struct omap_hwmod omap3xxx_timer1_hwmod = {  		},  	},  	.dev_attr	= &capability_alwon_dev_attr, -	.class		= &omap3xxx_timer_1ms_hwmod_class, +	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer2 */ @@ -241,7 +229,8 @@ static struct omap_hwmod omap3xxx_timer2_hwmod = {  			.idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT,  		},  	}, -	.class		= &omap3xxx_timer_1ms_hwmod_class, +	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer3 */ @@ -259,6 +248,7 @@ static struct omap_hwmod omap3xxx_timer3_hwmod = {  		},  	},  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer4 */ @@ -276,6 +266,7 @@ static struct omap_hwmod omap3xxx_timer4_hwmod = {  		},  	},  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer5 */ @@ -294,6 +285,7 @@ static struct omap_hwmod omap3xxx_timer5_hwmod = {  	},  	.dev_attr	= &capability_dsp_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer6 */ @@ -312,6 +304,7 @@ static struct omap_hwmod omap3xxx_timer6_hwmod = {  	},  	.dev_attr	= &capability_dsp_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer7 */ @@ -330,6 +323,7 @@ static struct omap_hwmod omap3xxx_timer7_hwmod = {  	},  	.dev_attr	= &capability_dsp_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer8 */ @@ -348,6 +342,7 @@ static struct omap_hwmod omap3xxx_timer8_hwmod = {  	},  	.dev_attr	= &capability_dsp_pwm_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer9 */ @@ -366,6 +361,7 @@ static struct omap_hwmod omap3xxx_timer9_hwmod = {  	},  	.dev_attr	= &capability_pwm_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer10 */ @@ -383,7 +379,8 @@ static struct omap_hwmod omap3xxx_timer10_hwmod = {  		},  	},  	.dev_attr	= &capability_pwm_dev_attr, -	.class		= &omap3xxx_timer_1ms_hwmod_class, +	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer11 */ @@ -402,6 +399,7 @@ static struct omap_hwmod omap3xxx_timer11_hwmod = {  	},  	.dev_attr	= &capability_pwm_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* timer12 */ @@ -425,6 +423,7 @@ static struct omap_hwmod omap3xxx_timer12_hwmod = {  	},  	.dev_attr	= &capability_secure_dev_attr,  	.class		= &omap3xxx_timer_hwmod_class, +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  };  /* diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index b80bbf607ef..f5b55a78a5f 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -3103,6 +3103,7 @@ static struct omap_hwmod_class_sysconfig omap44xx_timer_1ms_sysc = {  			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |  			   SYSS_HAS_RESET_STATUS),  	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), +	.clockact	= CLOCKACT_TEST_ICLK,  	.sysc_fields	= &omap_hwmod_sysc_type1,  }; @@ -3156,6 +3157,7 @@ static struct omap_hwmod omap44xx_timer1_hwmod = {  	.name		= "timer1",  	.class		= &omap44xx_timer_1ms_hwmod_class,  	.clkdm_name	= "l4_wkup_clkdm", +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  	.mpu_irqs	= omap44xx_timer1_irqs,  	.main_clk	= "timer1_fck",  	.prcm = { @@ -3178,6 +3180,7 @@ static struct omap_hwmod omap44xx_timer2_hwmod = {  	.name		= "timer2",  	.class		= &omap44xx_timer_1ms_hwmod_class,  	.clkdm_name	= "l4_per_clkdm", +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  	.mpu_irqs	= omap44xx_timer2_irqs,  	.main_clk	= "timer2_fck",  	.prcm = { @@ -3352,6 +3355,7 @@ static struct omap_hwmod omap44xx_timer10_hwmod = {  	.name		= "timer10",  	.class		= &omap44xx_timer_1ms_hwmod_class,  	.clkdm_name	= "l4_per_clkdm", +	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,  	.mpu_irqs	= omap44xx_timer10_irqs,  	.main_clk	= "timer10_fck",  	.prcm = { diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index 3cf4fdfd7ab..e2c291f52f9 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c @@ -30,7 +30,6 @@  #include "clock.h"  #include "powerdomain.h"  #include "clockdomain.h" -#include <plat/dmtimer.h>  #include "omap-pm.h"  #include "soc.h" diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index c5bc2cb4d8d..b9cff72ceae 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -37,6 +37,10 @@  #include <linux/clockchips.h>  #include <linux/slab.h>  #include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/platform_device.h> +#include <linux/platform_data/dmtimer-omap.h>  #include <asm/mach/time.h>  #include <asm/smp_twd.h> @@ -62,18 +66,6 @@  #define OMAP3_32K_SOURCE	"omap_32k_fck"  #define OMAP4_32K_SOURCE	"sys_32k_ck" -#ifdef CONFIG_OMAP_32K_TIMER -#define OMAP2_CLKEV_SOURCE	OMAP2_32K_SOURCE -#define OMAP3_CLKEV_SOURCE	OMAP3_32K_SOURCE -#define OMAP4_CLKEV_SOURCE	OMAP4_32K_SOURCE -#define OMAP3_SECURE_TIMER	12 -#else -#define OMAP2_CLKEV_SOURCE	OMAP2_MPU_SOURCE -#define OMAP3_CLKEV_SOURCE	OMAP3_MPU_SOURCE -#define OMAP4_CLKEV_SOURCE	OMAP4_MPU_SOURCE -#define OMAP3_SECURE_TIMER	1 -#endif -  #define REALTIME_COUNTER_BASE				0x48243200  #define INCREMENTER_NUMERATOR_OFFSET			0x10  #define INCREMENTER_DENUMERATOR_RELOAD_OFFSET		0x14 @@ -104,7 +96,7 @@ static int omap2_gp_timer_set_next_event(unsigned long cycles,  					 struct clock_event_device *evt)  {  	__omap_dm_timer_load_start(&clkev, OMAP_TIMER_CTRL_ST, -						0xffffffff - cycles, 1); +				   0xffffffff - cycles, OMAP_TIMER_POSTED);  	return 0;  } @@ -114,7 +106,7 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode,  {  	u32 period; -	__omap_dm_timer_stop(&clkev, 1, clkev.rate); +	__omap_dm_timer_stop(&clkev, OMAP_TIMER_POSTED, clkev.rate);  	switch (mode) {  	case CLOCK_EVT_MODE_PERIODIC: @@ -122,10 +114,10 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode,  		period -= 1;  		/* Looks like we need to first set the load value separately */  		__omap_dm_timer_write(&clkev, OMAP_TIMER_LOAD_REG, -					0xffffffff - period, 1); +				      0xffffffff - period, OMAP_TIMER_POSTED);  		__omap_dm_timer_load_start(&clkev,  					OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST, -						0xffffffff - period, 1); +					0xffffffff - period, OMAP_TIMER_POSTED);  		break;  	case CLOCK_EVT_MODE_ONESHOT:  		break; @@ -145,36 +137,144 @@ static struct clock_event_device clockevent_gpt = {  	.set_mode	= omap2_gp_timer_set_mode,  }; +static struct property device_disabled = { +	.name = "status", +	.length = sizeof("disabled"), +	.value = "disabled", +}; + +static struct of_device_id omap_timer_match[] __initdata = { +	{ .compatible = "ti,omap2-timer", }, +	{ } +}; + +/** + * omap_get_timer_dt - get a timer using device-tree + * @match	- device-tree match structure for matching a device type + * @property	- optional timer property to match + * + * Helper function to get a timer during early boot using device-tree for use + * as kernel system timer. Optionally, the property argument can be used to + * select a timer with a specific property. Once a timer is found then mark + * the timer node in device-tree as disabled, to prevent the kernel from + * registering this timer as a platform device and so no one else can use it. + */ +static struct device_node * __init omap_get_timer_dt(struct of_device_id *match, +						     const char *property) +{ +	struct device_node *np; + +	for_each_matching_node(np, match) { +		if (!of_device_is_available(np)) { +			of_node_put(np); +			continue; +		} + +		if (property && !of_get_property(np, property, NULL)) { +			of_node_put(np); +			continue; +		} + +		prom_add_property(np, &device_disabled); +		return np; +	} + +	return NULL; +} + +/** + * omap_dmtimer_init - initialisation function when device tree is used + * + * For secure OMAP3 devices, timers with device type "timer-secure" cannot + * be used by the kernel as they are reserved. Therefore, to prevent the + * kernel registering these devices remove them dynamically from the device + * tree on boot. + */ +void __init omap_dmtimer_init(void) +{ +	struct device_node *np; + +	if (!cpu_is_omap34xx()) +		return; + +	/* If we are a secure device, remove any secure timer nodes */ +	if ((omap_type() != OMAP2_DEVICE_TYPE_GP)) { +		np = omap_get_timer_dt(omap_timer_match, "ti,timer-secure"); +		if (np) +			of_node_put(np); +	} +} + +/** + * omap_dm_timer_get_errata - get errata flags for a timer + * + * Get the timer errata flags that are specific to the OMAP device being used. + */ +u32 __init omap_dm_timer_get_errata(void) +{ +	if (cpu_is_omap24xx()) +		return 0; + +	return OMAP_TIMER_ERRATA_I103_I767; +} +  static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,  						int gptimer_id, -						const char *fck_source) +						const char *fck_source, +						const char *property, +						int posted)  {  	char name[10]; /* 10 = sizeof("gptXX_Xck0") */ +	const char *oh_name; +	struct device_node *np;  	struct omap_hwmod *oh; -	struct resource irq_rsrc, mem_rsrc; -	size_t size; -	int res = 0; -	int r; +	struct resource irq, mem; +	int r = 0; -	sprintf(name, "timer%d", gptimer_id); -	omap_hwmod_setup_one(name); -	oh = omap_hwmod_lookup(name); +	if (of_have_populated_dt()) { +		np = omap_get_timer_dt(omap_timer_match, NULL); +		if (!np) +			return -ENODEV; + +		of_property_read_string_index(np, "ti,hwmods", 0, &oh_name); +		if (!oh_name) +			return -ENODEV; + +		timer->irq = irq_of_parse_and_map(np, 0); +		if (!timer->irq) +			return -ENXIO; + +		timer->io_base = of_iomap(np, 0); + +		of_node_put(np); +	} else { +		if (omap_dm_timer_reserve_systimer(gptimer_id)) +			return -ENODEV; + +		sprintf(name, "timer%d", gptimer_id); +		oh_name = name; +	} + +	oh = omap_hwmod_lookup(oh_name);  	if (!oh)  		return -ENODEV; -	r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL, &irq_rsrc); -	if (r) -		return -ENXIO; -	timer->irq = irq_rsrc.start; +	if (!of_have_populated_dt()) { +		r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL, +						   &irq); +		if (r) +			return -ENXIO; +		timer->irq = irq.start; -	r = omap_hwmod_get_resource_byname(oh, IORESOURCE_MEM, NULL, &mem_rsrc); -	if (r) -		return -ENXIO; -	timer->phys_base = mem_rsrc.start; -	size = mem_rsrc.end - mem_rsrc.start; +		r = omap_hwmod_get_resource_byname(oh, IORESOURCE_MEM, NULL, +						   &mem); +		if (r) +			return -ENXIO; + +		/* Static mapping, never released */ +		timer->io_base = ioremap(mem.start, mem.end - mem.start); +	} -	/* Static mapping, never released */ -	timer->io_base = ioremap(timer->phys_base, size);  	if (!timer->io_base)  		return -ENXIO; @@ -183,42 +283,56 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,  	if (IS_ERR(timer->fclk))  		return -ENODEV; -	omap_hwmod_enable(oh); - -	if (omap_dm_timer_reserve_systimer(gptimer_id)) -		return -ENODEV; - +	/* FIXME: Need to remove hard-coded test on timer ID */  	if (gptimer_id != 12) {  		struct clk *src;  		src = clk_get(NULL, fck_source);  		if (IS_ERR(src)) { -			res = -EINVAL; +			r = -EINVAL;  		} else { -			res = __omap_dm_timer_set_source(timer->fclk, src); -			if (IS_ERR_VALUE(res)) -				pr_warning("%s: timer%i cannot set source\n", -						__func__, gptimer_id); +			r = clk_set_parent(timer->fclk, src); +			if (IS_ERR_VALUE(r)) +				pr_warn("%s: %s cannot set source\n", +					__func__, oh->name);  			clk_put(src);  		}  	} + +	omap_hwmod_setup_one(oh_name); +	omap_hwmod_enable(oh);  	__omap_dm_timer_init_regs(timer); -	__omap_dm_timer_reset(timer, 1, 1); -	timer->posted = 1; -	timer->rate = clk_get_rate(timer->fclk); +	if (posted) +		__omap_dm_timer_enable_posted(timer); +	/* Check that the intended posted configuration matches the actual */ +	if (posted != timer->posted) +		return -EINVAL; + +	timer->rate = clk_get_rate(timer->fclk);  	timer->reserved = 1; -	return res; +	return r;  }  static void __init omap2_gp_clockevent_init(int gptimer_id, -						const char *fck_source) +						const char *fck_source, +						const char *property)  {  	int res; -	res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source); +	clkev.errata = omap_dm_timer_get_errata(); + +	/* +	 * For clock-event timers we never read the timer counter and +	 * so we are not impacted by errata i103 and i767. Therefore, +	 * we can safely ignore this errata for clock-event timers. +	 */ +	__omap_dm_timer_override_errata(&clkev, OMAP_TIMER_ERRATA_I103_I767); + +	res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source, property, +				     OMAP_TIMER_POSTED);  	BUG_ON(res);  	omap2_gp_timer_irq.dev_id = &clkev; @@ -251,7 +365,8 @@ static bool use_gptimer_clksrc;   */  static cycle_t clocksource_read_cycles(struct clocksource *cs)  { -	return (cycle_t)__omap_dm_timer_read_counter(&clksrc, 1); +	return (cycle_t)__omap_dm_timer_read_counter(&clksrc, +						     OMAP_TIMER_NONPOSTED);  }  static struct clocksource clocksource_gpt = { @@ -265,21 +380,41 @@ static struct clocksource clocksource_gpt = {  static u32 notrace dmtimer_read_sched_clock(void)  {  	if (clksrc.reserved) -		return __omap_dm_timer_read_counter(&clksrc, 1); +		return __omap_dm_timer_read_counter(&clksrc, +						    OMAP_TIMER_NONPOSTED);  	return 0;  } -#ifdef CONFIG_OMAP_32K_TIMER +static struct of_device_id omap_counter_match[] __initdata = { +	{ .compatible = "ti,omap-counter32k", }, +	{ } +}; +  /* Setup free-running counter for clocksource */  static int __init omap2_sync32k_clocksource_init(void)  {  	int ret; +	struct device_node *np = NULL;  	struct omap_hwmod *oh;  	void __iomem *vbase;  	const char *oh_name = "counter_32k";  	/* +	 * If device-tree is present, then search the DT blob +	 * to see if the 32kHz counter is supported. +	 */ +	if (of_have_populated_dt()) { +		np = omap_get_timer_dt(omap_counter_match, NULL); +		if (!np) +			return -ENODEV; + +		of_property_read_string_index(np, "ti,hwmods", 0, &oh_name); +		if (!oh_name) +			return -ENODEV; +	} + +	/*  	 * First check hwmod data is available for sync32k counter  	 */  	oh = omap_hwmod_lookup(oh_name); @@ -288,7 +423,13 @@ static int __init omap2_sync32k_clocksource_init(void)  	omap_hwmod_setup_one(oh_name); -	vbase = omap_hwmod_get_mpu_rt_va(oh); +	if (np) { +		vbase = of_iomap(np, 0); +		of_node_put(np); +	} else { +		vbase = omap_hwmod_get_mpu_rt_va(oh); +	} +  	if (!vbase) {  		pr_warn("%s: failed to get counter_32k resource\n", __func__);  		return -ENXIO; @@ -310,23 +451,21 @@ static int __init omap2_sync32k_clocksource_init(void)  	return ret;  } -#else -static inline int omap2_sync32k_clocksource_init(void) -{ -	return -ENODEV; -} -#endif  static void __init omap2_gptimer_clocksource_init(int gptimer_id,  						const char *fck_source)  {  	int res; -	res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source); +	clksrc.errata = omap_dm_timer_get_errata(); + +	res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source, NULL, +				     OMAP_TIMER_NONPOSTED);  	BUG_ON(res);  	__omap_dm_timer_load_start(&clksrc, -			OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1); +				   OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, +				   OMAP_TIMER_NONPOSTED);  	setup_sched_clock(dmtimer_read_sched_clock, 32, clksrc.rate);  	if (clocksource_register_hz(&clocksource_gpt, clksrc.rate)) @@ -337,25 +476,6 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id,  			gptimer_id, clksrc.rate);  } -static void __init omap2_clocksource_init(int gptimer_id, -						const char *fck_source) -{ -	/* -	 * First give preference to kernel parameter configuration -	 * by user (clocksource="gp_timer"). -	 * -	 * In case of missing kernel parameter for clocksource, -	 * first check for availability for 32k-sync timer, in case -	 * of failure in finding 32k_counter module or registering -	 * it as clocksource, execution will fallback to gp-timer. -	 */ -	if (use_gptimer_clksrc == true) -		omap2_gptimer_clocksource_init(gptimer_id, fck_source); -	else if (omap2_sync32k_clocksource_init()) -		/* Fall back to gp-timer code */ -		omap2_gptimer_clocksource_init(gptimer_id, fck_source); -} -  #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER  /*   * The realtime counter also called master counter, is a free-running @@ -434,48 +554,65 @@ static inline void __init realtime_counter_init(void)  {}  #endif -#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src,			\ +#define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop,	\ +			       clksrc_nr, clksrc_src)			\ +static void __init omap##name##_gptimer_timer_init(void)		\ +{									\ +	omap_dmtimer_init();						\ +	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\ +	omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);	\ +} + +#define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop,	\  				clksrc_nr, clksrc_src)			\ -static void __init omap##name##_timer_init(void)			\ +static void __init omap##name##_sync32k_timer_init(void)		\  {									\ -	omap2_gp_clockevent_init((clkev_nr), clkev_src);		\ -	omap2_clocksource_init((clksrc_nr), clksrc_src);		\ +	omap_dmtimer_init();						\ +	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\ +	/* Enable the use of clocksource="gp_timer" kernel parameter */	\ +	if (use_gptimer_clksrc)						\ +		omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);\ +	else								\ +		omap2_sync32k_clocksource_init();			\  } -#define OMAP_SYS_TIMER(name)						\ +#define OMAP_SYS_TIMER(name, clksrc)					\  struct sys_timer omap##name##_timer = {					\ -	.init	= omap##name##_timer_init,				\ +	.init	= omap##name##_##clksrc##_timer_init,			\  };  #ifdef CONFIG_ARCH_OMAP2 -OMAP_SYS_TIMER_INIT(2, 1, OMAP2_CLKEV_SOURCE, 2, OMAP2_MPU_SOURCE) -OMAP_SYS_TIMER(2) -#endif +OMAP_SYS_32K_TIMER_INIT(2, 1, OMAP2_32K_SOURCE, "ti,timer-alwon", +			2, OMAP2_MPU_SOURCE); +OMAP_SYS_TIMER(2, sync32k); +#endif /* CONFIG_ARCH_OMAP2 */  #ifdef CONFIG_ARCH_OMAP3 -OMAP_SYS_TIMER_INIT(3, 1, OMAP3_CLKEV_SOURCE, 2, OMAP3_MPU_SOURCE) -OMAP_SYS_TIMER(3) -OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE, -			2, OMAP3_MPU_SOURCE) -OMAP_SYS_TIMER(3_secure) -#endif +OMAP_SYS_32K_TIMER_INIT(3, 1, OMAP3_32K_SOURCE, "ti,timer-alwon", +			2, OMAP3_MPU_SOURCE); +OMAP_SYS_TIMER(3, sync32k); +OMAP_SYS_32K_TIMER_INIT(3_secure, 12, OMAP3_32K_SOURCE, "ti,timer-secure", +			2, OMAP3_MPU_SOURCE); +OMAP_SYS_TIMER(3_secure, sync32k); +OMAP_SYS_GP_TIMER_INIT(3_gp, 1, OMAP3_MPU_SOURCE, "ti,timer-alwon", +		       2, OMAP3_MPU_SOURCE); +OMAP_SYS_TIMER(3_gp, gptimer); +#endif /* CONFIG_ARCH_OMAP3 */  #ifdef CONFIG_SOC_AM33XX -OMAP_SYS_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, 2, OMAP4_MPU_SOURCE) -OMAP_SYS_TIMER(3_am33xx) -#endif +OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon", +		       2, OMAP4_MPU_SOURCE); +OMAP_SYS_TIMER(3_am33xx, gptimer); +#endif /* CONFIG_SOC_AM33XX */  #ifdef CONFIG_ARCH_OMAP4 +OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", +			2, OMAP4_MPU_SOURCE);  #ifdef CONFIG_LOCAL_TIMERS -static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, -			      OMAP44XX_LOCAL_TWD_BASE, 29); -#endif - -static void __init omap4_timer_init(void) +static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); +static void __init omap4_local_timer_init(void)  { -	omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE); -	omap2_clocksource_init(2, OMAP4_MPU_SOURCE); -#ifdef CONFIG_LOCAL_TIMERS +	omap4_sync32k_timer_init();  	/* Local timers are not supprted on OMAP4430 ES1.0 */  	if (omap_rev() != OMAP4430_REV_ES1_0) {  		int err; @@ -489,26 +626,32 @@ static void __init omap4_timer_init(void)  		if (err)  			pr_err("twd_local_timer_register failed %d\n", err);  	} -#endif  } -OMAP_SYS_TIMER(4) -#endif +#else /* CONFIG_LOCAL_TIMERS */ +static inline void omap4_local_timer_init(void) +{ +	omap4_sync32_timer_init(); +} +#endif /* CONFIG_LOCAL_TIMERS */ +OMAP_SYS_TIMER(4, local); +#endif /* CONFIG_ARCH_OMAP4 */  #ifdef CONFIG_SOC_OMAP5 -static void __init omap5_timer_init(void) +OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", +			2, OMAP4_MPU_SOURCE); +static void __init omap5_realtime_timer_init(void)  {  	int err; -	omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE); -	omap2_clocksource_init(2, OMAP4_MPU_SOURCE); +	omap5_sync32k_timer_init();  	realtime_counter_init();  	err = arch_timer_of_register();  	if (err)  		pr_err("%s: arch_timer_register failed %d\n", __func__, err);  } -OMAP_SYS_TIMER(5) -#endif +OMAP_SYS_TIMER(5, realtime); +#endif /* CONFIG_SOC_OMAP5 */  /**   * omap_timer_init - build and register timer device with an @@ -560,6 +703,7 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused)  	if (timer_dev_attr)  		pdata->timer_capability = timer_dev_attr->timer_capability; +	pdata->timer_errata = omap_dm_timer_get_errata();  	pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count;  	pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata), @@ -586,6 +730,10 @@ static int __init omap2_dm_timer_init(void)  {  	int ret; +	/* If dtb is there, the devices will be created dynamically */ +	if (of_have_populated_dt()) +		return -ENODEV; +  	ret = omap_hwmod_for_each_by_class("timer", omap_timer_init, NULL);  	if (unlikely(ret)) {  		pr_err("%s: device registration failed.\n", __func__); diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index 82fcb206b5b..665870dce3c 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig @@ -154,6 +154,12 @@ config OMAP_32K_TIMER  	  intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is  	  currently only available for OMAP16XX, 24XX, 34XX and OMAP4/5. +	  On OMAP2PLUS this value is only used for CONFIG_HZ and +	  CLOCK_TICK_RATE compile time calculation. +	  The actual timer selection is done in the board file +	  through the (DT_)MACHINE_START structure. + +  config OMAP3_L2_AUX_SECURE_SAVE_RESTORE  	bool "OMAP3 HS/EMU save and restore for L2 AUX control register"  	depends on ARCH_OMAP3 && PM diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 82231a75abd..89585c29355 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c @@ -35,11 +35,16 @@   * 675 Mass Ave, Cambridge, MA 02139, USA.   */ +#include <linux/clk.h>  #include <linux/module.h>  #include <linux/io.h>  #include <linux/device.h>  #include <linux/err.h>  #include <linux/pm_runtime.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/platform_data/dmtimer-omap.h>  #include <plat/dmtimer.h> @@ -81,10 +86,6 @@ static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg,  static void omap_timer_restore_context(struct omap_dm_timer *timer)  { -	if (timer->revision == 1) -		__raw_writel(timer->context.tistat, timer->sys_stat); - -	__raw_writel(timer->context.tisr, timer->irq_stat);  	omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG,  				timer->context.twer);  	omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, @@ -100,39 +101,38 @@ static void omap_timer_restore_context(struct omap_dm_timer *timer)  				timer->context.tclr);  } -static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) +static int omap_dm_timer_reset(struct omap_dm_timer *timer)  { -	int c; +	u32 l, timeout = 100000; -	if (!timer->sys_stat) -		return; +	if (timer->revision != 1) +		return -EINVAL; -	c = 0; -	while (!(__raw_readl(timer->sys_stat) & 1)) { -		c++; -		if (c > 100000) { -			printk(KERN_ERR "Timer failed to reset\n"); -			return; -		} -	} -} +	omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); -static void omap_dm_timer_reset(struct omap_dm_timer *timer) -{ -	omap_dm_timer_enable(timer); -	if (timer->pdev->id != 1) { -		omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); -		omap_dm_timer_wait_for_reset(timer); +	do { +		l = __omap_dm_timer_read(timer, +					 OMAP_TIMER_V1_SYS_STAT_OFFSET, 0); +	} while (!l && timeout--); + +	if (!timeout) { +		dev_err(&timer->pdev->dev, "Timer failed to reset\n"); +		return -ETIMEDOUT;  	} -	__omap_dm_timer_reset(timer, 0, 0); -	omap_dm_timer_disable(timer); -	timer->posted = 1; +	/* Configure timer for smart-idle mode */ +	l = __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); +	l |= 0x2 << 0x3; +	__omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l, 0); + +	timer->posted = 0; + +	return 0;  } -int omap_dm_timer_prepare(struct omap_dm_timer *timer) +static int omap_dm_timer_prepare(struct omap_dm_timer *timer)  { -	int ret; +	int rc;  	/*  	 * FIXME: OMAP1 devices do not use the clock framework for dmtimers so @@ -147,13 +147,20 @@ int omap_dm_timer_prepare(struct omap_dm_timer *timer)  		}  	} -	if (timer->capability & OMAP_TIMER_NEEDS_RESET) -		omap_dm_timer_reset(timer); +	omap_dm_timer_enable(timer); + +	if (timer->capability & OMAP_TIMER_NEEDS_RESET) { +		rc = omap_dm_timer_reset(timer); +		if (rc) { +			omap_dm_timer_disable(timer); +			return rc; +		} +	} -	ret = omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); +	__omap_dm_timer_enable_posted(timer); +	omap_dm_timer_disable(timer); -	timer->posted = 1; -	return ret; +	return omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ);  }  static inline u32 omap_dm_timer_reserved_systimer(int id) @@ -209,6 +216,13 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id)  	unsigned long flags;  	int ret = 0; +	/* Requesting timer by ID is not supported when device tree is used */ +	if (of_have_populated_dt()) { +		pr_warn("%s: Please use omap_dm_timer_request_by_cap()\n", +			__func__); +		return NULL; +	} +  	spin_lock_irqsave(&dm_timer_lock, flags);  	list_for_each_entry(t, &omap_timer_list, node) {  		if (t->pdev->id == id && !t->reserved) { @@ -234,6 +248,58 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id)  }  EXPORT_SYMBOL_GPL(omap_dm_timer_request_specific); +/** + * omap_dm_timer_request_by_cap - Request a timer by capability + * @cap:	Bit mask of capabilities to match + * + * Find a timer based upon capabilities bit mask. Callers of this function + * should use the definitions found in the plat/dmtimer.h file under the + * comment "timer capabilities used in hwmod database". Returns pointer to + * timer handle on success and a NULL pointer on failure. + */ +struct omap_dm_timer *omap_dm_timer_request_by_cap(u32 cap) +{ +	struct omap_dm_timer *timer = NULL, *t; +	unsigned long flags; + +	if (!cap) +		return NULL; + +	spin_lock_irqsave(&dm_timer_lock, flags); +	list_for_each_entry(t, &omap_timer_list, node) { +		if ((!t->reserved) && ((t->capability & cap) == cap)) { +			/* +			 * If timer is not NULL, we have already found one timer +			 * but it was not an exact match because it had more +			 * capabilites that what was required. Therefore, +			 * unreserve the last timer found and see if this one +			 * is a better match. +			 */ +			if (timer) +				timer->reserved = 0; + +			timer = t; +			timer->reserved = 1; + +			/* Exit loop early if we find an exact match */ +			if (t->capability == cap) +				break; +		} +	} +	spin_unlock_irqrestore(&dm_timer_lock, flags); + +	if (timer && omap_dm_timer_prepare(timer)) { +		timer->reserved = 0; +		timer = NULL; +	} + +	if (!timer) +		pr_debug("%s: timer request failed!\n", __func__); + +	return timer; +} +EXPORT_SYMBOL_GPL(omap_dm_timer_request_by_cap); +  int omap_dm_timer_free(struct omap_dm_timer *timer)  {  	if (unlikely(!timer)) @@ -388,7 +454,6 @@ int omap_dm_timer_stop(struct omap_dm_timer *timer)  	 */  	timer->context.tclr =  			omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); -	timer->context.tisr = __raw_readl(timer->irq_stat);  	omap_dm_timer_disable(timer);  	return 0;  } @@ -398,7 +463,7 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)  {  	int ret;  	char *parent_name = NULL; -	struct clk *fclk, *parent; +	struct clk *parent;  	struct dmtimer_platform_data *pdata;  	if (unlikely(!timer)) @@ -414,14 +479,11 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)  	 * 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) +	if (pdata && 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__); +	if (!timer->fclk)  		return -EINVAL; -	}  	switch (source) {  	case OMAP_TIMER_SRC_SYS_CLK: @@ -440,18 +502,15 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)  	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; +		return -EINVAL;  	} -	ret = clk_set_parent(fclk, parent); +	ret = clk_set_parent(timer->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;  } @@ -534,8 +593,8 @@ int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,  		l |= OMAP_TIMER_CTRL_CE;  	else  		l &= ~OMAP_TIMER_CTRL_CE; -	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);  	omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); +	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);  	/* Save the context */  	timer->context.tclr = l; @@ -611,6 +670,37 @@ int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); +/** + * omap_dm_timer_set_int_disable - disable timer interrupts + * @timer:	pointer to timer handle + * @mask:	bit mask of interrupts to be disabled + * + * Disables the specified timer interrupts for a timer. + */ +int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask) +{ +	u32 l = mask; + +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer); + +	if (timer->revision == 1) +		l = __raw_readl(timer->irq_ena) & ~mask; + +	__raw_writel(l, timer->irq_dis); +	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask; +	omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, l); + +	/* Save the context */ +	timer->context.tier &= ~mask; +	timer->context.twer &= ~mask; +	omap_dm_timer_disable(timer); +	return 0; +} +EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_disable); +  unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer)  {  	unsigned int l; @@ -632,8 +722,7 @@ int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value)  		return -EINVAL;  	__omap_dm_timer_write_status(timer, value); -	/* Save the context */ -	timer->context.tisr = value; +  	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_write_status); @@ -696,7 +785,7 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev)  	struct device *dev = &pdev->dev;  	struct dmtimer_platform_data *pdata = pdev->dev.platform_data; -	if (!pdata) { +	if (!pdata && !dev->of_node) {  		dev_err(dev, "%s: no platform data.\n", __func__);  		return -ENODEV;  	} @@ -725,12 +814,25 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev)  		return -ENOMEM;  	} -	timer->id = pdev->id; +	if (dev->of_node) { +		if (of_find_property(dev->of_node, "ti,timer-alwon", NULL)) +			timer->capability |= OMAP_TIMER_ALWON; +		if (of_find_property(dev->of_node, "ti,timer-dsp", NULL)) +			timer->capability |= OMAP_TIMER_HAS_DSP_IRQ; +		if (of_find_property(dev->of_node, "ti,timer-pwm", NULL)) +			timer->capability |= OMAP_TIMER_HAS_PWM; +		if (of_find_property(dev->of_node, "ti,timer-secure", NULL)) +			timer->capability |= OMAP_TIMER_SECURE; +	} else { +		timer->id = pdev->id; +		timer->errata = pdata->timer_errata; +		timer->capability = pdata->timer_capability; +		timer->reserved = omap_dm_timer_reserved_systimer(timer->id); +		timer->get_context_loss_count = pdata->get_context_loss_count; +	} +  	timer->irq = irq->start; -	timer->reserved = omap_dm_timer_reserved_systimer(timer->id);  	timer->pdev = pdev; -	timer->capability = pdata->timer_capability; -	timer->get_context_loss_count = pdata->get_context_loss_count;  	/* Skip pm_runtime_enable for OMAP1 */  	if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { @@ -770,7 +872,8 @@ static int __devexit omap_dm_timer_remove(struct platform_device *pdev)  	spin_lock_irqsave(&dm_timer_lock, flags);  	list_for_each_entry(timer, &omap_timer_list, node) -		if (timer->pdev->id == pdev->id) { +		if (!strcmp(dev_name(&timer->pdev->dev), +			    dev_name(&pdev->dev))) {  			list_del(&timer->node);  			ret = 0;  			break; @@ -780,11 +883,18 @@ static int __devexit omap_dm_timer_remove(struct platform_device *pdev)  	return ret;  } +static const struct of_device_id omap_timer_match[] = { +	{ .compatible = "ti,omap2-timer", }, +	{}, +}; +MODULE_DEVICE_TABLE(of, omap_timer_match); +  static struct platform_driver omap_dm_timer_driver = {  	.probe  = omap_dm_timer_probe,  	.remove = __devexit_p(omap_dm_timer_remove),  	.driver = {  		.name   = "omap_timer", +		.of_match_table = of_match_ptr(omap_timer_match),  	},  }; diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index 3f5b9cfd9c0..a3fbc48c332 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h @@ -32,7 +32,6 @@   * 675 Mass Ave, Cambridge, MA 02139, USA.   */ -#include <linux/clk.h>  #include <linux/delay.h>  #include <linux/io.h>  #include <linux/platform_device.h> @@ -55,6 +54,10 @@  #define OMAP_TIMER_TRIGGER_OVERFLOW		0x01  #define OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE	0x02 +/* posted mode types */ +#define OMAP_TIMER_NONPOSTED			0x00 +#define OMAP_TIMER_POSTED			0x01 +  /* timer capabilities used in hwmod database */  #define OMAP_TIMER_SECURE				0x80000000  #define OMAP_TIMER_ALWON				0x40000000 @@ -62,16 +65,22 @@  #define OMAP_TIMER_NEEDS_RESET				0x10000000  #define OMAP_TIMER_HAS_DSP_IRQ				0x08000000 +/* + * timer errata flags + * + * Errata i103/i767 impacts all OMAP3/4/5 devices including AM33xx. This + * errata prevents us from using posted mode on these devices, unless the + * timer counter register is never read. For more details please refer to + * the OMAP3/4/5 errata documents. + */ +#define OMAP_TIMER_ERRATA_I103_I767			0x80000000 +  struct omap_timer_capability_dev_attr {  	u32 timer_capability;  }; -struct omap_dm_timer; -  struct timer_regs {  	u32 tidr; -	u32 tistat; -	u32 tisr;  	u32 tier;  	u32 twer;  	u32 tclr; @@ -90,16 +99,35 @@ struct timer_regs {  	u32 towr;  }; -struct dmtimer_platform_data { -	/* set_timer_src - Only used for OMAP1 devices */ -	int (*set_timer_src)(struct platform_device *pdev, int source); -	u32 timer_capability; +struct omap_dm_timer { +	int id; +	int irq; +	struct clk *fclk; + +	void __iomem	*io_base; +	void __iomem	*irq_stat;	/* TISR/IRQSTATUS interrupt status */ +	void __iomem	*irq_ena;	/* irq enable */ +	void __iomem	*irq_dis;	/* irq disable, only on v2 ip */ +	void __iomem	*pend;		/* write pending */ +	void __iomem	*func_base;	/* function register base */ + +	unsigned long rate; +	unsigned reserved:1; +	unsigned posted:1; +	struct timer_regs context;  	int (*get_context_loss_count)(struct device *); +	int ctx_loss_count; +	int revision; +	u32 capability; +	u32 errata; +	struct platform_device *pdev; +	struct list_head node;  };  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); +struct omap_dm_timer *omap_dm_timer_request_by_cap(u32 cap);  int omap_dm_timer_free(struct omap_dm_timer *timer);  void omap_dm_timer_enable(struct omap_dm_timer *timer);  void omap_dm_timer_disable(struct omap_dm_timer *timer); @@ -121,6 +149,7 @@ int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, i  int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler);  int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); +int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask);  unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer);  int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value); @@ -246,34 +275,6 @@ int omap_dm_timers_active(void);  #define OMAP_TIMER_TICK_INT_MASK_COUNT_REG				\  		(_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT)) -struct omap_dm_timer { -	unsigned long phys_base; -	int id; -	int irq; -	struct clk *fclk; - -	void __iomem	*io_base; -	void __iomem	*sys_stat;	/* TISTAT timer status */ -	void __iomem	*irq_stat;	/* TISR/IRQSTATUS interrupt status */ -	void __iomem	*irq_ena;	/* irq enable */ -	void __iomem	*irq_dis;	/* irq disable, only on v2 ip */ -	void __iomem	*pend;		/* write pending */ -	void __iomem	*func_base;	/* function register base */ - -	unsigned long rate; -	unsigned reserved:1; -	unsigned posted:1; -	struct timer_regs context; -	int (*get_context_loss_count)(struct device *); -	int ctx_loss_count; -	int revision; -	u32 capability; -	struct platform_device *pdev; -	struct list_head node; -}; - -int omap_dm_timer_prepare(struct omap_dm_timer *timer); -  static inline u32 __omap_dm_timer_read(struct omap_dm_timer *timer, u32 reg,  						int posted)  { @@ -302,16 +303,13 @@ static inline void __omap_dm_timer_init_regs(struct omap_dm_timer *timer)  	tidr = __raw_readl(timer->io_base);  	if (!(tidr >> 16)) {  		timer->revision = 1; -		timer->sys_stat = timer->io_base + -				OMAP_TIMER_V1_SYS_STAT_OFFSET;  		timer->irq_stat = timer->io_base + OMAP_TIMER_V1_STAT_OFFSET;  		timer->irq_ena = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET; -		timer->irq_dis = NULL; +		timer->irq_dis = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET;  		timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET;  		timer->func_base = timer->io_base;  	} else {  		timer->revision = 2; -		timer->sys_stat = NULL;  		timer->irq_stat = timer->io_base + OMAP_TIMER_V2_IRQSTATUS;  		timer->irq_ena = timer->io_base + OMAP_TIMER_V2_IRQENABLE_SET;  		timer->irq_dis = timer->io_base + OMAP_TIMER_V2_IRQENABLE_CLR; @@ -322,45 +320,44 @@ static inline void __omap_dm_timer_init_regs(struct omap_dm_timer *timer)  	}  } -/* Assumes the source clock has been set by caller */ -static inline void __omap_dm_timer_reset(struct omap_dm_timer *timer, -					int autoidle, int wakeup) +/* + * __omap_dm_timer_enable_posted - enables write posted mode + * @timer:      pointer to timer instance handle + * + * Enables the write posted mode for the timer. When posted mode is enabled + * writes to certain timer registers are immediately acknowledged by the + * internal bus and hence prevents stalling the CPU waiting for the write to + * complete. Enabling this feature can improve performance for writing to the + * timer registers. + */ +static inline void __omap_dm_timer_enable_posted(struct omap_dm_timer *timer)  { -	u32 l; +	if (timer->posted) +		return; -	l = __raw_readl(timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET); -	l |= 0x02 << 3;  /* Set to smart-idle mode */ -	l |= 0x2 << 8;   /* Set clock activity to perserve f-clock on idle */ +	if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) +		return; -	if (autoidle) -		l |= 0x1 << 0; - -	if (wakeup) -		l |= 1 << 2; - -	__raw_writel(l, timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET); - -	/* Match hardware reset default of posted mode */  	__omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, -					OMAP_TIMER_CTRL_POSTED, 0); +			      OMAP_TIMER_CTRL_POSTED, 0); +	timer->context.tsicr = OMAP_TIMER_CTRL_POSTED; +	timer->posted = OMAP_TIMER_POSTED;  } -static inline int __omap_dm_timer_set_source(struct clk *timer_fck, -						struct clk *parent) +/** + * __omap_dm_timer_override_errata - override errata flags for a timer + * @timer:      pointer to timer handle + * @errata:	errata flags to be ignored + * + * For a given timer, override a timer errata by clearing the flags + * specified by the errata argument. A specific erratum should only be + * overridden for a timer if the timer is used in such a way the erratum + * has no impact. + */ +static inline void __omap_dm_timer_override_errata(struct omap_dm_timer *timer, +						   u32 errata)  { -	int ret; - -	clk_disable(timer_fck); -	ret = clk_set_parent(timer_fck, parent); -	clk_enable(timer_fck); - -	/* -	 * When the functional clock disappears, too quick writes seem -	 * to cause an abort. XXX Is this still necessary? -	 */ -	__delay(300000); - -	return ret; +	timer->errata &= ~errata;  }  static inline void __omap_dm_timer_stop(struct omap_dm_timer *timer,  |