1
0
Fork 0

ACPI: Convert ACPI reference args to generic fwnode reference args

Convert all users of struct acpi_reference_args to more generic
fwnode_reference_args. This will

 1) avoid an ACPI specific references to device nodes with integer
    arguments as well as

 2) allow making references to nodes other than device nodes in ACPI.

As a by-product, convert the fwnode interger arguments to u64. The
arguments were 64-bit integers on ACPI but the fwnode arguments were
just 32-bit.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
hifive-unleashed-5.1
Sakari Ailus 2018-07-17 17:19:11 +03:00 committed by Rafael J. Wysocki
parent d72e90f33a
commit 977d5ad39f
9 changed files with 43 additions and 55 deletions

View File

@ -579,7 +579,7 @@ static int acpi_data_get_property_array(const struct acpi_device_data *data,
*/ */
int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode, int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
const char *propname, size_t index, size_t num_args, const char *propname, size_t index, size_t num_args,
struct acpi_reference_args *args) struct fwnode_reference_args *args)
{ {
const union acpi_object *element, *end; const union acpi_object *element, *end;
const union acpi_object *obj; const union acpi_object *obj;
@ -607,7 +607,7 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
if (ret) if (ret)
return ret == -ENODEV ? -EINVAL : ret; return ret == -ENODEV ? -EINVAL : ret;
args->adev = device; args->fwnode = acpi_fwnode_handle(device);
args->nargs = 0; args->nargs = 0;
return 0; return 0;
} }
@ -653,11 +653,11 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
return -EINVAL; return -EINVAL;
} }
if (nargs > MAX_ACPI_REFERENCE_ARGS) if (nargs > NR_FWNODE_REFERENCE_ARGS)
return -EINVAL; return -EINVAL;
if (idx == index) { if (idx == index) {
args->adev = device; args->fwnode = acpi_fwnode_handle(device);
args->nargs = nargs; args->nargs = nargs;
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
args->args[i] = element[i].integer.value; args->args[i] = element[i].integer.value;
@ -1089,7 +1089,7 @@ int acpi_graph_get_remote_endpoint(const struct fwnode_handle *__fwnode,
{ {
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode;
unsigned int port_nr, endpoint_nr; unsigned int port_nr, endpoint_nr;
struct acpi_reference_args args; struct fwnode_reference_args args;
int ret; int ret;
memset(&args, 0, sizeof(args)); memset(&args, 0, sizeof(args));
@ -1098,6 +1098,10 @@ int acpi_graph_get_remote_endpoint(const struct fwnode_handle *__fwnode,
if (ret) if (ret)
return ret; return ret;
/* Ensure this is a device node. */
if (!is_acpi_device_node(args.fwnode))
return -ENODEV;
/* /*
* Always require two arguments with the reference: port and * Always require two arguments with the reference: port and
* endpoint indices. * endpoint indices.
@ -1105,7 +1109,7 @@ int acpi_graph_get_remote_endpoint(const struct fwnode_handle *__fwnode,
if (args.nargs != 2) if (args.nargs != 2)
return -EPROTO; return -EPROTO;
fwnode = acpi_fwnode_handle(args.adev); fwnode = args.fwnode;
port_nr = args.args[0]; port_nr = args.args[0];
endpoint_nr = args.args[1]; endpoint_nr = args.args[1];
@ -1209,24 +1213,8 @@ acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode,
unsigned int args_count, unsigned int index, unsigned int args_count, unsigned int index,
struct fwnode_reference_args *args) struct fwnode_reference_args *args)
{ {
struct acpi_reference_args acpi_args; return __acpi_node_get_property_reference(fwnode, prop, index,
unsigned int i; args_count, args);
int ret;
ret = __acpi_node_get_property_reference(fwnode, prop, index,
args_count, &acpi_args);
if (ret < 0)
return ret;
if (!args)
return 0;
args->nargs = acpi_args.nargs;
args->fwnode = acpi_fwnode_handle(acpi_args.adev);
for (i = 0; i < NR_FWNODE_REFERENCE_ARGS; i++)
args->args[i] = i < acpi_args.nargs ? acpi_args.args[i] : 0;
return 0;
} }
static struct fwnode_handle * static struct fwnode_handle *

View File

@ -353,7 +353,7 @@ EXPORT_SYMBOL_GPL(devm_acpi_dev_remove_driver_gpios);
static bool acpi_get_driver_gpio_data(struct acpi_device *adev, static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
const char *name, int index, const char *name, int index,
struct acpi_reference_args *args, struct fwnode_reference_args *args,
unsigned int *quirks) unsigned int *quirks)
{ {
const struct acpi_gpio_mapping *gm; const struct acpi_gpio_mapping *gm;
@ -365,7 +365,7 @@ static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
if (!strcmp(name, gm->name) && gm->data && index < gm->size) { if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
const struct acpi_gpio_params *par = gm->data + index; const struct acpi_gpio_params *par = gm->data + index;
args->adev = adev; args->fwnode = acpi_fwnode_handle(adev);
args->args[0] = par->crs_entry_index; args->args[0] = par->crs_entry_index;
args->args[1] = par->line_index; args->args[1] = par->line_index;
args->args[2] = par->active_low; args->args[2] = par->active_low;
@ -528,7 +528,7 @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
const char *propname, int index, const char *propname, int index,
struct acpi_gpio_lookup *lookup) struct acpi_gpio_lookup *lookup)
{ {
struct acpi_reference_args args; struct fwnode_reference_args args;
unsigned int quirks = 0; unsigned int quirks = 0;
int ret; int ret;
@ -549,6 +549,8 @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
* The property was found and resolved, so need to lookup the GPIO based * The property was found and resolved, so need to lookup the GPIO based
* on returned args. * on returned args.
*/ */
if (!to_acpi_device_node(args.fwnode))
return -EINVAL;
if (args.nargs != 3) if (args.nargs != 3)
return -EPROTO; return -EPROTO;
@ -556,8 +558,9 @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
lookup->pin_index = args.args[1]; lookup->pin_index = args.args[1];
lookup->active_low = !!args.args[2]; lookup->active_low = !!args.args[2];
lookup->info.adev = args.adev; lookup->info.adev = to_acpi_device_node(args.fwnode);
lookup->info.quirks = quirks; lookup->info.quirks = quirks;
return 0; return 0;
} }

View File

@ -1435,7 +1435,7 @@ static int hns_roce_v1_reset(struct hns_roce_dev *hr_dev, bool dereset)
} }
fwnode = &dsaf_node->fwnode; fwnode = &dsaf_node->fwnode;
} else if (is_acpi_device_node(dev->fwnode)) { } else if (is_acpi_device_node(dev->fwnode)) {
struct acpi_reference_args args; struct fwnode_reference_args args;
ret = acpi_node_get_property_reference(dev->fwnode, ret = acpi_node_get_property_reference(dev->fwnode,
"dsaf-handle", 0, &args); "dsaf-handle", 0, &args);
@ -1443,7 +1443,7 @@ static int hns_roce_v1_reset(struct hns_roce_dev *hr_dev, bool dereset)
dev_err(dev, "could not find dsaf-handle\n"); dev_err(dev, "could not find dsaf-handle\n");
return ret; return ret;
} }
fwnode = acpi_fwnode_handle(args.adev); fwnode = args.fwnode;
} else { } else {
dev_err(dev, "cannot read data from DT or ACPI\n"); dev_err(dev, "cannot read data from DT or ACPI\n");
return -ENXIO; return -ENXIO;
@ -4835,16 +4835,14 @@ static int hns_roce_get_cfg(struct hns_roce_dev *hr_dev)
continue; continue;
pdev = of_find_device_by_node(net_node); pdev = of_find_device_by_node(net_node);
} else if (is_acpi_device_node(dev->fwnode)) { } else if (is_acpi_device_node(dev->fwnode)) {
struct acpi_reference_args args; struct fwnode_reference_args args;
struct fwnode_handle *fwnode;
ret = acpi_node_get_property_reference(dev->fwnode, ret = acpi_node_get_property_reference(dev->fwnode,
"eth-handle", "eth-handle",
i, &args); i, &args);
if (ret) if (ret)
continue; continue;
fwnode = acpi_fwnode_handle(args.adev); pdev = hns_roce_find_pdev(args.fwnode);
pdev = hns_roce_find_pdev(fwnode);
} else { } else {
dev_err(dev, "cannot read data from DT or ACPI\n"); dev_err(dev, "cannot read data from DT or ACPI\n");
return -ENXIO; return -ENXIO;

View File

@ -739,7 +739,7 @@ static struct fwnode_handle *v4l2_fwnode_reference_get_int_prop(
const char * const *props, unsigned int nprops) const char * const *props, unsigned int nprops)
{ {
struct fwnode_reference_args fwnode_args; struct fwnode_reference_args fwnode_args;
unsigned int *args = fwnode_args.args; u64 *args = fwnode_args.args;
struct fwnode_handle *child; struct fwnode_handle *child;
int ret; int ret;

View File

@ -836,19 +836,19 @@ static void xgene_enet_adjust_link(struct net_device *ndev)
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
static struct acpi_device *acpi_phy_find_device(struct device *dev) static struct acpi_device *acpi_phy_find_device(struct device *dev)
{ {
struct acpi_reference_args args; struct fwnode_reference_args args;
struct fwnode_handle *fw_node; struct fwnode_handle *fw_node;
int status; int status;
fw_node = acpi_fwnode_handle(ACPI_COMPANION(dev)); fw_node = acpi_fwnode_handle(ACPI_COMPANION(dev));
status = acpi_node_get_property_reference(fw_node, "phy-handle", 0, status = acpi_node_get_property_reference(fw_node, "phy-handle", 0,
&args); &args);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status) || !is_acpi_device_node(args.fwnode)) {
dev_dbg(dev, "No matching phy in ACPI table\n"); dev_dbg(dev, "No matching phy in ACPI table\n");
return NULL; return NULL;
} }
return args.adev; return to_acpi_device_node(args.fwnode);
} }
#endif #endif

