Merge branch 'acpi-init'

* acpi-init:
  clocksource: cosmetic: Drop OF 'dependency' from symbols
  clocksource / arm_arch_timer: Convert to ACPI probing
  clocksource: Add new CLKSRC_{PROBE,ACPI} config symbols
  clocksource / ACPI: Add probing infrastructure for ACPI-based clocksources
  irqchip / GIC: Convert the GIC driver to ACPI probing
  irqchip / ACPI: Add probing infrastructure for ACPI-based irqchips
  ACPI: Add early device probing infrastructure
This commit is contained in:
Rafael J. Wysocki
2015-10-25 22:55:14 +01:00
32 changed files with 211 additions and 161 deletions

View File

@@ -787,6 +787,61 @@ int acpi_dev_prop_read(struct acpi_device *adev, const char *propname,
struct fwnode_handle *acpi_get_next_subnode(struct device *dev,
struct fwnode_handle *subnode);
struct acpi_probe_entry;
typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *,
struct acpi_probe_entry *);
#define ACPI_TABLE_ID_LEN 5
/**
* struct acpi_probe_entry - boot-time probing entry
* @id: ACPI table name
* @type: Optional subtable type to match
* (if @id contains subtables)
* @subtable_valid: Optional callback to check the validity of
* the subtable
* @probe_table: Callback to the driver being probed when table
* match is successful
* @probe_subtbl: Callback to the driver being probed when table and
* subtable match (and optional callback is successful)
* @driver_data: Sideband data provided back to the driver
*/
struct acpi_probe_entry {
__u8 id[ACPI_TABLE_ID_LEN];
__u8 type;
acpi_probe_entry_validate_subtbl subtable_valid;
union {
acpi_tbl_table_handler probe_table;
acpi_tbl_entry_handler probe_subtbl;
};
kernel_ulong_t driver_data;
};
#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, valid, data, fn) \
static const struct acpi_probe_entry __acpi_probe_##name \
__used __section(__##table##_acpi_probe_table) \
= { \
.id = table_id, \
.type = subtable, \
.subtable_valid = valid, \
.probe_table = (acpi_tbl_table_handler)fn, \
.driver_data = data, \
}
#define ACPI_PROBE_TABLE(name) __##name##_acpi_probe_table
#define ACPI_PROBE_TABLE_END(name) __##name##_acpi_probe_table_end
int __acpi_probe_device_table(struct acpi_probe_entry *start, int nr);
#define acpi_probe_device_table(t) \
({ \
extern struct acpi_probe_entry ACPI_PROBE_TABLE(t), \
ACPI_PROBE_TABLE_END(t); \
__acpi_probe_device_table(&ACPI_PROBE_TABLE(t), \
(&ACPI_PROBE_TABLE_END(t) - \
&ACPI_PROBE_TABLE(t))); \
})
#else
static inline int acpi_dev_get_property(struct acpi_device *adev,
const char *name, acpi_object_type type,
@@ -845,6 +900,17 @@ static inline struct fwnode_handle *acpi_get_next_subnode(struct device *dev,
{
return NULL;
}
#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, validate, data, fn) \
static const void * __acpi_table_##name[] \
__attribute__((unused)) \
= { (void *) table_id, \
(void *) subtable, \
(void *) valid, \
(void *) fn, \
(void *) data }
#define acpi_probe_device_table(t) ({ int __r = 0; __r;})
#endif
#endif /*_LINUX_ACPI_H*/