xref: /linux-6.15/include/linux/pwm.h (revision 15fa8a43)
11a189b97SRussell King #ifndef __LINUX_PWM_H
21a189b97SRussell King #define __LINUX_PWM_H
31a189b97SRussell King 
40bcf168bSTushar Behera #include <linux/err.h>
5d1cd2142SJonathan Richardson #include <linux/mutex.h>
67299ab70SThierry Reding #include <linux/of.h>
77299ab70SThierry Reding 
81a189b97SRussell King struct pwm_device;
962099abfSThierry Reding struct seq_file;
101a189b97SRussell King 
11557fe99dSSascha Hauer #if IS_ENABLED(CONFIG_PWM)
121a189b97SRussell King /*
131a189b97SRussell King  * pwm_request - request a PWM device
141a189b97SRussell King  */
151a189b97SRussell King struct pwm_device *pwm_request(int pwm_id, const char *label);
161a189b97SRussell King 
171a189b97SRussell King /*
181a189b97SRussell King  * pwm_free - free a PWM device
191a189b97SRussell King  */
201a189b97SRussell King void pwm_free(struct pwm_device *pwm);
211a189b97SRussell King 
221a189b97SRussell King /*
231a189b97SRussell King  * pwm_config - change a PWM device configuration
241a189b97SRussell King  */
251a189b97SRussell King int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
261a189b97SRussell King 
271a189b97SRussell King /*
281a189b97SRussell King  * pwm_enable - start a PWM output toggling
291a189b97SRussell King  */
301a189b97SRussell King int pwm_enable(struct pwm_device *pwm);
311a189b97SRussell King 
321a189b97SRussell King /*
331a189b97SRussell King  * pwm_disable - stop a PWM output toggling
341a189b97SRussell King  */
351a189b97SRussell King void pwm_disable(struct pwm_device *pwm);
360bcf168bSTushar Behera #else
370bcf168bSTushar Behera static inline struct pwm_device *pwm_request(int pwm_id, const char *label)
380bcf168bSTushar Behera {
390bcf168bSTushar Behera 	return ERR_PTR(-ENODEV);
400bcf168bSTushar Behera }
411a189b97SRussell King 
420bcf168bSTushar Behera static inline void pwm_free(struct pwm_device *pwm)
430bcf168bSTushar Behera {
440bcf168bSTushar Behera }
450bcf168bSTushar Behera 
460bcf168bSTushar Behera static inline int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
470bcf168bSTushar Behera {
480bcf168bSTushar Behera 	return -EINVAL;
490bcf168bSTushar Behera }
500bcf168bSTushar Behera 
510bcf168bSTushar Behera static inline int pwm_enable(struct pwm_device *pwm)
520bcf168bSTushar Behera {
530bcf168bSTushar Behera 	return -EINVAL;
540bcf168bSTushar Behera }
550bcf168bSTushar Behera 
560bcf168bSTushar Behera static inline void pwm_disable(struct pwm_device *pwm)
570bcf168bSTushar Behera {
580bcf168bSTushar Behera }
590bcf168bSTushar Behera #endif
600bcf168bSTushar Behera 
610c2498f1SSascha Hauer struct pwm_chip;
620c2498f1SSascha Hauer 
630aa0869cSPhilip, Avinash /**
640aa0869cSPhilip, Avinash  * enum pwm_polarity - polarity of a PWM signal
650aa0869cSPhilip, Avinash  * @PWM_POLARITY_NORMAL: a high signal for the duration of the duty-
660aa0869cSPhilip, Avinash  * cycle, followed by a low signal for the remainder of the pulse
670aa0869cSPhilip, Avinash  * period
680aa0869cSPhilip, Avinash  * @PWM_POLARITY_INVERSED: a low signal for the duration of the duty-
690aa0869cSPhilip, Avinash  * cycle, followed by a high signal for the remainder of the pulse
700aa0869cSPhilip, Avinash  * period
710aa0869cSPhilip, Avinash  */
720aa0869cSPhilip, Avinash enum pwm_polarity {
730aa0869cSPhilip, Avinash 	PWM_POLARITY_NORMAL,
740aa0869cSPhilip, Avinash 	PWM_POLARITY_INVERSED,
750aa0869cSPhilip, Avinash };
760aa0869cSPhilip, Avinash 
77e39c0df1SBoris Brezillon /**
78e39c0df1SBoris Brezillon  * struct pwm_args - board-dependent PWM arguments
79e39c0df1SBoris Brezillon  * @period: reference period
80e39c0df1SBoris Brezillon  * @polarity: reference polarity
81e39c0df1SBoris Brezillon  *
82e39c0df1SBoris Brezillon  * This structure describes board-dependent arguments attached to a PWM
83e39c0df1SBoris Brezillon  * device. These arguments are usually retrieved from the PWM lookup table or
84e39c0df1SBoris Brezillon  * device tree.
85e39c0df1SBoris Brezillon  *
86e39c0df1SBoris Brezillon  * Do not confuse this with the PWM state: PWM arguments represent the initial
87e39c0df1SBoris Brezillon  * configuration that users want to use on this PWM device rather than the
88e39c0df1SBoris Brezillon  * current PWM hardware state.
89e39c0df1SBoris Brezillon  */
90e39c0df1SBoris Brezillon struct pwm_args {
91e39c0df1SBoris Brezillon 	unsigned int period;
92e39c0df1SBoris Brezillon 	enum pwm_polarity polarity;
93e39c0df1SBoris Brezillon };
94e39c0df1SBoris Brezillon 
95f051c466SThierry Reding enum {
96f051c466SThierry Reding 	PWMF_REQUESTED = 1 << 0,
9709a7e4a3SBoris Brezillon 	PWMF_EXPORTED = 1 << 1,
98f051c466SThierry Reding };
99f051c466SThierry Reding 
10043a276b0SBoris Brezillon /*
10143a276b0SBoris Brezillon  * struct pwm_state - state of a PWM channel
10243a276b0SBoris Brezillon  * @period: PWM period (in nanoseconds)
10343a276b0SBoris Brezillon  * @duty_cycle: PWM duty cycle (in nanoseconds)
10443a276b0SBoris Brezillon  * @polarity: PWM polarity
10509a7e4a3SBoris Brezillon  * @enabled: PWM enabled status
10643a276b0SBoris Brezillon  */
10743a276b0SBoris Brezillon struct pwm_state {
10843a276b0SBoris Brezillon 	unsigned int period;
10943a276b0SBoris Brezillon 	unsigned int duty_cycle;
11043a276b0SBoris Brezillon 	enum pwm_polarity polarity;
11109a7e4a3SBoris Brezillon 	bool enabled;
11243a276b0SBoris Brezillon };
11343a276b0SBoris Brezillon 
11404883802SThierry Reding /**
11504883802SThierry Reding  * struct pwm_device - PWM channel object
11604883802SThierry Reding  * @label: name of the PWM device
11704883802SThierry Reding  * @flags: flags associated with the PWM device
11804883802SThierry Reding  * @hwpwm: per-chip relative index of the PWM device
11904883802SThierry Reding  * @pwm: global index of the PWM device
12004883802SThierry Reding  * @chip: PWM chip providing this PWM device
12104883802SThierry Reding  * @chip_data: chip-private data associated with the PWM device
122e39c0df1SBoris Brezillon  * @args: PWM arguments
12343a276b0SBoris Brezillon  * @state: curent PWM channel state
12404883802SThierry Reding  */
125f051c466SThierry Reding struct pwm_device {
126f051c466SThierry Reding 	const char *label;
127f051c466SThierry Reding 	unsigned long flags;
128f051c466SThierry Reding 	unsigned int hwpwm;
129f051c466SThierry Reding 	unsigned int pwm;
130f051c466SThierry Reding 	struct pwm_chip *chip;
131f051c466SThierry Reding 	void *chip_data;
132f051c466SThierry Reding 
133e39c0df1SBoris Brezillon 	struct pwm_args args;
13443a276b0SBoris Brezillon 	struct pwm_state state;
135f051c466SThierry Reding };
136f051c466SThierry Reding 
13743a276b0SBoris Brezillon /**
13843a276b0SBoris Brezillon  * pwm_get_state() - retrieve the current PWM state
13943a276b0SBoris Brezillon  * @pwm: PWM device
14043a276b0SBoris Brezillon  * @state: state to fill with the current PWM state
14143a276b0SBoris Brezillon  */
14243a276b0SBoris Brezillon static inline void pwm_get_state(const struct pwm_device *pwm,
14343a276b0SBoris Brezillon 				 struct pwm_state *state)
14443a276b0SBoris Brezillon {
14543a276b0SBoris Brezillon 	*state = pwm->state;
14643a276b0SBoris Brezillon }
14743a276b0SBoris Brezillon 
1485c31252cSBoris Brezillon static inline bool pwm_is_enabled(const struct pwm_device *pwm)
1495c31252cSBoris Brezillon {
15009a7e4a3SBoris Brezillon 	struct pwm_state state;
15109a7e4a3SBoris Brezillon 
15209a7e4a3SBoris Brezillon 	pwm_get_state(pwm, &state);
15309a7e4a3SBoris Brezillon 
15409a7e4a3SBoris Brezillon 	return state.enabled;
1555c31252cSBoris Brezillon }
1565c31252cSBoris Brezillon 
157f051c466SThierry Reding static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period)
158f051c466SThierry Reding {
159f051c466SThierry Reding 	if (pwm)
16043a276b0SBoris Brezillon 		pwm->state.period = period;
161f051c466SThierry Reding }
162f051c466SThierry Reding 
163a1cf4217SBoris Brezillon static inline unsigned int pwm_get_period(const struct pwm_device *pwm)
164f051c466SThierry Reding {
16543a276b0SBoris Brezillon 	struct pwm_state state;
16643a276b0SBoris Brezillon 
16743a276b0SBoris Brezillon 	pwm_get_state(pwm, &state);
16843a276b0SBoris Brezillon 
16943a276b0SBoris Brezillon 	return state.period;
170f051c466SThierry Reding }
171f051c466SThierry Reding 
17276abbddeSH Hartley Sweeten static inline void pwm_set_duty_cycle(struct pwm_device *pwm, unsigned int duty)
17376abbddeSH Hartley Sweeten {
17476abbddeSH Hartley Sweeten 	if (pwm)
17543a276b0SBoris Brezillon 		pwm->state.duty_cycle = duty;
17676abbddeSH Hartley Sweeten }
17776abbddeSH Hartley Sweeten 
178a1cf4217SBoris Brezillon static inline unsigned int pwm_get_duty_cycle(const struct pwm_device *pwm)
17976abbddeSH Hartley Sweeten {
18043a276b0SBoris Brezillon 	struct pwm_state state;
18143a276b0SBoris Brezillon 
18243a276b0SBoris Brezillon 	pwm_get_state(pwm, &state);
18343a276b0SBoris Brezillon 
18443a276b0SBoris Brezillon 	return state.duty_cycle;
18576abbddeSH Hartley Sweeten }
18676abbddeSH Hartley Sweeten 
1870aa0869cSPhilip, Avinash /*
1880aa0869cSPhilip, Avinash  * pwm_set_polarity - configure the polarity of a PWM signal
1890aa0869cSPhilip, Avinash  */
1900aa0869cSPhilip, Avinash int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity);
1910aa0869cSPhilip, Avinash 
192011e7631SBoris Brezillon static inline enum pwm_polarity pwm_get_polarity(const struct pwm_device *pwm)
193011e7631SBoris Brezillon {
19443a276b0SBoris Brezillon 	struct pwm_state state;
19543a276b0SBoris Brezillon 
19643a276b0SBoris Brezillon 	pwm_get_state(pwm, &state);
19743a276b0SBoris Brezillon 
19843a276b0SBoris Brezillon 	return state.polarity;
199011e7631SBoris Brezillon }
200011e7631SBoris Brezillon 
201e39c0df1SBoris Brezillon static inline void pwm_get_args(const struct pwm_device *pwm,
202e39c0df1SBoris Brezillon 				struct pwm_args *args)
203e39c0df1SBoris Brezillon {
204e39c0df1SBoris Brezillon 	*args = pwm->args;
205e39c0df1SBoris Brezillon }
206e39c0df1SBoris Brezillon 
207e39c0df1SBoris Brezillon static inline void pwm_apply_args(struct pwm_device *pwm)
208e39c0df1SBoris Brezillon {
209*15fa8a43SBoris Brezillon 	/*
210*15fa8a43SBoris Brezillon 	 * PWM users calling pwm_apply_args() expect to have a fresh config
211*15fa8a43SBoris Brezillon 	 * where the polarity and period are set according to pwm_args info.
212*15fa8a43SBoris Brezillon 	 * The problem is, polarity can only be changed when the PWM is
213*15fa8a43SBoris Brezillon 	 * disabled.
214*15fa8a43SBoris Brezillon 	 *
215*15fa8a43SBoris Brezillon 	 * PWM drivers supporting hardware readout may declare the PWM device
216*15fa8a43SBoris Brezillon 	 * as enabled, and prevent polarity setting, which changes from the
217*15fa8a43SBoris Brezillon 	 * existing behavior, where all PWM devices are declared as disabled
218*15fa8a43SBoris Brezillon 	 * at startup (even if they are actually enabled), thus authorizing
219*15fa8a43SBoris Brezillon 	 * polarity setting.
220*15fa8a43SBoris Brezillon 	 *
221*15fa8a43SBoris Brezillon 	 * Instead of setting ->enabled to false, we call pwm_disable()
222*15fa8a43SBoris Brezillon 	 * before pwm_set_polarity() to ensure that everything is configured
223*15fa8a43SBoris Brezillon 	 * as expected, and the PWM is really disabled when the user request
224*15fa8a43SBoris Brezillon 	 * it.
225*15fa8a43SBoris Brezillon 	 *
226*15fa8a43SBoris Brezillon 	 * Note that PWM users requiring a smooth handover between the
227*15fa8a43SBoris Brezillon 	 * bootloader and the kernel (like critical regulators controlled by
228*15fa8a43SBoris Brezillon 	 * PWM devices) will have to switch to the atomic API and avoid calling
229*15fa8a43SBoris Brezillon 	 * pwm_apply_args().
230*15fa8a43SBoris Brezillon 	 */
231*15fa8a43SBoris Brezillon 	pwm_disable(pwm);
232e39c0df1SBoris Brezillon 	pwm_set_polarity(pwm, pwm->args.polarity);
233e39c0df1SBoris Brezillon }
234e39c0df1SBoris Brezillon 
2350c2498f1SSascha Hauer /**
2360c2498f1SSascha Hauer  * struct pwm_ops - PWM controller operations
2370c2498f1SSascha Hauer  * @request: optional hook for requesting a PWM
2380c2498f1SSascha Hauer  * @free: optional hook for freeing a PWM
2390c2498f1SSascha Hauer  * @config: configure duty cycles and period length for this PWM
2400aa0869cSPhilip, Avinash  * @set_polarity: configure the polarity of this PWM
2410c2498f1SSascha Hauer  * @enable: enable PWM output toggling
2420c2498f1SSascha Hauer  * @disable: disable PWM output toggling
243*15fa8a43SBoris Brezillon  * @get_state: get the current PWM state. This function is only
244*15fa8a43SBoris Brezillon  *	       called once per PWM device when the PWM chip is
245*15fa8a43SBoris Brezillon  *	       registered.
24662099abfSThierry Reding  * @dbg_show: optional routine to show contents in debugfs
2470c2498f1SSascha Hauer  * @owner: helps prevent removal of modules exporting active PWMs
2480c2498f1SSascha Hauer  */
2490c2498f1SSascha Hauer struct pwm_ops {
2506bc7064aSThierry Reding 	int (*request)(struct pwm_chip *chip, struct pwm_device *pwm);
2516bc7064aSThierry Reding 	void (*free)(struct pwm_chip *chip, struct pwm_device *pwm);
2526bc7064aSThierry Reding 	int (*config)(struct pwm_chip *chip, struct pwm_device *pwm,
253f051c466SThierry Reding 		      int duty_ns, int period_ns);
2546bc7064aSThierry Reding 	int (*set_polarity)(struct pwm_chip *chip, struct pwm_device *pwm,
2550aa0869cSPhilip, Avinash 			    enum pwm_polarity polarity);
2566bc7064aSThierry Reding 	int (*enable)(struct pwm_chip *chip, struct pwm_device *pwm);
2576bc7064aSThierry Reding 	void (*disable)(struct pwm_chip *chip, struct pwm_device *pwm);
258*15fa8a43SBoris Brezillon 	void (*get_state)(struct pwm_chip *chip, struct pwm_device *pwm,
259*15fa8a43SBoris Brezillon 			  struct pwm_state *state);
26062099abfSThierry Reding #ifdef CONFIG_DEBUG_FS
2616bc7064aSThierry Reding 	void (*dbg_show)(struct pwm_chip *chip, struct seq_file *s);
26262099abfSThierry Reding #endif
2630c2498f1SSascha Hauer 	struct module *owner;
2640c2498f1SSascha Hauer };
2650c2498f1SSascha Hauer 
2660c2498f1SSascha Hauer /**
267f051c466SThierry Reding  * struct pwm_chip - abstract a PWM controller
268f051c466SThierry Reding  * @dev: device providing the PWMs
269f051c466SThierry Reding  * @list: list node for internal use
270f051c466SThierry Reding  * @ops: callbacks for this PWM controller
271f051c466SThierry Reding  * @base: number of first PWM controlled by this chip
272f051c466SThierry Reding  * @npwm: number of PWMs controlled by this chip
273f051c466SThierry Reding  * @pwms: array of PWM devices allocated by the framework
27404883802SThierry Reding  * @of_xlate: request a PWM device given a device tree PWM specifier
27504883802SThierry Reding  * @of_pwm_n_cells: number of cells expected in the device tree PWM specifier
2766e69ab13SFlorian Vaussard  * @can_sleep: must be true if the .config(), .enable() or .disable()
2776e69ab13SFlorian Vaussard  *             operations may sleep
2780c2498f1SSascha Hauer  */
2790c2498f1SSascha Hauer struct pwm_chip {
280f051c466SThierry Reding 	struct device *dev;
281f051c466SThierry Reding 	struct list_head list;
282f051c466SThierry Reding 	const struct pwm_ops *ops;
283f051c466SThierry Reding 	int base;
284f051c466SThierry Reding 	unsigned int npwm;
285f051c466SThierry Reding 
286f051c466SThierry Reding 	struct pwm_device *pwms;
2877299ab70SThierry Reding 
2887299ab70SThierry Reding 	struct pwm_device * (*of_xlate)(struct pwm_chip *pc,
2897299ab70SThierry Reding 					const struct of_phandle_args *args);
2907299ab70SThierry Reding 	unsigned int of_pwm_n_cells;
2916e69ab13SFlorian Vaussard 	bool can_sleep;
2920c2498f1SSascha Hauer };
2930c2498f1SSascha Hauer 
2940bcf168bSTushar Behera #if IS_ENABLED(CONFIG_PWM)
295f051c466SThierry Reding int pwm_set_chip_data(struct pwm_device *pwm, void *data);
296f051c466SThierry Reding void *pwm_get_chip_data(struct pwm_device *pwm);
297f051c466SThierry Reding 
298b6a00faeSTim Kryger int pwmchip_add_with_polarity(struct pwm_chip *chip,
299b6a00faeSTim Kryger 			      enum pwm_polarity polarity);
3000c2498f1SSascha Hauer int pwmchip_add(struct pwm_chip *chip);
3010c2498f1SSascha Hauer int pwmchip_remove(struct pwm_chip *chip);
302f051c466SThierry Reding struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,
303f051c466SThierry Reding 					 unsigned int index,
304f051c466SThierry Reding 					 const char *label);
3058138d2ddSThierry Reding 
30683af2402SPhilip, Avinash struct pwm_device *of_pwm_xlate_with_flags(struct pwm_chip *pc,
30783af2402SPhilip, Avinash 		const struct of_phandle_args *args);
30883af2402SPhilip, Avinash 
309d4c0c470SPeter Ujfalusi struct pwm_device *pwm_get(struct device *dev, const char *con_id);
3108eb96127SPeter Ujfalusi struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id);
3118138d2ddSThierry Reding void pwm_put(struct pwm_device *pwm);
3128138d2ddSThierry Reding 
313d4c0c470SPeter Ujfalusi struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id);
314261a5eddSPeter Ujfalusi struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np,
315261a5eddSPeter Ujfalusi 				   const char *con_id);
3166354316dSAlexandre Courbot void devm_pwm_put(struct device *dev, struct pwm_device *pwm);
3176e69ab13SFlorian Vaussard 
3186e69ab13SFlorian Vaussard bool pwm_can_sleep(struct pwm_device *pwm);
3190bcf168bSTushar Behera #else
3200bcf168bSTushar Behera static inline int pwm_set_chip_data(struct pwm_device *pwm, void *data)
3210bcf168bSTushar Behera {
3220bcf168bSTushar Behera 	return -EINVAL;
3230bcf168bSTushar Behera }
3240bcf168bSTushar Behera 
3250bcf168bSTushar Behera static inline void *pwm_get_chip_data(struct pwm_device *pwm)
3260bcf168bSTushar Behera {
3270bcf168bSTushar Behera 	return NULL;
3280bcf168bSTushar Behera }
3290bcf168bSTushar Behera 
3300bcf168bSTushar Behera static inline int pwmchip_add(struct pwm_chip *chip)
3310bcf168bSTushar Behera {
3320bcf168bSTushar Behera 	return -EINVAL;
3330bcf168bSTushar Behera }
3340bcf168bSTushar Behera 
335b6a00faeSTim Kryger static inline int pwmchip_add_inversed(struct pwm_chip *chip)
336b6a00faeSTim Kryger {
337b6a00faeSTim Kryger 	return -EINVAL;
338b6a00faeSTim Kryger }
339b6a00faeSTim Kryger 
3400bcf168bSTushar Behera static inline int pwmchip_remove(struct pwm_chip *chip)
3410bcf168bSTushar Behera {
3420bcf168bSTushar Behera 	return -EINVAL;
3430bcf168bSTushar Behera }
3440bcf168bSTushar Behera 
3450bcf168bSTushar Behera static inline struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,
3460bcf168bSTushar Behera 						       unsigned int index,
3470bcf168bSTushar Behera 						       const char *label)
3480bcf168bSTushar Behera {
3490bcf168bSTushar Behera 	return ERR_PTR(-ENODEV);
3500bcf168bSTushar Behera }
3510bcf168bSTushar Behera 
3520bcf168bSTushar Behera static inline struct pwm_device *pwm_get(struct device *dev,
3530bcf168bSTushar Behera 					 const char *consumer)
3540bcf168bSTushar Behera {
3550bcf168bSTushar Behera 	return ERR_PTR(-ENODEV);
3560bcf168bSTushar Behera }
3570bcf168bSTushar Behera 
3588eb96127SPeter Ujfalusi static inline struct pwm_device *of_pwm_get(struct device_node *np,
3598eb96127SPeter Ujfalusi 					    const char *con_id)
3608eb96127SPeter Ujfalusi {
3618eb96127SPeter Ujfalusi 	return ERR_PTR(-ENODEV);
3628eb96127SPeter Ujfalusi }
3638eb96127SPeter Ujfalusi 
3640bcf168bSTushar Behera static inline void pwm_put(struct pwm_device *pwm)
3650bcf168bSTushar Behera {
3660bcf168bSTushar Behera }
3670bcf168bSTushar Behera 
3680bcf168bSTushar Behera static inline struct pwm_device *devm_pwm_get(struct device *dev,
3690bcf168bSTushar Behera 					      const char *consumer)
3700bcf168bSTushar Behera {
3710bcf168bSTushar Behera 	return ERR_PTR(-ENODEV);
3720bcf168bSTushar Behera }
3730bcf168bSTushar Behera 
374261a5eddSPeter Ujfalusi static inline struct pwm_device *devm_of_pwm_get(struct device *dev,
375261a5eddSPeter Ujfalusi 						 struct device_node *np,
376261a5eddSPeter Ujfalusi 						 const char *con_id)
377261a5eddSPeter Ujfalusi {
378261a5eddSPeter Ujfalusi 	return ERR_PTR(-ENODEV);
379261a5eddSPeter Ujfalusi }
380261a5eddSPeter Ujfalusi 
3810bcf168bSTushar Behera static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm)
3820bcf168bSTushar Behera {
3830bcf168bSTushar Behera }
3846e69ab13SFlorian Vaussard 
3856e69ab13SFlorian Vaussard static inline bool pwm_can_sleep(struct pwm_device *pwm)
3866e69ab13SFlorian Vaussard {
3876e69ab13SFlorian Vaussard 	return false;
3886e69ab13SFlorian Vaussard }
3890bcf168bSTushar Behera #endif
3906354316dSAlexandre Courbot 
3918138d2ddSThierry Reding struct pwm_lookup {
3928138d2ddSThierry Reding 	struct list_head list;
3938138d2ddSThierry Reding 	const char *provider;
3948138d2ddSThierry Reding 	unsigned int index;
3958138d2ddSThierry Reding 	const char *dev_id;
3968138d2ddSThierry Reding 	const char *con_id;
3973796ce1dSAlexandre Belloni 	unsigned int period;
3983796ce1dSAlexandre Belloni 	enum pwm_polarity polarity;
3998138d2ddSThierry Reding };
4008138d2ddSThierry Reding 
40142844029SAlexandre Belloni #define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \
4028138d2ddSThierry Reding 	{						\
4038138d2ddSThierry Reding 		.provider = _provider,			\
4048138d2ddSThierry Reding 		.index = _index,			\
4058138d2ddSThierry Reding 		.dev_id = _dev_id,			\
4068138d2ddSThierry Reding 		.con_id = _con_id,			\
40742844029SAlexandre Belloni 		.period = _period,			\
40842844029SAlexandre Belloni 		.polarity = _polarity			\
4098138d2ddSThierry Reding 	}
4108138d2ddSThierry Reding 
4110bcf168bSTushar Behera #if IS_ENABLED(CONFIG_PWM)
4128138d2ddSThierry Reding void pwm_add_table(struct pwm_lookup *table, size_t num);
413efb0de55SShobhit Kumar void pwm_remove_table(struct pwm_lookup *table, size_t num);
4140bcf168bSTushar Behera #else
4150bcf168bSTushar Behera static inline void pwm_add_table(struct pwm_lookup *table, size_t num)
4160bcf168bSTushar Behera {
4170bcf168bSTushar Behera }
418efb0de55SShobhit Kumar 
419efb0de55SShobhit Kumar static inline void pwm_remove_table(struct pwm_lookup *table, size_t num)
420efb0de55SShobhit Kumar {
421efb0de55SShobhit Kumar }
4220c2498f1SSascha Hauer #endif
4230c2498f1SSascha Hauer 
42476abbddeSH Hartley Sweeten #ifdef CONFIG_PWM_SYSFS
42576abbddeSH Hartley Sweeten void pwmchip_sysfs_export(struct pwm_chip *chip);
42676abbddeSH Hartley Sweeten void pwmchip_sysfs_unexport(struct pwm_chip *chip);
42776abbddeSH Hartley Sweeten #else
42876abbddeSH Hartley Sweeten static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
42976abbddeSH Hartley Sweeten {
43076abbddeSH Hartley Sweeten }
43176abbddeSH Hartley Sweeten 
43276abbddeSH Hartley Sweeten static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip)
43376abbddeSH Hartley Sweeten {
43476abbddeSH Hartley Sweeten }
43576abbddeSH Hartley Sweeten #endif /* CONFIG_PWM_SYSFS */
43676abbddeSH Hartley Sweeten 
4375243ef8bSMark Vels #endif /* __LINUX_PWM_H */
438