diff options
| author | Krzysztof Kozlowski <k.kozlowski@samsung.com> | 2014-06-10 18:18:44 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-10 18:34:47 -0400 |
| commit | f8b23bbdad5dfb50af101a56c58ad4e83510a9a6 (patch) | |
| tree | a82f4e1d56794b98e882aa0cff641284a70c3444 | |
| parent | 0c5f5d9af311013aabc519b68df19533d0d51cda (diff) | |
rtc: s5m: support different register layout
Prepare for adding support for S2MPS14 RTC device to the rtc-s5m driver:
1. Add a map of registers used by the driver which differ between
the chipsets (S5M876X and S2MPS14).
2. Move code of checking for alarm pending to separate function.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Sangbeom Kim <sbkim73@samsung.com>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/rtc/rtc-s5m.c | 157 |
1 files changed, 109 insertions, 48 deletions
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index 3751ef90f93c..59860128a221 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2013 Samsung Electronics Co., Ltd | 2 | * Copyright (c) 2013-2014 Samsung Electronics Co., Ltd |
| 3 | * http://www.samsung.com | 3 | * http://www.samsung.com |
| 4 | * | 4 | * |
| 5 | * Copyright (C) 2013 Google, Inc | 5 | * Copyright (C) 2013 Google, Inc |
| @@ -38,6 +38,42 @@ | |||
| 38 | */ | 38 | */ |
| 39 | #define UDR_READ_RETRY_CNT 5 | 39 | #define UDR_READ_RETRY_CNT 5 |
| 40 | 40 | ||
| 41 | /* Registers used by the driver which are different between chipsets. */ | ||
| 42 | struct s5m_rtc_reg_config { | ||
| 43 | /* Number of registers used for setting time/alarm0/alarm1 */ | ||
| 44 | unsigned int regs_count; | ||
| 45 | /* First register for time, seconds */ | ||
| 46 | unsigned int time; | ||
| 47 | /* RTC control register */ | ||
| 48 | unsigned int ctrl; | ||
| 49 | /* First register for alarm 0, seconds */ | ||
| 50 | unsigned int alarm0; | ||
| 51 | /* First register for alarm 1, seconds */ | ||
| 52 | unsigned int alarm1; | ||
| 53 | /* SMPL/WTSR register */ | ||
| 54 | unsigned int smpl_wtsr; | ||
| 55 | /* | ||
| 56 | * Register for update flag (UDR). Typically setting UDR field to 1 | ||
| 57 | * will enable update of time or alarm register. Then it will be | ||
| 58 | * auto-cleared after successful update. | ||
| 59 | */ | ||
| 60 | unsigned int rtc_udr_update; | ||
| 61 | /* Mask for UDR field in 'rtc_udr_update' register */ | ||
| 62 | unsigned int rtc_udr_mask; | ||
| 63 | }; | ||
| 64 | |||
| 65 | /* Register map for S5M8763 and S5M8767 */ | ||
| 66 | static const struct s5m_rtc_reg_config s5m_rtc_regs = { | ||
| 67 | .regs_count = 8, | ||
| 68 | .time = S5M_RTC_SEC, | ||
| 69 | .ctrl = S5M_ALARM1_CONF, | ||
| 70 | .alarm0 = S5M_ALARM0_SEC, | ||
| 71 | .alarm1 = S5M_ALARM1_SEC, | ||
| 72 | .smpl_wtsr = S5M_WTSR_SMPL_CNTL, | ||
| 73 | .rtc_udr_update = S5M_RTC_UDR_CON, | ||
| 74 | .rtc_udr_mask = S5M_RTC_UDR_MASK, | ||
| 75 | }; | ||
| 76 | |||
| 41 | struct s5m_rtc_info { | 77 | struct s5m_rtc_info { |
| 42 | struct device *dev; | 78 | struct device *dev; |
| 43 | struct i2c_client *i2c; | 79 | struct i2c_client *i2c; |
| @@ -48,6 +84,7 @@ struct s5m_rtc_info { | |||
| 48 | int device_type; | 84 | int device_type; |
| 49 | int rtc_24hr_mode; | 85 | int rtc_24hr_mode; |
| 50 | bool wtsr_smpl; | 86 | bool wtsr_smpl; |
| 87 | const struct s5m_rtc_reg_config *regs; | ||
| 51 | }; | 88 | }; |
| 52 | 89 | ||
| 53 | static const struct regmap_config s5m_rtc_regmap_config = { | 90 | static const struct regmap_config s5m_rtc_regmap_config = { |
| @@ -119,8 +156,9 @@ static inline int s5m8767_wait_for_udr_update(struct s5m_rtc_info *info) | |||
| 119 | unsigned int data; | 156 | unsigned int data; |
| 120 | 157 | ||
| 121 | do { | 158 | do { |
| 122 | ret = regmap_read(info->regmap, S5M_RTC_UDR_CON, &data); | 159 | ret = regmap_read(info->regmap, info->regs->rtc_udr_update, |
| 123 | } while (--retry && (data & S5M_RTC_UDR_MASK) && !ret); | 160 | &data); |
| 161 | } while (--retry && (data & info->regs->rtc_udr_mask) && !ret); | ||
| 124 | 162 | ||
| 125 | if (!retry) | 163 | if (!retry) |
| 126 | dev_err(info->dev, "waiting for UDR update, reached max number of retries\n"); | 164 | dev_err(info->dev, "waiting for UDR update, reached max number of retries\n"); |
| @@ -128,21 +166,47 @@ static inline int s5m8767_wait_for_udr_update(struct s5m_rtc_info *info) | |||
| 128 | return ret; | 166 | return ret; |
| 129 | } | 167 | } |
| 130 | 168 | ||
| 169 | static inline int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info, | ||
| 170 | struct rtc_wkalrm *alarm) | ||
| 171 | { | ||
| 172 | int ret; | ||
| 173 | unsigned int val; | ||
| 174 | |||
| 175 | switch (info->device_type) { | ||
| 176 | case S5M8767X: | ||
| 177 | case S5M8763X: | ||
| 178 | ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val); | ||
| 179 | val &= S5M_ALARM0_STATUS; | ||
| 180 | break; | ||
| 181 | default: | ||
| 182 | return -EINVAL; | ||
| 183 | } | ||
| 184 | if (ret < 0) | ||
| 185 | return ret; | ||
| 186 | |||
| 187 | if (val) | ||
| 188 | alarm->pending = 1; | ||
| 189 | else | ||
| 190 | alarm->pending = 0; | ||
| 191 | |||
| 192 | return 0; | ||
| 193 | } | ||
| 194 | |||
| 131 | static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) | 195 | static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) |
| 132 | { | 196 | { |
| 133 | int ret; | 197 | int ret; |
| 134 | unsigned int data; | 198 | unsigned int data; |
| 135 | 199 | ||
| 136 | ret = regmap_read(info->regmap, S5M_RTC_UDR_CON, &data); | 200 | ret = regmap_read(info->regmap, info->regs->rtc_udr_update, &data); |
| 137 | if (ret < 0) { | 201 | if (ret < 0) { |
| 138 | dev_err(info->dev, "failed to read update reg(%d)\n", ret); | 202 | dev_err(info->dev, "failed to read update reg(%d)\n", ret); |
| 139 | return ret; | 203 | return ret; |
| 140 | } | 204 | } |
| 141 | 205 | ||
| 142 | data |= S5M_RTC_TIME_EN_MASK; | 206 | data |= S5M_RTC_TIME_EN_MASK; |
| 143 | data |= S5M_RTC_UDR_MASK; | 207 | data |= info->regs->rtc_udr_mask; |
| 144 | 208 | ||
| 145 | ret = regmap_write(info->regmap, S5M_RTC_UDR_CON, data); | 209 | ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data); |
| 146 | if (ret < 0) { | 210 | if (ret < 0) { |
| 147 | dev_err(info->dev, "failed to write update reg(%d)\n", ret); | 211 | dev_err(info->dev, "failed to write update reg(%d)\n", ret); |
| 148 | return ret; | 212 | return ret; |
| @@ -158,7 +222,7 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) | |||
| 158 | int ret; | 222 | int ret; |
| 159 | unsigned int data; | 223 | unsigned int data; |
| 160 | 224 | ||
| 161 | ret = regmap_read(info->regmap, S5M_RTC_UDR_CON, &data); | 225 | ret = regmap_read(info->regmap, info->regs->rtc_udr_update, &data); |
| 162 | if (ret < 0) { | 226 | if (ret < 0) { |
| 163 | dev_err(info->dev, "%s: fail to read update reg(%d)\n", | 227 | dev_err(info->dev, "%s: fail to read update reg(%d)\n", |
| 164 | __func__, ret); | 228 | __func__, ret); |
| @@ -166,9 +230,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) | |||
| 166 | } | 230 | } |
| 167 | 231 | ||
| 168 | data &= ~S5M_RTC_TIME_EN_MASK; | 232 | data &= ~S5M_RTC_TIME_EN_MASK; |
| 169 | data |= S5M_RTC_UDR_MASK; | 233 | data |= info->regs->rtc_udr_mask; |
| 170 | 234 | ||
| 171 | ret = regmap_write(info->regmap, S5M_RTC_UDR_CON, data); | 235 | ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data); |
| 172 | if (ret < 0) { | 236 | if (ret < 0) { |
| 173 | dev_err(info->dev, "%s: fail to write update reg(%d)\n", | 237 | dev_err(info->dev, "%s: fail to write update reg(%d)\n", |
| 174 | __func__, ret); | 238 | __func__, ret); |
| @@ -215,10 +279,11 @@ static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data) | |||
| 215 | static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | 279 | static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) |
| 216 | { | 280 | { |
| 217 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 281 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
| 218 | u8 data[8]; | 282 | u8 data[info->regs->regs_count]; |
| 219 | int ret; | 283 | int ret; |
| 220 | 284 | ||
| 221 | ret = regmap_bulk_read(info->regmap, S5M_RTC_SEC, data, 8); | 285 | ret = regmap_bulk_read(info->regmap, info->regs->time, data, |
| 286 | info->regs->regs_count); | ||
| 222 | if (ret < 0) | 287 | if (ret < 0) |
| 223 | return ret; | 288 | return ret; |
| 224 | 289 | ||
| @@ -245,7 +310,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 245 | static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | 310 | static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) |
| 246 | { | 311 | { |
| 247 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 312 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
| 248 | u8 data[8]; | 313 | u8 data[info->regs->regs_count]; |
| 249 | int ret = 0; | 314 | int ret = 0; |
| 250 | 315 | ||
| 251 | switch (info->device_type) { | 316 | switch (info->device_type) { |
| @@ -266,7 +331,8 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 266 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | 331 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, |
| 267 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | 332 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); |
| 268 | 333 | ||
| 269 | ret = regmap_raw_write(info->regmap, S5M_RTC_SEC, data, 8); | 334 | ret = regmap_raw_write(info->regmap, info->regs->time, data, |
| 335 | info->regs->regs_count); | ||
| 270 | if (ret < 0) | 336 | if (ret < 0) |
| 271 | return ret; | 337 | return ret; |
| 272 | 338 | ||
| @@ -278,11 +344,12 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 278 | static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 344 | static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
| 279 | { | 345 | { |
| 280 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 346 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
| 281 | u8 data[8]; | 347 | u8 data[info->regs->regs_count]; |
| 282 | unsigned int val; | 348 | unsigned int val; |
| 283 | int ret, i; | 349 | int ret, i; |
| 284 | 350 | ||
| 285 | ret = regmap_bulk_read(info->regmap, S5M_ALARM0_SEC, data, 8); | 351 | ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data, |
| 352 | info->regs->regs_count); | ||
| 286 | if (ret < 0) | 353 | if (ret < 0) |
| 287 | return ret; | 354 | return ret; |
| 288 | 355 | ||
| @@ -294,54 +361,42 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 294 | return ret; | 361 | return ret; |
| 295 | 362 | ||
| 296 | alrm->enabled = !!val; | 363 | alrm->enabled = !!val; |
| 297 | |||
| 298 | ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val); | ||
| 299 | if (ret < 0) | ||
| 300 | return ret; | ||
| 301 | |||
| 302 | break; | 364 | break; |
| 303 | 365 | ||
| 304 | case S5M8767X: | 366 | case S5M8767X: |
| 305 | s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); | 367 | s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); |
| 306 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
| 307 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, | ||
| 308 | alrm->time.tm_mday, alrm->time.tm_hour, | ||
| 309 | alrm->time.tm_min, alrm->time.tm_sec, | ||
| 310 | alrm->time.tm_wday); | ||
| 311 | |||
| 312 | alrm->enabled = 0; | 368 | alrm->enabled = 0; |
| 313 | for (i = 0; i < 7; i++) { | 369 | for (i = 0; i < info->regs->regs_count; i++) { |
| 314 | if (data[i] & ALARM_ENABLE_MASK) { | 370 | if (data[i] & ALARM_ENABLE_MASK) { |
| 315 | alrm->enabled = 1; | 371 | alrm->enabled = 1; |
| 316 | break; | 372 | break; |
| 317 | } | 373 | } |
| 318 | } | 374 | } |
| 319 | |||
| 320 | alrm->pending = 0; | ||
| 321 | ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val); | ||
| 322 | if (ret < 0) | ||
| 323 | return ret; | ||
| 324 | break; | 375 | break; |
| 325 | 376 | ||
| 326 | default: | 377 | default: |
| 327 | return -EINVAL; | 378 | return -EINVAL; |
| 328 | } | 379 | } |
| 329 | 380 | ||
| 330 | if (val & S5M_ALARM0_STATUS) | 381 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, |
| 331 | alrm->pending = 1; | 382 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, |
| 332 | else | 383 | alrm->time.tm_mday, alrm->time.tm_hour, |
| 333 | alrm->pending = 0; | 384 | alrm->time.tm_min, alrm->time.tm_sec, |
| 385 | alrm->time.tm_wday); | ||
| 386 | |||
| 387 | ret = s5m_check_peding_alarm_interrupt(info, alrm); | ||
| 334 | 388 | ||
| 335 | return 0; | 389 | return 0; |
| 336 | } | 390 | } |
| 337 | 391 | ||
| 338 | static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | 392 | static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) |
| 339 | { | 393 | { |
| 340 | u8 data[8]; | 394 | u8 data[info->regs->regs_count]; |
| 341 | int ret, i; | 395 | int ret, i; |
| 342 | struct rtc_time tm; | 396 | struct rtc_time tm; |
| 343 | 397 | ||
| 344 | ret = regmap_bulk_read(info->regmap, S5M_ALARM0_SEC, data, 8); | 398 | ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data, |
| 399 | info->regs->regs_count); | ||
| 345 | if (ret < 0) | 400 | if (ret < 0) |
| 346 | return ret; | 401 | return ret; |
| 347 | 402 | ||
| @@ -356,10 +411,11 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | |||
| 356 | break; | 411 | break; |
| 357 | 412 | ||
| 358 | case S5M8767X: | 413 | case S5M8767X: |
| 359 | for (i = 0; i < 7; i++) | 414 | for (i = 0; i < info->regs->regs_count; i++) |
| 360 | data[i] &= ~ALARM_ENABLE_MASK; | 415 | data[i] &= ~ALARM_ENABLE_MASK; |
| 361 | 416 | ||
| 362 | ret = regmap_raw_write(info->regmap, S5M_ALARM0_SEC, data, 8); | 417 | ret = regmap_raw_write(info->regmap, info->regs->alarm0, data, |
| 418 | info->regs->regs_count); | ||
| 363 | if (ret < 0) | 419 | if (ret < 0) |
| 364 | return ret; | 420 | return ret; |
| 365 | 421 | ||
| @@ -377,11 +433,12 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | |||
| 377 | static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | 433 | static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) |
| 378 | { | 434 | { |
| 379 | int ret; | 435 | int ret; |
| 380 | u8 data[8]; | 436 | u8 data[info->regs->regs_count]; |
| 381 | u8 alarm0_conf; | 437 | u8 alarm0_conf; |
| 382 | struct rtc_time tm; | 438 | struct rtc_time tm; |
| 383 | 439 | ||
| 384 | ret = regmap_bulk_read(info->regmap, S5M_ALARM0_SEC, data, 8); | 440 | ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data, |
| 441 | info->regs->regs_count); | ||
| 385 | if (ret < 0) | 442 | if (ret < 0) |
| 386 | return ret; | 443 | return ret; |
| 387 | 444 | ||
| @@ -408,7 +465,8 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | |||
| 408 | if (data[RTC_YEAR1] & 0x7f) | 465 | if (data[RTC_YEAR1] & 0x7f) |
| 409 | data[RTC_YEAR1] |= ALARM_ENABLE_MASK; | 466 | data[RTC_YEAR1] |= ALARM_ENABLE_MASK; |
| 410 | 467 | ||
| 411 | ret = regmap_raw_write(info->regmap, S5M_ALARM0_SEC, data, 8); | 468 | ret = regmap_raw_write(info->regmap, info->regs->alarm0, data, |
| 469 | info->regs->regs_count); | ||
| 412 | if (ret < 0) | 470 | if (ret < 0) |
| 413 | return ret; | 471 | return ret; |
| 414 | ret = s5m8767_rtc_set_alarm_reg(info); | 472 | ret = s5m8767_rtc_set_alarm_reg(info); |
| @@ -425,7 +483,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | |||
| 425 | static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 483 | static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
| 426 | { | 484 | { |
| 427 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 485 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
| 428 | u8 data[8]; | 486 | u8 data[info->regs->regs_count]; |
| 429 | int ret; | 487 | int ret; |
| 430 | 488 | ||
| 431 | switch (info->device_type) { | 489 | switch (info->device_type) { |
| @@ -450,7 +508,8 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 450 | if (ret < 0) | 508 | if (ret < 0) |
| 451 | return ret; | 509 | return ret; |
| 452 | 510 | ||
| 453 | ret = regmap_raw_write(info->regmap, S5M_ALARM0_SEC, data, 8); | 511 | ret = regmap_raw_write(info->regmap, info->regs->alarm0, data, |
| 512 | info->regs->regs_count); | ||
| 454 | if (ret < 0) | 513 | if (ret < 0) |
| 455 | return ret; | 514 | return ret; |
| 456 | 515 | ||
| @@ -495,7 +554,7 @@ static const struct rtc_class_ops s5m_rtc_ops = { | |||
| 495 | static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable) | 554 | static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable) |
| 496 | { | 555 | { |
| 497 | int ret; | 556 | int ret; |
| 498 | ret = regmap_update_bits(info->regmap, S5M_WTSR_SMPL_CNTL, | 557 | ret = regmap_update_bits(info->regmap, info->regs->smpl_wtsr, |
| 499 | WTSR_ENABLE_MASK, | 558 | WTSR_ENABLE_MASK, |
| 500 | enable ? WTSR_ENABLE_MASK : 0); | 559 | enable ? WTSR_ENABLE_MASK : 0); |
| 501 | if (ret < 0) | 560 | if (ret < 0) |
| @@ -506,7 +565,7 @@ static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable) | |||
| 506 | static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable) | 565 | static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable) |
| 507 | { | 566 | { |
| 508 | int ret; | 567 | int ret; |
| 509 | ret = regmap_update_bits(info->regmap, S5M_WTSR_SMPL_CNTL, | 568 | ret = regmap_update_bits(info->regmap, info->regs->smpl_wtsr, |
| 510 | SMPL_ENABLE_MASK, | 569 | SMPL_ENABLE_MASK, |
| 511 | enable ? SMPL_ENABLE_MASK : 0); | 570 | enable ? SMPL_ENABLE_MASK : 0); |
| 512 | if (ret < 0) | 571 | if (ret < 0) |
| @@ -564,9 +623,11 @@ static int s5m_rtc_probe(struct platform_device *pdev) | |||
| 564 | break; | 623 | break; |
| 565 | case S5M8763X: | 624 | case S5M8763X: |
| 566 | regmap_cfg = &s5m_rtc_regmap_config; | 625 | regmap_cfg = &s5m_rtc_regmap_config; |
| 626 | info->regs = &s5m_rtc_regs; | ||
| 567 | break; | 627 | break; |
| 568 | case S5M8767X: | 628 | case S5M8767X: |
| 569 | regmap_cfg = &s5m_rtc_regmap_config; | 629 | regmap_cfg = &s5m_rtc_regmap_config; |
| 630 | info->regs = &s5m_rtc_regs; | ||
| 570 | break; | 631 | break; |
| 571 | default: | 632 | default: |
| 572 | dev_err(&pdev->dev, "Device type is not supported by RTC driver\n"); | 633 | dev_err(&pdev->dev, "Device type is not supported by RTC driver\n"); |
| @@ -653,7 +714,7 @@ static void s5m_rtc_shutdown(struct platform_device *pdev) | |||
| 653 | if (info->wtsr_smpl) { | 714 | if (info->wtsr_smpl) { |
| 654 | for (i = 0; i < 3; i++) { | 715 | for (i = 0; i < 3; i++) { |
| 655 | s5m_rtc_enable_wtsr(info, false); | 716 | s5m_rtc_enable_wtsr(info, false); |
| 656 | regmap_read(info->regmap, S5M_WTSR_SMPL_CNTL, &val); | 717 | regmap_read(info->regmap, info->regs->smpl_wtsr, &val); |
| 657 | pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val); | 718 | pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val); |
| 658 | if (val & WTSR_ENABLE_MASK) | 719 | if (val & WTSR_ENABLE_MASK) |
| 659 | pr_emerg("%s: fail to disable WTSR\n", | 720 | pr_emerg("%s: fail to disable WTSR\n", |
