mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
pwm: Changes for v4.7-rc1
This set of changes introduces an atomic API to the PWM subsystem. This is influenced by the DRM atomic API that was introduced a while back, though it is obviously a lot simpler. The fundamental idea remains the same, though: drivers provide a single callback to implement the atomic configuration of a PWM channel. As a side-effect the PWM subsystem gains the ability for initial state retrieval, so that the logical state mirrors that of the hardware. Many use-cases don't care about this, but for others it is essential. These new features require changes in all users, which these patches take care of. The core is transitioned to use the atomic callback if available and provides a fallback mechanism for other drivers. Changes to transition users and drivers to the atomic API are postponed to v4.8. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJXRcVWAAoJEN0jrNd/PrOhO3EP/RDuuco1fROml1ElCjcnWWfv 3dPyKEJhZktMmRNd/V0zMUJiOwr77wlbX4oQ5HajMHNYFQ65jfihbbylhSDepnxg mjKV/yo18rzYZt9fv8huwvlwMOlLrJ9wQn4Gkbr5tzke6nITp52DTNH5y/anPQIk B7neA1TerodAbE9FWjYuBZIltkmYZDqdm//RCHXVyYym8VuotE+jf+nrMXI78FoL lgG64z/2OaGI+NZJQcpWftuz9nnenpa3sSLrvpitWEb/dAsXroMW/f08uVuOW87v 0xk7N7zmEkef7izVOWiPOK/MxIdc8hI4A5JftzMJ7nbgJvwG78dJiOxgFhrJYx0z 7zrYfjvvzjW0dpjZUvO37T/V5Rfxrk9sM7qUHJmN0+1oEkkCo1/c75JWTU2AmT4l qkJdOGhgv7LumIiwbEyxc/5Jyh1akKOUX2svO0+0dptLRX2UpN3yeKIYinG1dAuT 86+/uuM6CL5gc+jVZ3GLNWfzHUu2RFVX0r0pzywq53pK5gMEs5WyxoIb5mHb8liA sHsrZ3wbGGn95yZo8CwkzXIUsUH7qKYK+UVWA6OVBoTq4AOBZtII1AqvUttl25qL xuKpj70xaBhK7VGqzDYQ68lqBaRySh+yzL/QsmnPEyx59mW81ytMrsn1Kmnuae2l bzUsnWrpHc6530fRggTD =sxT9 -----END PGP SIGNATURE----- Merge tag 'pwm/for-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm Pull pwm updates from Thierry Reding: "This set of changes introduces an atomic API to the PWM subsystem. This is influenced by the DRM atomic API that was introduced a while back, though it is obviously a lot simpler. The fundamental idea remains the same, though: drivers provide a single callback to implement the atomic configuration of a PWM channel. As a side-effect the PWM subsystem gains the ability for initial state retrieval, so that the logical state mirrors that of the hardware. Many use-cases don't care about this, but for others it is essential. These new features require changes in all users, which these patches take care of. The core is transitioned to use the atomic callback if available and provides a fallback mechanism for other drivers. Changes to transition users and drivers to the atomic API are postponed to v4.8" * tag 'pwm/for-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm: (30 commits) pwm: Add information about polarity, duty cycle and period to debugfs pwm: Switch to the atomic API pwm: Update documentation pwm: Add core infrastructure to allow atomic updates pwm: Add hardware readout infrastructure pwm: Move the enabled/disabled info into pwm_state pwm: Introduce the pwm_state concept pwm: Keep PWM state in sync with hardware state ARM: Explicitly apply PWM config extracted from pwm_args drm: i915: Explicitly apply PWM config extracted from pwm_args input: misc: pwm-beeper: Explicitly apply PWM config extracted from pwm_args input: misc: max8997: Explicitly apply PWM config extracted from pwm_args backlight: lm3630a: explicitly apply PWM config extracted from pwm_args backlight: lp855x: Explicitly apply PWM config extracted from pwm_args backlight: lp8788: Explicitly apply PWM config extracted from pwm_args backlight: pwm_bl: Use pwm_get_args() where appropriate fbdev: ssd1307fb: Use pwm_get_args() where appropriate regulator: pwm: Use pwm_get_args() where appropriate leds: pwm: Use pwm_get_args() where appropriate input: misc: max77693: Use pwm_get_args() where appropriate ...
This commit is contained in:
commit
ecc5fbd5ef
22 changed files with 585 additions and 210 deletions
|
|
@ -162,7 +162,7 @@ static int lm3630a_intr_config(struct lm3630a_chip *pchip)
|
|||
|
||||
static void lm3630a_pwm_ctrl(struct lm3630a_chip *pchip, int br, int br_max)
|
||||
{
|
||||
unsigned int period = pwm_get_period(pchip->pwmd);
|
||||
unsigned int period = pchip->pdata->pwm_period;
|
||||
unsigned int duty = br * period / br_max;
|
||||
|
||||
pwm_config(pchip->pwmd, duty, period);
|
||||
|
|
@ -424,8 +424,13 @@ static int lm3630a_probe(struct i2c_client *client,
|
|||
dev_err(&client->dev, "fail : get pwm device\n");
|
||||
return PTR_ERR(pchip->pwmd);
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to
|
||||
* the atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(pchip->pwmd);
|
||||
}
|
||||
pchip->pwmd->period = pdata->pwm_period;
|
||||
|
||||
/* interrupt enable : irq 0 is not allowed */
|
||||
pchip->irq = client->irq;
|
||||
|
|
|
|||
|
|
@ -246,6 +246,12 @@ static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br)
|
|||
return;
|
||||
|
||||
lp->pwm = pwm;
|
||||
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to
|
||||
* the atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(pwm);
|
||||
}
|
||||
|
||||
pwm_config(lp->pwm, duty, period);
|
||||
|
|
|
|||
|
|
@ -145,6 +145,12 @@ static void lp8788_pwm_ctrl(struct lp8788_bl *bl, int br, int max_br)
|
|||
}
|
||||
|
||||
bl->pwm = pwm;
|
||||
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to
|
||||
* the atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(pwm);
|
||||
}
|
||||
|
||||
pwm_config(bl->pwm, duty, period);
|
||||
|
|
|
|||
|
|
@ -201,6 +201,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
|||
struct device_node *node = pdev->dev.of_node;
|
||||
struct pwm_bl_data *pb;
|
||||
int initial_blank = FB_BLANK_UNBLANK;
|
||||
struct pwm_args pargs;
|
||||
int ret;
|
||||
|
||||
if (!data) {
|
||||
|
|
@ -306,17 +307,22 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
|||
|
||||
dev_dbg(&pdev->dev, "got pwm for backlight\n");
|
||||
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to
|
||||
* the atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(pb->pwm);
|
||||
|
||||
/*
|
||||
* The DT case will set the pwm_period_ns field to 0 and store the
|
||||
* period, parsed from the DT, in the PWM device. For the non-DT case,
|
||||
* set the period from platform data if it has not already been set
|
||||
* via the PWM lookup table.
|
||||
*/
|
||||
pb->period = pwm_get_period(pb->pwm);
|
||||
if (!pb->period && (data->pwm_period_ns > 0)) {
|
||||
pwm_get_args(pb->pwm, &pargs);
|
||||
pb->period = pargs.period;
|
||||
if (!pb->period && (data->pwm_period_ns > 0))
|
||||
pb->period = data->pwm_period_ns;
|
||||
pwm_set_period(pb->pwm, data->pwm_period_ns);
|
||||
}
|
||||
|
||||
pb->lth_brightness = data->lth_brightness * (pb->period / pb->scale);
|
||||
|
||||
|
|
|
|||
|
|
@ -286,6 +286,7 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
|
|||
{
|
||||
int ret;
|
||||
u32 precharge, dclk, com_invdir, compins;
|
||||
struct pwm_args pargs;
|
||||
|
||||
if (par->device_info->need_pwm) {
|
||||
par->pwm = pwm_get(&par->client->dev, NULL);
|
||||
|
|
@ -294,7 +295,15 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
|
|||
return PTR_ERR(par->pwm);
|
||||
}
|
||||
|
||||
par->pwm_period = pwm_get_period(par->pwm);
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to
|
||||
* the atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(par->pwm);
|
||||
|
||||
pwm_get_args(par->pwm, &pargs);
|
||||
|
||||
par->pwm_period = pargs.period;
|
||||
/* Enable the PWM */
|
||||
pwm_config(par->pwm, par->pwm_period / 2, par->pwm_period);
|
||||
pwm_enable(par->pwm);
|
||||
|
|
|
|||
Loading…
Reference in a new issue