diff options
Diffstat (limited to 'drivers/core/acpi.c')
| -rw-r--r-- | drivers/core/acpi.c | 63 | 
1 files changed, 63 insertions, 0 deletions
| diff --git a/drivers/core/acpi.c b/drivers/core/acpi.c index ba50d688fef..8ae61575dd3 100644 --- a/drivers/core/acpi.c +++ b/drivers/core/acpi.c @@ -10,9 +10,19 @@  #include <common.h>  #include <dm.h> +#include <log.h>  #include <dm/acpi.h> +#include <dm/device-internal.h>  #include <dm/root.h> +/* Type of method to call */ +enum method_t { +	METHOD_WRITE_TABLES, +}; + +/* Prototype for all methods */ +typedef int (*acpi_method)(const struct udevice *dev, struct acpi_ctx *ctx); +  int acpi_copy_name(char *out_name, const char *name)  {  	strncpy(out_name, name, ACPI_NAME_LEN); @@ -31,3 +41,56 @@ int acpi_get_name(const struct udevice *dev, char *out_name)  	return -ENOSYS;  } + +acpi_method acpi_get_method(struct udevice *dev, enum method_t method) +{ +	struct acpi_ops *aops; + +	aops = device_get_acpi_ops(dev); +	if (aops) { +		switch (method) { +		case METHOD_WRITE_TABLES: +			return aops->write_tables; +		} +	} + +	return NULL; +} + +int acpi_recurse_method(struct acpi_ctx *ctx, struct udevice *parent, +			enum method_t method) +{ +	struct udevice *dev; +	acpi_method func; +	int ret; + +	func = acpi_get_method(parent, method); +	if (func) { +		log_debug("\n"); +		log_debug("- %s %p\n", parent->name, func); +		ret = device_ofdata_to_platdata(parent); +		if (ret) +			return log_msg_ret("ofdata", ret); +		ret = func(parent, ctx); +		if (ret) +			return log_msg_ret("func", ret); +	} +	device_foreach_child(dev, parent) { +		ret = acpi_recurse_method(ctx, dev, method); +		if (ret) +			return log_msg_ret("recurse", ret); +	} + +	return 0; +} + +int acpi_write_dev_tables(struct acpi_ctx *ctx) +{ +	int ret; + +	log_debug("Writing device tables\n"); +	ret = acpi_recurse_method(ctx, dm_root(), METHOD_WRITE_TABLES); +	log_debug("Writing finished, err=%d\n", ret); + +	return ret; +} | 
