diff options
| author | Tony Lindgren <tony@atomide.com> | 2011-03-10 18:54:14 -0800 | 
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2011-03-10 18:54:14 -0800 | 
| commit | 94a06b74e724caabcf0464c81527cfbcae0c8aff (patch) | |
| tree | 3570b6a627382a5eb5c8328b4959f615544d8e62 /arch/arm/mach-omap2/smartreflex.c | |
| parent | 0dde52a9f5330eec240660191a94b51bd911ffcd (diff) | |
| parent | 9062511097683b4422f023d181b4a8b2db1a7a72 (diff) | |
| download | olio-linux-3.10-94a06b74e724caabcf0464c81527cfbcae0c8aff.tar.xz olio-linux-3.10-94a06b74e724caabcf0464c81527cfbcae0c8aff.zip  | |
Merge branch 'for_2.6.39/pm-misc' of ssh://master.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm into omap-for-linus
Diffstat (limited to 'arch/arm/mach-omap2/smartreflex.c')
| -rw-r--r-- | arch/arm/mach-omap2/smartreflex.c | 62 | 
1 files changed, 32 insertions, 30 deletions
diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index 95ac336fe3f..0ab4dd5081e 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c @@ -54,6 +54,7 @@ struct omap_sr {  	struct list_head		node;  	struct omap_sr_nvalue_table	*nvalue_table;  	struct voltagedomain		*voltdm; +	struct dentry			*dbg_dir;  };  /* sr_list contains all the instances of smartreflex module */ @@ -260,9 +261,11 @@ static int sr_late_init(struct omap_sr *sr_info)  	if (sr_class->class_type == SR_CLASS2 &&  		sr_class->notify_flags && sr_info->irq) { -		name = kzalloc(SMARTREFLEX_NAME_LEN + 1, GFP_KERNEL); -		strcpy(name, "sr_"); -		strcat(name, sr_info->voltdm->name); +		name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name); +		if (name == NULL) { +			ret = -ENOMEM; +			goto error; +		}  		ret = request_irq(sr_info->irq, sr_interrupt,  				0, name, (void *)sr_info);  		if (ret) @@ -282,6 +285,7 @@ error:  		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;  } @@ -820,7 +824,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)  	struct omap_sr *sr_info = kzalloc(sizeof(struct omap_sr), GFP_KERNEL);  	struct omap_sr_data *pdata = pdev->dev.platform_data;  	struct resource *mem, *irq; -	struct dentry *vdd_dbg_dir, *dbg_dir, *nvalue_dir; +	struct dentry *vdd_dbg_dir, *nvalue_dir;  	struct omap_volt_data *volt_data;  	int i, ret = 0; @@ -879,7 +883,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)  		ret = sr_late_init(sr_info);  		if (ret) {  			pr_warning("%s: Error in SR late init\n", __func__); -			return ret; +			goto err_release_region;  		}  	} @@ -890,30 +894,34 @@ static int __init omap_sr_probe(struct platform_device *pdev)  	 * not try to create rest of the debugfs entries.  	 */  	vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm); -	if (!vdd_dbg_dir) -		return -EINVAL; +	if (!vdd_dbg_dir) { +		ret = -EINVAL; +		goto err_release_region; +	} -	dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); -	if (IS_ERR(dbg_dir)) { +	sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); +	if (IS_ERR(sr_info->dbg_dir)) {  		dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n",  			__func__); -		return PTR_ERR(dbg_dir); +		ret = PTR_ERR(sr_info->dbg_dir); +		goto err_release_region;  	} -	(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, dbg_dir, -				(void *)sr_info, &pm_sr_fops); -	(void) debugfs_create_x32("errweight", S_IRUGO, dbg_dir, +	(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, +			sr_info->dbg_dir, (void *)sr_info, &pm_sr_fops); +	(void) debugfs_create_x32("errweight", S_IRUGO, sr_info->dbg_dir,  			&sr_info->err_weight); -	(void) debugfs_create_x32("errmaxlimit", S_IRUGO, dbg_dir, +	(void) debugfs_create_x32("errmaxlimit", S_IRUGO, sr_info->dbg_dir,  			&sr_info->err_maxlimit); -	(void) debugfs_create_x32("errminlimit", S_IRUGO, dbg_dir, +	(void) debugfs_create_x32("errminlimit", S_IRUGO, sr_info->dbg_dir,  			&sr_info->err_minlimit); -	nvalue_dir = debugfs_create_dir("nvalue", dbg_dir); +	nvalue_dir = debugfs_create_dir("nvalue", sr_info->dbg_dir);  	if (IS_ERR(nvalue_dir)) {  		dev_err(&pdev->dev, "%s: Unable to create debugfs directory"  			"for n-values\n", __func__); -		return PTR_ERR(nvalue_dir); +		ret = PTR_ERR(nvalue_dir); +		goto err_release_region;  	}  	omap_voltage_get_volttable(sr_info->voltdm, &volt_data); @@ -922,23 +930,15 @@ static int __init omap_sr_probe(struct platform_device *pdev)  			" corresponding vdd vdd_%s. Cannot create debugfs"  			"entries for n-values\n",  			__func__, sr_info->voltdm->name); -		return -ENODATA; +		ret = -ENODATA; +		goto err_release_region;  	}  	for (i = 0; i < sr_info->nvalue_count; i++) { -		char *name; -		char volt_name[32]; - -		name = kzalloc(NVALUE_NAME_LEN + 1, GFP_KERNEL); -		if (!name) { -			dev_err(&pdev->dev, "%s: Unable to allocate memory" -				" for n-value directory name\n",  __func__); -			return -ENOMEM; -		} +		char name[NVALUE_NAME_LEN + 1]; -		strcpy(name, "volt_"); -		sprintf(volt_name, "%d", volt_data[i].volt_nominal); -		strcat(name, volt_name); +		snprintf(name, sizeof(name), "volt_%d", +			 volt_data[i].volt_nominal);  		(void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir,  				&(sr_info->nvalue_table[i].nvalue));  	} @@ -973,6 +973,8 @@ static int __devexit omap_sr_remove(struct platform_device *pdev)  	if (sr_info->autocomp_active)  		sr_stop_vddautocomp(sr_info); +	if (sr_info->dbg_dir) +		debugfs_remove_recursive(sr_info->dbg_dir);  	list_del(&sr_info->node);  	iounmap(sr_info->base);  |