1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * linux/arch/arm/common/amba.c 4 * 5 * Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved. 6 */ 7 #include <linux/module.h> 8 #include <linux/init.h> 9 #include <linux/device.h> 10 #include <linux/string.h> 11 #include <linux/slab.h> 12 #include <linux/io.h> 13 #include <linux/pm.h> 14 #include <linux/pm_runtime.h> 15 #include <linux/pm_domain.h> 16 #include <linux/amba/bus.h> 17 #include <linux/sizes.h> 18 #include <linux/limits.h> 19 #include <linux/clk/clk-conf.h> 20 #include <linux/platform_device.h> 21 #include <linux/reset.h> 22 #include <linux/of_irq.h> 23 24 #define to_amba_driver(d) container_of(d, struct amba_driver, drv) 25 26 /* called on periphid match and class 0x9 coresight device. */ 27 static int 28 amba_cs_uci_id_match(const struct amba_id *table, struct amba_device *dev) 29 { 30 int ret = 0; 31 struct amba_cs_uci_id *uci; 32 33 uci = table->data; 34 35 /* no table data or zero mask - return match on periphid */ 36 if (!uci || (uci->devarch_mask == 0)) 37 return 1; 38 39 /* test against read devtype and masked devarch value */ 40 ret = (dev->uci.devtype == uci->devtype) && 41 ((dev->uci.devarch & uci->devarch_mask) == uci->devarch); 42 return ret; 43 } 44 45 static const struct amba_id * 46 amba_lookup(const struct amba_id *table, struct amba_device *dev) 47 { 48 while (table->mask) { 49 if (((dev->periphid & table->mask) == table->id) && 50 ((dev->cid != CORESIGHT_CID) || 51 (amba_cs_uci_id_match(table, dev)))) 52 return table; 53 table++; 54 } 55 return NULL; 56 } 57 58 static int amba_get_enable_pclk(struct amba_device *pcdev) 59 { 60 int ret; 61 62 pcdev->pclk = clk_get(&pcdev->dev, "apb_pclk"); 63 if (IS_ERR(pcdev->pclk)) 64 return PTR_ERR(pcdev->pclk); 65 66 ret = clk_prepare_enable(pcdev->pclk); 67 if (ret) 68 clk_put(pcdev->pclk); 69 70 return ret; 71 } 72 73 static void amba_put_disable_pclk(struct amba_device *pcdev) 74 { 75 clk_disable_unprepare(pcdev->pclk); 76 clk_put(pcdev->pclk); 77 } 78 79 80 static ssize_t driver_override_show(struct device *_dev, 81 struct device_attribute *attr, char *buf) 82 { 83 struct amba_device *dev = to_amba_device(_dev); 84 ssize_t len; 85 86 device_lock(_dev); 87 len = sprintf(buf, "%s\n", dev->driver_override); 88 device_unlock(_dev); 89 return len; 90 } 91 92 static ssize_t driver_override_store(struct device *_dev, 93 struct device_attribute *attr, 94 const char *buf, size_t count) 95 { 96 struct amba_device *dev = to_amba_device(_dev); 97 int ret; 98 99 ret = driver_set_override(_dev, &dev->driver_override, buf, count); 100 if (ret) 101 return ret; 102 103 return count; 104 } 105 static DEVICE_ATTR_RW(driver_override); 106 107 #define amba_attr_func(name,fmt,arg...) \ 108 static ssize_t name##_show(struct device *_dev, \ 109 struct device_attribute *attr, char *buf) \ 110 { \ 111 struct amba_device *dev = to_amba_device(_dev); \ 112 return sprintf(buf, fmt, arg); \ 113 } \ 114 static DEVICE_ATTR_RO(name) 115 116 amba_attr_func(id, "%08x\n", dev->periphid); 117 amba_attr_func(resource, "\t%016llx\t%016llx\t%016lx\n", 118 (unsigned long long)dev->res.start, (unsigned long long)dev->res.end, 119 dev->res.flags); 120 121 static struct attribute *amba_dev_attrs[] = { 122 &dev_attr_id.attr, 123 &dev_attr_resource.attr, 124 &dev_attr_driver_override.attr, 125 NULL, 126 }; 127 ATTRIBUTE_GROUPS(amba_dev); 128 129 static int amba_match(struct device *dev, struct device_driver *drv) 130 { 131 struct amba_device *pcdev = to_amba_device(dev); 132 struct amba_driver *pcdrv = to_amba_driver(drv); 133 134 /* When driver_override is set, only bind to the matching driver */ 135 if (pcdev->driver_override) 136 return !strcmp(pcdev->driver_override, drv->name); 137 138 return amba_lookup(pcdrv->id_table, pcdev) != NULL; 139 } 140 141 static int amba_uevent(struct device *dev, struct kobj_uevent_env *env) 142 { 143 struct amba_device *pcdev = to_amba_device(dev); 144 int retval = 0; 145 146 retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid); 147 if (retval) 148 return retval; 149 150 retval = add_uevent_var(env, "MODALIAS=amba:d%08X", pcdev->periphid); 151 return retval; 152 } 153 154 static int of_amba_device_decode_irq(struct amba_device *dev) 155 { 156 struct device_node *node = dev->dev.of_node; 157 int i, irq = 0; 158 159 if (IS_ENABLED(CONFIG_OF_IRQ) && node) { 160 /* Decode the IRQs and address ranges */ 161 for (i = 0; i < AMBA_NR_IRQS; i++) { 162 irq = of_irq_get(node, i); 163 if (irq < 0) { 164 if (irq == -EPROBE_DEFER) 165 return irq; 166 irq = 0; 167 } 168 169 dev->irq[i] = irq; 170 } 171 } 172 173 return 0; 174 } 175 176 /* 177 * These are the device model conversion veneers; they convert the 178 * device model structures to our more specific structures. 179 */ 180 static int amba_probe(struct device *dev) 181 { 182 struct amba_device *pcdev = to_amba_device(dev); 183 struct amba_driver *pcdrv = to_amba_driver(dev->driver); 184 const struct amba_id *id = amba_lookup(pcdrv->id_table, pcdev); 185 int ret; 186 187 do { 188 ret = of_amba_device_decode_irq(pcdev); 189 if (ret) 190 break; 191 192 ret = of_clk_set_defaults(dev->of_node, false); 193 if (ret < 0) 194 break; 195 196 ret = dev_pm_domain_attach(dev, true); 197 if (ret) 198 break; 199 200 ret = amba_get_enable_pclk(pcdev); 201 if (ret) { 202 dev_pm_domain_detach(dev, true); 203 break; 204 } 205 206 pm_runtime_get_noresume(dev); 207 pm_runtime_set_active(dev); 208 pm_runtime_enable(dev); 209 210 ret = pcdrv->probe(pcdev, id); 211 if (ret == 0) 212 break; 213 214 pm_runtime_disable(dev); 215 pm_runtime_set_suspended(dev); 216 pm_runtime_put_noidle(dev); 217 218 amba_put_disable_pclk(pcdev); 219 dev_pm_domain_detach(dev, true); 220 } while (0); 221 222 return ret; 223 } 224 225 static void amba_remove(struct device *dev) 226 { 227 struct amba_device *pcdev = to_amba_device(dev); 228 struct amba_driver *drv = to_amba_driver(dev->driver); 229 230 pm_runtime_get_sync(dev); 231 if (drv->remove) 232 drv->remove(pcdev); 233 pm_runtime_put_noidle(dev); 234 235 /* Undo the runtime PM settings in amba_probe() */ 236 pm_runtime_disable(dev); 237 pm_runtime_set_suspended(dev); 238 pm_runtime_put_noidle(dev); 239 240 amba_put_disable_pclk(pcdev); 241 dev_pm_domain_detach(dev, true); 242 } 243 244 static void amba_shutdown(struct device *dev) 245 { 246 struct amba_driver *drv; 247 248 if (!dev->driver) 249 return; 250 251 drv = to_amba_driver(dev->driver); 252 if (drv->shutdown) 253 drv->shutdown(to_amba_device(dev)); 254 } 255 256 #ifdef CONFIG_PM 257 /* 258 * Hooks to provide runtime PM of the pclk (bus clock). It is safe to 259 * enable/disable the bus clock at runtime PM suspend/resume as this 260 * does not result in loss of context. 261 */ 262 static int amba_pm_runtime_suspend(struct device *dev) 263 { 264 struct amba_device *pcdev = to_amba_device(dev); 265 int ret = pm_generic_runtime_suspend(dev); 266 267 if (ret == 0 && dev->driver) { 268 if (pm_runtime_is_irq_safe(dev)) 269 clk_disable(pcdev->pclk); 270 else 271 clk_disable_unprepare(pcdev->pclk); 272 } 273 274 return ret; 275 } 276 277 static int amba_pm_runtime_resume(struct device *dev) 278 { 279 struct amba_device *pcdev = to_amba_device(dev); 280 int ret; 281 282 if (dev->driver) { 283 if (pm_runtime_is_irq_safe(dev)) 284 ret = clk_enable(pcdev->pclk); 285 else 286 ret = clk_prepare_enable(pcdev->pclk); 287 /* Failure is probably fatal to the system, but... */ 288 if (ret) 289 return ret; 290 } 291 292 return pm_generic_runtime_resume(dev); 293 } 294 #endif /* CONFIG_PM */ 295 296 static const struct dev_pm_ops amba_pm = { 297 .suspend = pm_generic_suspend, 298 .resume = pm_generic_resume, 299 .freeze = pm_generic_freeze, 300 .thaw = pm_generic_thaw, 301 .poweroff = pm_generic_poweroff, 302 .restore = pm_generic_restore, 303 SET_RUNTIME_PM_OPS( 304 amba_pm_runtime_suspend, 305 amba_pm_runtime_resume, 306 NULL 307 ) 308 }; 309 310 /* 311 * Primecells are part of the Advanced Microcontroller Bus Architecture, 312 * so we call the bus "amba". 313 * DMA configuration for platform and AMBA bus is same. So here we reuse 314 * platform's DMA config routine. 315 */ 316 struct bus_type amba_bustype = { 317 .name = "amba", 318 .dev_groups = amba_dev_groups, 319 .match = amba_match, 320 .uevent = amba_uevent, 321 .probe = amba_probe, 322 .remove = amba_remove, 323 .shutdown = amba_shutdown, 324 .dma_configure = platform_dma_configure, 325 .pm = &amba_pm, 326 }; 327 EXPORT_SYMBOL_GPL(amba_bustype); 328 329 static int __init amba_init(void) 330 { 331 return bus_register(&amba_bustype); 332 } 333 334 postcore_initcall(amba_init); 335 336 /** 337 * amba_driver_register - register an AMBA device driver 338 * @drv: amba device driver structure 339 * 340 * Register an AMBA device driver with the Linux device model 341 * core. If devices pre-exist, the drivers probe function will 342 * be called. 343 */ 344 int amba_driver_register(struct amba_driver *drv) 345 { 346 if (!drv->probe) 347 return -EINVAL; 348 349 drv->drv.bus = &amba_bustype; 350 351 return driver_register(&drv->drv); 352 } 353 EXPORT_SYMBOL(amba_driver_register); 354 355 /** 356 * amba_driver_unregister - remove an AMBA device driver 357 * @drv: AMBA device driver structure to remove 358 * 359 * Unregister an AMBA device driver from the Linux device 360 * model. The device model will call the drivers remove function 361 * for each device the device driver is currently handling. 362 */ 363 void amba_driver_unregister(struct amba_driver *drv) 364 { 365 driver_unregister(&drv->drv); 366 } 367 EXPORT_SYMBOL(amba_driver_unregister); 368 369 static void amba_device_release(struct device *dev) 370 { 371 struct amba_device *d = to_amba_device(dev); 372 373 if (d->res.parent) 374 release_resource(&d->res); 375 kfree(d); 376 } 377 378 static int amba_device_try_add(struct amba_device *dev, struct resource *parent) 379 { 380 u32 size; 381 void __iomem *tmp; 382 int i, ret; 383 384 ret = request_resource(parent, &dev->res); 385 if (ret) 386 goto err_out; 387 388 /* Hard-coded primecell ID instead of plug-n-play */ 389 if (dev->periphid != 0) 390 goto skip_probe; 391 392 /* 393 * Dynamically calculate the size of the resource 394 * and use this for iomap 395 */ 396 size = resource_size(&dev->res); 397 tmp = ioremap(dev->res.start, size); 398 if (!tmp) { 399 ret = -ENOMEM; 400 goto err_release; 401 } 402 403 ret = dev_pm_domain_attach(&dev->dev, true); 404 if (ret) { 405 iounmap(tmp); 406 goto err_release; 407 } 408 409 ret = amba_get_enable_pclk(dev); 410 if (ret == 0) { 411 u32 pid, cid; 412 struct reset_control *rstc; 413 414 /* 415 * Find reset control(s) of the amba bus and de-assert them. 416 */ 417 rstc = of_reset_control_array_get_optional_shared(dev->dev.of_node); 418 if (IS_ERR(rstc)) { 419 ret = PTR_ERR(rstc); 420 if (ret != -EPROBE_DEFER) 421 dev_err(&dev->dev, "can't get reset: %d\n", 422 ret); 423 goto err_reset; 424 } 425 reset_control_deassert(rstc); 426 reset_control_put(rstc); 427 428 /* 429 * Read pid and cid based on size of resource 430 * they are located at end of region 431 */ 432 for (pid = 0, i = 0; i < 4; i++) 433 pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) << 434 (i * 8); 435 for (cid = 0, i = 0; i < 4; i++) 436 cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << 437 (i * 8); 438 439 if (cid == CORESIGHT_CID) { 440 /* set the base to the start of the last 4k block */ 441 void __iomem *csbase = tmp + size - 4096; 442 443 dev->uci.devarch = 444 readl(csbase + UCI_REG_DEVARCH_OFFSET); 445 dev->uci.devtype = 446 readl(csbase + UCI_REG_DEVTYPE_OFFSET) & 0xff; 447 } 448 449 amba_put_disable_pclk(dev); 450 451 if (cid == AMBA_CID || cid == CORESIGHT_CID) { 452 dev->periphid = pid; 453 dev->cid = cid; 454 } 455 456 if (!dev->periphid) 457 ret = -ENODEV; 458 } 459 460 iounmap(tmp); 461 dev_pm_domain_detach(&dev->dev, true); 462 463 if (ret) 464 goto err_release; 465 466 skip_probe: 467 ret = device_add(&dev->dev); 468 err_release: 469 if (ret) 470 release_resource(&dev->res); 471 err_out: 472 return ret; 473 474 err_reset: 475 amba_put_disable_pclk(dev); 476 iounmap(tmp); 477 dev_pm_domain_detach(&dev->dev, true); 478 goto err_release; 479 } 480 481 /* 482 * Registration of AMBA device require reading its pid and cid registers. 483 * To do this, the device must be turned on (if it is a part of power domain) 484 * and have clocks enabled. However in some cases those resources might not be 485 * yet available. Returning EPROBE_DEFER is not a solution in such case, 486 * because callers don't handle this special error code. Instead such devices 487 * are added to the special list and their registration is retried from 488 * periodic worker, until all resources are available and registration succeeds. 489 */ 490 struct deferred_device { 491 struct amba_device *dev; 492 struct resource *parent; 493 struct list_head node; 494 }; 495 496 static LIST_HEAD(deferred_devices); 497 static DEFINE_MUTEX(deferred_devices_lock); 498 499 static void amba_deferred_retry_func(struct work_struct *dummy); 500 static DECLARE_DELAYED_WORK(deferred_retry_work, amba_deferred_retry_func); 501 502 #define DEFERRED_DEVICE_TIMEOUT (msecs_to_jiffies(5 * 1000)) 503 504 static int amba_deferred_retry(void) 505 { 506 struct deferred_device *ddev, *tmp; 507 508 mutex_lock(&deferred_devices_lock); 509 510 list_for_each_entry_safe(ddev, tmp, &deferred_devices, node) { 511 int ret = amba_device_try_add(ddev->dev, ddev->parent); 512 513 if (ret == -EPROBE_DEFER) 514 continue; 515 516 list_del_init(&ddev->node); 517 kfree(ddev); 518 } 519 520 mutex_unlock(&deferred_devices_lock); 521 522 return 0; 523 } 524 late_initcall(amba_deferred_retry); 525 526 static void amba_deferred_retry_func(struct work_struct *dummy) 527 { 528 amba_deferred_retry(); 529 530 if (!list_empty(&deferred_devices)) 531 schedule_delayed_work(&deferred_retry_work, 532 DEFERRED_DEVICE_TIMEOUT); 533 } 534 535 /** 536 * amba_device_add - add a previously allocated AMBA device structure 537 * @dev: AMBA device allocated by amba_device_alloc 538 * @parent: resource parent for this devices resources 539 * 540 * Claim the resource, and read the device cell ID if not already 541 * initialized. Register the AMBA device with the Linux device 542 * manager. 543 */ 544 int amba_device_add(struct amba_device *dev, struct resource *parent) 545 { 546 int ret = amba_device_try_add(dev, parent); 547 548 if (ret == -EPROBE_DEFER) { 549 struct deferred_device *ddev; 550 551 ddev = kmalloc(sizeof(*ddev), GFP_KERNEL); 552 if (!ddev) 553 return -ENOMEM; 554 555 ddev->dev = dev; 556 ddev->parent = parent; 557 ret = 0; 558 559 mutex_lock(&deferred_devices_lock); 560 561 if (list_empty(&deferred_devices)) 562 schedule_delayed_work(&deferred_retry_work, 563 DEFERRED_DEVICE_TIMEOUT); 564 list_add_tail(&ddev->node, &deferred_devices); 565 566 mutex_unlock(&deferred_devices_lock); 567 } 568 return ret; 569 } 570 EXPORT_SYMBOL_GPL(amba_device_add); 571 572 static void amba_device_initialize(struct amba_device *dev, const char *name) 573 { 574 device_initialize(&dev->dev); 575 if (name) 576 dev_set_name(&dev->dev, "%s", name); 577 dev->dev.release = amba_device_release; 578 dev->dev.bus = &amba_bustype; 579 dev->dev.dma_mask = &dev->dev.coherent_dma_mask; 580 dev->dev.dma_parms = &dev->dma_parms; 581 dev->res.name = dev_name(&dev->dev); 582 } 583 584 /** 585 * amba_device_alloc - allocate an AMBA device 586 * @name: sysfs name of the AMBA device 587 * @base: base of AMBA device 588 * @size: size of AMBA device 589 * 590 * Allocate and initialize an AMBA device structure. Returns %NULL 591 * on failure. 592 */ 593 struct amba_device *amba_device_alloc(const char *name, resource_size_t base, 594 size_t size) 595 { 596 struct amba_device *dev; 597 598 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 599 if (dev) { 600 amba_device_initialize(dev, name); 601 dev->res.start = base; 602 dev->res.end = base + size - 1; 603 dev->res.flags = IORESOURCE_MEM; 604 } 605 606 return dev; 607 } 608 EXPORT_SYMBOL_GPL(amba_device_alloc); 609 610 /** 611 * amba_device_register - register an AMBA device 612 * @dev: AMBA device to register 613 * @parent: parent memory resource 614 * 615 * Setup the AMBA device, reading the cell ID if present. 616 * Claim the resource, and register the AMBA device with 617 * the Linux device manager. 618 */ 619 int amba_device_register(struct amba_device *dev, struct resource *parent) 620 { 621 amba_device_initialize(dev, dev->dev.init_name); 622 dev->dev.init_name = NULL; 623 624 return amba_device_add(dev, parent); 625 } 626 EXPORT_SYMBOL(amba_device_register); 627 628 /** 629 * amba_device_put - put an AMBA device 630 * @dev: AMBA device to put 631 */ 632 void amba_device_put(struct amba_device *dev) 633 { 634 put_device(&dev->dev); 635 } 636 EXPORT_SYMBOL_GPL(amba_device_put); 637 638 /** 639 * amba_device_unregister - unregister an AMBA device 640 * @dev: AMBA device to remove 641 * 642 * Remove the specified AMBA device from the Linux device 643 * manager. All files associated with this object will be 644 * destroyed, and device drivers notified that the device has 645 * been removed. The AMBA device's resources including 646 * the amba_device structure will be freed once all 647 * references to it have been dropped. 648 */ 649 void amba_device_unregister(struct amba_device *dev) 650 { 651 device_unregister(&dev->dev); 652 } 653 EXPORT_SYMBOL(amba_device_unregister); 654 655 /** 656 * amba_request_regions - request all mem regions associated with device 657 * @dev: amba_device structure for device 658 * @name: name, or NULL to use driver name 659 */ 660 int amba_request_regions(struct amba_device *dev, const char *name) 661 { 662 int ret = 0; 663 u32 size; 664 665 if (!name) 666 name = dev->dev.driver->name; 667 668 size = resource_size(&dev->res); 669 670 if (!request_mem_region(dev->res.start, size, name)) 671 ret = -EBUSY; 672 673 return ret; 674 } 675 EXPORT_SYMBOL(amba_request_regions); 676 677 /** 678 * amba_release_regions - release mem regions associated with device 679 * @dev: amba_device structure for device 680 * 681 * Release regions claimed by a successful call to amba_request_regions. 682 */ 683 void amba_release_regions(struct amba_device *dev) 684 { 685 u32 size; 686 687 size = resource_size(&dev->res); 688 release_mem_region(dev->res.start, size); 689 } 690 EXPORT_SYMBOL(amba_release_regions); 691