Re: [PATCH 1/2] drivers: pwm: core: implement pwm mode
Hello Thierry, I know you may be very busy but do you have any resolution regarding this series and the one with title "[PATCH v2 0/2] extends PWM framework to support PWM dead-times" Thank you, Claudiu On 09.05.2017 15:15, Claudiu Beznea - M18063 wrote: > Extends PWM framework to support PWM modes. The currently > implemented PWM modes were called PWM complementary mode > and PWM push-pull mode. For devices that have more than one > output per PWM channel: > - PWM complementary mode is standard working mode; in PWM > complementary mode the rising and falling edges of the > channels outputs have opposite levels, same duration and > same starting time. > - in PWM push-pull mode the channles outputs has same levels, > same duration and the rising edges are delayed until the > beginning of the next period. > A new member was added in pwm_state structure in order to > keep the new PWM argument. > For PWM channels with inputs in DT, the mode could also be > passed via DT. No new extra field need to be added in device > tree; since the signal polarity is passed as a flag via DT, > the field used to pass information for PWM channel polarity > via DT is also used by PWM mode. Since, for the moment, only > the complementary and push-pull modes are implemented, only > one bit in flags used to pass polarity could also be used for > PWM mode. The other drivers are not affected by this change. > > Signed-off-by: Claudiu Beznea> --- > Documentation/pwm.txt | 24 +--- > drivers/pwm/core.c| 13 +-- > drivers/pwm/sysfs.c | 52 > +++ > include/dt-bindings/pwm/pwm.h | 1 + > include/linux/pwm.h | 37 -- > 5 files changed, 120 insertions(+), 7 deletions(-) > > diff --git a/Documentation/pwm.txt b/Documentation/pwm.txt > index 789b27c..1b6fc59 100644 > --- a/Documentation/pwm.txt > +++ b/Documentation/pwm.txt > @@ -59,9 +59,9 @@ In addition to the PWM state, the PWM API also exposes PWM > arguments, which > are the reference PWM config one should use on this PWM. > PWM arguments are usually platform-specific and allows the PWM user to only > care about dutycycle relatively to the full period (like, duty = 50% of the > -period). struct pwm_args contains 2 fields (period and polarity) and should > -be used to set the initial PWM config (usually done in the probe function > -of the PWM user). PWM arguments are retrieved with pwm_get_args(). > +period). struct pwm_args contains 3 fields (period, polarity and mode) and > +should be used to set the initial PWM config (usually done in the probe > +function of the PWM user). PWM arguments are retrieved with pwm_get_args(). > > Using PWMs with the sysfs interface > --- > @@ -100,6 +100,24 @@ enable - Enable/disable the PWM signal (read/write). > 0 - disabled > 1 - enabled > > +mode - Set PWM signal type (for channels with more than one output > + per channel) > + complementary - for an output signal as follow: > + ________ > +PWMH1 __| |__| |__| |__| |__ > + __________ > +PWML1 |__| |__| |__| |__| > +<--T--> > + Where T is the signal period. > + > + push-pull - for an output signal as follows: > + __ __ > +PWMH1 __| || | > + __ __ > +PWML1 | || |__ > +<--T--> > + Where T is the signal period. > + > Implementing a PWM driver > - > > diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c > index a0860b3..4efc92d 100644 > --- a/drivers/pwm/core.c > +++ b/drivers/pwm/core.c > @@ -154,9 +154,14 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const > struct of_phandle_args *args) > > pwm->args.period = args->args[1]; > pwm->args.polarity = PWM_POLARITY_NORMAL; > + pwm->args.mode = PWM_MODE_COMPLEMENTARY; > > - if (args->args_count > 2 && args->args[2] & PWM_POLARITY_INVERTED) > - pwm->args.polarity = PWM_POLARITY_INVERSED; > + if (args->args_count > 2) { > + if (args->args[2] & PWM_POLARITY_INVERTED) > + pwm->args.polarity = PWM_POLARITY_INVERSED; > + if (args->args[2] & PWM_MODE_PUSHPULL) > + pwm->args.mode = PWM_MODE_PUSH_PULL; > + } > > return pwm; > } > @@ -579,6 +584,8 @@ int pwm_adjust_config(struct pwm_device *pwm) > pwm_get_args(pwm, ); > pwm_get_state(pwm, ); > > + state.mode = pargs.mode; > + > /* >* If the current period is zero it means that either the PWM driver >* does not support initial state retrieval or the PWM has not yet > @@ -997,6
Re: [PATCH 1/2] drivers: pwm: core: implement pwm mode
Hi Andy, On 28.05.2017 01:11, Andy Shevchenko wrote: > On Tue, May 9, 2017 at 3:15 PM, Claudiu Beznea >wrote: >> Extends PWM framework to support PWM modes. The currently >> implemented PWM modes were called PWM complementary mode >> and PWM push-pull mode. For devices that have more than one >> output per PWM channel: >> - PWM complementary mode is standard working mode; in PWM >> complementary mode the rising and falling edges of the >> channels outputs have opposite levels, same duration and >> same starting time. >> - in PWM push-pull mode the channles outputs has same levels, >> same duration and the rising edges are delayed until the >> beginning of the next period. >> A new member was added in pwm_state structure in order to >> keep the new PWM argument. > > To me it sound over-engineered. > > It looks like polarity type Could you, please, give me more details on this? I don't understand your point. The PWM controller I worked with has more than one physical output per PWM channel (e.g. a linux PWM channel has 2 output pins, as you said below, one with polarity P, the other one with polarity !P). Different controllers could be configured to generate different kind of signals. PWM push-pull signal type is one of these and is a common characteristic. This kind of signal could be used, e.g., in half-bridge converter applications where you need delays between positive fronts of PWM signals which drives the transistors. It is a common characteristic of PWM controllers which is the reason I tried to implement it. The push-pull signal type looks like this in case of a controller with 2 outputs per PWM channel: __ __ channel Xa __| || | __ __ channel Xb | || |__ <--T--> > > I dunno if PWM supports linked / virtual channels, but it would be like that > > channel X (polarity P) effectively is > > channel Xa (polarity P) / channel Xb (polarity !P)> > and vise versa. The controller I worked for, the Atmel one, support 4 linux channels, but every channel has 2 physical outputs, 2 pins which outputs, by default, a signal with polarity P and a signal with polarity !P, exactly how you said. I called this in my patch the "complementary" mode. Signals looks like this: ________ channel Xa __| |__| |__| |__| |__ __________ channel Xb |__| |__| |__| |__| <--T--> > > Moreover, mode in your case doesn't fit to GPIO style of output which > would be emulated or native mode for PWM For the PWM controller I worked for, one linux PWM channel outputs on 2 physical pins. Those 2 pins are requested from pin controller to be used by PWM controller. The PWM controller is the one which generate the signal form on those pins. Could you please give more details on what what are you saying above? (we have already a use case > and one driver implements that). Could you, please, give me the driver name you are talking about? On PWM drivers I found only one driver which is started in push-pull, the drivers/pwm/pwm-bcm-kona.c one. The idea with the patches I send was to have a chip which could be user configurable to let the user choose how the chip to work. Thank you, Claudiu Beznea > > GPIO type of output is, obviously, duty=100% in case of emulation, > though separate state for HW assisted kind of that. > -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2] drivers: pwm: core: implement pwm mode
On Tue, May 9, 2017 at 3:15 PM, Claudiu Bezneawrote: > Extends PWM framework to support PWM modes. The currently > implemented PWM modes were called PWM complementary mode > and PWM push-pull mode. For devices that have more than one > output per PWM channel: > - PWM complementary mode is standard working mode; in PWM > complementary mode the rising and falling edges of the > channels outputs have opposite levels, same duration and > same starting time. > - in PWM push-pull mode the channles outputs has same levels, > same duration and the rising edges are delayed until the > beginning of the next period. > A new member was added in pwm_state structure in order to > keep the new PWM argument. To me it sound over-engineered. It looks like polarity type I dunno if PWM supports linked / virtual channels, but it would be like that channel X (polarity P) effectively is channel Xa (polarity P) / channel Xb (polarity !P) and vise versa. Moreover, mode in your case doesn't fit to GPIO style of output which would be emulated or native mode for PWM (we have already a use case and one driver implements that). GPIO type of output is, obviously, duty=100% in case of emulation, though separate state for HW assisted kind of that. -- With Best Regards, Andy Shevchenko -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html