diff options
Diffstat (limited to 'drivers/video/backlight/atmel-pwm-bl.c')
| -rw-r--r-- | drivers/video/backlight/atmel-pwm-bl.c | 105 | 
1 files changed, 49 insertions, 56 deletions
diff --git a/drivers/video/backlight/atmel-pwm-bl.c b/drivers/video/backlight/atmel-pwm-bl.c index 0393d827dd4..261b1a4ec3d 100644 --- a/drivers/video/backlight/atmel-pwm-bl.c +++ b/drivers/video/backlight/atmel-pwm-bl.c @@ -12,7 +12,6 @@  #include <linux/module.h>  #include <linux/platform_device.h>  #include <linux/fb.h> -#include <linux/clk.h>  #include <linux/gpio.h>  #include <linux/backlight.h>  #include <linux/atmel_pwm.h> @@ -27,6 +26,14 @@ struct atmel_pwm_bl {  	int					gpio_on;  }; +static void atmel_pwm_bl_set_gpio_on(struct atmel_pwm_bl *pwmbl, int on) +{ +	if (!gpio_is_valid(pwmbl->gpio_on)) +		return; + +	gpio_set_value(pwmbl->gpio_on, on ^ pwmbl->pdata->on_active_low); +} +  static int atmel_pwm_bl_set_intensity(struct backlight_device *bd)  {  	struct atmel_pwm_bl *pwmbl = bl_get_data(bd); @@ -49,19 +56,13 @@ static int atmel_pwm_bl_set_intensity(struct backlight_device *bd)  		pwm_duty = pwmbl->pdata->pwm_duty_min;  	if (!intensity) { -		if (pwmbl->gpio_on != -1) { -			gpio_set_value(pwmbl->gpio_on, -					0 ^ pwmbl->pdata->on_active_low); -		} +		atmel_pwm_bl_set_gpio_on(pwmbl, 0);  		pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty);  		pwm_channel_disable(&pwmbl->pwmc);  	} else {  		pwm_channel_enable(&pwmbl->pwmc);  		pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); -		if (pwmbl->gpio_on != -1) { -			gpio_set_value(pwmbl->gpio_on, -					1 ^ pwmbl->pdata->on_active_low); -		} +		atmel_pwm_bl_set_gpio_on(pwmbl, 1);  	}  	return 0; @@ -70,17 +71,16 @@ static int atmel_pwm_bl_set_intensity(struct backlight_device *bd)  static int atmel_pwm_bl_get_intensity(struct backlight_device *bd)  {  	struct atmel_pwm_bl *pwmbl = bl_get_data(bd); -	u8 intensity; +	u32 cdty; +	u32 intensity; -	if (pwmbl->pdata->pwm_active_low) { -		intensity = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY) - -			pwmbl->pdata->pwm_duty_min; -	} else { -		intensity = pwmbl->pdata->pwm_duty_max - -			pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY); -	} +	cdty = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY); +	if (pwmbl->pdata->pwm_active_low) +		intensity = cdty - pwmbl->pdata->pwm_duty_min; +	else +		intensity = pwmbl->pdata->pwm_duty_max - cdty; -	return intensity; +	return intensity & 0xffff;  }  static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl) @@ -118,52 +118,46 @@ static const struct backlight_ops atmel_pwm_bl_ops = {  	.update_status  = atmel_pwm_bl_set_intensity,  }; -static int __init atmel_pwm_bl_probe(struct platform_device *pdev) +static int atmel_pwm_bl_probe(struct platform_device *pdev)  {  	struct backlight_properties props;  	const struct atmel_pwm_bl_platform_data *pdata;  	struct backlight_device *bldev;  	struct atmel_pwm_bl *pwmbl; +	unsigned long flags;  	int retval; +	pdata = dev_get_platdata(&pdev->dev); +	if (!pdata) +		return -ENODEV; + +	if (pdata->pwm_compare_max < pdata->pwm_duty_max || +			pdata->pwm_duty_min > pdata->pwm_duty_max || +			pdata->pwm_frequency == 0) +		return -EINVAL; +  	pwmbl = devm_kzalloc(&pdev->dev, sizeof(struct atmel_pwm_bl),  				GFP_KERNEL);  	if (!pwmbl)  		return -ENOMEM;  	pwmbl->pdev = pdev; - -	pdata = pdev->dev.platform_data; -	if (!pdata) { -		retval = -ENODEV; -		goto err_free_mem; -	} - -	if (pdata->pwm_compare_max < pdata->pwm_duty_max || -			pdata->pwm_duty_min > pdata->pwm_duty_max || -			pdata->pwm_frequency == 0) { -		retval = -EINVAL; -		goto err_free_mem; -	} -  	pwmbl->pdata = pdata;  	pwmbl->gpio_on = pdata->gpio_on;  	retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc);  	if (retval) -		goto err_free_mem; - -	if (pwmbl->gpio_on != -1) { -		retval = devm_gpio_request(&pdev->dev, pwmbl->gpio_on, -					"gpio_atmel_pwm_bl"); -		if (retval) { -			pwmbl->gpio_on = -1; -			goto err_free_pwm; -		} +		return retval; +	if (gpio_is_valid(pwmbl->gpio_on)) {  		/* Turn display off by default. */ -		retval = gpio_direction_output(pwmbl->gpio_on, -				0 ^ pdata->on_active_low); +		if (pdata->on_active_low) +			flags = GPIOF_OUT_INIT_HIGH; +		else +			flags = GPIOF_OUT_INIT_LOW; + +		retval = devm_gpio_request_one(&pdev->dev, pwmbl->gpio_on, +						flags, "gpio_atmel_pwm_bl");  		if (retval)  			goto err_free_pwm;  	} @@ -171,8 +165,9 @@ static int __init atmel_pwm_bl_probe(struct platform_device *pdev)  	memset(&props, 0, sizeof(struct backlight_properties));  	props.type = BACKLIGHT_RAW;  	props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min; -	bldev = backlight_device_register("atmel-pwm-bl", &pdev->dev, pwmbl, -					  &atmel_pwm_bl_ops, &props); +	bldev = devm_backlight_device_register(&pdev->dev, "atmel-pwm-bl", +					&pdev->dev, pwmbl, &atmel_pwm_bl_ops, +					&props);  	if (IS_ERR(bldev)) {  		retval = PTR_ERR(bldev);  		goto err_free_pwm; @@ -188,29 +183,25 @@ static int __init atmel_pwm_bl_probe(struct platform_device *pdev)  	retval = atmel_pwm_bl_init_pwm(pwmbl);  	if (retval) -		goto err_free_bl_dev; +		goto err_free_pwm;  	atmel_pwm_bl_set_intensity(bldev);  	return 0; -err_free_bl_dev: -	backlight_device_unregister(bldev);  err_free_pwm:  	pwm_channel_free(&pwmbl->pwmc); -err_free_mem: +  	return retval;  } -static int __exit atmel_pwm_bl_remove(struct platform_device *pdev) +static int atmel_pwm_bl_remove(struct platform_device *pdev)  {  	struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev); -	if (pwmbl->gpio_on != -1) -		gpio_set_value(pwmbl->gpio_on, 0); +	atmel_pwm_bl_set_gpio_on(pwmbl, 0);  	pwm_channel_disable(&pwmbl->pwmc);  	pwm_channel_free(&pwmbl->pwmc); -	backlight_device_unregister(pwmbl->bldev);  	return 0;  } @@ -220,11 +211,13 @@ static struct platform_driver atmel_pwm_bl_driver = {  		.name = "atmel-pwm-bl",  	},  	/* REVISIT add suspend() and resume() */ -	.remove = __exit_p(atmel_pwm_bl_remove), +	.probe = atmel_pwm_bl_probe, +	.remove = atmel_pwm_bl_remove,  }; -module_platform_driver_probe(atmel_pwm_bl_driver, atmel_pwm_bl_probe); +module_platform_driver(atmel_pwm_bl_driver);  MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>");  MODULE_DESCRIPTION("Atmel PWM backlight driver");  MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:atmel-pwm-bl");  | 
