diff options
| -rw-r--r-- | arch/arm/mach-omap2/sr_device.c | 13 | ||||
| -rw-r--r-- | drivers/power/avs/smartreflex.c | 54 | ||||
| -rw-r--r-- | include/linux/power/smartreflex.h | 14 | 
3 files changed, 42 insertions, 39 deletions
diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c index f8217a5a4a2..a04bc25a1d2 100644 --- a/arch/arm/mach-omap2/sr_device.c +++ b/arch/arm/mach-omap2/sr_device.c @@ -121,6 +121,19 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)  	sr_data->senn_mod = 0x1;  	sr_data->senp_mod = 0x1; +	if (cpu_is_omap34xx() || cpu_is_omap44xx()) { +		sr_data->err_weight = OMAP3430_SR_ERRWEIGHT; +		sr_data->err_maxlimit = OMAP3430_SR_ERRMAXLIMIT; +		sr_data->accum_data = OMAP3430_SR_ACCUMDATA; +		if (!(strcmp(sr_data->name, "smartreflex_mpu"))) { +			sr_data->senn_avgweight = OMAP3430_SR1_SENNAVGWEIGHT; +			sr_data->senp_avgweight = OMAP3430_SR1_SENPAVGWEIGHT; +		} else { +			sr_data->senn_avgweight = OMAP3430_SR2_SENNAVGWEIGHT; +			sr_data->senp_avgweight = OMAP3430_SR2_SENPAVGWEIGHT; +		} +	} +  	sr_data->voltdm = voltdm_lookup(sr_dev_attr->sensor_voltdm_name);  	if (!sr_data->voltdm) {  		pr_err("%s: Unable to get voltage domain pointer for VDD %s\n", diff --git a/drivers/power/avs/smartreflex.c b/drivers/power/avs/smartreflex.c index 24768a27e1d..4c4519e59be 100644 --- a/drivers/power/avs/smartreflex.c +++ b/drivers/power/avs/smartreflex.c @@ -130,24 +130,21 @@ static irqreturn_t sr_interrupt(int irq, void *data)  static void sr_set_clk_length(struct omap_sr *sr)  { -	struct clk *sys_ck; -	u32 sys_clk_speed; +	struct clk *fck; +	u32 fclk_speed; -	if (cpu_is_omap34xx()) -		sys_ck = clk_get(NULL, "sys_ck"); -	else -		sys_ck = clk_get(NULL, "sys_clkin_ck"); +	fck = clk_get(&sr->pdev->dev, "fck"); -	if (IS_ERR(sys_ck)) { -		dev_err(&sr->pdev->dev, "%s: unable to get sys clk\n", -			__func__); +	if (IS_ERR(fck)) { +		dev_err(&sr->pdev->dev, "%s: unable to get fck for device %s\n", +				__func__, dev_name(&sr->pdev->dev));  		return;  	} -	sys_clk_speed = clk_get_rate(sys_ck); -	clk_put(sys_ck); +	fclk_speed = clk_get_rate(fck); +	clk_put(fck); -	switch (sys_clk_speed) { +	switch (fclk_speed) {  	case 12000000:  		sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK;  		break; @@ -164,34 +161,12 @@ static void sr_set_clk_length(struct omap_sr *sr)  		sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK;  		break;  	default: -		dev_err(&sr->pdev->dev, "%s: Invalid sysclk value: %d\n", -			__func__, sys_clk_speed); +		dev_err(&sr->pdev->dev, "%s: Invalid fclk rate: %d\n", +			__func__, fclk_speed);  		break;  	}  } -static void sr_set_regfields(struct omap_sr *sr) -{ -	/* -	 * For time being these values are defined in smartreflex.h -	 * and populated during init. May be they can be moved to board -	 * file or pmic specific data structure. In that case these structure -	 * fields will have to be populated using the pdata or pmic structure. -	 */ -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) { -		sr->err_weight = OMAP3430_SR_ERRWEIGHT; -		sr->err_maxlimit = OMAP3430_SR_ERRMAXLIMIT; -		sr->accum_data = OMAP3430_SR_ACCUMDATA; -		if (!(strcmp(sr->name, "smartreflex_mpu_iva"))) { -			sr->senn_avgweight = OMAP3430_SR1_SENNAVGWEIGHT; -			sr->senp_avgweight = OMAP3430_SR1_SENPAVGWEIGHT; -		} else { -			sr->senn_avgweight = OMAP3430_SR2_SENNAVGWEIGHT; -			sr->senp_avgweight = OMAP3430_SR2_SENPAVGWEIGHT; -		} -	} -} -  static void sr_start_vddautocomp(struct omap_sr *sr)  {  	if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) { @@ -924,8 +899,14 @@ static int __init omap_sr_probe(struct platform_device *pdev)  	sr_info->nvalue_count = pdata->nvalue_count;  	sr_info->senn_mod = pdata->senn_mod;  	sr_info->senp_mod = pdata->senp_mod; +	sr_info->err_weight = pdata->err_weight; +	sr_info->err_maxlimit = pdata->err_maxlimit; +	sr_info->accum_data = pdata->accum_data; +	sr_info->senn_avgweight = pdata->senn_avgweight; +	sr_info->senp_avgweight = pdata->senp_avgweight;  	sr_info->autocomp_active = false;  	sr_info->ip_type = pdata->ip_type; +  	sr_info->base = ioremap(mem->start, resource_size(mem));  	if (!sr_info->base) {  		dev_err(&pdev->dev, "%s: ioremap fail\n", __func__); @@ -937,7 +918,6 @@ static int __init omap_sr_probe(struct platform_device *pdev)  		sr_info->irq = irq->start;  	sr_set_clk_length(sr_info); -	sr_set_regfields(sr_info);  	list_add(&sr_info->node, &sr_list); diff --git a/include/linux/power/smartreflex.h b/include/linux/power/smartreflex.h index 4a496ebc7d7..c0f44c2b006 100644 --- a/include/linux/power/smartreflex.h +++ b/include/linux/power/smartreflex.h @@ -260,8 +260,13 @@ struct omap_sr_nvalue_table {   *   * @name:		instance name   * @ip_type:		Smartreflex IP type. - * @senp_mod:		SENPENABLE value for the sr - * @senn_mod:		SENNENABLE value for sr + * @senp_mod:		SENPENABLE value of the sr CONFIG register + * @senn_mod:		SENNENABLE value for sr CONFIG register + * @err_weight		ERRWEIGHT value of the sr ERRCONFIG register + * @err_maxlimit	ERRMAXLIMIT value of the sr ERRCONFIG register + * @accum_data		ACCUMDATA value of the sr CONFIG register + * @senn_avgweight	SENNAVGWEIGHT value of the sr AVGWEIGHT register + * @senp_avgweight	SENPAVGWEIGHT value of the sr AVGWEIGHT register   * @nvalue_count:	Number of distinct nvalues in the nvalue table   * @enable_on_init:	whether this sr module needs to enabled at   *			boot up or not. @@ -274,6 +279,11 @@ struct omap_sr_data {  	int				ip_type;  	u32				senp_mod;  	u32				senn_mod; +	u32				err_weight; +	u32				err_maxlimit; +	u32				accum_data; +	u32				senn_avgweight; +	u32				senp_avgweight;  	int				nvalue_count;  	bool				enable_on_init;  	struct omap_sr_nvalue_table	*nvalue_table;  |