huangcm
2025-04-07 511b111543524704f6182b374e489f5d0e51db8c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * header file for pwm driver.
 *
 * Copyright 2016 Google Inc.
 * Copyright (c) 2011 samsung electronics
 * Donghwa Lee <dh09.lee@samsung.com>
 */
 
#ifndef _pwm_h_
#define _pwm_h_
 
#if 0
/* struct pwm_ops: Operations for the PWM uclass */
struct pwm_ops {
   /**
    * set_config() - Set the PWM configuration
    *
    * @dev:    PWM device to update
    * @channel:    PWM channel to update
    * @period_ns:    PWM period in nanoseconds
    * @duty_ns:    PWM duty period in nanoseconds
    * @return 0 if OK, -ve on error
    */
   int (*set_config)(struct udevice *dev, uint channel, uint period_ns,
             uint duty_ns);
 
   /**
    * set_enable() - Enable or disable the PWM
    *
    * @dev:    PWM device to update
    * @channel:    PWM channel to update
    * @enable:    true to enable, false to disable
    * @return 0 if OK, -ve on error
    */
   int (*set_enable)(struct udevice *dev, uint channel, bool enable);
   /**
    * set_invert() - Set the PWM invert
    *
    * @dev:        PWM device to update
    * @channel:    PWM channel to update
    * @polarity:   true to invert, false to keep normal polarity
    * @return 0 if OK, -ve on error
    */
   int (*set_invert)(struct udevice *dev, uint channel, bool polarity);
};
 
#define pwm_get_ops(dev)    ((struct pwm_ops *)(dev)->driver->ops)
 
/**
 * pwm_set_config() - Set the PWM configuration
 *
 * @dev:    PWM device to update
 * @channel:    PWM channel to update
 * @period_ns:    PWM period in nanoseconds
 * @duty_ns:    PWM duty period in nanoseconds
 * @return 0 if OK, -ve on error
 */
int pwm_set_config(struct udevice *dev, uint channel, uint period_ns,
          uint duty_ns);
 
/**
 * pwm_set_enable() - Enable or disable the PWM
 *
 * @dev:    PWM device to update
 * @channel:    PWM channel to update
 * @enable:    true to enable, false to disable
 * @return 0 if OK, -ve on error
 */
int pwm_set_enable(struct udevice *dev, uint channel, bool enable);
 
/**
 * pwm_set_invert() - Set pwm default polarity
 *
 * @dev:    PWM device to update
 * @channel:    PWM channel to update
 * @polarity:    true to invert, false to keep normal polarity
 * @return 0 if OK, -ve on error
 */
int pwm_set_invert(struct udevice *dev, uint channel, bool polarity);
 
/* Legacy interface */
#ifndef CONFIG_DM_PWM
int    pwm_init(int pwm_id, int div, int invert);
int    pwm_config(int pwm_id, int duty_ns, int period_ns);
int    pwm_enable(int pwm_id);
void    pwm_disable(int pwm_id);
#endif
#endif
 
enum pwm_polarity {
   PWM_POLARITY_NORMAL,
   PWM_POLARITY_INVERSED,
};
 
struct pwm_device {
   const char        *label;
   unsigned long        flags;
   unsigned int        hwpwm;
   unsigned int        pwm;
   struct pwm_chip        *chip;
   void            *chip_data;
 
   unsigned int        period; /* in nanoseconds */
};
 
struct pwm_chip {
   struct device        *dev;
   struct list_head    list;
   const struct pwm_ops    *ops;
   int            base;
   unsigned int        npwm;
 
   struct pwm_device    *pwms;
 
   //struct pwm_device *    (*of_xlate)(struct pwm_chip *pc,
                      // const struct of_phandle_args *args);
   unsigned int        of_pwm_n_cells;
   bool            can_sleep;
};
 
/* it mapping uboot2014/uboot2018 version.*/
int pwm_set_polarity(int pwm, enum pwm_polarity polarity);
int pwm_config(int pwm, int duty_ns, int period_ns);
int pwm_enable(int pwm);
int pwm_disable(int pwm);
int pwm_init(void);
int pwm_request(int pwm, const char *label);
int pwm_remove(int pwm);
 
#endif /* _pwm_h_ */