Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp375937pxm; Wed, 23 Feb 2022 02:17:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJxkpIwi7Qyyff5Re+EKIxhTTDC54+2DfrD3/wRupQZVgG42acgte4vBNja3ztlS4t5GtrJz X-Received: by 2002:a17:906:2846:b0:6ce:21cd:5398 with SMTP id s6-20020a170906284600b006ce21cd5398mr22938909ejc.49.1645611458682; Wed, 23 Feb 2022 02:17:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645611458; cv=none; d=google.com; s=arc-20160816; b=OkimLPQi5ozaYhygjh9Vf3Qr0HJAzZF+0163bo2OyXvb/48lYAutubjQZ5YJqI8RGy FNG7rFxblbLXBvJMm7ZqA97zijtHEXO/APlTG01guHEPz6GFJEwdy9GtHn4JtGUofOvQ iMF0LoGpcdWUCb73pAMZ8fzOXM/v8HM0GNidxHHfm/sZRrc/uSSXfR05aTSSFPGn8djb PFud+lN/BV6rjppkzzqJEGCGvBAnyCQMnai2M+OXwkmWQ0n6tev0tYDyEIBehKVdubYQ NrTu5fs1Bklmnek1cUJJkk3iQeO61mSYIINmni5d+G4lGlWUIaqCSCsGrQ+3gZ8T0BtN fqFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=8B4qz3fVCjqc6619GBTnKDjlXhdvrcN9zgBylSc0Q2k=; b=Rj/447pQswE9Eq+YW7F/rOv9A0ZS8R1GuJmMO3cYkl4ZoKyf9o02Mc2myaLk1T9nrq ABsNsIZ7LpMxSL3hi+imOfyKTMqEKdNVxdAKVBRtxca2ANXuZgbr0NpKZf75JRrvkp+w MMEtOK0tnM7nxOG+HN98bJ2ZgX571KtoOnJCNRF9o9NbiSVwM0oy57ZB1EtWyjY8l6QD Y0va9JuC1BALmpc8h6gTDNbj3mZUUHh9/gSEfV+of8rfIKt1Thob1bWY5n/BcKHo0SLZ CN0MxF4NTK77CkOaUxF/M0pCTj8t/o8RKKdBgwdO+Y/6ulTUYfLBoYOJHwUDfQYkSFAB pFPw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i15si13693402edq.484.2022.02.23.02.17.16; Wed, 23 Feb 2022 02:17:38 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236290AbiBWGgz (ORCPT + 99 others); Wed, 23 Feb 2022 01:36:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51496 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231616AbiBWGgx (ORCPT ); Wed, 23 Feb 2022 01:36:53 -0500 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3F0965157 for ; Tue, 22 Feb 2022 22:36:26 -0800 (PST) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nMlG5-0006rq-22; Wed, 23 Feb 2022 07:36:17 +0100 Received: from [2a0a:edc0:0:900:1d::77] (helo=ptz.office.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1nMlG1-000lIt-F4; Wed, 23 Feb 2022 07:36:12 +0100 Received: from ukl by ptz.office.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1nMlFz-004y2z-Mh; Wed, 23 Feb 2022 07:36:11 +0100 Date: Wed, 23 Feb 2022 07:36:08 +0100 From: Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= To: Song Chen Cc: johan@kernel.org, elder@kernel.org, gregkh@linuxfoundation.org, thierry.reding@gmail.com, lee.jones@linaro.org, greybus-dev@lists.linaro.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org Subject: Re: [PATCH v2] staging: greybus: introduce pwm_ops::apply Message-ID: <20220223063608.gv2iaoek6rynjnbu@pengutronix.de> References: <1644580947-8529-1-git-send-email-chensong_2000@189.cn> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="dsrm2xhl5lm6tau4" Content-Disposition: inline In-Reply-To: <1644580947-8529-1-git-send-email-chensong_2000@189.cn> X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --dsrm2xhl5lm6tau4 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello, orthogonal to the feedback you got for the protocol part, here some thoughts to the PWM specific bits; On Fri, Feb 11, 2022 at 08:02:27PM +0800, Song Chen wrote: > Introduce apply in pwm_ops to replace legacy operations, > like enable, disable, config and set_polarity. >=20 > Signed-off-by: Song Chen >=20 > --- > V2: > 1, define duty_cycle and period as u64 in gb_pwm_config_operation. > 2, define duty and period as u64 in gb_pwm_config_request. > 3, disable before configuring duty and period if the eventual goal > is a disabled state. > --- > drivers/staging/greybus/pwm.c | 61 ++++++++++++----------- > include/linux/greybus/greybus_protocols.h | 4 +- > 2 files changed, 34 insertions(+), 31 deletions(-) >=20 > diff --git a/drivers/staging/greybus/pwm.c b/drivers/staging/greybus/pwm.c > index 891a6a672378..03c69db5b9be 100644 > --- a/drivers/staging/greybus/pwm.c > +++ b/drivers/staging/greybus/pwm.c > @@ -89,7 +89,7 @@ static int gb_pwm_deactivate_operation(struct gb_pwm_ch= ip *pwmc, > } > =20 > static int gb_pwm_config_operation(struct gb_pwm_chip *pwmc, > - u8 which, u32 duty, u32 period) > + u8 which, u64 duty, u64 period) > { > struct gb_pwm_config_request request; > struct gbphy_device *gbphy_dev; > @@ -99,8 +99,8 @@ static int gb_pwm_config_operation(struct gb_pwm_chip *= pwmc, > return -EINVAL; > =20 > request.which =3D which; > - request.duty =3D cpu_to_le32(duty); > - request.period =3D cpu_to_le32(period); > + request.duty =3D duty; > + request.period =3D period; If you don't change the wire protocol, you want something like: if (period > U32_MAX) period =3D U32_MAX; if (duty > period) duty =3D period; To further improve the PWM driver it would be great if you added a paragraph about the details of its behaviour; in the format the other drivers do that (see e.g. drivers/pwm/pwm-sifive.c). It should describe the following properties: - Is a period completed when period/duty changes? - Is a period completed when the hardware is disabled? - How does the output behave on disable? In this specific case I think there is also some rounding behaviour in the backend?! If so, describing this would be good, too. > gbphy_dev =3D to_gbphy_dev(pwmc->chip.dev); > ret =3D gbphy_runtime_get_sync(gbphy_dev); > @@ -204,43 +204,46 @@ static void gb_pwm_free(struct pwm_chip *chip, stru= ct pwm_device *pwm) > gb_pwm_deactivate_operation(pwmc, pwm->hwpwm); > } > =20 > -static int gb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, > - int duty_ns, int period_ns) > +static int gb_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, > + const struct pwm_state *state) > { > + int err; > + bool enabled =3D pwm->state.enabled; > struct gb_pwm_chip *pwmc =3D pwm_chip_to_gb_pwm_chip(chip); > =20 > - return gb_pwm_config_operation(pwmc, pwm->hwpwm, duty_ns, period_ns); > -}; > - > -static int gb_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device = *pwm, > - enum pwm_polarity polarity) > -{ > - struct gb_pwm_chip *pwmc =3D pwm_chip_to_gb_pwm_chip(chip); > - > - return gb_pwm_set_polarity_operation(pwmc, pwm->hwpwm, polarity); > -}; > + /* set polarity */ > + if (state->polarity !=3D pwm->state.polarity) { > + if (enabled) { > + gb_pwm_disable_operation(pwmc, pwm->hwpwm); > + enabled =3D false; > + } > + err =3D gb_pwm_set_polarity_operation(pwmc, pwm->hwpwm, state->polarit= y); > + if (err) > + return err; > + } This is copied from the legacy pwm handling in the pwm core. This is good in principle. But if your hardware can change polarity without stopping operation, that would be the thing to do. (The pwm core cannot assume this, so it doesn't.) Best regards Uwe --=20 Pengutronix e.K. | Uwe Kleine-K=F6nig | Industrial Linux Solutions | https://www.pengutronix.de/ | --dsrm2xhl5lm6tau4 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEyBAABCgAdFiEEfnIqFpAYrP8+dKQLwfwUeK3K7AkFAmIV1dUACgkQwfwUeK3K 7AmSMgf0CVv4DE5aj42+pZS4w4G05NH6RjZczg1p6ylppMiQE86Jn/0wiksckSU2 kOqzbT4MxRlWzsqKKX22/1xf3IG6gCVjbvZOSdq7YBn/XtF10jp8xSJlQd7qajsT vLybnzV9Ea23rLoTO/KKcQHpR5u02qvlbHz9M6SffUmBWWmgSFjNhRwyfl3XIKoz c7Vl8qvoRpSL81H2e+QK32plCIkStyt7gQgk4jluZ3JS6Hu5FIHoP+h/zDaNT0IO z9Ufd3lI0OmX11svFiBd3PhYG3PjgZ19UP2cXGqKpGPuJJyst8NHLCCVPqAEl0ew TP6kkgDorY46gJfeC80tNzjERoDw =dWMw -----END PGP SIGNATURE----- --dsrm2xhl5lm6tau4--