xref: /openbmc/linux/drivers/pwm/pwm-pca9685.c (revision 7a693ea78e3c48605a2d849fd241ff15561f10d5)
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, &reg);
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, &reg);
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