xref: /linux-6.15/include/linux/pwm.h (revision 7299ab70)
11a189b97SRussell King #ifndef __LINUX_PWM_H
21a189b97SRussell King #define __LINUX_PWM_H
31a189b97SRussell King 
4*7299ab70SThierry Reding #include <linux/of.h>
5*7299ab70SThierry Reding 
61a189b97SRussell King struct pwm_device;
762099abfSThierry Reding struct seq_file;
81a189b97SRussell King 
91a189b97SRussell King /*
101a189b97SRussell King  * pwm_request - request a PWM device
111a189b97SRussell King  */
121a189b97SRussell King struct pwm_device *pwm_request(int pwm_id, const char *label);
131a189b97SRussell King 
141a189b97SRussell King /*
151a189b97SRussell King  * pwm_free - free a PWM device
161a189b97SRussell King  */
171a189b97SRussell King void pwm_free(struct pwm_device *pwm);
181a189b97SRussell King 
191a189b97SRussell King /*
201a189b97SRussell King  * pwm_config - change a PWM device configuration
211a189b97SRussell King  */
221a189b97SRussell King int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
231a189b97SRussell King 
241a189b97SRussell King /*
251a189b97SRussell King  * pwm_enable - start a PWM output toggling
261a189b97SRussell King  */
271a189b97SRussell King int pwm_enable(struct pwm_device *pwm);
281a189b97SRussell King 
291a189b97SRussell King /*
301a189b97SRussell King  * pwm_disable - stop a PWM output toggling
311a189b97SRussell King  */
321a189b97SRussell King void pwm_disable(struct pwm_device *pwm);
331a189b97SRussell King 
340c2498f1SSascha Hauer #ifdef CONFIG_PWM
350c2498f1SSascha Hauer struct pwm_chip;
360c2498f1SSascha Hauer 
37f051c466SThierry Reding enum {
38f051c466SThierry Reding 	PWMF_REQUESTED = 1 << 0,
39f051c466SThierry Reding 	PWMF_ENABLED = 1 << 1,
40f051c466SThierry Reding };
41f051c466SThierry Reding 
42f051c466SThierry Reding struct pwm_device {
43f051c466SThierry Reding 	const char		*label;
44f051c466SThierry Reding 	unsigned long		flags;
45f051c466SThierry Reding 	unsigned int		hwpwm;
46f051c466SThierry Reding 	unsigned int		pwm;
47f051c466SThierry Reding 	struct pwm_chip		*chip;
48f051c466SThierry Reding 	void			*chip_data;
49f051c466SThierry Reding 
50f051c466SThierry Reding 	unsigned int		period; /* in nanoseconds */
51f051c466SThierry Reding };
52f051c466SThierry Reding 
53f051c466SThierry Reding static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period)
54f051c466SThierry Reding {
55f051c466SThierry Reding 	if (pwm)
56f051c466SThierry Reding 		pwm->period = period;
57f051c466SThierry Reding }
58f051c466SThierry Reding 
59f051c466SThierry Reding static inline unsigned int pwm_get_period(struct pwm_device *pwm)
60f051c466SThierry Reding {
61f051c466SThierry Reding 	return pwm ? pwm->period : 0;
62f051c466SThierry Reding }
63f051c466SThierry Reding 
640c2498f1SSascha Hauer /**
650c2498f1SSascha Hauer  * struct pwm_ops - PWM controller operations
660c2498f1SSascha Hauer  * @request: optional hook for requesting a PWM
670c2498f1SSascha Hauer  * @free: optional hook for freeing a PWM
680c2498f1SSascha Hauer  * @config: configure duty cycles and period length for this PWM
690c2498f1SSascha Hauer  * @enable: enable PWM output toggling
700c2498f1SSascha Hauer  * @disable: disable PWM output toggling
7162099abfSThierry Reding  * @dbg_show: optional routine to show contents in debugfs
720c2498f1SSascha Hauer  * @owner: helps prevent removal of modules exporting active PWMs
730c2498f1SSascha Hauer  */
740c2498f1SSascha Hauer struct pwm_ops {
75f051c466SThierry Reding 	int			(*request)(struct pwm_chip *chip,
76f051c466SThierry Reding 					   struct pwm_device *pwm);
77f051c466SThierry Reding 	void			(*free)(struct pwm_chip *chip,
78f051c466SThierry Reding 					struct pwm_device *pwm);
79f051c466SThierry Reding 	int			(*config)(struct pwm_chip *chip,
80f051c466SThierry Reding 					  struct pwm_device *pwm,
81f051c466SThierry Reding 					  int duty_ns, int period_ns);
82f051c466SThierry Reding 	int			(*enable)(struct pwm_chip *chip,
83f051c466SThierry Reding 					  struct pwm_device *pwm);
84f051c466SThierry Reding 	void			(*disable)(struct pwm_chip *chip,
85f051c466SThierry Reding 					   struct pwm_device *pwm);
8662099abfSThierry Reding #ifdef CONFIG_DEBUG_FS
8762099abfSThierry Reding 	void			(*dbg_show)(struct pwm_chip *chip,
8862099abfSThierry Reding 					    struct seq_file *s);
8962099abfSThierry Reding #endif
900c2498f1SSascha Hauer 	struct module		*owner;
910c2498f1SSascha Hauer };
920c2498f1SSascha Hauer 
930c2498f1SSascha Hauer /**
94f051c466SThierry Reding  * struct pwm_chip - abstract a PWM controller
95f051c466SThierry Reding  * @dev: device providing the PWMs
96f051c466SThierry Reding  * @list: list node for internal use
97f051c466SThierry Reding  * @ops: callbacks for this PWM controller
98f051c466SThierry Reding  * @base: number of first PWM controlled by this chip
99f051c466SThierry Reding  * @npwm: number of PWMs controlled by this chip
100f051c466SThierry Reding  * @pwms: array of PWM devices allocated by the framework
1010c2498f1SSascha Hauer  */
1020c2498f1SSascha Hauer struct pwm_chip {
103f051c466SThierry Reding 	struct device		*dev;
104f051c466SThierry Reding 	struct list_head	list;
105f051c466SThierry Reding 	const struct pwm_ops	*ops;
106f051c466SThierry Reding 	int			base;
107f051c466SThierry Reding 	unsigned int		npwm;
108f051c466SThierry Reding 
109f051c466SThierry Reding 	struct pwm_device	*pwms;
110*7299ab70SThierry Reding 
111*7299ab70SThierry Reding 	struct pwm_device *	(*of_xlate)(struct pwm_chip *pc,
112*7299ab70SThierry Reding 					    const struct of_phandle_args *args);
113*7299ab70SThierry Reding 	unsigned int		of_pwm_n_cells;
1140c2498f1SSascha Hauer };
1150c2498f1SSascha Hauer 
116f051c466SThierry Reding int pwm_set_chip_data(struct pwm_device *pwm, void *data);
117f051c466SThierry Reding void *pwm_get_chip_data(struct pwm_device *pwm);
118f051c466SThierry Reding 
1190c2498f1SSascha Hauer int pwmchip_add(struct pwm_chip *chip);
1200c2498f1SSascha Hauer int pwmchip_remove(struct pwm_chip *chip);
121f051c466SThierry Reding struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,
122f051c466SThierry Reding 					 unsigned int index,
123f051c466SThierry Reding 					 const char *label);
1248138d2ddSThierry Reding 
1258138d2ddSThierry Reding struct pwm_device *pwm_get(struct device *dev, const char *consumer);
1268138d2ddSThierry Reding void pwm_put(struct pwm_device *pwm);
1278138d2ddSThierry Reding 
1288138d2ddSThierry Reding struct pwm_lookup {
1298138d2ddSThierry Reding 	struct list_head list;
1308138d2ddSThierry Reding 	const char *provider;
1318138d2ddSThierry Reding 	unsigned int index;
1328138d2ddSThierry Reding 	const char *dev_id;
1338138d2ddSThierry Reding 	const char *con_id;
1348138d2ddSThierry Reding };
1358138d2ddSThierry Reding 
1368138d2ddSThierry Reding #define PWM_LOOKUP(_provider, _index, _dev_id, _con_id)	\
1378138d2ddSThierry Reding 	{						\
1388138d2ddSThierry Reding 		.provider = _provider,			\
1398138d2ddSThierry Reding 		.index = _index,			\
1408138d2ddSThierry Reding 		.dev_id = _dev_id,			\
1418138d2ddSThierry Reding 		.con_id = _con_id,			\
1428138d2ddSThierry Reding 	}
1438138d2ddSThierry Reding 
1448138d2ddSThierry Reding void pwm_add_table(struct pwm_lookup *table, size_t num);
1458138d2ddSThierry Reding 
1460c2498f1SSascha Hauer #endif
1470c2498f1SSascha Hauer 
1485243ef8bSMark Vels #endif /* __LINUX_PWM_H */
149