arm: Introduce a generic way to use a device from acpi

Add generic way to use device from acpi similar to the way it is
supported in device tree.

Signed-off-by: Parth Dixit <parth.dixit@linaro.org>
Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
This commit is contained in:
Parth Dixit authored and Jan Beulich committed 2016-03-03 09:07:00 +01:00
1 parent c86fcdfb99
commit 2a25576499
3 files changed
+55

No files matched your search

+18
View File
@@ -22,6 +22,7 @@
#include <xen/lib.h>
extern const struct device_desc _sdevice[], _edevice[];
extern const struct acpi_device_desc _asdevice[], _aedevice[];
int __init device_init(struct dt_device_node *dev, enum device_class class,
const void *data)
@@ -50,6 +51,23 @@ int __init device_init(struct dt_device_node *dev, enum device_class class,
return -EBADF;
}
int __init acpi_device_init(enum device_class class, const void *data, int class_type)
{
const struct acpi_device_desc *desc;
for ( desc = _asdevice; desc != _aedevice; desc++ )
{
if ( ( desc->class != class ) || ( desc->class_type != class_type ) )
continue;
ASSERT(desc->init != NULL);
return desc->init(data);
}
return -EBADF;
}
enum device_class device_get_class(const struct dt_device_node *dev)
{
const struct device_desc *desc;
+7
View File
@@ -105,6 +105,13 @@ SECTIONS
_edevice = .;
} :text
. = ALIGN(8);
.adev.info : {
_asdevice = .;
*(.adev.info)
_aedevice = .;
} :text
. = ALIGN(PAGE_SIZE); /* Init code and data */
__init_begin = .;
.init.text : {
+30
View File
@@ -50,6 +50,27 @@ struct device_desc {
int (*init)(struct dt_device_node *dev, const void *data);
};
struct acpi_device_desc {
/* Device name */
const char *name;
/* Device class */
enum device_class class;
/* type of device supported by the driver */
const int class_type;
/* Device initialization */
int (*init)(const void *data);
};
/**
* acpi_device_init - Initialize a device
* @class: class of the device (serial, network...)
* @data: specific data for initializing the device
*
* Return 0 on success.
*/
int __init acpi_device_init(enum device_class class,
const void *data, int class_type);
/**
* device_init - Initialize a device
* @dev: device to initialize
@@ -78,6 +99,15 @@ __section(".dev.info") = { \
#define DT_DEVICE_END \
};
#define ACPI_DEVICE_START(_name, _namestr, _class) \
static const struct acpi_device_desc __dev_desc_##_name __used \
__section(".adev.info") = { \
.name = _namestr, \
.class = _class, \
#define ACPI_DEVICE_END \
};
#endif /* __ASM_ARM_DEVICE_H */
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.