Re: [PATCH 3/3] pwm: New driver to support PWM driven LEDs on TWL4030/6030 series of PMICs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Nov 7, 2012 at 4:44 PM, Peter Ujfalusi <peter.ujfalusi@xxxxxx> wrote:
> The driver supports the following LED outputs as generic PWM driver:
> TWL4030 LEDA and LEDB (PWMA and PWMB)
> TWL6030 Charging indicator LED (PWM LED)
>
> On TWL6030 when the PWM requested LED is configured to be controlled by SW.
> In this case the user can enable/disable and set the duty period freely.
> When the PWM has been freed, the LED driver is put back to HW control.
>
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@xxxxxx>
> ---
>  drivers/pwm/Kconfig       |  10 ++
>  drivers/pwm/Makefile      |   1 +
>  drivers/pwm/pwm-twl-led.c | 287 ++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 298 insertions(+)
>  create mode 100644 drivers/pwm/pwm-twl-led.c
>
> diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
> index c577db9..49c2082 100644
> --- a/drivers/pwm/Kconfig
> +++ b/drivers/pwm/Kconfig
> @@ -152,6 +152,16 @@ config PWM_TWL
>           To compile this driver as a module, choose M here: the module
>           will be called pwm-twl.
>
> +config PWM_TWL_LED
> +       tristate "TWL4030/6030 PWM support for LED drivers"
> +       select HAVE_PWM
> +       depends on TWL4030_CORE
> +       help
> +         Generic PWM framework driver for TWL4030/6030 LED.
> +
> +         To compile this driver as a module, choose M here: the module
> +         will be called pwm-twl-led.
> +
>  config PWM_VT8500
>         tristate "vt8500 pwm support"
>         depends on ARCH_VT8500
> diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
> index 3324c06..5f26134 100644
> --- a/drivers/pwm/Makefile
> +++ b/drivers/pwm/Makefile
> @@ -12,4 +12,5 @@ obj-$(CONFIG_PWM_TEGRA)               += pwm-tegra.o
>  obj-$(CONFIG_PWM_TIECAP)       += pwm-tiecap.o
>  obj-$(CONFIG_PWM_TIEHRPWM)     += pwm-tiehrpwm.o
>  obj-$(CONFIG_PWM_TWL)          += pwm-twl.o
> +obj-$(CONFIG_PWM_TWL_LED)      += pwm-twl-led.o
>  obj-$(CONFIG_PWM_VT8500)       += pwm-vt8500.o
> diff --git a/drivers/pwm/pwm-twl-led.c b/drivers/pwm/pwm-twl-led.c
> new file mode 100644
> index 0000000..4d6ddc9
> --- /dev/null
> +++ b/drivers/pwm/pwm-twl-led.c
> @@ -0,0 +1,287 @@
> +/*
> + * Driver for TWL4030/6030 Pulse Width Modulator used as LED driver
> + *
> + * Copyright (C) 2012 Texas Instruments
> + * Author: Peter Ujfalusi <peter.ujfalusi@xxxxxx>
> + *
> + * This driver is a complete rewrite of the former pwm-twl6030.c authorded by:
> + * Hemanth V <hemanthv@xxxxxx>
> + *
> + * 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.
> + *
> + * This program is distributed in the hope that it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/pwm.h>
> +#include <linux/i2c/twl.h>
> +#include <linux/slab.h>
> +
> +#define TWL4030_LED_MAX                0x7f
> +#define TWL6030_LED_MAX                0xff
> +
> +/* Registers, bits and macro for TWL4030 */
> +#define TWL4030_LEDEN_REG      0x00
> +#define TWL4030_PWMA_REG       0x01
> +
> +#define TWL4030_LEDXON         (1 << 0)
> +#define TWL4030_LEDXPWM                (1 << 4)
> +#define TWL4030_LED_PINS       (TWL4030_LEDXON | TWL4030_LEDXPWM)
> +#define TWL4030_LED_TOGGLE(led, x)     ((x) << (led))
> +
> +/* Register, bits and macro for TWL6030 */
> +#define TWL6030_LED_PWM_CTRL1  0xf4
> +#define TWL6030_LED_PWM_CTRL2  0xf5
> +
> +#define TWL6040_LED_MODE_HW    0x00
> +#define TWL6040_LED_MODE_ON    0x01
> +#define TWL6040_LED_MODE_OFF   0x02
> +#define TWL6040_LED_MODE_MASK  0x03
> +
> +struct twl_pwmled_chip {
> +       struct pwm_chip chip;
> +};
> +
> +static int twl4030_pwmled_config(struct pwm_chip *chip, struct pwm_device *pwm,
> +                             int duty_ns, int period_ns)
> +{
> +       int duty_cycle = (duty_ns * TWL4030_LED_MAX) / period_ns;
> +       u8 on_time;
> +       u8 pwm_config[2];
> +       int base, ret;
> +
> +       if (duty_cycle >= TWL4030_LED_MAX)
> +               on_time = TWL4030_LED_MAX;
> +       else if (!duty_cycle)
> +               on_time = TWL4030_LED_MAX - 1;
> +       else
> +               on_time = TWL4030_LED_MAX - duty_cycle;
> +
> +       base = pwm->hwpwm * 2 + TWL4030_PWMA_REG;
> +
> +       pwm_config[0] = on_time;
> +       pwm_config[1] = TWL4030_LED_MAX;
> +
> +       ret = twl_i2c_write(TWL4030_MODULE_LED, pwm_config, base, 2);

Shouldn't this use TWL4030_MODULE_PWMA and TWL4030_MODULE_PWMB as
first argument? I can guess it works your way too, but
TWL4030_MODULE_PWMx would match the TRM better.


-- 
Gražvydas
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux