device property: Move fwnode_connection_find_match() under drivers/base/property.c
The function is now only a helper that searches the connection from device graph and then by checking if the supplied connection identifier matches a property that contains reference. Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Link: https://lore.kernel.org/r/20200907120532.37611-2-heikki.krogerus@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
28d9fdf045
commit
d7cf559039
|
@ -6,7 +6,7 @@ obj-y := component.o core.o bus.o dd.o syscore.o \
|
||||||
cpu.o firmware.o init.o map.o devres.o \
|
cpu.o firmware.o init.o map.o devres.o \
|
||||||
attribute_container.o transport_class.o \
|
attribute_container.o transport_class.o \
|
||||||
topology.o container.o property.o cacheinfo.o \
|
topology.o container.o property.o cacheinfo.o \
|
||||||
devcon.o swnode.o
|
swnode.o
|
||||||
obj-$(CONFIG_DEVTMPFS) += devtmpfs.o
|
obj-$(CONFIG_DEVTMPFS) += devtmpfs.o
|
||||||
obj-y += power/
|
obj-y += power/
|
||||||
obj-$(CONFIG_ISA_BUS_API) += isa.o
|
obj-$(CONFIG_ISA_BUS_API) += isa.o
|
||||||
|
|
|
@ -1,101 +0,0 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
|
||||||
/**
|
|
||||||
* Device connections
|
|
||||||
*
|
|
||||||
* Copyright (C) 2018 Intel Corporation
|
|
||||||
* Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/property.h>
|
|
||||||
|
|
||||||
static void *
|
|
||||||
fwnode_graph_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
|
|
||||||
void *data, devcon_match_fn_t match)
|
|
||||||
{
|
|
||||||
struct fwnode_handle *node;
|
|
||||||
struct fwnode_handle *ep;
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
fwnode_graph_for_each_endpoint(fwnode, ep) {
|
|
||||||
node = fwnode_graph_get_remote_port_parent(ep);
|
|
||||||
if (!fwnode_device_is_available(node))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ret = match(node, con_id, data);
|
|
||||||
fwnode_handle_put(node);
|
|
||||||
if (ret) {
|
|
||||||
fwnode_handle_put(ep);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
fwnode_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
|
|
||||||
void *data, devcon_match_fn_t match)
|
|
||||||
{
|
|
||||||
struct fwnode_handle *node;
|
|
||||||
void *ret;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; ; i++) {
|
|
||||||
node = fwnode_find_reference(fwnode, con_id, i);
|
|
||||||
if (IS_ERR(node))
|
|
||||||
break;
|
|
||||||
|
|
||||||
ret = match(node, NULL, data);
|
|
||||||
fwnode_handle_put(node);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fwnode_connection_find_match - Find connection from a device node
|
|
||||||
* @fwnode: Device node with the connection
|
|
||||||
* @con_id: Identifier for the connection
|
|
||||||
* @data: Data for the match function
|
|
||||||
* @match: Function to check and convert the connection description
|
|
||||||
*
|
|
||||||
* Find a connection with unique identifier @con_id between @fwnode and another
|
|
||||||
* device node. @match will be used to convert the connection description to
|
|
||||||
* data the caller is expecting to be returned.
|
|
||||||
*/
|
|
||||||
void *fwnode_connection_find_match(struct fwnode_handle *fwnode,
|
|
||||||
const char *con_id, void *data,
|
|
||||||
devcon_match_fn_t match)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
if (!fwnode || !match)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
ret = fwnode_graph_devcon_match(fwnode, con_id, data, match);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return fwnode_devcon_match(fwnode, con_id, data, match);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(fwnode_connection_find_match);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* device_connection_find_match - Find physical connection to a device
|
|
||||||
* @dev: Device with the connection
|
|
||||||
* @con_id: Identifier for the connection
|
|
||||||
* @data: Data for the match function
|
|
||||||
* @match: Function to check and convert the connection description
|
|
||||||
*
|
|
||||||
* Find a connection with unique identifier @con_id between @dev and another
|
|
||||||
* device. @match will be used to convert the connection description to data the
|
|
||||||
* caller is expecting to be returned.
|
|
||||||
*/
|
|
||||||
void *device_connection_find_match(struct device *dev, const char *con_id,
|
|
||||||
void *data, devcon_match_fn_t match)
|
|
||||||
{
|
|
||||||
return fwnode_connection_find_match(dev_fwnode(dev), con_id, data, match);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(device_connection_find_match);
|
|
|
@ -1184,3 +1184,76 @@ const void *device_get_match_data(struct device *dev)
|
||||||
return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev);
|
return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(device_get_match_data);
|
EXPORT_SYMBOL_GPL(device_get_match_data);
|
||||||
|
|
||||||
|
static void *
|
||||||
|
fwnode_graph_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
|
||||||
|
void *data, devcon_match_fn_t match)
|
||||||
|
{
|
||||||
|
struct fwnode_handle *node;
|
||||||
|
struct fwnode_handle *ep;
|
||||||
|
void *ret;
|
||||||
|
|
||||||
|
fwnode_graph_for_each_endpoint(fwnode, ep) {
|
||||||
|
node = fwnode_graph_get_remote_port_parent(ep);
|
||||||
|
if (!fwnode_device_is_available(node))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = match(node, con_id, data);
|
||||||
|
fwnode_handle_put(node);
|
||||||
|
if (ret) {
|
||||||
|
fwnode_handle_put(ep);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
fwnode_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
|
||||||
|
void *data, devcon_match_fn_t match)
|
||||||
|
{
|
||||||
|
struct fwnode_handle *node;
|
||||||
|
void *ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; ; i++) {
|
||||||
|
node = fwnode_find_reference(fwnode, con_id, i);
|
||||||
|
if (IS_ERR(node))
|
||||||
|
break;
|
||||||
|
|
||||||
|
ret = match(node, NULL, data);
|
||||||
|
fwnode_handle_put(node);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fwnode_connection_find_match - Find connection from a device node
|
||||||
|
* @fwnode: Device node with the connection
|
||||||
|
* @con_id: Identifier for the connection
|
||||||
|
* @data: Data for the match function
|
||||||
|
* @match: Function to check and convert the connection description
|
||||||
|
*
|
||||||
|
* Find a connection with unique identifier @con_id between @fwnode and another
|
||||||
|
* device node. @match will be used to convert the connection description to
|
||||||
|
* data the caller is expecting to be returned.
|
||||||
|
*/
|
||||||
|
void *fwnode_connection_find_match(struct fwnode_handle *fwnode,
|
||||||
|
const char *con_id, void *data,
|
||||||
|
devcon_match_fn_t match)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
|
||||||
|
if (!fwnode || !match)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ret = fwnode_graph_devcon_match(fwnode, con_id, data, match);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return fwnode_devcon_match(fwnode, con_id, data, match);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(fwnode_connection_find_match);
|
||||||
|
|
|
@ -292,15 +292,6 @@ struct device_dma_parameters {
|
||||||
unsigned long segment_boundary_mask;
|
unsigned long segment_boundary_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void *(*devcon_match_fn_t)(struct fwnode_handle *fwnode, const char *id,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
void *fwnode_connection_find_match(struct fwnode_handle *fwnode,
|
|
||||||
const char *con_id, void *data,
|
|
||||||
devcon_match_fn_t match);
|
|
||||||
void *device_connection_find_match(struct device *dev, const char *con_id,
|
|
||||||
void *data, devcon_match_fn_t match);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum device_link_state - Device link states.
|
* enum device_link_state - Device link states.
|
||||||
* @DL_STATE_NONE: The presence of the drivers is not being tracked.
|
* @DL_STATE_NONE: The presence of the drivers is not being tracked.
|
||||||
|
|
|
@ -418,6 +418,20 @@ fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode,
|
||||||
int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
|
int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
|
||||||
struct fwnode_endpoint *endpoint);
|
struct fwnode_endpoint *endpoint);
|
||||||
|
|
||||||
|
typedef void *(*devcon_match_fn_t)(struct fwnode_handle *fwnode, const char *id,
|
||||||
|
void *data);
|
||||||
|
|
||||||
|
void *fwnode_connection_find_match(struct fwnode_handle *fwnode,
|
||||||
|
const char *con_id, void *data,
|
||||||
|
devcon_match_fn_t match);
|
||||||
|
|
||||||
|
static inline void *device_connection_find_match(struct device *dev,
|
||||||
|
const char *con_id, void *data,
|
||||||
|
devcon_match_fn_t match)
|
||||||
|
{
|
||||||
|
return fwnode_connection_find_match(dev_fwnode(dev), con_id, data, match);
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* Software fwnode support - when HW description is incomplete or missing */
|
/* Software fwnode support - when HW description is incomplete or missing */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue