|
22 | 22 | #include <linux/time.h>
|
23 | 23 |
|
24 | 24 | #define PWM_OUT_VAL(x) (0x00 + (4 * (x))) /* Device's Duty Cycle register */
|
| 25 | +#define PWM_CPT_VAL(x) (0x10 + (4 * (x))) /* Capture value */ |
| 26 | +#define PWM_CPT_EDGE(x) (0x30 + (4 * (x))) /* Edge to capture on */ |
25 | 27 |
|
26 | 28 | #define STI_PWM_CTRL 0x50 /* Control/Config register */
|
27 | 29 | #define STI_INT_EN 0x54 /* Interrupt Enable/Disable register */
|
| 30 | +#define STI_INT_STA 0x58 /* Interrupt Status register */ |
| 31 | +#define PWM_INT_ACK 0x5c |
28 | 32 | #define PWM_PRESCALE_LOW_MASK 0x0f
|
29 | 33 | #define PWM_PRESCALE_HIGH_MASK 0xf0
|
| 34 | +#define PWM_CPT_EDGE_MASK 0x03 |
| 35 | +#define PWM_INT_ACK_MASK 0x1ff |
| 36 | + |
| 37 | +#define STI_MAX_CPT_DEVS 4 |
| 38 | +#define CPT_DC_MAX 0xff |
30 | 39 |
|
31 | 40 | /* Regfield IDs */
|
32 | 41 | enum {
|
33 | 42 | /* Bits in PWM_CTRL*/
|
34 | 43 | PWMCLK_PRESCALE_LOW,
|
35 | 44 | PWMCLK_PRESCALE_HIGH,
|
| 45 | + CPTCLK_PRESCALE, |
36 | 46 |
|
37 | 47 | PWM_OUT_EN,
|
| 48 | + PWM_CPT_EN, |
38 | 49 |
|
39 | 50 | PWM_CPT_INT_EN,
|
| 51 | + PWM_CPT_INT_STAT, |
40 | 52 |
|
41 | 53 | /* Keep last */
|
42 | 54 | MAX_REGFIELDS
|
43 | 55 | };
|
44 | 56 |
|
| 57 | +/* Each capture input can be programmed to detect rising-edge, falling-edge, |
| 58 | + * either edge or neither egde |
| 59 | + */ |
| 60 | +enum sti_cpt_edge { |
| 61 | + CPT_EDGE_DISABLED, |
| 62 | + CPT_EDGE_RISING, |
| 63 | + CPT_EDGE_FALLING, |
| 64 | + CPT_EDGE_BOTH, |
| 65 | +}; |
| 66 | + |
45 | 67 | struct sti_pwm_compat_data {
|
46 | 68 | const struct reg_field *reg_fields;
|
47 | 69 | unsigned int num_devs;
|
@@ -69,8 +91,11 @@ struct sti_pwm_chip {
|
69 | 91 | static const struct reg_field sti_pwm_regfields[MAX_REGFIELDS] = {
|
70 | 92 | [PWMCLK_PRESCALE_LOW] = REG_FIELD(STI_PWM_CTRL, 0, 3),
|
71 | 93 | [PWMCLK_PRESCALE_HIGH] = REG_FIELD(STI_PWM_CTRL, 11, 14),
|
| 94 | + [CPTCLK_PRESCALE] = REG_FIELD(STI_PWM_CTRL, 4, 8), |
72 | 95 | [PWM_OUT_EN] = REG_FIELD(STI_PWM_CTRL, 9, 9),
|
| 96 | + [PWM_CPT_EN] = REG_FIELD(STI_PWM_CTRL, 10, 10), |
73 | 97 | [PWM_CPT_INT_EN] = REG_FIELD(STI_INT_EN, 1, 4),
|
| 98 | + [PWM_CPT_INT_STAT] = REG_FIELD(STI_INT_STA, 1, 4), |
74 | 99 | };
|
75 | 100 |
|
76 | 101 | static inline struct sti_pwm_chip *to_sti_pwmchip(struct pwm_chip *chip)
|
|
0 commit comments