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
parent
d72e90f33a
commit
977d5ad39f
|
@ -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 *
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue