Hello Alex,

On Wed, Oct 02, 2024 at 10:33:13PM -0400, Alex Lanzano wrote:
> On Wed, Oct 02, 2024 at 09:56:38AM GMT, Uwe Kleine-König wrote:
> > On Tue, Oct 01, 2024 at 11:37:35PM -0400, Alex Lanzano wrote:
> > > Changes in v8:
> > > - Addressed review comments from Uwe
> > >     - Replace pwm_get_state with pwm_init_state
> > >     - Use pwm_set_relative_duty_cycle instead of manually setting period 
> > > and duty cycle
> > 
> > You didn't explicitly mention that it's fine if the PWM doesn't emit the
> > inactive state when you call pwm_disable(). You're code should continue
> > to work if you drop all calls to pwm_disable().
> > 
> > Ideally you mention that in a code comment to make others reading your
> > code understand that.
> 
> Sorry about that! The intent of the code is to stop the pwm from outputing
> when the display is disabled since the signal is no longer needed. If
> it's best to emit the inactive state rather than calling pwm_disable()
> I'm fine with making that change.

Calling pwm_disable() is best iff you don't care about the output any
more. If however you rely on it to emit the inactive level,
pwm_disable() is wrong. I don't know enough about your display to judge
from here.

The code to disable the display looks (simplified) as follows:

        if (smd->enable_gpio)
                gpiod_set_value(smd->enable_gpio, 0);

        pwm_disable(smd->pwm_vcom_signal);

so maybe the logic you need is:

        if (smd->enable_gpio) {
                gpiod_set_value(smd->enable_gpio, 0);

                /*
                 * In the presence of a GPIO to disable the display the
                 * behaviour of the PWM doesn't matter and we can
                 * just disable it.
                 */
                pwm_disable(smd->pwm_vcom_signal);
        } else {
                struct pwm_state state;

                /*
                 * However without a GPIO driving the display's output
                 * enable pin the PWM must emit the inactive level,
                 * which isn't guaranteed when calling pwm_disable(), so
                 * configure it for duty_cycle = 0.
                 */
                 pwm_init_state(smd->pwm_vcom_signal, &state);
                 state.duty_cycle = 0;
                 state.enabled = true;
                 pwm_apply_might_sleep(smd->pwm_vcom_signal, &state);
        }

?

Best regards
Uwe

Attachment: signature.asc
Description: PGP signature

Reply via email to