Commit ff140865 authored by Olof Johansson's avatar Olof Johansson

Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into fixes

From Tony Lindgren:

Note that this also contains a set of fixes that are not regressions
or oopses to properly deal with the smsc911x regulator issue.

Basically the regulators must be per board file as the regulators
can also come from drivers, such as twl4030. So it's best to dumb
down gpmc-smsc911x.c to not even care about the regulators.

* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  ARM: OMAP: fix section mismatches in usb-host.c
  ARM: OMAP2+: Fix omap2+ build error
  ARM: OMAP2+: smsc911x: Add fixed board regulators
  ARM: OMAP2+: smsc911x: Remove regulator support from gmpc-smsc911x
  ARM: OMAP2+: smsc911x: Remove unused rate calculation
  ARM: OMAP2+ smsc911x: Fix possible stale smsc911x flags
  ARM: OMAP2+: smsc911x: Remove odd gpmc_cfg/board_data redirection
  ARM: OMAP3+: fix oops triggered in omap_prcm_register_chain_handler(v1)
  ARM: OMAP2+: OPP: allow OPP enumeration to continue if device is not present
  arm: omap3: pm34xx.c: Replace printk() with appropriate pr_*()
  arm: omap3: pm34xx.c: Fix omap3_pm_init() error out paths
  ARM: OMAP4: Workaround the OCP synchronisation issue with 32K synctimer.
  ARM: OMAP4: prm: fix interrupt register offsets
  ARM: OMAP: hwmod: Use sysc_fields->srst_shift and get rid of hardcoded SYSC_TYPE2_SOFTRESET_MASK
