Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtc: pcf8563: Switch to regmap

Switch the i2c_transfer methods to regmap APIs.

Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Link: https://lore.kernel.org/r/20241010084949.3351182-3-iwamatsu@nigauri.org
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

authored by

Nobuhiro Iwamatsu and committed by
Alexandre Belloni
00f1bb9b b263d7c1

+82 -123
+1
drivers/rtc/Kconfig
··· 496 496 497 497 config RTC_DRV_PCF8563 498 498 tristate "Philips PCF8563/Epson RTC8564" 499 + select REGMAP_I2C 499 500 help 500 501 If you say yes here you get support for the 501 502 Philips PCF8563 RTC chip. The Epson RTC8564
+81 -123
drivers/rtc/rtc-pcf8563.c
··· 17 17 #include <linux/i2c.h> 18 18 #include <linux/module.h> 19 19 #include <linux/of.h> 20 + #include <linux/regmap.h> 20 21 #include <linux/rtc.h> 21 22 #include <linux/slab.h> 22 23 ··· 78 77 */ 79 78 int c_polarity; /* 0: MO_C=1 means 19xx, otherwise MO_C=1 means 20xx */ 80 79 81 - struct i2c_client *client; 80 + struct regmap *regmap; 82 81 #ifdef CONFIG_COMMON_CLK 83 82 struct clk_hw clkout_hw; 84 83 #endif 85 84 }; 86 85 87 - static int pcf8563_read_block_data(struct i2c_client *client, unsigned char reg, 88 - unsigned char length, unsigned char *buf) 86 + static int pcf8563_set_alarm_mode(struct pcf8563 *pcf8563, bool on) 89 87 { 90 - struct i2c_msg msgs[] = { 91 - {/* setup read ptr */ 92 - .addr = client->addr, 93 - .len = 1, 94 - .buf = &reg, 95 - }, 96 - { 97 - .addr = client->addr, 98 - .flags = I2C_M_RD, 99 - .len = length, 100 - .buf = buf 101 - }, 102 - }; 103 - 104 - if ((i2c_transfer(client->adapter, msgs, 2)) != 2) { 105 - dev_err(&client->dev, "%s: read error\n", __func__); 106 - return -EIO; 107 - } 108 - 109 - return 0; 110 - } 111 - 112 - static int pcf8563_write_block_data(struct i2c_client *client, 113 - unsigned char reg, unsigned char length, 114 - unsigned char *buf) 115 - { 116 - int i, err; 117 - 118 - for (i = 0; i < length; i++) { 119 - unsigned char data[2] = { reg + i, buf[i] }; 120 - 121 - err = i2c_master_send(client, data, sizeof(data)); 122 - if (err != sizeof(data)) { 123 - dev_err(&client->dev, 124 - "%s: err=%d addr=%02x, data=%02x\n", 125 - __func__, err, data[0], data[1]); 126 - return -EIO; 127 - } 128 - } 129 - 130 - return 0; 131 - } 132 - 133 - static int pcf8563_set_alarm_mode(struct i2c_client *client, bool on) 134 - { 135 - unsigned char buf; 88 + u32 buf; 136 89 int err; 137 90 138 - err = pcf8563_read_block_data(client, PCF8563_REG_ST2, 1, &buf); 91 + err = regmap_read(pcf8563->regmap, PCF8563_REG_ST2, &buf); 139 92 if (err < 0) 140 93 return err; 141 94 ··· 100 145 101 146 buf &= ~(PCF8563_BIT_AF | PCF8563_BITS_ST2_N); 102 147 103 - err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); 104 - if (err < 0) { 105 - dev_err(&client->dev, "%s: write error\n", __func__); 106 - return -EIO; 107 - } 108 - 109 - return 0; 148 + return regmap_write(pcf8563->regmap, PCF8563_REG_ST2, buf); 110 149 } 111 150 112 - static int pcf8563_get_alarm_mode(struct i2c_client *client, unsigned char *en, 151 + static int pcf8563_get_alarm_mode(struct pcf8563 *pcf8563, unsigned char *en, 113 152 unsigned char *pen) 114 153 { 115 - unsigned char buf; 154 + u32 buf; 116 155 int err; 117 156 118 - err = pcf8563_read_block_data(client, PCF8563_REG_ST2, 1, &buf); 119 - if (err) 157 + err = regmap_read(pcf8563->regmap, PCF8563_REG_ST2, &buf); 158 + if (err < 0) 120 159 return err; 121 160 122 161 if (en) ··· 123 174 124 175 static irqreturn_t pcf8563_irq(int irq, void *dev_id) 125 176 { 126 - struct pcf8563 *pcf8563 = i2c_get_clientdata(dev_id); 127 - int err; 177 + struct pcf8563 *pcf8563 = dev_id; 128 178 char pending; 179 + int err; 129 180 130 - err = pcf8563_get_alarm_mode(pcf8563->client, NULL, &pending); 181 + err = pcf8563_get_alarm_mode(pcf8563, NULL, &pending); 131 182 if (err) 132 183 return IRQ_NONE; 133 184 134 185 if (pending) { 135 186 rtc_update_irq(pcf8563->rtc, 1, RTC_IRQF | RTC_AF); 136 - pcf8563_set_alarm_mode(pcf8563->client, 1); 187 + pcf8563_set_alarm_mode(pcf8563, 1); 137 188 return IRQ_HANDLED; 138 189 } 139 190 ··· 146 197 */ 147 198 static int pcf8563_rtc_read_time(struct device *dev, struct rtc_time *tm) 148 199 { 149 - struct i2c_client *client = to_i2c_client(dev); 150 - struct pcf8563 *pcf8563 = i2c_get_clientdata(client); 200 + struct pcf8563 *pcf8563 = dev_get_drvdata(dev); 151 201 unsigned char buf[9]; 152 202 int err; 153 203 154 - err = pcf8563_read_block_data(client, PCF8563_REG_ST1, 9, buf); 155 - if (err) 204 + err = regmap_bulk_read(pcf8563->regmap, PCF8563_REG_ST1, buf, 205 + sizeof(buf)); 206 + if (err < 0) 156 207 return err; 157 208 158 209 if (buf[PCF8563_REG_SC] & PCF8563_SC_LV) { 159 - dev_err(&client->dev, 210 + dev_err(dev, 160 211 "low voltage detected, date/time is not reliable.\n"); 161 212 return -EINVAL; 162 213 } 163 214 164 - dev_dbg(&client->dev, 215 + dev_dbg(dev, 165 216 "%s: raw data is st1=%02x, st2=%02x, sec=%02x, min=%02x, hr=%02x, " 166 217 "mday=%02x, wday=%02x, mon=%02x, year=%02x\n", 167 218 __func__, 168 219 buf[0], buf[1], buf[2], buf[3], 169 220 buf[4], buf[5], buf[6], buf[7], 170 221 buf[8]); 171 - 172 222 173 223 tm->tm_sec = bcd2bin(buf[PCF8563_REG_SC] & 0x7F); 174 224 tm->tm_min = bcd2bin(buf[PCF8563_REG_MN] & 0x7F); ··· 180 232 pcf8563->c_polarity = (buf[PCF8563_REG_MO] & PCF8563_MO_C) ? 181 233 (tm->tm_year >= 100) : (tm->tm_year < 100); 182 234 183 - dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, " 235 + dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, " 184 236 "mday=%d, mon=%d, year=%d, wday=%d\n", 185 237 __func__, 186 238 tm->tm_sec, tm->tm_min, tm->tm_hour, ··· 191 243 192 244 static int pcf8563_rtc_set_time(struct device *dev, struct rtc_time *tm) 193 245 { 194 - struct i2c_client *client = to_i2c_client(dev); 195 - struct pcf8563 *pcf8563 = i2c_get_clientdata(client); 246 + struct pcf8563 *pcf8563 = dev_get_drvdata(dev); 196 247 unsigned char buf[9]; 197 248 198 - dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, " 249 + dev_dbg(dev, "%s: secs=%d, mins=%d, hours=%d, " 199 250 "mday=%d, mon=%d, year=%d, wday=%d\n", 200 251 __func__, 201 252 tm->tm_sec, tm->tm_min, tm->tm_hour, ··· 217 270 218 271 buf[PCF8563_REG_DW] = tm->tm_wday & 0x07; 219 272 220 - return pcf8563_write_block_data(client, PCF8563_REG_SC, 221 - 9 - PCF8563_REG_SC, buf + PCF8563_REG_SC); 273 + return regmap_bulk_write(pcf8563->regmap, PCF8563_REG_SC, 274 + buf + PCF8563_REG_SC, 275 + sizeof(buf) - PCF8563_REG_SC); 222 276 } 223 277 224 278 static int pcf8563_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) 225 279 { 226 - struct i2c_client *client = to_i2c_client(dev); 280 + struct pcf8563 *pcf8563 = dev_get_drvdata(dev); 227 281 int ret; 228 282 229 283 switch (cmd) { 230 284 case RTC_VL_READ: 231 - ret = i2c_smbus_read_byte_data(client, PCF8563_REG_SC); 285 + ret = regmap_test_bits(pcf8563->regmap, PCF8563_REG_SC, 286 + PCF8563_SC_LV); 232 287 if (ret < 0) 233 288 return ret; 234 289 235 - return put_user(ret & PCF8563_SC_LV ? RTC_VL_DATA_INVALID : 0, 290 + return put_user(ret ? RTC_VL_DATA_INVALID : 0, 236 291 (unsigned int __user *)arg); 237 292 default: 238 293 return -ENOIOCTLCMD; ··· 243 294 244 295 static int pcf8563_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *tm) 245 296 { 246 - struct i2c_client *client = to_i2c_client(dev); 297 + struct pcf8563 *pcf8563 = dev_get_drvdata(dev); 247 298 unsigned char buf[4]; 248 299 int err; 249 300 250 - err = pcf8563_read_block_data(client, PCF8563_REG_AMN, 4, buf); 251 - if (err) 301 + err = regmap_bulk_read(pcf8563->regmap, PCF8563_REG_AMN, buf, 302 + sizeof(buf)); 303 + if (err < 0) 252 304 return err; 253 305 254 - dev_dbg(&client->dev, 306 + dev_dbg(dev, 255 307 "%s: raw data is min=%02x, hr=%02x, mday=%02x, wday=%02x\n", 256 308 __func__, buf[0], buf[1], buf[2], buf[3]); 257 309 ··· 262 312 tm->time.tm_mday = bcd2bin(buf[2] & 0x3F); 263 313 tm->time.tm_wday = bcd2bin(buf[3] & 0x7); 264 314 265 - err = pcf8563_get_alarm_mode(client, &tm->enabled, &tm->pending); 315 + err = pcf8563_get_alarm_mode(pcf8563, &tm->enabled, &tm->pending); 266 316 if (err < 0) 267 317 return err; 268 318 269 - dev_dbg(&client->dev, "%s: tm is mins=%d, hours=%d, mday=%d, wday=%d," 319 + dev_dbg(dev, "%s: tm is mins=%d, hours=%d, mday=%d, wday=%d," 270 320 " enabled=%d, pending=%d\n", __func__, tm->time.tm_min, 271 321 tm->time.tm_hour, tm->time.tm_mday, tm->time.tm_wday, 272 322 tm->enabled, tm->pending); ··· 276 326 277 327 static int pcf8563_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *tm) 278 328 { 279 - struct i2c_client *client = to_i2c_client(dev); 329 + struct pcf8563 *pcf8563 = dev_get_drvdata(dev); 280 330 unsigned char buf[4]; 281 331 int err; 282 332 ··· 285 335 buf[2] = bin2bcd(tm->time.tm_mday); 286 336 buf[3] = tm->time.tm_wday & 0x07; 287 337 288 - err = pcf8563_write_block_data(client, PCF8563_REG_AMN, 4, buf); 338 + err = regmap_bulk_write(pcf8563->regmap, PCF8563_REG_SC, buf, 339 + sizeof(buf)); 289 340 if (err) 290 341 return err; 291 342 292 - return pcf8563_set_alarm_mode(client, !!tm->enabled); 343 + return pcf8563_set_alarm_mode(pcf8563, !!tm->enabled); 293 344 } 294 345 295 346 static int pcf8563_irq_enable(struct device *dev, unsigned int enabled) 296 347 { 348 + struct pcf8563 *pcf8563 = dev_get_drvdata(dev); 349 + 297 350 dev_dbg(dev, "%s: en=%d\n", __func__, enabled); 298 - return pcf8563_set_alarm_mode(to_i2c_client(dev), !!enabled); 351 + return pcf8563_set_alarm_mode(pcf8563, !!enabled); 299 352 } 300 353 301 354 #ifdef CONFIG_COMMON_CLK ··· 319 366 unsigned long parent_rate) 320 367 { 321 368 struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw); 322 - struct i2c_client *client = pcf8563->client; 323 - unsigned char buf; 324 - int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf); 369 + u32 buf; 370 + int ret; 325 371 372 + ret = regmap_read(pcf8563->regmap, PCF8563_REG_CLKO, &buf); 326 373 if (ret < 0) 327 374 return 0; 328 375 ··· 346 393 unsigned long parent_rate) 347 394 { 348 395 struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw); 349 - struct i2c_client *client = pcf8563->client; 350 - unsigned char buf; 351 - int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf); 352 - int i; 396 + int i, ret; 397 + u32 buf; 353 398 399 + ret = regmap_read(pcf8563->regmap, PCF8563_REG_CLKO, &buf); 354 400 if (ret < 0) 355 401 return ret; 356 402 ··· 357 405 if (clkout_rates[i] == rate) { 358 406 buf &= ~PCF8563_REG_CLKO_F_MASK; 359 407 buf |= i; 360 - ret = pcf8563_write_block_data(client, 361 - PCF8563_REG_CLKO, 1, 362 - &buf); 363 - return ret; 408 + return regmap_update_bits(pcf8563->regmap, 409 + PCF8563_REG_CLKO, 410 + PCF8563_REG_CLKO_F_MASK, 411 + buf); 364 412 } 365 413 366 414 return -EINVAL; ··· 369 417 static int pcf8563_clkout_control(struct clk_hw *hw, bool enable) 370 418 { 371 419 struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw); 372 - struct i2c_client *client = pcf8563->client; 373 - unsigned char buf; 374 - int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf); 420 + u32 buf; 421 + int ret; 375 422 423 + ret = regmap_read(pcf8563->regmap, PCF8563_REG_CLKO, &buf); 376 424 if (ret < 0) 377 425 return ret; 378 426 ··· 381 429 else 382 430 buf &= ~PCF8563_REG_CLKO_FE; 383 431 384 - ret = pcf8563_write_block_data(client, PCF8563_REG_CLKO, 1, &buf); 385 - return ret; 432 + return regmap_update_bits(pcf8563->regmap, PCF8563_REG_CLKO, 433 + PCF8563_REG_CLKO_FE, buf); 386 434 } 387 435 388 436 static int pcf8563_clkout_prepare(struct clk_hw *hw) ··· 398 446 static int pcf8563_clkout_is_prepared(struct clk_hw *hw) 399 447 { 400 448 struct pcf8563 *pcf8563 = clkout_hw_to_pcf8563(hw); 401 - struct i2c_client *client = pcf8563->client; 402 - unsigned char buf; 403 - int ret = pcf8563_read_block_data(client, PCF8563_REG_CLKO, 1, &buf); 449 + u32 buf; 450 + int ret; 404 451 452 + ret = regmap_read(pcf8563->regmap, PCF8563_REG_CLKO, &buf); 405 453 if (ret < 0) 406 454 return ret; 407 455 ··· 419 467 420 468 static struct clk *pcf8563_clkout_register_clk(struct pcf8563 *pcf8563) 421 469 { 422 - struct i2c_client *client = pcf8563->client; 423 - struct device_node *node = client->dev.of_node; 424 - struct clk *clk; 470 + struct device_node *node = pcf8563->rtc->dev.of_node; 425 471 struct clk_init_data init; 472 + struct clk *clk; 426 473 int ret; 427 - unsigned char buf; 428 474 429 475 /* disable the clkout output */ 430 - buf = 0; 431 - ret = pcf8563_write_block_data(client, PCF8563_REG_CLKO, 1, &buf); 476 + ret = regmap_clear_bits(pcf8563->regmap, PCF8563_REG_CLKO, 477 + PCF8563_REG_CLKO_FE); 432 478 if (ret < 0) 433 479 return ERR_PTR(ret); 434 480 ··· 441 491 of_property_read_string(node, "clock-output-names", &init.name); 442 492 443 493 /* register the clock */ 444 - clk = devm_clk_register(&client->dev, &pcf8563->clkout_hw); 494 + clk = devm_clk_register(&pcf8563->rtc->dev, &pcf8563->clkout_hw); 445 495 446 496 if (!IS_ERR(clk)) 447 497 of_clk_add_provider(node, of_clk_src_simple_get, clk); ··· 459 509 .alarm_irq_enable = pcf8563_irq_enable, 460 510 }; 461 511 512 + static const struct regmap_config regmap_config = { 513 + .reg_bits = 8, 514 + .val_bits = 8, 515 + .max_register = 0xF, 516 + }; 517 + 462 518 static int pcf8563_probe(struct i2c_client *client) 463 519 { 464 520 struct pcf8563 *pcf8563; 465 521 int err; 466 - unsigned char buf; 467 522 468 523 dev_dbg(&client->dev, "%s\n", __func__); 469 524 ··· 480 525 if (!pcf8563) 481 526 return -ENOMEM; 482 527 528 + pcf8563->regmap = devm_regmap_init_i2c(client, &regmap_config); 529 + if (IS_ERR(pcf8563->regmap)) 530 + return PTR_ERR(pcf8563->regmap); 531 + 483 532 i2c_set_clientdata(client, pcf8563); 484 - pcf8563->client = client; 533 + device_set_wakeup_capable(&client->dev, 1); 485 534 486 535 /* Set timer to lowest frequency to save power (ref Haoyu datasheet) */ 487 - buf = PCF8563_TMRC_1_60; 488 - err = pcf8563_write_block_data(client, PCF8563_REG_TMRC, 1, &buf); 536 + err = regmap_set_bits(pcf8563->regmap, PCF8563_REG_TMRC, 537 + PCF8563_TMRC_1_60); 489 538 if (err < 0) { 490 539 dev_err(&client->dev, "%s: write error\n", __func__); 491 540 return err; 492 541 } 493 542 494 543 /* Clear flags and disable interrupts */ 495 - buf = 0; 496 - err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); 544 + err = regmap_write(pcf8563->regmap, PCF8563_REG_ST2, 0); 497 545 if (err < 0) { 498 546 dev_err(&client->dev, "%s: write error\n", __func__); 499 547 return err;