diff options
Diffstat (limited to 'arch/arm/mach-omap2/pm.c')
| -rw-r--r-- | arch/arm/mach-omap2/pm.c | 104 | 
1 files changed, 39 insertions, 65 deletions
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 472bf22d5e8..2ab7a9e17fe 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -26,54 +26,21 @@  static struct omap_device_pm_latency *pm_lats; -static struct device *mpu_dev; -static struct device *iva_dev; -static struct device *l3_dev; -static struct device *dsp_dev; - -struct device *omap2_get_mpuss_device(void) -{ -	WARN_ON_ONCE(!mpu_dev); -	return mpu_dev; -} - -struct device *omap2_get_iva_device(void) -{ -	WARN_ON_ONCE(!iva_dev); -	return iva_dev; -} - -struct device *omap2_get_l3_device(void) -{ -	WARN_ON_ONCE(!l3_dev); -	return l3_dev; -} - -struct device *omap4_get_dsp_device(void) -{ -	WARN_ON_ONCE(!dsp_dev); -	return dsp_dev; -} -EXPORT_SYMBOL(omap4_get_dsp_device); - -/* static int _init_omap_device(struct omap_hwmod *oh, void *user) */ -static int _init_omap_device(char *name, struct device **new_dev) +static int _init_omap_device(char *name)  {  	struct omap_hwmod *oh; -	struct omap_device *od; +	struct platform_device *pdev;  	oh = omap_hwmod_lookup(name);  	if (WARN(!oh, "%s: could not find omap_hwmod for %s\n",  		 __func__, name))  		return -ENODEV; -	od = omap_device_build(oh->name, 0, oh, NULL, 0, pm_lats, 0, false); -	if (WARN(IS_ERR(od), "%s: could not build omap_device for %s\n", +	pdev = omap_device_build(oh->name, 0, oh, NULL, 0, pm_lats, 0, false); +	if (WARN(IS_ERR(pdev), "%s: could not build omap_device for %s\n",  		 __func__, name))  		return -ENODEV; -	*new_dev = &od->pdev.dev; -  	return 0;  } @@ -82,16 +49,16 @@ static int _init_omap_device(char *name, struct device **new_dev)   */  static void omap2_init_processor_devices(void)  { -	_init_omap_device("mpu", &mpu_dev); +	_init_omap_device("mpu");  	if (omap3_has_iva()) -		_init_omap_device("iva", &iva_dev); +		_init_omap_device("iva");  	if (cpu_is_omap44xx()) { -		_init_omap_device("l3_main_1", &l3_dev); -		_init_omap_device("dsp", &dsp_dev); -		_init_omap_device("iva", &iva_dev); +		_init_omap_device("l3_main_1"); +		_init_omap_device("dsp"); +		_init_omap_device("iva");  	} else { -		_init_omap_device("l3_main", &l3_dev); +		_init_omap_device("l3_main");  	}  } @@ -136,8 +103,8 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)  	ret = pwrdm_set_next_pwrst(pwrdm, state);  	if (ret) { -		printk(KERN_ERR "Unable to set state of powerdomain: %s\n", -		       pwrdm->name); +		pr_err("%s: unable to set state of powerdomain: %s\n", +		       __func__, pwrdm->name);  		goto err;  	} @@ -161,37 +128,44 @@ err:  }  /* - * This API is to be called during init to put 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   * at the nominal voltage. So this function finds out the rate of   * the clock associated with the voltage domain, finds out the correct - * opp entry and puts the voltage domain to the voltage specifies + * opp entry and sets the voltage domain to the voltage specified   * in the opp entry   */  static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, -						struct device *dev) +					 const char *oh_name)  {  	struct voltagedomain *voltdm;  	struct clk *clk;  	struct opp *opp;  	unsigned long freq, bootup_volt; +	struct device *dev; + +	if (!vdd_name || !clk_name || !oh_name) { +		pr_err("%s: invalid parameters\n", __func__); +		goto exit; +	} -	if (!vdd_name || !clk_name || !dev) { -		printk(KERN_ERR "%s: Invalid parameters!\n", __func__); +	dev = omap_device_get_by_hwmod_name(oh_name); +	if (IS_ERR(dev)) { +		pr_err("%s: Unable to get dev pointer for hwmod %s\n", +			__func__, oh_name);  		goto exit;  	} -	voltdm = omap_voltage_domain_lookup(vdd_name); +	voltdm = voltdm_lookup(vdd_name);  	if (IS_ERR(voltdm)) { -		printk(KERN_ERR "%s: Unable to get vdd pointer for vdd_%s\n", +		pr_err("%s: unable to get vdd pointer for vdd_%s\n",  			__func__, vdd_name);  		goto exit;  	}  	clk =  clk_get(NULL, clk_name);  	if (IS_ERR(clk)) { -		printk(KERN_ERR "%s: unable to get clk %s\n", -			__func__, clk_name); +		pr_err("%s: unable to get clk %s\n", __func__, clk_name);  		goto exit;  	} @@ -200,24 +174,23 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,  	opp = opp_find_freq_ceil(dev, &freq);  	if (IS_ERR(opp)) { -		printk(KERN_ERR "%s: unable to find boot up OPP for vdd_%s\n", +		pr_err("%s: unable to find boot up OPP for vdd_%s\n",  			__func__, vdd_name);  		goto exit;  	}  	bootup_volt = opp_get_voltage(opp);  	if (!bootup_volt) { -		printk(KERN_ERR "%s: unable to find voltage corresponding" +		pr_err("%s: unable to find voltage corresponding "  			"to the bootup OPP for vdd_%s\n", __func__, vdd_name);  		goto exit;  	} -	omap_voltage_scale_vdd(voltdm, bootup_volt); +	voltdm_scale(voltdm, bootup_volt);  	return 0;  exit: -	printk(KERN_ERR "%s: Unable to put vdd_%s to its init voltage\n\n", -		__func__, vdd_name); +	pr_err("%s: unable to set vdd_%s\n", __func__, vdd_name);  	return -EINVAL;  } @@ -226,8 +199,8 @@ static void __init omap3_init_voltages(void)  	if (!cpu_is_omap34xx())  		return; -	omap2_set_init_voltage("mpu", "dpll1_ck", mpu_dev); -	omap2_set_init_voltage("core", "l3_ick", l3_dev); +	omap2_set_init_voltage("mpu_iva", "dpll1_ck", "mpu"); +	omap2_set_init_voltage("core", "l3_ick", "l3_main");  }  static void __init omap4_init_voltages(void) @@ -235,14 +208,15 @@ static void __init omap4_init_voltages(void)  	if (!cpu_is_omap44xx())  		return; -	omap2_set_init_voltage("mpu", "dpll_mpu_ck", mpu_dev); -	omap2_set_init_voltage("core", "l3_div_ck", l3_dev); -	omap2_set_init_voltage("iva", "dpll_iva_m5x2_ck", iva_dev); +	omap2_set_init_voltage("mpu", "dpll_mpu_ck", "mpu"); +	omap2_set_init_voltage("core", "l3_div_ck", "l3_main_1"); +	omap2_set_init_voltage("iva", "dpll_iva_m5x2_ck", "iva");  }  static int __init omap2_common_pm_init(void)  { -	omap2_init_processor_devices(); +	if (!of_have_populated_dt()) +		omap2_init_processor_devices();  	omap_pm_if_init();  	return 0;  |