parents 80783426 08956f1c
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define __ASM_BARRIER_H #define __ASM_BARRIER_H
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/outercache.h>
#define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
...@@ -39,7 +40,6 @@ ...@@ -39,7 +40,6 @@
#ifdef CONFIG_ARCH_HAS_BARRIERS #ifdef CONFIG_ARCH_HAS_BARRIERS
#include <mach/barriers.h> #include <mach/barriers.h>
#elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP)
#include <asm/outercache.h>
#define mb() do { dsb(); outer_sync(); } while (0) #define mb() do { dsb(); outer_sync(); } while (0)
#define rmb() dsb() #define rmb() dsb()
#define wmb() mb() #define wmb() mb()
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/i2c/at24.h> #include <linux/i2c/at24.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
...@@ -81,8 +82,23 @@ static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = { ...@@ -81,8 +82,23 @@ static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = {
.flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
}; };
static struct regulator_consumer_supply cm_t35_smsc911x_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
};
static struct regulator_consumer_supply sb_t35_smsc911x_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.1"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.1"),
};
static void __init cm_t35_init_ethernet(void) static void __init cm_t35_init_ethernet(void)
{ {
regulator_register_fixed(0, cm_t35_smsc911x_supplies,
ARRAY_SIZE(cm_t35_smsc911x_supplies));
regulator_register_fixed(1, sb_t35_smsc911x_supplies,
ARRAY_SIZE(sb_t35_smsc911x_supplies));
gpmc_smsc911x_init(&cm_t35_smsc911x_cfg); gpmc_smsc911x_init(&cm_t35_smsc911x_cfg);
gpmc_smsc911x_init(&sb_t35_smsc911x_cfg); gpmc_smsc911x_init(&sb_t35_smsc911x_cfg);
} }
......
...@@ -634,8 +634,14 @@ static void __init igep_wlan_bt_init(void) ...@@ -634,8 +634,14 @@ static void __init igep_wlan_bt_init(void)
static inline void __init igep_wlan_bt_init(void) { } static inline void __init igep_wlan_bt_init(void) { }
#endif #endif
static struct regulator_consumer_supply dummy_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
};
static void __init igep_init(void) static void __init igep_init(void)
{ {
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
/* Get IGEP2 hardware revision */ /* Get IGEP2 hardware revision */
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -410,8 +411,14 @@ static struct mtd_partition ldp_nand_partitions[] = { ...@@ -410,8 +411,14 @@ static struct mtd_partition ldp_nand_partitions[] = {
}; };
static struct regulator_consumer_supply dummy_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
};
static void __init omap_ldp_init(void) static void __init omap_ldp_init(void)
{ {
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
ldp_init_smsc911x(); ldp_init_smsc911x();
omap_i2c_init(); omap_i2c_init();
......
...@@ -114,15 +114,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = { ...@@ -114,15 +114,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = {
static inline void __init omap3evm_init_smsc911x(void) static inline void __init omap3evm_init_smsc911x(void)
{ {
struct clk *l3ck;
unsigned int rate;
l3ck = clk_get(NULL, "l3_ck");
if (IS_ERR(l3ck))
rate = 100000000;
else
rate = clk_get_rate(l3ck);
/* Configure ethernet controller reset gpio */ /* Configure ethernet controller reset gpio */
if (cpu_is_omap3430()) { if (cpu_is_omap3430()) {
if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1)
...@@ -632,9 +623,15 @@ static void __init omap3_evm_wl12xx_init(void) ...@@ -632,9 +623,15 @@ static void __init omap3_evm_wl12xx_init(void)
#endif #endif
} }
static struct regulator_consumer_supply dummy_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
};
static void __init omap3_evm_init(void) static void __init omap3_evm_init(void)
{ {
omap3_evm_get_revision(); omap3_evm_get_revision();
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
if (cpu_is_omap3630()) if (cpu_is_omap3630())
omap3_mux_init(omap36x_board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(omap36x_board_mux, OMAP_PACKAGE_CBB);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
...@@ -188,8 +189,14 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -188,8 +189,14 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct regulator_consumer_supply dummy_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
};
static void __init omap3logic_init(void) static void __init omap3logic_init(void)
{ {
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap3torpedo_fix_pbias_voltage(); omap3torpedo_fix_pbias_voltage();
omap3logic_i2c_init(); omap3logic_i2c_init();
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/input.h> #include <linux/input.h>
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
...@@ -72,15 +73,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = { ...@@ -72,15 +73,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = {
static inline void __init omap3stalker_init_eth(void) static inline void __init omap3stalker_init_eth(void)
{ {
struct clk *l3ck;
unsigned int rate;
l3ck = clk_get(NULL, "l3_ck");
if (IS_ERR(l3ck))
rate = 100000000;
else
rate = clk_get_rate(l3ck);
omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP);
gpmc_smsc911x_init(&smsc911x_cfg); gpmc_smsc911x_init(&smsc911x_cfg);
} }
...@@ -419,8 +411,14 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -419,8 +411,14 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct regulator_consumer_supply dummy_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
};
static void __init omap3_stalker_init(void) static void __init omap3_stalker_init(void)
{ {
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
omap_board_config = omap3_stalker_config; omap_board_config = omap3_stalker_config;
omap_board_config_size = ARRAY_SIZE(omap3_stalker_config); omap_board_config_size = ARRAY_SIZE(omap3_stalker_config);
......
...@@ -498,10 +498,18 @@ static struct gpio overo_bt_gpios[] __initdata = { ...@@ -498,10 +498,18 @@ static struct gpio overo_bt_gpios[] __initdata = {
{ OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" },
}; };
static struct regulator_consumer_supply dummy_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
REGULATOR_SUPPLY("vddvario", "smsc911x.1"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.1"),
};
static void __init overo_init(void) static void __init overo_init(void)
{ {
int ret; int ret;
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap_hsmmc_init(mmc); omap_hsmmc_init(mmc);
overo_i2c_init(); overo_i2c_init();
......
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
#include <linux/smsc911x.h> #include <linux/smsc911x.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/gpmc-smsc911x.h> #include <plat/gpmc-smsc911x.h>
...@@ -117,11 +120,17 @@ static struct platform_device *zoom_devices[] __initdata = { ...@@ -117,11 +120,17 @@ static struct platform_device *zoom_devices[] __initdata = {
&zoom_debugboard_serial_device, &zoom_debugboard_serial_device,
}; };
static struct regulator_consumer_supply dummy_supplies[] = {
REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
};
int __init zoom_debugboard_init(void) int __init zoom_debugboard_init(void)
{ {
if (!omap_zoom_debugboard_detect()) if (!omap_zoom_debugboard_detect())
return 0; return 0;
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
zoom_init_smsc911x(); zoom_init_smsc911x();
zoom_init_quaduart(); zoom_init_quaduart();
return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices)); return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices));
......
...@@ -19,15 +19,11 @@ ...@@ -19,15 +19,11 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/smsc911x.h> #include <linux/smsc911x.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h>
#include <plat/board.h> #include <plat/board.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/gpmc-smsc911x.h> #include <plat/gpmc-smsc911x.h>
static struct omap_smsc911x_platform_data *gpmc_cfg;
static struct resource gpmc_smsc911x_resources[] = { static struct resource gpmc_smsc911x_resources[] = {
[0] = { [0] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
...@@ -41,51 +37,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = { ...@@ -41,51 +37,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {
.phy_interface = PHY_INTERFACE_MODE_MII, .phy_interface = PHY_INTERFACE_MODE_MII,
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
.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,
},
}; };
/* /*
...@@ -93,23 +44,12 @@ static struct platform_device gpmc_smsc911x_regulator = { ...@@ -93,23 +44,12 @@ static struct platform_device gpmc_smsc911x_regulator = {
* assume that pin multiplexing is done in the board-*.c file, * assume that pin multiplexing is done in the board-*.c file,
* or in the bootloader. * or in the bootloader.
*/ */
void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *gpmc_cfg)
{ {
struct platform_device *pdev; struct platform_device *pdev;
unsigned long cs_mem_base; unsigned long cs_mem_base;
int ret; int ret;
gpmc_cfg = board_data;
if (!gpmc_cfg->id) {
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) { if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) {
pr_err("Failed to request GPMC mem region\n"); pr_err("Failed to request GPMC mem region\n");
return; return;
...@@ -139,8 +79,7 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) ...@@ -139,8 +79,7 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
gpio_set_value(gpmc_cfg->gpio_reset, 1); gpio_set_value(gpmc_cfg->gpio_reset, 1);
} }
if (gpmc_cfg->flags) gpmc_smsc911x_config.flags = gpmc_cfg->flags ? : SMSC911X_USE_16BIT;
gpmc_smsc911x_config.flags = gpmc_cfg->flags;
pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id, pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id,
gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources), gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources),
......
...@@ -1395,7 +1395,7 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name) ...@@ -1395,7 +1395,7 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)
*/ */
static int _ocp_softreset(struct omap_hwmod *oh) static int _ocp_softreset(struct omap_hwmod *oh)
{ {
u32 v; u32 v, softrst_mask;
int c = 0; int c = 0;
int ret = 0; int ret = 0;
...@@ -1427,11 +1427,13 @@ static int _ocp_softreset(struct omap_hwmod *oh) ...@@ -1427,11 +1427,13 @@ static int _ocp_softreset(struct omap_hwmod *oh)
oh->class->sysc->syss_offs) oh->class->sysc->syss_offs)
& SYSS_RESETDONE_MASK), & SYSS_RESETDONE_MASK),
MAX_MODULE_SOFTRESET_WAIT, c); MAX_MODULE_SOFTRESET_WAIT, c);
else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) {
softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
omap_test_timeout(!(omap_hwmod_read(oh, omap_test_timeout(!(omap_hwmod_read(oh,
oh->class->sysc->sysc_offs) oh->class->sysc->sysc_offs)
& SYSC_TYPE2_SOFTRESET_MASK), & softrst_mask),
MAX_MODULE_SOFTRESET_WAIT, c); MAX_MODULE_SOFTRESET_WAIT, c);
}
if (c == MAX_MODULE_SOFTRESET_WAIT) if (c == MAX_MODULE_SOFTRESET_WAIT)
pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n",
......
...@@ -64,10 +64,10 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, ...@@ -64,10 +64,10 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def,
} }
oh = omap_hwmod_lookup(opp_def->hwmod_name); oh = omap_hwmod_lookup(opp_def->hwmod_name);
if (!oh || !oh->od) { if (!oh || !oh->od) {
pr_warn("%s: no hwmod or odev for %s, [%d] " pr_debug("%s: no hwmod or odev for %s, [%d] "
"cannot add OPPs.\n", __func__, "cannot add OPPs.\n", __func__,
opp_def->hwmod_name, i); opp_def->hwmod_name, i);
return -EINVAL; continue;
} }
dev = &oh->od->pdev->dev; dev = &oh->od->pdev->dev;
......
...@@ -153,8 +153,7 @@ static void omap3_save_secure_ram_context(void) ...@@ -153,8 +153,7 @@ static void omap3_save_secure_ram_context(void)
pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state);
/* Following is for error tracking, it should not happen */ /* Following is for error tracking, it should not happen */
if (ret) { if (ret) {
printk(KERN_ERR "save_secure_sram() returns %08x\n", pr_err("save_secure_sram() returns %08x\n", ret);
ret);
while (1) while (1)
; ;
} }
...@@ -289,7 +288,7 @@ void omap_sram_idle(void) ...@@ -289,7 +288,7 @@ void omap_sram_idle(void)
break; break;
default: default:
/* Invalid state */ /* Invalid state */
printk(KERN_ERR "Invalid mpu state in sram_idle\n"); pr_err("Invalid mpu state in sram_idle\n");
return; return;
} }
...@@ -439,18 +438,17 @@ static int omap3_pm_suspend(void) ...@@ -439,18 +438,17 @@ static int omap3_pm_suspend(void)
list_for_each_entry(pwrst, &pwrst_list, node) { list_for_each_entry(pwrst, &pwrst_list, node) {
state = pwrdm_read_prev_pwrst(pwrst->pwrdm); state = pwrdm_read_prev_pwrst(pwrst->pwrdm);
if (state > pwrst->next_state) { if (state > pwrst->next_state) {
printk(KERN_INFO "Powerdomain (%s) didn't enter " pr_info("Powerdomain (%s) didn't enter "
"target state %d\n", "target state %d\n",
pwrst->pwrdm->name, pwrst->next_state); pwrst->pwrdm->name, pwrst->next_state);
ret = -1; ret = -1;
} }
omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
} }
if (ret) if (ret)
printk(KERN_ERR "Could not enter target state in pm_suspend\n"); pr_err("Could not enter target state in pm_suspend\n");
else else
printk(KERN_INFO "Successfully put all powerdomains " pr_info("Successfully put all powerdomains to target state\n");
"to target state\n");
return ret; return ret;
} }
...@@ -734,21 +732,22 @@ static int __init omap3_pm_init(void) ...@@ -734,21 +732,22 @@ static int __init omap3_pm_init(void)
if (ret) { if (ret) {
pr_err("pm: Failed to request pm_io irq\n"); pr_err("pm: Failed to request pm_io irq\n");
goto err1; goto err2;
} }
ret = pwrdm_for_each(pwrdms_setup, NULL); ret = pwrdm_for_each(pwrdms_setup, NULL);
if (ret) { if (ret) {
printk(KERN_ERR "Failed to setup powerdomains\n"); pr_err("Failed to setup powerdomains\n");
goto err2; goto err3;
} }
(void) clkdm_for_each(omap_pm_clkdms_setup, NULL); (void) clkdm_for_each(omap_pm_clkdms_setup, NULL);
mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
if (mpu_pwrdm == NULL) { if (mpu_pwrdm == NULL) {
printk(KERN_ERR "Failed to get mpu_pwrdm\n"); pr_err("Failed to get mpu_pwrdm\n");
goto err2; ret = -EINVAL;
goto err3;
} }
neon_pwrdm = pwrdm_lookup("neon_pwrdm"); neon_pwrdm = pwrdm_lookup("neon_pwrdm");
...@@ -781,8 +780,8 @@ static int __init omap3_pm_init(void) ...@@ -781,8 +780,8 @@ static int __init omap3_pm_init(void)
omap3_secure_ram_storage = omap3_secure_ram_storage =
kmalloc(0x803F, GFP_KERNEL); kmalloc(0x803F, GFP_KERNEL);
if (!omap3_secure_ram_storage) if (!omap3_secure_ram_storage)
printk(KERN_ERR "Memory allocation failed when" pr_err("Memory allocation failed when "
"allocating for secure sram context\n"); "allocating for secure sram context\n");
local_irq_disable(); local_irq_disable();
local_fiq_disable(); local_fiq_disable();
...@@ -796,14 +795,17 @@ static int __init omap3_pm_init(void) ...@@ -796,14 +795,17 @@ static int __init omap3_pm_init(void)
} }
omap3_save_scratchpad_contents(); omap3_save_scratchpad_contents();
err1:
return ret; return ret;
err2:
free_irq(INT_34XX_PRCM_MPU_IRQ, NULL); err3:
list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) { list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) {
list_del(&pwrst->node); list_del(&pwrst->node);
kfree(pwrst); kfree(pwrst);
} }
free_irq(omap_prcm_event_to_irq("io"), omap3_pm_init);
err2:
free_irq(omap_prcm_event_to_irq("wkup"), NULL);
err1:
return ret; return ret;
} }
......
...@@ -144,7 +144,7 @@ static void omap_default_idle(void) ...@@ -144,7 +144,7 @@ static void omap_default_idle(void)
static int __init omap4_pm_init(void) static int __init omap4_pm_init(void)
{ {
int ret; int ret;
struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm; struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup;
struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm;
if (!cpu_is_omap44xx()) if (!cpu_is_omap44xx())
...@@ -168,14 +168,19 @@ static int __init omap4_pm_init(void) ...@@ -168,14 +168,19 @@ static int __init omap4_pm_init(void)
* MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
* expected. The hardware recommendation is to enable static * expected. The hardware recommendation is to enable static
* dependencies for these to avoid system lock ups or random crashes. * dependencies for these to avoid system lock ups or random crashes.
* The L4 wakeup depedency is added to workaround the OCP sync hardware
* BUG with 32K synctimer which lead to incorrect timer value read
* from the 32K counter. The BUG applies for GPTIMER1 and WDT2 which
* are part of L4 wakeup clockdomain.
*/ */
mpuss_clkdm = clkdm_lookup("mpuss_clkdm"); mpuss_clkdm = clkdm_lookup("mpuss_clkdm");
emif_clkdm = clkdm_lookup("l3_emif_clkdm"); emif_clkdm = clkdm_lookup("l3_emif_clkdm");
l3_1_clkdm = clkdm_lookup("l3_1_clkdm"); l3_1_clkdm = clkdm_lookup("l3_1_clkdm");
l3_2_clkdm = clkdm_lookup("l3_2_clkdm"); l3_2_clkdm = clkdm_lookup("l3_2_clkdm");
l4_per_clkdm = clkdm_lookup("l4_per_clkdm"); l4_per_clkdm = clkdm_lookup("l4_per_clkdm");
l4wkup = clkdm_lookup("l4_wkup_clkdm");
ducati_clkdm = clkdm_lookup("ducati_clkdm"); ducati_clkdm = clkdm_lookup("ducati_clkdm");
if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || (!l4wkup) ||
(!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm)) (!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm))
goto err2; goto err2;
...@@ -183,6 +188,7 @@ static int __init omap4_pm_init(void) ...@@ -183,6 +188,7 @@ static int __init omap4_pm_init(void)
ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm); ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm);
ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm); ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm);
ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm); ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm);
ret |= clkdm_add_wkdep(mpuss_clkdm, l4wkup);
ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm); ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm);
ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm); ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
if (ret) { if (ret) {
......
...@@ -147,8 +147,9 @@ static inline u32 _read_pending_irq_reg(u16 irqen_offs, u16 irqst_offs) ...@@ -147,8 +147,9 @@ static inline u32 _read_pending_irq_reg(u16 irqen_offs, u16 irqst_offs)
u32 mask, st; u32 mask, st;
/* XXX read mask from RAM? */ /* XXX read mask from RAM? */
mask = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqen_offs); mask = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,
st = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqst_offs); irqen_offs);
st = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, irqst_offs);
return mask & st; return mask & st;
} }
...@@ -180,7 +181,7 @@ void omap44xx_prm_read_pending_irqs(unsigned long *events) ...@@ -180,7 +181,7 @@ void omap44xx_prm_read_pending_irqs(unsigned long *events)
*/ */
void omap44xx_prm_ocp_barrier(void) void omap44xx_prm_ocp_barrier(void)
{ {
omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_REVISION_PRM_OFFSET); OMAP4_REVISION_PRM_OFFSET);
} }
...@@ -198,19 +199,19 @@ void omap44xx_prm_ocp_barrier(void) ...@@ -198,19 +199,19 @@ void omap44xx_prm_ocp_barrier(void)
void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask)
{ {
saved_mask[0] = saved_mask[0] =
omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_PRM_IRQSTATUS_MPU_OFFSET); OMAP4_PRM_IRQSTATUS_MPU_OFFSET);
saved_mask[1] = saved_mask[1] =
omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET); OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET);
omap4_prm_write_inst_reg(0, OMAP4430_PRM_DEVICE_INST, omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_PRM_IRQENABLE_MPU_OFFSET); OMAP4_PRM_IRQENABLE_MPU_OFFSET);
omap4_prm_write_inst_reg(0, OMAP4430_PRM_DEVICE_INST, omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); OMAP4_PRM_IRQENABLE_MPU_2_OFFSET);
/* OCP barrier */ /* OCP barrier */
omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_REVISION_PRM_OFFSET); OMAP4_REVISION_PRM_OFFSET);
} }
...@@ -226,9 +227,9 @@ void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) ...@@ -226,9 +227,9 @@ void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask)
*/ */
void omap44xx_prm_restore_irqen(u32 *saved_mask) void omap44xx_prm_restore_irqen(u32 *saved_mask)
{ {
omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_DEVICE_INST, omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_PRM_IRQENABLE_MPU_OFFSET); OMAP4_PRM_IRQENABLE_MPU_OFFSET);
omap4_prm_write_inst_reg(saved_mask[1], OMAP4430_PRM_DEVICE_INST, omap4_prm_write_inst_reg(saved_mask[1], OMAP4430_PRM_OCP_SOCKET_INST,
OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); OMAP4_PRM_IRQENABLE_MPU_2_OFFSET);
} }
......
...@@ -290,7 +290,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) ...@@ -290,7 +290,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)
goto err; goto err;
} }
for (i = 0; i <= irq_setup->nr_regs; i++) { for (i = 0; i < irq_setup->nr_regs; i++) {
gc = irq_alloc_generic_chip("PRCM", 1, gc = irq_alloc_generic_chip("PRCM", 1,
irq_setup->base_irq + i * 32, prm_base, irq_setup->base_irq + i * 32, prm_base,
handle_level_irq); handle_level_irq);
......
...@@ -54,7 +54,7 @@ static struct omap_device_pm_latency omap_uhhtll_latency[] = { ...@@ -54,7 +54,7 @@ static struct omap_device_pm_latency omap_uhhtll_latency[] = {
/* /*
* setup_ehci_io_mux - initialize IO pad mux for USBHOST * setup_ehci_io_mux - initialize IO pad mux for USBHOST
*/ */
static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) static void __init setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
{ {
switch (port_mode[0]) { switch (port_mode[0]) {
case OMAP_EHCI_PORT_MODE_PHY: case OMAP_EHCI_PORT_MODE_PHY:
...@@ -197,7 +197,8 @@ static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) ...@@ -197,7 +197,8 @@ static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
return; return;
} }
static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) static
void __init setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
{ {
switch (port_mode[0]) { switch (port_mode[0]) {
case OMAP_EHCI_PORT_MODE_PHY: case OMAP_EHCI_PORT_MODE_PHY:
...@@ -315,7 +316,7 @@ static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) ...@@ -315,7 +316,7 @@ static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
} }
} }
static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) static void __init setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
{ {
switch (port_mode[0]) { switch (port_mode[0]) {
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
...@@ -412,7 +413,8 @@ static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) ...@@ -412,7 +413,8 @@ static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
} }
} }
static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) static
void __init setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
{ {
switch (port_mode[0]) { switch (port_mode[0]) {
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment