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