diff options
Diffstat (limited to 'drivers/rtc/rtc-opal.c')
-rw-r--r-- | drivers/rtc/rtc-opal.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c index 2d84e2a28772..e2a946c0e667 100644 --- a/drivers/rtc/rtc-opal.c +++ b/drivers/rtc/rtc-opal.c | |||
@@ -167,7 +167,14 @@ static int opal_set_tpo_time(struct device *dev, struct rtc_wkalrm *alarm) | |||
167 | u32 y_m_d = 0; | 167 | u32 y_m_d = 0; |
168 | int token, rc; | 168 | int token, rc; |
169 | 169 | ||
170 | tm_to_opal(&alarm->time, &y_m_d, &h_m_s_ms); | 170 | /* if alarm is enabled */ |
171 | if (alarm->enabled) { | ||
172 | tm_to_opal(&alarm->time, &y_m_d, &h_m_s_ms); | ||
173 | pr_debug("Alarm set to %x %llx\n", y_m_d, h_m_s_ms); | ||
174 | |||
175 | } else { | ||
176 | pr_debug("Alarm getting disabled\n"); | ||
177 | } | ||
171 | 178 | ||
172 | token = opal_async_get_token_interruptible(); | 179 | token = opal_async_get_token_interruptible(); |
173 | if (token < 0) { | 180 | if (token < 0) { |
@@ -200,6 +207,18 @@ exit: | |||
200 | return rc; | 207 | return rc; |
201 | } | 208 | } |
202 | 209 | ||
210 | int opal_tpo_alarm_irq_enable(struct device *dev, unsigned int enabled) | ||
211 | { | ||
212 | struct rtc_wkalrm alarm = { .enabled = 0 }; | ||
213 | |||
214 | /* | ||
215 | * TPO is automatically enabled when opal_set_tpo_time() is called with | ||
216 | * non-zero rtc-time. We only handle disable case which needs to be | ||
217 | * explicitly told to opal. | ||
218 | */ | ||
219 | return enabled ? 0 : opal_set_tpo_time(dev, &alarm); | ||
220 | } | ||
221 | |||
203 | static struct rtc_class_ops opal_rtc_ops = { | 222 | static struct rtc_class_ops opal_rtc_ops = { |
204 | .read_time = opal_get_rtc_time, | 223 | .read_time = opal_get_rtc_time, |
205 | .set_time = opal_set_rtc_time, | 224 | .set_time = opal_set_rtc_time, |
@@ -215,6 +234,7 @@ static int opal_rtc_probe(struct platform_device *pdev) | |||
215 | device_set_wakeup_capable(&pdev->dev, true); | 234 | device_set_wakeup_capable(&pdev->dev, true); |
216 | opal_rtc_ops.read_alarm = opal_get_tpo_time; | 235 | opal_rtc_ops.read_alarm = opal_get_tpo_time; |
217 | opal_rtc_ops.set_alarm = opal_set_tpo_time; | 236 | opal_rtc_ops.set_alarm = opal_set_tpo_time; |
237 | opal_rtc_ops.alarm_irq_enable = opal_tpo_alarm_irq_enable; | ||
218 | } | 238 | } |
219 | 239 | ||
220 | rtc = devm_rtc_device_register(&pdev->dev, DRVNAME, &opal_rtc_ops, | 240 | rtc = devm_rtc_device_register(&pdev->dev, DRVNAME, &opal_rtc_ops, |