View File

@ -708,7 +708,7 @@ hns_mac_register_phydev(struct mii_bus *mdio, struct hns_mac_cb *mac_cb,
static int hns_mac_register_phy(struct hns_mac_cb *mac_cb) static int hns_mac_register_phy(struct hns_mac_cb *mac_cb)
{ {
struct acpi_reference_args args; struct fwnode_reference_args args;
struct platform_device *pdev; struct platform_device *pdev;
struct mii_bus *mii_bus; struct mii_bus *mii_bus;
int rc; int rc;
@ -722,13 +722,15 @@ static int hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->fw_port, "mdio-node", 0, &args); mac_cb->fw_port, "mdio-node", 0, &args);
if (rc) if (rc)
return rc; return rc;
if (!is_acpi_device_node(args.fwnode))
return -EINVAL;
addr = hns_mac_phy_parse_addr(mac_cb->dev, mac_cb->fw_port); addr = hns_mac_phy_parse_addr(mac_cb->dev, mac_cb->fw_port);
if (addr < 0) if (addr < 0)
return addr; return addr;
/* dev address in adev */ /* dev address in adev */
pdev = hns_dsaf_find_platform_device(acpi_fwnode_handle(args.adev)); pdev = hns_dsaf_find_platform_device(args.fwnode);
if (!pdev) { if (!pdev) {
dev_err(mac_cb->dev, "mac%d mdio pdev is NULL\n", dev_err(mac_cb->dev, "mac%d mdio pdev is NULL\n",
mac_cb->mac_id); mac_cb->mac_id);

View File

@ -2377,7 +2377,7 @@ static int hns_nic_dev_probe(struct platform_device *pdev)
} }
priv->fwnode = &ae_node->fwnode; priv->fwnode = &ae_node->fwnode;
} else if (is_acpi_node(dev->fwnode)) { } else if (is_acpi_node(dev->fwnode)) {
struct acpi_reference_args args; struct fwnode_reference_args args;
if (acpi_dev_found(hns_enet_acpi_match[0].id)) if (acpi_dev_found(hns_enet_acpi_match[0].id))
priv->enet_ver = AE_VERSION_1; priv->enet_ver = AE_VERSION_1;
@ -2393,7 +2393,11 @@ static int hns_nic_dev_probe(struct platform_device *pdev)
dev_err(dev, "not find ae-handle\n"); dev_err(dev, "not find ae-handle\n");
goto out_read_prop_fail; goto out_read_prop_fail;
} }
priv->fwnode = acpi_fwnode_handle(args.adev); if (!is_acpi_device_node(args.fwnode)) {
ret = -EINVAL;
goto out_read_prop_fail;
}
priv->fwnode = args.fwnode;
} else { } else {
dev_err(dev, "cannot read cfg data from OF or acpi\n"); dev_err(dev, "cannot read cfg data from OF or acpi\n");
return -ENXIO; return -ENXIO;

View File

@ -1058,27 +1058,20 @@ static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)
/* Device properties */ /* Device properties */
#define MAX_ACPI_REFERENCE_ARGS 8
struct acpi_reference_args {
struct acpi_device *adev;
size_t nargs;
u64 args[MAX_ACPI_REFERENCE_ARGS];
};
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
int acpi_dev_get_property(const struct acpi_device *adev, const char *name, int acpi_dev_get_property(const struct acpi_device *adev, const char *name,
acpi_object_type type, const union acpi_object **obj); acpi_object_type type, const union acpi_object **obj);
int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode, int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
const char *name, size_t index, size_t num_args, const char *name, size_t index, size_t num_args,
struct acpi_reference_args *args); struct fwnode_reference_args *args);
static inline int acpi_node_get_property_reference( static inline int acpi_node_get_property_reference(
const struct fwnode_handle *fwnode, const struct fwnode_handle *fwnode,
const char *name, size_t index, const char *name, size_t index,
struct acpi_reference_args *args) struct fwnode_reference_args *args)
{ {
return __acpi_node_get_property_reference(fwnode, name, index, return __acpi_node_get_property_reference(fwnode, name, index,
MAX_ACPI_REFERENCE_ARGS, args); NR_FWNODE_REFERENCE_ARGS, args);
} }
int acpi_node_prop_get(const struct fwnode_handle *fwnode, const char *propname, int acpi_node_prop_get(const struct fwnode_handle *fwnode, const char *propname,
@ -1169,7 +1162,7 @@ static inline int acpi_dev_get_property(struct acpi_device *adev,
static inline int static inline int
__acpi_node_get_property_reference(const struct fwnode_handle *fwnode, __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
const char *name, size_t index, size_t num_args, const char *name, size_t index, size_t num_args,
struct acpi_reference_args *args) struct fwnode_reference_args *args)
{ {
return -ENXIO; return -ENXIO;
} }
@ -1177,7 +1170,7 @@ __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
static inline int static inline int
acpi_node_get_property_reference(const struct fwnode_handle *fwnode, acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
const char *name, size_t index, const char *name, size_t index,
struct acpi_reference_args *args) struct fwnode_reference_args *args)
{ {
return -ENXIO; return -ENXIO;
} }

View File

@ -45,7 +45,7 @@ struct fwnode_endpoint {
struct fwnode_reference_args { struct fwnode_reference_args {
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode;
unsigned int nargs; unsigned int nargs;
unsigned int args[NR_FWNODE_REFERENCE_ARGS]; u64 args[NR_FWNODE_REFERENCE_ARGS];
}; };
/** /**