Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec38846a authored by Alexandre Belloni's avatar Alexandre Belloni Committed by Nicolas Ferre
Browse files

backlight: atmel-pwm-bl: remove obsolete driver



The atmel-pwm-bl driver is now obsolete. It is not used by any mainlined boards
and is replaced by the generic pwm_bl with the pawm-atmel driver using the
generic PWM framework.

Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@free-electrons.com>
Acked-by: default avatarHans-Christian Egtvedt <egtvedt@samfundet.no>
Acked-by: default avatarJingoo Han <jg1.han@samsung.com>
Signed-off-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
parent 67c2b145
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -178,17 +178,6 @@ config BACKLIGHT_ATMEL_LCDC
	  If in doubt, it's safe to enable this option; it doesn't kick
	  in unless the board's description says it's wired that way.

config BACKLIGHT_ATMEL_PWM
	tristate "Atmel PWM backlight control"
	depends on ATMEL_PWM
	help
	  Say Y here if you want to use the PWM peripheral in Atmel AT91 and
	  AVR32 devices. This driver will need additional platform data to know
	  which PWM instance to use and how to configure it.

	  To compile this driver as a module, choose M here: the module will be
	  called atmel-pwm-bl.

config BACKLIGHT_EP93XX
	tristate "Cirrus EP93xx Backlight Driver"
	depends on FB_EP93XX
+0 −1
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ obj-$(CONFIG_BACKLIGHT_ADP8860) += adp8860_bl.o
obj-$(CONFIG_BACKLIGHT_ADP8870)		+= adp8870_bl.o
obj-$(CONFIG_BACKLIGHT_APPLE)		+= apple_bl.o
obj-$(CONFIG_BACKLIGHT_AS3711)		+= as3711_bl.o
obj-$(CONFIG_BACKLIGHT_ATMEL_PWM)	+= atmel-pwm-bl.o
obj-$(CONFIG_BACKLIGHT_BD6107)		+= bd6107.o
obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH)	+= cr_bllcd.o
obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE)	+= backlight.o
+0 −223
Original line number Diff line number Diff line
/*
 * Copyright (C) 2008 Atmel Corporation
 *
 * Backlight driver using Atmel PWM peripheral.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 */
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/gpio.h>
#include <linux/backlight.h>
#include <linux/atmel_pwm.h>
#include <linux/atmel-pwm-bl.h>
#include <linux/slab.h>

struct atmel_pwm_bl {
	const struct atmel_pwm_bl_platform_data	*pdata;
	struct backlight_device			*bldev;
	struct platform_device			*pdev;
	struct pwm_channel			pwmc;
	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);
	int intensity = bd->props.brightness;
	int pwm_duty;

	if (bd->props.power != FB_BLANK_UNBLANK)
		intensity = 0;
	if (bd->props.fb_blank != FB_BLANK_UNBLANK)
		intensity = 0;

	if (pwmbl->pdata->pwm_active_low)
		pwm_duty = pwmbl->pdata->pwm_duty_min + intensity;
	else
		pwm_duty = pwmbl->pdata->pwm_duty_max - intensity;

	if (pwm_duty > pwmbl->pdata->pwm_duty_max)
		pwm_duty = pwmbl->pdata->pwm_duty_max;
	if (pwm_duty < pwmbl->pdata->pwm_duty_min)
		pwm_duty = pwmbl->pdata->pwm_duty_min;

	if (!intensity) {
		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);
		atmel_pwm_bl_set_gpio_on(pwmbl, 1);
	}

	return 0;
}

static int atmel_pwm_bl_get_intensity(struct backlight_device *bd)
{
	struct atmel_pwm_bl *pwmbl = bl_get_data(bd);
	u32 cdty;
	u32 intensity;

	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 & 0xffff;
}

