summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Xie <tony.xie@rock-chips.com>2019-06-21 06:34:38 -0400
committerLee Jones <lee.jones@linaro.org>2019-06-27 09:57:53 -0400
commitdc79054a64b3dc403ff370f9d4a4cbe502f81d77 (patch)
tree5af94b72e3b06475dfc7eab09c68d2d0ed97c338
parent696d7349f70ece84e0b485291a28781f0ce11245 (diff)
rtc: rk808: Add RK809 and RK817 support.
RK809 and RK817 are power management IC chips for multimedia products. Most of their functions and registers are same, including the rtc. Signed-off-by: Tony Xie <tony.xie@rock-chips.com> Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/rtc/Kconfig4
-rw-r--r--drivers/rtc/rtc-rk808.c68
2 files changed, 56 insertions, 16 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 7b8e156dbf38..cdd16c98a99c 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -373,11 +373,11 @@ config RTC_DRV_MAX77686
373 will be called rtc-max77686. 373 will be called rtc-max77686.
374 374
375config RTC_DRV_RK808 375config RTC_DRV_RK808
376 tristate "Rockchip RK805/RK808/RK818 RTC" 376 tristate "Rockchip RK805/RK808/RK809/RK817/RK818 RTC"
377 depends on MFD_RK808 377 depends on MFD_RK808
378 help 378 help
379 If you say yes here you will get support for the 379 If you say yes here you will get support for the
380 RTC of RK805, RK808 and RK818 PMIC. 380 RTC of RK805, RK809 and RK817, RK808 and RK818 PMIC.
381 381
382 This driver can also be built as a module. If so, the module 382 This driver can also be built as a module. If so, the module
383 will be called rk808-rtc. 383 will be called rk808-rtc.
diff --git a/drivers/rtc/rtc-rk808.c b/drivers/rtc/rtc-rk808.c
index 5c5d9f125669..6c6d674dad8d 100644
--- a/drivers/rtc/rtc-rk808.c
+++ b/drivers/rtc/rtc-rk808.c
@@ -50,9 +50,18 @@
50#define NUM_TIME_REGS (RK808_WEEKS_REG - RK808_SECONDS_REG + 1) 50#define NUM_TIME_REGS (RK808_WEEKS_REG - RK808_SECONDS_REG + 1)
51#define NUM_ALARM_REGS (RK808_ALARM_YEARS_REG - RK808_ALARM_SECONDS_REG + 1) 51#define NUM_ALARM_REGS (RK808_ALARM_YEARS_REG - RK808_ALARM_SECONDS_REG + 1)
52 52
53struct rk_rtc_compat_reg {
54 unsigned int ctrl_reg;
55 unsigned int status_reg;
56 unsigned int alarm_seconds_reg;
57 unsigned int int_reg;
58 unsigned int seconds_reg;
59};
60
53struct rk808_rtc { 61struct rk808_rtc {
54 struct rk808 *rk808; 62 struct rk808 *rk808;
55 struct rtc_device *rtc; 63 struct rtc_device *rtc;
64 struct rk_rtc_compat_reg *creg;
56 int irq; 65 int irq;
57}; 66};
58 67
@@ -101,7 +110,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
101 int ret; 110 int ret;
102 111
103 /* Force an update of the shadowed registers right now */ 112 /* Force an update of the shadowed registers right now */
104 ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, 113 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
105 BIT_RTC_CTRL_REG_RTC_GET_TIME, 114 BIT_RTC_CTRL_REG_RTC_GET_TIME,
106 BIT_RTC_CTRL_REG_RTC_GET_TIME); 115 BIT_RTC_CTRL_REG_RTC_GET_TIME);
107 if (ret) { 116 if (ret) {
@@ -115,7 +124,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
115 * 32khz. If we clear the GET_TIME bit here, the time of i2c transfer 124 * 32khz. If we clear the GET_TIME bit here, the time of i2c transfer
116 * certainly more than 31.25us: 16 * 2.5us at 400kHz bus frequency. 125 * certainly more than 31.25us: 16 * 2.5us at 400kHz bus frequency.
117 */ 126 */
118 ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, 127 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
119 BIT_RTC_CTRL_REG_RTC_GET_TIME, 128 BIT_RTC_CTRL_REG_RTC_GET_TIME,
120 0); 129 0);
121 if (ret) { 130 if (ret) {
@@ -123,7 +132,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
123 return ret; 132 return ret;
124 } 133 }
125 134
126 ret = regmap_bulk_read(rk808->regmap, RK808_SECONDS_REG, 135 ret = regmap_bulk_read(rk808->regmap, rk808_rtc->creg->seconds_reg,
127 rtc_data, NUM_TIME_REGS); 136 rtc_data, NUM_TIME_REGS);
128 if (ret) { 137 if (ret) {
129 dev_err(dev, "Failed to bulk read rtc_data: %d\n", ret); 138 dev_err(dev, "Failed to bulk read rtc_data: %d\n", ret);
@@ -162,7 +171,7 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
162 rtc_data[6] = bin2bcd(tm->tm_wday); 171 rtc_data[6] = bin2bcd(tm->tm_wday);
163 172
164 /* Stop RTC while updating the RTC registers */ 173 /* Stop RTC while updating the RTC registers */
165 ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, 174 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
166 BIT_RTC_CTRL_REG_STOP_RTC_M, 175 BIT_RTC_CTRL_REG_STOP_RTC_M,
167 BIT_RTC_CTRL_REG_STOP_RTC_M); 176 BIT_RTC_CTRL_REG_STOP_RTC_M);
168 if (ret) { 177 if (ret) {
@@ -170,14 +179,14 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
170 return ret; 179 return ret;
171 } 180 }
172 181
173 ret = regmap_bulk_write(rk808->regmap, RK808_SECONDS_REG, 182 ret = regmap_bulk_write(rk808->regmap, rk808_rtc->creg->seconds_reg,
174 rtc_data, NUM_TIME_REGS); 183 rtc_data, NUM_TIME_REGS);
175 if (ret) { 184 if (ret) {
176 dev_err(dev, "Failed to bull write rtc_data: %d\n", ret); 185 dev_err(dev, "Failed to bull write rtc_data: %d\n", ret);
177 return ret; 186 return ret;
178 } 187 }
179 /* Start RTC again */ 188 /* Start RTC again */
180 ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, 189 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
181 BIT_RTC_CTRL_REG_STOP_RTC_M, 0); 190 BIT_RTC_CTRL_REG_STOP_RTC_M, 0);
182 if (ret) { 191 if (ret) {
183 dev_err(dev, "Failed to update RTC control: %d\n", ret); 192 dev_err(dev, "Failed to update RTC control: %d\n", ret);
@@ -195,8 +204,13 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
195 uint32_t int_reg; 204 uint32_t int_reg;
196 int ret; 205 int ret;
197 206
198 ret = regmap_bulk_read(rk808->regmap, RK808_ALARM_SECONDS_REG, 207 ret = regmap_bulk_read(rk808->regmap,
208 rk808_rtc->creg->alarm_seconds_reg,
199 alrm_data, NUM_ALARM_REGS); 209 alrm_data, NUM_ALARM_REGS);
210 if (ret) {
211 dev_err(dev, "Failed to read RTC alarm date REG: %d\n", ret);
212 return ret;
213 }
200 214
201 alrm->time.tm_sec = bcd2bin(alrm_data[0] & SECONDS_REG_MSK); 215 alrm->time.tm_sec = bcd2bin(alrm_data[0] & SECONDS_REG_MSK);
202 alrm->time.tm_min = bcd2bin(alrm_data[1] & MINUTES_REG_MAK); 216 alrm->time.tm_min = bcd2bin(alrm_data[1] & MINUTES_REG_MAK);
@@ -206,7 +220,7 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
206 alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100; 220 alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100;
207 rockchip_to_gregorian(&alrm->time); 221 rockchip_to_gregorian(&alrm->time);
208 222
209 ret = regmap_read(rk808->regmap, RK808_RTC_INT_REG, &int_reg); 223 ret = regmap_read(rk808->regmap, rk808_rtc->creg->int_reg, &int_reg);
210 if (ret) { 224 if (ret) {
211 dev_err(dev, "Failed to read RTC INT REG: %d\n", ret); 225 dev_err(dev, "Failed to read RTC INT REG: %d\n", ret);
212 return ret; 226 return ret;
@@ -225,7 +239,7 @@ static int rk808_rtc_stop_alarm(struct rk808_rtc *rk808_rtc)
225 struct rk808 *rk808 = rk808_rtc->rk808; 239 struct rk808 *rk808 = rk808_rtc->rk808;
226 int ret; 240 int ret;
227 241
228 ret = regmap_update_bits(rk808->regmap, RK808_RTC_INT_REG, 242 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg,
229 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0); 243 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0);
230 244
231 return ret; 245 return ret;
@@ -236,7 +250,7 @@ static int rk808_rtc_start_alarm(struct rk808_rtc *rk808_rtc)
236 struct rk808 *rk808 = rk808_rtc->rk808; 250 struct rk808 *rk808 = rk808_rtc->rk808;
237 int ret; 251 int ret;
238 252
239 ret = regmap_update_bits(rk808->regmap, RK808_RTC_INT_REG, 253 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg,
240 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 254 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M,
241 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M); 255 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
242 256
@@ -266,7 +280,8 @@ static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
266 alrm_data[4] = bin2bcd(alrm->time.tm_mon + 1); 280 alrm_data[4] = bin2bcd(alrm->time.tm_mon + 1);
267 alrm_data[5] = bin2bcd(alrm->time.tm_year - 100); 281 alrm_data[5] = bin2bcd(alrm->time.tm_year - 100);
268 282
269 ret = regmap_bulk_write(rk808->regmap, RK808_ALARM_SECONDS_REG, 283 ret = regmap_bulk_write(rk808->regmap,
284 rk808_rtc->creg->alarm_seconds_reg,
270 alrm_data, NUM_ALARM_REGS); 285 alrm_data, NUM_ALARM_REGS);
271 if (ret) { 286 if (ret) {
272 dev_err(dev, "Failed to bulk write: %d\n", ret); 287 dev_err(dev, "Failed to bulk write: %d\n", ret);
@@ -310,7 +325,7 @@ static irqreturn_t rk808_alarm_irq(int irq, void *data)
310 struct i2c_client *client = rk808->i2c; 325 struct i2c_client *client = rk808->i2c;
311 int ret; 326 int ret;
312 327
313 ret = regmap_write(rk808->regmap, RK808_RTC_STATUS_REG, 328 ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg,
314 RTC_STATUS_MASK); 329 RTC_STATUS_MASK);
315 if (ret) { 330 if (ret) {
316 dev_err(&client->dev, 331 dev_err(&client->dev,
@@ -361,6 +376,22 @@ static int rk808_rtc_resume(struct device *dev)
361static SIMPLE_DEV_PM_OPS(rk808_rtc_pm_ops, 376static SIMPLE_DEV_PM_OPS(rk808_rtc_pm_ops,
362 rk808_rtc_suspend, rk808_rtc_resume); 377 rk808_rtc_suspend, rk808_rtc_resume);
363 378
379static struct rk_rtc_compat_reg rk808_creg = {
380 .ctrl_reg = RK808_RTC_CTRL_REG,
381 .status_reg = RK808_RTC_STATUS_REG,
382 .alarm_seconds_reg = RK808_ALARM_SECONDS_REG,
383 .int_reg = RK808_RTC_INT_REG,
384 .seconds_reg = RK808_SECONDS_REG,
385};
386
387static struct rk_rtc_compat_reg rk817_creg = {
388 .ctrl_reg = RK817_RTC_CTRL_REG,
389 .status_reg = RK817_RTC_STATUS_REG,
390 .alarm_seconds_reg = RK817_ALARM_SECONDS_REG,
391 .int_reg = RK817_RTC_INT_REG,
392 .seconds_reg = RK817_SECONDS_REG,
393};
394
364static int rk808_rtc_probe(struct platform_device *pdev) 395static int rk808_rtc_probe(struct platform_device *pdev)
365{ 396{
366 struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent); 397 struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
@@ -371,11 +402,20 @@ static int rk808_rtc_probe(struct platform_device *pdev)
371 if (rk808_rtc == NULL) 402 if (rk808_rtc == NULL)
372 return -ENOMEM; 403 return -ENOMEM;
373 404
405 switch (rk808->variant) {
406 case RK809_ID:
407 case RK817_ID:
408 rk808_rtc->creg = &rk817_creg;
409 break;
410 default:
411 rk808_rtc->creg = &rk808_creg;
412 break;
413 }
374 platform_set_drvdata(pdev, rk808_rtc); 414 platform_set_drvdata(pdev, rk808_rtc);
375 rk808_rtc->rk808 = rk808; 415 rk808_rtc->rk808 = rk808;
376 416
377 /* start rtc running by default, and use shadowed timer. */ 417 /* start rtc running by default, and use shadowed timer. */
378 ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, 418 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->ctrl_reg,
379 BIT_RTC_CTRL_REG_STOP_RTC_M | 419 BIT_RTC_CTRL_REG_STOP_RTC_M |
380 BIT_RTC_CTRL_REG_RTC_READSEL_M, 420 BIT_RTC_CTRL_REG_RTC_READSEL_M,
381 BIT_RTC_CTRL_REG_RTC_READSEL_M); 421 BIT_RTC_CTRL_REG_RTC_READSEL_M);
@@ -385,7 +425,7 @@ static int rk808_rtc_probe(struct platform_device *pdev)
385 return ret; 425 return ret;
386 } 426 }
387 427
388 ret = regmap_write(rk808->regmap, RK808_RTC_STATUS_REG, 428 ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg,
389 RTC_STATUS_MASK); 429 RTC_STATUS_MASK);
390 if (ret) { 430 if (ret) {
391 dev_err(&pdev->dev, 431 dev_err(&pdev->dev,