RE: [PATCH v21 3/4] pwm: Add support for RZ/G2L GPT

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

 



Hi Uwe,

> -----Original Message-----
> From: Biju Das
> Sent: Friday, October 4, 2024 2:48 PM
> Subject: RE: [PATCH v21 3/4] pwm: Add support for RZ/G2L GPT
> 
> Hi Uwe,
> 
> Thanks for the feedback.
> 
> > -----Original Message-----
> > From: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxx>
> > Sent: Friday, October 4, 2024 1:47 PM
> > Subject: Re: [PATCH v21 3/4] pwm: Add support for RZ/G2L GPT
> >
> > Hello Biju,
> >
> > On Fri, Oct 04, 2024 at 09:53:08AM +0000, Biju Das wrote:
> > > On Wed, Sep 25, Uwe Kleine-König wrote:
> > > > On Thu, Aug 08, 2024 at 02:16:19PM +0100, Biju Das wrote:
> > > > > +static int rzg2l_gpt_request(struct pwm_chip *chip, struct
> > > > > +pwm_device
> > > > > +*pwm) {
> > > > > +	struct rzg2l_gpt_chip *rzg2l_gpt = to_rzg2l_gpt_chip(chip);
> > > > > +	u32 ch = RZG2L_GET_CH(pwm->hwpwm);
> > > > > +
> > > > > +	mutex_lock(&rzg2l_gpt->lock);
> > > > > +	rzg2l_gpt->user_count[ch]++;
> > > > > +	mutex_unlock(&rzg2l_gpt->lock);
> > > >
> > > > Please consider using guard(mutex)(&rzg2l_gpt->lock);
> > >
> > > Agreed. expect rzg2l_gpt_apply() as it will cause deadlock as
> > > rzg2l_gpt_enable acquires same lock.
> >
> > Note there is scoped_guard() if you don't want to hold the lock for
> > the whole function but only for a block. Regarding rzg2l_gpt_apply()
> > calling
> > rzg2l_gpt_enable(): It might make sense to shift the semantic of
> > rzg2l_gpt_enable() to expect the caller to hold the lock already. This
> > way you won't release the lock just to allow a called function to
> > retake it. This is usually also safer, consider someone manages to grab the lock in between.
> 
> OK, will remove the lock from rzg2l_gpt_enable().
> 
> >
> > > > > +	 * clearing the flag will avoid errors during unbind.
> > > > > +	 */
> > > > > +	if (enabled && rzg2l_gpt->bootloader_enabled_channels[pwm->hwpwm])
> > > > > +		rzg2l_gpt->bootloader_enabled_channels[pwm->hwpwm] = false;
> > > >
> > > > Hmm, not 100% sure, but I think if rzg2l_gpt_config() below fails, cleaning this flag is wrong.
> > > >
> > > > Does rzg2l_gpt->bootloader_enabled_channels[pwm->hwpwm] == true
> > > > imply enabled == true? If so, the if condition can be simplified
> > > > to just the right hand side of the &&. Then even an unconditional
> > > > assignment works, because
> > > >
> > > > 	rzg2l_gpt->bootloader_enabled_channels[pwm->hwpwm] = false;
> > > >
> > > > is a nop if the flag is already false.
> > >
> > > I am planning to drop "bootloader_enabled_channels" based on your
> > > comment in probe() which simplifies the driver.
> >
> > If by saying "drop" you mean that you remove
> > bootloader_enabled_channels completely from the driver, that is the wrong conclusion.
> 
> "bootloader_enabled_channels" is added mainly for avoiding PM unbalance for bind() followed by
> Unbind(). By adding devm_clock_enabled() to make clk_get_rate() well-defined, the clock will be always
> on and there is no need for PM run time calls.
> 
> Am I miss anything here??


Just to add,

previously, 
a) For bootloader enabled channel case: Clock is ON till linux takes control in .apply().
b)For bootloader disabled case: Clock is OFF and turned on during enable().

Now, after introducing devm_clock_enabled():
a) For bootloader enabled channel case: Clock is ON and will stay ON till unbind/remove().
b) For bootloader disabled case: Clock is on during probe and will stay ON till unbind/remove().

Cheers,
Biju





[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux