Skip to content

Commit 8c0961b

Browse files
robherringalexandrebelloni
authored andcommitted
rtc: sa1100: prepare to share sa1100_rtc_ops
Factor out the RTC initialization from the platform device specific parts in order to share the RTC device ops with other drivers. Specifically, it will be shared with rtc-pxa driver. Signed-off-by: Rob Herring <[email protected]> Cc: Robert Jarzmik <[email protected]> Cc: Russell King <[email protected]> Cc: Alessandro Zummo <[email protected]> Cc: Alexandre Belloni <[email protected]> Cc: [email protected] Signed-off-by: Alexandre Belloni <[email protected]>
1 parent dc2280e commit 8c0961b

File tree

2 files changed

+49
-29
lines changed

2 files changed

+49
-29
lines changed

drivers/rtc/rtc-sa1100.c

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,12 @@
4242
#include <mach/regs-rtc.h>
4343
#endif
4444

45+
#include "rtc-sa1100.h"
46+
4547
#define RTC_DEF_DIVIDER (32768 - 1)
4648
#define RTC_DEF_TRIM 0
4749
#define RTC_FREQ 1024
4850

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-
};
5651

5752
static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id)
5853
{
@@ -223,29 +218,18 @@ static const struct rtc_class_ops sa1100_rtc_ops = {
223218
.alarm_irq_enable = sa1100_rtc_alarm_irq_enable,
224219
};
225220

226-
static int sa1100_rtc_probe(struct platform_device *pdev)
221+
int sa1100_rtc_init(struct platform_device *pdev, struct sa1100_rtc *info)
227222
{
228223
struct rtc_device *rtc;
229-
struct sa1100_rtc *info;
230-
int irq_1hz, irq_alarm, ret = 0;
224+
int ret;
231225

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);
236227

237-
info = devm_kzalloc(&pdev->dev, sizeof(struct sa1100_rtc), GFP_KERNEL);
238-
if (!info)
239-
return -ENOMEM;
240228
info->clk = devm_clk_get(&pdev->dev, NULL);
241229
if (IS_ERR(info->clk)) {
242230
dev_err(&pdev->dev, "failed to find rtc clock source\n");
243231
return PTR_ERR(info->clk);
244232
}
245-
info->irq_1hz = irq_1hz;
246-
info->irq_alarm = irq_alarm;
247-
spin_lock_init(&info->lock);
248-
platform_set_drvdata(pdev, info);
249233

250234
ret = clk_prepare_enable(info->clk);
251235
if (ret)
@@ -265,14 +249,11 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
265249
RCNR = 0;
266250
}
267251

268-
device_init_wakeup(&pdev->dev, 1);
269-
270252
rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &sa1100_rtc_ops,
271253
THIS_MODULE);
272-
273254
if (IS_ERR(rtc)) {
274-
ret = PTR_ERR(rtc);
275-
goto err_dev;
255+
clk_disable_unprepare(info->clk);
256+
return PTR_ERR(rtc);
276257
}
277258
info->rtc = rtc;
278259

@@ -301,9 +282,29 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
301282
RTSR = RTSR_AL | RTSR_HZ;
302283

303284
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);
307308
}
308309

309310
static int sa1100_rtc_remove(struct platform_device *pdev)

drivers/rtc/rtc-sa1100.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef __RTC_SA1100_H__
2+
#define __RTC_SA1100_H__
3+
4+
#include <linux/kernel.h>
5+
6+
struct clk;
7+
struct platform_device;
8+
9+
struct sa1100_rtc {
10+
spinlock_t lock;
11+
int irq_1hz;
12+
int irq_alarm;
13+
struct rtc_device *rtc;
14+
struct clk *clk;
15+
};
16+
17+
int sa1100_rtc_init(struct platform_device *pdev, struct sa1100_rtc *info);
18+
19+
#endif

0 commit comments

Comments
 (0)