1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2012 Avionic Design GmbH 4 * Copyright (C) 2012-2013, NVIDIA Corporation 5 */ 6 7 #include <linux/debugfs.h> 8 #include <linux/host1x.h> 9 #include <linux/of.h> 10 #include <linux/seq_file.h> 11 #include <linux/slab.h> 12 #include <linux/of_device.h> 13 14 #include "bus.h" 15 #include "dev.h" 16 17 static DEFINE_MUTEX(clients_lock); 18 static LIST_HEAD(clients); 19 20 static DEFINE_MUTEX(drivers_lock); 21 static LIST_HEAD(drivers); 22 23 static DEFINE_MUTEX(devices_lock); 24 static LIST_HEAD(devices); 25 26 struct host1x_subdev { 27 struct host1x_client *client; 28 struct device_node *np; 29 struct list_head list; 30 }; 31 32 /** 33 * host1x_subdev_add() - add a new subdevice with an associated device node 34 * @device: host1x device to add the subdevice to 35 * @driver: host1x driver containing the subdevices 36 * @np: device node 37 */ 38 static int host1x_subdev_add(struct host1x_device *device, 39 struct host1x_driver *driver, 40 struct device_node *np) 41 { 42 struct host1x_subdev *subdev; 43 struct device_node *child; 44 int err; 45 46 subdev = kzalloc(sizeof(*subdev), GFP_KERNEL); 47 if (!subdev) 48 return -ENOMEM; 49 50 INIT_LIST_HEAD(&subdev->list); 51 subdev->np = of_node_get(np); 52 53 mutex_lock(&device->subdevs_lock); 54 list_add_tail(&subdev->list, &device->subdevs); 55 mutex_unlock(&device->subdevs_lock); 56 57 /* recursively add children */ 58 for_each_child_of_node(np, child) { 59 if (of_match_node(driver->subdevs, child) && 60 of_device_is_available(child)) { 61 err = host1x_subdev_add(device, driver, child); 62 if (err < 0) { 63 /* XXX cleanup? */ 64 of_node_put(child); 65 return err; 66 } 67 } 68 } 69 70 return 0; 71 } 72 73 /** 74 * host1x_subdev_del() - remove subdevice 75 * @subdev: subdevice to remove 76 */ 77 static void host1x_subdev_del(struct host1x_subdev *subdev) 78 { 79 list_del(&subdev->list); 80 of_node_put(subdev->np); 81 kfree(subdev); 82 } 83 84 /** 85 * host1x_device_parse_dt() - scan device tree and add matching subdevices 86 * @device: host1x logical device 87 * @driver: host1x driver 88 */ 89 static int host1x_device_parse_dt(struct host1x_device *device, 90 struct host1x_driver *driver) 91 { 92 struct device_node *np; 93 int err; 94 95 for_each_child_of_node(device->dev.parent->of_node, np) { 96 if (of_match_node(driver->subdevs, np) && 97 of_device_is_available(np)) { 98 err = host1x_subdev_add(device, driver, np); 99 if (err < 0) { 100 of_node_put(np); 101 return err; 102 } 103 } 104 } 105 106 return 0; 107 } 108 109 static void host1x_subdev_register(struct host1x_device *device, 110 struct host1x_subdev *subdev, 111 struct host1x_client *client) 112 { 113 int err; 114 115 /* 116 * Move the subdevice to the list of active (registered) subdevices 117 * and associate it with a client. At the same time, associate the 118 * client with its parent device. 119 */ 120 mutex_lock(&device->subdevs_lock); 121 mutex_lock(&device->clients_lock); 122 list_move_tail(&client->list, &device->clients); 123 list_move_tail(&subdev->list, &device->active); 124 client->host = &device->dev; 125 subdev->client = client; 126 mutex_unlock(&device->clients_lock); 127 mutex_unlock(&device->subdevs_lock); 128 129 if (list_empty(&device->subdevs)) { 130 err = device_add(&device->dev); 131 if (err < 0) 132 dev_err(&device->dev, "failed to add: %d\n", err); 133 else 134 device->registered = true; 135 } 136 } 137 138 static void __host1x_subdev_unregister(struct host1x_device *device, 139 struct host1x_subdev *subdev) 140 { 141 struct host1x_client *client = subdev->client; 142 143 /* 144 * If all subdevices have been activated, we're about to remove the 145 * first active subdevice, so unload the driver first. 146 */ 147 if (list_empty(&device->subdevs)) { 148 if (device->registered) { 149 device->registered = false; 150 device_del(&device->dev); 151 } 152 } 153 154 /* 155 * Move the subdevice back to the list of idle subdevices and remove 156 * it from list of clients. 157 */ 158 mutex_lock(&device->clients_lock); 159 subdev->client = NULL; 160 client->host = NULL; 161 list_move_tail(&subdev->list, &device->subdevs); 162 /* 163 * XXX: Perhaps don't do this here, but rather explicitly remove it 164 * when the device is about to be deleted. 165 * 166 * This is somewhat complicated by the fact that this function is 167 * used to remove the subdevice when a client is unregistered but 168 * also when the composite device is about to be removed. 169 */ 170 list_del_init(&client->list); 171 mutex_unlock(&device->clients_lock); 172 } 173 174 static void host1x_subdev_unregister(struct host1x_device *device, 175 struct host1x_subdev *subdev) 176 { 177 mutex_lock(&device->subdevs_lock); 178 __host1x_subdev_unregister(device, subdev); 179 mutex_unlock(&device->subdevs_lock); 180 } 181 182 /** 183 * host1x_device_init() - initialize a host1x logical device 184 * @device: host1x logical device 185 * 186 * The driver for the host1x logical device can call this during execution of 187 * its &host1x_driver.probe implementation to initialize each of its clients. 188 * The client drivers access the subsystem specific driver data using the 189 * &host1x_client.parent field and driver data associated with it (usually by 190 * calling dev_get_drvdata()). 191 */ 192 int host1x_device_init(struct host1x_device *device) 193 { 194 struct host1x_client *client; 195 int err; 196 197 mutex_lock(&device->clients_lock); 198 199 list_for_each_entry(client, &device->clients, list) { 200 if (client->ops && client->ops->init) { 201 err = client->ops->init(client); 202 if (err < 0) { 203 dev_err(&device->dev, 204 "failed to initialize %s: %d\n", 205 dev_name(client->dev), err); 206 goto teardown; 207 } 208 } 209 } 210 211 mutex_unlock(&device->clients_lock); 212 213 return 0; 214 215 teardown: 216 list_for_each_entry_continue_reverse(client, &device->clients, list) 217 if (client->ops->exit) 218 client->ops->exit(client); 219 220 mutex_unlock(&device->clients_lock); 221 return err; 222 } 223 EXPORT_SYMBOL(host1x_device_init); 224 225 /** 226 * host1x_device_exit() - uninitialize host1x logical device 227 * @device: host1x logical device 228 * 229 * When the driver for a host1x logical device is unloaded, it can call this 230 * function to tear down each of its clients. Typically this is done after a 231 * subsystem-specific data structure is removed and the functionality can no 232 * longer be used. 233 */ 234 int host1x_device_exit(struct host1x_device *device) 235 { 236 struct host1x_client *client; 237 int err; 238 239 mutex_lock(&device->clients_lock); 240 241 list_for_each_entry_reverse(client, &device->clients, list) { 242 if (client->ops && client->ops->exit) { 243 err = client->ops->exit(client); 244 if (err < 0) { 245 dev_err(&device->dev, 246 "failed to cleanup %s: %d\n", 247 dev_name(client->dev), err); 248 mutex_unlock(&device->clients_lock); 249 return err; 250 } 251 } 252 } 253 254 mutex_unlock(&device->clients_lock); 255 256 return 0; 257 } 258 EXPORT_SYMBOL(host1x_device_exit); 259 260 static int host1x_add_client(struct host1x *host1x, 261 struct host1x_client *client) 262 { 263 struct host1x_device *device; 264 struct host1x_subdev *subdev; 265 266 mutex_lock(&host1x->devices_lock); 267 268 list_for_each_entry(device, &host1x->devices, list) { 269 list_for_each_entry(subdev, &device->subdevs, list) { 270 if (subdev->np == client->dev->of_node) { 271 host1x_subdev_register(device, subdev, client); 272 mutex_unlock(&host1x->devices_lock); 273 return 0; 274 } 275 } 276 } 277 278 mutex_unlock(&host1x->devices_lock); 279 return -ENODEV; 280 } 281 282 static int host1x_del_client(struct host1x *host1x, 283 struct host1x_client *client) 284 { 285 struct host1x_device *device, *dt; 286 struct host1x_subdev *subdev; 287 288 mutex_lock(&host1x->devices_lock); 289 290 list_for_each_entry_safe(device, dt, &host1x->devices, list) { 291 list_for_each_entry(subdev, &device->active, list) { 292 if (subdev->client == client) { 293 host1x_subdev_unregister(device, subdev); 294 mutex_unlock(&host1x->devices_lock); 295 return 0; 296 } 297 } 298 } 299 300 mutex_unlock(&host1x->devices_lock); 301 return -ENODEV; 302 } 303 304 static int host1x_device_match(struct device *dev, struct device_driver *drv) 305 { 306 return strcmp(dev_name(dev), drv->name) == 0; 307 } 308 309 static int host1x_device_uevent(struct device *dev, 310 struct kobj_uevent_env *env) 311 { 312 struct device_node *np = dev->parent->of_node; 313 unsigned int count = 0; 314 struct property *p; 315 const char *compat; 316 317 /* 318 * This duplicates most of of_device_uevent(), but the latter cannot 319 * be called from modules and operates on dev->of_node, which is not 320 * available in this case. 321 * 322 * Note that this is really only needed for backwards compatibility 323 * with libdrm, which parses this information from sysfs and will 324 * fail if it can't find the OF_FULLNAME, specifically. 325 */ 326 add_uevent_var(env, "OF_NAME=%pOFn", np); 327 add_uevent_var(env, "OF_FULLNAME=%pOF", np); 328 329 of_property_for_each_string(np, "compatible", p, compat) { 330 add_uevent_var(env, "OF_COMPATIBLE_%u=%s", count, compat); 331 count++; 332 } 333 334 add_uevent_var(env, "OF_COMPATIBLE_N=%u", count); 335 336 return 0; 337 } 338 339 static int host1x_dma_configure(struct device *dev) 340 { 341 return of_dma_configure(dev, dev->of_node, true); 342 } 343 344 static const struct dev_pm_ops host1x_device_pm_ops = { 345 .suspend = pm_generic_suspend, 346 .resume = pm_generic_resume, 347 .freeze = pm_generic_freeze, 348 .thaw = pm_generic_thaw, 349 .poweroff = pm_generic_poweroff, 350 .restore = pm_generic_restore, 351 }; 352 353 struct bus_type host1x_bus_type = { 354 .name = "host1x", 355 .match = host1x_device_match, 356 .uevent = host1x_device_uevent, 357 .dma_configure = host1x_dma_configure, 358 .pm = &host1x_device_pm_ops, 359 }; 360 361 static void __host1x_device_del(struct host1x_device *device) 362 { 363 struct host1x_subdev *subdev, *sd; 364 struct host1x_client *client, *cl; 365 366 mutex_lock(&device->subdevs_lock); 367 368 /* unregister subdevices */ 369 list_for_each_entry_safe(subdev, sd, &device->active, list) { 370 /* 371 * host1x_subdev_unregister() will remove the client from 372 * any lists, so we'll need to manually add it back to the 373 * list of idle clients. 374 * 375 * XXX: Alternatively, perhaps don't remove the client from 376 * any lists in host1x_subdev_unregister() and instead do 377 * that explicitly from host1x_unregister_client()? 378 */ 379 client = subdev->client; 380 381 __host1x_subdev_unregister(device, subdev); 382 383 /* add the client to the list of idle clients */ 384 mutex_lock(&clients_lock); 385 list_add_tail(&client->list, &clients); 386 mutex_unlock(&clients_lock); 387 } 388 389 /* remove subdevices */ 390 list_for_each_entry_safe(subdev, sd, &device->subdevs, list) 391 host1x_subdev_del(subdev); 392 393 mutex_unlock(&device->subdevs_lock); 394 395 /* move clients to idle list */ 396 mutex_lock(&clients_lock); 397 mutex_lock(&device->clients_lock); 398 399 list_for_each_entry_safe(client, cl, &device->clients, list) 400 list_move_tail(&client->list, &clients); 401 402 mutex_unlock(&device->clients_lock); 403 mutex_unlock(&clients_lock); 404 405 /* finally remove the device */ 406 list_del_init(&device->list); 407 } 408 409 static void host1x_device_release(struct device *dev) 410 { 411 struct host1x_device *device = to_host1x_device(dev); 412 413 __host1x_device_del(device); 414 kfree(device); 415 } 416 417 static int host1x_device_add(struct host1x *host1x, 418 struct host1x_driver *driver) 419 { 420 struct host1x_client *client, *tmp; 421 struct host1x_subdev *subdev; 422 struct host1x_device *device; 423 int err; 424 425 device = kzalloc(sizeof(*device), GFP_KERNEL); 426 if (!device) 427 return -ENOMEM; 428 429 device_initialize(&device->dev); 430 431 mutex_init(&device->subdevs_lock); 432 INIT_LIST_HEAD(&device->subdevs); 433 INIT_LIST_HEAD(&device->active); 434 mutex_init(&device->clients_lock); 435 INIT_LIST_HEAD(&device->clients); 436 INIT_LIST_HEAD(&device->list); 437 device->driver = driver; 438 439 device->dev.coherent_dma_mask = host1x->dev->coherent_dma_mask; 440 device->dev.dma_mask = &device->dev.coherent_dma_mask; 441 dev_set_name(&device->dev, "%s", driver->driver.name); 442 device->dev.release = host1x_device_release; 443 device->dev.bus = &host1x_bus_type; 444 device->dev.parent = host1x->dev; 445 446 of_dma_configure(&device->dev, host1x->dev->of_node, true); 447 448 device->dev.dma_parms = &device->dma_parms; 449 dma_set_max_seg_size(&device->dev, UINT_MAX); 450 451 err = host1x_device_parse_dt(device, driver); 452 if (err < 0) { 453 kfree(device); 454 return err; 455 } 456 457 list_add_tail(&device->list, &host1x->devices); 458 459 mutex_lock(&clients_lock); 460 461 list_for_each_entry_safe(client, tmp, &clients, list) { 462 list_for_each_entry(subdev, &device->subdevs, list) { 463 if (subdev->np == client->dev->of_node) { 464 host1x_subdev_register(device, subdev, client); 465 break; 466 } 467 } 468 } 469 470 mutex_unlock(&clients_lock); 471 472 return 0; 473 } 474 475 /* 476 * Removes a device by first unregistering any subdevices and then removing 477 * itself from the list of devices. 478 * 479 * This function must be called with the host1x->devices_lock held. 480 */ 481 static void host1x_device_del(struct host1x *host1x, 482 struct host1x_device *device) 483 { 484 if (device->registered) { 485 device->registered = false; 486 device_del(&device->dev); 487 } 488 489 put_device(&device->dev); 490 } 491 492 static void host1x_attach_driver(struct host1x *host1x, 493 struct host1x_driver *driver) 494 { 495 struct host1x_device *device; 496 int err; 497 498 mutex_lock(&host1x->devices_lock); 499 500 list_for_each_entry(device, &host1x->devices, list) { 501 if (device->driver == driver) { 502 mutex_unlock(&host1x->devices_lock); 503 return; 504 } 505 } 506 507 err = host1x_device_add(host1x, driver); 508 if (err < 0) 509 dev_err(host1x->dev, "failed to allocate device: %d\n", err); 510 511 mutex_unlock(&host1x->devices_lock); 512 } 513 514 static void host1x_detach_driver(struct host1x *host1x, 515 struct host1x_driver *driver) 516 { 517 struct host1x_device *device, *tmp; 518 519 mutex_lock(&host1x->devices_lock); 520 521 list_for_each_entry_safe(device, tmp, &host1x->devices, list) 522 if (device->driver == driver) 523 host1x_device_del(host1x, device); 524 525 mutex_unlock(&host1x->devices_lock); 526 } 527 528 static int host1x_devices_show(struct seq_file *s, void *data) 529 { 530 struct host1x *host1x = s->private; 531 struct host1x_device *device; 532 533 mutex_lock(&host1x->devices_lock); 534 535 list_for_each_entry(device, &host1x->devices, list) { 536 struct host1x_subdev *subdev; 537 538 seq_printf(s, "%s\n", dev_name(&device->dev)); 539 540 mutex_lock(&device->subdevs_lock); 541 542 list_for_each_entry(subdev, &device->active, list) 543 seq_printf(s, " %pOFf: %s\n", subdev->np, 544 dev_name(subdev->client->dev)); 545 546 list_for_each_entry(subdev, &device->subdevs, list) 547 seq_printf(s, " %pOFf:\n", subdev->np); 548 549 mutex_unlock(&device->subdevs_lock); 550 } 551 552 mutex_unlock(&host1x->devices_lock); 553 554 return 0; 555 } 556 DEFINE_SHOW_ATTRIBUTE(host1x_devices); 557 558 /** 559 * host1x_register() - register a host1x controller 560 * @host1x: host1x controller 561 * 562 * The host1x controller driver uses this to register a host1x controller with 563 * the infrastructure. Note that all Tegra SoC generations have only ever come 564 * with a single host1x instance, so this function is somewhat academic. 565 */ 566 int host1x_register(struct host1x *host1x) 567 { 568 struct host1x_driver *driver; 569 570 mutex_lock(&devices_lock); 571 list_add_tail(&host1x->list, &devices); 572 mutex_unlock(&devices_lock); 573 574 mutex_lock(&drivers_lock); 575 576 list_for_each_entry(driver, &drivers, list) 577 host1x_attach_driver(host1x, driver); 578 579 mutex_unlock(&drivers_lock); 580 581 debugfs_create_file("devices", S_IRUGO, host1x->debugfs, host1x, 582 &host1x_devices_fops); 583 584 return 0; 585 } 586 587 /** 588 * host1x_unregister() - unregister a host1x controller 589 * @host1x: host1x controller 590 * 591 * The host1x controller driver uses this to remove a host1x controller from 592 * the infrastructure. 593 */ 594 int host1x_unregister(struct host1x *host1x) 595 { 596 struct host1x_driver *driver; 597 598 mutex_lock(&drivers_lock); 599 600 list_for_each_entry(driver, &drivers, list) 601 host1x_detach_driver(host1x, driver); 602 603 mutex_unlock(&drivers_lock); 604 605 mutex_lock(&devices_lock); 606 list_del_init(&host1x->list); 607 mutex_unlock(&devices_lock); 608 609 return 0; 610 } 611 612 static int host1x_device_probe(struct device *dev) 613 { 614 struct host1x_driver *driver = to_host1x_driver(dev->driver); 615 struct host1x_device *device = to_host1x_device(dev); 616 617 if (driver->probe) 618 return driver->probe(device); 619 620 return 0; 621 } 622 623 static int host1x_device_remove(struct device *dev) 624 { 625 struct host1x_driver *driver = to_host1x_driver(dev->driver); 626 struct host1x_device *device = to_host1x_device(dev); 627 628 if (driver->remove) 629 return driver->remove(device); 630 631 return 0; 632 } 633 634 static void host1x_device_shutdown(struct device *dev) 635 { 636 struct host1x_driver *driver = to_host1x_driver(dev->driver); 637 struct host1x_device *device = to_host1x_device(dev); 638 639 if (driver->shutdown) 640 driver->shutdown(device); 641 } 642 643 /** 644 * host1x_driver_register_full() - register a host1x driver 645 * @driver: host1x driver 646 * @owner: owner module 647 * 648 * Drivers for host1x logical devices call this function to register a driver 649 * with the infrastructure. Note that since these drive logical devices, the 650 * registration of the driver actually triggers tho logical device creation. 651 * A logical device will be created for each host1x instance. 652 */ 653 int host1x_driver_register_full(struct host1x_driver *driver, 654 struct module *owner) 655 { 656 struct host1x *host1x; 657 658 INIT_LIST_HEAD(&driver->list); 659 660 mutex_lock(&drivers_lock); 661 list_add_tail(&driver->list, &drivers); 662 mutex_unlock(&drivers_lock); 663 664 mutex_lock(&devices_lock); 665 666 list_for_each_entry(host1x, &devices, list) 667 host1x_attach_driver(host1x, driver); 668 669 mutex_unlock(&devices_lock); 670 671 driver->driver.bus = &host1x_bus_type; 672 driver->driver.owner = owner; 673 driver->driver.probe = host1x_device_probe; 674 driver->driver.remove = host1x_device_remove; 675 driver->driver.shutdown = host1x_device_shutdown; 676 677 return driver_register(&driver->driver); 678 } 679 EXPORT_SYMBOL(host1x_driver_register_full); 680 681 /** 682 * host1x_driver_unregister() - unregister a host1x driver 683 * @driver: host1x driver 684 * 685 * Unbinds the driver from each of the host1x logical devices that it is 686 * bound to, effectively removing the subsystem devices that they represent. 687 */ 688 void host1x_driver_unregister(struct host1x_driver *driver) 689 { 690 struct host1x *host1x; 691 692 driver_unregister(&driver->driver); 693 694 mutex_lock(&devices_lock); 695 696 list_for_each_entry(host1x, &devices, list) 697 host1x_detach_driver(host1x, driver); 698 699 mutex_unlock(&devices_lock); 700 701 mutex_lock(&drivers_lock); 702 list_del_init(&driver->list); 703 mutex_unlock(&drivers_lock); 704 } 705 EXPORT_SYMBOL(host1x_driver_unregister); 706 707 /** 708 * __host1x_client_register() - register a host1x client 709 * @client: host1x client 710 * @key: lock class key for the client-specific mutex 711 * 712 * Registers a host1x client with each host1x controller instance. Note that 713 * each client will only match their parent host1x controller and will only be 714 * associated with that instance. Once all clients have been registered with 715 * their parent host1x controller, the infrastructure will set up the logical 716 * device and call host1x_device_init(), which will in turn call each client's 717 * &host1x_client_ops.init implementation. 718 */ 719 int __host1x_client_register(struct host1x_client *client, 720 struct lock_class_key *key) 721 { 722 struct host1x *host1x; 723 int err; 724 725 INIT_LIST_HEAD(&client->list); 726 __mutex_init(&client->lock, "host1x client lock", key); 727 client->usecount = 0; 728 729 mutex_lock(&devices_lock); 730 731 list_for_each_entry(host1x, &devices, list) { 732 err = host1x_add_client(host1x, client); 733 if (!err) { 734 mutex_unlock(&devices_lock); 735 return 0; 736 } 737 } 738 739 mutex_unlock(&devices_lock); 740 741 mutex_lock(&clients_lock); 742 list_add_tail(&client->list, &clients); 743 mutex_unlock(&clients_lock); 744 745 return 0; 746 } 747 EXPORT_SYMBOL(__host1x_client_register); 748 749 /** 750 * host1x_client_unregister() - unregister a host1x client 751 * @client: host1x client 752 * 753 * Removes a host1x client from its host1x controller instance. If a logical 754 * device has already been initialized, it will be torn down. 755 */ 756 int host1x_client_unregister(struct host1x_client *client) 757 { 758 struct host1x_client *c; 759 struct host1x *host1x; 760 int err; 761 762 mutex_lock(&devices_lock); 763 764 list_for_each_entry(host1x, &devices, list) { 765 err = host1x_del_client(host1x, client); 766 if (!err) { 767 mutex_unlock(&devices_lock); 768 return 0; 769 } 770 } 771 772 mutex_unlock(&devices_lock); 773 mutex_lock(&clients_lock); 774 775 list_for_each_entry(c, &clients, list) { 776 if (c == client) { 777 list_del_init(&c->list); 778 break; 779 } 780 } 781 782 mutex_unlock(&clients_lock); 783 784 return 0; 785 } 786 EXPORT_SYMBOL(host1x_client_unregister); 787 788 int host1x_client_suspend(struct host1x_client *client) 789 { 790 int err = 0; 791 792 mutex_lock(&client->lock); 793 794 if (client->usecount == 1) { 795 if (client->ops && client->ops->suspend) { 796 err = client->ops->suspend(client); 797 if (err < 0) 798 goto unlock; 799 } 800 } 801 802 client->usecount--; 803 dev_dbg(client->dev, "use count: %u\n", client->usecount); 804 805 if (client->parent) { 806 err = host1x_client_suspend(client->parent); 807 if (err < 0) 808 goto resume; 809 } 810 811 goto unlock; 812 813 resume: 814 if (client->usecount == 0) 815 if (client->ops && client->ops->resume) 816 client->ops->resume(client); 817 818 client->usecount++; 819 unlock: 820 mutex_unlock(&client->lock); 821 return err; 822 } 823 EXPORT_SYMBOL(host1x_client_suspend); 824 825 int host1x_client_resume(struct host1x_client *client) 826 { 827 int err = 0; 828 829 mutex_lock(&client->lock); 830 831 if (client->parent) { 832 err = host1x_client_resume(client->parent); 833 if (err < 0) 834 goto unlock; 835 } 836 837 if (client->usecount == 0) { 838 if (client->ops && client->ops->resume) { 839 err = client->ops->resume(client); 840 if (err < 0) 841 goto suspend; 842 } 843 } 844 845 client->usecount++; 846 dev_dbg(client->dev, "use count: %u\n", client->usecount); 847 848 goto unlock; 849 850 suspend: 851 if (client->parent) 852 host1x_client_suspend(client->parent); 853 unlock: 854 mutex_unlock(&client->lock); 855 return err; 856 } 857 EXPORT_SYMBOL(host1x_client_resume); 858