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

rtc: pcf8523: switch to regmap

Use regmap to access the RTC registers, this is a huge reduction in code
lines and generated code. Values on ARMv7:

text data bss dec hex
5180 132 0 5312 14c0 before
3900 132 0 4032 fc0 after

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20211018153651.82069-1-alexandre.belloni@bootlin.com

+87 -221
+1
drivers/rtc/Kconfig
··· 441 441 442 442 config RTC_DRV_PCF8523 443 443 tristate "NXP PCF8523" 444 + select REGMAP_I2C 444 445 help 445 446 If you say yes here you get support for the NXP PCF8523 RTC 446 447 chips.
+86 -221
drivers/rtc/rtc-pcf8523.c
··· 6 6 #include <linux/bcd.h> 7 7 #include <linux/i2c.h> 8 8 #include <linux/module.h> 9 + #include <linux/regmap.h> 9 10 #include <linux/rtc.h> 10 11 #include <linux/of.h> 11 12 #include <linux/pm_wakeirq.h> ··· 50 49 51 50 struct pcf8523 { 52 51 struct rtc_device *rtc; 53 - struct i2c_client *client; 52 + struct regmap *regmap; 54 53 }; 55 54 56 - static int pcf8523_read(struct i2c_client *client, u8 reg, u8 *valuep) 55 + static int pcf8523_load_capacitance(struct pcf8523 *pcf8523, struct device_node *node) 57 56 { 58 - struct i2c_msg msgs[2]; 59 - u8 value = 0; 60 - int err; 61 - 62 - msgs[0].addr = client->addr; 63 - msgs[0].flags = 0; 64 - msgs[0].len = sizeof(reg); 65 - msgs[0].buf = &reg; 66 - 67 - msgs[1].addr = client->addr; 68 - msgs[1].flags = I2C_M_RD; 69 - msgs[1].len = sizeof(value); 70 - msgs[1].buf = &value; 71 - 72 - err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 73 - if (err < 0) 74 - return err; 75 - 76 - *valuep = value; 77 - 78 - return 0; 79 - } 80 - 81 - static int pcf8523_write(struct i2c_client *client, u8 reg, u8 value) 82 - { 83 - u8 buffer[2] = { reg, value }; 84 - struct i2c_msg msg; 85 - int err; 86 - 87 - msg.addr = client->addr; 88 - msg.flags = 0; 89 - msg.len = sizeof(buffer); 90 - msg.buf = buffer; 91 - 92 - err = i2c_transfer(client->adapter, &msg, 1); 93 - if (err < 0) 94 - return err; 95 - 96 - return 0; 97 - } 98 - 99 - static int pcf8523_load_capacitance(struct i2c_client *client) 100 - { 101 - u32 load; 102 - u8 value; 103 - int err; 104 - 105 - err = pcf8523_read(client, PCF8523_REG_CONTROL1, &value); 106 - if (err < 0) 107 - return err; 57 + u32 load, value = 0; 108 58 109 59 load = 12500; 110 - of_property_read_u32(client->dev.of_node, "quartz-load-femtofarads", 111 - &load); 60 + of_property_read_u32(node, "quartz-load-femtofarads", &load); 112 61 113 62 switch (load) { 114 63 default: 115 - dev_warn(&client->dev, "Unknown quartz-load-femtofarads value: %d. Assuming 12500", 64 + dev_warn(&pcf8523->rtc->dev, "Unknown quartz-load-femtofarads value: %d. Assuming 12500", 116 65 load); 117 66 fallthrough; 118 67 case 12500: 119 68 value |= PCF8523_CONTROL1_CAP_SEL; 120 69 break; 121 70 case 7000: 122 - value &= ~PCF8523_CONTROL1_CAP_SEL; 123 71 break; 124 72 } 125 73 126 - err = pcf8523_write(client, PCF8523_REG_CONTROL1, value); 127 - 128 - return err; 129 - } 130 - 131 - static int pcf8523_set_pm(struct i2c_client *client, u8 pm) 132 - { 133 - u8 value; 134 - int err; 135 - 136 - err = pcf8523_read(client, PCF8523_REG_CONTROL3, &value); 137 - if (err < 0) 138 - return err; 139 - 140 - value = (value & ~PCF8523_CONTROL3_PM_MASK) | pm; 141 - 142 - err = pcf8523_write(client, PCF8523_REG_CONTROL3, value); 143 - if (err < 0) 144 - return err; 145 - 146 - return 0; 74 + return regmap_update_bits(pcf8523->regmap, PCF8523_REG_CONTROL1, 75 + PCF8523_CONTROL1_CAP_SEL, value); 147 76 } 148 77 149 78 static irqreturn_t pcf8523_irq(int irq, void *dev_id) 150 79 { 151 - struct pcf8523 *pcf8523 = i2c_get_clientdata(dev_id); 152 - u8 value; 80 + struct pcf8523 *pcf8523 = dev_id; 81 + u32 value; 153 82 int err; 154 83 155 - err = pcf8523_read(pcf8523->client, PCF8523_REG_CONTROL2, &value); 84 + err = regmap_read(pcf8523->regmap, PCF8523_REG_CONTROL2, &value); 156 85 if (err < 0) 157 86 return IRQ_HANDLED; 158 87 159 88 if (value & PCF8523_CONTROL2_AF) { 160 89 value &= ~PCF8523_CONTROL2_AF; 161 - pcf8523_write(pcf8523->client, PCF8523_REG_CONTROL2, value); 90 + regmap_write(pcf8523->regmap, PCF8523_REG_CONTROL2, value); 162 91 rtc_update_irq(pcf8523->rtc, 1, RTC_IRQF | RTC_AF); 163 92 164 93 return IRQ_HANDLED; ··· 97 166 return IRQ_NONE; 98 167 } 99 168 100 - static int pcf8523_stop_rtc(struct i2c_client *client) 101 - { 102 - u8 value; 103 - int err; 104 - 105 - err = pcf8523_read(client, PCF8523_REG_CONTROL1, &value); 106 - if (err < 0) 107 - return err; 108 - 109 - value |= PCF8523_CONTROL1_STOP; 110 - 111 - err = pcf8523_write(client, PCF8523_REG_CONTROL1, value); 112 - if (err < 0) 113 - return err; 114 - 115 - return 0; 116 - } 117 - 118 - static int pcf8523_start_rtc(struct i2c_client *client) 119 - { 120 - u8 value; 121 - int err; 122 - 123 - err = pcf8523_read(client, PCF8523_REG_CONTROL1, &value); 124 - if (err < 0) 125 - return err; 126 - 127 - value &= ~PCF8523_CONTROL1_STOP; 128 - 129 - err = pcf8523_write(client, PCF8523_REG_CONTROL1, value); 130 - if (err < 0) 131 - return err; 132 - 133 - return 0; 134 - } 135 - 136 169 static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm) 137 170 { 138 - struct i2c_client *client = to_i2c_client(dev); 139 - u8 start = PCF8523_REG_SECONDS, regs[7]; 140 - struct i2c_msg msgs[2]; 171 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 172 + u8 regs[7]; 141 173 int err; 142 174 143 - msgs[0].addr = client->addr; 144 - msgs[0].flags = 0; 145 - msgs[0].len = 1; 146 - msgs[0].buf = &start; 147 - 148 - msgs[1].addr = client->addr; 149 - msgs[1].flags = I2C_M_RD; 150 - msgs[1].len = sizeof(regs); 151 - msgs[1].buf = regs; 152 - 153 - err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 175 + err = regmap_bulk_read(pcf8523->regmap, PCF8523_REG_SECONDS, regs, 176 + sizeof(regs)); 154 177 if (err < 0) 155 178 return err; 156 179 ··· 124 239 125 240 static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm) 126 241 { 127 - struct i2c_client *client = to_i2c_client(dev); 128 - struct i2c_msg msg; 129 - u8 regs[8]; 242 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 243 + u8 regs[7]; 130 244 int err; 131 245 132 - err = pcf8523_stop_rtc(client); 246 + err = regmap_update_bits(pcf8523->regmap, PCF8523_REG_CONTROL1, 247 + PCF8523_CONTROL1_STOP, PCF8523_CONTROL1_STOP); 133 248 if (err < 0) 134 249 return err; 135 250 136 - regs[0] = PCF8523_REG_SECONDS; 137 251 /* This will purposely overwrite PCF8523_SECONDS_OS */ 138 - regs[1] = bin2bcd(tm->tm_sec); 139 - regs[2] = bin2bcd(tm->tm_min); 140 - regs[3] = bin2bcd(tm->tm_hour); 141 - regs[4] = bin2bcd(tm->tm_mday); 142 - regs[5] = tm->tm_wday; 143 - regs[6] = bin2bcd(tm->tm_mon + 1); 144 - regs[7] = bin2bcd(tm->tm_year - 100); 252 + regs[0] = bin2bcd(tm->tm_sec); 253 + regs[1] = bin2bcd(tm->tm_min); 254 + regs[2] = bin2bcd(tm->tm_hour); 255 + regs[3] = bin2bcd(tm->tm_mday); 256 + regs[4] = tm->tm_wday; 257 + regs[5] = bin2bcd(tm->tm_mon + 1); 258 + regs[6] = bin2bcd(tm->tm_year - 100); 145 259 146 - msg.addr = client->addr; 147 - msg.flags = 0; 148 - msg.len = sizeof(regs); 149 - msg.buf = regs; 150 - 151 - err = i2c_transfer(client->adapter, &msg, 1); 260 + err = regmap_bulk_write(pcf8523->regmap, PCF8523_REG_SECONDS, regs, 261 + sizeof(regs)); 152 262 if (err < 0) { 153 263 /* 154 264 * If the time cannot be set, restart the RTC anyway. Note 155 265 * that errors are ignored if the RTC cannot be started so 156 266 * that we have a chance to propagate the original error. 157 267 */ 158 - pcf8523_start_rtc(client); 268 + regmap_update_bits(pcf8523->regmap, PCF8523_REG_CONTROL1, 269 + PCF8523_CONTROL1_STOP, 0); 159 270 return err; 160 271 } 161 272 162 - return pcf8523_start_rtc(client); 273 + return regmap_update_bits(pcf8523->regmap, PCF8523_REG_CONTROL1, 274 + PCF8523_CONTROL1_STOP, 0); 163 275 } 164 276 165 277 static int pcf8523_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *tm) 166 278 { 167 - struct i2c_client *client = to_i2c_client(dev); 168 - u8 start = PCF8523_REG_MINUTE_ALARM, regs[4]; 169 - struct i2c_msg msgs[2]; 170 - u8 value; 279 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 280 + u8 regs[4]; 281 + u32 value; 171 282 int err; 172 283 173 - msgs[0].addr = client->addr; 174 - msgs[0].flags = 0; 175 - msgs[0].len = 1; 176 - msgs[0].buf = &start; 177 - 178 - msgs[1].addr = client->addr; 179 - msgs[1].flags = I2C_M_RD; 180 - msgs[1].len = sizeof(regs); 181 - msgs[1].buf = regs; 182 - 183 - err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 284 + err = regmap_bulk_read(pcf8523->regmap, PCF8523_REG_MINUTE_ALARM, regs, 285 + sizeof(regs)); 184 286 if (err < 0) 185 287 return err; 186 288 ··· 177 305 tm->time.tm_mday = bcd2bin(regs[2] & 0x3F); 178 306 tm->time.tm_wday = bcd2bin(regs[3] & 0x7); 179 307 180 - err = pcf8523_read(client, PCF8523_REG_CONTROL1, &value); 308 + err = regmap_read(pcf8523->regmap, PCF8523_REG_CONTROL1, &value); 181 309 if (err < 0) 182 310 return err; 183 311 tm->enabled = !!(value & PCF8523_CONTROL1_AIE); 184 312 185 - err = pcf8523_read(client, PCF8523_REG_CONTROL2, &value); 313 + err = regmap_read(pcf8523->regmap, PCF8523_REG_CONTROL2, &value); 186 314 if (err < 0) 187 315 return err; 188 316 tm->pending = !!(value & PCF8523_CONTROL2_AF); ··· 192 320 193 321 static int pcf8523_irq_enable(struct device *dev, unsigned int enabled) 194 322 { 195 - struct i2c_client *client = to_i2c_client(dev); 196 - u8 value; 197 - int err; 323 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 198 324 199 - err = pcf8523_read(client, PCF8523_REG_CONTROL1, &value); 200 - if (err < 0) 201 - return err; 202 - 203 - value &= PCF8523_CONTROL1_AIE; 204 - 205 - if (enabled) 206 - value |= PCF8523_CONTROL1_AIE; 207 - 208 - err = pcf8523_write(client, PCF8523_REG_CONTROL1, value); 209 - if (err < 0) 210 - return err; 211 - 212 - return 0; 325 + return regmap_update_bits(pcf8523->regmap, PCF8523_REG_CONTROL1, 326 + PCF8523_CONTROL1_AIE, enabled ? 327 + PCF8523_CONTROL1_AIE : 0); 213 328 } 214 329 215 330 static int pcf8523_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *tm) 216 331 { 217 - struct i2c_client *client = to_i2c_client(dev); 218 - struct i2c_msg msg; 332 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 219 333 u8 regs[5]; 220 334 int err; 221 335 ··· 209 351 if (err) 210 352 return err; 211 353 212 - err = pcf8523_write(client, PCF8523_REG_CONTROL2, 0); 354 + err = regmap_write(pcf8523->regmap, PCF8523_REG_CONTROL2, 0); 213 355 if (err < 0) 214 356 return err; 215 357 ··· 221 363 rtc_time64_to_tm(alarm_time, &tm->time); 222 364 } 223 365 224 - regs[0] = PCF8523_REG_MINUTE_ALARM; 225 - regs[1] = bin2bcd(tm->time.tm_min); 226 - regs[2] = bin2bcd(tm->time.tm_hour); 227 - regs[3] = bin2bcd(tm->time.tm_mday); 228 - regs[4] = ALARM_DIS; 229 - msg.addr = client->addr; 230 - msg.flags = 0; 231 - msg.len = sizeof(regs); 232 - msg.buf = regs; 233 - err = i2c_transfer(client->adapter, &msg, 1); 366 + regs[0] = bin2bcd(tm->time.tm_min); 367 + regs[1] = bin2bcd(tm->time.tm_hour); 368 + regs[2] = bin2bcd(tm->time.tm_mday); 369 + regs[3] = ALARM_DIS; 370 + 371 + err = regmap_bulk_write(pcf8523->regmap, PCF8523_REG_MINUTE_ALARM, regs, 372 + sizeof(regs)); 234 373 if (err < 0) 235 374 return err; 236 375 ··· 241 386 static int pcf8523_rtc_ioctl(struct device *dev, unsigned int cmd, 242 387 unsigned long arg) 243 388 { 244 - struct i2c_client *client = to_i2c_client(dev); 389 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 245 390 unsigned int flags = 0; 246 - u8 value; 391 + u32 value; 247 392 int ret; 248 393 249 394 switch (cmd) { 250 395 case RTC_VL_READ: 251 - ret = pcf8523_read(client, PCF8523_REG_CONTROL3, &value); 396 + ret = regmap_read(pcf8523->regmap, PCF8523_REG_CONTROL3, &value); 252 397 if (ret < 0) 253 398 return ret; 254 399 255 400 if (value & PCF8523_CONTROL3_BLF) 256 401 flags |= RTC_VL_BACKUP_LOW; 257 402 258 - ret = pcf8523_read(client, PCF8523_REG_SECONDS, &value); 403 + ret = regmap_read(pcf8523->regmap, PCF8523_REG_SECONDS, &value); 259 404 if (ret < 0) 260 405 return ret; 261 406 ··· 274 419 275 420 static int pcf8523_rtc_read_offset(struct device *dev, long *offset) 276 421 { 277 - struct i2c_client *client = to_i2c_client(dev); 422 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 278 423 int err; 279 - u8 value; 424 + u32 value; 280 425 s8 val; 281 426 282 - err = pcf8523_read(client, PCF8523_REG_OFFSET, &value); 427 + err = regmap_read(pcf8523->regmap, PCF8523_REG_OFFSET, &value); 283 428 if (err < 0) 284 429 return err; 285 430 ··· 292 437 293 438 static int pcf8523_rtc_set_offset(struct device *dev, long offset) 294 439 { 295 - struct i2c_client *client = to_i2c_client(dev); 440 + struct pcf8523 *pcf8523 = dev_get_drvdata(dev); 296 441 long reg_m0, reg_m1; 297 - u8 value; 442 + u32 value; 298 443 299 444 reg_m0 = clamp(DIV_ROUND_CLOSEST(offset, 4340), -64L, 63L); 300 445 reg_m1 = clamp(DIV_ROUND_CLOSEST(offset, 4069), -64L, 63L); ··· 304 449 else 305 450 value = (reg_m1 & 0x7f) | PCF8523_OFFSET_MODE; 306 451 307 - return pcf8523_write(client, PCF8523_REG_OFFSET, value); 452 + return regmap_write(pcf8523->regmap, PCF8523_REG_OFFSET, value); 308 453 } 309 454 310 455 static const struct rtc_class_ops pcf8523_rtc_ops = { ··· 316 461 .ioctl = pcf8523_rtc_ioctl, 317 462 .read_offset = pcf8523_rtc_read_offset, 318 463 .set_offset = pcf8523_rtc_set_offset, 464 + }; 465 + 466 + static const struct regmap_config regmap_config = { 467 + .reg_bits = 8, 468 + .val_bits = 8, 469 + .max_register = 0x13, 319 470 }; 320 471 321 472 static int pcf8523_probe(struct i2c_client *client, ··· 339 478 if (!pcf8523) 340 479 return -ENOMEM; 341 480 481 + pcf8523->regmap = devm_regmap_init_i2c(client, &regmap_config); 482 + if (IS_ERR(pcf8523->regmap)) 483 + return PTR_ERR(pcf8523->regmap); 484 + 342 485 i2c_set_clientdata(client, pcf8523); 343 - pcf8523->client = client; 344 - 345 - err = pcf8523_load_capacitance(client); 346 - if (err < 0) 347 - dev_warn(&client->dev, "failed to set xtal load capacitance: %d", 348 - err); 349 - 350 - err = pcf8523_set_pm(client, 0); 351 - if (err < 0) 352 - return err; 353 486 354 487 rtc = devm_rtc_allocate_device(&client->dev); 355 488 if (IS_ERR(rtc)) 356 489 return PTR_ERR(rtc); 357 - 358 490 pcf8523->rtc = rtc; 491 + 492 + err = pcf8523_load_capacitance(pcf8523, client->dev.of_node); 493 + if (err < 0) 494 + dev_warn(&client->dev, "failed to set xtal load capacitance: %d", 495 + err); 496 + 497 + err = regmap_update_bits(pcf8523->regmap, PCF8523_REG_CONTROL3, 498 + PCF8523_CONTROL3_PM_MASK, 0); 499 + if (err < 0) 500 + return err; 501 + 359 502 rtc->ops = &pcf8523_rtc_ops; 360 503 rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 361 504 rtc->range_max = RTC_TIMESTAMP_END_2099; 362 505 rtc->uie_unsupported = 1; 363 506 364 507 if (client->irq > 0) { 365 - err = pcf8523_write(client, PCF8523_TMR_CLKOUT_CTRL, 0x38); 508 + err = regmap_write(pcf8523->regmap, PCF8523_TMR_CLKOUT_CTRL, 0x38); 366 509 if (err < 0) 367 510 return err; 368 511 369 512 err = devm_request_threaded_irq(&client->dev, client->irq, 370 513 NULL, pcf8523_irq, 371 514 IRQF_SHARED | IRQF_ONESHOT | IRQF_TRIGGER_LOW, 372 - dev_name(&rtc->dev), client); 515 + dev_name(&rtc->dev), pcf8523); 373 516 if (err) 374 517 return err; 375 518