diff options
-rw-r--r-- | drivers/amba/bus.c | 100 | ||||
-rw-r--r-- | include/linux/amba/bus.h | 3 |
2 files changed, 78 insertions, 25 deletions
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index 54eaf96ab21..82b65e1e12b 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c | |||
@@ -497,38 +497,20 @@ static void amba_device_release(struct device *dev) | |||
497 | } | 497 | } |
498 | 498 | ||
499 | /** | 499 | /** |
500 | * amba_device_register - register an AMBA device | 500 | * amba_device_add - add a previously allocated AMBA device structure |
501 | * @dev: AMBA device to register | 501 | * @dev: AMBA device allocated by amba_device_alloc |
502 | * @parent: parent memory resource | 502 | * @parent: resource parent for this devices resources |
503 | * | 503 | * |
504 | * Setup the AMBA device, reading the cell ID if present. | 504 | * Claim the resource, and read the device cell ID if not already |
505 | * Claim the resource, and register the AMBA device with | 505 | * initialized. Register the AMBA device with the Linux device |
506 | * the Linux device manager. | 506 | * manager. |
507 | */ | 507 | */ |
508 | int amba_device_register(struct amba_device *dev, struct resource *parent) | 508 | int amba_device_add(struct amba_device *dev, struct resource *parent) |
509 | { | 509 | { |
510 | u32 size; | 510 | u32 size; |
511 | void __iomem *tmp; | 511 | void __iomem *tmp; |
512 | int i, ret; | 512 | int i, ret; |
513 | 513 | ||
514 | device_initialize(&dev->dev); | ||
515 | |||
516 | /* | ||
517 | * Copy from device_add | ||
518 | */ | ||
519 | if (dev->dev.init_name) { | ||
520 | dev_set_name(&dev->dev, "%s", dev->dev.init_name); | ||
521 | dev->dev.init_name = NULL; | ||
522 | } | ||
523 | |||
524 | dev->dev.release = amba_device_release; | ||
525 | dev->dev.bus = &amba_bustype; | ||
526 | dev->dev.dma_mask = &dev->dma_mask; | ||
527 | dev->res.name = dev_name(&dev->dev); | ||
528 | |||
529 | if (!dev->dev.coherent_dma_mask && dev->dma_mask) | ||
530 | dev_warn(&dev->dev, "coherent dma mask is unset\n"); | ||
531 | |||
532 | ret = request_resource(parent, &dev->res); | 514 | ret = request_resource(parent, &dev->res); |
533 | if (ret) | 515 | if (ret) |
534 | goto err_out; | 516 | goto err_out; |
@@ -596,6 +578,74 @@ int amba_device_register(struct amba_device *dev, struct resource *parent) | |||
596 | err_out: | 578 | err_out: |
597 | return ret; | 579 | return ret; |
598 | } | 580 | } |
581 | EXPORT_SYMBOL_GPL(amba_device_add); | ||
582 | |||
583 | static void amba_device_initialize(struct amba_device *dev, const char *name) | ||
584 | { | ||
585 | device_initialize(&dev->dev); | ||
586 | if (name) | ||
587 | dev_set_name(&dev->dev, "%s", name); | ||
588 | dev->dev.release = amba_device_release; | ||
589 | dev->dev.bus = &amba_bustype; | ||
590 | dev->dev.dma_mask = &dev->dma_mask; | ||
591 | dev->res.name = dev_name(&dev->dev); | ||
592 | } | ||
593 | |||
594 | /** | ||
595 | * amba_device_alloc - allocate an AMBA device | ||
596 | * @name: sysfs name of the AMBA device | ||
597 | * @base: base of AMBA device | ||
598 | * @size: size of AMBA device | ||
599 | * | ||
600 | * Allocate and initialize an AMBA device structure. Returns %NULL | ||
601 | * on failure. | ||
602 | */ | ||
603 | struct amba_device *amba_device_alloc(const char *name, resource_size_t base, | ||
604 | size_t size) | ||
605 | { | ||
606 | struct amba_device *dev; | ||
607 | |||
608 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
609 | if (dev) { | ||
610 | amba_device_initialize(dev, name); | ||
611 | dev->res.start = base; | ||
612 | dev->res.end = base + size - 1; | ||
613 | dev->res.flags = IORESOURCE_MEM; | ||
614 | } | ||
615 | |||
616 | return dev; | ||
617 | } | ||
618 | EXPORT_SYMBOL_GPL(amba_device_alloc); | ||
619 | |||
620 | /** | ||
621 | * amba_device_register - register an AMBA device | ||
622 | * @dev: AMBA device to register | ||
623 | * @parent: parent memory resource | ||
624 | * | ||
625 | * Setup the AMBA device, reading the cell ID if present. | ||
626 | * Claim the resource, and register the AMBA device with | ||
627 | * the Linux device manager. | ||
628 | */ | ||
629 | int amba_device_register(struct amba_device *dev, struct resource *parent) | ||
630 | { | ||
631 | amba_device_initialize(dev, dev->dev.init_name); | ||
632 | dev->dev.init_name = NULL; | ||
633 | |||
634 | if (!dev->dev.coherent_dma_mask && dev->dma_mask) | ||
635 | dev_warn(&dev->dev, "coherent dma mask is unset\n"); | ||
636 | |||
637 | return amba_device_add(dev, parent); | ||
638 | } | ||
639 | |||
640 | /** | ||
641 | * amba_device_put - put an AMBA device | ||
642 | * @dev: AMBA device to put | ||
643 | */ | ||
644 | void amba_device_put(struct amba_device *dev) | ||
645 | { | ||
646 | put_device(&dev->dev); | ||
647 | } | ||
648 | EXPORT_SYMBOL_GPL(amba_device_put); | ||
599 | 649 | ||
600 | /** | 650 | /** |
601 | * amba_device_unregister - unregister an AMBA device | 651 | * amba_device_unregister - unregister an AMBA device |
diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index 724c69c40bb..e1929620e5a 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h | |||
@@ -60,6 +60,9 @@ extern struct bus_type amba_bustype; | |||
60 | 60 | ||
61 | int amba_driver_register(struct amba_driver *); | 61 | int amba_driver_register(struct amba_driver *); |
62 | void amba_driver_unregister(struct amba_driver *); | 62 | void amba_driver_unregister(struct amba_driver *); |
63 | struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t); | ||
64 | void amba_device_put(struct amba_device *); | ||
65 | int amba_device_add(struct amba_device *, struct resource *); | ||
63 | int amba_device_register(struct amba_device *, struct resource *); | 66 | int amba_device_register(struct amba_device *, struct resource *); |
64 | void amba_device_unregister(struct amba_device *); | 67 | void amba_device_unregister(struct amba_device *); |
65 | struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int); | 68 | struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int); |