@@ -23,6 +23,23 @@ static inline struct clk_pwm *to_clk_pwm(struct clk_hw *hw)
23
23
return container_of (hw , struct clk_pwm , hw );
24
24
}
25
25
26
+ static int clk_pwm_enable (struct clk_hw * hw )
27
+ {
28
+ struct clk_pwm * clk_pwm = to_clk_pwm (hw );
29
+
30
+ return pwm_apply_atomic (clk_pwm -> pwm , & clk_pwm -> state );
31
+ }
32
+
33
+ static void clk_pwm_disable (struct clk_hw * hw )
34
+ {
35
+ struct clk_pwm * clk_pwm = to_clk_pwm (hw );
36
+ struct pwm_state state = clk_pwm -> state ;
37
+
38
+ state .enabled = false;
39
+
40
+ pwm_apply_atomic (clk_pwm -> pwm , & state );
41
+ }
42
+
26
43
static int clk_pwm_prepare (struct clk_hw * hw )
27
44
{
28
45
struct clk_pwm * clk_pwm = to_clk_pwm (hw );
@@ -61,6 +78,13 @@ static int clk_pwm_get_duty_cycle(struct clk_hw *hw, struct clk_duty *duty)
61
78
return 0 ;
62
79
}
63
80
81
+ static const struct clk_ops clk_pwm_ops_atomic = {
82
+ .enable = clk_pwm_enable ,
83
+ .disable = clk_pwm_disable ,
84
+ .recalc_rate = clk_pwm_recalc_rate ,
85
+ .get_duty_cycle = clk_pwm_get_duty_cycle ,
86
+ };
87
+
64
88
static const struct clk_ops clk_pwm_ops = {
65
89
.prepare = clk_pwm_prepare ,
66
90
.unprepare = clk_pwm_unprepare ,
@@ -115,7 +139,11 @@ static int clk_pwm_probe(struct platform_device *pdev)
115
139
of_property_read_string (node , "clock-output-names" , & clk_name );
116
140
117
141
init .name = clk_name ;
118
- init .ops = & clk_pwm_ops ;
142
+ if (pwm_might_sleep (pwm ))
143
+ init .ops = & clk_pwm_ops ;
144
+ else
145
+ init .ops = & clk_pwm_ops_atomic ;
146
+
119
147
init .flags = 0 ;
120
148
init .num_parents = 0 ;
121
149
0 commit comments