On Tue, Apr 06, 2021 at 06:41:40PM +0200, Clemens Gruber wrote: > Regmap operations can fail if the underlying subsystem is not working > properly (e.g. hogged I2C bus, etc.) > As this is useful information for the user, print an error message if it > happens. > Let probe fail if the first regmap_read or the first regmap_write fails. > > Signed-off-by: Clemens Gruber <clemens.gruber@xxxxxxxxxxxx> > --- > Changes since v6: > - Rebased > > drivers/pwm/pwm-pca9685.c | 83 ++++++++++++++++++++++++++++----------- > 1 file changed, 59 insertions(+), 24 deletions(-) > > diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c > index cf0c98e4ef44..8a4993882b40 100644 > --- a/drivers/pwm/pwm-pca9685.c > +++ b/drivers/pwm/pwm-pca9685.c > @@ -107,6 +107,30 @@ static bool pca9685_prescaler_can_change(struct pca9685 *pca, int channel) > return test_bit(channel, pca->pwms_enabled); > } > > +static int pca9685_read_reg(struct pca9685 *pca, unsigned int reg, unsigned int *val) > +{ > + struct device *dev = pca->chip.dev; > + int err; > + > + err = regmap_read(pca->regmap, reg, val); > + if (err != 0) > + dev_err(dev, "regmap_read of register 0x%x failed: %d\n", reg, err); Please use %pe to emit the error code instead of %d. > + > + return err; > +} > + > +static int pca9685_write_reg(struct pca9685 *pca, unsigned int reg, unsigned int val) > +{ > + struct device *dev = pca->chip.dev; > + int err; > + > + err = regmap_write(pca->regmap, reg, val); > + if (err != 0) > + dev_err(dev, "regmap_write to register 0x%x failed: %d\n", reg, err); > + > + return err; > +} > + > /* Helper function to set the duty cycle ratio to duty/4096 (e.g. duty=2048 -> 50%) */ > static void pca9685_pwm_set_duty(struct pca9685 *pca, int channel, unsigned int duty) > { > @@ -115,12 +139,12 @@ static void pca9685_pwm_set_duty(struct pca9685 *pca, int channel, unsigned int > > if (duty == 0) { > /* Set the full OFF bit, which has the highest precedence */ > - regmap_write(pca->regmap, REG_OFF_H(channel), LED_FULL); > + pca9685_write_reg(pca, REG_OFF_H(channel), LED_FULL); You didn't check all return codes? How did you select the calls to check? Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |
Attachment:
signature.asc
Description: PGP signature