11a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King#ifndef __LINUX_PWM_H 21a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King#define __LINUX_PWM_H 31a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King 40bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#include <linux/err.h> 57299ab70e68e20e70cb45fe4ab4b6029fe964acdThierry Reding#include <linux/of.h> 67299ab70e68e20e70cb45fe4ab4b6029fe964acdThierry Reding 71a189b97190d3f0f8cf0379a799d3555b2d648bbRussell Kingstruct pwm_device; 862099abf67a20cfb98d4c031fb1925e10a78ee1bThierry Redingstruct seq_file; 91a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King 10557fe99d9d490fe01c7aa87494313078c4ff939cSascha Hauer#if IS_ENABLED(CONFIG_PWM) 111a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King/* 121a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King * pwm_request - request a PWM device 131a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King */ 141a189b97190d3f0f8cf0379a799d3555b2d648bbRussell Kingstruct pwm_device *pwm_request(int pwm_id, const char *label); 151a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King 161a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King/* 171a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King * pwm_free - free a PWM device 181a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King */ 191a189b97190d3f0f8cf0379a799d3555b2d648bbRussell Kingvoid pwm_free(struct pwm_device *pwm); 201a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King 211a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King/* 221a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King * pwm_config - change a PWM device configuration 231a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King */ 241a189b97190d3f0f8cf0379a799d3555b2d648bbRussell Kingint pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns); 251a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King 261a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King/* 271a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King * pwm_enable - start a PWM output toggling 281a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King */ 291a189b97190d3f0f8cf0379a799d3555b2d648bbRussell Kingint pwm_enable(struct pwm_device *pwm); 301a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King 311a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King/* 321a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King * pwm_disable - stop a PWM output toggling 331a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King */ 341a189b97190d3f0f8cf0379a799d3555b2d648bbRussell Kingvoid pwm_disable(struct pwm_device *pwm); 350bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#else 360bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline struct pwm_device *pwm_request(int pwm_id, const char *label) 370bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 380bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return ERR_PTR(-ENODEV); 390bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 400bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 410bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline void pwm_free(struct pwm_device *pwm) 420bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 430bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 440bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 450bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) 460bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 470bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return -EINVAL; 480bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 490bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 500bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline int pwm_enable(struct pwm_device *pwm) 510bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 520bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return -EINVAL; 530bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 540bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 550bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline void pwm_disable(struct pwm_device *pwm) 560bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 570bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 580bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#endif 591a189b97190d3f0f8cf0379a799d3555b2d648bbRussell King 600c2498f1660878339350bea8d18550b1b87ca055Sascha Hauerstruct pwm_chip; 610c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer 620aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash/** 630aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * enum pwm_polarity - polarity of a PWM signal 640aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * @PWM_POLARITY_NORMAL: a high signal for the duration of the duty- 650aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * cycle, followed by a low signal for the remainder of the pulse 660aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * period 670aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * @PWM_POLARITY_INVERSED: a low signal for the duration of the duty- 680aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * cycle, followed by a high signal for the remainder of the pulse 690aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * period 700aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash */ 710aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinashenum pwm_polarity { 720aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash PWM_POLARITY_NORMAL, 730aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash PWM_POLARITY_INVERSED, 740aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash}; 750aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash 76f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Redingenum { 77f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding PWMF_REQUESTED = 1 << 0, 78f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding PWMF_ENABLED = 1 << 1, 7976abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten PWMF_EXPORTED = 1 << 2, 80f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding}; 81f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding 82f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Redingstruct pwm_device { 83f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding const char *label; 84f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding unsigned long flags; 85f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding unsigned int hwpwm; 86f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding unsigned int pwm; 87f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct pwm_chip *chip; 88f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding void *chip_data; 89f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding 9076abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten unsigned int period; /* in nanoseconds */ 9176abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten unsigned int duty_cycle; /* in nanoseconds */ 9276abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten enum pwm_polarity polarity; 93f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding}; 94f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding 95f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Redingstatic inline void pwm_set_period(struct pwm_device *pwm, unsigned int period) 96f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding{ 97f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding if (pwm) 98f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding pwm->period = period; 99f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding} 100f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding 101f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Redingstatic inline unsigned int pwm_get_period(struct pwm_device *pwm) 102f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding{ 103f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding return pwm ? pwm->period : 0; 104f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding} 105f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding 10676abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweetenstatic inline void pwm_set_duty_cycle(struct pwm_device *pwm, unsigned int duty) 10776abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten{ 10876abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten if (pwm) 10976abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten pwm->duty_cycle = duty; 11076abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten} 11176abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten 11276abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweetenstatic inline unsigned int pwm_get_duty_cycle(struct pwm_device *pwm) 11376abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten{ 11476abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten return pwm ? pwm->duty_cycle : 0; 11576abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten} 11676abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten 1170aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash/* 1180aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * pwm_set_polarity - configure the polarity of a PWM signal 1190aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash */ 1200aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinashint pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity); 1210aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash 1220c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer/** 1230c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer * struct pwm_ops - PWM controller operations 1240c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer * @request: optional hook for requesting a PWM 1250c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer * @free: optional hook for freeing a PWM 1260c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer * @config: configure duty cycles and period length for this PWM 1270aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash * @set_polarity: configure the polarity of this PWM 1280c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer * @enable: enable PWM output toggling 1290c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer * @disable: disable PWM output toggling 13062099abf67a20cfb98d4c031fb1925e10a78ee1bThierry Reding * @dbg_show: optional routine to show contents in debugfs 1310c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer * @owner: helps prevent removal of modules exporting active PWMs 1320c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer */ 1330c2498f1660878339350bea8d18550b1b87ca055Sascha Hauerstruct pwm_ops { 134f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding int (*request)(struct pwm_chip *chip, 135f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct pwm_device *pwm); 136f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding void (*free)(struct pwm_chip *chip, 137f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct pwm_device *pwm); 138f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding int (*config)(struct pwm_chip *chip, 139f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct pwm_device *pwm, 140f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding int duty_ns, int period_ns); 1410aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash int (*set_polarity)(struct pwm_chip *chip, 1420aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash struct pwm_device *pwm, 1430aa0869c3c9b10338dd92a20fa4a9b6959f177b5Philip, Avinash enum pwm_polarity polarity); 144f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding int (*enable)(struct pwm_chip *chip, 145f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct pwm_device *pwm); 146f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding void (*disable)(struct pwm_chip *chip, 147f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct pwm_device *pwm); 14862099abf67a20cfb98d4c031fb1925e10a78ee1bThierry Reding#ifdef CONFIG_DEBUG_FS 14962099abf67a20cfb98d4c031fb1925e10a78ee1bThierry Reding void (*dbg_show)(struct pwm_chip *chip, 15062099abf67a20cfb98d4c031fb1925e10a78ee1bThierry Reding struct seq_file *s); 15162099abf67a20cfb98d4c031fb1925e10a78ee1bThierry Reding#endif 1520c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer struct module *owner; 1530c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer}; 1540c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer 1550c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer/** 156f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding * struct pwm_chip - abstract a PWM controller 157f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding * @dev: device providing the PWMs 158f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding * @list: list node for internal use 159f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding * @ops: callbacks for this PWM controller 160f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding * @base: number of first PWM controlled by this chip 161f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding * @npwm: number of PWMs controlled by this chip 162f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding * @pwms: array of PWM devices allocated by the framework 1636e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard * @can_sleep: must be true if the .config(), .enable() or .disable() 1646e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard * operations may sleep 1650c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer */ 1660c2498f1660878339350bea8d18550b1b87ca055Sascha Hauerstruct pwm_chip { 167f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct device *dev; 168f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct list_head list; 169f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding const struct pwm_ops *ops; 170f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding int base; 171f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding unsigned int npwm; 172f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding 173f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding struct pwm_device *pwms; 1747299ab70e68e20e70cb45fe4ab4b6029fe964acdThierry Reding 1757299ab70e68e20e70cb45fe4ab4b6029fe964acdThierry Reding struct pwm_device * (*of_xlate)(struct pwm_chip *pc, 1767299ab70e68e20e70cb45fe4ab4b6029fe964acdThierry Reding const struct of_phandle_args *args); 1777299ab70e68e20e70cb45fe4ab4b6029fe964acdThierry Reding unsigned int of_pwm_n_cells; 1786e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard bool can_sleep; 1790c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer}; 1800c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer 1810bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#if IS_ENABLED(CONFIG_PWM) 182f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Redingint pwm_set_chip_data(struct pwm_device *pwm, void *data); 183f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Redingvoid *pwm_get_chip_data(struct pwm_device *pwm); 184f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding 1850c2498f1660878339350bea8d18550b1b87ca055Sascha Hauerint pwmchip_add(struct pwm_chip *chip); 1860c2498f1660878339350bea8d18550b1b87ca055Sascha Hauerint pwmchip_remove(struct pwm_chip *chip); 187f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Redingstruct pwm_device *pwm_request_from_chip(struct pwm_chip *chip, 188f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding unsigned int index, 189f051c466cf690ac661d713d3ceb56b4efcecc853Thierry Reding const char *label); 1908138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding 19183af24027b3df1af5c5a9aa9adcdcfeb3429d3bePhilip, Avinashstruct pwm_device *of_pwm_xlate_with_flags(struct pwm_chip *pc, 19283af24027b3df1af5c5a9aa9adcdcfeb3429d3bePhilip, Avinash const struct of_phandle_args *args); 19383af24027b3df1af5c5a9aa9adcdcfeb3429d3bePhilip, Avinash 194d4c0c4705bef1134339b038872ece3705a2783e0Peter Ujfalusistruct pwm_device *pwm_get(struct device *dev, const char *con_id); 1958eb9612799605a7988d1c97cdc5980a5b8f04c56Peter Ujfalusistruct pwm_device *of_pwm_get(struct device_node *np, const char *con_id); 1968138d2ddbcca2a100482dac390133f83c5a60f94Thierry Redingvoid pwm_put(struct pwm_device *pwm); 1978138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding 198d4c0c4705bef1134339b038872ece3705a2783e0Peter Ujfalusistruct pwm_device *devm_pwm_get(struct device *dev, const char *con_id); 199261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusistruct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, 200261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusi const char *con_id); 2016354316dbe5a13b25bea15d7ffc891be025eb267Alexandre Courbotvoid devm_pwm_put(struct device *dev, struct pwm_device *pwm); 2026e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard 2036e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussardbool pwm_can_sleep(struct pwm_device *pwm); 2040bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#else 2050bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline int pwm_set_chip_data(struct pwm_device *pwm, void *data) 2060bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2070bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return -EINVAL; 2080bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2090bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 2100bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline void *pwm_get_chip_data(struct pwm_device *pwm) 2110bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2120bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return NULL; 2130bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2140bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 2150bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline int pwmchip_add(struct pwm_chip *chip) 2160bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2170bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return -EINVAL; 2180bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2190bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 2200bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline int pwmchip_remove(struct pwm_chip *chip) 2210bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2220bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return -EINVAL; 2230bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2240bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 2250bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip, 2260bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera unsigned int index, 2270bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera const char *label) 2280bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2290bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return ERR_PTR(-ENODEV); 2300bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2310bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 2320bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline struct pwm_device *pwm_get(struct device *dev, 2330bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera const char *consumer) 2340bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2350bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return ERR_PTR(-ENODEV); 2360bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2370bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 2388eb9612799605a7988d1c97cdc5980a5b8f04c56Peter Ujfalusistatic inline struct pwm_device *of_pwm_get(struct device_node *np, 2398eb9612799605a7988d1c97cdc5980a5b8f04c56Peter Ujfalusi const char *con_id) 2408eb9612799605a7988d1c97cdc5980a5b8f04c56Peter Ujfalusi{ 2418eb9612799605a7988d1c97cdc5980a5b8f04c56Peter Ujfalusi return ERR_PTR(-ENODEV); 2428eb9612799605a7988d1c97cdc5980a5b8f04c56Peter Ujfalusi} 2438eb9612799605a7988d1c97cdc5980a5b8f04c56Peter Ujfalusi 2440bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline void pwm_put(struct pwm_device *pwm) 2450bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2460bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2470bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 2480bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline struct pwm_device *devm_pwm_get(struct device *dev, 2490bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera const char *consumer) 2500bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2510bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera return ERR_PTR(-ENODEV); 2520bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2530bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera 254261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusistatic inline struct pwm_device *devm_of_pwm_get(struct device *dev, 255261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusi struct device_node *np, 256261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusi const char *con_id) 257261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusi{ 258261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusi return ERR_PTR(-ENODEV); 259261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusi} 260261a5edd3ac77ecb4b33310a1dd1ed8d656f0569Peter Ujfalusi 2610bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm) 2620bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2630bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2646e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard 2656e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussardstatic inline bool pwm_can_sleep(struct pwm_device *pwm) 2666e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard{ 2676e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard return false; 2686e69ab1361c44e3ee1398158b56d114b1aef8179Florian Vaussard} 2690bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#endif 2706354316dbe5a13b25bea15d7ffc891be025eb267Alexandre Courbot 2718138d2ddbcca2a100482dac390133f83c5a60f94Thierry Redingstruct pwm_lookup { 2728138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding struct list_head list; 2738138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding const char *provider; 2748138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding unsigned int index; 2758138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding const char *dev_id; 2768138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding const char *con_id; 2773796ce1d4d4b330a75005c5eda105603ce9d4071Alexandre Belloni unsigned int period; 2783796ce1d4d4b330a75005c5eda105603ce9d4071Alexandre Belloni enum pwm_polarity polarity; 2798138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding}; 2808138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding 2814284402924cc55e182008ca7e9d4fb1e891ff5aeAlexandre Belloni#define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \ 2828138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding { \ 2838138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding .provider = _provider, \ 2848138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding .index = _index, \ 2858138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding .dev_id = _dev_id, \ 2868138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding .con_id = _con_id, \ 2874284402924cc55e182008ca7e9d4fb1e891ff5aeAlexandre Belloni .period = _period, \ 2884284402924cc55e182008ca7e9d4fb1e891ff5aeAlexandre Belloni .polarity = _polarity \ 2898138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding } 2908138d2ddbcca2a100482dac390133f83c5a60f94Thierry Reding 2910bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#if IS_ENABLED(CONFIG_PWM) 2928138d2ddbcca2a100482dac390133f83c5a60f94Thierry Redingvoid pwm_add_table(struct pwm_lookup *table, size_t num); 2930bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera#else 2940bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Beherastatic inline void pwm_add_table(struct pwm_lookup *table, size_t num) 2950bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera{ 2960bcf168b024871c64eb5df157739efd2ae9b0bdfTushar Behera} 2970c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer#endif 2980c2498f1660878339350bea8d18550b1b87ca055Sascha Hauer 29976abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten#ifdef CONFIG_PWM_SYSFS 30076abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweetenvoid pwmchip_sysfs_export(struct pwm_chip *chip); 30176abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweetenvoid pwmchip_sysfs_unexport(struct pwm_chip *chip); 30276abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten#else 30376abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweetenstatic inline void pwmchip_sysfs_export(struct pwm_chip *chip) 30476abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten{ 30576abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten} 30676abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten 30776abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweetenstatic inline void pwmchip_sysfs_unexport(struct pwm_chip *chip) 30876abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten{ 30976abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten} 31076abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten#endif /* CONFIG_PWM_SYSFS */ 31176abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3dH Hartley Sweeten 3125243ef8b54a927cae23216253e4e3f03af6f1446Mark Vels#endif /* __LINUX_PWM_H */ 313