Lines Matching +full:off +full:- +full:chip

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for PCA9685 16-channel 12-bit PWM LED controller
8 * based on the pwm-twl-led.c driver
26 * Because the PCA9685 has only one prescaler per chip, changing the period of
28 * However, the ratio between each configured duty cycle and the chip-wide
29 * period remains constant, because the OFF time is set in proportion to the
75 struct pwm_chip chip; member
85 static inline struct pca9685 *to_pca(struct pwm_chip *chip) in to_pca() argument
87 return container_of(chip, struct pca9685, chip); in to_pca()
95 mutex_lock(&pca->lock); in pca9685_pwm_test_and_set_inuse()
101 if (!bitmap_empty(pca->pwms_inuse, PCA9685_MAXCHAN)) { in pca9685_pwm_test_and_set_inuse()
110 if (test_bit(PCA9685_MAXCHAN, pca->pwms_inuse)) { in pca9685_pwm_test_and_set_inuse()
115 is_inuse = test_and_set_bit(pwm_idx, pca->pwms_inuse); in pca9685_pwm_test_and_set_inuse()
117 mutex_unlock(&pca->lock); in pca9685_pwm_test_and_set_inuse()
123 mutex_lock(&pca->lock); in pca9685_pwm_clear_inuse()
124 clear_bit(pwm_idx, pca->pwms_inuse); in pca9685_pwm_clear_inuse()
125 mutex_unlock(&pca->lock); in pca9685_pwm_clear_inuse()
133 return -EBUSY; in pca9685_pwm_gpio_request()
134 pm_runtime_get_sync(pca->chip.dev); in pca9685_pwm_gpio_request()
141 struct pwm_device *pwm = &pca->chip.pwms[offset]; in pca9685_pwm_gpio_get()
144 regmap_read(pca->regmap, LED_N_ON_H(pwm->hwpwm), &value); in pca9685_pwm_gpio_get()
153 struct pwm_device *pwm = &pca->chip.pwms[offset]; in pca9685_pwm_gpio_set()
156 /* Clear both OFF registers */ in pca9685_pwm_gpio_set()
157 regmap_write(pca->regmap, LED_N_OFF_L(pwm->hwpwm), 0); in pca9685_pwm_gpio_set()
158 regmap_write(pca->regmap, LED_N_OFF_H(pwm->hwpwm), 0); in pca9685_pwm_gpio_set()
161 regmap_write(pca->regmap, LED_N_ON_H(pwm->hwpwm), on); in pca9685_pwm_gpio_set()
169 pm_runtime_put(pca->chip.dev); in pca9685_pwm_gpio_free()
173 static int pca9685_pwm_gpio_get_direction(struct gpio_chip *chip, in pca9685_pwm_gpio_get_direction() argument
183 return -EINVAL; in pca9685_pwm_gpio_direction_input()
195 * The PCA9685 has a bit for turning the PWM output full off or on. Some
197 * expose a GPIO chip here which can exclusively take over the underlying
202 struct device *dev = pca->chip.dev; in pca9685_pwm_gpio_probe()
204 mutex_init(&pca->lock); in pca9685_pwm_gpio_probe()
206 pca->gpio.label = dev_name(dev); in pca9685_pwm_gpio_probe()
207 pca->gpio.parent = dev; in pca9685_pwm_gpio_probe()
208 pca->gpio.request = pca9685_pwm_gpio_request; in pca9685_pwm_gpio_probe()
209 pca->gpio.free = pca9685_pwm_gpio_free; in pca9685_pwm_gpio_probe()
210 pca->gpio.get_direction = pca9685_pwm_gpio_get_direction; in pca9685_pwm_gpio_probe()
211 pca->gpio.direction_input = pca9685_pwm_gpio_direction_input; in pca9685_pwm_gpio_probe()
212 pca->gpio.direction_output = pca9685_pwm_gpio_direction_output; in pca9685_pwm_gpio_probe()
213 pca->gpio.get = pca9685_pwm_gpio_get; in pca9685_pwm_gpio_probe()
214 pca->gpio.set = pca9685_pwm_gpio_set; in pca9685_pwm_gpio_probe()
215 pca->gpio.base = -1; in pca9685_pwm_gpio_probe()
216 pca->gpio.ngpio = PCA9685_MAXCHAN; in pca9685_pwm_gpio_probe()
217 pca->gpio.can_sleep = true; in pca9685_pwm_gpio_probe()
219 return devm_gpiochip_add_data(dev, &pca->gpio, pca); in pca9685_pwm_gpio_probe()
241 regmap_update_bits(pca->regmap, PCA9685_MODE1, in pca9685_set_sleep_mode()
249 static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in pca9685_pwm_config() argument
252 struct pca9685 *pca = to_pca(chip); in pca9685_pwm_config()
257 if (period_ns != pca->period_ns) { in pca9685_pwm_config()
259 PCA9685_COUNTER_RANGE * 1000) - 1; in pca9685_pwm_config()
264 * Putting the chip briefly into SLEEP mode in pca9685_pwm_config()
269 /* Put chip into sleep mode */ in pca9685_pwm_config()
272 /* Change the chip-wide output frequency */ in pca9685_pwm_config()
273 regmap_write(pca->regmap, PCA9685_PRESCALE, prescale); in pca9685_pwm_config()
275 /* Wake the chip up */ in pca9685_pwm_config()
278 pca->period_ns = period_ns; in pca9685_pwm_config()
280 dev_err(chip->dev, in pca9685_pwm_config()
282 return -EINVAL; in pca9685_pwm_config()
287 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_config()
290 reg = LED_N_OFF_H(pwm->hwpwm); in pca9685_pwm_config()
292 regmap_write(pca->regmap, reg, LED_FULL); in pca9685_pwm_config()
298 /* Clear both OFF registers */ in pca9685_pwm_config()
299 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_config()
302 reg = LED_N_OFF_L(pwm->hwpwm); in pca9685_pwm_config()
304 regmap_write(pca->regmap, reg, 0x0); in pca9685_pwm_config()
306 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_config()
309 reg = LED_N_OFF_H(pwm->hwpwm); in pca9685_pwm_config()
311 regmap_write(pca->regmap, reg, 0x0); in pca9685_pwm_config()
314 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_config()
317 reg = LED_N_ON_H(pwm->hwpwm); in pca9685_pwm_config()
319 regmap_write(pca->regmap, reg, LED_FULL); in pca9685_pwm_config()
327 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_config()
330 reg = LED_N_OFF_L(pwm->hwpwm); in pca9685_pwm_config()
332 regmap_write(pca->regmap, reg, (int)duty & 0xff); in pca9685_pwm_config()
334 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_config()
337 reg = LED_N_OFF_H(pwm->hwpwm); in pca9685_pwm_config()
339 regmap_write(pca->regmap, reg, ((int)duty >> 8) & 0xf); in pca9685_pwm_config()
341 /* Clear the full ON bit, otherwise the set OFF time has no effect */ in pca9685_pwm_config()
342 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_config()
345 reg = LED_N_ON_H(pwm->hwpwm); in pca9685_pwm_config()
347 regmap_write(pca->regmap, reg, 0); in pca9685_pwm_config()
352 static int pca9685_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in pca9685_pwm_enable() argument
354 struct pca9685 *pca = to_pca(chip); in pca9685_pwm_enable()
358 * The PWM subsystem does not support a pre-delay. in pca9685_pwm_enable()
359 * So, set the ON-timeout to 0 in pca9685_pwm_enable()
361 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_enable()
364 reg = LED_N_ON_L(pwm->hwpwm); in pca9685_pwm_enable()
366 regmap_write(pca->regmap, reg, 0); in pca9685_pwm_enable()
368 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_enable()
371 reg = LED_N_ON_H(pwm->hwpwm); in pca9685_pwm_enable()
373 regmap_write(pca->regmap, reg, 0); in pca9685_pwm_enable()
376 * Clear the full-off bit. in pca9685_pwm_enable()
377 * It has precedence over the others and must be off. in pca9685_pwm_enable()
379 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_enable()
382 reg = LED_N_OFF_H(pwm->hwpwm); in pca9685_pwm_enable()
384 regmap_update_bits(pca->regmap, reg, LED_FULL, 0x0); in pca9685_pwm_enable()
389 static void pca9685_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) in pca9685_pwm_disable() argument
391 struct pca9685 *pca = to_pca(chip); in pca9685_pwm_disable()
394 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_disable()
397 reg = LED_N_OFF_H(pwm->hwpwm); in pca9685_pwm_disable()
399 regmap_write(pca->regmap, reg, LED_FULL); in pca9685_pwm_disable()
402 if (pwm->hwpwm >= PCA9685_MAXCHAN) in pca9685_pwm_disable()
405 reg = LED_N_OFF_L(pwm->hwpwm); in pca9685_pwm_disable()
407 regmap_write(pca->regmap, reg, 0x0); in pca9685_pwm_disable()
410 static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) in pca9685_pwm_request() argument
412 struct pca9685 *pca = to_pca(chip); in pca9685_pwm_request()
414 if (pca9685_pwm_test_and_set_inuse(pca, pwm->hwpwm)) in pca9685_pwm_request()
415 return -EBUSY; in pca9685_pwm_request()
416 pm_runtime_get_sync(chip->dev); in pca9685_pwm_request()
421 static void pca9685_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) in pca9685_pwm_free() argument
423 struct pca9685 *pca = to_pca(chip); in pca9685_pwm_free()
425 pca9685_pwm_disable(chip, pwm); in pca9685_pwm_free()
426 pm_runtime_put(chip->dev); in pca9685_pwm_free()
427 pca9685_pwm_clear_inuse(pca, pwm->hwpwm); in pca9685_pwm_free()
453 pca = devm_kzalloc(&client->dev, sizeof(*pca), GFP_KERNEL); in pca9685_pwm_probe()
455 return -ENOMEM; in pca9685_pwm_probe()
457 pca->regmap = devm_regmap_init_i2c(client, &pca9685_regmap_i2c_config); in pca9685_pwm_probe()
458 if (IS_ERR(pca->regmap)) { in pca9685_pwm_probe()
459 ret = PTR_ERR(pca->regmap); in pca9685_pwm_probe()
460 dev_err(&client->dev, "Failed to initialize register map: %d\n", in pca9685_pwm_probe()
464 pca->period_ns = PCA9685_DEFAULT_PERIOD; in pca9685_pwm_probe()
468 regmap_read(pca->regmap, PCA9685_MODE2, &reg); in pca9685_pwm_probe()
470 if (device_property_read_bool(&client->dev, "invert")) in pca9685_pwm_probe()
475 if (device_property_read_bool(&client->dev, "open-drain")) in pca9685_pwm_probe()
480 regmap_write(pca->regmap, PCA9685_MODE2, reg); in pca9685_pwm_probe()
483 regmap_read(pca->regmap, PCA9685_MODE1, &reg); in pca9685_pwm_probe()
485 regmap_write(pca->regmap, PCA9685_MODE1, reg); in pca9685_pwm_probe()
487 /* Clear all "full off" bits */ in pca9685_pwm_probe()
488 regmap_write(pca->regmap, PCA9685_ALL_LED_OFF_L, 0); in pca9685_pwm_probe()
489 regmap_write(pca->regmap, PCA9685_ALL_LED_OFF_H, 0); in pca9685_pwm_probe()
491 pca->chip.ops = &pca9685_pwm_ops; in pca9685_pwm_probe()
493 pca->chip.npwm = PCA9685_MAXCHAN + 1; in pca9685_pwm_probe()
495 pca->chip.dev = &client->dev; in pca9685_pwm_probe()
496 pca->chip.base = -1; in pca9685_pwm_probe()
498 ret = pwmchip_add(&pca->chip); in pca9685_pwm_probe()
504 pwmchip_remove(&pca->chip); in pca9685_pwm_probe()
508 /* The chip comes out of power-up in the active state */ in pca9685_pwm_probe()
509 pm_runtime_set_active(&client->dev); in pca9685_pwm_probe()
511 * Enable will put the chip into suspend, which is what we in pca9685_pwm_probe()
514 pm_runtime_enable(&client->dev); in pca9685_pwm_probe()
524 ret = pwmchip_remove(&pca->chip); in pca9685_pwm_remove()
527 pm_runtime_disable(&client->dev); in pca9685_pwm_remove()
565 { .compatible = "nxp,pca9685-pwm", },
578 .name = "pca9685-pwm",