mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
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:
1 parent
c86fcdfb99
commit
2a25576499
3 files changed
+55
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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 : {
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/*
|
||||
|
||||