1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Generic Framer framework. 4 * 5 * Copyright 2023 CS GROUP France 6 * 7 * Author: Herve Codina <herve.codina@bootlin.com> 8 */ 9 10 #include <linux/device.h> 11 #include <linux/framer/framer.h> 12 #include <linux/framer/framer-provider.h> 13 #include <linux/idr.h> 14 #include <linux/module.h> 15 #include <linux/notifier.h> 16 #include <linux/of.h> 17 #include <linux/pm_runtime.h> 18 #include <linux/regulator/consumer.h> 19 #include <linux/slab.h> 20 21 static struct class *framer_class; 22 static DEFINE_MUTEX(framer_provider_mutex); 23 static LIST_HEAD(framer_provider_list); 24 static DEFINE_IDA(framer_ida); 25 26 #define dev_to_framer(a) (container_of((a), struct framer, dev)) 27 28 int framer_pm_runtime_get(struct framer *framer) 29 { 30 int ret; 31 32 if (!pm_runtime_enabled(&framer->dev)) 33 return -EOPNOTSUPP; 34 35 ret = pm_runtime_get(&framer->dev); 36 if (ret < 0 && ret != -EINPROGRESS) 37 pm_runtime_put_noidle(&framer->dev); 38 39 return ret; 40 } 41 EXPORT_SYMBOL_GPL(framer_pm_runtime_get); 42 43 int framer_pm_runtime_get_sync(struct framer *framer) 44 { 45 int ret; 46 47 if (!pm_runtime_enabled(&framer->dev)) 48 return -EOPNOTSUPP; 49 50 ret = pm_runtime_get_sync(&framer->dev); 51 if (ret < 0) 52 pm_runtime_put_sync(&framer->dev); 53 54 return ret; 55 } 56 EXPORT_SYMBOL_GPL(framer_pm_runtime_get_sync); 57 58 int framer_pm_runtime_put(struct framer *framer) 59 { 60 if (!pm_runtime_enabled(&framer->dev)) 61 return -EOPNOTSUPP; 62 63 return pm_runtime_put(&framer->dev); 64 } 65 EXPORT_SYMBOL_GPL(framer_pm_runtime_put); 66 67 int framer_pm_runtime_put_sync(struct framer *framer) 68 { 69 if (!pm_runtime_enabled(&framer->dev)) 70 return -EOPNOTSUPP; 71 72 return pm_runtime_put_sync(&framer->dev); 73 } 74 EXPORT_SYMBOL_GPL(framer_pm_runtime_put_sync); 75 76 /** 77 * framer_init - framer internal initialization before framer operation 78 * @framer: the framer returned by framer_get() 79 * 80 * Used to allow framer's driver to perform framer internal initialization, 81 * such as PLL block powering, clock initialization or anything that's 82 * is required by the framer to perform the start of operation. 83 * Must be called before framer_power_on(). 84 * 85 * Return: %0 if successful, a negative error code otherwise 86 */ 87 int framer_init(struct framer *framer) 88 { 89 bool start_polling = false; 90 int ret; 91 92 ret = framer_pm_runtime_get_sync(framer); 93 if (ret < 0 && ret != -EOPNOTSUPP) 94 return ret; 95 ret = 0; /* Override possible ret == -EOPNOTSUPP */ 96 97 mutex_lock(&framer->mutex); 98 if (framer->power_count > framer->init_count) 99 dev_warn(&framer->dev, "framer_power_on was called before framer init\n"); 100 101 if (framer->init_count == 0) { 102 if (framer->ops->init) { 103 ret = framer->ops->init(framer); 104 if (ret < 0) { 105 dev_err(&framer->dev, "framer init failed --> %d\n", ret); 106 goto out; 107 } 108 } 109 if (framer->ops->flags & FRAMER_FLAG_POLL_STATUS) 110 start_polling = true; 111 } 112 ++framer->init_count; 113 114 out: 115 mutex_unlock(&framer->mutex); 116 117 if (!ret && start_polling) { 118 ret = framer_get_status(framer, &framer->prev_status); 119 if (ret < 0) { 120 dev_warn(&framer->dev, "framer get status failed --> %d\n", ret); 121 /* Will be retried on polling_work */ 122 ret = 0; 123 } 124 queue_delayed_work(system_power_efficient_wq, &framer->polling_work, 1 * HZ); 125 } 126 127 framer_pm_runtime_put(framer); 128 return ret; 129 } 130 EXPORT_SYMBOL_GPL(framer_init); 131 132 /** 133 * framer_exit - Framer internal un-initialization 134 * @framer: the framer returned by framer_get() 135 * 136 * Must be called after framer_power_off(). 137 */ 138 int framer_exit(struct framer *framer) 139 { 140 int ret; 141 142 ret = framer_pm_runtime_get_sync(framer); 143 if (ret < 0 && ret != -EOPNOTSUPP) 144 return ret; 145 ret = 0; /* Override possible ret == -EOPNOTSUPP */ 146 147 mutex_lock(&framer->mutex); 148 --framer->init_count; 149 if (framer->init_count == 0) { 150 if (framer->ops->flags & FRAMER_FLAG_POLL_STATUS) { 151 mutex_unlock(&framer->mutex); 152 cancel_delayed_work_sync(&framer->polling_work); 153 mutex_lock(&framer->mutex); 154 } 155 156 if (framer->ops->exit) 157 framer->ops->exit(framer); 158 } 159 160 mutex_unlock(&framer->mutex); 161 framer_pm_runtime_put(framer); 162 return ret; 163 } 164 EXPORT_SYMBOL_GPL(framer_exit); 165 166 /** 167 * framer_power_on - Enable the framer and enter proper operation 168 * @framer: the framer returned by framer_get() 169 * 170 * Must be called after framer_init(). 171 * 172 * Return: %0 if successful, a negative error code otherwise 173 */ 174 int framer_power_on(struct framer *framer) 175 { 176 int ret; 177 178 if (framer->pwr) { 179 ret = regulator_enable(framer->pwr); 180 if (ret) 181 return ret; 182 } 183 184 ret = framer_pm_runtime_get_sync(framer); 185 if (ret < 0 && ret != -EOPNOTSUPP) 186 goto err_pm_sync; 187 188 mutex_lock(&framer->mutex); 189 if (framer->power_count == 0 && framer->ops->power_on) { 190 ret = framer->ops->power_on(framer); 191 if (ret < 0) { 192 dev_err(&framer->dev, "framer poweron failed --> %d\n", ret); 193 goto err_pwr_on; 194 } 195 } 196 ++framer->power_count; 197 mutex_unlock(&framer->mutex); 198 return 0; 199 200 err_pwr_on: 201 mutex_unlock(&framer->mutex); 202 framer_pm_runtime_put_sync(framer); 203 err_pm_sync: 204 if (framer->pwr) 205 regulator_disable(framer->pwr); 206 return ret; 207 } 208 EXPORT_SYMBOL_GPL(framer_power_on); 209 210 /** 211 * framer_power_off - Disable the framer. 212 * @framer: the framer returned by framer_get() 213 * 214 * Must be called before framer_exit(). 215 * 216 * Return: %0 if successful, a negative error code otherwise 217 */ 218 int framer_power_off(struct framer *framer) 219 { 220 int ret; 221 222 mutex_lock(&framer->mutex); 223 if (framer->power_count == 1 && framer->ops->power_off) { 224 ret = framer->ops->power_off(framer); 225 if (ret < 0) { 226 dev_err(&framer->dev, "framer poweroff failed --> %d\n", ret); 227 mutex_unlock(&framer->mutex); 228 return ret; 229 } 230 } 231 --framer->power_count; 232 mutex_unlock(&framer->mutex); 233 framer_pm_runtime_put(framer); 234 235 if (framer->pwr) 236 regulator_disable(framer->pwr); 237 238 return 0; 239 } 240 EXPORT_SYMBOL_GPL(framer_power_off); 241 242 /** 243 * framer_get_status() - Gets the framer status 244 * @framer: the framer returned by framer_get() 245 * @status: the status to retrieve 246 * 247 * Used to get the framer status. framer_init() must have been called 248 * on the framer. 249 * 250 * Return: %0 if successful, a negative error code otherwise 251 */ 252 int framer_get_status(struct framer *framer, struct framer_status *status) 253 { 254 int ret; 255 256 if (!framer->ops->get_status) 257 return -EOPNOTSUPP; 258 259 /* Be sure to have known values (struct padding and future extensions) */ 260 memset(status, 0, sizeof(*status)); 261 262 mutex_lock(&framer->mutex); 263 ret = framer->ops->get_status(framer, status); 264 mutex_unlock(&framer->mutex); 265 266 return ret; 267 } 268 EXPORT_SYMBOL_GPL(framer_get_status); 269 270 /** 271 * framer_set_config() - Sets the framer configuration 272 * @framer: the framer returned by framer_get() 273 * @config: the configuration to set 274 * 275 * Used to set the framer configuration. framer_init() must have been called 276 * on the framer. 277 * 278 * Return: %0 if successful, a negative error code otherwise 279 */ 280 int framer_set_config(struct framer *framer, const struct framer_config *config) 281 { 282 int ret; 283 284 if (!framer->ops->set_config) 285 return -EOPNOTSUPP; 286 287 mutex_lock(&framer->mutex); 288 ret = framer->ops->set_config(framer, config); 289 mutex_unlock(&framer->mutex); 290 291 return ret; 292 } 293 EXPORT_SYMBOL_GPL(framer_set_config); 294 295 /** 296 * framer_get_config() - Gets the framer configuration 297 * @framer: the framer returned by framer_get() 298 * @config: the configuration to retrieve 299 * 300 * Used to get the framer configuration. framer_init() must have been called 301 * on the framer. 302 * 303 * Return: %0 if successful, a negative error code otherwise 304 */ 305 int framer_get_config(struct framer *framer, struct framer_config *config) 306 { 307 int ret; 308 309 if (!framer->ops->get_config) 310 return -EOPNOTSUPP; 311 312 mutex_lock(&framer->mutex); 313 ret = framer->ops->get_config(framer, config); 314 mutex_unlock(&framer->mutex); 315 316 return ret; 317 } 318 EXPORT_SYMBOL_GPL(framer_get_config); 319 320 static void framer_polling_work(struct work_struct *work) 321 { 322 struct framer *framer = container_of(work, struct framer, polling_work.work); 323 struct framer_status status; 324 int ret; 325 326 ret = framer_get_status(framer, &status); 327 if (ret) { 328 dev_err(&framer->dev, "polling, get status failed (%d)\n", ret); 329 goto end; 330 } 331 if (memcmp(&framer->prev_status, &status, sizeof(status))) { 332 blocking_notifier_call_chain(&framer->notifier_list, 333 FRAMER_EVENT_STATUS, NULL); 334 memcpy(&framer->prev_status, &status, sizeof(status)); 335 } 336 337 end: 338 /* Re-schedule task in 1 sec */ 339 queue_delayed_work(system_power_efficient_wq, &framer->polling_work, 1 * HZ); 340 } 341 342 /** 343 * framer_notifier_register() - Registers a notifier 344 * @framer: the framer returned by framer_get() 345 * @nb: the notifier block to register 346 * 347 * Used to register a notifier block on framer events. framer_init() must have 348 * been called on the framer. 349 * The available framer events are present in enum framer_events. 350 * 351 * Return: %0 if successful, a negative error code otherwise 352 */ 353 int framer_notifier_register(struct framer *framer, struct notifier_block *nb) 354 { 355 return blocking_notifier_chain_register(&framer->notifier_list, nb); 356 } 357 EXPORT_SYMBOL_GPL(framer_notifier_register); 358 359 /** 360 * framer_notifier_unregister() - Unregisters a notifier 361 * @framer: the framer returned by framer_get() 362 * @nb: the notifier block to unregister 363 * 364 * Used to unregister a notifier block. framer_init() must have 365 * been called on the framer. 366 * 367 * Return: %0 if successful, a negative error code otherwise 368 */ 369 int framer_notifier_unregister(struct framer *framer, struct notifier_block *nb) 370 { 371 return blocking_notifier_chain_unregister(&framer->notifier_list, nb); 372 } 373 EXPORT_SYMBOL_GPL(framer_notifier_unregister); 374 375 static struct framer_provider *framer_provider_of_lookup(const struct device_node *node) 376 { 377 struct framer_provider *framer_provider; 378 379 list_for_each_entry(framer_provider, &framer_provider_list, list) { 380 if (device_match_of_node(framer_provider->dev, node)) 381 return framer_provider; 382 } 383 384 return ERR_PTR(-EPROBE_DEFER); 385 } 386 387 static struct framer *framer_of_get_from_provider(struct of_phandle_args *args) 388 { 389 struct framer_provider *framer_provider; 390 struct framer *framer; 391 392 mutex_lock(&framer_provider_mutex); 393 framer_provider = framer_provider_of_lookup(args->np); 394 if (IS_ERR(framer_provider) || !try_module_get(framer_provider->owner)) { 395 framer = ERR_PTR(-EPROBE_DEFER); 396 goto end; 397 } 398 399 framer = framer_provider->of_xlate(framer_provider->dev, args); 400 401 module_put(framer_provider->owner); 402 403 end: 404 mutex_unlock(&framer_provider_mutex); 405 406 return framer; 407 } 408 409 static struct framer *framer_of_get_byphandle(struct device_node *np, const char *propname, 410 int index) 411 { 412 struct of_phandle_args args; 413 struct framer *framer; 414 int ret; 415 416 ret = of_parse_phandle_with_optional_args(np, propname, "#framer-cells", index, &args); 417 if (ret) 418 return ERR_PTR(-ENODEV); 419 420 if (!of_device_is_available(args.np)) { 421 framer = ERR_PTR(-ENODEV); 422 goto out_node_put; 423 } 424 425 framer = framer_of_get_from_provider(&args); 426 427 out_node_put: 428 of_node_put(args.np); 429 430 return framer; 431 } 432 433 static struct framer *framer_of_get_byparent(struct device_node *np, int index) 434 { 435 struct of_phandle_args args; 436 struct framer *framer; 437 438 args.np = of_get_parent(np); 439 args.args_count = 1; 440 args.args[0] = index; 441 442 while (args.np) { 443 framer = framer_of_get_from_provider(&args); 444 if (IS_ERR(framer) && PTR_ERR(framer) != -EPROBE_DEFER) { 445 args.np = of_get_next_parent(args.np); 446 continue; 447 } 448 of_node_put(args.np); 449 return framer; 450 } 451 452 return ERR_PTR(-ENODEV); 453 } 454 455 /** 456 * framer_get() - lookup and obtain a reference to a framer. 457 * @dev: device that requests the framer 458 * @con_id: name of the framer from device's point of view 459 * 460 * Returns the framer driver, after getting a refcount to it; or 461 * -ENODEV if there is no such framer. The caller is responsible for 462 * calling framer_put() to release that count. 463 */ 464 struct framer *framer_get(struct device *dev, const char *con_id) 465 { 466 struct framer *framer = ERR_PTR(-ENODEV); 467 struct device_link *link; 468 int ret; 469 470 if (dev->of_node) { 471 if (con_id) 472 framer = framer_of_get_byphandle(dev->of_node, con_id, 0); 473 else 474 framer = framer_of_get_byparent(dev->of_node, 0); 475 } 476 477 if (IS_ERR(framer)) 478 return framer; 479 480 get_device(&framer->dev); 481 482 if (!try_module_get(framer->ops->owner)) { 483 ret = -EPROBE_DEFER; 484 goto err_put_device; 485 } 486 487 link = device_link_add(dev, &framer->dev, DL_FLAG_STATELESS); 488 if (!link) { 489 dev_err(dev, "failed to create device_link to %s\n", dev_name(&framer->dev)); 490 ret = -EPROBE_DEFER; 491 goto err_module_put; 492 } 493 494 return framer; 495 496 err_module_put: 497 module_put(framer->ops->owner); 498 err_put_device: 499 put_device(&framer->dev); 500 return ERR_PTR(ret); 501 } 502 EXPORT_SYMBOL_GPL(framer_get); 503 504 /** 505 * framer_put() - release the framer 506 * @dev: device that wants to release this framer 507 * @framer: the framer returned by framer_get() 508 * 509 * Releases a refcount the caller received from framer_get(). 510 */ 511 void framer_put(struct device *dev, struct framer *framer) 512 { 513 device_link_remove(dev, &framer->dev); 514 515 module_put(framer->ops->owner); 516 put_device(&framer->dev); 517 } 518 EXPORT_SYMBOL_GPL(framer_put); 519 520 static void devm_framer_put(struct device *dev, void *res) 521 { 522 struct framer *framer = *(struct framer **)res; 523 524 framer_put(dev, framer); 525 } 526 527 /** 528 * devm_framer_get() - lookup and obtain a reference to a framer. 529 * @dev: device that requests this framer 530 * @con_id: name of the framer from device's point of view 531 * 532 * Gets the framer using framer_get(), and associates a device with it using 533 * devres. On driver detach, framer_put() function is invoked on the devres 534 * data, then, devres data is freed. 535 */ 536 struct framer *devm_framer_get(struct device *dev, const char *con_id) 537 { 538 struct framer **ptr, *framer; 539 540 ptr = devres_alloc(devm_framer_put, sizeof(*ptr), GFP_KERNEL); 541 if (!ptr) 542 return ERR_PTR(-ENOMEM); 543 544 framer = framer_get(dev, con_id); 545 if (!IS_ERR(framer)) { 546 *ptr = framer; 547 devres_add(dev, ptr); 548 } else { 549 devres_free(ptr); 550 return framer; 551 } 552 553 return framer; 554 } 555 EXPORT_SYMBOL_GPL(devm_framer_get); 556 557 /** 558 * devm_framer_optional_get() - lookup and obtain a reference to an optional 559 * framer. 560 * @dev: device that requests this framer 561 * @con_id: name of the framer from device's point of view 562 * 563 * Same as devm_framer_get() except that if the framer does not exist, it is not 564 * considered an error and -ENODEV will not be returned. Instead the NULL framer 565 * is returned. 566 */ 567 struct framer *devm_framer_optional_get(struct device *dev, const char *con_id) 568 { 569 struct framer *framer = devm_framer_get(dev, con_id); 570 571 if (PTR_ERR(framer) == -ENODEV) 572 framer = NULL; 573 574 return framer; 575 } 576 EXPORT_SYMBOL_GPL(devm_framer_optional_get); 577 578 static void framer_notify_status_work(struct work_struct *work) 579 { 580 struct framer *framer = container_of(work, struct framer, notify_status_work); 581 582 blocking_notifier_call_chain(&framer->notifier_list, FRAMER_EVENT_STATUS, NULL); 583 } 584 585 void framer_notify_status_change(struct framer *framer) 586 { 587 /* Can be called from atomic context -> just schedule a task to call 588 * blocking notifiers 589 */ 590 queue_work(system_power_efficient_wq, &framer->notify_status_work); 591 } 592 EXPORT_SYMBOL_GPL(framer_notify_status_change); 593 594 /** 595 * framer_create() - create a new framer 596 * @dev: device that is creating the new framer 597 * @node: device node of the framer. default to dev->of_node. 598 * @ops: function pointers for performing framer operations 599 * 600 * Called to create a framer using framer framework. 601 */ 602 struct framer *framer_create(struct device *dev, struct device_node *node, 603 const struct framer_ops *ops) 604 { 605 struct framer *framer; 606 int ret; 607 int id; 608 609 /* get_status() is mandatory if the provider ask for polling status */ 610 if (WARN_ON((ops->flags & FRAMER_FLAG_POLL_STATUS) && !ops->get_status)) 611 return ERR_PTR(-EINVAL); 612 613 framer = kzalloc(sizeof(*framer), GFP_KERNEL); 614 if (!framer) 615 return ERR_PTR(-ENOMEM); 616 617 id = ida_alloc(&framer_ida, GFP_KERNEL); 618 if (id < 0) { 619 dev_err(dev, "unable to get id\n"); 620 ret = id; 621 goto free_framer; 622 } 623 624 device_initialize(&framer->dev); 625 mutex_init(&framer->mutex); 626 INIT_WORK(&framer->notify_status_work, framer_notify_status_work); 627 INIT_DELAYED_WORK(&framer->polling_work, framer_polling_work); 628 BLOCKING_INIT_NOTIFIER_HEAD(&framer->notifier_list); 629 630 framer->dev.class = framer_class; 631 framer->dev.parent = dev; 632 framer->dev.of_node = node ? node : dev->of_node; 633 framer->id = id; 634 framer->ops = ops; 635 636 ret = dev_set_name(&framer->dev, "framer-%s.%d", dev_name(dev), id); 637 if (ret) 638 goto put_dev; 639 640 /* framer-supply */ 641 framer->pwr = regulator_get_optional(&framer->dev, "framer"); 642 if (IS_ERR(framer->pwr)) { 643 ret = PTR_ERR(framer->pwr); 644 if (ret == -EPROBE_DEFER) 645 goto put_dev; 646 647 framer->pwr = NULL; 648 } 649 650 ret = device_add(&framer->dev); 651 if (ret) 652 goto put_dev; 653 654 if (pm_runtime_enabled(dev)) { 655 pm_runtime_enable(&framer->dev); 656 pm_runtime_no_callbacks(&framer->dev); 657 } 658 659 return framer; 660 661 put_dev: 662 put_device(&framer->dev); /* calls framer_release() which frees resources */ 663 return ERR_PTR(ret); 664 665 free_framer: 666 kfree(framer); 667 return ERR_PTR(ret); 668 } 669 EXPORT_SYMBOL_GPL(framer_create); 670 671 /** 672 * framer_destroy() - destroy the framer 673 * @framer: the framer to be destroyed 674 * 675 * Called to destroy the framer. 676 */ 677 void framer_destroy(struct framer *framer) 678 { 679 /* polling_work should already be stopped but if framer_exit() was not 680 * called (bug), here it's the last time to do that ... 681 */ 682 cancel_delayed_work_sync(&framer->polling_work); 683 cancel_work_sync(&framer->notify_status_work); 684 pm_runtime_disable(&framer->dev); 685 device_unregister(&framer->dev); /* calls framer_release() which frees resources */ 686 } 687 EXPORT_SYMBOL_GPL(framer_destroy); 688 689 static void devm_framer_destroy(struct device *dev, void *res) 690 { 691 struct framer *framer = *(struct framer **)res; 692 693 framer_destroy(framer); 694 } 695 696 /** 697 * devm_framer_create() - create a new framer 698 * @dev: device that is creating the new framer 699 * @node: device node of the framer 700 * @ops: function pointers for performing framer operations 701 * 702 * Creates a new framer device adding it to the framer class. 703 * While at that, it also associates the device with the framer using devres. 704 * On driver detach, release function is invoked on the devres data, 705 * then, devres data is freed. 706 */ 707 struct framer *devm_framer_create(struct device *dev, struct device_node *node, 708 const struct framer_ops *ops) 709 { 710 struct framer **ptr, *framer; 711 712 ptr = devres_alloc(devm_framer_destroy, sizeof(*ptr), GFP_KERNEL); 713 if (!ptr) 714 return ERR_PTR(-ENOMEM); 715 716 framer = framer_create(dev, node, ops); 717 if (!IS_ERR(framer)) { 718 *ptr = framer; 719 devres_add(dev, ptr); 720 } else { 721 devres_free(ptr); 722 } 723 724 return framer; 725 } 726 EXPORT_SYMBOL_GPL(devm_framer_create); 727 728 /** 729 * framer_provider_simple_of_xlate() - returns the framer instance from framer provider 730 * @dev: the framer provider device 731 * @args: of_phandle_args (not used here) 732 * 733 * Intended to be used by framer provider for the common case where #framer-cells is 734 * 0. For other cases where #framer-cells is greater than '0', the framer provider 735 * should provide a custom of_xlate function that reads the *args* and returns 736 * the appropriate framer. 737 */ 738 struct framer *framer_provider_simple_of_xlate(struct device *dev, struct of_phandle_args *args) 739 { 740 struct class_dev_iter iter; 741 struct framer *framer; 742 743 class_dev_iter_init(&iter, framer_class, NULL, NULL); 744 while ((dev = class_dev_iter_next(&iter))) { 745 framer = dev_to_framer(dev); 746 if (args->np != framer->dev.of_node) 747 continue; 748 749 class_dev_iter_exit(&iter); 750 return framer; 751 } 752 753 class_dev_iter_exit(&iter); 754 return ERR_PTR(-ENODEV); 755 } 756 EXPORT_SYMBOL_GPL(framer_provider_simple_of_xlate); 757 758 /** 759 * __framer_provider_of_register() - create/register framer provider with the framework 760 * @dev: struct device of the framer provider 761 * @owner: the module owner containing of_xlate 762 * @of_xlate: function pointer to obtain framer instance from framer provider 763 * 764 * Creates struct framer_provider from dev and of_xlate function pointer. 765 * This is used in the case of dt boot for finding the framer instance from 766 * framer provider. 767 */ 768 struct framer_provider * 769 __framer_provider_of_register(struct device *dev, struct module *owner, 770 struct framer *(*of_xlate)(struct device *dev, 771 struct of_phandle_args *args)) 772 { 773 struct framer_provider *framer_provider; 774 775 framer_provider = kzalloc(sizeof(*framer_provider), GFP_KERNEL); 776 if (!framer_provider) 777 return ERR_PTR(-ENOMEM); 778 779 framer_provider->dev = dev; 780 framer_provider->owner = owner; 781 framer_provider->of_xlate = of_xlate; 782 783 of_node_get(framer_provider->dev->of_node); 784 785 mutex_lock(&framer_provider_mutex); 786 list_add_tail(&framer_provider->list, &framer_provider_list); 787 mutex_unlock(&framer_provider_mutex); 788 789 return framer_provider; 790 } 791 EXPORT_SYMBOL_GPL(__framer_provider_of_register); 792 793 /** 794 * framer_provider_of_unregister() - unregister framer provider from the framework 795 * @framer_provider: framer provider returned by framer_provider_of_register() 796 * 797 * Removes the framer_provider created using framer_provider_of_register(). 798 */ 799 void framer_provider_of_unregister(struct framer_provider *framer_provider) 800 { 801 mutex_lock(&framer_provider_mutex); 802 list_del(&framer_provider->list); 803 mutex_unlock(&framer_provider_mutex); 804 805 of_node_put(framer_provider->dev->of_node); 806 kfree(framer_provider); 807 } 808 EXPORT_SYMBOL_GPL(framer_provider_of_unregister); 809 810 static void devm_framer_provider_of_unregister(struct device *dev, void *res) 811 { 812 struct framer_provider *framer_provider = *(struct framer_provider **)res; 813 814 framer_provider_of_unregister(framer_provider); 815 } 816 817 /** 818 * __devm_framer_provider_of_register() - create/register framer provider with 819 * the framework 820 * @dev: struct device of the framer provider 821 * @owner: the module owner containing of_xlate 822 * @of_xlate: function pointer to obtain framer instance from framer provider 823 * 824 * Creates struct framer_provider from dev and of_xlate function pointer. 825 * This is used in the case of dt boot for finding the framer instance from 826 * framer provider. While at that, it also associates the device with the 827 * framer provider using devres. On driver detach, release function is invoked 828 * on the devres data, then, devres data is freed. 829 */ 830 struct framer_provider * 831 __devm_framer_provider_of_register(struct device *dev, struct module *owner, 832 struct framer *(*of_xlate)(struct device *dev, 833 struct of_phandle_args *args)) 834 { 835 struct framer_provider **ptr, *framer_provider; 836 837 ptr = devres_alloc(devm_framer_provider_of_unregister, sizeof(*ptr), GFP_KERNEL); 838 if (!ptr) 839 return ERR_PTR(-ENOMEM); 840 841 framer_provider = __framer_provider_of_register(dev, owner, of_xlate); 842 if (!IS_ERR(framer_provider)) { 843 *ptr = framer_provider; 844 devres_add(dev, ptr); 845 } else { 846 devres_free(ptr); 847 } 848 849 return framer_provider; 850 } 851 EXPORT_SYMBOL_GPL(__devm_framer_provider_of_register); 852 853 /** 854 * framer_release() - release the framer 855 * @dev: the dev member within framer 856 * 857 * When the last reference to the device is removed, it is called 858 * from the embedded kobject as release method. 859 */ 860 static void framer_release(struct device *dev) 861 { 862 struct framer *framer; 863 864 framer = dev_to_framer(dev); 865 regulator_put(framer->pwr); 866 ida_free(&framer_ida, framer->id); 867 kfree(framer); 868 } 869 870 static int __init framer_core_init(void) 871 { 872 framer_class = class_create("framer"); 873 if (IS_ERR(framer_class)) { 874 pr_err("failed to create framer class (%pe)\n", framer_class); 875 return PTR_ERR(framer_class); 876 } 877 878 framer_class->dev_release = framer_release; 879 880 return 0; 881 } 882 device_initcall(framer_core_init); 883