Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pwm: pca9685: Add error messages for failed regmap calls

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@pqgruber.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>

authored by

Clemens Gruber and committed by
Thierry Reding
79dd354f 6d6e7050

+59 -24
+59 -24
drivers/pwm/pwm-pca9685.c
··· 107 107 return test_bit(channel, pca->pwms_enabled); 108 108 } 109 109 110 + static int pca9685_read_reg(struct pca9685 *pca, unsigned int reg, unsigned int *val) 111 + { 112 + struct device *dev = pca->chip.dev; 113 + int err; 114 + 115 + err = regmap_read(pca->regmap, reg, val); 116 + if (err) 117 + dev_err(dev, "regmap_read of register 0x%x failed: %pe\n", reg, ERR_PTR(err)); 118 + 119 + return err; 120 + } 121 + 122 + static int pca9685_write_reg(struct pca9685 *pca, unsigned int reg, unsigned int val) 123 + { 124 + struct device *dev = pca->chip.dev; 125 + int err; 126 + 127 + err = regmap_write(pca->regmap, reg, val); 128 + if (err) 129 + dev_err(dev, "regmap_write to register 0x%x failed: %pe\n", reg, ERR_PTR(err)); 130 + 131 + return err; 132 + } 133 + 110 134 /* Helper function to set the duty cycle ratio to duty/4096 (e.g. duty=2048 -> 50%) */ 111 135 static void pca9685_pwm_set_duty(struct pca9685 *pca, int channel, unsigned int duty) 112 136 { ··· 139 115 140 116 if (duty == 0) { 141 117 /* Set the full OFF bit, which has the highest precedence */ 142 - regmap_write(pca->regmap, REG_OFF_H(channel), LED_FULL); 118 + pca9685_write_reg(pca, REG_OFF_H(channel), LED_FULL); 143 119 return; 144 120 } else if (duty >= PCA9685_COUNTER_RANGE) { 145 121 /* Set the full ON bit and clear the full OFF bit */ 146 - regmap_write(pca->regmap, REG_ON_H(channel), LED_FULL); 147 - regmap_write(pca->regmap, REG_OFF_H(channel), 0); 122 + pca9685_write_reg(pca, REG_ON_H(channel), LED_FULL); 123 + pca9685_write_reg(pca, REG_OFF_H(channel), 0); 148 124 return; 149 125 } 150 126 ··· 164 140 off = (on + duty) % PCA9685_COUNTER_RANGE; 165 141 166 142 /* Set ON time (clears full ON bit) */ 167 - regmap_write(pca->regmap, REG_ON_L(channel), on & 0xff); 168 - regmap_write(pca->regmap, REG_ON_H(channel), (on >> 8) & 0xf); 143 + pca9685_write_reg(pca, REG_ON_L(channel), on & 0xff); 144 + pca9685_write_reg(pca, REG_ON_H(channel), (on >> 8) & 0xf); 169 145 /* Set OFF time (clears full OFF bit) */ 170 - regmap_write(pca->regmap, REG_OFF_L(channel), off & 0xff); 171 - regmap_write(pca->regmap, REG_OFF_H(channel), (off >> 8) & 0xf); 146 + pca9685_write_reg(pca, REG_OFF_L(channel), off & 0xff); 147 + pca9685_write_reg(pca, REG_OFF_H(channel), (off >> 8) & 0xf); 172 148 } 173 149 174 150 static unsigned int pca9685_pwm_get_duty(struct pca9685 *pca, int channel) ··· 181 157 return 0; 182 158 } 183 159 184 - regmap_read(pca->regmap, LED_N_OFF_H(channel), &off); 160 + pca9685_read_reg(pca, LED_N_OFF_H(channel), &off); 185 161 if (off & LED_FULL) { 186 162 /* Full OFF bit is set */ 187 163 return 0; 188 164 } 189 165 190 - regmap_read(pca->regmap, LED_N_ON_H(channel), &on); 166 + pca9685_read_reg(pca, LED_N_ON_H(channel), &on); 191 167 if (on & LED_FULL) { 192 168 /* Full ON bit is set */ 193 169 return PCA9685_COUNTER_RANGE; 194 170 } 195 171 196 - regmap_read(pca->regmap, LED_N_OFF_L(channel), &val); 172 + pca9685_read_reg(pca, LED_N_OFF_L(channel), &val); 197 173 off = ((off & 0xf) << 8) | (val & 0xff); 198 174 if (!pwm->state.usage_power) 199 175 return off; 200 176 201 177 /* Read ON register to calculate duty cycle of staggered output */ 202 - if (regmap_read(pca->regmap, LED_N_ON_L(channel), &val)) { 178 + if (pca9685_read_reg(pca, LED_N_ON_L(channel), &val)) { 203 179 /* Reset val to 0 in case reading LED_N_ON_L failed */ 204 180 val = 0; 205 181 } ··· 345 321 346 322 static void pca9685_set_sleep_mode(struct pca9685 *pca, bool enable) 347 323 { 348 - regmap_update_bits(pca->regmap, PCA9685_MODE1, 349 - MODE1_SLEEP, enable ? MODE1_SLEEP : 0); 324 + struct device *dev = pca->chip.dev; 325 + int err = regmap_update_bits(pca->regmap, PCA9685_MODE1, 326 + MODE1_SLEEP, enable ? MODE1_SLEEP : 0); 327 + if (err) { 328 + dev_err(dev, "regmap_update_bits of register 0x%x failed: %pe\n", 329 + PCA9685_MODE1, ERR_PTR(err)); 330 + return; 331 + } 332 + 350 333 if (!enable) { 351 334 /* Wait 500us for the oscillator to be back up */ 352 335 udelay(500); ··· 382 351 return 0; 383 352 } 384 353 385 - regmap_read(pca->regmap, PCA9685_PRESCALE, &val); 354 + pca9685_read_reg(pca, PCA9685_PRESCALE, &val); 386 355 if (prescale != val) { 387 356 if (!pca9685_prescaler_can_change(pca, pwm->hwpwm)) { 388 357 dev_err(chip->dev, ··· 400 369 pca9685_set_sleep_mode(pca, true); 401 370 402 371 /* Change the chip-wide output frequency */ 403 - regmap_write(pca->regmap, PCA9685_PRESCALE, prescale); 372 + pca9685_write_reg(pca, PCA9685_PRESCALE, prescale); 404 373 405 374 /* Wake the chip up */ 406 375 pca9685_set_sleep_mode(pca, false); ··· 439 408 unsigned int val = 0; 440 409 441 410 /* Calculate (chip-wide) period from prescale value */ 442 - regmap_read(pca->regmap, PCA9685_PRESCALE, &val); 411 + pca9685_read_reg(pca, PCA9685_PRESCALE, &val); 443 412 /* 444 413 * PCA9685_OSC_CLOCK_MHZ is 25, i.e. an integer divider of 1000. 445 414 * The following calculation is therefore only a multiplication ··· 536 505 537 506 mutex_init(&pca->lock); 538 507 539 - regmap_read(pca->regmap, PCA9685_MODE2, &reg); 508 + ret = pca9685_read_reg(pca, PCA9685_MODE2, &reg); 509 + if (ret) 510 + return ret; 540 511 541 512 if (device_property_read_bool(&client->dev, "invert")) 542 513 reg |= MODE2_INVRT; ··· 550 517 else 551 518 reg |= MODE2_OUTDRV; 552 519 553 - regmap_write(pca->regmap, PCA9685_MODE2, reg); 520 + ret = pca9685_write_reg(pca, PCA9685_MODE2, reg); 521 + if (ret) 522 + return ret; 554 523 555 524 /* Disable all LED ALLCALL and SUBx addresses to avoid bus collisions */ 556 - regmap_read(pca->regmap, PCA9685_MODE1, &reg); 525 + pca9685_read_reg(pca, PCA9685_MODE1, &reg); 557 526 reg &= ~(MODE1_ALLCALL | MODE1_SUB1 | MODE1_SUB2 | MODE1_SUB3); 558 - regmap_write(pca->regmap, PCA9685_MODE1, reg); 527 + pca9685_write_reg(pca, PCA9685_MODE1, reg); 559 528 560 529 /* Reset OFF/ON registers to POR default */ 561 - regmap_write(pca->regmap, PCA9685_ALL_LED_OFF_L, LED_FULL); 562 - regmap_write(pca->regmap, PCA9685_ALL_LED_OFF_H, LED_FULL); 563 - regmap_write(pca->regmap, PCA9685_ALL_LED_ON_L, 0); 564 - regmap_write(pca->regmap, PCA9685_ALL_LED_ON_H, 0); 530 + pca9685_write_reg(pca, PCA9685_ALL_LED_OFF_L, LED_FULL); 531 + pca9685_write_reg(pca, PCA9685_ALL_LED_OFF_H, LED_FULL); 532 + pca9685_write_reg(pca, PCA9685_ALL_LED_ON_L, 0); 533 + pca9685_write_reg(pca, PCA9685_ALL_LED_ON_H, 0); 565 534 566 535 pca->chip.ops = &pca9685_pwm_ops; 567 536 /* Add an extra channel for ALL_LED */