mirror of https://gitee.com/openkylin/linux.git
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
This commit is contained in:
commit
e65bc8918f
|
@ -279,7 +279,7 @@ static void __init omap_2430sdp_init(void)
|
|||
platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices));
|
||||
omap_serial_init();
|
||||
omap_sdrc_init(NULL, NULL);
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_init(mmc);
|
||||
omap2_usbfs_init(&sdp2430_usb_config);
|
||||
|
||||
omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP);
|
||||
|
|
|
@ -232,11 +232,13 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
*/
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 4,
|
||||
.deferred = true,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 7,
|
||||
.deferred = true,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
@ -249,7 +251,7 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
|
|||
*/
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
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_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl");
|
||||
|
@ -606,6 +608,7 @@ static void __init omap_3430sdp_init(void)
|
|||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap_board_config = sdp3430_config;
|
||||
omap_board_config_size = ARRAY_SIZE(sdp3430_config);
|
||||
omap_hsmmc_init(mmc);
|
||||
omap3430_i2c_init();
|
||||
omap_display_init(&sdp3430_dss_data);
|
||||
if (omap_rev() > OMAP3430_REV_ES1_0)
|
||||
|
|
|
@ -491,9 +491,9 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
|||
{
|
||||
struct omap2_hsmmc_info *c;
|
||||
|
||||
omap2_hsmmc_init(controllers);
|
||||
omap_hsmmc_init(controllers);
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -504,7 +504,7 @@ static void __init am3517_evm_init(void)
|
|||
am3517_evm_musb_init();
|
||||
|
||||
/* MMC init function */
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_init(mmc);
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
|
||||
|
|
|
@ -412,7 +412,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
|
||||
.deferred = true,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
|
@ -470,7 +470,7 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
|
|||
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_late_init(mmc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -638,6 +638,7 @@ static void __init cm_t3x_common_init(void)
|
|||
omap_serial_init();
|
||||
omap_sdrc_init(mt46h32m32lf6_sdrc_params,
|
||||
mt46h32m32lf6_sdrc_params);
|
||||
omap_hsmmc_init(mmc);
|
||||
cm_t35_init_i2c();
|
||||
omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL);
|
||||
cm_t35_init_ethernet();
|
||||
|
|
|
@ -100,6 +100,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 29,
|
||||
.deferred = true,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
@ -228,7 +229,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
|
|||
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
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) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
|
@ -636,6 +637,7 @@ static void __init devkit8000_init(void)
|
|||
|
||||
omap_dm9000_init();
|
||||
|
||||
omap_hsmmc_init(mmc);
|
||||
devkit8000_i2c_init();
|
||||
platform_add_devices(devkit8000_devices,
|
||||
ARRAY_SIZE(devkit8000_devices));
|
||||
|
|
|
@ -189,7 +189,7 @@ static u8 get_gpmc0_type(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)
|
||||
{
|
||||
u8 cs = 0;
|
||||
|
|
|
@ -295,6 +295,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.deferred = true,
|
||||
},
|
||||
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
|
||||
{
|
||||
|
@ -402,7 +403,7 @@ static int igep_twl_gpio_setup(struct device *dev,
|
|||
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_late_init(mmc);
|
||||
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
|
||||
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
|
@ -639,6 +640,9 @@ static void __init igep_init(void)
|
|||
|
||||
/* Get IGEP2 hardware revision */
|
||||
igep2_get_revision();
|
||||
|
||||
omap_hsmmc_init(mmc);
|
||||
|
||||
/* Register I2C busses and drivers */
|
||||
igep_i2c_init();
|
||||
platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices));
|
||||
|
|
|
@ -424,7 +424,7 @@ static void __init omap_ldp_init(void)
|
|||
board_nand_init(ldp_nand_partitions,
|
||||
ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
|
||||
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_init(mmc);
|
||||
ldp_display_init();
|
||||
}
|
||||
|
||||
|
|
|
@ -370,7 +370,11 @@ static void n8x0_mmc_callback(void *data, u8 card_mask)
|
|||
else
|
||||
*openp = 0;
|
||||
|
||||
#ifdef CONFIG_MMC_OMAP
|
||||
omap_mmc_notify_cover_event(mmc_device, index, *openp);
|
||||
#else
|
||||
pr_warn("MMC: notify cover event not available\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
static int n8x0_mmc_late_init(struct device *dev)
|
||||
|
|
|
@ -253,6 +253,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = -EINVAL,
|
||||
.deferred = true,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
@ -272,12 +273,10 @@ static int beagle_twl_gpio_setup(struct device *dev,
|
|||
{
|
||||
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;
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
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
|
||||
|
@ -521,6 +520,11 @@ static void __init omap3_beagle_init(void)
|
|||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
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();
|
||||
|
||||
gpio_buttons[0].gpio = beagle_config.usr_button_gpio;
|
||||
|
|
|
@ -317,6 +317,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 63,
|
||||
.deferred = true,
|
||||
},
|
||||
#ifdef CONFIG_WL12XX_PLATFORM_DATA
|
||||
{
|
||||
|
@ -361,9 +362,8 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
|
|||
int r, lcd_bl_en;
|
||||
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
omap_mux_init_gpio(63, OMAP_PIN_INPUT);
|
||||
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
|
||||
|
@ -644,6 +644,9 @@ static void __init omap3_evm_init(void)
|
|||
omap_board_config = 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();
|
||||
|
||||
omap_display_init(&omap3_evm_dss_data);
|
||||
|
|
|
@ -128,7 +128,7 @@ static void __init board_mmc_init(void)
|
|||
return;
|
||||
}
|
||||
|
||||
omap2_hsmmc_init(board_mmc_info);
|
||||
omap_hsmmc_init(board_mmc_info);
|
||||
}
|
||||
|
||||
static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
|
||||
|
|
|
@ -273,6 +273,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = {
|
|||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 126,
|
||||
.ext_clock = 0,
|
||||
.deferred = true,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
|
@ -281,6 +282,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = {
|
|||
.gpio_wp = 127,
|
||||
.ext_clock = 1,
|
||||
.transceiver = true,
|
||||
.deferred = true,
|
||||
},
|
||||
{
|
||||
.mmc = 3,
|
||||
|
@ -300,7 +302,7 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
|
|||
/* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */
|
||||
omap3pandora_mmc[0].gpio_cd = gpio + 0;
|
||||
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_32khz = gpio + 13;
|
||||
|
@ -580,6 +582,7 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
static void __init omap3pandora_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap_hsmmc_init(omap3pandora_mmc);
|
||||
omap3pandora_i2c_init();
|
||||
pandora_wl1251_init();
|
||||
platform_add_devices(omap3pandora_devices,
|
||||
|
|
|
@ -209,10 +209,11 @@ static struct regulator_init_data omap3stalker_vsim = {
|
|||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 23,
|
||||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 23,
|
||||
.deferred = true,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
@ -282,9 +283,8 @@ omap3stalker_twl_gpio_setup(struct device *dev,
|
|||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
omap_mux_init_gpio(23, OMAP_PIN_INPUT);
|
||||
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
|
||||
|
@ -425,6 +425,9 @@ static void __init omap3_stalker_init(void)
|
|||
omap_board_config = 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();
|
||||
|
||||
platform_add_devices(omap3_stalker_devices,
|
||||
|
|
|
@ -100,6 +100,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 29,
|
||||
.deferred = true,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
@ -117,15 +118,9 @@ static struct gpio_led gpio_leds[];
|
|||
static int touchbook_twl_gpio_setup(struct device *dev,
|
||||
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) */
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_late_init(mmc);
|
||||
|
||||
/* REVISIT: need ehci-omap hooks for external VBUS
|
||||
* power switch and overcurrent detect
|
||||
|
@ -351,6 +346,14 @@ static void __init omap3_touchbook_init(void)
|
|||
|
||||
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();
|
||||
platform_add_devices(omap3_touchbook_devices,
|
||||
ARRAY_SIZE(omap3_touchbook_devices));
|
||||
|
|
|
@ -245,9 +245,9 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
|||
{
|
||||
struct omap2_hsmmc_info *c;
|
||||
|
||||
omap2_hsmmc_init(controllers);
|
||||
omap_hsmmc_init(controllers);
|
||||
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;
|
||||
}
|
||||
|
@ -461,7 +461,7 @@ static struct omap_dss_board_info omap4_panda_dss_data = {
|
|||
.default_device = &omap4_panda_dvi_device,
|
||||
};
|
||||
|
||||
void omap4_panda_display_init(void)
|
||||
void __init omap4_panda_display_init(void)
|
||||
{
|
||||
int r;
|
||||
|
||||
|
|
|
@ -407,8 +407,6 @@ static inline void __init overo_init_keys(void) { return; }
|
|||
static int overo_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
|
@ -505,6 +503,7 @@ static void __init overo_init(void)
|
|||
int ret;
|
||||
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap_hsmmc_init(mmc);
|
||||
overo_i2c_init();
|
||||
omap_display_init(&overo_dss_data);
|
||||
omap_serial_init();
|
||||
|
|
|
@ -120,7 +120,7 @@ static void __init rm680_peripherals_init(void)
|
|||
ARRAY_SIZE(rm680_peripherals_devices));
|
||||
rm680_i2c_init();
|
||||
gpmc_onenand_init(board_onenand_data);
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_init(mmc);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
|
|
@ -1142,7 +1142,7 @@ void __init rx51_peripherals_init(void)
|
|||
|
||||
partition = omap_mux_get("core");
|
||||
if (partition)
|
||||
omap2_hsmmc_init(mmc);
|
||||
omap_hsmmc_init(mmc);
|
||||
|
||||
rx51_charger_init();
|
||||
}
|
||||
|
|
|
@ -205,6 +205,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_wp = -EINVAL,
|
||||
.power_saving = true,
|
||||
.deferred = true,
|
||||
},
|
||||
{
|
||||
.name = "internal",
|
||||
|
@ -233,7 +234,7 @@ static int zoom_twl_gpio_setup(struct device *dev,
|
|||
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
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,
|
||||
"lcd enable");
|
||||
|
@ -301,6 +302,7 @@ void __init zoom_peripherals_init(void)
|
|||
if (ret)
|
||||
pr_err("error setting wl12xx data: %d\n", ret);
|
||||
|
||||
omap_hsmmc_init(mmc);
|
||||
omap_i2c_init();
|
||||
platform_device_register(&omap_vwlan_device);
|
||||
usb_musb_init(NULL);
|
||||
|
|
|
@ -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)
|
||||
static inline void omap_init_mbox(void)
|
||||
static inline void __init omap_init_mbox(void)
|
||||
{
|
||||
struct omap_hwmod *oh;
|
||||
struct platform_device *pdev;
|
||||
|
@ -337,7 +337,7 @@ static inline void omap_init_audio(void) {}
|
|||
#if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
|
||||
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 platform_device *pdev;
|
||||
|
@ -358,7 +358,7 @@ static inline void omap_init_mcpdm(void) {}
|
|||
#if defined(CONFIG_SND_OMAP_SOC_DMIC) || \
|
||||
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 platform_device *pdev;
|
||||
|
@ -380,7 +380,7 @@ static inline void omap_init_dmic(void) {}
|
|||
|
||||
#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;
|
||||
char *name = "omap2_mcspi";
|
||||
|
|
|
@ -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 pipd_mask, pipd_shift;
|
||||
|
@ -158,7 +158,7 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
|
|||
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())
|
||||
omap4_hdmi_mux_pads(flags);
|
||||
|
@ -166,7 +166,7 @@ int omap_hdmi_init(enum omap_hdmi_flags flags)
|
|||
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())
|
||||
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)
|
|||
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())
|
||||
omap4_dsi_mux_pads(dsi_id, 0);
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
#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 omap_gpio_platform_data *pdata;
|
||||
|
|
|
@ -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,
|
||||
struct omap_mmc_platform_data *mmc)
|
||||
static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
|
||||
struct omap_mmc_platform_data *mmc)
|
||||
{
|
||||
char *hc_name;
|
||||
|
||||
|
@ -428,69 +428,140 @@ static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
|
|||
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
|
||||
|
||||
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 *ohs[1];
|
||||
struct omap_device *od;
|
||||
struct platform_device *pdev;
|
||||
char oh_name[MAX_OMAP_MMC_HWMOD_NAME_LEN];
|
||||
struct omap_mmc_platform_data *mmc_data;
|
||||
struct omap_mmc_dev_attr *mmc_dev_attr;
|
||||
char *name;
|
||||
int l;
|
||||
int res;
|
||||
|
||||
mmc_data = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
|
||||
if (!mmc_data) {
|
||||
pr_err("Cannot allocate memory for mmc device!\n");
|
||||
goto done;
|
||||
return;
|
||||
}
|
||||
|
||||
if (omap_hsmmc_pdata_init(hsmmcinfo, mmc_data) < 0) {
|
||||
pr_err("%s fails!\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
res = omap_hsmmc_pdata_init(hsmmcinfo, mmc_data);
|
||||
if (res < 0)
|
||||
goto free_mmc;
|
||||
|
||||
omap_hsmmc_mux(mmc_data, (ctrl_nr - 1));
|
||||
|
||||
name = "omap_hsmmc";
|
||||
|
||||
l = snprintf(oh_name, MAX_OMAP_MMC_HWMOD_NAME_LEN,
|
||||
res = snprintf(oh_name, MAX_OMAP_MMC_HWMOD_NAME_LEN,
|
||||
"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);
|
||||
|
||||
oh = omap_hwmod_lookup(oh_name);
|
||||
if (!oh) {
|
||||
pr_err("Could not look up %s\n", oh_name);
|
||||
kfree(mmc_data->slots[0].name);
|
||||
goto done;
|
||||
goto free_name;
|
||||
}
|
||||
|
||||
ohs[0] = oh;
|
||||
if (oh->dev_attr != NULL) {
|
||||
mmc_dev_attr = oh->dev_attr;
|
||||
mmc_data->controller_flags = mmc_dev_attr->flags;
|
||||
}
|
||||
|
||||
pdev = omap_device_build(name, ctrl_nr - 1, oh, mmc_data,
|
||||
sizeof(struct omap_mmc_platform_data), NULL, 0, false);
|
||||
if (IS_ERR(pdev)) {
|
||||
WARN(1, "Can't build omap_device for %s:%s.\n", name, oh->name);
|
||||
kfree(mmc_data->slots[0].name);
|
||||
goto done;
|
||||
pdev = platform_device_alloc(name, ctrl_nr - 1);
|
||||
if (!pdev) {
|
||||
pr_err("Could not allocate pdev for %s\n", name);
|
||||
goto free_name;
|
||||
}
|
||||
/*
|
||||
* return device handle to board setup code
|
||||
* required to populate for regulator framework structure
|
||||
*/
|
||||
hsmmcinfo->dev = &pdev->dev;
|
||||
dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
|
||||
|
||||
done:
|
||||
od = omap_device_alloc(pdev, ohs, 1, NULL, 0);
|
||||
if (!od) {
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
||||
void __init omap_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
if (omap_hsmmc_done)
|
||||
return;
|
||||
|
||||
omap_hsmmc_done = 1;
|
||||
|
||||
if (!cpu_is_omap44xx()) {
|
||||
if (cpu_is_omap2430()) {
|
||||
control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
|
||||
|
@ -515,7 +586,7 @@ void omap2_hsmmc_init(struct omap2_hsmmc_info *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 {
|
|||
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 vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
|
||||
bool deferred; /* mmc needs a deferred probe */
|
||||
int gpio_cd; /* or -EINVAL */
|
||||
int gpio_wp; /* or -EINVAL */
|
||||
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 */
|
||||
/* Remux (pad configuration) when powering on/off */
|
||||
void (*remux)(struct device *dev, int slot, int power_on);
|
||||
|
@ -34,11 +35,16 @@ struct omap2_hsmmc_info {
|
|||
|
||||
#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
|
||||
|
||||
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)
|
|||
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;
|
||||
char *name = "omap-mcbsp";
|
||||
|
|
|
@ -100,8 +100,8 @@ void omap_mux_write_array(struct omap_mux_partition *partition,
|
|||
|
||||
static char *omap_mux_options;
|
||||
|
||||
static int _omap_mux_init_gpio(struct omap_mux_partition *partition,
|
||||
int gpio, int val)
|
||||
static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition,
|
||||
int gpio, int val)
|
||||
{
|
||||
struct omap_mux_entry *e;
|
||||
struct omap_mux *gpio_mux = NULL;
|
||||
|
@ -145,7 +145,7 @@ static int _omap_mux_init_gpio(struct omap_mux_partition *partition,
|
|||
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;
|
||||
int ret;
|
||||
|
@ -159,9 +159,9 @@ int omap_mux_init_gpio(int gpio, int val)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int _omap_mux_get_by_name(struct omap_mux_partition *partition,
|
||||
const char *muxname,
|
||||
struct omap_mux **found_mux)
|
||||
static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,
|
||||
const char *muxname,
|
||||
struct omap_mux **found_mux)
|
||||
{
|
||||
struct omap_mux *mux = NULL;
|
||||
struct omap_mux_entry *e;
|
||||
|
@ -240,7 +240,7 @@ omap_mux_get_by_name(const char *muxname,
|
|||
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 *mux = NULL;
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
mpuss_clear_prev_logic_pwrst();
|
||||
pwrdm_clear_all_prev_pwrst(mpuss_pd);
|
||||
if ((pwrdm_read_next_pwrst(mpuss_pd) == PWRDM_POWER_RET) &&
|
||||
(pwrdm_read_logic_retst(mpuss_pd) == PWRDM_POWER_OFF))
|
||||
save_state = 2;
|
||||
|
||||
clear_cpu_prev_pwrst(cpu);
|
||||
cpu_clear_prev_logic_pwrst(cpu);
|
||||
set_cpu_next_pwrst(cpu, power_state);
|
||||
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)
|
|||
return 0;
|
||||
|
||||
d = debugfs_create_dir(pwrdm->name, (struct dentry *)dir);
|
||||
|
||||
(void) debugfs_create_file("suspend", S_IRUGO|S_IWUSR, d,
|
||||
if (!(IS_ERR_OR_NULL(d)))
|
||||
(void) debugfs_create_file("suspend", S_IRUGO|S_IWUSR, d,
|
||||
(void *)pwrdm, &pwrdm_suspend_fops);
|
||||
|
||||
return 0;
|
||||
|
@ -264,7 +264,7 @@ static int __init pm_dbg_init(void)
|
|||
return 0;
|
||||
|
||||
d = debugfs_create_dir("pm_debug", NULL);
|
||||
if (IS_ERR(d))
|
||||
if (IS_ERR_OR_NULL(d))
|
||||
return PTR_ERR(d);
|
||||
|
||||
(void) debugfs_create_file("count", S_IRUGO,
|
||||
|
|
|
@ -15,11 +15,13 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/opp.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/suspend.h>
|
||||
|
||||
#include <plat/omap-pm.h>
|
||||
#include <plat/omap_device.h>
|
||||
#include "common.h"
|
||||
|
||||
#include "prcm-common.h"
|
||||
#include "voltage.h"
|
||||
#include "powerdomain.h"
|
||||
#include "clockdomain.h"
|
||||
|
@ -28,7 +30,13 @@
|
|||
|
||||
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 platform_device *pdev;
|
||||
|
@ -68,32 +76,41 @@ static void omap2_init_processor_devices(void)
|
|||
#define FORCEWAKEUP_SWITCH 0
|
||||
#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 &
|
||||
* 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;
|
||||
int sleep_switch = -1;
|
||||
int ret = 0;
|
||||
int hwsup = 0;
|
||||
u8 curr_pwrst, next_pwrst;
|
||||
int sleep_switch = -1, ret = 0, hwsup = 0;
|
||||
|
||||
if (pwrdm == NULL || IS_ERR(pwrdm))
|
||||
if (!pwrdm || IS_ERR(pwrdm))
|
||||
return -EINVAL;
|
||||
|
||||
while (!(pwrdm->pwrsts & (1 << state))) {
|
||||
if (state == PWRDM_POWER_OFF)
|
||||
while (!(pwrdm->pwrsts & (1 << pwrst))) {
|
||||
if (pwrst == PWRDM_POWER_OFF)
|
||||
return ret;
|
||||
state--;
|
||||
pwrst--;
|
||||
}
|
||||
|
||||
cur_state = pwrdm_read_next_pwrst(pwrdm);
|
||||
if (cur_state == state)
|
||||
next_pwrst = pwrdm_read_next_pwrst(pwrdm);
|
||||
if (next_pwrst == pwrst)
|
||||
return ret;
|
||||
|
||||
if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) {
|
||||
if ((pwrdm_read_pwrst(pwrdm) > state) &&
|
||||
curr_pwrst = pwrdm_read_pwrst(pwrdm);
|
||||
if (curr_pwrst < PWRDM_POWER_ON) {
|
||||
if ((curr_pwrst > pwrst) &&
|
||||
(pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) {
|
||||
sleep_switch = LOWPOWERSTATE_SWITCH;
|
||||
} else {
|
||||
|
@ -103,12 +120,10 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
|
|||
}
|
||||
}
|
||||
|
||||
ret = pwrdm_set_next_pwrst(pwrdm, state);
|
||||
if (ret) {
|
||||
pr_err("%s: unable to set state of powerdomain: %s\n",
|
||||
ret = pwrdm_set_next_pwrst(pwrdm, pwrst);
|
||||
if (ret)
|
||||
pr_err("%s: unable to set power state of powerdomain: %s\n",
|
||||
__func__, pwrdm->name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch (sleep_switch) {
|
||||
case FORCEWAKEUP_SWITCH:
|
||||
|
@ -119,16 +134,16 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
|
|||
break;
|
||||
case LOWPOWERSTATE_SWITCH:
|
||||
pwrdm_set_lowpwrstchange(pwrdm);
|
||||
pwrdm_wait_transition(pwrdm);
|
||||
pwrdm_state_switch(pwrdm);
|
||||
break;
|
||||
default:
|
||||
return ret;
|
||||
}
|
||||
|
||||
pwrdm_state_switch(pwrdm);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
@ -196,6 +211,56 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
|
|||
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)
|
||||
{
|
||||
if (!cpu_is_omap34xx())
|
||||
|
@ -238,6 +303,10 @@ static int __init omap2_common_pm_late_init(void)
|
|||
/* Smartreflex device init */
|
||||
omap_devinit_smartreflex();
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall(omap2_common_pm_late_init);
|
||||
|
|
|
@ -22,6 +22,8 @@ extern int omap3_can_sleep(void);
|
|||
extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state);
|
||||
extern int omap3_idle_init(void);
|
||||
extern int omap4_idle_init(void);
|
||||
extern int omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused);
|
||||
extern int (*omap_pm_suspend)(void);
|
||||
|
||||
#if defined(CONFIG_PM_OPP)
|
||||
extern int omap3_opp_init(void);
|
||||
|
|
|
@ -52,19 +52,6 @@
|
|||
#include "powerdomain.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_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl,
|
||||
void __iomem *sdrc_power);
|
||||
|
@ -84,7 +71,7 @@ static int omap2_fclks_active(void)
|
|||
return (f1 | f2) ? 1 : 0;
|
||||
}
|
||||
|
||||
static void omap2_enter_full_retention(void)
|
||||
static int omap2_enter_full_retention(void)
|
||||
{
|
||||
u32 l;
|
||||
|
||||
|
@ -147,6 +134,8 @@ static void omap2_enter_full_retention(void)
|
|||
|
||||
/* Mask future PRCM-to-MPU interrupts */
|
||||
omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int omap2_i2c_active(void)
|
||||
|
@ -243,57 +232,6 @@ static void omap2_pm_idle(void)
|
|||
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)
|
||||
{
|
||||
int i, num_mem_banks;
|
||||
|
@ -335,9 +273,13 @@ static void __init prcm_setup_regs(void)
|
|||
clkdm_sleep(gfx_clkdm);
|
||||
|
||||
/* 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);
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
omap_pm_suspend = omap2_enter_full_retention;
|
||||
#endif
|
||||
|
||||
/* REVISIT: Configure number of 32 kHz clock cycles for sys_clk
|
||||
* stabilisation */
|
||||
omap2_prm_write_mod_reg(15 << OMAP_SETUP_TIME_SHIFT, OMAP24XX_GR_MOD,
|
||||
|
@ -438,7 +380,6 @@ static int __init omap2_pm_init(void)
|
|||
omap24xx_cpu_suspend_sz);
|
||||
}
|
||||
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
arm_pm_idle = omap2_pm_idle;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -50,10 +50,6 @@
|
|||
#include "sdrc.h"
|
||||
#include "control.h"
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static suspend_state_t suspend_state = PM_SUSPEND_ON;
|
||||
#endif
|
||||
|
||||
/* pm34xx errata defined in pm.h */
|
||||
u16 pm34xx_errata;
|
||||
|
||||
|
@ -280,11 +276,6 @@ void omap_sram_idle(void)
|
|||
int core_prev_state, per_prev_state;
|
||||
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);
|
||||
switch (mpu_next_state) {
|
||||
case PWRDM_POWER_ON:
|
||||
|
@ -463,50 +454,6 @@ static int omap3_pm_suspend(void)
|
|||
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 */
|
||||
|
||||
|
||||
|
@ -726,21 +673,6 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
|
|||
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
|
||||
*
|
||||
|
@ -810,7 +742,7 @@ static int __init omap3_pm_init(void)
|
|||
goto err2;
|
||||
}
|
||||
|
||||
(void) clkdm_for_each(clkdms_setup, NULL);
|
||||
(void) clkdm_for_each(omap_pm_clkdms_setup, NULL);
|
||||
|
||||
mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
|
||||
if (mpu_pwrdm == NULL) {
|
||||
|
@ -829,8 +761,8 @@ static int __init omap3_pm_init(void)
|
|||
core_clkdm = clkdm_lookup("core_clkdm");
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
#endif /* CONFIG_SUSPEND */
|
||||
omap_pm_suspend = omap3_pm_suspend;
|
||||
#endif
|
||||
|
||||
arm_pm_idle = omap3_pm_idle;
|
||||
omap3_idle_init();
|
||||
|
|
|
@ -83,59 +83,8 @@ static int omap4_pm_suspend(void)
|
|||
|
||||
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 */
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
struct power_state *pwrst;
|
||||
|
@ -247,11 +196,11 @@ static int __init omap4_pm_init(void)
|
|||
goto err2;
|
||||
}
|
||||
|
||||
(void) clkdm_for_each(clkdms_setup, NULL);
|
||||
(void) clkdm_for_each(omap_pm_clkdms_setup, NULL);
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
#endif /* CONFIG_SUSPEND */
|
||||
omap_pm_suspend = omap4_pm_suspend;
|
||||
#endif
|
||||
|
||||
/* Overwrite the default cpu_do_idle() */
|
||||
arm_pm_idle = omap_default_idle;
|
||||
|
|
|
@ -69,7 +69,7 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data,
|
|||
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 platform_device *pdev;
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
#include <plat/omap_hwmod.h>
|
||||
|
||||
extern struct device omap_device_parent;
|
||||
extern struct dev_pm_domain omap_device_pm_domain;
|
||||
|
||||
/* omap_device._state values */
|
||||
#define OMAP_DEVICE_STATE_UNKNOWN 0
|
||||
|
@ -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,
|
||||
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);
|
||||
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)
|
|||
if (WARN_ON(!dev))
|
||||
return -ENODEV;
|
||||
|
||||
if (dev->parent == &omap_device_parent) {
|
||||
if (dev->pm_domain == &omap_device_pm_domain) {
|
||||
count = omap_device_get_context_loss_count(pdev);
|
||||
} else {
|
||||
WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device",
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
/*
|
||||
* omap_device implementation
|
||||
*
|
||||
|
@ -97,14 +98,7 @@
|
|||
#define USE_WAKEUP_LAT 0
|
||||
#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 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[] = {
|
||||
{
|
||||
|
@ -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
|
||||
* @pdev_name: name of the platform_device driver to use
|
||||
|
@ -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;
|
||||
*/
|
||||
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_device_pm_latency *pm_lats,
|
||||
int pm_lats_cnt)
|
||||
|
@ -591,7 +583,7 @@ static struct omap_device *omap_device_alloc(struct platform_device *pdev,
|
|||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static void omap_device_delete(struct omap_device *od)
|
||||
void omap_device_delete(struct omap_device *od)
|
||||
{
|
||||
if (!od)
|
||||
return;
|
||||
|
@ -619,7 +611,7 @@ static void omap_device_delete(struct omap_device *od)
|
|||
* information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise,
|
||||
* 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,
|
||||
int pdata_len,
|
||||
struct omap_device_pm_latency *pm_lats,
|
||||
|
@ -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
|
||||
* 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,
|
||||
void *pdata, int pdata_len,
|
||||
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,
|
|||
* platform_early_add_device() on the underlying platform_device.
|
||||
* 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];
|
||||
|
||||
|
@ -762,14 +754,12 @@ static int _od_suspend_noirq(struct device *dev)
|
|||
struct omap_device *od = to_omap_device(pdev);
|
||||
int ret;
|
||||
|
||||
if (od->flags & OMAP_DEVICE_NO_IDLE_ON_SUSPEND)
|
||||
return pm_generic_suspend_noirq(dev);
|
||||
|
||||
ret = pm_generic_suspend_noirq(dev);
|
||||
|
||||
if (!ret && !pm_runtime_status_suspended(dev)) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -782,13 +772,11 @@ static int _od_resume_noirq(struct device *dev)
|
|||
struct platform_device *pdev = to_platform_device(dev);
|
||||
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) &&
|
||||
!pm_runtime_status_suspended(dev)) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -799,7 +787,7 @@ static int _od_resume_noirq(struct device *dev)
|
|||
#define _od_resume_noirq NULL
|
||||
#endif
|
||||
|
||||
static struct dev_pm_domain omap_device_pm_domain = {
|
||||
struct dev_pm_domain omap_device_pm_domain = {
|
||||
.ops = {
|
||||
SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
|
||||
_od_runtime_idle)
|
||||
|
@ -817,11 +805,10 @@ static struct dev_pm_domain omap_device_pm_domain = {
|
|||
* platform_device_register() on the underlying platform_device.
|
||||
* 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);
|
||||
|
||||
pdev->dev.parent = &omap_device_parent;
|
||||
pdev->dev.pm_domain = &omap_device_pm_domain;
|
||||
return platform_device_add(pdev);
|
||||
}
|
||||
|
@ -1130,11 +1117,6 @@ int omap_device_enable_clocks(struct omap_device *od)
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct device omap_device_parent = {
|
||||
.init_name = "omap",
|
||||
.parent = &platform_bus,
|
||||
};
|
||||
|
||||
static struct notifier_block platform_nb = {
|
||||
.notifier_call = _omap_device_notifier_call,
|
||||
};
|
||||
|
@ -1142,6 +1124,6 @@ static struct notifier_block platform_nb = {
|
|||
static int __init omap_device_init(void)
|
||||
{
|
||||
bus_register_notifier(&platform_bus_type, &platform_nb);
|
||||
return device_register(&omap_device_parent);
|
||||
return 0;
|
||||
}
|
||||
core_initcall(omap_device_init);
|
||||
|
|
Loading…
Reference in New Issue