Skip to content

Commit ac05fba

Browse files
linuswalexandrebelloni
authored andcommitted
rtc: gemini: Add optional clock handling
This makes the Gemini optionally take two clock references to the PCLK and EXTCLK. As we are adding a clock framework to the Gemini platform we need to make sure that we get the right references. Acked-by: Hans Ulli Kroll <[email protected]> Signed-off-by: Linus Walleij <[email protected]> Signed-off-by: Alexandre Belloni <[email protected]>
1 parent e48585d commit ac05fba

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

drivers/rtc/rtc-gemini.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <linux/platform_device.h>
2727
#include <linux/kernel.h>
2828
#include <linux/module.h>
29+
#include <linux/clk.h>
2930

3031
#define DRV_NAME "rtc-gemini"
3132

@@ -38,6 +39,8 @@ struct gemini_rtc {
3839
struct rtc_device *rtc_dev;
3940
void __iomem *rtc_base;
4041
int rtc_irq;
42+
struct clk *pclk;
43+
struct clk *extclk;
4144
};
4245

4346
enum gemini_rtc_offsets {
@@ -127,6 +130,27 @@ static int gemini_rtc_probe(struct platform_device *pdev)
127130
return -ENOMEM;
128131
platform_set_drvdata(pdev, rtc);
129132

133+
rtc->pclk = devm_clk_get(dev, "PCLK");
134+
if (IS_ERR(rtc->pclk)) {
135+
dev_err(dev, "could not get PCLK\n");
136+
} else {
137+
ret = clk_prepare_enable(rtc->pclk);
138+
if (ret) {
139+
dev_err(dev, "failed to enable PCLK\n");
140+
return ret;
141+
}
142+
}
143+
rtc->extclk = devm_clk_get(dev, "EXTCLK");
144+
if (IS_ERR(rtc->extclk)) {
145+
dev_err(dev, "could not get EXTCLK\n");
146+
} else {
147+
ret = clk_prepare_enable(rtc->extclk);
148+
if (ret) {
149+
dev_err(dev, "failed to enable EXTCLK\n");
150+
return ret;
151+
}
152+
}
153+
130154
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
131155
if (!res)
132156
return -ENODEV;
@@ -156,6 +180,10 @@ static int gemini_rtc_remove(struct platform_device *pdev)
156180
{
157181
struct gemini_rtc *rtc = platform_get_drvdata(pdev);
158182

183+
if (!IS_ERR(rtc->extclk))
184+
clk_disable_unprepare(rtc->extclk);
185+
if (!IS_ERR(rtc->pclk))
186+
clk_disable_unprepare(rtc->pclk);
159187
rtc_device_unregister(rtc->rtc_dev);
160188

161189
return 0;

0 commit comments

Comments
 (0)