at v5.2-rc1 1366 lines 32 kB view raw
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 22struct 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 33static DEFINE_MUTEX(nvmem_mutex); 34static DEFINE_IDA(nvmem_ida); 35 36static DEFINE_MUTEX(nvmem_cell_mutex); 37static LIST_HEAD(nvmem_cell_tables); 38 39static DEFINE_MUTEX(nvmem_lookup_mutex); 40static LIST_HEAD(nvmem_lookup_list); 41 42static BLOCKING_NOTIFIER_HEAD(nvmem_notifier); 43 44 45static 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 54static 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 63static 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 71static const struct device_type nvmem_provider_type = { 72 .release = nvmem_release, 73}; 74 75static struct bus_type nvmem_bus_type = { 76 .name = "nvmem", 77}; 78 79static int of_nvmem_match(struct device *dev, void *nvmem_np) 80{ 81 return dev->of_node == nvmem_np; 82} 83 84static 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 99static 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 111static 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 122static 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 130static 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 138static 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 */ 173static 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; 204err: 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 */ 220int nvmem_register_notifier(struct notifier_block *nb) 221{ 222 return blocking_notifier_chain_register(&nvmem_notifier, nb); 223} 224EXPORT_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 */ 233int nvmem_unregister_notifier(struct notifier_block *nb) 234{ 235 return blocking_notifier_chain_unregister(&nvmem_notifier, nb); 236} 237EXPORT_SYMBOL_GPL(nvmem_unregister_notifier); 238 239static 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 271out: 272 mutex_unlock(&nvmem_cell_mutex); 273 return rval; 274} 275 276static struct nvmem_cell * 277nvmem_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 293static 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 356struct 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 439err_remove_cells: 440 nvmem_device_remove_all_cells(nvmem); 441err_teardown_compat: 442 if (config->compat) 443 nvmem_sysfs_remove_compat(nvmem, config); 444err_device_del: 445 device_del(&nvmem->dev); 446err_put_device: 447 put_device(&nvmem->dev); 448 449 return ERR_PTR(rval); 450} 451EXPORT_SYMBOL_GPL(nvmem_register); 452 453static 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 */ 474void nvmem_unregister(struct nvmem_device *nvmem) 475{ 476 kref_put(&nvmem->refcnt, nvmem_device_release); 477} 478EXPORT_SYMBOL_GPL(nvmem_unregister); 479 480static 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 */ 496struct 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} 516EXPORT_SYMBOL_GPL(devm_nvmem_register); 517 518static 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 */ 534int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem) 535{ 536 return devres_release(dev, devm_nvmem_release, devm_nvmem_match, nvmem); 537} 538EXPORT_SYMBOL(devm_nvmem_unregister); 539 540static 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 565static 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 */ 582struct 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} 597EXPORT_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 */ 609struct 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} 623EXPORT_SYMBOL_GPL(nvmem_device_get); 624 625static 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 635static 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 */ 647void 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} 656EXPORT_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 */ 663void nvmem_device_put(struct nvmem_device *nvmem) 664{ 665 __nvmem_device_put(nvmem); 666} 667EXPORT_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 */ 679struct 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} 697EXPORT_SYMBOL_GPL(devm_nvmem_device_get); 698 699static struct nvmem_cell * 700nvmem_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) 740static struct nvmem_cell * 741nvmem_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 */ 769struct 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} 801EXPORT_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 */ 816struct 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} 832EXPORT_SYMBOL_GPL(nvmem_cell_get); 833 834static 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 */ 849struct 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} 867EXPORT_SYMBOL_GPL(devm_nvmem_cell_get); 868 869static 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 */ 886void 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} 895EXPORT_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 */ 902void nvmem_cell_put(struct nvmem_cell *cell) 903{ 904 struct nvmem_device *nvmem = cell->nvmem; 905 906 __nvmem_device_put(nvmem); 907} 908EXPORT_SYMBOL_GPL(nvmem_cell_put); 909 910static 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 942static 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 */ 973void *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} 994EXPORT_SYMBOL_GPL(nvmem_cell_read); 995 996static 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; 1044err: 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 */ 1058int 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} 1084EXPORT_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 */ 1095int 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} 1121EXPORT_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 */ 1132int 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} 1158EXPORT_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 */ 1170ssize_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} 1190EXPORT_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 */ 1201int 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} 1216EXPORT_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 */ 1229int 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} 1245EXPORT_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 */ 1257int 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} 1274EXPORT_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 */ 1281void 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} 1287EXPORT_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 */ 1294void 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} 1300EXPORT_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 */ 1308void 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} 1317EXPORT_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 */ 1326void 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} 1335EXPORT_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 */ 1344const char *nvmem_dev_name(struct nvmem_device *nvmem) 1345{ 1346 return dev_name(&nvmem->dev); 1347} 1348EXPORT_SYMBOL_GPL(nvmem_dev_name); 1349 1350static int __init nvmem_init(void) 1351{ 1352 return bus_register(&nvmem_bus_type); 1353} 1354 1355static void __exit nvmem_exit(void) 1356{ 1357 bus_unregister(&nvmem_bus_type); 1358} 1359 1360subsys_initcall(nvmem_init); 1361module_exit(nvmem_exit); 1362 1363MODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org"); 1364MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); 1365MODULE_DESCRIPTION("nvmem Driver Core"); 1366MODULE_LICENSE("GPL v2");