Commit e65bc891 authored by Olof Johansson's avatar Olof Johansson

Merge branch 'cleanup-pm' of...

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

* 'cleanup-pm' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  ARM: OMAP2+: PM: share some suspend-related functions across OMAP2, 3, 4
  ARM: OMAP2+: omap_device: call all suspend, resume callbacks when OMAP_DEVICE_NO_IDLE_ON_SUSPEND is set
  ARM: OMAP: omap_device: remove omap_device_parent
  ARM: OMAP2+: PM debug: fix the use of debugfs_create_* API
  ARM: OMAP2+: PM: share clkdms_setup() across OMAP2, 3, 4
  ARM: OMAP2+: PM: clean up omap_set_pwrdm_state()
  ARM: OMAP3: PM: remove superfluous calls to pwrdm_clear_all_prev_pwrst()
  ARM: OMAP: convert omap_device_build() and callers to __init
  ARM: OMAP2+: Mark omap_hsmmc_init and omap_mux related functions as __init
  ARM: OMAP2+: Split omap2_hsmmc_init() to properly support I2C GPIO pins
  ARM: OMAP: omap_device: Expose omap_device_{alloc, delete, register}
  ARM: OMAP: Fix build error when mmc_omap is built as module
  ARM: OMAP: Fix kernel panic with HSMMC when twl4030_gpio is a module
