1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * nvmem framework core. 4 * 5 * Copyright (C) 2015 Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 6 * Copyright (C) 2013 Maxime Ripard <maxime.ripard@free-electrons.com> 7 */ 8 9 #include <linux/device.h> 10 #include <linux/export.h> 11 #include <linux/fs.h> 12 #include <linux/idr.h> 13 #include <linux/init.h> 14 #include <linux/kref.h> 15 #include <linux/module.h> 16 #include <linux/nvmem-consumer.h> 17 #include <linux/nvmem-provider.h> 18 #include <linux/of.h> 19 #include <linux/slab.h> 20 #include "nvmem.h" 21 22 struct nvmem_cell { 23 const char *name; 24 int offset; 25 int bytes; 26 int bit_offset; 27 int nbits; 28 struct device_node *np; 29 struct nvmem_device *nvmem; 30 struct list_head node; 31 }; 32 33 static DEFINE_MUTEX(nvmem_mutex); 34 static DEFINE_IDA(nvmem_ida); 35 36 static DEFINE_MUTEX(nvmem_cell_mutex); 37 static LIST_HEAD(nvmem_cell_tables); 38 39 static DEFINE_MUTEX(nvmem_lookup_mutex); 40 static LIST_HEAD(nvmem_lookup_list); 41 42 static BLOCKING_NOTIFIER_HEAD(nvmem_notifier); 43 44 45 static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset, 46 void *val, size_t bytes) 47 { 48 if (nvmem->reg_read) 49 return nvmem->reg_read(nvmem->priv, offset, val, bytes); 50 51 return -EINVAL; 52 } 53 54 static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset, 55 void *val, size_t bytes) 56 { 57 if (nvmem->reg_write) 58 return nvmem->reg_write(nvmem->priv, offset, val, bytes); 59 60 return -EINVAL; 61 } 62 63 static void nvmem_release(struct device *dev) 64 { 65 struct nvmem_device *nvmem = to_nvmem_device(dev); 66 67 ida_simple_remove(&nvmem_ida, nvmem->id); 68 kfree(nvmem); 69 } 70 71 static const struct device_type nvmem_provider_type = { 72 .release = nvmem_release, 73 }; 74 75 static struct bus_type nvmem_bus_type = { 76 .name = "nvmem", 77 }; 78 79 static int of_nvmem_match(struct device *dev, void *nvmem_np) 80 { 81 return dev->of_node == nvmem_np; 82 } 83 84 static struct nvmem_device *of_nvmem_find(struct device_node *nvmem_np) 85 { 86 struct device *d; 87 88 if (!nvmem_np) 89 return NULL; 90 91 d = bus_find_device(&nvmem_bus_type, NULL, nvmem_np, of_nvmem_match); 92 93 if (!d) 94 return NULL; 95 96 return to_nvmem_device(d); 97 } 98 99 static struct nvmem_device *nvmem_find(const char *name) 100 { 101 struct device *d; 102 103 d = bus_find_device_by_name(&nvmem_bus_type, NULL, name); 104 105 if (!d) 106 return NULL; 107 108 return to_nvmem_device(d); 109 } 110 111 static void nvmem_cell_drop(struct nvmem_cell *cell) 112 { 113 blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell); 114 mutex_lock(&nvmem_mutex); 115 list_del(&cell->node); 116 mutex_unlock(&nvmem_mutex); 117 of_node_put(cell->np); 118 kfree(cell->name); 119 kfree(cell); 120 } 121 122 static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem) 123 { 124 struct nvmem_cell *cell, *p; 125 126 list_for_each_entry_safe(cell, p, &nvmem->cells, node) 127 nvmem_cell_drop(cell); 128 } 129 130 static void nvmem_cell_add(struct nvmem_cell *cell) 131 { 132 mutex_lock(&nvmem_mutex); 133 list_add_tail(&cell->node, &cell->nvmem->cells); 134 mutex_unlock(&nvmem_mutex); 135 blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell); 136 } 137 138 static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, 139 const struct nvmem_cell_info *info, 140 struct nvmem_cell *cell) 141 { 142 cell->nvmem = nvmem; 143 cell->offset = info->offset; 144 cell->bytes = info->bytes; 145 cell->name = info->name; 146 147 cell->bit_offset = info->bit_offset; 148 cell->nbits = info->nbits; 149 150 if (cell->nbits) 151 cell->bytes = DIV_ROUND_UP(cell->nbits + cell->bit_offset, 152 BITS_PER_BYTE); 153 154 if (!IS_ALIGNED(cell->offset, nvmem->stride)) { 155 dev_err(&nvmem->dev, 156 "cell %s unaligned to nvmem stride %d\n", 157 cell->name, nvmem->stride); 158 return -EINVAL; 159 } 160 161 return 0; 162 } 163 164 /** 165 * nvmem_add_cells() - Add cell information to an nvmem device 166 * 167 * @nvmem: nvmem device to add cells to. 168 * @info: nvmem cell info to add to the device 169 * @ncells: number of cells in info 170 * 171 * Return: 0 or negative error code on failure. 172 */ 173 static int nvmem_add_cells(struct nvmem_device *nvmem, 174 const struct nvmem_cell_info *info, 175 int ncells) 176 { 177 struct nvmem_cell **cells; 178 int i, rval; 179 180 cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL); 181 if (!cells) 182 return -ENOMEM; 183 184 for (i = 0; i < ncells; i++) { 185 cells[i] = kzalloc(sizeof(**cells), GFP_KERNEL); 186 if (!cells[i]) { 187 rval = -ENOMEM; 188 goto err; 189 } 190 191 rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]); 192 if (rval) { 193 kfree(cells[i]); 194 goto err; 195 } 196 197 nvmem_cell_add(cells[i]); 198 } 199 200 /* remove tmp array */ 201 kfree(cells); 202 203 return 0; 204 err: 205 while (i--) 206 nvmem_cell_drop(cells[i]); 207 208 kfree(cells); 209 210 return rval; 211 } 212 213 /** 214 * nvmem_register_notifier() - Register a notifier block for nvmem events. 215 * 216 * @nb: notifier block to be called on nvmem events. 217 * 218 * Return: 0 on success, negative error number on failure. 219 */ 220 int nvmem_register_notifier(struct notifier_block *nb) 221 { 222 return blocking_notifier_chain_register(&nvmem_notifier, nb); 223 } 224 EXPORT_SYMBOL_GPL(nvmem_register_notifier); 225 226 /** 227 * nvmem_unregister_notifier() - Unregister a notifier block for nvmem events. 228 * 229 * @nb: notifier block to be unregistered. 230 * 231 * Return: 0 on success, negative error number on failure. 232 */ 233 int nvmem_unregister_notifier(struct notifier_block *nb) 234 { 235 return blocking_notifier_chain_unregister(&nvmem_notifier, nb); 236 } 237 EXPORT_SYMBOL_GPL(nvmem_unregister_notifier); 238 239 static int nvmem_add_cells_from_table(struct nvmem_device *nvmem) 240 { 241 const struct nvmem_cell_info *info; 242 struct nvmem_cell_table *table; 243 struct nvmem_cell *cell; 244 int rval = 0, i; 245 246 mutex_lock(&nvmem_cell_mutex); 247 list_for_each_entry(table, &nvmem_cell_tables, node) { 248 if (strcmp(nvmem_dev_name(nvmem), table->nvmem_name) == 0) { 249 for (i = 0; i < table->ncells; i++) { 250 info = &table->cells[i]; 251 252 cell = kzalloc(sizeof(*cell), GFP_KERNEL); 253 if (!cell) { 254 rval = -ENOMEM; 255 goto out; 256 } 257 258 rval = nvmem_cell_info_to_nvmem_cell(nvmem, 259 info, 260 cell); 261 if (rval) { 262 kfree(cell); 263 goto out; 264 } 265 266 nvmem_cell_add(cell); 267 } 268 } 269 } 270 271 out: 272 mutex_unlock(&nvmem_cell_mutex); 273 return rval; 274 } 275 276 static struct nvmem_cell * 277 nvmem_find_cell_by_name(struct nvmem_device *nvmem, const char *cell_id) 278 { 279 struct nvmem_cell *iter, *cell = NULL; 280 281 mutex_lock(&nvmem_mutex); 282 list_for_each_entry(iter, &nvmem->cells, node) { 283 if (strcmp(cell_id, iter->name) == 0) { 284 cell = iter; 285 break; 286 } 287 } 288 mutex_unlock(&nvmem_mutex); 289 290 return cell; 291 } 292 293 static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) 294 { 295 struct device_node *parent, *child; 296 struct device *dev = &nvmem->dev; 297 struct nvmem_cell *cell; 298 const __be32 *addr; 299 int len; 300 301 parent = dev->of_node; 302 303 for_each_child_of_node(parent, child) { 304 addr = of_get_property(child, "reg", &len); 305 if (!addr || (len < 2 * sizeof(u32))) { 306 dev_err(dev, "nvmem: invalid reg on %pOF\n", child); 307 return -EINVAL; 308 } 309 310 cell = kzalloc(sizeof(*cell), GFP_KERNEL); 311 if (!cell) 312 return -ENOMEM; 313 314 cell->nvmem = nvmem; 315 cell->np = of_node_get(child); 316 cell->offset = be32_to_cpup(addr++); 317 cell->bytes = be32_to_cpup(addr); 318 cell->name = kasprintf(GFP_KERNEL, "%pOFn", child); 319 320 addr = of_get_property(child, "bits", &len); 321 if (addr && len == (2 * sizeof(u32))) { 322 cell->bit_offset = be32_to_cpup(addr++); 323 cell->nbits = be32_to_cpup(addr); 324 } 325 326 if (cell->nbits) 327 cell->bytes = DIV_ROUND_UP( 328 cell->nbits + cell->bit_offset, 329 BITS_PER_BYTE); 330 331 if (!IS_ALIGNED(cell->offset, nvmem->stride)) { 332 dev_err(dev, "cell %s unaligned to nvmem stride %d\n", 333 cell->name, nvmem->stride); 334 /* Cells already added will be freed later. */ 335 kfree(cell->name); 336 kfree(cell); 337 return -EINVAL; 338 } 339 340 nvmem_cell_add(cell); 341 } 342 343 return 0; 344 } 345 346 /** 347 * nvmem_register() - Register a nvmem device for given nvmem_config. 348 * Also creates an binary entry in /sys/bus/nvmem/devices/dev-name/nvmem 349 * 350 * @config: nvmem device configuration with which nvmem device is created. 351 * 352 * Return: Will be an ERR_PTR() on error or a valid pointer to nvmem_device 353 * on success. 354 */ 355 356 struct nvmem_device *nvmem_register(const struct nvmem_config *config) 357 { 358 struct nvmem_device *nvmem; 359 int rval; 360 361 if (!config->dev) 362 return ERR_PTR(-EINVAL); 363 364 nvmem = kzalloc(sizeof(*nvmem), GFP_KERNEL); 365 if (!nvmem) 366 return ERR_PTR(-ENOMEM); 367 368 rval = ida_simple_get(&nvmem_ida, 0, 0, GFP_KERNEL); 369 if (rval < 0) { 370 kfree(nvmem); 371 return ERR_PTR(rval); 372 } 373 374 kref_init(&nvmem->refcnt); 375 INIT_LIST_HEAD(&nvmem->cells); 376 377 nvmem->id = rval; 378 nvmem->owner = config->owner; 379 if (!nvmem->owner && config->dev->driver) 380 nvmem->owner = config->dev->driver->owner; 381 nvmem->stride = config->stride ?: 1; 382 nvmem->word_size = config->word_size ?: 1; 383 nvmem->size = config->size; 384 nvmem->dev.type = &nvmem_provider_type; 385 nvmem->dev.bus = &nvmem_bus_type; 386 nvmem->dev.parent = config->dev; 387 nvmem->priv = config->priv; 388 nvmem->type = config->type; 389 nvmem->reg_read = config->reg_read; 390 nvmem->reg_write = config->reg_write; 391 if (!config->no_of_node) 392 nvmem->dev.of_node = config->dev->of_node; 393 394 if (config->id == -1 && config->name) { 395 dev_set_name(&nvmem->dev, "%s", config->name); 396 } else { 397 dev_set_name(&nvmem->dev, "%s%d", 398 config->name ? : "nvmem", 399 config->name ? config->id : nvmem->id); 400 } 401 402 nvmem->read_only = device_property_present(config->dev, "read-only") || 403 config->read_only || !nvmem->reg_write; 404 405 nvmem->dev.groups = nvmem_sysfs_get_groups(nvmem, config); 406 407 device_initialize(&nvmem->dev); 408 409 dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name); 410 411 rval = device_add(&nvmem->dev); 412 if (rval) 413 goto err_put_device; 414 415 if (config->compat) { 416 rval = nvmem_sysfs_setup_compat(nvmem, config); 417 if (rval) 418 goto err_device_del; 419 } 420 421 if (config->cells) { 422 rval = nvmem_add_cells(nvmem, config->cells, config->ncells); 423 if (rval) 424 goto err_teardown_compat; 425 } 426 427 rval = nvmem_add_cells_from_table(nvmem); 428 if (rval) 429 goto err_remove_cells; 430 431 rval = nvmem_add_cells_from_of(nvmem); 432 if (rval) 433 goto err_remove_cells; 434 435 blocking_notifier_call_chain(&nvmem_notifier, NVMEM_ADD, nvmem); 436 437 return nvmem; 438 439 err_remove_cells: 440 nvmem_device_remove_all_cells(nvmem); 441 err_teardown_compat: 442 if (config->compat) 443 nvmem_sysfs_remove_compat(nvmem, config); 444 err_device_del: 445 device_del(&nvmem->dev); 446 err_put_device: 447 put_device(&nvmem->dev); 448 449 return ERR_PTR(rval); 450 } 451 EXPORT_SYMBOL_GPL(nvmem_register); 452 453 static void nvmem_device_release(struct kref *kref) 454 { 455 struct nvmem_device *nvmem; 456 457 nvmem = container_of(kref, struct nvmem_device, refcnt); 458 459 blocking_notifier_call_chain(&nvmem_notifier, NVMEM_REMOVE, nvmem); 460 461 if (nvmem->flags & FLAG_COMPAT) 462 device_remove_bin_file(nvmem->base_dev, &nvmem->eeprom); 463 464 nvmem_device_remove_all_cells(nvmem); 465 device_del(&nvmem->dev); 466 put_device(&nvmem->dev); 467 } 468 469 /** 470 * nvmem_unregister() - Unregister previously registered nvmem device 471 * 472 * @nvmem: Pointer to previously registered nvmem device. 473 */ 474 void nvmem_unregister(struct nvmem_device *nvmem) 475 { 476 kref_put(&nvmem->refcnt, nvmem_device_release); 477 } 478 EXPORT_SYMBOL_GPL(nvmem_unregister); 479 480 static void devm_nvmem_release(struct device *dev, void *res) 481 { 482 nvmem_unregister(*(struct nvmem_device **)res); 483 } 484 485 /** 486 * devm_nvmem_register() - Register a managed nvmem device for given 487 * nvmem_config. 488 * Also creates an binary entry in /sys/bus/nvmem/devices/dev-name/nvmem 489 * 490 * @dev: Device that uses the nvmem device. 491 * @config: nvmem device configuration with which nvmem device is created. 492 * 493 * Return: Will be an ERR_PTR() on error or a valid pointer to nvmem_device 494 * on success. 495 */ 496 struct nvmem_device *devm_nvmem_register(struct device *dev, 497 const struct nvmem_config *config) 498 { 499 struct nvmem_device **ptr, *nvmem; 500 501 ptr = devres_alloc(devm_nvmem_release, sizeof(*ptr), GFP_KERNEL); 502 if (!ptr) 503 return ERR_PTR(-ENOMEM); 504 505 nvmem = nvmem_register(config); 506 507 if (!IS_ERR(nvmem)) { 508 *ptr = nvmem; 509 devres_add(dev, ptr); 510 } else { 511 devres_free(ptr); 512 } 513 514 return nvmem; 515 } 516 EXPORT_SYMBOL_GPL(devm_nvmem_register); 517 518 static int devm_nvmem_match(struct device *dev, void *res, void *data) 519 { 520 struct nvmem_device **r = res; 521 522 return *r == data; 523 } 524 525 /** 526 * devm_nvmem_unregister() - Unregister previously registered managed nvmem 527 * device. 528 * 529 * @dev: Device that uses the nvmem device. 530 * @nvmem: Pointer to previously registered nvmem device. 531 * 532 * Return: Will be an negative on error or a zero on success. 533 */ 534 int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem) 535 { 536 return devres_release(dev, devm_nvmem_release, devm_nvmem_match, nvmem); 537 } 538 EXPORT_SYMBOL(devm_nvmem_unregister); 539 540 static struct nvmem_device *__nvmem_device_get(struct device_node *np, 541 const char *nvmem_name) 542 { 543 struct nvmem_device *nvmem = NULL; 544 545 mutex_lock(&nvmem_mutex); 546 nvmem = np ? of_nvmem_find(np) : nvmem_find(nvmem_name); 547 mutex_unlock(&nvmem_mutex); 548 if (!nvmem) 549 return ERR_PTR(-EPROBE_DEFER); 550 551 if (!try_module_get(nvmem->owner)) { 552 dev_err(&nvmem->dev, 553 "could not increase module refcount for cell %s\n", 554 nvmem_dev_name(nvmem)); 555 556 put_device(&nvmem->dev); 557 return ERR_PTR(-EINVAL); 558 } 559 560 kref_get(&nvmem->refcnt); 561 562 return nvmem; 563 } 564 565 static void __nvmem_device_put(struct nvmem_device *nvmem) 566 { 567 put_device(&nvmem->dev); 568 module_put(nvmem->owner); 569 kref_put(&nvmem->refcnt, nvmem_device_release); 570 } 571 572 #if IS_ENABLED(CONFIG_OF) 573 /** 574 * of_nvmem_device_get() - Get nvmem device from a given id 575 * 576 * @np: Device tree node that uses the nvmem device. 577 * @id: nvmem name from nvmem-names property. 578 * 579 * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_device 580 * on success. 581 */ 582 struct nvmem_device *of_nvmem_device_get(struct device_node *np, const char *id) 583 { 584 585 struct device_node *nvmem_np; 586 int index = 0; 587 588 if (id) 589 index = of_property_match_string(np, "nvmem-names", id); 590 591 nvmem_np = of_parse_phandle(np, "nvmem", index); 592 if (!nvmem_np) 593 return ERR_PTR(-ENOENT); 594 595 return __nvmem_device_get(nvmem_np, NULL); 596 } 597 EXPORT_SYMBOL_GPL(of_nvmem_device_get); 598 #endif 599 600 /** 601 * nvmem_device_get() - Get nvmem device from a given id 602 * 603 * @dev: Device that uses the nvmem device. 604 * @dev_name: name of the requested nvmem device. 605 * 606 * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_device 607 * on success. 608 */ 609 struct nvmem_device *nvmem_device_get(struct device *dev, const char *dev_name) 610 { 611 if (dev->of_node) { /* try dt first */ 612 struct nvmem_device *nvmem; 613 614 nvmem = of_nvmem_device_get(dev->of_node, dev_name); 615 616 if (!IS_ERR(nvmem) || PTR_ERR(nvmem) == -EPROBE_DEFER) 617 return nvmem; 618 619 } 620 621 return __nvmem_device_get(NULL, dev_name); 622 } 623 EXPORT_SYMBOL_GPL(nvmem_device_get); 624 625 static int devm_nvmem_device_match(struct device *dev, void *res, void *data) 626 { 627 struct nvmem_device **nvmem = res; 628 629 if (WARN_ON(!nvmem || !*nvmem)) 630 return 0; 631 632 return *nvmem == data; 633 } 634 635 static void devm_nvmem_device_release(struct device *dev, void *res) 636 { 637 nvmem_device_put(*(struct nvmem_device **)res); 638 } 639 640 /** 641 * devm_nvmem_device_put() - put alredy got nvmem device 642 * 643 * @dev: Device that uses the nvmem device. 644 * @nvmem: pointer to nvmem device allocated by devm_nvmem_cell_get(), 645 * that needs to be released. 646 */ 647 void devm_nvmem_device_put(struct device *dev, struct nvmem_device *nvmem) 648 { 649 int ret; 650 651 ret = devres_release(dev, devm_nvmem_device_release, 652 devm_nvmem_device_match, nvmem); 653 654 WARN_ON(ret); 655 } 656 EXPORT_SYMBOL_GPL(devm_nvmem_device_put); 657 658 /** 659 * nvmem_device_put() - put alredy got nvmem device 660 * 661 * @nvmem: pointer to nvmem device that needs to be released. 662 */ 663 void nvmem_device_put(struct nvmem_device *nvmem) 664 { 665 __nvmem_device_put(nvmem); 666 } 667 EXPORT_SYMBOL_GPL(nvmem_device_put); 668 669 /** 670 * devm_nvmem_device_get() - Get nvmem cell of device form a given id 671 * 672 * @dev: Device that requests the nvmem device. 673 * @id: name id for the requested nvmem device. 674 * 675 * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_cell 676 * on success. The nvmem_cell will be freed by the automatically once the 677 * device is freed. 678 */ 679 struct nvmem_device *devm_nvmem_device_get(struct device *dev, const char *id) 680 { 681 struct nvmem_device **ptr, *nvmem; 682 683 ptr = devres_alloc(devm_nvmem_device_release, sizeof(*ptr), GFP_KERNEL); 684 if (!ptr) 685 return ERR_PTR(-ENOMEM); 686 687 nvmem = nvmem_device_get(dev, id); 688 if (!IS_ERR(nvmem)) { 689 *ptr = nvmem; 690 devres_add(dev, ptr); 691 } else { 692 devres_free(ptr); 693 } 694 695 return nvmem; 696 } 697 EXPORT_SYMBOL_GPL(devm_nvmem_device_get); 698 699 static struct nvmem_cell * 700 nvmem_cell_get_from_lookup(struct device *dev, const char *con_id) 701 { 702 struct nvmem_cell *cell = ERR_PTR(-ENOENT); 703 struct nvmem_cell_lookup *lookup; 704 struct nvmem_device *nvmem; 705 const char *dev_id; 706 707 if (!dev) 708 return ERR_PTR(-EINVAL); 709 710 dev_id = dev_name(dev); 711 712 mutex_lock(&nvmem_lookup_mutex); 713 714 list_for_each_entry(lookup, &nvmem_lookup_list, node) { 715 if ((strcmp(lookup->dev_id, dev_id) == 0) && 716 (strcmp(lookup->con_id, con_id) == 0)) { 717 /* This is the right entry. */ 718 nvmem = __nvmem_device_get(NULL, lookup->nvmem_name); 719 if (IS_ERR(nvmem)) { 720 /* Provider may not be registered yet. */ 721 cell = ERR_CAST(nvmem); 722 break; 723 } 724 725 cell = nvmem_find_cell_by_name(nvmem, 726 lookup->cell_name); 727 if (!cell) { 728 __nvmem_device_put(nvmem); 729 cell = ERR_PTR(-ENOENT); 730 } 731 break; 732 } 733 } 734 735 mutex_unlock(&nvmem_lookup_mutex); 736 return cell; 737 } 738 739 #if IS_ENABLED(CONFIG_OF) 740 static struct nvmem_cell * 741 nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np) 742 { 743 struct nvmem_cell *iter, *cell = NULL; 744 745 mutex_lock(&nvmem_mutex); 746 list_for_each_entry(iter, &nvmem->cells, node) { 747 if (np == iter->np) { 748 cell = iter; 749 break; 750 } 751 } 752 mutex_unlock(&nvmem_mutex); 753 754 return cell; 755 } 756 757 /** 758 * of_nvmem_cell_get() - Get a nvmem cell from given device node and cell id 759 * 760 * @np: Device tree node that uses the nvmem cell. 761 * @id: nvmem cell name from nvmem-cell-names property, or NULL 762 * for the cell at index 0 (the lone cell with no accompanying 763 * nvmem-cell-names property). 764 * 765 * Return: Will be an ERR_PTR() on error or a valid pointer 766 * to a struct nvmem_cell. The nvmem_cell will be freed by the 767 * nvmem_cell_put(). 768 */ 769 struct nvmem_cell *of_nvmem_cell_get(struct device_node *np, const char *id) 770 { 771 struct device_node *cell_np, *nvmem_np; 772 struct nvmem_device *nvmem; 773 struct nvmem_cell *cell; 774 int index = 0; 775 776 /* if cell name exists, find index to the name */ 777 if (id) 778 index = of_property_match_string(np, "nvmem-cell-names", id); 779 780 cell_np = of_parse_phandle(np, "nvmem-cells", index); 781 if (!cell_np) 782 return ERR_PTR(-ENOENT); 783 784 nvmem_np = of_get_next_parent(cell_np); 785 if (!nvmem_np) 786 return ERR_PTR(-EINVAL); 787 788 nvmem = __nvmem_device_get(nvmem_np, NULL); 789 of_node_put(nvmem_np); 790 if (IS_ERR(nvmem)) 791 return ERR_CAST(nvmem); 792 793 cell = nvmem_find_cell_by_node(nvmem, cell_np); 794 if (!cell) { 795 __nvmem_device_put(nvmem); 796 return ERR_PTR(-ENOENT); 797 } 798 799 return cell; 800 } 801 EXPORT_SYMBOL_GPL(of_nvmem_cell_get); 802 #endif 803 804 /** 805 * nvmem_cell_get() - Get nvmem cell of device form a given cell name 806 * 807 * @dev: Device that requests the nvmem cell. 808 * @id: nvmem cell name to get (this corresponds with the name from the 809 * nvmem-cell-names property for DT systems and with the con_id from 810 * the lookup entry for non-DT systems). 811 * 812 * Return: Will be an ERR_PTR() on error or a valid pointer 813 * to a struct nvmem_cell. The nvmem_cell will be freed by the 814 * nvmem_cell_put(). 815 */ 816 struct nvmem_cell *nvmem_cell_get(struct device *dev, const char *id) 817 { 818 struct nvmem_cell *cell; 819 820 if (dev->of_node) { /* try dt first */ 821 cell = of_nvmem_cell_get(dev->of_node, id); 822 if (!IS_ERR(cell) || PTR_ERR(cell) == -EPROBE_DEFER) 823 return cell; 824 } 825 826 /* NULL cell id only allowed for device tree; invalid otherwise */ 827 if (!id) 828 return ERR_PTR(-EINVAL); 829 830 return nvmem_cell_get_from_lookup(dev, id); 831 } 832 EXPORT_SYMBOL_GPL(nvmem_cell_get); 833 834 static void devm_nvmem_cell_release(struct device *dev, void *res) 835 { 836 nvmem_cell_put(*(struct nvmem_cell **)res); 837 } 838 839 /** 840 * devm_nvmem_cell_get() - Get nvmem cell of device form a given id 841 * 842 * @dev: Device that requests the nvmem cell. 843 * @id: nvmem cell name id to get. 844 * 845 * Return: Will be an ERR_PTR() on error or a valid pointer 846 * to a struct nvmem_cell. The nvmem_cell will be freed by the 847 * automatically once the device is freed. 848 */ 849 struct nvmem_cell *devm_nvmem_cell_get(struct device *dev, const char *id) 850 { 851 struct nvmem_cell **ptr, *cell; 852 853 ptr = devres_alloc(devm_nvmem_cell_release, sizeof(*ptr), GFP_KERNEL); 854 if (!ptr) 855 return ERR_PTR(-ENOMEM); 856 857 cell = nvmem_cell_get(dev, id); 858 if (!IS_ERR(cell)) { 859 *ptr = cell; 860 devres_add(dev, ptr); 861 } else { 862 devres_free(ptr); 863 } 864 865 return cell; 866 } 867 EXPORT_SYMBOL_GPL(devm_nvmem_cell_get); 868 869 static int devm_nvmem_cell_match(struct device *dev, void *res, void *data) 870 { 871 struct nvmem_cell **c = res; 872 873 if (WARN_ON(!c || !*c)) 874 return 0; 875 876 return *c == data; 877 } 878 879 /** 880 * devm_nvmem_cell_put() - Release previously allocated nvmem cell 881 * from devm_nvmem_cell_get. 882 * 883 * @dev: Device that requests the nvmem cell. 884 * @cell: Previously allocated nvmem cell by devm_nvmem_cell_get(). 885 */ 886 void devm_nvmem_cell_put(struct device *dev, struct nvmem_cell *cell) 887 { 888 int ret; 889 890 ret = devres_release(dev, devm_nvmem_cell_release, 891 devm_nvmem_cell_match, cell); 892 893 WARN_ON(ret); 894 } 895 EXPORT_SYMBOL(devm_nvmem_cell_put); 896 897 /** 898 * nvmem_cell_put() - Release previously allocated nvmem cell. 899 * 900 * @cell: Previously allocated nvmem cell by nvmem_cell_get(). 901 */ 902 void nvmem_cell_put(struct nvmem_cell *cell) 903 { 904 struct nvmem_device *nvmem = cell->nvmem; 905 906 __nvmem_device_put(nvmem); 907 } 908 EXPORT_SYMBOL_GPL(nvmem_cell_put); 909 910 static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf) 911 { 912 u8 *p, *b; 913 int i, extra, bit_offset = cell->bit_offset; 914 915 p = b = buf; 916 if (bit_offset) { 917 /* First shift */ 918 *b++ >>= bit_offset; 919 920 /* setup rest of the bytes if any */ 921 for (i = 1; i < cell->bytes; i++) { 922 /* Get bits from next byte and shift them towards msb */ 923 *p |= *b << (BITS_PER_BYTE - bit_offset); 924 925 p = b; 926 *b++ >>= bit_offset; 927 } 928 } else { 929 /* point to the msb */ 930 p += cell->bytes - 1; 931 } 932 933 /* result fits in less bytes */ 934 extra = cell->bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE); 935 while (--extra >= 0) 936 *p-- = 0; 937 938 /* clear msb bits if any leftover in the last byte */ 939 *p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0); 940 } 941 942 static int __nvmem_cell_read(struct nvmem_device *nvmem, 943 struct nvmem_cell *cell, 944 void *buf, size_t *len) 945 { 946 int rc; 947 948 rc = nvmem_reg_read(nvmem, cell->offset, buf, cell->bytes); 949 950 if (rc) 951 return rc; 952 953 /* shift bits in-place */ 954 if (cell->bit_offset || cell->nbits) 955 nvmem_shift_read_buffer_in_place(cell, buf); 956 957 if (len) 958 *len = cell->bytes; 959 960 return 0; 961 } 962 963 /** 964 * nvmem_cell_read() - Read a given nvmem cell 965 * 966 * @cell: nvmem cell to be read. 967 * @len: pointer to length of cell which will be populated on successful read; 968 * can be NULL. 969 * 970 * Return: ERR_PTR() on error or a valid pointer to a buffer on success. The 971 * buffer should be freed by the consumer with a kfree(). 972 */ 973 void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len) 974 { 975 struct nvmem_device *nvmem = cell->nvmem; 976 u8 *buf; 977 int rc; 978 979 if (!nvmem) 980 return ERR_PTR(-EINVAL); 981 982 buf = kzalloc(cell->bytes, GFP_KERNEL); 983 if (!buf) 984 return ERR_PTR(-ENOMEM); 985 986 rc = __nvmem_cell_read(nvmem, cell, buf, len); 987 if (rc) { 988 kfree(buf); 989 return ERR_PTR(rc); 990 } 991 992 return buf; 993 } 994 EXPORT_SYMBOL_GPL(nvmem_cell_read); 995 996 static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell, 997 u8 *_buf, int len) 998 { 999 struct nvmem_device *nvmem = cell->nvmem; 1000 int i, rc, nbits, bit_offset = cell->bit_offset; 1001 u8 v, *p, *buf, *b, pbyte, pbits; 1002 1003 nbits = cell->nbits; 1004 buf = kzalloc(cell->bytes, GFP_KERNEL); 1005 if (!buf) 1006 return ERR_PTR(-ENOMEM); 1007 1008 memcpy(buf, _buf, len); 1009 p = b = buf; 1010 1011 if (bit_offset) { 1012 pbyte = *b; 1013 *b <<= bit_offset; 1014 1015 /* setup the first byte with lsb bits from nvmem */ 1016 rc = nvmem_reg_read(nvmem, cell->offset, &v, 1); 1017 if (rc) 1018 goto err; 1019 *b++ |= GENMASK(bit_offset - 1, 0) & v; 1020 1021 /* setup rest of the byte if any */ 1022 for (i = 1; i < cell->bytes; i++) { 1023 /* Get last byte bits and shift them towards lsb */ 1024 pbits = pbyte >> (BITS_PER_BYTE - 1 - bit_offset); 1025 pbyte = *b; 1026 p = b; 1027 *b <<= bit_offset; 1028 *b++ |= pbits; 1029 } 1030 } 1031 1032 /* if it's not end on byte boundary */ 1033 if ((nbits + bit_offset) % BITS_PER_BYTE) { 1034 /* setup the last byte with msb bits from nvmem */ 1035 rc = nvmem_reg_read(nvmem, 1036 cell->offset + cell->bytes - 1, &v, 1); 1037 if (rc) 1038 goto err; 1039 *p |= GENMASK(7, (nbits + bit_offset) % BITS_PER_BYTE) & v; 1040 1041 } 1042 1043 return buf; 1044 err: 1045 kfree(buf); 1046 return ERR_PTR(rc); 1047 } 1048 1049 /** 1050 * nvmem_cell_write() - Write to a given nvmem cell 1051 * 1052 * @cell: nvmem cell to be written. 1053 * @buf: Buffer to be written. 1054 * @len: length of buffer to be written to nvmem cell. 1055 * 1056 * Return: length of bytes written or negative on failure. 1057 */ 1058 int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len) 1059 { 1060 struct nvmem_device *nvmem = cell->nvmem; 1061 int rc; 1062 1063 if (!nvmem || nvmem->read_only || 1064 (cell->bit_offset == 0 && len != cell->bytes)) 1065 return -EINVAL; 1066 1067 if (cell->bit_offset || cell->nbits) { 1068 buf = nvmem_cell_prepare_write_buffer(cell, buf, len); 1069 if (IS_ERR(buf)) 1070 return PTR_ERR(buf); 1071 } 1072 1073 rc = nvmem_reg_write(nvmem, cell->offset, buf, cell->bytes); 1074 1075 /* free the tmp buffer */ 1076 if (cell->bit_offset || cell->nbits) 1077 kfree(buf); 1078 1079 if (rc) 1080 return rc; 1081 1082 return len; 1083 } 1084 EXPORT_SYMBOL_GPL(nvmem_cell_write); 1085 1086 /** 1087 * nvmem_cell_read_u16() - Read a cell value as an u16 1088 * 1089 * @dev: Device that requests the nvmem cell. 1090 * @cell_id: Name of nvmem cell to read. 1091 * @val: pointer to output value. 1092 * 1093 * Return: 0 on success or negative errno. 1094 */ 1095 int nvmem_cell_read_u16(struct device *dev, const char *cell_id, u16 *val) 1096 { 1097 struct nvmem_cell *cell; 1098 void *buf; 1099 size_t len; 1100 1101 cell = nvmem_cell_get(dev, cell_id); 1102 if (IS_ERR(cell)) 1103 return PTR_ERR(cell); 1104 1105 buf = nvmem_cell_read(cell, &len); 1106 if (IS_ERR(buf)) { 1107 nvmem_cell_put(cell); 1108 return PTR_ERR(buf); 1109 } 1110 if (len != sizeof(*val)) { 1111 kfree(buf); 1112 nvmem_cell_put(cell); 1113 return -EINVAL; 1114 } 1115 memcpy(val, buf, sizeof(*val)); 1116 kfree(buf); 1117 nvmem_cell_put(cell); 1118 1119 return 0; 1120 } 1121 EXPORT_SYMBOL_GPL(nvmem_cell_read_u16); 1122 1123 /** 1124 * nvmem_cell_read_u32() - Read a cell value as an u32 1125 * 1126 * @dev: Device that requests the nvmem cell. 1127 * @cell_id: Name of nvmem cell to read. 1128 * @val: pointer to output value. 1129 * 1130 * Return: 0 on success or negative errno. 1131 */ 1132 int nvmem_cell_read_u32(struct device *dev, const char *cell_id, u32 *val) 1133 { 1134 struct nvmem_cell *cell; 1135 void *buf; 1136 size_t len; 1137 1138 cell = nvmem_cell_get(dev, cell_id); 1139 if (IS_ERR(cell)) 1140 return PTR_ERR(cell); 1141 1142 buf = nvmem_cell_read(cell, &len); 1143 if (IS_ERR(buf)) { 1144 nvmem_cell_put(cell); 1145 return PTR_ERR(buf); 1146 } 1147 if (len != sizeof(*val)) { 1148 kfree(buf); 1149 nvmem_cell_put(cell); 1150 return -EINVAL; 1151 } 1152 memcpy(val, buf, sizeof(*val)); 1153 1154 kfree(buf); 1155 nvmem_cell_put(cell); 1156 return 0; 1157 } 1158 EXPORT_SYMBOL_GPL(nvmem_cell_read_u32); 1159 1160 /** 1161 * nvmem_device_cell_read() - Read a given nvmem device and cell 1162 * 1163 * @nvmem: nvmem device to read from. 1164 * @info: nvmem cell info to be read. 1165 * @buf: buffer pointer which will be populated on successful read. 1166 * 1167 * Return: length of successful bytes read on success and negative 1168 * error code on error. 1169 */ 1170 ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem, 1171 struct nvmem_cell_info *info, void *buf) 1172 { 1173 struct nvmem_cell cell; 1174 int rc; 1175 ssize_t len; 1176 1177 if (!nvmem) 1178 return -EINVAL; 1179 1180 rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell); 1181 if (rc) 1182 return rc; 1183 1184 rc = __nvmem_cell_read(nvmem, &cell, buf, &len); 1185 if (rc) 1186 return rc; 1187 1188 return len; 1189 } 1190 EXPORT_SYMBOL_GPL(nvmem_device_cell_read); 1191 1192 /** 1193 * nvmem_device_cell_write() - Write cell to a given nvmem device 1194 * 1195 * @nvmem: nvmem device to be written to. 1196 * @info: nvmem cell info to be written. 1197 * @buf: buffer to be written to cell. 1198 * 1199 * Return: length of bytes written or negative error code on failure. 1200 */ 1201 int nvmem_device_cell_write(struct nvmem_device *nvmem, 1202 struct nvmem_cell_info *info, void *buf) 1203 { 1204 struct nvmem_cell cell; 1205 int rc; 1206 1207 if (!nvmem) 1208 return -EINVAL; 1209 1210 rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell); 1211 if (rc) 1212 return rc; 1213 1214 return nvmem_cell_write(&cell, buf, cell.bytes); 1215 } 1216 EXPORT_SYMBOL_GPL(nvmem_device_cell_write); 1217 1218 /** 1219 * nvmem_device_read() - Read from a given nvmem device 1220 * 1221 * @nvmem: nvmem device to read from. 1222 * @offset: offset in nvmem device. 1223 * @bytes: number of bytes to read. 1224 * @buf: buffer pointer which will be populated on successful read. 1225 * 1226 * Return: length of successful bytes read on success and negative 1227 * error code on error. 1228 */ 1229 int nvmem_device_read(struct nvmem_device *nvmem, 1230 unsigned int offset, 1231 size_t bytes, void *buf) 1232 { 1233 int rc; 1234 1235 if (!nvmem) 1236 return -EINVAL; 1237 1238 rc = nvmem_reg_read(nvmem, offset, buf, bytes); 1239 1240 if (rc) 1241 return rc; 1242 1243 return bytes; 1244 } 1245 EXPORT_SYMBOL_GPL(nvmem_device_read); 1246 1247 /** 1248 * nvmem_device_write() - Write cell to a given nvmem device 1249 * 1250 * @nvmem: nvmem device to be written to. 1251 * @offset: offset in nvmem device. 1252 * @bytes: number of bytes to write. 1253 * @buf: buffer to be written. 1254 * 1255 * Return: length of bytes written or negative error code on failure. 1256 */ 1257 int nvmem_device_write(struct nvmem_device *nvmem, 1258 unsigned int offset, 1259 size_t bytes, void *buf) 1260 { 1261 int rc; 1262 1263 if (!nvmem) 1264 return -EINVAL; 1265 1266 rc = nvmem_reg_write(nvmem, offset, buf, bytes); 1267 1268 if (rc) 1269 return rc; 1270 1271 1272 return bytes; 1273 } 1274 EXPORT_SYMBOL_GPL(nvmem_device_write); 1275 1276 /** 1277 * nvmem_add_cell_table() - register a table of cell info entries 1278 * 1279 * @table: table of cell info entries 1280 */ 1281 void nvmem_add_cell_table(struct nvmem_cell_table *table) 1282 { 1283 mutex_lock(&nvmem_cell_mutex); 1284 list_add_tail(&table->node, &nvmem_cell_tables); 1285 mutex_unlock(&nvmem_cell_mutex); 1286 } 1287 EXPORT_SYMBOL_GPL(nvmem_add_cell_table); 1288 1289 /** 1290 * nvmem_del_cell_table() - remove a previously registered cell info table 1291 * 1292 * @table: table of cell info entries 1293 */ 1294 void nvmem_del_cell_table(struct nvmem_cell_table *table) 1295 { 1296 mutex_lock(&nvmem_cell_mutex); 1297 list_del(&table->node); 1298 mutex_unlock(&nvmem_cell_mutex); 1299 } 1300 EXPORT_SYMBOL_GPL(nvmem_del_cell_table); 1301 1302 /** 1303 * nvmem_add_cell_lookups() - register a list of cell lookup entries 1304 * 1305 * @entries: array of cell lookup entries 1306 * @nentries: number of cell lookup entries in the array 1307 */ 1308 void nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) 1309 { 1310 int i; 1311 1312 mutex_lock(&nvmem_lookup_mutex); 1313 for (i = 0; i < nentries; i++) 1314 list_add_tail(&entries[i].node, &nvmem_lookup_list); 1315 mutex_unlock(&nvmem_lookup_mutex); 1316 } 1317 EXPORT_SYMBOL_GPL(nvmem_add_cell_lookups); 1318 1319 /** 1320 * nvmem_del_cell_lookups() - remove a list of previously added cell lookup 1321 * entries 1322 * 1323 * @entries: array of cell lookup entries 1324 * @nentries: number of cell lookup entries in the array 1325 */ 1326 void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) 1327 { 1328 int i; 1329 1330 mutex_lock(&nvmem_lookup_mutex); 1331 for (i = 0; i < nentries; i++) 1332 list_del(&entries[i].node); 1333 mutex_unlock(&nvmem_lookup_mutex); 1334 } 1335 EXPORT_SYMBOL_GPL(nvmem_del_cell_lookups); 1336 1337 /** 1338 * nvmem_dev_name() - Get the name of a given nvmem device. 1339 * 1340 * @nvmem: nvmem device. 1341 * 1342 * Return: name of the nvmem device. 1343 */ 1344 const char *nvmem_dev_name(struct nvmem_device *nvmem) 1345 { 1346 return dev_name(&nvmem->dev); 1347 } 1348 EXPORT_SYMBOL_GPL(nvmem_dev_name); 1349 1350 static int __init nvmem_init(void) 1351 { 1352 return bus_register(&nvmem_bus_type); 1353 } 1354 1355 static void __exit nvmem_exit(void) 1356 { 1357 bus_unregister(&nvmem_bus_type); 1358 } 1359 1360 subsys_initcall(nvmem_init); 1361 module_exit(nvmem_exit); 1362 1363 MODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org"); 1364 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); 1365 MODULE_DESCRIPTION("nvmem Driver Core"); 1366 MODULE_LICENSE("GPL v2"); 1367