diff options
Diffstat (limited to 'arch/arm/mach-omap2')
40 files changed, 314 insertions, 139 deletions
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index a8ba7b96dcd..e20c8ab80b0 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -33,7 +33,6 @@ config ARCH_OMAP3  	default y  	select CPU_V7  	select USB_ARCH_HAS_EHCI -	select ARM_L1_CACHE_SHIFT_6 if !ARCH_OMAP4  	select ARCH_HAS_OPP  	select PM_OPP if PM  	select ARM_CPU_SUSPEND if PM @@ -214,13 +213,12 @@ config MACH_OMAP3_PANDORA  	depends on ARCH_OMAP3  	default y  	select OMAP_PACKAGE_CBB -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_OMAP3_TOUCHBOOK  	bool "OMAP3 Touch Book"  	depends on ARCH_OMAP3  	default y -	select BACKLIGHT_CLASS_DEVICE  config MACH_OMAP_3430SDP  	bool "OMAP 3430 SDP board" @@ -266,7 +264,7 @@ config MACH_OMAP_ZOOM2  	select SERIAL_8250  	select SERIAL_CORE_CONSOLE  	select SERIAL_8250_CONSOLE -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_OMAP_ZOOM3  	bool "OMAP3630 Zoom3 board" @@ -276,7 +274,7 @@ config MACH_OMAP_ZOOM3  	select SERIAL_8250  	select SERIAL_CORE_CONSOLE  	select SERIAL_8250_CONSOLE -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_CM_T35  	bool "CompuLab CM-T35/CM-T3730 modules" @@ -335,7 +333,7 @@ config MACH_OMAP_4430SDP  	depends on ARCH_OMAP4  	select OMAP_PACKAGE_CBL  	select OMAP_PACKAGE_CBS -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_OMAP4_PANDA  	bool "OMAP4 Panda Board" @@ -343,7 +341,7 @@ config MACH_OMAP4_PANDA  	depends on ARCH_OMAP4  	select OMAP_PACKAGE_CBL  	select OMAP_PACKAGE_CBS -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config OMAP3_EMU  	bool "OMAP3 debugging peripherals" @@ -366,8 +364,8 @@ config OMAP3_SDRC_AC_TIMING  	  going on could result in system crashes;  config OMAP4_ERRATA_I688 -	bool "OMAP4 errata: Async Bridge Corruption (BROKEN)" -	depends on ARCH_OMAP4 && BROKEN +	bool "OMAP4 errata: Async Bridge Corruption" +	depends on ARCH_OMAP4  	select ARCH_HAS_BARRIERS  	help  	  If a data is stalled inside asynchronous bridge because of back diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index fc9b238cbc1..bd76394ccaf 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -11,9 +11,9 @@ hwmod-common				= omap_hwmod.o \  					  omap_hwmod_common_data.o  clock-common				= clock.o clock_common_data.o \  					  clkt_dpll.o clkt_clksel.o -secure-common                          = omap-smc.o omap-secure.o +secure-common				= omap-smc.o omap-secure.o -obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) $(secure-common) +obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common)  obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)  obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 39fba9df17f..4e9071589bf 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -52,8 +52,9 @@  #define ETH_KS8851_QUART		138  #define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO	184  #define OMAP4_SFH7741_ENABLE_GPIO		188 -#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ +#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */  #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ +#define HDMI_GPIO_HPD  63 /* Hotplug detect */  #define DISPLAY_SEL_GPIO	59	/* LCD2/PicoDLP switch */  #define DLP_POWER_ON_GPIO	40 @@ -603,8 +604,9 @@ static void __init omap_sfh7741prox_init(void)  }  static struct gpio sdp4430_hdmi_gpios[] = { -	{ HDMI_GPIO_HPD,	GPIOF_OUT_INIT_HIGH,	"hdmi_gpio_hpd"   }, +	{ HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },  	{ HDMI_GPIO_LS_OE,	GPIOF_OUT_INIT_HIGH,	"hdmi_gpio_ls_oe" }, +	{ HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },  };  static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) @@ -621,8 +623,7 @@ static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev)  static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev)  { -	gpio_free(HDMI_GPIO_LS_OE); -	gpio_free(HDMI_GPIO_HPD); +	gpio_free_array(sdp4430_hdmi_gpios, ARRAY_SIZE(sdp4430_hdmi_gpios));  }  static struct nokia_dsi_panel_data dsi1_panel = { @@ -738,6 +739,10 @@ static void sdp4430_lcd_init(void)  		pr_err("%s: Could not get lcd2_reset_gpio\n", __func__);  } +static struct omap_dss_hdmi_data sdp4430_hdmi_data = { +	.hpd_gpio = HDMI_GPIO_HPD, +}; +  static struct omap_dss_device sdp4430_hdmi_device = {  	.name = "hdmi",  	.driver_name = "hdmi_panel", @@ -745,6 +750,7 @@ static struct omap_dss_device sdp4430_hdmi_device = {  	.platform_enable = sdp4430_panel_enable_hdmi,  	.platform_disable = sdp4430_panel_disable_hdmi,  	.channel = OMAP_DSS_CHANNEL_DIGIT, +	.data = &sdp4430_hdmi_data,  };  static struct picodlp_panel_data sdp4430_picodlp_pdata = { @@ -808,7 +814,7 @@ static struct omap_dss_board_info sdp4430_dss_data = {  	.default_device	= &sdp4430_lcd_device,  }; -static void omap_4430sdp_display_init(void) +static void __init omap_4430sdp_display_init(void)  {  	int r; @@ -829,6 +835,10 @@ static void omap_4430sdp_display_init(void)  		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP);  	else  		omap_hdmi_init(0); + +	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);  }  #ifdef CONFIG_OMAP_MUX @@ -841,7 +851,7 @@ static struct omap_board_mux board_mux[] __initdata = {  #define board_mux	NULL   #endif -static void omap4_sdp4430_wifi_mux_init(void) +static void __init omap4_sdp4430_wifi_mux_init(void)  {  	omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT |  				OMAP_PIN_OFF_WAKEUPENABLE); @@ -868,12 +878,17 @@ static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {  	.board_tcxo_clock = WL12XX_TCXOCLOCK_26,  }; -static void omap4_sdp4430_wifi_init(void) +static void __init omap4_sdp4430_wifi_init(void)  { +	int ret; +  	omap4_sdp4430_wifi_mux_init(); -	if (wl12xx_set_platform_data(&omap4_sdp4430_wlan_data)) -		pr_err("Error setting wl12xx data\n"); -	platform_device_register(&omap_vwlan_device); +	ret = wl12xx_set_platform_data(&omap4_sdp4430_wlan_data); +	if (ret) +		pr_err("Error setting wl12xx data: %d\n", ret); +	ret = platform_device_register(&omap_vwlan_device); +	if (ret) +		pr_err("Error registering wl12xx device: %d\n", ret);  }  static void __init omap_4430sdp_init(void) diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index e921e3be24a..d73316ed420 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c @@ -437,7 +437,7 @@ static struct usbhs_omap_board_data usbhs_bdata __initdata = {  	.reset_gpio_port[2]  = -EINVAL  }; -static void cm_t35_init_usbh(void) +static void  __init cm_t35_init_usbh(void)  {  	int err; diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index d5875606048..ad497620539 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -17,6 +17,7 @@  #include <linux/i2c/twl.h>  #include <mach/hardware.h> +#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include <plat/board.h> @@ -102,6 +103,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")  	.map_io		= omap242x_map_io,  	.init_early	= omap2420_init_early,  	.init_irq	= omap2_init_irq, +	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer,  	.dt_compat	= omap242x_boards_compat, @@ -141,6 +143,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  	.map_io		= omap3_map_io,  	.init_early	= omap3430_init_early,  	.init_irq	= omap3_init_irq, +	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3_init,  	.timer		= &omap3_timer,  	.dt_compat	= omap3_boards_compat, @@ -160,6 +163,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early,  	.init_irq	= gic_init_irq, +	.handle_irq	= gic_handle_irq,  	.init_machine	= omap4_init,  	.timer		= &omap4_timer,  	.dt_compat	= omap4_boards_compat, diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 42a4d11fad2..67226271760 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -371,7 +371,11 @@ static void n8x0_mmc_callback(void *data, u8 card_mask)  	else  		*openp = 0; +#ifdef CONFIG_MMC_OMAP  	omap_mmc_notify_cover_event(mmc_device, index, *openp); +#else +	pr_warn("MMC: notify cover event not available\n"); +#endif  }  static int n8x0_mmc_late_init(struct device *dev) diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 003fe34c934..c877236a844 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c @@ -381,7 +381,7 @@ static int omap3evm_twl_gpio_setup(struct device *dev,  	gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");  	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ -	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; +	gpio_leds[0].gpio = gpio + TWL4030_GPIO_MAX + 1;  	platform_device_register(&leds_gpio); @@ -617,6 +617,21 @@ static struct gpio omap3_evm_ehci_gpios[] __initdata = {  	{ OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW,   "select EHCI port" },  }; +static void __init omap3_evm_wl12xx_init(void) +{ +#ifdef CONFIG_WL12XX_PLATFORM_DATA +	int ret; + +	/* WL12xx WLAN Init */ +	ret = wl12xx_set_platform_data(&omap3evm_wlan_data); +	if (ret) +		pr_err("error setting wl12xx data: %d\n", ret); +	ret = platform_device_register(&omap3evm_wlan_regulator); +	if (ret) +		pr_err("error registering wl12xx device: %d\n", ret); +#endif +} +  static void __init omap3_evm_init(void)  {  	omap3_evm_get_revision(); @@ -665,13 +680,7 @@ static void __init omap3_evm_init(void)  	omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL);  	omap3evm_init_smsc911x();  	omap3_evm_display_init(); - -#ifdef CONFIG_WL12XX_PLATFORM_DATA -	/* WL12xx WLAN Init */ -	if (wl12xx_set_platform_data(&omap3evm_wlan_data)) -		pr_err("error setting wl12xx data\n"); -	platform_device_register(&omap3evm_wlan_regulator); -#endif +	omap3_evm_wl12xx_init();  }  MACHINE_START(OMAP3EVM, "OMAP3 EVM") diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 30ad40db2cf..28fc271f703 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -51,8 +51,9 @@  #define GPIO_HUB_NRESET		62  #define GPIO_WIFI_PMENA		43  #define GPIO_WIFI_IRQ		53 -#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ +#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */  #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ +#define HDMI_GPIO_HPD  63 /* Hotplug detect */  /* wl127x BT, FM, GPS connectivity chip */  static int wl1271_gpios[] = {46, -1, -1}; @@ -413,8 +414,9 @@ int __init omap4_panda_dvi_init(void)  }  static struct gpio panda_hdmi_gpios[] = { -	{ HDMI_GPIO_HPD,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd"   }, +	{ HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },  	{ HDMI_GPIO_LS_OE,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, +	{ HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },  };  static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) @@ -431,10 +433,13 @@ static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)  static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev)  { -	gpio_free(HDMI_GPIO_LS_OE); -	gpio_free(HDMI_GPIO_HPD); +	gpio_free_array(panda_hdmi_gpios, ARRAY_SIZE(panda_hdmi_gpios));  } +static struct omap_dss_hdmi_data omap4_panda_hdmi_data = { +	.hpd_gpio = HDMI_GPIO_HPD, +}; +  static struct omap_dss_device  omap4_panda_hdmi_device = {  	.name = "hdmi",  	.driver_name = "hdmi_panel", @@ -442,6 +447,7 @@ static struct omap_dss_device  omap4_panda_hdmi_device = {  	.platform_enable = omap4_panda_panel_enable_hdmi,  	.platform_disable = omap4_panda_panel_disable_hdmi,  	.channel = OMAP_DSS_CHANNEL_DIGIT, +	.data = &omap4_panda_hdmi_data,  };  static struct omap_dss_device *omap4_panda_dss_devices[] = { @@ -473,18 +479,24 @@ void omap4_panda_display_init(void)  		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP);  	else  		omap_hdmi_init(0); + +	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);  }  static void __init omap4_panda_init(void)  {  	int package = OMAP_PACKAGE_CBS; +	int ret;  	if (omap_rev() == OMAP4430_REV_ES1_0)  		package = OMAP_PACKAGE_CBL;  	omap4_mux_init(board_mux, NULL, package); -	if (wl12xx_set_platform_data(&omap_panda_wlan_data)) -		pr_err("error setting wl12xx data\n"); +	ret = wl12xx_set_platform_data(&omap_panda_wlan_data); +	if (ret) +		pr_err("error setting wl12xx data: %d\n", ret);  	omap4_panda_i2c_init();  	platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 8d7ce11cfea..c126461836a 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c @@ -296,8 +296,10 @@ static void enable_board_wakeup_source(void)  void __init zoom_peripherals_init(void)  { -	if (wl12xx_set_platform_data(&omap_zoom_wlan_data)) -		pr_err("error setting wl12xx data\n"); +	int ret = wl12xx_set_platform_data(&omap_zoom_wlan_data); + +	if (ret) +		pr_err("error setting wl12xx data: %d\n", ret);  	omap_i2c_init();  	platform_device_register(&omap_vwlan_device); diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index febffde2ff1..7e9338e8d68 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -132,6 +132,7 @@ void omap3_map_io(void);  void am33xx_map_io(void);  void omap4_map_io(void);  void ti81xx_map_io(void); +void omap_barriers_init(void);  /**   * omap_test_timeout - busy-loop, testing a condition diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c index cfdbb86bc84..72e018b9b26 100644 --- a/arch/arm/mach-omap2/cpuidle44xx.c +++ b/arch/arm/mach-omap2/cpuidle44xx.c @@ -65,7 +65,6 @@ static int omap4_enter_idle(struct cpuidle_device *dev,  	struct timespec ts_preidle, ts_postidle, ts_idle;  	u32 cpu1_state;  	int idle_time; -	int new_state_idx;  	int cpu_id = smp_processor_id();  	/* Used to keep track of the total time in idle */ @@ -84,8 +83,8 @@ static int omap4_enter_idle(struct cpuidle_device *dev,  	 */  	cpu1_state = pwrdm_read_pwrst(cpu1_pd);  	if (cpu1_state != PWRDM_POWER_OFF) { -		new_state_idx = drv->safe_state_index; -		cx = cpuidle_get_statedata(&dev->states_usage[new_state_idx]); +		index = drv->safe_state_index; +		cx = cpuidle_get_statedata(&dev->states_usage[index]);  	}  	if (index > 0) diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 0b510ad01a0..283d11eae69 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -405,6 +405,7 @@ static int omap_mcspi_init(struct omap_hwmod *oh, void *unused)  			break;  	default:  			pr_err("Invalid McSPI Revision value\n"); +			kfree(pdata);  			return -EINVAL;  	} diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 3c446d1a178..3677b1f58b8 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c @@ -103,12 +103,8 @@ static void omap4_hdmi_mux_pads(enum omap_hdmi_flags flags)  	u32 reg;  	u16 control_i2c_1; -	/* PAD0_HDMI_HPD_PAD1_HDMI_CEC */ -	omap_mux_init_signal("hdmi_hpd", -			OMAP_PIN_INPUT_PULLUP);  	omap_mux_init_signal("hdmi_cec",  			OMAP_PIN_INPUT_PULLUP); -	/* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */  	omap_mux_init_signal("hdmi_ddc_scl",  			OMAP_PIN_INPUT_PULLUP);  	omap_mux_init_signal("hdmi_ddc_sda", diff --git a/arch/arm/mach-omap2/gpmc-smsc911x.c b/arch/arm/mach-omap2/gpmc-smsc911x.c index 997033129d2..bbb870c04a5 100644 --- a/arch/arm/mach-omap2/gpmc-smsc911x.c +++ b/arch/arm/mach-omap2/gpmc-smsc911x.c @@ -19,6 +19,8 @@  #include <linux/interrupt.h>  #include <linux/io.h>  #include <linux/smsc911x.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <plat/board.h>  #include <plat/gpmc.h> @@ -42,6 +44,50 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {  	.flags		= SMSC911X_USE_16BIT,  }; +static struct regulator_consumer_supply gpmc_smsc911x_supply[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x.0"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), +}; + +/* Generic regulator definition to satisfy smsc911x */ +static struct regulator_init_data gpmc_smsc911x_reg_init_data = { +	.constraints = { +		.min_uV			= 3300000, +		.max_uV			= 3300000, +		.valid_modes_mask	= REGULATOR_MODE_NORMAL +					| REGULATOR_MODE_STANDBY, +		.valid_ops_mask		= REGULATOR_CHANGE_MODE +					| REGULATOR_CHANGE_STATUS, +	}, +	.num_consumer_supplies	= ARRAY_SIZE(gpmc_smsc911x_supply), +	.consumer_supplies	= gpmc_smsc911x_supply, +}; + +static struct fixed_voltage_config gpmc_smsc911x_fixed_reg_data = { +	.supply_name		= "gpmc_smsc911x", +	.microvolts		= 3300000, +	.gpio			= -EINVAL, +	.startup_delay		= 0, +	.enable_high		= 0, +	.enabled_at_boot	= 1, +	.init_data		= &gpmc_smsc911x_reg_init_data, +}; + +/* + * Platform device id of 42 is a temporary fix to avoid conflicts + * with other reg-fixed-voltage devices. The real fix should + * involve the driver core providing a way of dynamically + * assigning a unique id on registration for platform devices + * in the same name space. + */ +static struct platform_device gpmc_smsc911x_regulator = { +	.name		= "reg-fixed-voltage", +	.id		= 42, +	.dev = { +		.platform_data	= &gpmc_smsc911x_fixed_reg_data, +	}, +}; +  /*   * Initialize smsc911x device connected to the GPMC. Note that we   * assume that pin multiplexing is done in the board-*.c file, @@ -55,6 +101,12 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)  	gpmc_cfg = board_data; +	ret = platform_device_register(&gpmc_smsc911x_regulator); +	if (ret < 0) { +		pr_err("Unable to register smsc911x regulators: %d\n", ret); +		return; +	} +  	if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) {  		pr_err("Failed to request GPMC mem region\n");  		return; diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 130034bf01d..dfffbbf4c00 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c @@ -528,7 +528,13 @@ int gpmc_cs_configure(int cs, int cmd, int wval)  	case GPMC_CONFIG_DEV_SIZE:  		regval  = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); + +		/* clear 2 target bits */ +		regval &= ~GPMC_CONFIG1_DEVICESIZE(3); + +		/* set the proper value */  		regval |= GPMC_CONFIG1_DEVICESIZE(wval); +  		gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, regval);  		break; diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index bd844af13af..19dd1657245 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c @@ -175,14 +175,15 @@ static void hsmmc2_select_input_clk_src(struct omap_mmc_platform_data *mmc)  {  	u32 reg; -	if (mmc->slots[0].internal_clock) { -		reg = omap_ctrl_readl(control_devconf1_offset); +	reg = omap_ctrl_readl(control_devconf1_offset); +	if (mmc->slots[0].internal_clock)  		reg |= OMAP2_MMCSDIO2ADPCLKISEL; -		omap_ctrl_writel(reg, control_devconf1_offset); -	} +	else +		reg &= ~OMAP2_MMCSDIO2ADPCLKISEL; +	omap_ctrl_writel(reg, control_devconf1_offset);  } -static void hsmmc23_before_set_reg(struct device *dev, int slot, +static void hsmmc2_before_set_reg(struct device *dev, int slot,  				   int power_on, int vdd)  {  	struct omap_mmc_platform_data *mmc = dev->platform_data; @@ -292,8 +293,8 @@ static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller,  	}  } -static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, -					struct omap_mmc_platform_data *mmc) +static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, +				 struct omap_mmc_platform_data *mmc)  {  	char *hc_name; @@ -407,14 +408,13 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,  			c->caps &= ~MMC_CAP_8_BIT_DATA;  			c->caps |= MMC_CAP_4_BIT_DATA;  		} -		/* FALLTHROUGH */ -	case 3:  		if (mmc->slots[0].features & HSMMC_HAS_PBIAS) {  			/* off-chip level shifting, or none */ -			mmc->slots[0].before_set_reg = hsmmc23_before_set_reg; +			mmc->slots[0].before_set_reg = hsmmc2_before_set_reg;  			mmc->slots[0].after_set_reg = NULL;  		}  		break; +	case 3:  	case 4:  	case 5:  		mmc->slots[0].before_set_reg = NULL; @@ -428,9 +428,10 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,  	return 0;  } +static int omap_hsmmc_done;  #define MAX_OMAP_MMC_HWMOD_NAME_LEN		16 -void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) +void omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr)  {  	struct omap_hwmod *oh;  	struct platform_device *pdev; @@ -487,10 +488,15 @@ done:  	kfree(mmc_data);  } -void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) +void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)  {  	u32 reg; +	if (omap_hsmmc_done) +		return; + +	omap_hsmmc_done = 1; +  	if (!cpu_is_omap44xx()) {  		if (cpu_is_omap2430()) {  			control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 6c5826605ea..719ee423abe 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -343,6 +343,7 @@ static void __init omap3_check_revision(const char **cpu_rev)  	case 0xb944:  		omap_revision = AM335X_REV_ES1_0;  		*cpu_rev = "1.0"; +		break;  	case 0xb8f2:  		switch (rev) {  		case 0: diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 3f174d51f67..fb11b44fbde 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -307,6 +307,7 @@ void __init omapam33xx_map_common_io(void)  void __init omap44xx_map_common_io(void)  {  	iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc)); +	omap_barriers_init();  }  #endif @@ -388,7 +389,7 @@ static void __init omap_hwmod_init_postsetup(void)  	omap_pm_if_early_init();  } -#ifdef CONFIG_ARCH_OMAP2 +#ifdef CONFIG_SOC_OMAP2420  void __init omap2420_init_early(void)  {  	omap2_set_globals_242x(); @@ -400,7 +401,9 @@ void __init omap2420_init_early(void)  	omap_hwmod_init_postsetup();  	omap2420_clk_init();  } +#endif +#ifdef CONFIG_SOC_OMAP2430  void __init omap2430_init_early(void)  {  	omap2_set_globals_243x(); diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 609ea2ded7e..415a6f1cf41 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -281,8 +281,16 @@ static struct omap_mbox mbox_iva_info = {  	.ops	= &omap2_mbox_ops,  	.priv	= &omap2_mbox_iva_priv,  }; +#endif -struct omap_mbox *omap2_mboxes[] = { &mbox_dsp_info, &mbox_iva_info, NULL }; +#ifdef CONFIG_ARCH_OMAP2 +struct omap_mbox *omap2_mboxes[] = { +	&mbox_dsp_info, +#ifdef CONFIG_SOC_OMAP2420 +	&mbox_iva_info, +#endif +	NULL +};  #endif  #if defined(CONFIG_ARCH_OMAP4) diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index e1cc75d1a57..611a0e3d54c 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c @@ -100,8 +100,8 @@ void omap_mux_write_array(struct omap_mux_partition *partition,  static char *omap_mux_options; -static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition, -				      int gpio, int val) +static int _omap_mux_init_gpio(struct omap_mux_partition *partition, +			       int gpio, int val)  {  	struct omap_mux_entry *e;  	struct omap_mux *gpio_mux = NULL; @@ -145,7 +145,7 @@ static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition,  	return 0;  } -int __init omap_mux_init_gpio(int gpio, int val) +int omap_mux_init_gpio(int gpio, int val)  {  	struct omap_mux_partition *partition;  	int ret; @@ -159,9 +159,9 @@ int __init omap_mux_init_gpio(int gpio, int val)  	return -ENODEV;  } -static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition, -					const char *muxname, -					struct omap_mux **found_mux) +static int _omap_mux_get_by_name(struct omap_mux_partition *partition, +				 const char *muxname, +				 struct omap_mux **found_mux)  {  	struct omap_mux *mux = NULL;  	struct omap_mux_entry *e; @@ -218,7 +218,7 @@ static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,  	return -ENODEV;  } -static int __init +static int  omap_mux_get_by_name(const char *muxname,  			struct omap_mux_partition **found_partition,  			struct omap_mux **found_mux) @@ -240,7 +240,7 @@ omap_mux_get_by_name(const char *muxname,  	return -ENODEV;  } -int __init omap_mux_init_signal(const char *muxname, int val) +int omap_mux_init_signal(const char *muxname, int val)  {  	struct omap_mux_partition *partition = NULL;  	struct omap_mux *mux = NULL; @@ -1094,8 +1094,8 @@ static void omap_mux_init_package(struct omap_mux *superset,  		omap_mux_package_init_balls(package_balls, superset);  } -static void omap_mux_init_signals(struct omap_mux_partition *partition, -				  struct omap_board_mux *board_mux) +static void __init omap_mux_init_signals(struct omap_mux_partition *partition, +					 struct omap_board_mux *board_mux)  {  	omap_mux_set_cmdline_signals();  	omap_mux_write_array(partition, board_mux); @@ -1109,8 +1109,8 @@ static void omap_mux_init_package(struct omap_mux *superset,  {  } -static void omap_mux_init_signals(struct omap_mux_partition *partition, -				  struct omap_board_mux *board_mux) +static void __init omap_mux_init_signals(struct omap_mux_partition *partition, +					 struct omap_board_mux *board_mux)  {  } diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index b13ef7ef5ef..503ac777a2b 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S @@ -18,6 +18,7 @@  #include <linux/linkage.h>  #include <linux/init.h> +	__CPUINIT  /*   * OMAP4 specific entry point for secondary CPU to jump from ROM   * code.  This routine also provides a holding flag into which diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 40a8fbc07e4..70de277f5c1 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c @@ -24,12 +24,14 @@  #include <plat/irqs.h>  #include <plat/sram.h> +#include <plat/omap-secure.h>  #include <mach/hardware.h>  #include <mach/omap-wakeupgen.h>  #include "common.h"  #include "omap4-sar-layout.h" +#include <linux/export.h>  #ifdef CONFIG_CACHE_L2X0  static void __iomem *l2cache_base; @@ -43,6 +45,9 @@ static void __iomem *sar_ram_base;  void __iomem *dram_sync, *sram_sync; +static phys_addr_t paddr; +static u32 size; +  void omap_bus_sync(void)  {  	if (dram_sync && sram_sync) { @@ -51,19 +56,22 @@ void omap_bus_sync(void)  		isb();  	}  } +EXPORT_SYMBOL(omap_bus_sync); -static int __init omap_barriers_init(void) +/* Steal one page physical memory for barrier implementation */ +int __init omap_barrier_reserve_memblock(void)  { -	struct map_desc dram_io_desc[1]; -	phys_addr_t paddr; -	u32 size; - -	if (!cpu_is_omap44xx()) -		return -ENODEV;  	size = ALIGN(PAGE_SIZE, SZ_1M);  	paddr = arm_memblock_steal(size, SZ_1M); +	return 0; +} + +void __init omap_barriers_init(void) +{ +	struct map_desc dram_io_desc[1]; +  	dram_io_desc[0].virtual = OMAP4_DRAM_BARRIER_VA;  	dram_io_desc[0].pfn = __phys_to_pfn(paddr);  	dram_io_desc[0].length = size; @@ -75,9 +83,10 @@ static int __init omap_barriers_init(void)  	pr_info("OMAP4: Map 0x%08llx to 0x%08lx for dram barrier\n",  		(long long) paddr, dram_io_desc[0].virtual); -	return 0;  } -core_initcall(omap_barriers_init); +#else +void __init omap_barriers_init(void) +{}  #endif  void __init gic_init_irq(void) diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 5192cabb40e..eba6cd3816f 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -1517,8 +1517,8 @@ static int _enable(struct omap_hwmod *oh)  	if (oh->_state != _HWMOD_STATE_INITIALIZED &&  	    oh->_state != _HWMOD_STATE_IDLE &&  	    oh->_state != _HWMOD_STATE_DISABLED) { -		WARN(1, "omap_hwmod: %s: enabled state can only be entered " -		     "from initialized, idle, or disabled state\n", oh->name); +		WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n", +			oh->name);  		return -EINVAL;  	} @@ -1600,8 +1600,8 @@ static int _idle(struct omap_hwmod *oh)  	pr_debug("omap_hwmod: %s: idling\n", oh->name);  	if (oh->_state != _HWMOD_STATE_ENABLED) { -		WARN(1, "omap_hwmod: %s: idle state can only be entered from " -		     "enabled state\n", oh->name); +		WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n", +			oh->name);  		return -EINVAL;  	} @@ -1682,8 +1682,8 @@ static int _shutdown(struct omap_hwmod *oh)  	if (oh->_state != _HWMOD_STATE_IDLE &&  	    oh->_state != _HWMOD_STATE_ENABLED) { -		WARN(1, "omap_hwmod: %s: disabled state can only be entered " -		     "from idle, or enabled state\n", oh->name); +		WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n", +			oh->name);  		return -EINVAL;  	} @@ -2240,8 +2240,8 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)  	BUG_ON(!oh);  	if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { -		WARN(1, "omap_device: %s: OCP barrier impossible due to " -		      "device configuration\n", oh->name); +		WARN(1, "omap_device: %s: OCP barrier impossible due to device configuration\n", +			oh->name);  		return;  	} diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c index c11273da5dc..f08e442af39 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c @@ -56,27 +56,6 @@ struct omap_hwmod_class omap2_dss_hwmod_class = {  };  /* - * 'dispc' class - * display controller - */ - -static struct omap_hwmod_class_sysconfig omap2_dispc_sysc = { -	.rev_offs	= 0x0000, -	.sysc_offs	= 0x0010, -	.syss_offs	= 0x0014, -	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE | -			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), -	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | -			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), -	.sysc_fields	= &omap_hwmod_sysc_type1, -}; - -struct omap_hwmod_class omap2_dispc_hwmod_class = { -	.name	= "dispc", -	.sysc	= &omap2_dispc_sysc, -}; - -/*   * 'rfbi' class   * remote frame buffer interface   */ 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 177dee20fae..2a6729741b0 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c @@ -28,6 +28,28 @@ struct omap_hwmod_dma_info omap2xxx_dss_sdma_chs[] = {  	{ .name = "dispc", .dma_req = 5 },  	{ .dma_req = -1 }  }; + +/* + * 'dispc' class + * display controller + */ + +static struct omap_hwmod_class_sysconfig omap2_dispc_sysc = { +	.rev_offs	= 0x0000, +	.sysc_offs	= 0x0010, +	.syss_offs	= 0x0014, +	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE | +			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), +	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | +			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), +	.sysc_fields	= &omap_hwmod_sysc_type1, +}; + +struct omap_hwmod_class omap2_dispc_hwmod_class = { +	.name	= "dispc", +	.sysc	= &omap2_dispc_sysc, +}; +  /* OMAP2xxx Timer Common */  static struct omap_hwmod_class_sysconfig omap2xxx_timer_sysc = {  	.rev_offs	= 0x0000, diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 5324e8d93bc..3c8dd928628 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -1480,6 +1480,28 @@ static struct omap_hwmod omap3xxx_dss_core_hwmod = {  	.masters_cnt	= ARRAY_SIZE(omap3xxx_dss_masters),  }; +/* + * 'dispc' class + * display controller + */ + +static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = { +	.rev_offs	= 0x0000, +	.sysc_offs	= 0x0010, +	.syss_offs	= 0x0014, +	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE | +			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | +			   SYSC_HAS_ENAWAKEUP), +	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | +			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), +	.sysc_fields	= &omap_hwmod_sysc_type1, +}; + +static struct omap_hwmod_class omap3_dispc_hwmod_class = { +	.name	= "dispc", +	.sysc	= &omap3_dispc_sysc, +}; +  /* l4_core -> dss_dispc */  static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = {  	.master		= &omap3xxx_l4_core_hwmod, @@ -1503,7 +1525,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_dispc_slaves[] = {  static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {  	.name		= "dss_dispc", -	.class		= &omap2_dispc_hwmod_class, +	.class		= &omap3_dispc_hwmod_class,  	.mpu_irqs	= omap2_dispc_irqs,  	.main_clk	= "dss1_alwon_fck",  	.prcm		= { @@ -3523,12 +3545,6 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {  	&omap3xxx_uart2_hwmod,  	&omap3xxx_uart3_hwmod, -	/* dss class */ -	&omap3xxx_dss_dispc_hwmod, -	&omap3xxx_dss_dsi1_hwmod, -	&omap3xxx_dss_rfbi_hwmod, -	&omap3xxx_dss_venc_hwmod, -  	/* i2c class */  	&omap3xxx_i2c1_hwmod,  	&omap3xxx_i2c2_hwmod, @@ -3635,6 +3651,15 @@ static __initdata struct omap_hwmod *am35xx_hwmods[] = {  	NULL  }; +static __initdata struct omap_hwmod *omap3xxx_dss_hwmods[] = { +	/* dss class */ +	&omap3xxx_dss_dispc_hwmod, +	&omap3xxx_dss_dsi1_hwmod, +	&omap3xxx_dss_rfbi_hwmod, +	&omap3xxx_dss_venc_hwmod, +	NULL +}; +  int __init omap3xxx_hwmod_init(void)  {  	int r; @@ -3708,6 +3733,21 @@ int __init omap3xxx_hwmod_init(void)  	if (h)  		r = omap_hwmod_register(h); +	if (r < 0) +		return r; + +	/* +	 * DSS code presumes that dss_core hwmod is handled first, +	 * _before_ any other DSS related hwmods so register common +	 * DSS hwmods last to ensure that dss_core is already registered. +	 * Otherwise some change things may happen, for ex. if dispc +	 * is handled before dss_core and DSS is enabled in bootloader +	 * DIPSC will be reset with outputs enabled which sometimes leads +	 * to unrecoverable L3 error. +	 * XXX The long-term fix to this is to ensure modules are set up +	 * in dependency order in the hwmod core code. +	 */ +	r = omap_hwmod_register(omap3xxx_dss_hwmods);  	return r;  } diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index f9f15108176..ef0524c10a8 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -1031,6 +1031,7 @@ static struct omap_hwmod_dma_info omap44xx_dmic_sdma_reqs[] = {  static struct omap_hwmod_addr_space omap44xx_dmic_addrs[] = {  	{ +		.name		= "mpu",  		.pa_start	= 0x4012e000,  		.pa_end		= 0x4012e07f,  		.flags		= ADDR_TYPE_RT @@ -1049,6 +1050,7 @@ static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic = {  static struct omap_hwmod_addr_space omap44xx_dmic_dma_addrs[] = {  	{ +		.name		= "dma",  		.pa_start	= 0x4902e000,  		.pa_end		= 0x4902e07f,  		.flags		= ADDR_TYPE_RT diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 1881fe91514..5a65dd04aa3 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -174,14 +174,17 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,  	freq = clk->rate;  	clk_put(clk); +	rcu_read_lock();  	opp = opp_find_freq_ceil(dev, &freq);  	if (IS_ERR(opp)) { +		rcu_read_unlock();  		pr_err("%s: unable to find boot up OPP for vdd_%s\n",  			__func__, vdd_name);  		goto exit;  	}  	bootup_volt = opp_get_voltage(opp); +	rcu_read_unlock();  	if (!bootup_volt) {  		pr_err("%s: unable to find voltage corresponding "  			"to the bootup OPP for vdd_%s\n", __func__, vdd_name); diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index b8822f8b289..23de98d0384 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -82,13 +82,7 @@ static int omap2_fclks_active(void)  	f1 = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);  	f2 = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2); -	/* Ignore UART clocks.  These are handled by UART core (serial.c) */ -	f1 &= ~(OMAP24XX_EN_UART1_MASK | OMAP24XX_EN_UART2_MASK); -	f2 &= ~OMAP24XX_EN_UART3_MASK; - -	if (f1 | f2) -		return 1; -	return 0; +	return (f1 | f2) ? 1 : 0;  }  static void omap2_enter_full_retention(void) diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index c1c4d86a79a..9ce765407ad 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c @@ -19,6 +19,7 @@  #include "common.h"  #include <plat/cpu.h>  #include <plat/prcm.h> +#include <plat/irqs.h>  #include "vp.h" diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 33dd655e6aa..a1d6154dc12 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c @@ -19,6 +19,7 @@  #include "common.h"  #include <plat/cpu.h> +#include <plat/irqs.h>  #include <plat/prcm.h>  #include "vp.h" diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 247d89478f2..f590afc1f67 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -107,18 +107,18 @@ static void omap_uart_set_noidle(struct platform_device *pdev)  	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO);  } -static void omap_uart_set_forceidle(struct platform_device *pdev) +static void omap_uart_set_smartidle(struct platform_device *pdev)  {  	struct omap_device *od = to_omap_device(pdev); -	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_FORCE); +	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_SMART);  }  #else  static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)  {}  static void omap_uart_set_noidle(struct platform_device *pdev) {} -static void omap_uart_set_forceidle(struct platform_device *pdev) {} +static void omap_uart_set_smartidle(struct platform_device *pdev) {}  #endif /* CONFIG_PM */  #ifdef CONFIG_OMAP_MUX @@ -349,7 +349,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,  	omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;  	omap_up.flags = UPF_BOOT_AUTOCONF;  	omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count; -	omap_up.set_forceidle = omap_uart_set_forceidle; +	omap_up.set_forceidle = omap_uart_set_smartidle;  	omap_up.set_noidle = omap_uart_set_noidle;  	omap_up.enable_wakeup = omap_uart_enable_wakeup;  	omap_up.dma_rx_buf_size = info->dma_rx_buf_size; diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index 9dd93453e56..7e755bb0ffc 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c @@ -897,7 +897,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)  		ret = sr_late_init(sr_info);  		if (ret) {  			pr_warning("%s: Error in SR late init\n", __func__); -			return ret; +			goto err_iounmap;  		}  	} diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 6eeff0e0ae0..5c9acea9576 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -270,7 +270,7 @@ static struct clocksource clocksource_gpt = {  static u32 notrace dmtimer_read_sched_clock(void)  {  	if (clksrc.reserved) -		return __omap_dm_timer_read_counter(clksrc.io_base, 1); +		return __omap_dm_timer_read_counter(&clksrc, 1);  	return 0;  } diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 10b20c652e5..4b57757bf9d 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c @@ -270,7 +270,6 @@ static struct regulator_init_data omap4_vusb_idata = {  	.constraints = {  		.min_uV			= 3300000,  		.max_uV			= 3300000, -		.apply_uV		= true,  		.valid_modes_mask	= REGULATOR_MODE_NORMAL  					| REGULATOR_MODE_STANDBY,  		.valid_ops_mask		= REGULATOR_CHANGE_MODE diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c index 771dc781b74..f51348dafaf 100644 --- a/arch/arm/mach-omap2/usb-host.c +++ b/arch/arm/mach-omap2/usb-host.c @@ -486,7 +486,7 @@ static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)  void __init usbhs_init(const struct usbhs_omap_board_data *pdata)  {  	struct omap_hwmod	*oh[2]; -	struct omap_device	*od; +	struct platform_device	*pdev;  	int			bus_id = -1;  	int			i; @@ -522,11 +522,11 @@ void __init usbhs_init(const struct usbhs_omap_board_data *pdata)  		return;  	} -	od = omap_device_build_ss(OMAP_USBHS_DEVICE, bus_id, oh, 2, +	pdev = omap_device_build_ss(OMAP_USBHS_DEVICE, bus_id, oh, 2,  				(void *)&usbhs_data, sizeof(usbhs_data),  				omap_uhhtll_latency,  				ARRAY_SIZE(omap_uhhtll_latency), false); -	if (IS_ERR(od)) { +	if (IS_ERR(pdev)) {  		pr_err("Could not build hwmod devices %s,%s\n",  			USBHS_UHH_HWMODNAME, USBHS_TLL_HWMODNAME);  		return; diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c index 031d116fbf1..175b7d86d86 100644 --- a/arch/arm/mach-omap2/vc.c +++ b/arch/arm/mach-omap2/vc.c @@ -247,7 +247,7 @@ static void __init omap4_vc_init_channel(struct voltagedomain *voltdm)   * omap_vc_i2c_init - initialize I2C interface to PMIC   * @voltdm: voltage domain containing VC data   * - * Use PMIC supplied seetings for I2C high-speed mode and + * Use PMIC supplied settings for I2C high-speed mode and   * master code (if set) and program the VC I2C configuration   * register.   * @@ -265,8 +265,8 @@ static void __init omap_vc_i2c_init(struct voltagedomain *voltdm)  	if (initialized) {  		if (voltdm->pmic->i2c_high_speed != i2c_high_speed) -			pr_warn("%s: I2C config for all channels must match.", -				__func__); +			pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).", +				__func__, voltdm->name, i2c_high_speed);  		return;  	} @@ -292,9 +292,7 @@ void __init omap_vc_init_channel(struct voltagedomain *voltdm)  	u32 val;  	if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { -		pr_err("%s: PMIC info requried to configure vc for" -			"vdd_%s not populated.Hence cannot initialize vc\n", -			__func__, voltdm->name); +		pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name);  		return;  	} diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c index c005e2f5e38..57db2038b23 100644 --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c @@ -108,6 +108,7 @@ void __init omap3xxx_voltagedomains_init(void)  	 * XXX Will depend on the process, validation, and binning  	 * for the currently-running IC  	 */ +#ifdef CONFIG_PM_OPP  	if (cpu_is_omap3630()) {  		omap3_voltdm_mpu.volt_data = omap36xx_vddmpu_volt_data;  		omap3_voltdm_core.volt_data = omap36xx_vddcore_volt_data; @@ -115,6 +116,7 @@ void __init omap3xxx_voltagedomains_init(void)  		omap3_voltdm_mpu.volt_data = omap34xx_vddmpu_volt_data;  		omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data;  	} +#endif  	if (cpu_is_omap3517() || cpu_is_omap3505())  		voltdms = voltagedomains_am35xx; diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c index 4e11d022595..c3115f6853d 100644 --- a/arch/arm/mach-omap2/voltagedomains44xx_data.c +++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c @@ -100,9 +100,11 @@ void __init omap44xx_voltagedomains_init(void)  	 * XXX Will depend on the process, validation, and binning  	 * for the currently-running IC  	 */ +#ifdef CONFIG_PM_OPP  	omap4_voltdm_mpu.volt_data = omap44xx_vdd_mpu_volt_data;  	omap4_voltdm_iva.volt_data = omap44xx_vdd_iva_volt_data;  	omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data; +#endif  	for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++)  		voltdm->sys_clk.name = sys_clk_name; diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c index 807391d84a9..0df88820978 100644 --- a/arch/arm/mach-omap2/vp.c +++ b/arch/arm/mach-omap2/vp.c @@ -41,6 +41,11 @@ void __init omap_vp_init(struct voltagedomain *voltdm)  	u32 val, sys_clk_rate, timeout, waittime;  	u32 vddmin, vddmax, vstepmin, vstepmax; +	if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { +		pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name); +		return; +	} +  	if (!voltdm->read || !voltdm->write) {  		pr_err("%s: No read/write API for accessing vdd_%s regs\n",  			__func__, voltdm->name);  |