@@ -115,6 +115,29 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
115
115
tty_termios_encode_baud_rate (termios , baud , baud );
116
116
}
117
117
118
+ static int mtk8250_runtime_suspend (struct device * dev )
119
+ {
120
+ struct mtk8250_data * data = dev_get_drvdata (dev );
121
+
122
+ clk_disable_unprepare (data -> uart_clk );
123
+
124
+ return 0 ;
125
+ }
126
+
127
+ static int mtk8250_runtime_resume (struct device * dev )
128
+ {
129
+ struct mtk8250_data * data = dev_get_drvdata (dev );
130
+ int err ;
131
+
132
+ err = clk_prepare_enable (data -> uart_clk );
133
+ if (err ) {
134
+ dev_warn (dev , "Can't enable clock\n" );
135
+ return err ;
136
+ }
137
+
138
+ return 0 ;
139
+ }
140
+
118
141
static void
119
142
mtk8250_do_pm (struct uart_port * port , unsigned int state , unsigned int old )
120
143
{
@@ -130,19 +153,12 @@ mtk8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old)
130
153
static int mtk8250_probe_of (struct platform_device * pdev , struct uart_port * p ,
131
154
struct mtk8250_data * data )
132
155
{
133
- int err ;
134
-
135
156
data -> uart_clk = devm_clk_get (& pdev -> dev , NULL );
136
157
if (IS_ERR (data -> uart_clk )) {
137
158
dev_warn (& pdev -> dev , "Can't get uart clock\n" );
138
159
return PTR_ERR (data -> uart_clk );
139
160
}
140
161
141
- err = clk_prepare_enable (data -> uart_clk );
142
- if (err ) {
143
- dev_warn (& pdev -> dev , "Can't prepare clock\n" );
144
- return err ;
145
- }
146
162
p -> uartclk = clk_get_rate (data -> uart_clk );
147
163
148
164
return 0 ;
@@ -193,14 +209,18 @@ static int mtk8250_probe(struct platform_device *pdev)
193
209
writel (0x0 , uart .port .membase +
194
210
(MTK_UART_RATE_FIX << uart .port .regshift ));
195
211
196
- data -> line = serial8250_register_8250_port (& uart );
197
- if (data -> line < 0 )
198
- return data -> line ;
199
-
200
212
platform_set_drvdata (pdev , data );
201
213
202
- pm_runtime_set_active (& pdev -> dev );
203
214
pm_runtime_enable (& pdev -> dev );
215
+ if (!pm_runtime_enabled (& pdev -> dev )) {
216
+ err = mtk8250_runtime_resume (& pdev -> dev );
217
+ if (err )
218
+ return err ;
219
+ }
220
+
221
+ data -> line = serial8250_register_8250_port (& uart );
222
+ if (data -> line < 0 )
223
+ return data -> line ;
204
224
205
225
return 0 ;
206
226
}
@@ -212,10 +232,13 @@ static int mtk8250_remove(struct platform_device *pdev)
212
232
pm_runtime_get_sync (& pdev -> dev );
213
233
214
234
serial8250_unregister_port (data -> line );
215
- clk_disable_unprepare (data -> uart_clk );
216
235
217
236
pm_runtime_disable (& pdev -> dev );
218
237
pm_runtime_put_noidle (& pdev -> dev );
238
+
239
+ if (!pm_runtime_status_suspended (& pdev -> dev ))
240
+ mtk8250_runtime_suspend (& pdev -> dev );
241
+
219
242
return 0 ;
220
243
}
221
244
@@ -239,26 +262,6 @@ static int mtk8250_resume(struct device *dev)
239
262
}
240
263
#endif /* CONFIG_PM_SLEEP */
241
264
242
- #ifdef CONFIG_PM
243
- static int mtk8250_runtime_suspend (struct device * dev )
244
- {
245
- struct mtk8250_data * data = dev_get_drvdata (dev );
246
-
247
- clk_disable_unprepare (data -> uart_clk );
248
-
249
- return 0 ;
250
- }
251
-
252
- static int mtk8250_runtime_resume (struct device * dev )
253
- {
254
- struct mtk8250_data * data = dev_get_drvdata (dev );
255
-
256
- clk_prepare_enable (data -> uart_clk );
257
-
258
- return 0 ;
259
- }
260
- #endif
261
-
262
265
static const struct dev_pm_ops mtk8250_pm_ops = {
263
266
SET_SYSTEM_SLEEP_PM_OPS (mtk8250_suspend , mtk8250_resume )
264
267
SET_RUNTIME_PM_OPS (mtk8250_runtime_suspend , mtk8250_runtime_resume ,
0 commit comments