476 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/*3 * Real Time Clock driver for Wolfson Microelectronics WM831x4 *5 * Copyright (C) 2009 Wolfson Microelectronics PLC.6 *7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>8 *9 */10 11#include <linux/module.h>12#include <linux/kernel.h>13#include <linux/time.h>14#include <linux/rtc.h>15#include <linux/slab.h>16#include <linux/bcd.h>17#include <linux/interrupt.h>18#include <linux/ioctl.h>19#include <linux/completion.h>20#include <linux/mfd/wm831x/core.h>21#include <linux/delay.h>22#include <linux/platform_device.h>23#include <linux/random.h>24 25/*26 * R16416 (0x4020) - RTC Write Counter27 */28#define WM831X_RTC_WR_CNT_MASK 0xFFFF /* RTC_WR_CNT - [15:0] */29#define WM831X_RTC_WR_CNT_SHIFT 0 /* RTC_WR_CNT - [15:0] */30#define WM831X_RTC_WR_CNT_WIDTH 16 /* RTC_WR_CNT - [15:0] */31 32/*33 * R16417 (0x4021) - RTC Time 134 */35#define WM831X_RTC_TIME_MASK 0xFFFF /* RTC_TIME - [15:0] */36#define WM831X_RTC_TIME_SHIFT 0 /* RTC_TIME - [15:0] */37#define WM831X_RTC_TIME_WIDTH 16 /* RTC_TIME - [15:0] */38 39/*40 * R16418 (0x4022) - RTC Time 241 */42#define WM831X_RTC_TIME_MASK 0xFFFF /* RTC_TIME - [15:0] */43#define WM831X_RTC_TIME_SHIFT 0 /* RTC_TIME - [15:0] */44#define WM831X_RTC_TIME_WIDTH 16 /* RTC_TIME - [15:0] */45 46/*47 * R16419 (0x4023) - RTC Alarm 148 */49#define WM831X_RTC_ALM_MASK 0xFFFF /* RTC_ALM - [15:0] */50#define WM831X_RTC_ALM_SHIFT 0 /* RTC_ALM - [15:0] */51#define WM831X_RTC_ALM_WIDTH 16 /* RTC_ALM - [15:0] */52 53/*54 * R16420 (0x4024) - RTC Alarm 255 */56#define WM831X_RTC_ALM_MASK 0xFFFF /* RTC_ALM - [15:0] */57#define WM831X_RTC_ALM_SHIFT 0 /* RTC_ALM - [15:0] */58#define WM831X_RTC_ALM_WIDTH 16 /* RTC_ALM - [15:0] */59 60/*61 * R16421 (0x4025) - RTC Control62 */63#define WM831X_RTC_VALID 0x8000 /* RTC_VALID */64#define WM831X_RTC_VALID_MASK 0x8000 /* RTC_VALID */65#define WM831X_RTC_VALID_SHIFT 15 /* RTC_VALID */66#define WM831X_RTC_VALID_WIDTH 1 /* RTC_VALID */67#define WM831X_RTC_SYNC_BUSY 0x4000 /* RTC_SYNC_BUSY */68#define WM831X_RTC_SYNC_BUSY_MASK 0x4000 /* RTC_SYNC_BUSY */69#define WM831X_RTC_SYNC_BUSY_SHIFT 14 /* RTC_SYNC_BUSY */70#define WM831X_RTC_SYNC_BUSY_WIDTH 1 /* RTC_SYNC_BUSY */71#define WM831X_RTC_ALM_ENA 0x0400 /* RTC_ALM_ENA */72#define WM831X_RTC_ALM_ENA_MASK 0x0400 /* RTC_ALM_ENA */73#define WM831X_RTC_ALM_ENA_SHIFT 10 /* RTC_ALM_ENA */74#define WM831X_RTC_ALM_ENA_WIDTH 1 /* RTC_ALM_ENA */75#define WM831X_RTC_PINT_FREQ_MASK 0x0070 /* RTC_PINT_FREQ - [6:4] */76#define WM831X_RTC_PINT_FREQ_SHIFT 4 /* RTC_PINT_FREQ - [6:4] */77#define WM831X_RTC_PINT_FREQ_WIDTH 3 /* RTC_PINT_FREQ - [6:4] */78 79/*80 * R16422 (0x4026) - RTC Trim81 */82#define WM831X_RTC_TRIM_MASK 0x03FF /* RTC_TRIM - [9:0] */83#define WM831X_RTC_TRIM_SHIFT 0 /* RTC_TRIM - [9:0] */84#define WM831X_RTC_TRIM_WIDTH 10 /* RTC_TRIM - [9:0] */85 86#define WM831X_SET_TIME_RETRIES 587#define WM831X_GET_TIME_RETRIES 588 89struct wm831x_rtc {90 struct wm831x *wm831x;91 struct rtc_device *rtc;92 unsigned int alarm_enabled:1;93};94 95static void wm831x_rtc_add_randomness(struct wm831x *wm831x)96{97 int ret;98 u16 reg;99 100 /*101 * The write counter contains a pseudo-random number which is102 * regenerated every time we set the RTC so it should be a103 * useful per-system source of entropy.104 */105 ret = wm831x_reg_read(wm831x, WM831X_RTC_WRITE_COUNTER);106 if (ret >= 0) {107 reg = ret;108 add_device_randomness(®, sizeof(reg));109 } else {110 dev_warn(wm831x->dev, "Failed to read RTC write counter: %d\n",111 ret);112 }113}114 115/*116 * Read current time and date in RTC117 */118static int wm831x_rtc_readtime(struct device *dev, struct rtc_time *tm)119{120 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);121 struct wm831x *wm831x = wm831x_rtc->wm831x;122 u16 time1[2], time2[2];123 int ret;124 int count = 0;125 126 /* Has the RTC been programmed? */127 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL);128 if (ret < 0) {129 dev_err(dev, "Failed to read RTC control: %d\n", ret);130 return ret;131 }132 if (!(ret & WM831X_RTC_VALID)) {133 dev_dbg(dev, "RTC not yet configured\n");134 return -EINVAL;135 }136 137 /* Read twice to make sure we don't read a corrupt, partially138 * incremented, value.139 */140 do {141 ret = wm831x_bulk_read(wm831x, WM831X_RTC_TIME_1,142 2, time1);143 if (ret != 0)144 continue;145 146 ret = wm831x_bulk_read(wm831x, WM831X_RTC_TIME_1,147 2, time2);148 if (ret != 0)149 continue;150 151 if (memcmp(time1, time2, sizeof(time1)) == 0) {152 u32 time = (time1[0] << 16) | time1[1];153 154 rtc_time64_to_tm(time, tm);155 return 0;156 }157 158 } while (++count < WM831X_GET_TIME_RETRIES);159 160 dev_err(dev, "Timed out reading current time\n");161 162 return -EIO;163}164 165/*166 * Set current time and date in RTC167 */168static int wm831x_rtc_settime(struct device *dev, struct rtc_time *tm)169{170 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);171 struct wm831x *wm831x = wm831x_rtc->wm831x;172 struct rtc_time new_tm;173 unsigned long time, new_time;174 int ret;175 int count = 0;176 177 time = rtc_tm_to_time64(tm);178 179 ret = wm831x_reg_write(wm831x, WM831X_RTC_TIME_1,180 (time >> 16) & 0xffff);181 if (ret < 0) {182 dev_err(dev, "Failed to write TIME_1: %d\n", ret);183 return ret;184 }185 186 ret = wm831x_reg_write(wm831x, WM831X_RTC_TIME_2, time & 0xffff);187 if (ret < 0) {188 dev_err(dev, "Failed to write TIME_2: %d\n", ret);189 return ret;190 }191 192 /* Wait for the update to complete - should happen first time193 * round but be conservative.194 */195 do {196 msleep(1);197 198 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL);199 if (ret < 0)200 ret = WM831X_RTC_SYNC_BUSY;201 } while (!(ret & WM831X_RTC_SYNC_BUSY) &&202 ++count < WM831X_SET_TIME_RETRIES);203 204 if (ret & WM831X_RTC_SYNC_BUSY) {205 dev_err(dev, "Timed out writing RTC update\n");206 return -EIO;207 }208 209 /* Check that the update was accepted; security features may210 * have caused the update to be ignored.211 */212 ret = wm831x_rtc_readtime(dev, &new_tm);213 if (ret < 0)214 return ret;215 216 new_time = rtc_tm_to_time64(&new_tm);217 218 /* Allow a second of change in case of tick */219 if (new_time - time > 1) {220 dev_err(dev, "RTC update not permitted by hardware\n");221 return -EPERM;222 }223 224 return 0;225}226 227/*228 * Read alarm time and date in RTC229 */230static int wm831x_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)231{232 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);233 int ret;234 u16 data[2];235 u32 time;236 237 ret = wm831x_bulk_read(wm831x_rtc->wm831x, WM831X_RTC_ALARM_1,238 2, data);239 if (ret != 0) {240 dev_err(dev, "Failed to read alarm time: %d\n", ret);241 return ret;242 }243 244 time = (data[0] << 16) | data[1];245 246 rtc_time64_to_tm(time, &alrm->time);247 248 ret = wm831x_reg_read(wm831x_rtc->wm831x, WM831X_RTC_CONTROL);249 if (ret < 0) {250 dev_err(dev, "Failed to read RTC control: %d\n", ret);251 return ret;252 }253 254 if (ret & WM831X_RTC_ALM_ENA)255 alrm->enabled = 1;256 else257 alrm->enabled = 0;258 259 return 0;260}261 262static int wm831x_rtc_stop_alarm(struct wm831x_rtc *wm831x_rtc)263{264 wm831x_rtc->alarm_enabled = 0;265 266 return wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,267 WM831X_RTC_ALM_ENA, 0);268}269 270static int wm831x_rtc_start_alarm(struct wm831x_rtc *wm831x_rtc)271{272 wm831x_rtc->alarm_enabled = 1;273 274 return wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,275 WM831X_RTC_ALM_ENA, WM831X_RTC_ALM_ENA);276}277 278static int wm831x_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)279{280 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);281 struct wm831x *wm831x = wm831x_rtc->wm831x;282 int ret;283 unsigned long time;284 285 time = rtc_tm_to_time64(&alrm->time);286 287 ret = wm831x_rtc_stop_alarm(wm831x_rtc);288 if (ret < 0) {289 dev_err(dev, "Failed to stop alarm: %d\n", ret);290 return ret;291 }292 293 ret = wm831x_reg_write(wm831x, WM831X_RTC_ALARM_1,294 (time >> 16) & 0xffff);295 if (ret < 0) {296 dev_err(dev, "Failed to write ALARM_1: %d\n", ret);297 return ret;298 }299 300 ret = wm831x_reg_write(wm831x, WM831X_RTC_ALARM_2, time & 0xffff);301 if (ret < 0) {302 dev_err(dev, "Failed to write ALARM_2: %d\n", ret);303 return ret;304 }305 306 if (alrm->enabled) {307 ret = wm831x_rtc_start_alarm(wm831x_rtc);308 if (ret < 0) {309 dev_err(dev, "Failed to start alarm: %d\n", ret);310 return ret;311 }312 }313 314 return 0;315}316 317static int wm831x_rtc_alarm_irq_enable(struct device *dev,318 unsigned int enabled)319{320 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);321 322 if (enabled)323 return wm831x_rtc_start_alarm(wm831x_rtc);324 else325 return wm831x_rtc_stop_alarm(wm831x_rtc);326}327 328static irqreturn_t wm831x_alm_irq(int irq, void *data)329{330 struct wm831x_rtc *wm831x_rtc = data;331 332 rtc_update_irq(wm831x_rtc->rtc, 1, RTC_IRQF | RTC_AF);333 334 return IRQ_HANDLED;335}336 337static const struct rtc_class_ops wm831x_rtc_ops = {338 .read_time = wm831x_rtc_readtime,339 .set_time = wm831x_rtc_settime,340 .read_alarm = wm831x_rtc_readalarm,341 .set_alarm = wm831x_rtc_setalarm,342 .alarm_irq_enable = wm831x_rtc_alarm_irq_enable,343};344 345#ifdef CONFIG_PM346/* Turn off the alarm if it should not be a wake source. */347static int wm831x_rtc_suspend(struct device *dev)348{349 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);350 int ret, enable;351 352 if (wm831x_rtc->alarm_enabled && device_may_wakeup(dev))353 enable = WM831X_RTC_ALM_ENA;354 else355 enable = 0;356 357 ret = wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,358 WM831X_RTC_ALM_ENA, enable);359 if (ret != 0)360 dev_err(dev, "Failed to update RTC alarm: %d\n", ret);361 362 return 0;363}364 365/* Enable the alarm if it should be enabled (in case it was disabled to366 * prevent use as a wake source).367 */368static int wm831x_rtc_resume(struct device *dev)369{370 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);371 int ret;372 373 if (wm831x_rtc->alarm_enabled) {374 ret = wm831x_rtc_start_alarm(wm831x_rtc);375 if (ret != 0)376 dev_err(dev, "Failed to restart RTC alarm: %d\n", ret);377 }378 379 return 0;380}381 382/* Unconditionally disable the alarm */383static int wm831x_rtc_freeze(struct device *dev)384{385 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);386 int ret;387 388 ret = wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,389 WM831X_RTC_ALM_ENA, 0);390 if (ret != 0)391 dev_err(dev, "Failed to stop RTC alarm: %d\n", ret);392 393 return 0;394}395#else396#define wm831x_rtc_suspend NULL397#define wm831x_rtc_resume NULL398#define wm831x_rtc_freeze NULL399#endif400 401static int wm831x_rtc_probe(struct platform_device *pdev)402{403 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);404 struct wm831x_rtc *wm831x_rtc;405 int alm_irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "ALM"));406 int ret = 0;407 408 wm831x_rtc = devm_kzalloc(&pdev->dev, sizeof(*wm831x_rtc), GFP_KERNEL);409 if (wm831x_rtc == NULL)410 return -ENOMEM;411 412 platform_set_drvdata(pdev, wm831x_rtc);413 wm831x_rtc->wm831x = wm831x;414 415 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL);416 if (ret < 0) {417 dev_err(&pdev->dev, "Failed to read RTC control: %d\n", ret);418 return ret;419 }420 if (ret & WM831X_RTC_ALM_ENA)421 wm831x_rtc->alarm_enabled = 1;422 423 device_init_wakeup(&pdev->dev, 1);424 425 wm831x_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);426 if (IS_ERR(wm831x_rtc->rtc))427 return PTR_ERR(wm831x_rtc->rtc);428 429 wm831x_rtc->rtc->ops = &wm831x_rtc_ops;430 wm831x_rtc->rtc->range_max = U32_MAX;431 432 ret = devm_rtc_register_device(wm831x_rtc->rtc);433 if (ret)434 return ret;435 436 ret = devm_request_threaded_irq(&pdev->dev, alm_irq, NULL,437 wm831x_alm_irq,438 IRQF_TRIGGER_RISING | IRQF_ONESHOT,439 "RTC alarm",440 wm831x_rtc);441 if (ret != 0) {442 dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n",443 alm_irq, ret);444 }445 446 wm831x_rtc_add_randomness(wm831x);447 448 return 0;449}450 451static const struct dev_pm_ops wm831x_rtc_pm_ops = {452 .suspend = wm831x_rtc_suspend,453 .resume = wm831x_rtc_resume,454 455 .freeze = wm831x_rtc_freeze,456 .thaw = wm831x_rtc_resume,457 .restore = wm831x_rtc_resume,458 459 .poweroff = wm831x_rtc_suspend,460};461 462static struct platform_driver wm831x_rtc_driver = {463 .probe = wm831x_rtc_probe,464 .driver = {465 .name = "wm831x-rtc",466 .pm = &wm831x_rtc_pm_ops,467 },468};469 470module_platform_driver(wm831x_rtc_driver);471 472MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");473MODULE_DESCRIPTION("RTC driver for the WM831x series PMICs");474MODULE_LICENSE("GPL");475MODULE_ALIAS("platform:wm831x-rtc");476