2 * linux/arch/arm/common/amba.c
4 * Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/device.h>
13 #include <linux/string.h>
14 #include <linux/slab.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/pm_domain.h>
19 #include <linux/amba/bus.h>
20 #include <linux/sizes.h>
21 #include <linux/limits.h>
22 #include <linux/clk/clk-conf.h>
23 #include <linux/platform_device.h>
27 #define to_amba_driver(d) container_of(d, struct amba_driver, drv)
29 static const struct amba_id
*
30 amba_lookup(const struct amba_id
*table
, struct amba_device
*dev
)
35 ret
= (dev
->periphid
& table
->mask
) == table
->id
;
41 return ret
? table
: NULL
;
44 static int amba_match(struct device
*dev
, struct device_driver
*drv
)
46 struct amba_device
*pcdev
= to_amba_device(dev
);
47 struct amba_driver
*pcdrv
= to_amba_driver(drv
);
49 /* When driver_override is set, only bind to the matching driver */
50 if (pcdev
->driver_override
)
51 return !strcmp(pcdev
->driver_override
, drv
->name
);
53 return amba_lookup(pcdrv
->id_table
, pcdev
) != NULL
;
56 static int amba_uevent(struct device
*dev
, struct kobj_uevent_env
*env
)
58 struct amba_device
*pcdev
= to_amba_device(dev
);
61 retval
= add_uevent_var(env
, "AMBA_ID=%08x", pcdev
->periphid
);
65 retval
= add_uevent_var(env
, "MODALIAS=amba:d%08X", pcdev
->periphid
);
69 static ssize_t
driver_override_show(struct device
*_dev
,
70 struct device_attribute
*attr
, char *buf
)
72 struct amba_device
*dev
= to_amba_device(_dev
);
76 len
= sprintf(buf
, "%s\n", dev
->driver_override
);
81 static ssize_t
driver_override_store(struct device
*_dev
,
82 struct device_attribute
*attr
,
83 const char *buf
, size_t count
)
85 struct amba_device
*dev
= to_amba_device(_dev
);
86 char *driver_override
, *old
, *cp
;
88 /* We need to keep extra room for a newline */
89 if (count
>= (PAGE_SIZE
- 1))
92 driver_override
= kstrndup(buf
, count
, GFP_KERNEL
);
96 cp
= strchr(driver_override
, '\n');
101 old
= dev
->driver_override
;
102 if (strlen(driver_override
)) {
103 dev
->driver_override
= driver_override
;
105 kfree(driver_override
);
106 dev
->driver_override
= NULL
;
114 static DEVICE_ATTR_RW(driver_override
);
116 #define amba_attr_func(name,fmt,arg...) \
117 static ssize_t name##_show(struct device *_dev, \
118 struct device_attribute *attr, char *buf) \
120 struct amba_device *dev = to_amba_device(_dev); \
121 return sprintf(buf, fmt, arg); \
123 static DEVICE_ATTR_RO(name)
125 amba_attr_func(id
, "%08x\n", dev
->periphid
);
126 amba_attr_func(irq0
, "%u\n", dev
->irq
[0]);
127 amba_attr_func(irq1
, "%u\n", dev
->irq
[1]);
128 amba_attr_func(resource
, "\t%016llx\t%016llx\t%016lx\n",
129 (unsigned long long)dev
->res
.start
, (unsigned long long)dev
->res
.end
,
132 static struct attribute
*amba_dev_attrs
[] = {
134 &dev_attr_resource
.attr
,
135 &dev_attr_driver_override
.attr
,
138 ATTRIBUTE_GROUPS(amba_dev
);
142 * Hooks to provide runtime PM of the pclk (bus clock). It is safe to
143 * enable/disable the bus clock at runtime PM suspend/resume as this
144 * does not result in loss of context.
146 static int amba_pm_runtime_suspend(struct device
*dev
)
148 struct amba_device
*pcdev
= to_amba_device(dev
);
149 int ret
= pm_generic_runtime_suspend(dev
);
151 if (ret
== 0 && dev
->driver
) {
152 if (pm_runtime_is_irq_safe(dev
))
153 clk_disable(pcdev
->pclk
);
155 clk_disable_unprepare(pcdev
->pclk
);
161 static int amba_pm_runtime_resume(struct device
*dev
)
163 struct amba_device
*pcdev
= to_amba_device(dev
);
167 if (pm_runtime_is_irq_safe(dev
))
168 ret
= clk_enable(pcdev
->pclk
);
170 ret
= clk_prepare_enable(pcdev
->pclk
);
171 /* Failure is probably fatal to the system, but... */
176 return pm_generic_runtime_resume(dev
);
178 #endif /* CONFIG_PM */
180 static const struct dev_pm_ops amba_pm
= {
181 .suspend
= pm_generic_suspend
,
182 .resume
= pm_generic_resume
,
183 .freeze
= pm_generic_freeze
,
184 .thaw
= pm_generic_thaw
,
185 .poweroff
= pm_generic_poweroff
,
186 .restore
= pm_generic_restore
,
188 amba_pm_runtime_suspend
,
189 amba_pm_runtime_resume
,
195 * Primecells are part of the Advanced Microcontroller Bus Architecture,
196 * so we call the bus "amba".
197 * DMA configuration for platform and AMBA bus is same. So here we reuse
198 * platform's DMA config routine.
200 struct bus_type amba_bustype
= {
202 .dev_groups
= amba_dev_groups
,
204 .uevent
= amba_uevent
,
205 .dma_configure
= platform_dma_configure
,
208 EXPORT_SYMBOL_GPL(amba_bustype
);
210 static int __init
amba_init(void)
212 return bus_register(&amba_bustype
);
215 postcore_initcall(amba_init
);
217 static int amba_get_enable_pclk(struct amba_device
*pcdev
)
221 pcdev
->pclk
= clk_get(&pcdev
->dev
, "apb_pclk");
222 if (IS_ERR(pcdev
->pclk
))
223 return PTR_ERR(pcdev
->pclk
);
225 ret
= clk_prepare_enable(pcdev
->pclk
);
227 clk_put(pcdev
->pclk
);
232 static void amba_put_disable_pclk(struct amba_device
*pcdev
)
234 clk_disable_unprepare(pcdev
->pclk
);
235 clk_put(pcdev
->pclk
);
239 * These are the device model conversion veneers; they convert the
240 * device model structures to our more specific structures.
242 static int amba_probe(struct device
*dev
)
244 struct amba_device
*pcdev
= to_amba_device(dev
);
245 struct amba_driver
*pcdrv
= to_amba_driver(dev
->driver
);
246 const struct amba_id
*id
= amba_lookup(pcdrv
->id_table
, pcdev
);
250 ret
= of_clk_set_defaults(dev
->of_node
, false);
254 ret
= dev_pm_domain_attach(dev
, true);
258 ret
= amba_get_enable_pclk(pcdev
);
260 dev_pm_domain_detach(dev
, true);
264 pm_runtime_get_noresume(dev
);
265 pm_runtime_set_active(dev
);
266 pm_runtime_enable(dev
);
268 ret
= pcdrv
->probe(pcdev
, id
);
272 pm_runtime_disable(dev
);
273 pm_runtime_set_suspended(dev
);
274 pm_runtime_put_noidle(dev
);
276 amba_put_disable_pclk(pcdev
);
277 dev_pm_domain_detach(dev
, true);
283 static int amba_remove(struct device
*dev
)
285 struct amba_device
*pcdev
= to_amba_device(dev
);
286 struct amba_driver
*drv
= to_amba_driver(dev
->driver
);
289 pm_runtime_get_sync(dev
);
290 ret
= drv
->remove(pcdev
);
291 pm_runtime_put_noidle(dev
);
293 /* Undo the runtime PM settings in amba_probe() */
294 pm_runtime_disable(dev
);
295 pm_runtime_set_suspended(dev
);
296 pm_runtime_put_noidle(dev
);
298 amba_put_disable_pclk(pcdev
);
299 dev_pm_domain_detach(dev
, true);
304 static void amba_shutdown(struct device
*dev
)
306 struct amba_driver
*drv
= to_amba_driver(dev
->driver
);
307 drv
->shutdown(to_amba_device(dev
));
311 * amba_driver_register - register an AMBA device driver
312 * @drv: amba device driver structure
314 * Register an AMBA device driver with the Linux device model
315 * core. If devices pre-exist, the drivers probe function will
318 int amba_driver_register(struct amba_driver
*drv
)
320 drv
->drv
.bus
= &amba_bustype
;
322 #define SETFN(fn) if (drv->fn) drv->drv.fn = amba_##fn
327 return driver_register(&drv
->drv
);
331 * amba_driver_unregister - remove an AMBA device driver
332 * @drv: AMBA device driver structure to remove
334 * Unregister an AMBA device driver from the Linux device
335 * model. The device model will call the drivers remove function
336 * for each device the device driver is currently handling.
338 void amba_driver_unregister(struct amba_driver
*drv
)
340 driver_unregister(&drv
->drv
);
344 static void amba_device_release(struct device
*dev
)
346 struct amba_device
*d
= to_amba_device(dev
);
349 release_resource(&d
->res
);
353 static int amba_device_try_add(struct amba_device
*dev
, struct resource
*parent
)
359 WARN_ON(dev
->irq
[0] == (unsigned int)-1);
360 WARN_ON(dev
->irq
[1] == (unsigned int)-1);
362 ret
= request_resource(parent
, &dev
->res
);
366 /* Hard-coded primecell ID instead of plug-n-play */
367 if (dev
->periphid
!= 0)
371 * Dynamically calculate the size of the resource
372 * and use this for iomap
374 size
= resource_size(&dev
->res
);
375 tmp
= ioremap(dev
->res
.start
, size
);
381 ret
= dev_pm_domain_attach(&dev
->dev
, true);
387 ret
= amba_get_enable_pclk(dev
);
392 * Read pid and cid based on size of resource
393 * they are located at end of region
395 for (pid
= 0, i
= 0; i
< 4; i
++)
396 pid
|= (readl(tmp
+ size
- 0x20 + 4 * i
) & 255) <<
398 for (cid
= 0, i
= 0; i
< 4; i
++)
399 cid
|= (readl(tmp
+ size
- 0x10 + 4 * i
) & 255) <<
402 amba_put_disable_pclk(dev
);
404 if (cid
== AMBA_CID
|| cid
== CORESIGHT_CID
)
412 dev_pm_domain_detach(&dev
->dev
, true);
418 ret
= device_add(&dev
->dev
);
423 ret
= device_create_file(&dev
->dev
, &dev_attr_irq0
);
424 if (ret
== 0 && dev
->irq
[1])
425 ret
= device_create_file(&dev
->dev
, &dev_attr_irq1
);
429 device_unregister(&dev
->dev
);
432 release_resource(&dev
->res
);
438 * Registration of AMBA device require reading its pid and cid registers.
439 * To do this, the device must be turned on (if it is a part of power domain)
440 * and have clocks enabled. However in some cases those resources might not be
441 * yet available. Returning EPROBE_DEFER is not a solution in such case,
442 * because callers don't handle this special error code. Instead such devices
443 * are added to the special list and their registration is retried from
444 * periodic worker, until all resources are available and registration succeeds.
446 struct deferred_device
{
447 struct amba_device
*dev
;
448 struct resource
*parent
;
449 struct list_head node
;
452 static LIST_HEAD(deferred_devices
);
453 static DEFINE_MUTEX(deferred_devices_lock
);
455 static void amba_deferred_retry_func(struct work_struct
*dummy
);
456 static DECLARE_DELAYED_WORK(deferred_retry_work
, amba_deferred_retry_func
);
458 #define DEFERRED_DEVICE_TIMEOUT (msecs_to_jiffies(5 * 1000))
460 static void amba_deferred_retry_func(struct work_struct
*dummy
)
462 struct deferred_device
*ddev
, *tmp
;
464 mutex_lock(&deferred_devices_lock
);
466 list_for_each_entry_safe(ddev
, tmp
, &deferred_devices
, node
) {
467 int ret
= amba_device_try_add(ddev
->dev
, ddev
->parent
);
469 if (ret
== -EPROBE_DEFER
)
472 list_del_init(&ddev
->node
);
476 if (!list_empty(&deferred_devices
))
477 schedule_delayed_work(&deferred_retry_work
,
478 DEFERRED_DEVICE_TIMEOUT
);
480 mutex_unlock(&deferred_devices_lock
);
484 * amba_device_add - add a previously allocated AMBA device structure
485 * @dev: AMBA device allocated by amba_device_alloc
486 * @parent: resource parent for this devices resources
488 * Claim the resource, and read the device cell ID if not already
489 * initialized. Register the AMBA device with the Linux device
492 int amba_device_add(struct amba_device
*dev
, struct resource
*parent
)
494 int ret
= amba_device_try_add(dev
, parent
);
496 if (ret
== -EPROBE_DEFER
) {
497 struct deferred_device
*ddev
;
499 ddev
= kmalloc(sizeof(*ddev
), GFP_KERNEL
);
504 ddev
->parent
= parent
;
507 mutex_lock(&deferred_devices_lock
);
509 if (list_empty(&deferred_devices
))
510 schedule_delayed_work(&deferred_retry_work
,
511 DEFERRED_DEVICE_TIMEOUT
);
512 list_add_tail(&ddev
->node
, &deferred_devices
);
514 mutex_unlock(&deferred_devices_lock
);
518 EXPORT_SYMBOL_GPL(amba_device_add
);
520 static struct amba_device
*
521 amba_aphb_device_add(struct device
*parent
, const char *name
,
522 resource_size_t base
, size_t size
, int irq1
, int irq2
,
523 void *pdata
, unsigned int periphid
, u64 dma_mask
,
524 struct resource
*resbase
)
526 struct amba_device
*dev
;
529 dev
= amba_device_alloc(name
, base
, size
);
531 return ERR_PTR(-ENOMEM
);
533 dev
->dev
.coherent_dma_mask
= dma_mask
;
536 dev
->periphid
= periphid
;
537 dev
->dev
.platform_data
= pdata
;
538 dev
->dev
.parent
= parent
;
540 ret
= amba_device_add(dev
, resbase
);
542 amba_device_put(dev
);
550 amba_apb_device_add(struct device
*parent
, const char *name
,
551 resource_size_t base
, size_t size
, int irq1
, int irq2
,
552 void *pdata
, unsigned int periphid
)
554 return amba_aphb_device_add(parent
, name
, base
, size
, irq1
, irq2
, pdata
,
555 periphid
, 0, &iomem_resource
);
557 EXPORT_SYMBOL_GPL(amba_apb_device_add
);
560 amba_ahb_device_add(struct device
*parent
, const char *name
,
561 resource_size_t base
, size_t size
, int irq1
, int irq2
,
562 void *pdata
, unsigned int periphid
)
564 return amba_aphb_device_add(parent
, name
, base
, size
, irq1
, irq2
, pdata
,
565 periphid
, ~0ULL, &iomem_resource
);
567 EXPORT_SYMBOL_GPL(amba_ahb_device_add
);
570 amba_apb_device_add_res(struct device
*parent
, const char *name
,
571 resource_size_t base
, size_t size
, int irq1
,
572 int irq2
, void *pdata
, unsigned int periphid
,
573 struct resource
*resbase
)
575 return amba_aphb_device_add(parent
, name
, base
, size
, irq1
, irq2
, pdata
,
576 periphid
, 0, resbase
);
578 EXPORT_SYMBOL_GPL(amba_apb_device_add_res
);
581 amba_ahb_device_add_res(struct device
*parent
, const char *name
,
582 resource_size_t base
, size_t size
, int irq1
,
583 int irq2
, void *pdata
, unsigned int periphid
,
584 struct resource
*resbase
)
586 return amba_aphb_device_add(parent
, name
, base
, size
, irq1
, irq2
, pdata
,
587 periphid
, ~0ULL, resbase
);
589 EXPORT_SYMBOL_GPL(amba_ahb_device_add_res
);
592 static void amba_device_initialize(struct amba_device
*dev
, const char *name
)
594 device_initialize(&dev
->dev
);
596 dev_set_name(&dev
->dev
, "%s", name
);
597 dev
->dev
.release
= amba_device_release
;
598 dev
->dev
.bus
= &amba_bustype
;
599 dev
->dev
.dma_mask
= &dev
->dev
.coherent_dma_mask
;
600 dev
->res
.name
= dev_name(&dev
->dev
);
604 * amba_device_alloc - allocate an AMBA device
605 * @name: sysfs name of the AMBA device
606 * @base: base of AMBA device
607 * @size: size of AMBA device
609 * Allocate and initialize an AMBA device structure. Returns %NULL
612 struct amba_device
*amba_device_alloc(const char *name
, resource_size_t base
,
615 struct amba_device
*dev
;
617 dev
= kzalloc(sizeof(*dev
), GFP_KERNEL
);
619 amba_device_initialize(dev
, name
);
620 dev
->res
.start
= base
;
621 dev
->res
.end
= base
+ size
- 1;
622 dev
->res
.flags
= IORESOURCE_MEM
;
627 EXPORT_SYMBOL_GPL(amba_device_alloc
);
630 * amba_device_register - register an AMBA device
631 * @dev: AMBA device to register
632 * @parent: parent memory resource
634 * Setup the AMBA device, reading the cell ID if present.
635 * Claim the resource, and register the AMBA device with
636 * the Linux device manager.
638 int amba_device_register(struct amba_device
*dev
, struct resource
*parent
)
640 amba_device_initialize(dev
, dev
->dev
.init_name
);
641 dev
->dev
.init_name
= NULL
;
643 return amba_device_add(dev
, parent
);
647 * amba_device_put - put an AMBA device
648 * @dev: AMBA device to put
650 void amba_device_put(struct amba_device
*dev
)
652 put_device(&dev
->dev
);
654 EXPORT_SYMBOL_GPL(amba_device_put
);
657 * amba_device_unregister - unregister an AMBA device
658 * @dev: AMBA device to remove
660 * Remove the specified AMBA device from the Linux device
661 * manager. All files associated with this object will be
662 * destroyed, and device drivers notified that the device has
663 * been removed. The AMBA device's resources including
664 * the amba_device structure will be freed once all
665 * references to it have been dropped.
667 void amba_device_unregister(struct amba_device
*dev
)
669 device_unregister(&dev
->dev
);
674 struct amba_device
*dev
;
675 struct device
*parent
;
681 static int amba_find_match(struct device
*dev
, void *data
)
683 struct find_data
*d
= data
;
684 struct amba_device
*pcdev
= to_amba_device(dev
);
687 r
= (pcdev
->periphid
& d
->mask
) == d
->id
;
689 r
&= d
->parent
== dev
->parent
;
691 r
&= strcmp(dev_name(dev
), d
->busid
) == 0;
702 * amba_find_device - locate an AMBA device given a bus id
703 * @busid: bus id for device (or NULL)
704 * @parent: parent device (or NULL)
705 * @id: peripheral ID (or 0)
706 * @mask: peripheral ID mask (or 0)
708 * Return the AMBA device corresponding to the supplied parameters.
709 * If no device matches, returns NULL.
711 * NOTE: When a valid device is found, its refcount is
712 * incremented, and must be decremented before the returned
716 amba_find_device(const char *busid
, struct device
*parent
, unsigned int id
,
719 struct find_data data
;
722 data
.parent
= parent
;
727 bus_for_each_dev(&amba_bustype
, NULL
, &data
, amba_find_match
);
733 * amba_request_regions - request all mem regions associated with device
734 * @dev: amba_device structure for device
735 * @name: name, or NULL to use driver name
737 int amba_request_regions(struct amba_device
*dev
, const char *name
)
743 name
= dev
->dev
.driver
->name
;
745 size
= resource_size(&dev
->res
);
747 if (!request_mem_region(dev
->res
.start
, size
, name
))
754 * amba_release_regions - release mem regions associated with device
755 * @dev: amba_device structure for device
757 * Release regions claimed by a successful call to amba_request_regions.
759 void amba_release_regions(struct amba_device
*dev
)
763 size
= resource_size(&dev
->res
);
764 release_mem_region(dev
->res
.start
, size
);
767 EXPORT_SYMBOL(amba_driver_register
);
768 EXPORT_SYMBOL(amba_driver_unregister
);
769 EXPORT_SYMBOL(amba_device_register
);
770 EXPORT_SYMBOL(amba_device_unregister
);
771 EXPORT_SYMBOL(amba_find_device
);
772 EXPORT_SYMBOL(amba_request_regions
);
773 EXPORT_SYMBOL(amba_release_regions
);