static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl)
{
	unsigned long pwm_rate = pwmbl->pwmc.mck;
	unsigned long prescale = DIV_ROUND_UP(pwm_rate,
			(pwmbl->pdata->pwm_frequency *
			 pwmbl->pdata->pwm_compare_max)) - 1;

	/*
	 * Prescale must be power of two and maximum 0xf in size because of
	 * hardware limit. PWM speed will be:
	 *	PWM module clock speed / (2 ^ prescale).
	 */
	prescale = fls(prescale);
	if (prescale > 0xf)
		prescale = 0xf;

	pwm_channel_writel(&pwmbl->pwmc, PWM_CMR, prescale);
	pwm_channel_writel(&pwmbl->pwmc, PWM_CDTY,
			pwmbl->pdata->pwm_duty_min +
			pwmbl->bldev->props.brightness);
	pwm_channel_writel(&pwmbl->pwmc, PWM_CPRD,
			pwmbl->pdata->pwm_compare_max);

	dev_info(&pwmbl->pdev->dev, "Atmel PWM backlight driver (%lu Hz)\n",
		pwmbl->pwmc.mck / pwmbl->pdata->pwm_compare_max /
		(1 << prescale));

	return pwm_channel_enable(&pwmbl->pwmc);
}

static const struct backlight_ops atmel_pwm_bl_ops = {
	.get_brightness = atmel_pwm_bl_get_intensity,
	.update_status  = atmel_pwm_bl_set_intensity,
};

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;
	pwmbl->pdata = pdata;
	pwmbl->gpio_on = pdata->gpio_on;

	retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc);
	if (retval)
		return retval;

	if (gpio_is_valid(pwmbl->gpio_on)) {
		/* Turn display off by default. */
		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;
	}

	memset(&props, 0, sizeof(struct backlight_properties));
	props.type = BACKLIGHT_RAW;
	props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min;
	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;
	}

	pwmbl->bldev = bldev;

	platform_set_drvdata(pdev, pwmbl);

	/* Power up the backlight by default at middle intesity. */
	bldev->props.power = FB_BLANK_UNBLANK;
	bldev->props.brightness = bldev->props.max_brightness / 2;

	retval = atmel_pwm_bl_init_pwm(pwmbl);
	if (retval)
		goto err_free_pwm;

	atmel_pwm_bl_set_intensity(bldev);

	return 0;

err_free_pwm:
	pwm_channel_free(&pwmbl->pwmc);

	return retval;
}

static int atmel_pwm_bl_remove(struct platform_device *pdev)
{
	struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev);

	atmel_pwm_bl_set_gpio_on(pwmbl, 0);
	pwm_channel_disable(&pwmbl->pwmc);
	pwm_channel_free(&pwmbl->pwmc);

	return 0;
}

static struct platform_driver atmel_pwm_bl_driver = {
	.driver = {
		.name = "atmel-pwm-bl",
	},
	/* REVISIT add suspend() and resume() */
	.probe = atmel_pwm_bl_probe,
	.remove = atmel_pwm_bl_remove,
};

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");

include/linux/atmel-pwm-bl.h

deleted100644 → 0
+0 −43
Original line number Diff line number Diff line
/*
 * Copyright (C) 2007 Atmel Corporation
 *
 * Driver for the AT32AP700X PS/2 controller (PSIF).
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation.
 */

#ifndef __INCLUDE_ATMEL_PWM_BL_H
#define __INCLUDE_ATMEL_PWM_BL_H

/**
 * struct atmel_pwm_bl_platform_data
 * @pwm_channel: which PWM channel in the PWM module to use.
 * @pwm_frequency: PWM frequency to generate, the driver will try to be as
 *	close as the prescaler allows.
 * @pwm_compare_max: value to use in the PWM channel compare register.
 * @pwm_duty_max: maximum duty cycle value, must be less than or equal to
 *	pwm_compare_max.
 * @pwm_duty_min: minimum duty cycle value, must be less than pwm_duty_max.
 * @pwm_active_low: set to one if the low part of the PWM signal increases the
 *	brightness of the backlight.
 * @gpio_on: GPIO line to control the backlight on/off, set to -1 if not used.
 * @on_active_low: set to one if the on/off signal is on when GPIO is low.
 *
 * This struct must be added to the platform device in the board code. It is
 * used by the atmel-pwm-bl driver to setup the GPIO to control on/off and the
 * PWM device.
 */
struct atmel_pwm_bl_platform_data {
	unsigned int pwm_channel;
	unsigned int pwm_frequency;
	unsigned int pwm_compare_max;
	unsigned int pwm_duty_max;
	unsigned int pwm_duty_min;
	unsigned int pwm_active_low;
	int gpio_on;
	unsigned int on_active_low;
};

#endif /* __INCLUDE_ATMEL_PWM_BL_H */