diff options
author | Tony Xie <tony.xie@rock-chips.com> | 2019-06-21 06:34:38 -0400 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2019-06-27 09:57:53 -0400 |
commit | dc79054a64b3dc403ff370f9d4a4cbe502f81d77 (patch) | |
tree | 5af94b72e3b06475dfc7eab09c68d2d0ed97c338 | |
parent | 696d7349f70ece84e0b485291a28781f0ce11245 (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/Kconfig | 4 | ||||
-rw-r--r-- | drivers/rtc/rtc-rk808.c | 68 |
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 | ||
375 | config RTC_DRV_RK808 | 375 | config 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 | ||
53 | struct 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 | |||
53 | struct rk808_rtc { | 61 | struct 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) | |||
361 | static SIMPLE_DEV_PM_OPS(rk808_rtc_pm_ops, | 376 | static SIMPLE_DEV_PM_OPS(rk808_rtc_pm_ops, |
362 | rk808_rtc_suspend, rk808_rtc_resume); | 377 | rk808_rtc_suspend, rk808_rtc_resume); |
363 | 378 | ||
379 | static 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 | |||
387 | static 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 | |||
364 | static int rk808_rtc_probe(struct platform_device *pdev) | 395 | static 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, |