1caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
288b613e6SSteffen Trumtrar /*
388b613e6SSteffen Trumtrar * Driver for PCA9685 16-channel 12-bit PWM LED controller
488b613e6SSteffen Trumtrar *
588b613e6SSteffen Trumtrar * Copyright (C) 2013 Steffen Trumtrar <s.trumtrar@pengutronix.de>
601ec8472SClemens Gruber * Copyright (C) 2015 Clemens Gruber <clemens.gruber@pqgruber.com>
788b613e6SSteffen Trumtrar *
888b613e6SSteffen Trumtrar * based on the pwm-twl-led.c driver
988b613e6SSteffen Trumtrar */
1088b613e6SSteffen Trumtrar
11912b8439SAndy Shevchenko #include <linux/acpi.h>
12bccec89fSMika Westerberg #include <linux/gpio/driver.h>
1388b613e6SSteffen Trumtrar #include <linux/i2c.h>
1488b613e6SSteffen Trumtrar #include <linux/module.h>
15bccec89fSMika Westerberg #include <linux/mutex.h>
1688b613e6SSteffen Trumtrar #include <linux/platform_device.h>
17912b8439SAndy Shevchenko #include <linux/property.h>
1888b613e6SSteffen Trumtrar #include <linux/pwm.h>
1988b613e6SSteffen Trumtrar #include <linux/regmap.h>
2088b613e6SSteffen Trumtrar #include <linux/slab.h>
2101ec8472SClemens Gruber #include <linux/delay.h>
22c40c461eSSven Van Asbroeck #include <linux/pm_runtime.h>
239cc5f232SSven Van Asbroeck #include <linux/bitmap.h>
2401ec8472SClemens Gruber
2501ec8472SClemens Gruber /*
266d6e7050SClemens Gruber * Because the PCA9685 has only one prescaler per chip, only the first channel
276d6e7050SClemens Gruber * that is enabled is allowed to change the prescale register.
286d6e7050SClemens Gruber * PWM channels requested afterwards must use a period that results in the same
296d6e7050SClemens Gruber * prescale setting as the one set by the first requested channel.
306d6e7050SClemens Gruber * GPIOs do not count as enabled PWMs as they are not using the prescaler.
3101ec8472SClemens Gruber */
3288b613e6SSteffen Trumtrar
3388b613e6SSteffen Trumtrar #define PCA9685_MODE1 0x00
3488b613e6SSteffen Trumtrar #define PCA9685_MODE2 0x01
3588b613e6SSteffen Trumtrar #define PCA9685_SUBADDR1 0x02
3688b613e6SSteffen Trumtrar #define PCA9685_SUBADDR2 0x03
3788b613e6SSteffen Trumtrar #define PCA9685_SUBADDR3 0x04
3888b613e6SSteffen Trumtrar #define PCA9685_ALLCALLADDR 0x05
3988b613e6SSteffen Trumtrar #define PCA9685_LEDX_ON_L 0x06
4088b613e6SSteffen Trumtrar #define PCA9685_LEDX_ON_H 0x07
4188b613e6SSteffen Trumtrar #define PCA9685_LEDX_OFF_L 0x08
4288b613e6SSteffen Trumtrar #define PCA9685_LEDX_OFF_H 0x09
4388b613e6SSteffen Trumtrar
4488b613e6SSteffen Trumtrar #define PCA9685_ALL_LED_ON_L 0xFA
4588b613e6SSteffen Trumtrar #define PCA9685_ALL_LED_ON_H 0xFB
4688b613e6SSteffen Trumtrar #define PCA9685_ALL_LED_OFF_L 0xFC
4788b613e6SSteffen Trumtrar #define PCA9685_ALL_LED_OFF_H 0xFD
4888b613e6SSteffen Trumtrar #define PCA9685_PRESCALE 0xFE
4988b613e6SSteffen Trumtrar
5001ec8472SClemens Gruber #define PCA9685_PRESCALE_MIN 0x03 /* => max. frequency of 1526 Hz */
5101ec8472SClemens Gruber #define PCA9685_PRESCALE_MAX 0xFF /* => min. frequency of 24 Hz */
5201ec8472SClemens Gruber
5301ec8472SClemens Gruber #define PCA9685_COUNTER_RANGE 4096
5401ec8472SClemens Gruber #define PCA9685_OSC_CLOCK_MHZ 25 /* Internal oscillator with 25 MHz */
5501ec8472SClemens Gruber
5688b613e6SSteffen Trumtrar #define PCA9685_NUMREGS 0xFF
5788b613e6SSteffen Trumtrar #define PCA9685_MAXCHAN 0x10
5888b613e6SSteffen Trumtrar
59e1057a8dSDavid Jander #define LED_FULL BIT(4)
60bce54366SDavid Jander #define MODE1_ALLCALL BIT(0)
61bce54366SDavid Jander #define MODE1_SUB3 BIT(1)
62bce54366SDavid Jander #define MODE1_SUB2 BIT(2)
63bce54366SDavid Jander #define MODE1_SUB1 BIT(3)
64e1057a8dSDavid Jander #define MODE1_SLEEP BIT(4)
65e1057a8dSDavid Jander #define MODE2_INVRT BIT(4)
66e1057a8dSDavid Jander #define MODE2_OUTDRV BIT(2)
6788b613e6SSteffen Trumtrar
6888b613e6SSteffen Trumtrar #define LED_N_ON_H(N) (PCA9685_LEDX_ON_H + (4 * (N)))
6988b613e6SSteffen Trumtrar #define LED_N_ON_L(N) (PCA9685_LEDX_ON_L + (4 * (N)))
7088b613e6SSteffen Trumtrar #define LED_N_OFF_H(N) (PCA9685_LEDX_OFF_H + (4 * (N)))
7188b613e6SSteffen Trumtrar #define LED_N_OFF_L(N) (PCA9685_LEDX_OFF_L + (4 * (N)))
7288b613e6SSteffen Trumtrar
739af1fba3SClemens Gruber #define REG_ON_H(C) ((C) >= PCA9685_MAXCHAN ? PCA9685_ALL_LED_ON_H : LED_N_ON_H((C)))
749af1fba3SClemens Gruber #define REG_ON_L(C) ((C) >= PCA9685_MAXCHAN ? PCA9685_ALL_LED_ON_L : LED_N_ON_L((C)))
759af1fba3SClemens Gruber #define REG_OFF_H(C) ((C) >= PCA9685_MAXCHAN ? PCA9685_ALL_LED_OFF_H : LED_N_OFF_H((C)))
769af1fba3SClemens Gruber #define REG_OFF_L(C) ((C) >= PCA9685_MAXCHAN ? PCA9685_ALL_LED_OFF_L : LED_N_OFF_L((C)))
779af1fba3SClemens Gruber
7888b613e6SSteffen Trumtrar struct pca9685 {
7988b613e6SSteffen Trumtrar struct pwm_chip chip;
8088b613e6SSteffen Trumtrar struct regmap *regmap;
81bccec89fSMika Westerberg struct mutex lock;
826d6e7050SClemens Gruber DECLARE_BITMAP(pwms_enabled, PCA9685_MAXCHAN + 1);
836d6e7050SClemens Gruber #if IS_ENABLED(CONFIG_GPIOLIB)
84bccec89fSMika Westerberg struct gpio_chip gpio;
859cc5f232SSven Van Asbroeck DECLARE_BITMAP(pwms_inuse, PCA9685_MAXCHAN + 1);
86bccec89fSMika Westerberg #endif
8788b613e6SSteffen Trumtrar };
8888b613e6SSteffen Trumtrar
to_pca(struct pwm_chip * chip)8988b613e6SSteffen Trumtrar static inline struct pca9685 *to_pca(struct pwm_chip *chip)
9088b613e6SSteffen Trumtrar {
9188b613e6SSteffen Trumtrar return container_of(chip, struct pca9685, chip);
9288b613e6SSteffen Trumtrar }
9388b613e6SSteffen Trumtrar
946d6e7050SClemens Gruber /* This function is supposed to be called with the lock mutex held */
pca9685_prescaler_can_change(struct pca9685 * pca,int channel)956d6e7050SClemens Gruber static bool pca9685_prescaler_can_change(struct pca9685 *pca, int channel)
966d6e7050SClemens Gruber {
976d6e7050SClemens Gruber /* No PWM enabled: Change allowed */
986d6e7050SClemens Gruber if (bitmap_empty(pca->pwms_enabled, PCA9685_MAXCHAN + 1))
996d6e7050SClemens Gruber return true;
1006d6e7050SClemens Gruber /* More than one PWM enabled: Change not allowed */
1016d6e7050SClemens Gruber if (bitmap_weight(pca->pwms_enabled, PCA9685_MAXCHAN + 1) > 1)
1026d6e7050SClemens Gruber return false;
1036d6e7050SClemens Gruber /*
1046d6e7050SClemens Gruber * Only one PWM enabled: Change allowed if the PWM about to
1056d6e7050SClemens Gruber * be changed is the one that is already enabled
1066d6e7050SClemens Gruber */
1076d6e7050SClemens Gruber return test_bit(channel, pca->pwms_enabled);
1086d6e7050SClemens Gruber }
1096d6e7050SClemens Gruber
pca9685_read_reg(struct pca9685 * pca,unsigned int reg,unsigned int * val)11079dd354fSClemens Gruber static int pca9685_read_reg(struct pca9685 *pca, unsigned int reg, unsigned int *val)
11179dd354fSClemens Gruber {
11279dd354fSClemens Gruber struct device *dev = pca->chip.dev;
11379dd354fSClemens Gruber int err;
11479dd354fSClemens Gruber
11579dd354fSClemens Gruber err = regmap_read(pca->regmap, reg, val);
11679dd354fSClemens Gruber if (err)
11779dd354fSClemens Gruber dev_err(dev, "regmap_read of register 0x%x failed: %pe\n", reg, ERR_PTR(err));
11879dd354fSClemens Gruber
11979dd354fSClemens Gruber return err;
12079dd354fSClemens Gruber }
12179dd354fSClemens Gruber
pca9685_write_reg(struct pca9685 * pca,unsigned int reg,unsigned int val)12279dd354fSClemens Gruber static int pca9685_write_reg(struct pca9685 *pca, unsigned int reg, unsigned int val)
12379dd354fSClemens Gruber {
12479dd354fSClemens Gruber struct device *dev = pca->chip.dev;
12579dd354fSClemens Gruber int err;
12679dd354fSClemens Gruber
12779dd354fSClemens Gruber err = regmap_write(pca->regmap, reg, val);
12879dd354fSClemens Gruber if (err)
12979dd354fSClemens Gruber dev_err(dev, "regmap_write to register 0x%x failed: %pe\n", reg, ERR_PTR(err));
13079dd354fSClemens Gruber
13179dd354fSClemens Gruber return err;
13279dd354fSClemens Gruber }
13379dd354fSClemens Gruber
1349af1fba3SClemens Gruber /* Helper function to set the duty cycle ratio to duty/4096 (e.g. duty=2048 -> 50%) */
pca9685_pwm_set_duty(struct pca9685 * pca,int channel,unsigned int duty)1359af1fba3SClemens Gruber static void pca9685_pwm_set_duty(struct pca9685 *pca, int channel, unsigned int duty)
1369af1fba3SClemens Gruber {
137ae16db1fSClemens Gruber struct pwm_device *pwm = &pca->chip.pwms[channel];
138ae16db1fSClemens Gruber unsigned int on, off;
139ae16db1fSClemens Gruber
1409af1fba3SClemens Gruber if (duty == 0) {
1419af1fba3SClemens Gruber /* Set the full OFF bit, which has the highest precedence */
14279dd354fSClemens Gruber pca9685_write_reg(pca, REG_OFF_H(channel), LED_FULL);
143ae16db1fSClemens Gruber return;
1449af1fba3SClemens Gruber } else if (duty >= PCA9685_COUNTER_RANGE) {
1459af1fba3SClemens Gruber /* Set the full ON bit and clear the full OFF bit */
14679dd354fSClemens Gruber pca9685_write_reg(pca, REG_ON_H(channel), LED_FULL);
14779dd354fSClemens Gruber pca9685_write_reg(pca, REG_OFF_H(channel), 0);
148ae16db1fSClemens Gruber return;
1499af1fba3SClemens Gruber }
150ae16db1fSClemens Gruber
151ae16db1fSClemens Gruber
152ae16db1fSClemens Gruber if (pwm->state.usage_power && channel < PCA9685_MAXCHAN) {
153ae16db1fSClemens Gruber /*
154ae16db1fSClemens Gruber * If usage_power is set, the pca9685 driver will phase shift
155ae16db1fSClemens Gruber * the individual channels relative to their channel number.
156ae16db1fSClemens Gruber * This improves EMI because the enabled channels no longer
157ae16db1fSClemens Gruber * turn on at the same time, while still maintaining the
158ae16db1fSClemens Gruber * configured duty cycle / power output.
159ae16db1fSClemens Gruber */
160ae16db1fSClemens Gruber on = channel * PCA9685_COUNTER_RANGE / PCA9685_MAXCHAN;
161ae16db1fSClemens Gruber } else
162ae16db1fSClemens Gruber on = 0;
163ae16db1fSClemens Gruber
164ae16db1fSClemens Gruber off = (on + duty) % PCA9685_COUNTER_RANGE;
165ae16db1fSClemens Gruber
166ae16db1fSClemens Gruber /* Set ON time (clears full ON bit) */
16779dd354fSClemens Gruber pca9685_write_reg(pca, REG_ON_L(channel), on & 0xff);
16879dd354fSClemens Gruber pca9685_write_reg(pca, REG_ON_H(channel), (on >> 8) & 0xf);
169ae16db1fSClemens Gruber /* Set OFF time (clears full OFF bit) */
17079dd354fSClemens Gruber pca9685_write_reg(pca, REG_OFF_L(channel), off & 0xff);
17179dd354fSClemens Gruber pca9685_write_reg(pca, REG_OFF_H(channel), (off >> 8) & 0xf);
1729af1fba3SClemens Gruber }
1739af1fba3SClemens Gruber
pca9685_pwm_get_duty(struct pca9685 * pca,int channel)1749af1fba3SClemens Gruber static unsigned int pca9685_pwm_get_duty(struct pca9685 *pca, int channel)
1759af1fba3SClemens Gruber {
176ae16db1fSClemens Gruber struct pwm_device *pwm = &pca->chip.pwms[channel];
177ae16db1fSClemens Gruber unsigned int off = 0, on = 0, val = 0;
1789af1fba3SClemens Gruber
1799af1fba3SClemens Gruber if (WARN_ON(channel >= PCA9685_MAXCHAN)) {
1809af1fba3SClemens Gruber /* HW does not support reading state of "all LEDs" channel */
1819af1fba3SClemens Gruber return 0;
1829af1fba3SClemens Gruber }
1839af1fba3SClemens Gruber
18479dd354fSClemens Gruber pca9685_read_reg(pca, LED_N_OFF_H(channel), &off);
185ae16db1fSClemens Gruber if (off & LED_FULL) {
1869af1fba3SClemens Gruber /* Full OFF bit is set */
1879af1fba3SClemens Gruber return 0;
1889af1fba3SClemens Gruber }
1899af1fba3SClemens Gruber
19079dd354fSClemens Gruber pca9685_read_reg(pca, LED_N_ON_H(channel), &on);
191ae16db1fSClemens Gruber if (on & LED_FULL) {
1929af1fba3SClemens Gruber /* Full ON bit is set */
1939af1fba3SClemens Gruber return PCA9685_COUNTER_RANGE;
1949af1fba3SClemens Gruber }
1959af1fba3SClemens Gruber
19679dd354fSClemens Gruber pca9685_read_reg(pca, LED_N_OFF_L(channel), &val);
197ae16db1fSClemens Gruber off = ((off & 0xf) << 8) | (val & 0xff);
198ae16db1fSClemens Gruber if (!pwm->state.usage_power)
199ae16db1fSClemens Gruber return off;
200ae16db1fSClemens Gruber
201ae16db1fSClemens Gruber /* Read ON register to calculate duty cycle of staggered output */
20279dd354fSClemens Gruber if (pca9685_read_reg(pca, LED_N_ON_L(channel), &val)) {
203ae16db1fSClemens Gruber /* Reset val to 0 in case reading LED_N_ON_L failed */
2049af1fba3SClemens Gruber val = 0;
2059af1fba3SClemens Gruber }
206ae16db1fSClemens Gruber on = ((on & 0xf) << 8) | (val & 0xff);
207ae16db1fSClemens Gruber return (off - on) & (PCA9685_COUNTER_RANGE - 1);
2089af1fba3SClemens Gruber }
2099af1fba3SClemens Gruber
210bccec89fSMika Westerberg #if IS_ENABLED(CONFIG_GPIOLIB)
pca9685_pwm_test_and_set_inuse(struct pca9685 * pca,int pwm_idx)2119cc5f232SSven Van Asbroeck static bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca, int pwm_idx)
2129cc5f232SSven Van Asbroeck {
2139cc5f232SSven Van Asbroeck bool is_inuse;
2149cc5f232SSven Van Asbroeck
2159cc5f232SSven Van Asbroeck mutex_lock(&pca->lock);
2169cc5f232SSven Van Asbroeck if (pwm_idx >= PCA9685_MAXCHAN) {
2179cc5f232SSven Van Asbroeck /*
218316b676bSDavid Jander * "All LEDs" channel:
2199cc5f232SSven Van Asbroeck * pretend already in use if any of the PWMs are requested
2209cc5f232SSven Van Asbroeck */
2219cc5f232SSven Van Asbroeck if (!bitmap_empty(pca->pwms_inuse, PCA9685_MAXCHAN)) {
2229cc5f232SSven Van Asbroeck is_inuse = true;
2239cc5f232SSven Van Asbroeck goto out;
2249cc5f232SSven Van Asbroeck }
2259cc5f232SSven Van Asbroeck } else {
2269cc5f232SSven Van Asbroeck /*
227316b676bSDavid Jander * Regular channel:
2289cc5f232SSven Van Asbroeck * pretend already in use if the "all LEDs" channel is requested
2299cc5f232SSven Van Asbroeck */
2309cc5f232SSven Van Asbroeck if (test_bit(PCA9685_MAXCHAN, pca->pwms_inuse)) {
2319cc5f232SSven Van Asbroeck is_inuse = true;
2329cc5f232SSven Van Asbroeck goto out;
2339cc5f232SSven Van Asbroeck }
2349cc5f232SSven Van Asbroeck }
2359cc5f232SSven Van Asbroeck is_inuse = test_and_set_bit(pwm_idx, pca->pwms_inuse);
2369cc5f232SSven Van Asbroeck out:
2379cc5f232SSven Van Asbroeck mutex_unlock(&pca->lock);
2389cc5f232SSven Van Asbroeck return is_inuse;
2399cc5f232SSven Van Asbroeck }
2409cc5f232SSven Van Asbroeck
pca9685_pwm_clear_inuse(struct pca9685 * pca,int pwm_idx)2419cc5f232SSven Van Asbroeck static void pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx)
2429cc5f232SSven Van Asbroeck {
2439cc5f232SSven Van Asbroeck mutex_lock(&pca->lock);
2449cc5f232SSven Van Asbroeck clear_bit(pwm_idx, pca->pwms_inuse);
2459cc5f232SSven Van Asbroeck mutex_unlock(&pca->lock);
2469cc5f232SSven Van Asbroeck }
2479cc5f232SSven Van Asbroeck
pca9685_pwm_gpio_request(struct gpio_chip * gpio,unsigned int offset)248bccec89fSMika Westerberg static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int offset)
249bccec89fSMika Westerberg {
250bccec89fSMika Westerberg struct pca9685 *pca = gpiochip_get_data(gpio);
251bccec89fSMika Westerberg
2529cc5f232SSven Van Asbroeck if (pca9685_pwm_test_and_set_inuse(pca, offset))
253bccec89fSMika Westerberg return -EBUSY;
254c40c461eSSven Van Asbroeck pm_runtime_get_sync(pca->chip.dev);
255bccec89fSMika Westerberg return 0;
256bccec89fSMika Westerberg }
257bccec89fSMika Westerberg
pca9685_pwm_gpio_get(struct gpio_chip * gpio,unsigned int offset)258bccec89fSMika Westerberg static int pca9685_pwm_gpio_get(struct gpio_chip *gpio, unsigned int offset)
259bccec89fSMika Westerberg {
260bccec89fSMika Westerberg struct pca9685 *pca = gpiochip_get_data(gpio);
261bccec89fSMika Westerberg
2629af1fba3SClemens Gruber return pca9685_pwm_get_duty(pca, offset) != 0;
263bccec89fSMika Westerberg }
264bccec89fSMika Westerberg
pca9685_pwm_gpio_set(struct gpio_chip * gpio,unsigned int offset,int value)265bccec89fSMika Westerberg static void pca9685_pwm_gpio_set(struct gpio_chip *gpio, unsigned int offset,
266bccec89fSMika Westerberg int value)
267bccec89fSMika Westerberg {
268bccec89fSMika Westerberg struct pca9685 *pca = gpiochip_get_data(gpio);
269bccec89fSMika Westerberg
2709af1fba3SClemens Gruber pca9685_pwm_set_duty(pca, offset, value ? PCA9685_COUNTER_RANGE : 0);
271bccec89fSMika Westerberg }
272bccec89fSMika Westerberg
pca9685_pwm_gpio_free(struct gpio_chip * gpio,unsigned int offset)273c40c461eSSven Van Asbroeck static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset)
274c40c461eSSven Van Asbroeck {
275c40c461eSSven Van Asbroeck struct pca9685 *pca = gpiochip_get_data(gpio);
276c40c461eSSven Van Asbroeck
2779af1fba3SClemens Gruber pca9685_pwm_set_duty(pca, offset, 0);
278c40c461eSSven Van Asbroeck pm_runtime_put(pca->chip.dev);
2799cc5f232SSven Van Asbroeck pca9685_pwm_clear_inuse(pca, offset);
280c40c461eSSven Van Asbroeck }
281c40c461eSSven Van Asbroeck
pca9685_pwm_gpio_get_direction(struct gpio_chip * chip,unsigned int offset)282bccec89fSMika Westerberg static int pca9685_pwm_gpio_get_direction(struct gpio_chip *chip,
283bccec89fSMika Westerberg unsigned int offset)
284bccec89fSMika Westerberg {
285bccec89fSMika Westerberg /* Always out */
286a37507d5SRishi Gupta return GPIO_LINE_DIRECTION_OUT;
287bccec89fSMika Westerberg }
288bccec89fSMika Westerberg
pca9685_pwm_gpio_direction_input(struct gpio_chip * gpio,unsigned int offset)289bccec89fSMika Westerberg static int pca9685_pwm_gpio_direction_input(struct gpio_chip *gpio,
290bccec89fSMika Westerberg unsigned int offset)
291bccec89fSMika Westerberg {
292bccec89fSMika Westerberg return -EINVAL;
293bccec89fSMika Westerberg }
294bccec89fSMika Westerberg
pca9685_pwm_gpio_direction_output(struct gpio_chip * gpio,unsigned int offset,int value)295bccec89fSMika Westerberg static int pca9685_pwm_gpio_direction_output(struct gpio_chip *gpio,
296bccec89fSMika Westerberg unsigned int offset, int value)
297bccec89fSMika Westerberg {
298bccec89fSMika Westerberg pca9685_pwm_gpio_set(gpio, offset, value);
299bccec89fSMika Westerberg
300bccec89fSMika Westerberg return 0;
301bccec89fSMika Westerberg }
302bccec89fSMika Westerberg
303bccec89fSMika Westerberg /*
304bccec89fSMika Westerberg * The PCA9685 has a bit for turning the PWM output full off or on. Some
305bccec89fSMika Westerberg * boards like Intel Galileo actually uses these as normal GPIOs so we
306bccec89fSMika Westerberg * expose a GPIO chip here which can exclusively take over the underlying
307bccec89fSMika Westerberg * PWM channel.
308bccec89fSMika Westerberg */
pca9685_pwm_gpio_probe(struct pca9685 * pca)309bccec89fSMika Westerberg static int pca9685_pwm_gpio_probe(struct pca9685 *pca)
310bccec89fSMika Westerberg {
311bccec89fSMika Westerberg struct device *dev = pca->chip.dev;
312bccec89fSMika Westerberg
313bccec89fSMika Westerberg pca->gpio.label = dev_name(dev);
314bccec89fSMika Westerberg pca->gpio.parent = dev;
315bccec89fSMika Westerberg pca->gpio.request = pca9685_pwm_gpio_request;
316bccec89fSMika Westerberg pca->gpio.free = pca9685_pwm_gpio_free;
317bccec89fSMika Westerberg pca->gpio.get_direction = pca9685_pwm_gpio_get_direction;
318bccec89fSMika Westerberg pca->gpio.direction_input = pca9685_pwm_gpio_direction_input;
319bccec89fSMika Westerberg pca->gpio.direction_output = pca9685_pwm_gpio_direction_output;
320bccec89fSMika Westerberg pca->gpio.get = pca9685_pwm_gpio_get;
321bccec89fSMika Westerberg pca->gpio.set = pca9685_pwm_gpio_set;
322bccec89fSMika Westerberg pca->gpio.base = -1;
323bccec89fSMika Westerberg pca->gpio.ngpio = PCA9685_MAXCHAN;
324bccec89fSMika Westerberg pca->gpio.can_sleep = true;
325bccec89fSMika Westerberg
326bccec89fSMika Westerberg return devm_gpiochip_add_data(dev, &pca->gpio, pca);
327bccec89fSMika Westerberg }
328bccec89fSMika Westerberg #else
pca9685_pwm_test_and_set_inuse(struct pca9685 * pca,int pwm_idx)3299cc5f232SSven Van Asbroeck static inline bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca,
3309cc5f232SSven Van Asbroeck int pwm_idx)
331bccec89fSMika Westerberg {
332bccec89fSMika Westerberg return false;
333bccec89fSMika Westerberg }
334bccec89fSMika Westerberg
3359cc5f232SSven Van Asbroeck static inline void
pca9685_pwm_clear_inuse(struct pca9685 * pca,int pwm_idx)3369cc5f232SSven Van Asbroeck pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx)
3379cc5f232SSven Van Asbroeck {
3389cc5f232SSven Van Asbroeck }
3399cc5f232SSven Van Asbroeck
pca9685_pwm_gpio_probe(struct pca9685 * pca)340bccec89fSMika Westerberg static inline int pca9685_pwm_gpio_probe(struct pca9685 *pca)
341bccec89fSMika Westerberg {
342bccec89fSMika Westerberg return 0;
343bccec89fSMika Westerberg }
344bccec89fSMika Westerberg #endif
345bccec89fSMika Westerberg
pca9685_set_sleep_mode(struct pca9685 * pca,bool enable)3460829326aSSven Van Asbroeck static void pca9685_set_sleep_mode(struct pca9685 *pca, bool enable)
347c40c461eSSven Van Asbroeck {
34879dd354fSClemens Gruber struct device *dev = pca->chip.dev;
34979dd354fSClemens Gruber int err = regmap_update_bits(pca->regmap, PCA9685_MODE1,
3500829326aSSven Van Asbroeck MODE1_SLEEP, enable ? MODE1_SLEEP : 0);
35179dd354fSClemens Gruber if (err) {
35279dd354fSClemens Gruber dev_err(dev, "regmap_update_bits of register 0x%x failed: %pe\n",
35379dd354fSClemens Gruber PCA9685_MODE1, ERR_PTR(err));
35479dd354fSClemens Gruber return;
35579dd354fSClemens Gruber }
35679dd354fSClemens Gruber
3570829326aSSven Van Asbroeck if (!enable) {
358c40c461eSSven Van Asbroeck /* Wait 500us for the oscillator to be back up */
359c40c461eSSven Van Asbroeck udelay(500);
360c40c461eSSven Van Asbroeck }
361c40c461eSSven Van Asbroeck }
362c40c461eSSven Van Asbroeck
__pca9685_pwm_apply(struct pwm_chip * chip,struct pwm_device * pwm,const struct pwm_state * state)3636d6e7050SClemens Gruber static int __pca9685_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
3649af1fba3SClemens Gruber const struct pwm_state *state)
36588b613e6SSteffen Trumtrar {
36688b613e6SSteffen Trumtrar struct pca9685 *pca = to_pca(chip);
3679af1fba3SClemens Gruber unsigned long long duty, prescale;
3689af1fba3SClemens Gruber unsigned int val = 0;
36901ec8472SClemens Gruber
3709af1fba3SClemens Gruber if (state->polarity != PWM_POLARITY_NORMAL)
3719af1fba3SClemens Gruber return -EINVAL;
3729af1fba3SClemens Gruber
3739af1fba3SClemens Gruber prescale = DIV_ROUND_CLOSEST_ULL(PCA9685_OSC_CLOCK_MHZ * state->period,
37401ec8472SClemens Gruber PCA9685_COUNTER_RANGE * 1000) - 1;
3759af1fba3SClemens Gruber if (prescale < PCA9685_PRESCALE_MIN || prescale > PCA9685_PRESCALE_MAX) {
3769af1fba3SClemens Gruber dev_err(chip->dev, "pwm not changed: period out of bounds!\n");
3779af1fba3SClemens Gruber return -EINVAL;
3789af1fba3SClemens Gruber }
37901ec8472SClemens Gruber
3809af1fba3SClemens Gruber if (!state->enabled) {
3819af1fba3SClemens Gruber pca9685_pwm_set_duty(pca, pwm->hwpwm, 0);
3829af1fba3SClemens Gruber return 0;
3839af1fba3SClemens Gruber }
3849af1fba3SClemens Gruber
38579dd354fSClemens Gruber pca9685_read_reg(pca, PCA9685_PRESCALE, &val);
3869af1fba3SClemens Gruber if (prescale != val) {
3876d6e7050SClemens Gruber if (!pca9685_prescaler_can_change(pca, pwm->hwpwm)) {
3886d6e7050SClemens Gruber dev_err(chip->dev,
3896d6e7050SClemens Gruber "pwm not changed: periods of enabled pwms must match!\n");
3906d6e7050SClemens Gruber return -EBUSY;
3916d6e7050SClemens Gruber }
3926d6e7050SClemens Gruber
393c40c461eSSven Van Asbroeck /*
394316b676bSDavid Jander * Putting the chip briefly into SLEEP mode
395c40c461eSSven Van Asbroeck * at this point won't interfere with the
396c40c461eSSven Van Asbroeck * pm_runtime framework, because the pm_runtime
397c40c461eSSven Van Asbroeck * state is guaranteed active here.
398c40c461eSSven Van Asbroeck */
39901ec8472SClemens Gruber /* Put chip into sleep mode */
4000829326aSSven Van Asbroeck pca9685_set_sleep_mode(pca, true);
40101ec8472SClemens Gruber
40201ec8472SClemens Gruber /* Change the chip-wide output frequency */
40379dd354fSClemens Gruber pca9685_write_reg(pca, PCA9685_PRESCALE, prescale);
40401ec8472SClemens Gruber
40501ec8472SClemens Gruber /* Wake the chip up */
4060829326aSSven Van Asbroeck pca9685_set_sleep_mode(pca, false);
40701ec8472SClemens Gruber }
40801ec8472SClemens Gruber
4099af1fba3SClemens Gruber duty = PCA9685_COUNTER_RANGE * state->duty_cycle;
4109af1fba3SClemens Gruber duty = DIV_ROUND_UP_ULL(duty, state->period);
4119af1fba3SClemens Gruber pca9685_pwm_set_duty(pca, pwm->hwpwm, duty);
41288b613e6SSteffen Trumtrar return 0;
41388b613e6SSteffen Trumtrar }
41488b613e6SSteffen Trumtrar
pca9685_pwm_apply(struct pwm_chip * chip,struct pwm_device * pwm,const struct pwm_state * state)4156d6e7050SClemens Gruber static int pca9685_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
4166d6e7050SClemens Gruber const struct pwm_state *state)
4176d6e7050SClemens Gruber {
4186d6e7050SClemens Gruber struct pca9685 *pca = to_pca(chip);
4196d6e7050SClemens Gruber int ret;
4206d6e7050SClemens Gruber
4216d6e7050SClemens Gruber mutex_lock(&pca->lock);
4226d6e7050SClemens Gruber ret = __pca9685_pwm_apply(chip, pwm, state);
4236d6e7050SClemens Gruber if (ret == 0) {
4246d6e7050SClemens Gruber if (state->enabled)
4256d6e7050SClemens Gruber set_bit(pwm->hwpwm, pca->pwms_enabled);
4266d6e7050SClemens Gruber else
4276d6e7050SClemens Gruber clear_bit(pwm->hwpwm, pca->pwms_enabled);
4286d6e7050SClemens Gruber }
4296d6e7050SClemens Gruber mutex_unlock(&pca->lock);
4306d6e7050SClemens Gruber
4316d6e7050SClemens Gruber return ret;
4326d6e7050SClemens Gruber }
4336d6e7050SClemens Gruber
pca9685_pwm_get_state(struct pwm_chip * chip,struct pwm_device * pwm,struct pwm_state * state)4346c452cffSUwe Kleine-König static int pca9685_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
4358f4768a5SClemens Gruber struct pwm_state *state)
4368f4768a5SClemens Gruber {
4378f4768a5SClemens Gruber struct pca9685 *pca = to_pca(chip);
4388f4768a5SClemens Gruber unsigned long long duty;
4398f4768a5SClemens Gruber unsigned int val = 0;
4408f4768a5SClemens Gruber
4418f4768a5SClemens Gruber /* Calculate (chip-wide) period from prescale value */
44279dd354fSClemens Gruber pca9685_read_reg(pca, PCA9685_PRESCALE, &val);
4438f4768a5SClemens Gruber /*
4448f4768a5SClemens Gruber * PCA9685_OSC_CLOCK_MHZ is 25, i.e. an integer divider of 1000.
4458f4768a5SClemens Gruber * The following calculation is therefore only a multiplication
4468f4768a5SClemens Gruber * and we are not losing precision.
4478f4768a5SClemens Gruber */
4488f4768a5SClemens Gruber state->period = (PCA9685_COUNTER_RANGE * 1000 / PCA9685_OSC_CLOCK_MHZ) *
4498f4768a5SClemens Gruber (val + 1);
4508f4768a5SClemens Gruber
4518f4768a5SClemens Gruber /* The (per-channel) polarity is fixed */
4528f4768a5SClemens Gruber state->polarity = PWM_POLARITY_NORMAL;
4538f4768a5SClemens Gruber
4548f4768a5SClemens Gruber if (pwm->hwpwm >= PCA9685_MAXCHAN) {
4558f4768a5SClemens Gruber /*
4568f4768a5SClemens Gruber * The "all LEDs" channel does not support HW readout
4578f4768a5SClemens Gruber * Return 0 and disabled for backwards compatibility
4588f4768a5SClemens Gruber */
4598f4768a5SClemens Gruber state->duty_cycle = 0;
4608f4768a5SClemens Gruber state->enabled = false;
4616c452cffSUwe Kleine-König return 0;
4628f4768a5SClemens Gruber }
4638f4768a5SClemens Gruber
4648f4768a5SClemens Gruber state->enabled = true;
4658f4768a5SClemens Gruber duty = pca9685_pwm_get_duty(pca, pwm->hwpwm);
4668f4768a5SClemens Gruber state->duty_cycle = DIV_ROUND_DOWN_ULL(duty * state->period, PCA9685_COUNTER_RANGE);
4676c452cffSUwe Kleine-König
4686c452cffSUwe Kleine-König return 0;
4698f4768a5SClemens Gruber }
4708f4768a5SClemens Gruber
pca9685_pwm_request(struct pwm_chip * chip,struct pwm_device * pwm)47188b613e6SSteffen Trumtrar static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
47288b613e6SSteffen Trumtrar {
47388b613e6SSteffen Trumtrar struct pca9685 *pca = to_pca(chip);
47488b613e6SSteffen Trumtrar
4759cc5f232SSven Van Asbroeck if (pca9685_pwm_test_and_set_inuse(pca, pwm->hwpwm))
476bccec89fSMika Westerberg return -EBUSY;
4776d6e7050SClemens Gruber
4786d6e7050SClemens Gruber if (pwm->hwpwm < PCA9685_MAXCHAN) {
4796d6e7050SClemens Gruber /* PWMs - except the "all LEDs" channel - default to enabled */
4806d6e7050SClemens Gruber mutex_lock(&pca->lock);
4816d6e7050SClemens Gruber set_bit(pwm->hwpwm, pca->pwms_enabled);
4826d6e7050SClemens Gruber mutex_unlock(&pca->lock);
4836d6e7050SClemens Gruber }
4846d6e7050SClemens Gruber
485c40c461eSSven Van Asbroeck pm_runtime_get_sync(chip->dev);
48688b613e6SSteffen Trumtrar
48788b613e6SSteffen Trumtrar return 0;
48888b613e6SSteffen Trumtrar }
48988b613e6SSteffen Trumtrar
pca9685_pwm_free(struct pwm_chip * chip,struct pwm_device * pwm)49088b613e6SSteffen Trumtrar static void pca9685_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
49188b613e6SSteffen Trumtrar {
4929cc5f232SSven Van Asbroeck struct pca9685 *pca = to_pca(chip);
4939cc5f232SSven Van Asbroeck
4946d6e7050SClemens Gruber mutex_lock(&pca->lock);
4959af1fba3SClemens Gruber pca9685_pwm_set_duty(pca, pwm->hwpwm, 0);
4966d6e7050SClemens Gruber clear_bit(pwm->hwpwm, pca->pwms_enabled);
4976d6e7050SClemens Gruber mutex_unlock(&pca->lock);
4986d6e7050SClemens Gruber
499c40c461eSSven Van Asbroeck pm_runtime_put(chip->dev);
5009cc5f232SSven Van Asbroeck pca9685_pwm_clear_inuse(pca, pwm->hwpwm);
50188b613e6SSteffen Trumtrar }
50288b613e6SSteffen Trumtrar
50388b613e6SSteffen Trumtrar static const struct pwm_ops pca9685_pwm_ops = {
5049af1fba3SClemens Gruber .apply = pca9685_pwm_apply,
5058f4768a5SClemens Gruber .get_state = pca9685_pwm_get_state,
50688b613e6SSteffen Trumtrar .request = pca9685_pwm_request,
50788b613e6SSteffen Trumtrar .free = pca9685_pwm_free,
5083dd0a909SThierry Reding .owner = THIS_MODULE,
50988b613e6SSteffen Trumtrar };
51088b613e6SSteffen Trumtrar
511c456fbb2SKrzysztof Kozlowski static const struct regmap_config pca9685_regmap_i2c_config = {
51288b613e6SSteffen Trumtrar .reg_bits = 8,
51388b613e6SSteffen Trumtrar .val_bits = 8,
51488b613e6SSteffen Trumtrar .max_register = PCA9685_NUMREGS,
51588b613e6SSteffen Trumtrar .cache_type = REGCACHE_NONE,
51688b613e6SSteffen Trumtrar };
51788b613e6SSteffen Trumtrar
pca9685_pwm_probe(struct i2c_client * client)518*8fa22f4bSUwe Kleine-König static int pca9685_pwm_probe(struct i2c_client *client)
51988b613e6SSteffen Trumtrar {
52088b613e6SSteffen Trumtrar struct pca9685 *pca;
521bce54366SDavid Jander unsigned int reg;
52288b613e6SSteffen Trumtrar int ret;
52388b613e6SSteffen Trumtrar
52488b613e6SSteffen Trumtrar pca = devm_kzalloc(&client->dev, sizeof(*pca), GFP_KERNEL);
52588b613e6SSteffen Trumtrar if (!pca)
52688b613e6SSteffen Trumtrar return -ENOMEM;
52788b613e6SSteffen Trumtrar
52888b613e6SSteffen Trumtrar pca->regmap = devm_regmap_init_i2c(client, &pca9685_regmap_i2c_config);
52988b613e6SSteffen Trumtrar if (IS_ERR(pca->regmap)) {
53088b613e6SSteffen Trumtrar ret = PTR_ERR(pca->regmap);
53188b613e6SSteffen Trumtrar dev_err(&client->dev, "Failed to initialize register map: %d\n",
53288b613e6SSteffen Trumtrar ret);
53388b613e6SSteffen Trumtrar return ret;
53488b613e6SSteffen Trumtrar }
53588b613e6SSteffen Trumtrar
53688b613e6SSteffen Trumtrar i2c_set_clientdata(client, pca);
53788b613e6SSteffen Trumtrar
5386d6e7050SClemens Gruber mutex_init(&pca->lock);
5396d6e7050SClemens Gruber
54079dd354fSClemens Gruber ret = pca9685_read_reg(pca, PCA9685_MODE2, ®);
54179dd354fSClemens Gruber if (ret)
54279dd354fSClemens Gruber return ret;
54388b613e6SSteffen Trumtrar
544912b8439SAndy Shevchenko if (device_property_read_bool(&client->dev, "invert"))
545bce54366SDavid Jander reg |= MODE2_INVRT;
54688b613e6SSteffen Trumtrar else
547bce54366SDavid Jander reg &= ~MODE2_INVRT;
54888b613e6SSteffen Trumtrar
549912b8439SAndy Shevchenko if (device_property_read_bool(&client->dev, "open-drain"))
550bce54366SDavid Jander reg &= ~MODE2_OUTDRV;
55188b613e6SSteffen Trumtrar else
552bce54366SDavid Jander reg |= MODE2_OUTDRV;
55388b613e6SSteffen Trumtrar
55479dd354fSClemens Gruber ret = pca9685_write_reg(pca, PCA9685_MODE2, reg);
55579dd354fSClemens Gruber if (ret)
55679dd354fSClemens Gruber return ret;
557bce54366SDavid Jander
558bce54366SDavid Jander /* Disable all LED ALLCALL and SUBx addresses to avoid bus collisions */
55979dd354fSClemens Gruber pca9685_read_reg(pca, PCA9685_MODE1, ®);
560bce54366SDavid Jander reg &= ~(MODE1_ALLCALL | MODE1_SUB1 | MODE1_SUB2 | MODE1_SUB3);
56179dd354fSClemens Gruber pca9685_write_reg(pca, PCA9685_MODE1, reg);
56288b613e6SSteffen Trumtrar
563ae16db1fSClemens Gruber /* Reset OFF/ON registers to POR default */
5642e0e1296SLionel Vitte pca9685_write_reg(pca, PCA9685_ALL_LED_OFF_L, 0);
56579dd354fSClemens Gruber pca9685_write_reg(pca, PCA9685_ALL_LED_OFF_H, LED_FULL);
56679dd354fSClemens Gruber pca9685_write_reg(pca, PCA9685_ALL_LED_ON_L, 0);
5672e0e1296SLionel Vitte pca9685_write_reg(pca, PCA9685_ALL_LED_ON_H, LED_FULL);
56888b613e6SSteffen Trumtrar
56988b613e6SSteffen Trumtrar pca->chip.ops = &pca9685_pwm_ops;
570316b676bSDavid Jander /* Add an extra channel for ALL_LED */
57188b613e6SSteffen Trumtrar pca->chip.npwm = PCA9685_MAXCHAN + 1;
57288b613e6SSteffen Trumtrar
57388b613e6SSteffen Trumtrar pca->chip.dev = &client->dev;
57488b613e6SSteffen Trumtrar
575bccec89fSMika Westerberg ret = pwmchip_add(&pca->chip);
576bccec89fSMika Westerberg if (ret < 0)
577bccec89fSMika Westerberg return ret;
578bccec89fSMika Westerberg
579bccec89fSMika Westerberg ret = pca9685_pwm_gpio_probe(pca);
580c40c461eSSven Van Asbroeck if (ret < 0) {
581bccec89fSMika Westerberg pwmchip_remove(&pca->chip);
582bccec89fSMika Westerberg return ret;
58388b613e6SSteffen Trumtrar }
58488b613e6SSteffen Trumtrar
585c40c461eSSven Van Asbroeck pm_runtime_enable(&client->dev);
586c40c461eSSven Van Asbroeck
5879e6fd830SClemens Gruber if (pm_runtime_enabled(&client->dev)) {
5889e6fd830SClemens Gruber /*
5899e6fd830SClemens Gruber * Although the chip comes out of power-up in the sleep state,
5909e6fd830SClemens Gruber * we force it to sleep in case it was woken up before
5919e6fd830SClemens Gruber */
5929e6fd830SClemens Gruber pca9685_set_sleep_mode(pca, true);
5939e6fd830SClemens Gruber pm_runtime_set_suspended(&client->dev);
5949e6fd830SClemens Gruber } else {
5959e6fd830SClemens Gruber /* Wake the chip up if runtime PM is disabled */
5969e6fd830SClemens Gruber pca9685_set_sleep_mode(pca, false);
5979e6fd830SClemens Gruber }
5989e6fd830SClemens Gruber
599c40c461eSSven Van Asbroeck return 0;
600c40c461eSSven Van Asbroeck }
601c40c461eSSven Van Asbroeck
pca9685_pwm_remove(struct i2c_client * client)602ed5c2f5fSUwe Kleine-König static void pca9685_pwm_remove(struct i2c_client *client)
60388b613e6SSteffen Trumtrar {
60488b613e6SSteffen Trumtrar struct pca9685 *pca = i2c_get_clientdata(client);
60588b613e6SSteffen Trumtrar
606f0e96e2eSUwe Kleine-König pwmchip_remove(&pca->chip);
6079e6fd830SClemens Gruber
6089e6fd830SClemens Gruber if (!pm_runtime_enabled(&client->dev)) {
6099e6fd830SClemens Gruber /* Put chip in sleep state if runtime PM is disabled */
6109e6fd830SClemens Gruber pca9685_set_sleep_mode(pca, true);
6119e6fd830SClemens Gruber }
6129e6fd830SClemens Gruber
613c40c461eSSven Van Asbroeck pm_runtime_disable(&client->dev);
61488b613e6SSteffen Trumtrar }
61588b613e6SSteffen Trumtrar
pca9685_pwm_runtime_suspend(struct device * dev)616408a7591SRishi Gupta static int __maybe_unused pca9685_pwm_runtime_suspend(struct device *dev)
617c40c461eSSven Van Asbroeck {
618c40c461eSSven Van Asbroeck struct i2c_client *client = to_i2c_client(dev);
619c40c461eSSven Van Asbroeck struct pca9685 *pca = i2c_get_clientdata(client);
620c40c461eSSven Van Asbroeck
6210829326aSSven Van Asbroeck pca9685_set_sleep_mode(pca, true);
622c40c461eSSven Van Asbroeck return 0;
623c40c461eSSven Van Asbroeck }
624c40c461eSSven Van Asbroeck
pca9685_pwm_runtime_resume(struct device * dev)625408a7591SRishi Gupta static int __maybe_unused pca9685_pwm_runtime_resume(struct device *dev)
626c40c461eSSven Van Asbroeck {
627c40c461eSSven Van Asbroeck struct i2c_client *client = to_i2c_client(dev);
628c40c461eSSven Van Asbroeck struct pca9685 *pca = i2c_get_clientdata(client);
629c40c461eSSven Van Asbroeck
6300829326aSSven Van Asbroeck pca9685_set_sleep_mode(pca, false);
631c40c461eSSven Van Asbroeck return 0;
632c40c461eSSven Van Asbroeck }
633c40c461eSSven Van Asbroeck
63488b613e6SSteffen Trumtrar static const struct i2c_device_id pca9685_id[] = {
63588b613e6SSteffen Trumtrar { "pca9685", 0 },
63688b613e6SSteffen Trumtrar { /* sentinel */ },
63788b613e6SSteffen Trumtrar };
63888b613e6SSteffen Trumtrar MODULE_DEVICE_TABLE(i2c, pca9685_id);
63988b613e6SSteffen Trumtrar
640912b8439SAndy Shevchenko #ifdef CONFIG_ACPI
641912b8439SAndy Shevchenko static const struct acpi_device_id pca9685_acpi_ids[] = {
642912b8439SAndy Shevchenko { "INT3492", 0 },
643912b8439SAndy Shevchenko { /* sentinel */ },
644912b8439SAndy Shevchenko };
645912b8439SAndy Shevchenko MODULE_DEVICE_TABLE(acpi, pca9685_acpi_ids);
646912b8439SAndy Shevchenko #endif
647912b8439SAndy Shevchenko
648912b8439SAndy Shevchenko #ifdef CONFIG_OF
64988b613e6SSteffen Trumtrar static const struct of_device_id pca9685_dt_ids[] = {
65088b613e6SSteffen Trumtrar { .compatible = "nxp,pca9685-pwm", },
65188b613e6SSteffen Trumtrar { /* sentinel */ }
65288b613e6SSteffen Trumtrar };
65388b613e6SSteffen Trumtrar MODULE_DEVICE_TABLE(of, pca9685_dt_ids);
654912b8439SAndy Shevchenko #endif
65588b613e6SSteffen Trumtrar
656c40c461eSSven Van Asbroeck static const struct dev_pm_ops pca9685_pwm_pm = {
657c40c461eSSven Van Asbroeck SET_RUNTIME_PM_OPS(pca9685_pwm_runtime_suspend,
658c40c461eSSven Van Asbroeck pca9685_pwm_runtime_resume, NULL)
659c40c461eSSven Van Asbroeck };
660c40c461eSSven Van Asbroeck
66188b613e6SSteffen Trumtrar static struct i2c_driver pca9685_i2c_driver = {
66288b613e6SSteffen Trumtrar .driver = {
66388b613e6SSteffen Trumtrar .name = "pca9685-pwm",
664912b8439SAndy Shevchenko .acpi_match_table = ACPI_PTR(pca9685_acpi_ids),
665912b8439SAndy Shevchenko .of_match_table = of_match_ptr(pca9685_dt_ids),
666c40c461eSSven Van Asbroeck .pm = &pca9685_pwm_pm,
66788b613e6SSteffen Trumtrar },
668*8fa22f4bSUwe Kleine-König .probe = pca9685_pwm_probe,
66988b613e6SSteffen Trumtrar .remove = pca9685_pwm_remove,
67088b613e6SSteffen Trumtrar .id_table = pca9685_id,
67188b613e6SSteffen Trumtrar };
67288b613e6SSteffen Trumtrar
67388b613e6SSteffen Trumtrar module_i2c_driver(pca9685_i2c_driver);
67488b613e6SSteffen Trumtrar
67588b613e6SSteffen Trumtrar MODULE_AUTHOR("Steffen Trumtrar <s.trumtrar@pengutronix.de>");
67688b613e6SSteffen Trumtrar MODULE_DESCRIPTION("PWM driver for PCA9685");
67788b613e6SSteffen Trumtrar MODULE_LICENSE("GPL");
678