Received: by 10.223.185.116 with SMTP id b49csp1916636wrg; Thu, 22 Feb 2018 05:22:52 -0800 (PST) X-Google-Smtp-Source: AH8x2253+O1nRDpVNTRSUZw3tbt0gSOr6P9z3YsEsJtxRWznn6yxFmtdU6Vvipr80bbwaF3NVOzC X-Received: by 2002:a17:902:2e04:: with SMTP id q4-v6mr3384759plb.22.1519305772154; Thu, 22 Feb 2018 05:22:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519305772; cv=none; d=google.com; s=arc-20160816; b=wjSr25OcFG7RMMiO91bFTz7ZmX7/tiD7PQ8Iz/RanTb1i6X+pqKhyCwyAx8pU3rwGA fPtYZM8zWtS4EZ5Fcyshqz8T0eaRePmf9HUgeTdC4K6aVn6pJrser9yl8YSMea8W8go1 5DZGNC1E0otRPbZjhqR13Ay1VZJqVc+ULNJdc7HbVQT5StrQY/MrPclCpkFlP5jmSsX1 4h/xa/JgZyCraKfrOL8unl/gjgQpZAmfbE9yU98gL+ZXZiny+rl7pbW29RiDXoMvqMuP /c0mlUYWMeagM4aRfBQJXKawPtQ72OtBachtAkHtqrJ2vB4LJhxJl6CGbYiLl2Vp9o0c obHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=pY2rcDssYw3XzItO0ODCu8QmCkjfLje+/Mphj9guc1c=; b=y2U6pJ/1K7p50ZUbtaBnHQTK7R1ecpq+jg2bWzOW4KLwtl0gzGyvhEgo22tJ0oLZ1J ZTaeJc/uazwtfwozcxAjG1myvO0cvUtWfBSkdoFZnznY2qb/KQ2S5G6bKKDooUO8b2AT y2r0FSY8RP/f46BCTUQn3jHDgCD8oVQc7VTUjUX3b7r7eEy8AigXLU6OQ3Pu4AXXkRwg ywI4eU2fxWBaZ/FX4bs3m4c48YaEjNV4GDjpmjqIvgZKKQXFF1bBydPLcw/wWliW4CK1 ayxg6NUDsL7gSEAJegwTdkUnhyuFtLLANbiXmzUJUd3j+CydIq9xHRIt1PugkIMjSd5u KRcg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p14si13368pgn.333.2018.02.22.05.22.37; Thu, 22 Feb 2018 05:22:52 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932548AbeBVNVi (ORCPT + 99 others); Thu, 22 Feb 2018 08:21:38 -0500 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:61632 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932199AbeBVNVc (ORCPT ); Thu, 22 Feb 2018 08:21:32 -0500 X-IronPort-AV: E=Sophos;i="5.47,377,1515481200"; d="scan'208";a="11404909" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 22 Feb 2018 06:21:30 -0700 Received: from [10.145.6.79] (10.10.76.4) by chn-sv-exch04.mchp-main.com (10.10.76.105) with Microsoft SMTP Server id 14.3.352.0; Thu, 22 Feb 2018 06:21:30 -0700 Subject: Re: [PATCH v3 05/10] pwm: add PWM mode to pwm_config() To: Daniel Thompson CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , References: <1519300881-8136-1-git-send-email-claudiu.beznea@microchip.com> <1519300881-8136-6-git-send-email-claudiu.beznea@microchip.com> <20180222123308.mypx2r7n6o63mj5z@oak.lan> From: Claudiu Beznea Message-ID: <27bab524-3c94-1149-e3de-880cd7dde352@microchip.com> Date: Thu, 22 Feb 2018 15:21:19 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180222123308.mypx2r7n6o63mj5z@oak.lan> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 22.02.2018 14:33, Daniel Thompson wrote: > On Thu, Feb 22, 2018 at 02:01:16PM +0200, Claudiu Beznea wrote: >> Add PWM mode to pwm_config() function. The drivers which uses pwm_config() >> were adapted to this change. >> >> Signed-off-by: Claudiu Beznea >> --- >> arch/arm/mach-s3c24xx/mach-rx1950.c | 11 +++++++++-- >> drivers/bus/ts-nbus.c | 2 +- >> drivers/clk/clk-pwm.c | 3 ++- >> drivers/gpu/drm/i915/intel_panel.c | 17 ++++++++++++++--- >> drivers/hwmon/pwm-fan.c | 2 +- >> drivers/input/misc/max77693-haptic.c | 2 +- >> drivers/input/misc/max8997_haptic.c | 6 +++++- >> drivers/leds/leds-pwm.c | 5 ++++- >> drivers/media/rc/ir-rx51.c | 5 ++++- >> drivers/media/rc/pwm-ir-tx.c | 5 ++++- >> drivers/video/backlight/lm3630a_bl.c | 4 +++- >> drivers/video/backlight/lp855x_bl.c | 4 +++- >> drivers/video/backlight/lp8788_bl.c | 5 ++++- >> drivers/video/backlight/pwm_bl.c | 11 +++++++++-- >> drivers/video/fbdev/ssd1307fb.c | 3 ++- >> include/linux/pwm.h | 6 ++++-- >> 16 files changed, 70 insertions(+), 21 deletions(-) >> >> diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c >> index 2030a6b77a09..696fa25dafd2 100644 >> --- a/drivers/video/backlight/lm3630a_bl.c >> +++ b/drivers/video/backlight/lm3630a_bl.c >> @@ -165,8 +165,10 @@ static void lm3630a_pwm_ctrl(struct lm3630a_chip *pchip, int br, int br_max) >> { >> unsigned int period = pchip->pdata->pwm_period; >> unsigned int duty = br * period / br_max; >> + struct pwm_caps caps = { }; >> >> - pwm_config(pchip->pwmd, duty, period); >> + pwm_get_caps(pchip->pwmd->chip, pchip->pwmd, &caps); >> + pwm_config(pchip->pwmd, duty, period, BIT(ffs(caps.modes) - 1)); > > Well... I admit I've only really looked at the patches that impact > backlight but dispersing this really odd looking bit twiddling > throughout the kernel doesn't strike me a great API design.> > IMHO callers should not be required to find the first set bit in > some specially crafted set of capability bits simply to get sane > default behaviour. Thank you for your inputs. I will try to have a fix for this in next version. The idea with this was to locate first available PWM mode of PWM channel. If the driver hasn't registered any PWM capabilities related ops the default capabilities will include only PWM normal mode. In case the PWM channel will register different capabilities taking the first available mode from caps.modes and passing it as argument to pwm_config() will ensure the pwm_apply_state() will not fail. Thank you, Claudiu Beznea > > > Daniel. > > > > >> if (duty) >> pwm_enable(pchip->pwmd); >> else >> diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c >> index 939f057836e1..3d274c604862 100644 >> --- a/drivers/video/backlight/lp855x_bl.c >> +++ b/drivers/video/backlight/lp855x_bl.c >> @@ -240,6 +240,7 @@ static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br) >> unsigned int period = lp->pdata->period_ns; >> unsigned int duty = br * period / max_br; >> struct pwm_device *pwm; >> + struct pwm_caps caps = { }; >> >> /* request pwm device with the consumer name */ >> if (!lp->pwm) { >> @@ -256,7 +257,8 @@ static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br) >> pwm_apply_args(pwm); >> } >> >> - pwm_config(lp->pwm, duty, period); >> + pwm_get_caps(lp->pwm->chip, lp->pwm, &caps); >> + pwm_config(lp->pwm, duty, period, BIT(ffs(caps.modes) - 1)); >> if (duty) >> pwm_enable(lp->pwm); >> else >> diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c >> index cf869ec90cce..06de3163650d 100644 >> --- a/drivers/video/backlight/lp8788_bl.c >> +++ b/drivers/video/backlight/lp8788_bl.c >> @@ -128,6 +128,7 @@ static void lp8788_pwm_ctrl(struct lp8788_bl *bl, int br, int max_br) >> unsigned int duty; >> struct device *dev; >> struct pwm_device *pwm; >> + struct pwm_caps caps = { }; >> >> if (!bl->pdata) >> return; >> @@ -153,7 +154,9 @@ static void lp8788_pwm_ctrl(struct lp8788_bl *bl, int br, int max_br) >> pwm_apply_args(pwm); >> } >> >> - pwm_config(bl->pwm, duty, period); >> + pwm_get_caps(bl->pwm->chip, bl->pwm, &caps); >> + >> + pwm_config(bl->pwm, duty, period, BIT(ffs(caps.modes) - 1)); >> if (duty) >> pwm_enable(bl->pwm); >> else >> diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c >> index 1c2289ddd555..706a9ab053a7 100644 >> --- a/drivers/video/backlight/pwm_bl.c >> +++ b/drivers/video/backlight/pwm_bl.c >> @@ -63,10 +63,14 @@ static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness) >> >> static void pwm_backlight_power_off(struct pwm_bl_data *pb) >> { >> + struct pwm_caps caps = { }; >> + >> if (!pb->enabled) >> return; >> >> - pwm_config(pb->pwm, 0, pb->period); >> + pwm_get_caps(pb->pwm->chip, pb->pwm, &caps); >> + >> + pwm_config(pb->pwm, 0, pb->period, BIT(ffs(caps.modes) - 1)); >> pwm_disable(pb->pwm); >> >> if (pb->enable_gpio) >> @@ -96,6 +100,7 @@ static int pwm_backlight_update_status(struct backlight_device *bl) >> { >> struct pwm_bl_data *pb = bl_get_data(bl); >> int brightness = bl->props.brightness; >> + struct pwm_caps caps = { }; >> int duty_cycle; >> >> if (bl->props.power != FB_BLANK_UNBLANK || >> @@ -108,7 +113,9 @@ static int pwm_backlight_update_status(struct backlight_device *bl) >> >> if (brightness > 0) { >> duty_cycle = compute_duty_cycle(pb, brightness); >> - pwm_config(pb->pwm, duty_cycle, pb->period); >> + pwm_get_caps(pb->pwm->chip, pb->pwm, &caps); >> + pwm_config(pb->pwm, duty_cycle, pb->period, >> + BIT(ffs(caps.modes) - 1)); >> pwm_backlight_power_on(pb, brightness); >> } else >> pwm_backlight_power_off(pb); >> diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c >> index f599520374dd..4b57dcb5799a 100644 >> --- a/drivers/video/fbdev/ssd1307fb.c >> +++ b/drivers/video/fbdev/ssd1307fb.c >> @@ -308,7 +308,8 @@ static int ssd1307fb_init(struct ssd1307fb_par *par) >> >> par->pwm_period = pargs.period; >> /* Enable the PWM */ >> - pwm_config(par->pwm, par->pwm_period / 2, par->pwm_period); >> + pwm_config(par->pwm, par->pwm_period / 2, par->pwm_period, >> + pargs.mode); >> pwm_enable(par->pwm); >> >> dev_dbg(&par->client->dev, "Using PWM%d with a %dns period.\n", >> diff --git a/include/linux/pwm.h b/include/linux/pwm.h >> index e62349f48129..0ba416ab2772 100644 >> --- a/include/linux/pwm.h >> +++ b/include/linux/pwm.h >> @@ -357,11 +357,12 @@ int pwm_adjust_config(struct pwm_device *pwm); >> * @pwm: PWM device >> * @duty_ns: "on" time (in nanoseconds) >> * @period_ns: duration (in nanoseconds) of one cycle >> + * @mode: PWM mode >> * >> * Returns: 0 on success or a negative error code on failure. >> */ >> static inline int pwm_config(struct pwm_device *pwm, int duty_ns, >> - int period_ns) >> + int period_ns, unsigned long mode) >> { >> struct pwm_state state; >> >> @@ -377,6 +378,7 @@ static inline int pwm_config(struct pwm_device *pwm, int duty_ns, >> >> state.duty_cycle = duty_ns; >> state.period = period_ns; >> + state.mode = mode; >> return pwm_apply_state(pwm, &state); >> } >> >> @@ -537,7 +539,7 @@ static inline int pwm_adjust_config(struct pwm_device *pwm) >> } >> >> static inline int pwm_config(struct pwm_device *pwm, int duty_ns, >> - int period_ns) >> + int period_ns, unsigned long mode) >> { >> return -EINVAL; >> } >> -- >> 2.7.4 >> >