diff options
Diffstat (limited to 'arch/arm/mach-omap2/smartreflex.c')
| -rw-r--r-- | arch/arm/mach-omap2/smartreflex.c | 38 | 
1 files changed, 20 insertions, 18 deletions
diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index fb7dc52394a..2ce2fb7664b 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c @@ -143,7 +143,7 @@ static irqreturn_t sr_interrupt(int irq, void *data)  		sr_write_reg(sr_info, IRQSTATUS, status);  	} -	if (sr_class->class_type == SR_CLASS2 && sr_class->notify) +	if (sr_class->notify)  		sr_class->notify(sr_info->voltdm, status);  	return IRQ_HANDLED; @@ -258,9 +258,7 @@ static int sr_late_init(struct omap_sr *sr_info)  	struct resource *mem;  	int ret = 0; -	if (sr_class->class_type == SR_CLASS2 && -		sr_class->notify_flags && sr_info->irq) { - +	if (sr_class->notify && sr_class->notify_flags && sr_info->irq) {  		name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name);  		if (name == NULL) {  			ret = -ENOMEM; @@ -270,6 +268,7 @@ static int sr_late_init(struct omap_sr *sr_info)  				0, name, (void *)sr_info);  		if (ret)  			goto error; +		disable_irq(sr_info->irq);  	}  	if (pdata && pdata->enable_on_init) @@ -278,16 +277,16 @@ static int sr_late_init(struct omap_sr *sr_info)  	return ret;  error: -		iounmap(sr_info->base); -		mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0); -		release_mem_region(mem->start, resource_size(mem)); -		list_del(&sr_info->node); -		dev_err(&sr_info->pdev->dev, "%s: ERROR in registering" -			"interrupt handler. Smartreflex will" -			"not function as desired\n", __func__); -		kfree(name); -		kfree(sr_info); -		return ret; +	iounmap(sr_info->base); +	mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0); +	release_mem_region(mem->start, resource_size(mem)); +	list_del(&sr_info->node); +	dev_err(&sr_info->pdev->dev, "%s: ERROR in registering" +		"interrupt handler. Smartreflex will" +		"not function as desired\n", __func__); +	kfree(name); +	kfree(sr_info); +	return ret;  }  static void sr_v1_disable(struct omap_sr *sr) @@ -808,10 +807,13 @@ static int omap_sr_autocomp_store(void *data, u64 val)  		return -EINVAL;  	} -	if (!val) -		sr_stop_vddautocomp(sr_info); -	else -		sr_start_vddautocomp(sr_info); +	/* control enable/disable only if there is a delta in value */ +	if (sr_info->autocomp_active != val) { +		if (!val) +			sr_stop_vddautocomp(sr_info); +		else +			sr_start_vddautocomp(sr_info); +	}  	return 0;  }  |