42
42
#include <mach/regs-rtc.h>
43
43
#endif
44
44
45
+ #include "rtc-sa1100.h"
46
+
45
47
#define RTC_DEF_DIVIDER (32768 - 1)
46
48
#define RTC_DEF_TRIM 0
47
49
#define RTC_FREQ 1024
48
50
49
- struct sa1100_rtc {
50
- spinlock_t lock ;
51
- int irq_1hz ;
52
- int irq_alarm ;
53
- struct rtc_device * rtc ;
54
- struct clk * clk ;
55
- };
56
51
57
52
static irqreturn_t sa1100_rtc_interrupt (int irq , void * dev_id )
58
53
{
@@ -223,29 +218,18 @@ static const struct rtc_class_ops sa1100_rtc_ops = {
223
218
.alarm_irq_enable = sa1100_rtc_alarm_irq_enable ,
224
219
};
225
220
226
- static int sa1100_rtc_probe (struct platform_device * pdev )
221
+ int sa1100_rtc_init (struct platform_device * pdev , struct sa1100_rtc * info )
227
222
{
228
223
struct rtc_device * rtc ;
229
- struct sa1100_rtc * info ;
230
- int irq_1hz , irq_alarm , ret = 0 ;
224
+ int ret ;
231
225
232
- irq_1hz = platform_get_irq_byname (pdev , "rtc 1Hz" );
233
- irq_alarm = platform_get_irq_byname (pdev , "rtc alarm" );
234
- if (irq_1hz < 0 || irq_alarm < 0 )
235
- return - ENODEV ;
226
+ spin_lock_init (& info -> lock );
236
227
237
- info = devm_kzalloc (& pdev -> dev , sizeof (struct sa1100_rtc ), GFP_KERNEL );
238
- if (!info )
239
- return - ENOMEM ;
240
228
info -> clk = devm_clk_get (& pdev -> dev , NULL );
241
229
if (IS_ERR (info -> clk )) {
242
230
dev_err (& pdev -> dev , "failed to find rtc clock source\n" );
243
231
return PTR_ERR (info -> clk );
244
232
}
245
- info -> irq_1hz = irq_1hz ;
246
- info -> irq_alarm = irq_alarm ;
247
- spin_lock_init (& info -> lock );
248
- platform_set_drvdata (pdev , info );
249
233
250
234
ret = clk_prepare_enable (info -> clk );
251
235
if (ret )
@@ -265,14 +249,11 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
265
249
RCNR = 0 ;
266
250
}
267
251
268
- device_init_wakeup (& pdev -> dev , 1 );
269
-
270
252
rtc = devm_rtc_device_register (& pdev -> dev , pdev -> name , & sa1100_rtc_ops ,
271
253
THIS_MODULE );
272
-
273
254
if (IS_ERR (rtc )) {
274
- ret = PTR_ERR ( rtc );
275
- goto err_dev ;
255
+ clk_disable_unprepare ( info -> clk );
256
+ return PTR_ERR ( rtc ) ;
276
257
}
277
258
info -> rtc = rtc ;
278
259
@@ -301,9 +282,29 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
301
282
RTSR = RTSR_AL | RTSR_HZ ;
302
283
303
284
return 0 ;
304
- err_dev :
305
- clk_disable_unprepare (info -> clk );
306
- return ret ;
285
+ }
286
+ EXPORT_SYMBOL_GPL (sa1100_rtc_init );
287
+
288
+ static int sa1100_rtc_probe (struct platform_device * pdev )
289
+ {
290
+ struct sa1100_rtc * info ;
291
+ int irq_1hz , irq_alarm ;
292
+
293
+ irq_1hz = platform_get_irq_byname (pdev , "rtc 1Hz" );
294
+ irq_alarm = platform_get_irq_byname (pdev , "rtc alarm" );
295
+ if (irq_1hz < 0 || irq_alarm < 0 )
296
+ return - ENODEV ;
297
+
298
+ info = devm_kzalloc (& pdev -> dev , sizeof (struct sa1100_rtc ), GFP_KERNEL );
299
+ if (!info )
300
+ return - ENOMEM ;
301
+ info -> irq_1hz = irq_1hz ;
302
+ info -> irq_alarm = irq_alarm ;
303
+
304
+ platform_set_drvdata (pdev , info );
305
+ device_init_wakeup (& pdev -> dev , 1 );
306
+
307
+ return sa1100_rtc_init (pdev , info );
307
308
}
308
309
309
310
static int sa1100_rtc_remove (struct platform_device * pdev )
0 commit comments