linux/include/linux/pwm.h
<<
>>
Prefs
   1#ifndef __LINUX_PWM_H
   2#define __LINUX_PWM_H
   3
   4#include <linux/err.h>
   5#include <linux/of.h>
   6
   7struct pwm_device;
   8struct seq_file;
   9
  10#if IS_ENABLED(CONFIG_PWM) || IS_ENABLED(CONFIG_HAVE_PWM)
  11/*
  12 * pwm_request - request a PWM device
  13 */
  14struct pwm_device *pwm_request(int pwm_id, const char *label);
  15
  16/*
  17 * pwm_free - free a PWM device
  18 */
  19void pwm_free(struct pwm_device *pwm);
  20
  21/*
  22 * pwm_config - change a PWM device configuration
  23 */
  24int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
  25
  26/*
  27 * pwm_enable - start a PWM output toggling
  28 */
  29int pwm_enable(struct pwm_device *pwm);
  30
  31/*
  32 * pwm_disable - stop a PWM output toggling
  33 */
  34void pwm_disable(struct pwm_device *pwm);
  35#else
  36static inline struct pwm_device *pwm_request(int pwm_id, const char *label)
  37{
  38        return ERR_PTR(-ENODEV);
  39}
  40
  41static inline void pwm_free(struct pwm_device *pwm)
  42{
  43}
  44
  45static inline int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
  46{
  47        return -EINVAL;
  48}
  49
  50static inline int pwm_enable(struct pwm_device *pwm)
  51{
  52        return -EINVAL;
  53}
  54
  55static inline void pwm_disable(struct pwm_device *pwm)
  56{
  57}
  58#endif
  59
  60struct pwm_chip;
  61
  62/**
  63 * enum pwm_polarity - polarity of a PWM signal
  64 * @PWM_POLARITY_NORMAL: a high signal for the duration of the duty-
  65 * cycle, followed by a low signal for the remainder of the pulse
  66 * period
  67 * @PWM_POLARITY_INVERSED: a low signal for the duration of the duty-
  68 * cycle, followed by a high signal for the remainder of the pulse
  69 * period
  70 */
  71enum pwm_polarity {
  72        PWM_POLARITY_NORMAL,
  73        PWM_POLARITY_INVERSED,
  74};
  75
  76enum {
  77        PWMF_REQUESTED = 1 << 0,
  78        PWMF_ENABLED = 1 << 1,
  79        PWMF_EXPORTED = 1 << 2,
  80};
  81
  82struct pwm_device {
  83        const char              *label;
  84        unsigned long           flags;
  85        unsigned int            hwpwm;
  86        unsigned int            pwm;
  87        struct pwm_chip         *chip;
  88        void                    *chip_data;
  89
  90        unsigned int            period;         /* in nanoseconds */
  91        unsigned int            duty_cycle;     /* in nanoseconds */
  92        enum pwm_polarity       polarity;
  93};
  94
  95static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period)
  96{
  97        if (pwm)
  98                pwm->period = period;
  99}
 100
 101static inline unsigned int pwm_get_period(struct pwm_device *pwm)
 102{
 103        return pwm ? pwm->period : 0;
 104}
 105
 106static inline void pwm_set_duty_cycle(struct pwm_device *pwm, unsigned int duty)
 107{
 108        if (pwm)
 109                pwm->duty_cycle = duty;
 110}
 111
 112static inline unsigned int pwm_get_duty_cycle(struct pwm_device *pwm)
 113{
 114        return pwm ? pwm->duty_cycle : 0;
 115}
 116
 117/*
 118 * pwm_set_polarity - configure the polarity of a PWM signal
 119 */
 120int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity);
 121
 122/**
 123 * struct pwm_ops - PWM controller operations
 124 * @request: optional hook for requesting a PWM
 125 * @free: optional hook for freeing a PWM
 126 * @config: configure duty cycles and period length for this PWM
 127 * @set_polarity: configure the polarity of this PWM
 128 * @enable: enable PWM output toggling
 129 * @disable: disable PWM output toggling
 130 * @dbg_show: optional routine to show contents in debugfs
 131 * @owner: helps prevent removal of modules exporting active PWMs
 132 */
 133struct pwm_ops {
 134        int                     (*request)(struct pwm_chip *chip,
 135                                           struct pwm_device *pwm);
 136        void                    (*free)(struct pwm_chip *chip,
 137                                        struct pwm_device *pwm);
 138        int                     (*config)(struct pwm_chip *chip,
 139                                          struct pwm_device *pwm,
 140                                          int duty_ns, int period_ns);
 141        int                     (*set_polarity)(struct pwm_chip *chip,
 142                                          struct pwm_device *pwm,
 143                                          enum pwm_polarity polarity);
 144        int                     (*enable)(struct pwm_chip *chip,
 145                                          struct pwm_device *pwm);
 146        void                    (*disable)(struct pwm_chip *chip,
 147                                           struct pwm_device *pwm);
 148#ifdef CONFIG_DEBUG_FS
 149        void                    (*dbg_show)(struct pwm_chip *chip,
 150                                            struct seq_file *s);
 151#endif
 152        struct module           *owner;
 153};
 154
 155/**
 156 * struct pwm_chip - abstract a PWM controller
 157 * @dev: device providing the PWMs
 158 * @list: list node for internal use
 159 * @ops: callbacks for this PWM controller
 160 * @base: number of first PWM controlled by this chip
 161 * @npwm: number of PWMs controlled by this chip
 162 * @pwms: array of PWM devices allocated by the framework
 163 * @can_sleep: must be true if the .config(), .enable() or .disable()
 164 *             operations may sleep
 165 */
 166struct pwm_chip {
 167        struct device           *dev;
 168        struct list_head        list;
 169        const struct pwm_ops    *ops;
 170        int                     base;
 171        unsigned int            npwm;
 172
 173        struct pwm_device       *pwms;
 174
 175        struct pwm_device *     (*of_xlate)(struct pwm_chip *pc,
 176                                            const struct of_phandle_args *args);
 177        unsigned int            of_pwm_n_cells;
 178        bool                    can_sleep;
 179};
 180
 181#if IS_ENABLED(CONFIG_PWM)
 182int pwm_set_chip_data(struct pwm_device *pwm, void *data);
 183void *pwm_get_chip_data(struct pwm_device *pwm);
 184
 185int pwmchip_add(struct pwm_chip *chip);
 186int pwmchip_remove(struct pwm_chip *chip);
 187struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,
 188                                         unsigned int index,
 189                                         const char *label);
 190
 191struct pwm_device *of_pwm_xlate_with_flags(struct pwm_chip *pc,
 192                const struct of_phandle_args *args);
 193
 194struct pwm_device *pwm_get(struct device *dev, const char *con_id);
 195struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id);
 196void pwm_put(struct pwm_device *pwm);
 197
 198struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id);
 199struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np,
 200                                   const char *con_id);
 201void devm_pwm_put(struct device *dev, struct pwm_device *pwm);
 202
 203bool pwm_can_sleep(struct pwm_device *pwm);
 204#else
 205static inline int pwm_set_chip_data(struct pwm_device *pwm, void *data)
 206{
 207        return -EINVAL;
 208}
 209
 210static inline void *pwm_get_chip_data(struct pwm_device *pwm)
 211{
 212        return NULL;
 213}
 214
 215static inline int pwmchip_add(struct pwm_chip *chip)
 216{
 217        return -EINVAL;
 218}
 219
 220static inline int pwmchip_remove(struct pwm_chip *chip)
 221{
 222        return -EINVAL;
 223}
 224
 225static inline struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,
 226                                                       unsigned int index,
 227                                                       const char *label)
 228{
 229        return ERR_PTR(-ENODEV);
 230}
 231
 232static inline struct pwm_device *pwm_get(struct device *dev,
 233                                         const char *consumer)
 234{
 235        return ERR_PTR(-ENODEV);
 236}
 237
 238static inline struct pwm_device *of_pwm_get(struct device_node *np,
 239                                            const char *con_id)
 240{
 241        return ERR_PTR(-ENODEV);
 242}
 243
 244static inline void pwm_put(struct pwm_device *pwm)
 245{
 246}
 247
 248static inline struct pwm_device *devm_pwm_get(struct device *dev,
 249                                              const char *consumer)
 250{
 251        return ERR_PTR(-ENODEV);
 252}
 253
 254static inline struct pwm_device *devm_of_pwm_get(struct device *dev,
 255                                                 struct device_node *np,
 256                                                 const char *con_id)
 257{
 258        return ERR_PTR(-ENODEV);
 259}
 260
 261static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm)
 262{
 263}
 264
 265static inline bool pwm_can_sleep(struct pwm_device *pwm)
 266{
 267        return false;
 268}
 269#endif
 270
 271struct pwm_lookup {
 272        struct list_head list;
 273        const char *provider;
 274        unsigned int index;
 275        const char *dev_id;
 276        const char *con_id;
 277};
 278
 279#define PWM_LOOKUP(_provider, _index, _dev_id, _con_id) \
 280        {                                               \
 281                .provider = _provider,                  \
 282                .index = _index,                        \
 283                .dev_id = _dev_id,                      \
 284                .con_id = _con_id,                      \
 285        }
 286
 287#if IS_ENABLED(CONFIG_PWM)
 288void pwm_add_table(struct pwm_lookup *table, size_t num);
 289#else
 290static inline void pwm_add_table(struct pwm_lookup *table, size_t num)
 291{
 292}
 293#endif
 294
 295#ifdef CONFIG_PWM_SYSFS
 296void pwmchip_sysfs_export(struct pwm_chip *chip);
 297void pwmchip_sysfs_unexport(struct pwm_chip *chip);
 298#else
 299static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
 300{
 301}
 302
 303static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip)
 304{
 305}
 306#endif /* CONFIG_PWM_SYSFS */
 307
 308#endif /* __LINUX_PWM_H */
 309