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