1 /* 2 * Register map access API 3 * 4 * Copyright 2011 Wolfson Microelectronics plc 5 * 6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13 #include <linux/slab.h> 14 #include <linux/module.h> 15 #include <linux/mutex.h> 16 #include <linux/err.h> 17 18 #define CREATE_TRACE_POINTS 19 #include <trace/events/regmap.h> 20 21 #include "internal.h" 22 23 bool regmap_writeable(struct regmap *map, unsigned int reg) 24 { 25 if (map->max_register && reg > map->max_register) 26 return false; 27 28 if (map->writeable_reg) 29 return map->writeable_reg(map->dev, reg); 30 31 return true; 32 } 33 34 bool regmap_readable(struct regmap *map, unsigned int reg) 35 { 36 if (map->max_register && reg > map->max_register) 37 return false; 38 39 if (map->readable_reg) 40 return map->readable_reg(map->dev, reg); 41 42 return true; 43 } 44 45 bool regmap_volatile(struct regmap *map, unsigned int reg) 46 { 47 if (map->max_register && reg > map->max_register) 48 return false; 49 50 if (map->volatile_reg) 51 return map->volatile_reg(map->dev, reg); 52 53 return true; 54 } 55 56 bool regmap_precious(struct regmap *map, unsigned int reg) 57 { 58 if (map->max_register && reg > map->max_register) 59 return false; 60 61 if (map->precious_reg) 62 return map->precious_reg(map->dev, reg); 63 64 return false; 65 } 66 67 static void regmap_format_4_12_write(struct regmap *map, 68 unsigned int reg, unsigned int val) 69 { 70 __be16 *out = map->work_buf; 71 *out = cpu_to_be16((reg << 12) | val); 72 } 73 74 static void regmap_format_7_9_write(struct regmap *map, 75 unsigned int reg, unsigned int val) 76 { 77 __be16 *out = map->work_buf; 78 *out = cpu_to_be16((reg << 9) | val); 79 } 80 81 static void regmap_format_8(void *buf, unsigned int val) 82 { 83 u8 *b = buf; 84 85 b[0] = val; 86 } 87 88 static void regmap_format_16(void *buf, unsigned int val) 89 { 90 __be16 *b = buf; 91 92 b[0] = cpu_to_be16(val); 93 } 94 95 static unsigned int regmap_parse_8(void *buf) 96 { 97 u8 *b = buf; 98 99 return b[0]; 100 } 101 102 static unsigned int regmap_parse_16(void *buf) 103 { 104 __be16 *b = buf; 105 106 b[0] = be16_to_cpu(b[0]); 107 108 return b[0]; 109 } 110 111 /** 112 * regmap_init(): Initialise register map 113 * 114 * @dev: Device that will be interacted with 115 * @bus: Bus-specific callbacks to use with device 116 * @config: Configuration for register map 117 * 118 * The return value will be an ERR_PTR() on error or a valid pointer to 119 * a struct regmap. This function should generally not be called 120 * directly, it should be called by bus-specific init functions. 121 */ 122 struct regmap *regmap_init(struct device *dev, 123 const struct regmap_bus *bus, 124 const struct regmap_config *config) 125 { 126 struct regmap *map; 127 int ret = -EINVAL; 128 129 if (!bus || !config) 130 return NULL; 131 132 map = kzalloc(sizeof(*map), GFP_KERNEL); 133 if (map == NULL) { 134 ret = -ENOMEM; 135 goto err; 136 } 137 138 mutex_init(&map->lock); 139 map->format.buf_size = (config->reg_bits + config->val_bits) / 8; 140 map->format.reg_bytes = config->reg_bits / 8; 141 map->format.val_bytes = config->val_bits / 8; 142 map->dev = dev; 143 map->bus = bus; 144 map->max_register = config->max_register; 145 map->writeable_reg = config->writeable_reg; 146 map->readable_reg = config->readable_reg; 147 map->volatile_reg = config->volatile_reg; 148 map->precious_reg = config->precious_reg; 149 map->cache_type = config->cache_type; 150 map->reg_defaults = config->reg_defaults; 151 map->num_reg_defaults = config->num_reg_defaults; 152 map->num_reg_defaults_raw = config->num_reg_defaults_raw; 153 map->reg_defaults_raw = config->reg_defaults_raw; 154 map->cache_size_raw = (config->val_bits / 8) * config->num_reg_defaults_raw; 155 map->cache_word_size = config->val_bits / 8; 156 157 if (config->read_flag_mask || config->write_flag_mask) { 158 map->read_flag_mask = config->read_flag_mask; 159 map->write_flag_mask = config->write_flag_mask; 160 } else { 161 map->read_flag_mask = bus->read_flag_mask; 162 } 163 164 switch (config->reg_bits) { 165 case 4: 166 switch (config->val_bits) { 167 case 12: 168 map->format.format_write = regmap_format_4_12_write; 169 break; 170 default: 171 goto err_map; 172 } 173 break; 174 175 case 7: 176 switch (config->val_bits) { 177 case 9: 178 map->format.format_write = regmap_format_7_9_write; 179 break; 180 default: 181 goto err_map; 182 } 183 break; 184 185 case 8: 186 map->format.format_reg = regmap_format_8; 187 break; 188 189 case 16: 190 map->format.format_reg = regmap_format_16; 191 break; 192 193 default: 194 goto err_map; 195 } 196 197 switch (config->val_bits) { 198 case 8: 199 map->format.format_val = regmap_format_8; 200 map->format.parse_val = regmap_parse_8; 201 break; 202 case 16: 203 map->format.format_val = regmap_format_16; 204 map->format.parse_val = regmap_parse_16; 205 break; 206 } 207 208 if (!map->format.format_write && 209 !(map->format.format_reg && map->format.format_val)) 210 goto err_map; 211 212 map->work_buf = kmalloc(map->format.buf_size, GFP_KERNEL); 213 if (map->work_buf == NULL) { 214 ret = -ENOMEM; 215 goto err_map; 216 } 217 218 ret = regcache_init(map); 219 if (ret < 0) 220 goto err_map; 221 222 regmap_debugfs_init(map); 223 224 return map; 225 226 err_map: 227 kfree(map); 228 err: 229 return ERR_PTR(ret); 230 } 231 EXPORT_SYMBOL_GPL(regmap_init); 232 233 /** 234 * regmap_exit(): Free a previously allocated register map 235 */ 236 void regmap_exit(struct regmap *map) 237 { 238 regcache_exit(map); 239 regmap_debugfs_exit(map); 240 kfree(map->work_buf); 241 kfree(map); 242 } 243 EXPORT_SYMBOL_GPL(regmap_exit); 244 245 static int _regmap_raw_write(struct regmap *map, unsigned int reg, 246 const void *val, size_t val_len) 247 { 248 u8 *u8 = map->work_buf; 249 void *buf; 250 int ret = -ENOTSUPP; 251 size_t len; 252 int i; 253 254 /* Check for unwritable registers before we start */ 255 if (map->writeable_reg) 256 for (i = 0; i < val_len / map->format.val_bytes; i++) 257 if (!map->writeable_reg(map->dev, reg + i)) 258 return -EINVAL; 259 260 map->format.format_reg(map->work_buf, reg); 261 262 u8[0] |= map->write_flag_mask; 263 264 trace_regmap_hw_write_start(map->dev, reg, 265 val_len / map->format.val_bytes); 266 267 /* If we're doing a single register write we can probably just 268 * send the work_buf directly, otherwise try to do a gather 269 * write. 270 */ 271 if (val == map->work_buf + map->format.reg_bytes) 272 ret = map->bus->write(map->dev, map->work_buf, 273 map->format.reg_bytes + val_len); 274 else if (map->bus->gather_write) 275 ret = map->bus->gather_write(map->dev, map->work_buf, 276 map->format.reg_bytes, 277 val, val_len); 278 279 /* If that didn't work fall back on linearising by hand. */ 280 if (ret == -ENOTSUPP) { 281 len = map->format.reg_bytes + val_len; 282 buf = kmalloc(len, GFP_KERNEL); 283 if (!buf) 284 return -ENOMEM; 285 286 memcpy(buf, map->work_buf, map->format.reg_bytes); 287 memcpy(buf + map->format.reg_bytes, val, val_len); 288 ret = map->bus->write(map->dev, buf, len); 289 290 kfree(buf); 291 } 292 293 trace_regmap_hw_write_done(map->dev, reg, 294 val_len / map->format.val_bytes); 295 296 return ret; 297 } 298 299 int _regmap_write(struct regmap *map, unsigned int reg, 300 unsigned int val) 301 { 302 int ret; 303 BUG_ON(!map->format.format_write && !map->format.format_val); 304 305 if (!map->cache_bypass) { 306 ret = regcache_write(map, reg, val); 307 if (ret != 0) 308 return ret; 309 if (map->cache_only) 310 return 0; 311 } 312 313 trace_regmap_reg_write(map->dev, reg, val); 314 315 if (map->format.format_write) { 316 map->format.format_write(map, reg, val); 317 318 trace_regmap_hw_write_start(map->dev, reg, 1); 319 320 ret = map->bus->write(map->dev, map->work_buf, 321 map->format.buf_size); 322 323 trace_regmap_hw_write_done(map->dev, reg, 1); 324 325 return ret; 326 } else { 327 map->format.format_val(map->work_buf + map->format.reg_bytes, 328 val); 329 return _regmap_raw_write(map, reg, 330 map->work_buf + map->format.reg_bytes, 331 map->format.val_bytes); 332 } 333 } 334 335 /** 336 * regmap_write(): Write a value to a single register 337 * 338 * @map: Register map to write to 339 * @reg: Register to write to 340 * @val: Value to be written 341 * 342 * A value of zero will be returned on success, a negative errno will 343 * be returned in error cases. 344 */ 345 int regmap_write(struct regmap *map, unsigned int reg, unsigned int val) 346 { 347 int ret; 348 349 mutex_lock(&map->lock); 350 351 ret = _regmap_write(map, reg, val); 352 353 mutex_unlock(&map->lock); 354 355 return ret; 356 } 357 EXPORT_SYMBOL_GPL(regmap_write); 358 359 /** 360 * regmap_raw_write(): Write raw values to one or more registers 361 * 362 * @map: Register map to write to 363 * @reg: Initial register to write to 364 * @val: Block of data to be written, laid out for direct transmission to the 365 * device 366 * @val_len: Length of data pointed to by val. 367 * 368 * This function is intended to be used for things like firmware 369 * download where a large block of data needs to be transferred to the 370 * device. No formatting will be done on the data provided. 371 * 372 * A value of zero will be returned on success, a negative errno will 373 * be returned in error cases. 374 */ 375 int regmap_raw_write(struct regmap *map, unsigned int reg, 376 const void *val, size_t val_len) 377 { 378 int ret; 379 380 WARN_ON(map->cache_type != REGCACHE_NONE); 381 382 mutex_lock(&map->lock); 383 384 ret = _regmap_raw_write(map, reg, val, val_len); 385 386 mutex_unlock(&map->lock); 387 388 return ret; 389 } 390 EXPORT_SYMBOL_GPL(regmap_raw_write); 391 392 static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val, 393 unsigned int val_len) 394 { 395 u8 *u8 = map->work_buf; 396 int ret; 397 398 map->format.format_reg(map->work_buf, reg); 399 400 /* 401 * Some buses or devices flag reads by setting the high bits in the 402 * register addresss; since it's always the high bits for all 403 * current formats we can do this here rather than in 404 * formatting. This may break if we get interesting formats. 405 */ 406 u8[0] |= map->read_flag_mask; 407 408 trace_regmap_hw_read_start(map->dev, reg, 409 val_len / map->format.val_bytes); 410 411 ret = map->bus->read(map->dev, map->work_buf, map->format.reg_bytes, 412 val, val_len); 413 414 trace_regmap_hw_read_done(map->dev, reg, 415 val_len / map->format.val_bytes); 416 417 return ret; 418 } 419 420 static int _regmap_read(struct regmap *map, unsigned int reg, 421 unsigned int *val) 422 { 423 int ret; 424 425 if (!map->format.parse_val) 426 return -EINVAL; 427 428 if (!map->cache_bypass) { 429 ret = regcache_read(map, reg, val); 430 if (ret == 0) 431 return 0; 432 } 433 434 if (map->cache_only) 435 return -EBUSY; 436 437 ret = _regmap_raw_read(map, reg, map->work_buf, map->format.val_bytes); 438 if (ret == 0) { 439 *val = map->format.parse_val(map->work_buf); 440 trace_regmap_reg_read(map->dev, reg, *val); 441 } 442 443 return ret; 444 } 445 446 /** 447 * regmap_read(): Read a value from a single register 448 * 449 * @map: Register map to write to 450 * @reg: Register to be read from 451 * @val: Pointer to store read value 452 * 453 * A value of zero will be returned on success, a negative errno will 454 * be returned in error cases. 455 */ 456 int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val) 457 { 458 int ret; 459 460 mutex_lock(&map->lock); 461 462 ret = _regmap_read(map, reg, val); 463 464 mutex_unlock(&map->lock); 465 466 return ret; 467 } 468 EXPORT_SYMBOL_GPL(regmap_read); 469 470 /** 471 * regmap_raw_read(): Read raw data from the device 472 * 473 * @map: Register map to write to 474 * @reg: First register to be read from 475 * @val: Pointer to store read value 476 * @val_len: Size of data to read 477 * 478 * A value of zero will be returned on success, a negative errno will 479 * be returned in error cases. 480 */ 481 int regmap_raw_read(struct regmap *map, unsigned int reg, void *val, 482 size_t val_len) 483 { 484 int ret; 485 int i; 486 bool vol = true; 487 488 for (i = 0; i < val_len / map->format.val_bytes; i++) 489 if (!regmap_volatile(map, reg + i)) 490 vol = false; 491 492 WARN_ON(!vol && map->cache_type != REGCACHE_NONE); 493 494 mutex_lock(&map->lock); 495 496 ret = _regmap_raw_read(map, reg, val, val_len); 497 498 mutex_unlock(&map->lock); 499 500 return ret; 501 } 502 EXPORT_SYMBOL_GPL(regmap_raw_read); 503 504 /** 505 * regmap_bulk_read(): Read multiple registers from the device 506 * 507 * @map: Register map to write to 508 * @reg: First register to be read from 509 * @val: Pointer to store read value, in native register size for device 510 * @val_count: Number of registers to read 511 * 512 * A value of zero will be returned on success, a negative errno will 513 * be returned in error cases. 514 */ 515 int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val, 516 size_t val_count) 517 { 518 int ret, i; 519 size_t val_bytes = map->format.val_bytes; 520 bool vol = true; 521 522 if (!map->format.parse_val) 523 return -EINVAL; 524 525 /* Is this a block of volatile registers? */ 526 for (i = 0; i < val_count; i++) 527 if (!regmap_volatile(map, reg + i)) 528 vol = false; 529 530 if (vol || map->cache_type == REGCACHE_NONE) { 531 ret = regmap_raw_read(map, reg, val, val_bytes * val_count); 532 if (ret != 0) 533 return ret; 534 535 for (i = 0; i < val_count * val_bytes; i += val_bytes) 536 map->format.parse_val(val + i); 537 } else { 538 for (i = 0; i < val_count; i++) { 539 ret = regmap_read(map, reg + i, val + (i * val_bytes)); 540 if (ret != 0) 541 return ret; 542 } 543 } 544 545 return 0; 546 } 547 EXPORT_SYMBOL_GPL(regmap_bulk_read); 548 549 /** 550 * remap_update_bits: Perform a read/modify/write cycle on the register map 551 * 552 * @map: Register map to update 553 * @reg: Register to update 554 * @mask: Bitmask to change 555 * @val: New value for bitmask 556 * 557 * Returns zero for success, a negative number on error. 558 */ 559 int regmap_update_bits(struct regmap *map, unsigned int reg, 560 unsigned int mask, unsigned int val) 561 { 562 int ret; 563 unsigned int tmp; 564 565 mutex_lock(&map->lock); 566 567 ret = _regmap_read(map, reg, &tmp); 568 if (ret != 0) 569 goto out; 570 571 tmp &= ~mask; 572 tmp |= val & mask; 573 574 ret = _regmap_write(map, reg, tmp); 575 576 out: 577 mutex_unlock(&map->lock); 578 579 return ret; 580 } 581 EXPORT_SYMBOL_GPL(regmap_update_bits); 582 583 static int __init regmap_initcall(void) 584 { 585 regmap_debugfs_initcall(); 586 587 return 0; 588 } 589 postcore_initcall(regmap_initcall); 590