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};
  80
  81struct pwm_device {
  82        const char              *label;
  83        unsigned long           flags;
  84        unsigned int            hwpwm;
  85        unsigned int            pwm;
  86        struct pwm_chip         *chip;
  87        void                    *chip_data;
  88
  89        unsigned int            period; /* in nanoseconds */
  90};
  91
  92static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period)
  93{
  94        if (pwm)
  95                pwm->period = period;
  96}
  97
  98static inline unsigned int pwm_get_period(struct pwm_device *pwm)
  99{
 100        return pwm ? pwm->period : 0;
 101}
 102
 103/*
 104 * pwm_set_polarity - configure the polarity of a PWM signal
 105 */
 106int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity);
 107
 108/**
 109 * struct pwm_ops - PWM controller operations
 110 * @request: optional hook for requesting a PWM
 111 * @free: optional hook for freeing a PWM
 112 * @config: configure duty cycles and period length for this PWM
 113 * @set_polarity: configure the polarity of this PWM
 114 * @enable: enable PWM output toggling
 115 * @disable: disable PWM output toggling
 116 * @dbg_show: optional routine to show contents in debugfs
 117 * @owner: helps prevent removal of modules exporting active PWMs
 118 */
 119struct pwm_ops {
 120        int                     (*request)(struct pwm_chip *chip,
 121                                           struct pwm_device *pwm);
 122        void                    (*free)(struct pwm_chip *chip,
 123                                        struct pwm_device *pwm);
 124        int                     (*config)(struct pwm_chip *chip,
 125                                          struct pwm_device *pwm,
 126                                          int duty_ns, int period_ns);
 127        int                     (*set_polarity)(struct pwm_chip *chip,
 128                                          struct pwm_device *pwm,
 129                                          enum pwm_polarity polarity);
 130        int                     (*enable)(struct pwm_chip *chip,
 131                                          struct pwm_device *pwm);
 132        void                    (*disable)(struct pwm_chip *chip,
 133                                           struct pwm_device *pwm);
 134#ifdef CONFIG_DEBUG_FS
 135        void                    (*dbg_show)(struct pwm_chip *chip,
 136                                            struct seq_file *s);
 137#endif
 138        struct module           *owner;
 139};
 140
 141/**
 142 * struct pwm_chip - abstract a PWM controller
 143 * @dev: device providing the PWMs
 144 * @list: list node for internal use
 145 * @ops: callbacks for this PWM controller
 146 * @base: number of first PWM controlled by this chip
 147 * @npwm: number of PWMs controlled by this chip
 148 * @pwms: array of PWM devices allocated by the framework
 149 * @can_sleep: must be true if the .config(), .enable() or .disable()
 150 *             operations may sleep
 151 */
 152struct pwm_chip {
 153        struct device           *dev;
 154        struct list_head        list;
 155        const struct pwm_ops    *ops;
 156        int                     base;
 157        unsigned int            npwm;
 158
 159        struct pwm_device       *pwms;
 160
 161        struct pwm_device *     (*of_xlate)(struct pwm_chip *pc,
 162                                            const struct of_phandle_args *args);
 163        unsigned int            of_pwm_n_cells;
 164        bool                    can_sleep;
 165};
 166
 167#if IS_ENABLED(CONFIG_PWM)
 168int pwm_set_chip_data(struct pwm_device *pwm, void *data);
 169void *pwm_get_chip_data(struct pwm_device *pwm);
 170
 171int pwmchip_add(struct pwm_chip *chip);
 172int pwmchip_remove(struct pwm_chip *chip);
 173struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,
 174                                         unsigned int index,
 175                                         const char *label);
 176
 177struct pwm_device *of_pwm_xlate_with_flags(struct pwm_chip *pc,
 178                const struct of_phandle_args *args);
 179
 180struct pwm_device *pwm_get(struct device *dev, const char *con_id);
 181struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id);
 182void pwm_put(struct pwm_device *pwm);
 183
 184struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id);
 185struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np,
 186                                   const char *con_id);
 187void devm_pwm_put(struct device *dev, struct pwm_device *pwm);
 188
 189bool pwm_can_sleep(struct pwm_device *pwm);
 190#else
 191static inline int pwm_set_chip_data(struct pwm_device *pwm, void *data)
 192{
 193        return -EINVAL;
 194}
 195
 196static inline void *pwm_get_chip_data(struct pwm_device *pwm)
 197{
 198        return NULL;
 199}
 200
 201static inline int pwmchip_add(struct pwm_chip *chip)
 202{
 203        return -EINVAL;
 204}
 205
 206static inline int pwmchip_remove(struct pwm_chip *chip)
 207{
 208        return -EINVAL;
 209}
 210
 211static inline struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,
 212                                                       unsigned int index,
 213                                                       const char *label)
 214{
 215        return ERR_PTR(-ENODEV);
 216}
 217
 218static inline struct pwm_device *pwm_get(struct device *dev,
 219                                         const char *consumer)
 220{
 221        return ERR_PTR(-ENODEV);
 222}
 223
 224static inline struct pwm_device *of_pwm_get(struct device_node *np,
 225                                            const char *con_id)
 226{
 227        return ERR_PTR(-ENODEV);
 228}
 229
 230static inline void pwm_put(struct pwm_device *pwm)
 231{
 232}
 233
 234static inline struct pwm_device *devm_pwm_get(struct device *dev,
 235                                              const char *consumer)
 236{
 237        return ERR_PTR(-ENODEV);
 238}
 239
 240static inline struct pwm_device *devm_of_pwm_get(struct device *dev,
 241                                                 struct device_node *np,
 242                                                 const char *con_id)
 243{
 244        return ERR_PTR(-ENODEV);
 245}
 246
 247static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm)
 248{
 249}
 250
 251static inline bool pwm_can_sleep(struct pwm_device *pwm)
 252{
 253        return false;
 254}
 255#endif
 256
 257struct pwm_lookup {
 258        struct list_head list;
 259        const char *provider;
 260        unsigned int index;
 261        const char *dev_id;
 262        const char *con_id;
 263};
 264
 265#define PWM_LOOKUP(_provider, _index, _dev_id, _con_id) \
 266        {                                               \
 267                .provider = _provider,                  \
 268                .index = _index,                        \
 269                .dev_id = _dev_id,                      \
 270                .con_id = _con_id,                      \
 271        }
 272
 273#if IS_ENABLED(CONFIG_PWM)
 274void pwm_add_table(struct pwm_lookup *table, size_t num);
 275#else
 276static inline void pwm_add_table(struct pwm_lookup *table, size_t num)
 277{
 278}
 279#endif
 280
 281#endif /* __LINUX_PWM_H */
 282
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.