parents d60d506e 00fd72cc
...@@ -279,7 +279,7 @@ static void __init omap_2430sdp_init(void) ...@@ -279,7 +279,7 @@ static void __init omap_2430sdp_init(void)
platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices)); platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices));
omap_serial_init(); omap_serial_init();
omap_sdrc_init(NULL, NULL); omap_sdrc_init(NULL, NULL);
omap2_hsmmc_init(mmc); omap_hsmmc_init(mmc);
omap2_usbfs_init(&sdp2430_usb_config); omap2_usbfs_init(&sdp2430_usb_config);
omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP); omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP);
......
...@@ -232,11 +232,13 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -232,11 +232,13 @@ static struct omap2_hsmmc_info mmc[] = {
*/ */
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.gpio_wp = 4, .gpio_wp = 4,
.deferred = true,
}, },
{ {
.mmc = 2, .mmc = 2,
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.gpio_wp = 7, .gpio_wp = 7,
.deferred = true,
}, },
{} /* Terminator */ {} /* Terminator */
}; };
...@@ -249,7 +251,7 @@ static int sdp3430_twl_gpio_setup(struct device *dev, ...@@ -249,7 +251,7 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
*/ */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
mmc[1].gpio_cd = gpio + 1; mmc[1].gpio_cd = gpio + 1;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
/* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */ /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl"); gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl");
...@@ -606,6 +608,7 @@ static void __init omap_3430sdp_init(void) ...@@ -606,6 +608,7 @@ static void __init omap_3430sdp_init(void)
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap_board_config = sdp3430_config; omap_board_config = sdp3430_config;
omap_board_config_size = ARRAY_SIZE(sdp3430_config); omap_board_config_size = ARRAY_SIZE(sdp3430_config);
omap_hsmmc_init(mmc);
omap3430_i2c_init(); omap3430_i2c_init();
omap_display_init(&sdp3430_dss_data); omap_display_init(&sdp3430_dss_data);
if (omap_rev() > OMAP3430_REV_ES1_0) if (omap_rev() > OMAP3430_REV_ES1_0)
......
...@@ -491,9 +491,9 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) ...@@ -491,9 +491,9 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
{ {
struct omap2_hsmmc_info *c; struct omap2_hsmmc_info *c;
omap2_hsmmc_init(controllers); omap_hsmmc_init(controllers);
for (c = controllers; c->mmc; c++) for (c = controllers; c->mmc; c++)
omap4_twl6030_hsmmc_set_late_init(c->dev); omap4_twl6030_hsmmc_set_late_init(&c->pdev->dev);
return 0; return 0;
} }
......
...@@ -504,7 +504,7 @@ static void __init am3517_evm_init(void) ...@@ -504,7 +504,7 @@ static void __init am3517_evm_init(void)
am3517_evm_musb_init(); am3517_evm_musb_init();
/* MMC init function */ /* MMC init function */
omap2_hsmmc_init(mmc); omap_hsmmc_init(mmc);
} }
MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
......
...@@ -412,7 +412,7 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -412,7 +412,7 @@ static struct omap2_hsmmc_info mmc[] = {
.caps = MMC_CAP_4_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA,
.gpio_cd = -EINVAL, .gpio_cd = -EINVAL,
.gpio_wp = -EINVAL, .gpio_wp = -EINVAL,
.deferred = true,
}, },
{ {
.mmc = 2, .mmc = 2,
...@@ -470,7 +470,7 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio, ...@@ -470,7 +470,7 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
return 0; return 0;
} }
...@@ -638,6 +638,7 @@ static void __init cm_t3x_common_init(void) ...@@ -638,6 +638,7 @@ static void __init cm_t3x_common_init(void)
omap_serial_init(); omap_serial_init();
omap_sdrc_init(mt46h32m32lf6_sdrc_params, omap_sdrc_init(mt46h32m32lf6_sdrc_params,
mt46h32m32lf6_sdrc_params); mt46h32m32lf6_sdrc_params);
omap_hsmmc_init(mmc);
cm_t35_init_i2c(); cm_t35_init_i2c();
omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL); omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL);
cm_t35_init_ethernet(); cm_t35_init_ethernet();
......
...@@ -100,6 +100,7 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -100,6 +100,7 @@ static struct omap2_hsmmc_info mmc[] = {
.mmc = 1, .mmc = 1,
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.gpio_wp = 29, .gpio_wp = 29,
.deferred = true,
}, },
{} /* Terminator */ {} /* Terminator */
}; };
...@@ -228,7 +229,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev, ...@@ -228,7 +229,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
...@@ -636,6 +637,7 @@ static void __init devkit8000_init(void) ...@@ -636,6 +637,7 @@ static void __init devkit8000_init(void)
omap_dm9000_init(); omap_dm9000_init();
omap_hsmmc_init(mmc);
devkit8000_i2c_init(); devkit8000_i2c_init();
platform_add_devices(devkit8000_devices, platform_add_devices(devkit8000_devices,
ARRAY_SIZE(devkit8000_devices)); ARRAY_SIZE(devkit8000_devices));
......
...@@ -189,7 +189,7 @@ static u8 get_gpmc0_type(void) ...@@ -189,7 +189,7 @@ static u8 get_gpmc0_type(void)
* *
* @return - void. * @return - void.
*/ */
void board_flash_init(struct flash_partitions partition_info[], void __init board_flash_init(struct flash_partitions partition_info[],
char chip_sel_board[][GPMC_CS_NUM], int nand_type) char chip_sel_board[][GPMC_CS_NUM], int nand_type)
{ {
u8 cs = 0; u8 cs = 0;
......
...@@ -295,6 +295,7 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -295,6 +295,7 @@ static struct omap2_hsmmc_info mmc[] = {
.caps = MMC_CAP_4_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA,
.gpio_cd = -EINVAL, .gpio_cd = -EINVAL,
.gpio_wp = -EINVAL, .gpio_wp = -EINVAL,
.deferred = true,
}, },
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
{ {
...@@ -402,7 +403,7 @@ static int igep_twl_gpio_setup(struct device *dev, ...@@ -402,7 +403,7 @@ static int igep_twl_gpio_setup(struct device *dev,
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
...@@ -639,6 +640,9 @@ static void __init igep_init(void) ...@@ -639,6 +640,9 @@ static void __init igep_init(void)
/* Get IGEP2 hardware revision */ /* Get IGEP2 hardware revision */
igep2_get_revision(); igep2_get_revision();
omap_hsmmc_init(mmc);
/* Register I2C busses and drivers */ /* Register I2C busses and drivers */
igep_i2c_init(); igep_i2c_init();
platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices)); platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices));
......
...@@ -424,7 +424,7 @@ static void __init omap_ldp_init(void) ...@@ -424,7 +424,7 @@ static void __init omap_ldp_init(void)
board_nand_init(ldp_nand_partitions, board_nand_init(ldp_nand_partitions,
ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
omap2_hsmmc_init(mmc); omap_hsmmc_init(mmc);
ldp_display_init(); ldp_display_init();
} }
......
...@@ -370,7 +370,11 @@ static void n8x0_mmc_callback(void *data, u8 card_mask) ...@@ -370,7 +370,11 @@ static void n8x0_mmc_callback(void *data, u8 card_mask)
else else
*openp = 0; *openp = 0;
#ifdef CONFIG_MMC_OMAP
omap_mmc_notify_cover_event(mmc_device, index, *openp); 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) static int n8x0_mmc_late_init(struct device *dev)
......
...@@ -253,6 +253,7 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -253,6 +253,7 @@ static struct omap2_hsmmc_info mmc[] = {
.mmc = 1, .mmc = 1,
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.gpio_wp = -EINVAL, .gpio_wp = -EINVAL,
.deferred = true,
}, },
{} /* Terminator */ {} /* Terminator */
}; };
...@@ -272,12 +273,10 @@ static int beagle_twl_gpio_setup(struct device *dev, ...@@ -272,12 +273,10 @@ static int beagle_twl_gpio_setup(struct device *dev,
{ {
int r; int r;
if (beagle_config.mmc1_gpio_wp != -EINVAL)
omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp; mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
/* /*
* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
...@@ -521,6 +520,11 @@ static void __init omap3_beagle_init(void) ...@@ -521,6 +520,11 @@ static void __init omap3_beagle_init(void)
{ {
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap3_beagle_init_rev(); omap3_beagle_init_rev();
if (beagle_config.mmc1_gpio_wp != -EINVAL)
omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
omap_hsmmc_init(mmc);
omap3_beagle_i2c_init(); omap3_beagle_i2c_init();
gpio_buttons[0].gpio = beagle_config.usr_button_gpio; gpio_buttons[0].gpio = beagle_config.usr_button_gpio;
......
...@@ -317,6 +317,7 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -317,6 +317,7 @@ static struct omap2_hsmmc_info mmc[] = {
.caps = MMC_CAP_4_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA,
.gpio_cd = -EINVAL, .gpio_cd = -EINVAL,
.gpio_wp = 63, .gpio_wp = 63,
.deferred = true,
}, },
#ifdef CONFIG_WL12XX_PLATFORM_DATA #ifdef CONFIG_WL12XX_PLATFORM_DATA
{ {
...@@ -361,9 +362,8 @@ static int omap3evm_twl_gpio_setup(struct device *dev, ...@@ -361,9 +362,8 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
int r, lcd_bl_en; int r, lcd_bl_en;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
omap_mux_init_gpio(63, OMAP_PIN_INPUT);
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
/* /*
* Most GPIOs are for USB OTG. Some are mostly sent to * Most GPIOs are for USB OTG. Some are mostly sent to
...@@ -644,6 +644,9 @@ static void __init omap3_evm_init(void) ...@@ -644,6 +644,9 @@ static void __init omap3_evm_init(void)
omap_board_config = omap3_evm_config; omap_board_config = omap3_evm_config;
omap_board_config_size = ARRAY_SIZE(omap3_evm_config); omap_board_config_size = ARRAY_SIZE(omap3_evm_config);
omap_mux_init_gpio(63, OMAP_PIN_INPUT);
omap_hsmmc_init(mmc);
omap3_evm_i2c_init(); omap3_evm_i2c_init();
omap_display_init(&omap3_evm_dss_data); omap_display_init(&omap3_evm_dss_data);
......
...@@ -128,7 +128,7 @@ static void __init board_mmc_init(void) ...@@ -128,7 +128,7 @@ static void __init board_mmc_init(void)
return; return;
} }
omap2_hsmmc_init(board_mmc_info); omap_hsmmc_init(board_mmc_info);
} }
static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = { static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
......
...@@ -273,6 +273,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = { ...@@ -273,6 +273,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = {
.gpio_cd = -EINVAL, .gpio_cd = -EINVAL,
.gpio_wp = 126, .gpio_wp = 126,
.ext_clock = 0, .ext_clock = 0,
.deferred = true,
}, },
{ {
.mmc = 2, .mmc = 2,
...@@ -281,6 +282,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = { ...@@ -281,6 +282,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = {
.gpio_wp = 127, .gpio_wp = 127,
.ext_clock = 1, .ext_clock = 1,
.transceiver = true, .transceiver = true,
.deferred = true,
}, },
{ {
.mmc = 3, .mmc = 3,
...@@ -300,7 +302,7 @@ static int omap3pandora_twl_gpio_setup(struct device *dev, ...@@ -300,7 +302,7 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
/* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */ /* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */
omap3pandora_mmc[0].gpio_cd = gpio + 0; omap3pandora_mmc[0].gpio_cd = gpio + 0;
omap3pandora_mmc[1].gpio_cd = gpio + 1; omap3pandora_mmc[1].gpio_cd = gpio + 1;
omap2_hsmmc_init(omap3pandora_mmc); omap_hsmmc_late_init(omap3pandora_mmc);
/* gpio + 13 drives 32kHz buffer for wifi module */ /* gpio + 13 drives 32kHz buffer for wifi module */
gpio_32khz = gpio + 13; gpio_32khz = gpio + 13;
...@@ -580,6 +582,7 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -580,6 +582,7 @@ static struct omap_board_mux board_mux[] __initdata = {
static void __init omap3pandora_init(void) static void __init omap3pandora_init(void)
{ {
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap_hsmmc_init(omap3pandora_mmc);
omap3pandora_i2c_init(); omap3pandora_i2c_init();
pandora_wl1251_init(); pandora_wl1251_init();
platform_add_devices(omap3pandora_devices, platform_add_devices(omap3pandora_devices,
......
...@@ -209,10 +209,11 @@ static struct regulator_init_data omap3stalker_vsim = { ...@@ -209,10 +209,11 @@ static struct regulator_init_data omap3stalker_vsim = {
static struct omap2_hsmmc_info mmc[] = { static struct omap2_hsmmc_info mmc[] = {
{ {
.mmc = 1, .mmc = 1,
.caps = MMC_CAP_4_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA,
.gpio_cd = -EINVAL, .gpio_cd = -EINVAL,
.gpio_wp = 23, .gpio_wp = 23,
.deferred = true,
}, },
{} /* Terminator */ {} /* Terminator */
}; };
...@@ -282,9 +283,8 @@ omap3stalker_twl_gpio_setup(struct device *dev, ...@@ -282,9 +283,8 @@ omap3stalker_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio) unsigned gpio, unsigned ngpio)
{ {
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
omap_mux_init_gpio(23, OMAP_PIN_INPUT);
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
/* /*
* Most GPIOs are for USB OTG. Some are mostly sent to * Most GPIOs are for USB OTG. Some are mostly sent to
...@@ -425,6 +425,9 @@ static void __init omap3_stalker_init(void) ...@@ -425,6 +425,9 @@ static void __init omap3_stalker_init(void)
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);
omap_mux_init_gpio(23, OMAP_PIN_INPUT);
omap_hsmmc_init(mmc);
omap3_stalker_i2c_init(); omap3_stalker_i2c_init();
platform_add_devices(omap3_stalker_devices, platform_add_devices(omap3_stalker_devices,
......
...@@ -100,6 +100,7 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -100,6 +100,7 @@ static struct omap2_hsmmc_info mmc[] = {
.mmc = 1, .mmc = 1,
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
.gpio_wp = 29, .gpio_wp = 29,
.deferred = true,
}, },
{} /* Terminator */ {} /* Terminator */
}; };
...@@ -117,15 +118,9 @@ static struct gpio_led gpio_leds[]; ...@@ -117,15 +118,9 @@ static struct gpio_led gpio_leds[];
static int touchbook_twl_gpio_setup(struct device *dev, static int touchbook_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio) unsigned gpio, unsigned ngpio)
{ {
if (system_rev >= 0x20 && system_rev <= 0x34301000) {
omap_mux_init_gpio(23, OMAP_PIN_INPUT);
mmc[0].gpio_wp = 23;
} else {
omap_mux_init_gpio(29, OMAP_PIN_INPUT);
}
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
/* REVISIT: need ehci-omap hooks for external VBUS /* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect * power switch and overcurrent detect
...@@ -351,6 +346,14 @@ static void __init omap3_touchbook_init(void) ...@@ -351,6 +346,14 @@ static void __init omap3_touchbook_init(void)
pm_power_off = omap3_touchbook_poweroff; pm_power_off = omap3_touchbook_poweroff;
if (system_rev >= 0x20 && system_rev <= 0x34301000) {
omap_mux_init_gpio(23, OMAP_PIN_INPUT);
mmc[0].gpio_wp = 23;
} else {
omap_mux_init_gpio(29, OMAP_PIN_INPUT);
}
omap_hsmmc_init(mmc);
omap3_touchbook_i2c_init(); omap3_touchbook_i2c_init();
platform_add_devices(omap3_touchbook_devices, platform_add_devices(omap3_touchbook_devices,
ARRAY_SIZE(omap3_touchbook_devices)); ARRAY_SIZE(omap3_touchbook_devices));
......
...@@ -245,9 +245,9 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) ...@@ -245,9 +245,9 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
{ {
struct omap2_hsmmc_info *c; struct omap2_hsmmc_info *c;
omap2_hsmmc_init(controllers); omap_hsmmc_init(controllers);
for (c = controllers; c->mmc; c++) for (c = controllers; c->mmc; c++)
omap4_twl6030_hsmmc_set_late_init(c->dev); omap4_twl6030_hsmmc_set_late_init(&c->pdev->dev);
return 0; return 0;
} }
...@@ -461,7 +461,7 @@ static struct omap_dss_board_info omap4_panda_dss_data = { ...@@ -461,7 +461,7 @@ static struct omap_dss_board_info omap4_panda_dss_data = {
.default_device = &omap4_panda_dvi_device, .default_device = &omap4_panda_dvi_device,
}; };
void omap4_panda_display_init(void) void __init omap4_panda_display_init(void)
{ {
int r; int r;
......
...@@ -407,8 +407,6 @@ static inline void __init overo_init_keys(void) { return; } ...@@ -407,8 +407,6 @@ static inline void __init overo_init_keys(void) { return; }
static int overo_twl_gpio_setup(struct device *dev, static int overo_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio) unsigned gpio, unsigned ngpio)
{ {
omap2_hsmmc_init(mmc);
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
...@@ -505,6 +503,7 @@ static void __init overo_init(void) ...@@ -505,6 +503,7 @@ static void __init overo_init(void)
int ret; int ret;
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap_hsmmc_init(mmc);
overo_i2c_init(); overo_i2c_init();
omap_display_init(&overo_dss_data); omap_display_init(&overo_dss_data);
omap_serial_init(); omap_serial_init();
......
...@@ -120,7 +120,7 @@ static void __init rm680_peripherals_init(void) ...@@ -120,7 +120,7 @@ static void __init rm680_peripherals_init(void)
ARRAY_SIZE(rm680_peripherals_devices)); ARRAY_SIZE(rm680_peripherals_devices));
rm680_i2c_init(); rm680_i2c_init();
gpmc_onenand_init(board_onenand_data); gpmc_onenand_init(board_onenand_data);
omap2_hsmmc_init(mmc); omap_hsmmc_init(mmc);
} }
#ifdef CONFIG_OMAP_MUX #ifdef CONFIG_OMAP_MUX
......
...@@ -1142,7 +1142,7 @@ void __init rx51_peripherals_init(void) ...@@ -1142,7 +1142,7 @@ void __init rx51_peripherals_init(void)
partition = omap_mux_get("core"); partition = omap_mux_get("core");
if (partition) if (partition)
omap2_hsmmc_init(mmc); omap_hsmmc_init(mmc);
rx51_charger_init(); rx51_charger_init();
} }
......
...@@ -205,6 +205,7 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -205,6 +205,7 @@ static struct omap2_hsmmc_info mmc[] = {
.caps = MMC_CAP_4_BIT_DATA, .caps = MMC_CAP_4_BIT_DATA,
.gpio_wp = -EINVAL, .gpio_wp = -EINVAL,
.power_saving = true, .power_saving = true,
.deferred = true,
}, },
{ {
.name = "internal", .name = "internal",
...@@ -233,7 +234,7 @@ static int zoom_twl_gpio_setup(struct device *dev, ...@@ -233,7 +234,7 @@ static int zoom_twl_gpio_setup(struct device *dev,
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap_hsmmc_late_init(mmc);
ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW,
"lcd enable"); "lcd enable");
...@@ -301,6 +302,7 @@ void __init zoom_peripherals_init(void) ...@@ -301,6 +302,7 @@ void __init zoom_peripherals_init(void)
if (ret) if (ret)
pr_err("error setting wl12xx data: %d\n", ret); pr_err("error setting wl12xx data: %d\n", ret);
omap_hsmmc_init(mmc);
omap_i2c_init(); omap_i2c_init();
platform_device_register(&omap_vwlan_device); platform_device_register(&omap_vwlan_device);
usb_musb_init(NULL); usb_musb_init(NULL);
......
...@@ -276,7 +276,7 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data ...@@ -276,7 +276,7 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data
} }
#if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE) #if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE)
static inline void omap_init_mbox(void) static inline void __init omap_init_mbox(void)
{ {
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct platform_device *pdev; struct platform_device *pdev;
...@@ -337,7 +337,7 @@ static inline void omap_init_audio(void) {} ...@@ -337,7 +337,7 @@ static inline void omap_init_audio(void) {}
#if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \ #if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE) defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE)
static void omap_init_mcpdm(void) static void __init omap_init_mcpdm(void)
{ {
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct platform_device *pdev; struct platform_device *pdev;
...@@ -358,7 +358,7 @@ static inline void omap_init_mcpdm(void) {} ...@@ -358,7 +358,7 @@ static inline void omap_init_mcpdm(void) {}
#if defined(CONFIG_SND_OMAP_SOC_DMIC) || \ #if defined(CONFIG_SND_OMAP_SOC_DMIC) || \
defined(CONFIG_SND_OMAP_SOC_DMIC_MODULE) defined(CONFIG_SND_OMAP_SOC_DMIC_MODULE)
static void omap_init_dmic(void) static void __init omap_init_dmic(void)
{ {
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct platform_device *pdev; struct platform_device *pdev;
...@@ -380,7 +380,7 @@ static inline void omap_init_dmic(void) {} ...@@ -380,7 +380,7 @@ static inline void omap_init_dmic(void) {}
#include <plat/mcspi.h> #include <plat/mcspi.h>
static int omap_mcspi_init(struct omap_hwmod *oh, void *unused) static int __init omap_mcspi_init(struct omap_hwmod *oh, void *unused)
{ {
struct platform_device *pdev; struct platform_device *pdev;
char *name = "omap2_mcspi"; char *name = "omap2_mcspi";
......
...@@ -125,7 +125,7 @@ static void omap4_hdmi_mux_pads(enum omap_hdmi_flags flags) ...@@ -125,7 +125,7 @@ static void omap4_hdmi_mux_pads(enum omap_hdmi_flags flags)
} }
} }
static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) static int __init omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
{ {
u32 enable_mask, enable_shift; u32 enable_mask, enable_shift;
u32 pipd_mask, pipd_shift; u32 pipd_mask, pipd_shift;
...@@ -158,7 +158,7 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) ...@@ -158,7 +158,7 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
return 0; return 0;
} }
int omap_hdmi_init(enum omap_hdmi_flags flags) int __init omap_hdmi_init(enum omap_hdmi_flags flags)
{ {
if (cpu_is_omap44xx()) if (cpu_is_omap44xx())
omap4_hdmi_mux_pads(flags); omap4_hdmi_mux_pads(flags);
...@@ -166,7 +166,7 @@ int omap_hdmi_init(enum omap_hdmi_flags flags) ...@@ -166,7 +166,7 @@ int omap_hdmi_init(enum omap_hdmi_flags flags)
return 0; return 0;
} }
static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask) static int __init omap_dsi_enable_pads(int dsi_id, unsigned lane_mask)
{ {
if (cpu_is_omap44xx()) if (cpu_is_omap44xx())
return omap4_dsi_mux_pads(dsi_id, lane_mask); return omap4_dsi_mux_pads(dsi_id, lane_mask);
...@@ -174,7 +174,7 @@ static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask) ...@@ -174,7 +174,7 @@ static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask)
return 0; return 0;
} }
static void omap_dsi_disable_pads(int dsi_id, unsigned lane_mask) static void __init omap_dsi_disable_pads(int dsi_id, unsigned lane_mask)
{ {
if (cpu_is_omap44xx()) if (cpu_is_omap44xx())
omap4_dsi_mux_pads(dsi_id, 0); omap4_dsi_mux_pads(dsi_id, 0);
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include "powerdomain.h" #include "powerdomain.h"
static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) static int __init omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
{ {
struct platform_device *pdev; struct platform_device *pdev;
struct omap_gpio_platform_data *pdata; struct omap_gpio_platform_data *pdata;
......
...@@ -293,8 +293,8 @@ static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller, ...@@ -293,8 +293,8 @@ static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller,
} }
} }
static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
struct omap_mmc_platform_data *mmc) struct omap_mmc_platform_data *mmc)
{ {
char *hc_name; char *hc_name;
...@@ -428,69 +428,140 @@ static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -428,69 +428,140 @@ static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
return 0; return 0;
} }
static int omap_hsmmc_done;
void omap_hsmmc_late_init(struct omap2_hsmmc_info *c)
{
struct platform_device *pdev;
struct omap_mmc_platform_data *mmc_pdata;
int res;
if (omap_hsmmc_done != 1)
return;
omap_hsmmc_done++;
for (; c->mmc; c++) {
if (!c->deferred)
continue;
pdev = c->pdev;
if (!pdev)
continue;
mmc_pdata = pdev->dev.platform_data;
if (!mmc_pdata)
continue;
mmc_pdata->slots[0].switch_pin = c->gpio_cd;
mmc_pdata->slots[0].gpio_wp = c->gpio_wp;
res = omap_device_register(pdev);
if (res)
pr_err("Could not late init MMC %s\n",
c->name);
}
}
#define MAX_OMAP_MMC_HWMOD_NAME_LEN 16 #define MAX_OMAP_MMC_HWMOD_NAME_LEN 16
void omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) static void omap_hsmmc_init_one(struct omap2_hsmmc_info *hsmmcinfo,
int ctrl_nr)
{ {
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct omap_hwmod *ohs[1];
struct omap_device *od;
struct platform_device *pdev; struct platform_device *pdev;
char oh_name[MAX_OMAP_MMC_HWMOD_NAME_LEN]; char oh_name[MAX_OMAP_MMC_HWMOD_NAME_LEN];
struct omap_mmc_platform_data *mmc_data; struct omap_mmc_platform_data *mmc_data;
struct omap_mmc_dev_attr *mmc_dev_attr; struct omap_mmc_dev_attr *mmc_dev_attr;
char *name; char *name;
int l; int res;
mmc_data = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL); mmc_data = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
if (!mmc_data) { if (!mmc_data) {
pr_err("Cannot allocate memory for mmc device!\n"); pr_err("Cannot allocate memory for mmc device!\n");
goto done; return;
} }
if (omap_hsmmc_pdata_init(hsmmcinfo, mmc_data) < 0) { res = omap_hsmmc_pdata_init(hsmmcinfo, mmc_data);
pr_err("%s fails!\n", __func__); if (res < 0)
goto done; goto free_mmc;
}
omap_hsmmc_mux(mmc_data, (ctrl_nr - 1)); omap_hsmmc_mux(mmc_data, (ctrl_nr - 1));
name = "omap_hsmmc"; name = "omap_hsmmc";
res = snprintf(oh_name, MAX_OMAP_MMC_HWMOD_NAME_LEN,
l = snprintf(oh_name, MAX_OMAP_MMC_HWMOD_NAME_LEN,
"mmc%d", ctrl_nr); "mmc%d", ctrl_nr);
WARN(l >= MAX_OMAP_MMC_HWMOD_NAME_LEN, WARN(res >= MAX_OMAP_MMC_HWMOD_NAME_LEN,
"String buffer overflow in MMC%d device setup\n", ctrl_nr); "String buffer overflow in MMC%d device setup\n", ctrl_nr);
oh = omap_hwmod_lookup(oh_name); oh = omap_hwmod_lookup(oh_name);
if (!oh) { if (!oh) {
pr_err("Could not look up %s\n", oh_name); pr_err("Could not look up %s\n", oh_name);
kfree(mmc_data->slots[0].name); goto free_name;
goto done;
} }
ohs[0] = oh;
if (oh->dev_attr != NULL) { if (oh->dev_attr != NULL) {
mmc_dev_attr = oh->dev_attr; mmc_dev_attr = oh->dev_attr;
mmc_data->controller_flags = mmc_dev_attr->flags; mmc_data->controller_flags = mmc_dev_attr->flags;
} }
pdev = omap_device_build(name, ctrl_nr - 1, oh, mmc_data, pdev = platform_device_alloc(name, ctrl_nr - 1);
sizeof(struct omap_mmc_platform_data), NULL, 0, false); if (!pdev) {
if (IS_ERR(pdev)) { pr_err("Could not allocate pdev for %s\n", name);
WARN(1, "Can't build omap_device for %s:%s.\n", name, oh->name); goto free_name;
kfree(mmc_data->slots[0].name);
goto done;
} }
/* dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
* return device handle to board setup code
* required to populate for regulator framework structure od = omap_device_alloc(pdev, ohs, 1, NULL, 0);
*/ if (!od) {
hsmmcinfo->dev = &pdev->dev; pr_err("Could not allocate od for %s\n", name);
goto put_pdev;
}
res = platform_device_add_data(pdev, mmc_data,
sizeof(struct omap_mmc_platform_data));
if (res) {
pr_err("Could not add pdata for %s\n", name);
goto put_pdev;
}
hsmmcinfo->pdev = pdev;
if (hsmmcinfo->deferred)
goto free_mmc;
done: res = omap_device_register(pdev);
if (res) {
pr_err("Could not register od for %s\n", name);
goto free_od;
}
goto free_mmc;
free_od:
omap_device_delete(od);
put_pdev:
platform_device_put(pdev);
free_name:
kfree(mmc_data->slots[0].name);
free_mmc:
kfree(mmc_data); kfree(mmc_data);
} }
void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) void __init omap_hsmmc_init(struct omap2_hsmmc_info *controllers)
{ {
u32 reg; u32 reg;
if (omap_hsmmc_done)
return;
omap_hsmmc_done = 1;
if (!cpu_is_omap44xx()) { if (!cpu_is_omap44xx()) {
if (cpu_is_omap2430()) { if (cpu_is_omap2430()) {
control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
...@@ -515,7 +586,7 @@ void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) ...@@ -515,7 +586,7 @@ void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
} }
for (; controllers->mmc; controllers++) for (; controllers->mmc; controllers++)
omap_init_hsmmc(controllers, controllers->mmc); omap_hsmmc_init_one(controllers, controllers->mmc);
} }
......
...@@ -21,10 +21,11 @@ struct omap2_hsmmc_info { ...@@ -21,10 +21,11 @@ struct omap2_hsmmc_info {
bool no_off; /* power_saving and power is not to go off */ bool no_off; /* power_saving and power is not to go off */
bool no_off_init; /* no power off when not in MMC sleep state */ bool no_off_init; /* no power off when not in MMC sleep state */
bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */ bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
bool deferred; /* mmc needs a deferred probe */
int gpio_cd; /* or -EINVAL */ int gpio_cd; /* or -EINVAL */
int gpio_wp; /* or -EINVAL */ int gpio_wp; /* or -EINVAL */
char *name; /* or NULL for default */ char *name; /* or NULL for default */
struct device *dev; /* returned: pointer to mmc adapter */ struct platform_device *pdev; /* mmc controller instance */
int ocr_mask; /* temporary HACK */ int ocr_mask; /* temporary HACK */
/* Remux (pad configuration) when powering on/off */ /* Remux (pad configuration) when powering on/off */
void (*remux)(struct device *dev, int slot, int power_on); void (*remux)(struct device *dev, int slot, int power_on);
...@@ -34,11 +35,16 @@ struct omap2_hsmmc_info { ...@@ -34,11 +35,16 @@ struct omap2_hsmmc_info {
#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
void omap2_hsmmc_init(struct omap2_hsmmc_info *); void omap_hsmmc_init(struct omap2_hsmmc_info *);
void omap_hsmmc_late_init(struct omap2_hsmmc_info *);
#else #else
static inline void omap2_hsmmc_init(struct omap2_hsmmc_info *info) static inline void omap_hsmmc_init(struct omap2_hsmmc_info *info)
{
}
static inline void omap_hsmmc_late_init(struct omap2_hsmmc_info *info)
{ {
} }
......
...@@ -122,7 +122,7 @@ static int omap3_enable_st_clock(unsigned int id, bool enable) ...@@ -122,7 +122,7 @@ static int omap3_enable_st_clock(unsigned int id, bool enable)
return 0; return 0;
} }
static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused) static int __init omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
{ {
int id, count = 1; int id, count = 1;
char *name = "omap-mcbsp"; char *name = "omap-mcbsp";
......
...@@ -100,8 +100,8 @@ void omap_mux_write_array(struct omap_mux_partition *partition, ...@@ -100,8 +100,8 @@ void omap_mux_write_array(struct omap_mux_partition *partition,
static char *omap_mux_options; static char *omap_mux_options;
static int _omap_mux_init_gpio(struct omap_mux_partition *partition, static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition,
int gpio, int val) int gpio, int val)
{ {
struct omap_mux_entry *e; struct omap_mux_entry *e;
struct omap_mux *gpio_mux = NULL; struct omap_mux *gpio_mux = NULL;
...@@ -145,7 +145,7 @@ static int _omap_mux_init_gpio(struct omap_mux_partition *partition, ...@@ -145,7 +145,7 @@ static int _omap_mux_init_gpio(struct omap_mux_partition *partition,
return 0; return 0;
} }
int omap_mux_init_gpio(int gpio, int val) int __init omap_mux_init_gpio(int gpio, int val)
{ {
struct omap_mux_partition *partition; struct omap_mux_partition *partition;
int ret; int ret;
...@@ -159,9 +159,9 @@ int omap_mux_init_gpio(int gpio, int val) ...@@ -159,9 +159,9 @@ int omap_mux_init_gpio(int gpio, int val)
return -ENODEV; return -ENODEV;
} }
static int _omap_mux_get_by_name(struct omap_mux_partition *partition, static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,
const char *muxname, const char *muxname,
struct omap_mux **found_mux) struct omap_mux **found_mux)
{ {
struct omap_mux *mux = NULL; struct omap_mux *mux = NULL;
struct omap_mux_entry *e; struct omap_mux_entry *e;
...@@ -240,7 +240,7 @@ omap_mux_get_by_name(const char *muxname, ...@@ -240,7 +240,7 @@ omap_mux_get_by_name(const char *muxname,
return -ENODEV; return -ENODEV;
} }
int omap_mux_init_signal(const char *muxname, int val) int __init omap_mux_init_signal(const char *muxname, int val)
{ {
struct omap_mux_partition *partition = NULL; struct omap_mux_partition *partition = NULL;
struct omap_mux *mux = NULL; struct omap_mux *mux = NULL;
......
...@@ -263,12 +263,10 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state) ...@@ -263,12 +263,10 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
* In MPUSS OSWR or device OFF, interrupt controller contest is lost. * In MPUSS OSWR or device OFF, interrupt controller contest is lost.
*/ */
mpuss_clear_prev_logic_pwrst(); mpuss_clear_prev_logic_pwrst();
pwrdm_clear_all_prev_pwrst(mpuss_pd);
if ((pwrdm_read_next_pwrst(mpuss_pd) == PWRDM_POWER_RET) && if ((pwrdm_read_next_pwrst(mpuss_pd) == PWRDM_POWER_RET) &&
(pwrdm_read_logic_retst(mpuss_pd) == PWRDM_POWER_OFF)) (pwrdm_read_logic_retst(mpuss_pd) == PWRDM_POWER_OFF))
save_state = 2; save_state = 2;
clear_cpu_prev_pwrst(cpu);
cpu_clear_prev_logic_pwrst(cpu); cpu_clear_prev_logic_pwrst(cpu);
set_cpu_next_pwrst(cpu, power_state); set_cpu_next_pwrst(cpu, power_state);
set_cpu_wakeup_addr(cpu, virt_to_phys(omap4_cpu_resume)); set_cpu_wakeup_addr(cpu, virt_to_phys(omap4_cpu_resume));
......
...@@ -220,8 +220,8 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *dir) ...@@ -220,8 +220,8 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *dir)
return 0; return 0;
d = debugfs_create_dir(pwrdm->name, (struct dentry *)dir); d = debugfs_create_dir(pwrdm->name, (struct dentry *)dir);
if (!(IS_ERR_OR_NULL(d)))
(void) debugfs_create_file("suspend", S_IRUGO|S_IWUSR, d, (void) debugfs_create_file("suspend", S_IRUGO|S_IWUSR, d,
(void *)pwrdm, &pwrdm_suspend_fops); (void *)pwrdm, &pwrdm_suspend_fops);
return 0; return 0;
...@@ -264,7 +264,7 @@ static int __init pm_dbg_init(void) ...@@ -264,7 +264,7 @@ static int __init pm_dbg_init(void)
return 0; return 0;
d = debugfs_create_dir("pm_debug", NULL); d = debugfs_create_dir("pm_debug", NULL);
if (IS_ERR(d)) if (IS_ERR_OR_NULL(d))
return PTR_ERR(d); return PTR_ERR(d);
(void) debugfs_create_file("count", S_IRUGO, (void) debugfs_create_file("count", S_IRUGO,
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/opp.h> #include <linux/opp.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/suspend.h>
#include <plat/omap-pm.h> #include <plat/omap-pm.h>
#include <plat/omap_device.h> #include <plat/omap_device.h>
#include "common.h" #include "common.h"
#include "prcm-common.h"
#include "voltage.h" #include "voltage.h"
#include "powerdomain.h" #include "powerdomain.h"
#include "clockdomain.h" #include "clockdomain.h"
...@@ -28,7 +30,13 @@ ...@@ -28,7 +30,13 @@
static struct omap_device_pm_latency *pm_lats; static struct omap_device_pm_latency *pm_lats;
static int _init_omap_device(char *name) /*
* omap_pm_suspend: points to a function that does the SoC-specific
* suspend work
*/
int (*omap_pm_suspend)(void);
static int __init _init_omap_device(char *name)
{ {
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct platform_device *pdev; struct platform_device *pdev;
...@@ -68,32 +76,41 @@ static void omap2_init_processor_devices(void) ...@@ -68,32 +76,41 @@ static void omap2_init_processor_devices(void)
#define FORCEWAKEUP_SWITCH 0 #define FORCEWAKEUP_SWITCH 0
#define LOWPOWERSTATE_SWITCH 1 #define LOWPOWERSTATE_SWITCH 1
int __init omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused)
{
if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
clkdm_allow_idle(clkdm);
else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
atomic_read(&clkdm->usecount) == 0)
clkdm_sleep(clkdm);
return 0;
}
/* /*
* This sets pwrdm state (other than mpu & core. Currently only ON & * This sets pwrdm state (other than mpu & core. Currently only ON &
* RET are supported. * RET are supported.
*/ */
int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 pwrst)
{ {
u32 cur_state; u8 curr_pwrst, next_pwrst;
int sleep_switch = -1; int sleep_switch = -1, ret = 0, hwsup = 0;
int ret = 0;
int hwsup = 0;
if (pwrdm == NULL || IS_ERR(pwrdm)) if (!pwrdm || IS_ERR(pwrdm))
return -EINVAL; return -EINVAL;
while (!(pwrdm->pwrsts & (1 << state))) { while (!(pwrdm->pwrsts & (1 << pwrst))) {
if (state == PWRDM_POWER_OFF) if (pwrst == PWRDM_POWER_OFF)
return ret; return ret;
state--; pwrst--;
} }
cur_state = pwrdm_read_next_pwrst(pwrdm); next_pwrst = pwrdm_read_next_pwrst(pwrdm);
if (cur_state == state) if (next_pwrst == pwrst)
return ret; return ret;
if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) { curr_pwrst = pwrdm_read_pwrst(pwrdm);
if ((pwrdm_read_pwrst(pwrdm) > state) && if (curr_pwrst < PWRDM_POWER_ON) {
if ((curr_pwrst > pwrst) &&
(pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) { (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) {
sleep_switch = LOWPOWERSTATE_SWITCH; sleep_switch = LOWPOWERSTATE_SWITCH;
} else { } else {
...@@ -103,12 +120,10 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) ...@@ -103,12 +120,10 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
} }
} }
ret = pwrdm_set_next_pwrst(pwrdm, state); ret = pwrdm_set_next_pwrst(pwrdm, pwrst);
if (ret) { if (ret)
pr_err("%s: unable to set state of powerdomain: %s\n", pr_err("%s: unable to set power state of powerdomain: %s\n",
__func__, pwrdm->name); __func__, pwrdm->name);
goto err;
}
switch (sleep_switch) { switch (sleep_switch) {
case FORCEWAKEUP_SWITCH: case FORCEWAKEUP_SWITCH:
...@@ -119,16 +134,16 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) ...@@ -119,16 +134,16 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
break; break;
case LOWPOWERSTATE_SWITCH: case LOWPOWERSTATE_SWITCH:
pwrdm_set_lowpwrstchange(pwrdm); pwrdm_set_lowpwrstchange(pwrdm);
pwrdm_wait_transition(pwrdm);
pwrdm_state_switch(pwrdm);
break; break;
default:
return ret;
} }
pwrdm_state_switch(pwrdm);
err:
return ret; return ret;
} }
/* /*
* This API is to be called during init to set the various voltage * This API is to be called during init to set the various voltage
* domains to the voltage as per the opp table. Typically we boot up * domains to the voltage as per the opp table. Typically we boot up
...@@ -196,6 +211,56 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, ...@@ -196,6 +211,56 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
return -EINVAL; return -EINVAL;
} }
#ifdef CONFIG_SUSPEND
static int omap_pm_enter(suspend_state_t suspend_state)
{
int ret = 0;
if (!omap_pm_suspend)
return -ENOENT; /* XXX doublecheck */
switch (suspend_state) {
case PM_SUSPEND_STANDBY:
case PM_SUSPEND_MEM:
ret = omap_pm_suspend();
break;
default:
ret = -EINVAL;
}
return ret;
}
static int omap_pm_begin(suspend_state_t state)
{
disable_hlt();
if (cpu_is_omap34xx())
omap_prcm_irq_prepare();
return 0;
}
static void omap_pm_end(void)
{
enable_hlt();
return;
}
static void omap_pm_finish(void)
{
if (cpu_is_omap34xx())
omap_prcm_irq_complete();
}
static const struct platform_suspend_ops omap_pm_ops = {
.begin = omap_pm_begin,
.end = omap_pm_end,
.enter = omap_pm_enter,
.finish = omap_pm_finish,
.valid = suspend_valid_only_mem,
};
#endif /* CONFIG_SUSPEND */
static void __init omap3_init_voltages(void) static void __init omap3_init_voltages(void)
{ {
if (!cpu_is_omap34xx()) if (!cpu_is_omap34xx())
...@@ -238,6 +303,10 @@ static int __init omap2_common_pm_late_init(void) ...@@ -238,6 +303,10 @@ static int __init omap2_common_pm_late_init(void)
/* Smartreflex device init */ /* Smartreflex device init */
omap_devinit_smartreflex(); omap_devinit_smartreflex();
#ifdef CONFIG_SUSPEND
suspend_set_ops(&omap_pm_ops);
#endif
return 0; return 0;
} }
late_initcall(omap2_common_pm_late_init); late_initcall(omap2_common_pm_late_init);
...@@ -22,6 +22,8 @@ extern int omap3_can_sleep(void); ...@@ -22,6 +22,8 @@ extern int omap3_can_sleep(void);
extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state); extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state);
extern int omap3_idle_init(void); extern int omap3_idle_init(void);
extern int omap4_idle_init(void); extern int omap4_idle_init(void);
extern int omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused);
extern int (*omap_pm_suspend)(void);
#if defined(CONFIG_PM_OPP) #if defined(CONFIG_PM_OPP)
extern int omap3_opp_init(void); extern int omap3_opp_init(void);
......
...@@ -52,19 +52,6 @@ ...@@ -52,19 +52,6 @@
#include "powerdomain.h" #include "powerdomain.h"
#include "clockdomain.h" #include "clockdomain.h"
#ifdef CONFIG_SUSPEND
static suspend_state_t suspend_state = PM_SUSPEND_ON;
static inline bool is_suspending(void)
{
return (suspend_state != PM_SUSPEND_ON);
}
#else
static inline bool is_suspending(void)
{
return false;
}
#endif
static void (*omap2_sram_idle)(void); static void (*omap2_sram_idle)(void);
static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl,
void __iomem *sdrc_power); void __iomem *sdrc_power);
...@@ -84,7 +71,7 @@ static int omap2_fclks_active(void) ...@@ -84,7 +71,7 @@ static int omap2_fclks_active(void)
return (f1 | f2) ? 1 : 0; return (f1 | f2) ? 1 : 0;
} }
static void omap2_enter_full_retention(void) static int omap2_enter_full_retention(void)
{ {
u32 l; u32 l;
...@@ -147,6 +134,8 @@ static void omap2_enter_full_retention(void) ...@@ -147,6 +134,8 @@ static void omap2_enter_full_retention(void)
/* Mask future PRCM-to-MPU interrupts */ /* Mask future PRCM-to-MPU interrupts */
omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET); omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
return 0;
} }
static int omap2_i2c_active(void) static int omap2_i2c_active(void)
...@@ -243,57 +232,6 @@ static void omap2_pm_idle(void) ...@@ -243,57 +232,6 @@ static void omap2_pm_idle(void)
local_fiq_enable(); local_fiq_enable();
} }
#ifdef CONFIG_SUSPEND
static int omap2_pm_begin(suspend_state_t state)
{
disable_hlt();
suspend_state = state;
return 0;
}
static int omap2_pm_enter(suspend_state_t state)
{
int ret = 0;
switch (state) {
case PM_SUSPEND_STANDBY:
case PM_SUSPEND_MEM:
omap2_enter_full_retention();
break;
default:
ret = -EINVAL;
}
return ret;
}
static void omap2_pm_end(void)
{
suspend_state = PM_SUSPEND_ON;
enable_hlt();
}
static const struct platform_suspend_ops omap_pm_ops = {
.begin = omap2_pm_begin,
.enter = omap2_pm_enter,
.end = omap2_pm_end,
.valid = suspend_valid_only_mem,
};
#else
static const struct platform_suspend_ops __initdata omap_pm_ops;
#endif /* CONFIG_SUSPEND */
/* XXX This function should be shareable between OMAP2xxx and OMAP3 */
static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
{
if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
clkdm_allow_idle(clkdm);
else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
atomic_read(&clkdm->usecount) == 0)
clkdm_sleep(clkdm);
return 0;
}
static void __init prcm_setup_regs(void) static void __init prcm_setup_regs(void)
{ {
int i, num_mem_banks; int i, num_mem_banks;
...@@ -335,9 +273,13 @@ static void __init prcm_setup_regs(void) ...@@ -335,9 +273,13 @@ static void __init prcm_setup_regs(void)
clkdm_sleep(gfx_clkdm); clkdm_sleep(gfx_clkdm);
/* Enable hardware-supervised idle for all clkdms */ /* Enable hardware-supervised idle for all clkdms */
clkdm_for_each(clkdms_setup, NULL); clkdm_for_each(omap_pm_clkdms_setup, NULL);
clkdm_add_wkdep(mpu_clkdm, wkup_clkdm); clkdm_add_wkdep(mpu_clkdm, wkup_clkdm);
#ifdef CONFIG_SUSPEND
omap_pm_suspend = omap2_enter_full_retention;
#endif
/* REVISIT: Configure number of 32 kHz clock cycles for sys_clk /* REVISIT: Configure number of 32 kHz clock cycles for sys_clk
* stabilisation */ * stabilisation */
omap2_prm_write_mod_reg(15 << OMAP_SETUP_TIME_SHIFT, OMAP24XX_GR_MOD, omap2_prm_write_mod_reg(15 << OMAP_SETUP_TIME_SHIFT, OMAP24XX_GR_MOD,
...@@ -438,7 +380,6 @@ static int __init omap2_pm_init(void) ...@@ -438,7 +380,6 @@ static int __init omap2_pm_init(void)
omap24xx_cpu_suspend_sz); omap24xx_cpu_suspend_sz);
} }
suspend_set_ops(&omap_pm_ops);
arm_pm_idle = omap2_pm_idle; arm_pm_idle = omap2_pm_idle;
return 0; return 0;
......
...@@ -50,10 +50,6 @@ ...@@ -50,10 +50,6 @@
#include "sdrc.h" #include "sdrc.h"
#include "control.h" #include "control.h"
#ifdef CONFIG_SUSPEND
static suspend_state_t suspend_state = PM_SUSPEND_ON;
#endif
/* pm34xx errata defined in pm.h */ /* pm34xx errata defined in pm.h */
u16 pm34xx_errata; u16 pm34xx_errata;
...@@ -280,11 +276,6 @@ void omap_sram_idle(void) ...@@ -280,11 +276,6 @@ void omap_sram_idle(void)
int core_prev_state, per_prev_state; int core_prev_state, per_prev_state;
u32 sdrc_pwr = 0; u32 sdrc_pwr = 0;
pwrdm_clear_all_prev_pwrst(mpu_pwrdm);
pwrdm_clear_all_prev_pwrst(neon_pwrdm);
pwrdm_clear_all_prev_pwrst(core_pwrdm);
pwrdm_clear_all_prev_pwrst(per_pwrdm);
mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm); mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm);
switch (mpu_next_state) { switch (mpu_next_state) {
case PWRDM_POWER_ON: case PWRDM_POWER_ON:
...@@ -463,50 +454,6 @@ static int omap3_pm_suspend(void) ...@@ -463,50 +454,6 @@ static int omap3_pm_suspend(void)
return ret; return ret;
} }
static int omap3_pm_enter(suspend_state_t unused)
{
int ret = 0;
switch (suspend_state) {
case PM_SUSPEND_STANDBY:
case PM_SUSPEND_MEM:
ret = omap3_pm_suspend();
break;
default:
ret = -EINVAL;
}
return ret;
}
/* Hooks to enable / disable UART interrupts during suspend */
static int omap3_pm_begin(suspend_state_t state)
{
disable_hlt();
suspend_state = state;
omap_prcm_irq_prepare();
return 0;
}
static void omap3_pm_end(void)
{
suspend_state = PM_SUSPEND_ON;
enable_hlt();
return;
}
static void omap3_pm_finish(void)
{
omap_prcm_irq_complete();
}
static const struct platform_suspend_ops omap_pm_ops = {
.begin = omap3_pm_begin,
.end = omap3_pm_end,
.enter = omap3_pm_enter,
.finish = omap3_pm_finish,
.valid = suspend_valid_only_mem,
};
#endif /* CONFIG_SUSPEND */ #endif /* CONFIG_SUSPEND */
...@@ -726,21 +673,6 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused) ...@@ -726,21 +673,6 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
return omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state); return omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
} }
/*
* Enable hw supervised mode for all clockdomains if it's
* supported. Initiate sleep transition for other clockdomains, if
* they are not used
*/
static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
{
if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
clkdm_allow_idle(clkdm);
else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
atomic_read(&clkdm->usecount) == 0)
clkdm_sleep(clkdm);
return 0;
}
/* /*
* Push functions to SRAM * Push functions to SRAM
* *
...@@ -810,7 +742,7 @@ static int __init omap3_pm_init(void) ...@@ -810,7 +742,7 @@ static int __init omap3_pm_init(void)
goto err2; goto err2;
} }
(void) clkdm_for_each(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) {
...@@ -829,8 +761,8 @@ static int __init omap3_pm_init(void) ...@@ -829,8 +761,8 @@ static int __init omap3_pm_init(void)
core_clkdm = clkdm_lookup("core_clkdm"); core_clkdm = clkdm_lookup("core_clkdm");
#ifdef CONFIG_SUSPEND #ifdef CONFIG_SUSPEND
suspend_set_ops(&omap_pm_ops); omap_pm_suspend = omap3_pm_suspend;
#endif /* CONFIG_SUSPEND */ #endif
arm_pm_idle = omap3_pm_idle; arm_pm_idle = omap3_pm_idle;
omap3_idle_init(); omap3_idle_init();
......
...@@ -83,59 +83,8 @@ static int omap4_pm_suspend(void) ...@@ -83,59 +83,8 @@ static int omap4_pm_suspend(void)
return 0; return 0;
} }
static int omap4_pm_enter(suspend_state_t suspend_state)
{
int ret = 0;
switch (suspend_state) {
case PM_SUSPEND_STANDBY:
case PM_SUSPEND_MEM:
ret = omap4_pm_suspend();
break;
default:
ret = -EINVAL;
}
return ret;
}
static int omap4_pm_begin(suspend_state_t state)
{
disable_hlt();
return 0;
}
static void omap4_pm_end(void)
{
enable_hlt();
return;
}
static const struct platform_suspend_ops omap_pm_ops = {
.begin = omap4_pm_begin,
.end = omap4_pm_end,
.enter = omap4_pm_enter,
.valid = suspend_valid_only_mem,
};
#endif /* CONFIG_SUSPEND */ #endif /* CONFIG_SUSPEND */
/*
* Enable hardware supervised mode for all clockdomains if it's
* supported. Initiate sleep transition for other clockdomains, if
* they are not used
*/
static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
{
if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
clkdm_allow_idle(clkdm);
else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
atomic_read(&clkdm->usecount) == 0)
clkdm_sleep(clkdm);
return 0;
}
static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused) static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
{ {
struct power_state *pwrst; struct power_state *pwrst;
...@@ -247,11 +196,11 @@ static int __init omap4_pm_init(void) ...@@ -247,11 +196,11 @@ static int __init omap4_pm_init(void)
goto err2; goto err2;
} }
(void) clkdm_for_each(clkdms_setup, NULL); (void) clkdm_for_each(omap_pm_clkdms_setup, NULL);
#ifdef CONFIG_SUSPEND #ifdef CONFIG_SUSPEND
suspend_set_ops(&omap_pm_ops); omap_pm_suspend = omap4_pm_suspend;
#endif /* CONFIG_SUSPEND */ #endif
/* Overwrite the default cpu_do_idle() */ /* Overwrite the default cpu_do_idle() */
arm_pm_idle = omap_default_idle; arm_pm_idle = omap_default_idle;
......
...@@ -69,7 +69,7 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data, ...@@ -69,7 +69,7 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data,
sr_data->nvalue_count = count; sr_data->nvalue_count = count;
} }
static int sr_dev_init(struct omap_hwmod *oh, void *user) static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
{ {
struct omap_sr_data *sr_data; struct omap_sr_data *sr_data;
struct platform_device *pdev; struct platform_device *pdev;
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#include <plat/omap_hwmod.h> #include <plat/omap_hwmod.h>
extern struct device omap_device_parent; extern struct dev_pm_domain omap_device_pm_domain;
/* omap_device._state values */ /* omap_device._state values */
#define OMAP_DEVICE_STATE_UNKNOWN 0 #define OMAP_DEVICE_STATE_UNKNOWN 0
...@@ -100,6 +100,13 @@ struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, ...@@ -100,6 +100,13 @@ struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt, int is_early_device); int pm_lats_cnt, int is_early_device);
struct omap_device *omap_device_alloc(struct platform_device *pdev,
struct omap_hwmod **ohs, int oh_cnt,
struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt);
void omap_device_delete(struct omap_device *od);
int omap_device_register(struct platform_device *pdev);
void __iomem *omap_device_get_rt_va(struct omap_device *od); void __iomem *omap_device_get_rt_va(struct omap_device *od);
struct device *omap_device_get_by_hwmod_name(const char *oh_name); struct device *omap_device_get_by_hwmod_name(const char *oh_name);
......
...@@ -319,7 +319,7 @@ int omap_pm_get_dev_context_loss_count(struct device *dev) ...@@ -319,7 +319,7 @@ int omap_pm_get_dev_context_loss_count(struct device *dev)
if (WARN_ON(!dev)) if (WARN_ON(!dev))
return -ENODEV; return -ENODEV;
if (dev->parent == &omap_device_parent) { if (dev->pm_domain == &omap_device_pm_domain) {
count = omap_device_get_context_loss_count(pdev); count = omap_device_get_context_loss_count(pdev);
} else { } else {
WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device", WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device",
......
/* /*
* omap_device implementation * omap_device implementation
* *
...@@ -97,14 +98,7 @@ ...@@ -97,14 +98,7 @@
#define USE_WAKEUP_LAT 0 #define USE_WAKEUP_LAT 0
#define IGNORE_WAKEUP_LAT 1 #define IGNORE_WAKEUP_LAT 1
static int omap_device_register(struct platform_device *pdev);
static int omap_early_device_register(struct platform_device *pdev); static int omap_early_device_register(struct platform_device *pdev);
static struct omap_device *omap_device_alloc(struct platform_device *pdev,
struct omap_hwmod **ohs, int oh_cnt,
struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt);
static void omap_device_delete(struct omap_device *od);
static struct omap_device_pm_latency omap_default_latency[] = { static struct omap_device_pm_latency omap_default_latency[] = {
{ {
...@@ -320,8 +314,6 @@ static void _add_hwmod_clocks_clkdev(struct omap_device *od, ...@@ -320,8 +314,6 @@ static void _add_hwmod_clocks_clkdev(struct omap_device *od,
} }
static struct dev_pm_domain omap_device_pm_domain;
/** /**
* omap_device_build_from_dt - build an omap_device with multiple hwmods * omap_device_build_from_dt - build an omap_device with multiple hwmods
* @pdev_name: name of the platform_device driver to use * @pdev_name: name of the platform_device driver to use
...@@ -509,7 +501,7 @@ static int omap_device_fill_resources(struct omap_device *od, ...@@ -509,7 +501,7 @@ static int omap_device_fill_resources(struct omap_device *od,
* *
* Returns an struct omap_device pointer or ERR_PTR() on error; * Returns an struct omap_device pointer or ERR_PTR() on error;
*/ */
static struct omap_device *omap_device_alloc(struct platform_device *pdev, struct omap_device *omap_device_alloc(struct platform_device *pdev,
struct omap_hwmod **ohs, int oh_cnt, struct omap_hwmod **ohs, int oh_cnt,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt) int pm_lats_cnt)
...@@ -591,7 +583,7 @@ static struct omap_device *omap_device_alloc(struct platform_device *pdev, ...@@ -591,7 +583,7 @@ static struct omap_device *omap_device_alloc(struct platform_device *pdev,
return ERR_PTR(ret); return ERR_PTR(ret);
} }
static void omap_device_delete(struct omap_device *od) void omap_device_delete(struct omap_device *od)
{ {
if (!od) if (!od)
return; return;
...@@ -619,7 +611,7 @@ static void omap_device_delete(struct omap_device *od) ...@@ -619,7 +611,7 @@ static void omap_device_delete(struct omap_device *od)
* information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise, * information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise,
* passes along the return value of omap_device_build_ss(). * passes along the return value of omap_device_build_ss().
*/ */
struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, struct platform_device __init *omap_device_build(const char *pdev_name, int pdev_id,
struct omap_hwmod *oh, void *pdata, struct omap_hwmod *oh, void *pdata,
int pdata_len, int pdata_len,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
...@@ -652,7 +644,7 @@ struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, ...@@ -652,7 +644,7 @@ struct platform_device *omap_device_build(const char *pdev_name, int pdev_id,
* platform_device record. Returns an ERR_PTR() on error, or passes * platform_device record. Returns an ERR_PTR() on error, or passes
* along the return value of omap_device_register(). * along the return value of omap_device_register().
*/ */
struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, struct platform_device __init *omap_device_build_ss(const char *pdev_name, int pdev_id,
struct omap_hwmod **ohs, int oh_cnt, struct omap_hwmod **ohs, int oh_cnt,
void *pdata, int pdata_len, void *pdata, int pdata_len,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
...@@ -717,7 +709,7 @@ struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, ...@@ -717,7 +709,7 @@ struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
* platform_early_add_device() on the underlying platform_device. * platform_early_add_device() on the underlying platform_device.
* Returns 0 by default. * Returns 0 by default.
*/ */
static int omap_early_device_register(struct platform_device *pdev) static int __init omap_early_device_register(struct platform_device *pdev)
{ {
struct platform_device *devices[1]; struct platform_device *devices[1];
...@@ -762,14 +754,12 @@ static int _od_suspend_noirq(struct device *dev) ...@@ -762,14 +754,12 @@ static int _od_suspend_noirq(struct device *dev)
struct omap_device *od = to_omap_device(pdev); struct omap_device *od = to_omap_device(pdev);
int ret; int ret;
if (od->flags & OMAP_DEVICE_NO_IDLE_ON_SUSPEND)
return pm_generic_suspend_noirq(dev);
ret = pm_generic_suspend_noirq(dev); ret = pm_generic_suspend_noirq(dev);
if (!ret && !pm_runtime_status_suspended(dev)) { if (!ret && !pm_runtime_status_suspended(dev)) {
if (pm_generic_runtime_suspend(dev) == 0) { if (pm_generic_runtime_suspend(dev) == 0) {
omap_device_idle(pdev); if (!(od->flags & OMAP_DEVICE_NO_IDLE_ON_SUSPEND))
omap_device_idle(pdev);
od->flags |= OMAP_DEVICE_SUSPENDED; od->flags |= OMAP_DEVICE_SUSPENDED;
} }
} }
...@@ -782,13 +772,11 @@ static int _od_resume_noirq(struct device *dev) ...@@ -782,13 +772,11 @@ static int _od_resume_noirq(struct device *dev)
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct omap_device *od = to_omap_device(pdev); struct omap_device *od = to_omap_device(pdev);
if (od->flags & OMAP_DEVICE_NO_IDLE_ON_SUSPEND)
return pm_generic_resume_noirq(dev);
if ((od->flags & OMAP_DEVICE_SUSPENDED) && if ((od->flags & OMAP_DEVICE_SUSPENDED) &&
!pm_runtime_status_suspended(dev)) { !pm_runtime_status_suspended(dev)) {
od->flags &= ~OMAP_DEVICE_SUSPENDED; od->flags &= ~OMAP_DEVICE_SUSPENDED;
omap_device_enable(pdev); if (!(od->flags & OMAP_DEVICE_NO_IDLE_ON_SUSPEND))
omap_device_enable(pdev);
pm_generic_runtime_resume(dev); pm_generic_runtime_resume(dev);
} }
...@@ -799,7 +787,7 @@ static int _od_resume_noirq(struct device *dev) ...@@ -799,7 +787,7 @@ static int _od_resume_noirq(struct device *dev)
#define _od_resume_noirq NULL #define _od_resume_noirq NULL
#endif #endif
static struct dev_pm_domain omap_device_pm_domain = { struct dev_pm_domain omap_device_pm_domain = {
.ops = { .ops = {
SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume, SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
_od_runtime_idle) _od_runtime_idle)
...@@ -817,11 +805,10 @@ static struct dev_pm_domain omap_device_pm_domain = { ...@@ -817,11 +805,10 @@ static struct dev_pm_domain omap_device_pm_domain = {
* platform_device_register() on the underlying platform_device. * platform_device_register() on the underlying platform_device.
* Returns the return value of platform_device_register(). * Returns the return value of platform_device_register().
*/ */
static int omap_device_register(struct platform_device *pdev) int omap_device_register(struct platform_device *pdev)
{ {
pr_debug("omap_device: %s: registering\n", pdev->name); pr_debug("omap_device: %s: registering\n", pdev->name);
pdev->dev.parent = &omap_device_parent;
pdev->dev.pm_domain = &omap_device_pm_domain; pdev->dev.pm_domain = &omap_device_pm_domain;
return platform_device_add(pdev); return platform_device_add(pdev);
} }
...@@ -1130,11 +1117,6 @@ int omap_device_enable_clocks(struct omap_device *od) ...@@ -1130,11 +1117,6 @@ int omap_device_enable_clocks(struct omap_device *od)
return 0; return 0;
} }
struct device omap_device_parent = {
.init_name = "omap",
.parent = &platform_bus,
};
static struct notifier_block platform_nb = { static struct notifier_block platform_nb = {
.notifier_call = _omap_device_notifier_call, .notifier_call = _omap_device_notifier_call,
}; };
...@@ -1142,6 +1124,6 @@ static struct notifier_block platform_nb = { ...@@ -1142,6 +1124,6 @@ static struct notifier_block platform_nb = {
static int __init omap_device_init(void) static int __init omap_device_init(void)
{ {
bus_register_notifier(&platform_bus_type, &platform_nb); bus_register_notifier(&platform_bus_type, &platform_nb);
return device_register(&omap_device_parent); return 0;
} }
core_initcall(omap_device_init); core_initcall(omap_device_init);
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