drm: Use of-graph helpers to loop over endpoints
Convert all drm callers that use of_graph_get_next_endpoint to loop over of-graph endpoints to the newly introduced for_each_endpoint_of_node helper macro. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJVJPGBAAoJEFDCiBxwnmDrsIIP/05ID1FxnfCCb14sF9cnfM3N LzZnLiD4mAUVB8H94BPz9M1Zu8aA06VjUt2Ay9DxXJRUhsil8YHoblHXORyABDH/ E9/HAQkTluA39+rRvzv4fNr4oROMICbWpUGsczQf4cAv8fPheoOudXw2ENa26LbK KMmVwxgqPeDkSCqB/pBb6Nod5rN3m0aOGGAliGK+jb4t5bYx0p7+6VdizmOUR1Ax lUOXZWlB26Z/iEW5aWqSNAafFCqhZmPYiONk/xlReR83z3ZpvPYbeiKqh9JZ5u9F YxNLkIRbe73SX9Ss6hnorg17S/ONXE4wDovkUueFxKTCE6l8eUM6gBzo5+0X6Xgz iAU/aghflS28qmqWEN7uZvEh643A0TvKB2KRVURsS+3INuzn3+RzLRWDfHnUvF4t EGo9WjjpHTw5PRaE7qvk6VLoSx1ygbPnzSXhPiDqbuaeLoOJuZEVnknOwVNoEzoh +A3LiJJFmxWql+uM4QSCgjvpC4b9oscCAxS07Rt8BTIGZkkW8lyDDbkb4rdrosaN MfStFSvDSX/VJOXVcJgJ3Xq1nhusuDnaj8G4PASQGb6IXTbHtauVlLLmjJFgTC94 xEr0EObJIvoNx1JeJw/8IzMWuQSTs3O2waderNyo6cyN6ycDsKtCUPsBv8iYHm+C 3u6YWSyPXsEi8jcqa9SX =la2O -----END PGP SIGNATURE----- Merge tag 'of-graph-drm-2015-04-08' of git://git.pengutronix.de/git/pza/linux into drm-next drm: Use of-graph helpers to loop over endpoints Convert all drm callers that use of_graph_get_next_endpoint to loop over of-graph endpoints to the newly introduced for_each_endpoint_of_node helper macro. * tag 'of-graph-drm-2015-04-08' of git://git.pengutronix.de/git/pza/linux: drm/rockchip: use for_each_endpoint_of_node macro, drop endpoint reference on break drm/rcar-du: use for_each_endpoint_of_node macro drm/imx: use for_each_endpoint_of_node macro in imx_drm_encoder_get_mux_id drm: use for_each_endpoint_of_node macro in drm_of_find_possible_crtcs of: Explicitly include linux/types.h in of_graph.h dt-bindings: brcm: rationalize Broadcom documentation naming of/unittest: replace 'selftest' with 'unittest' Documentation: rename of_selftest.txt to of_unittest.txt Documentation: update the of_selftest.txt dt: OF_UNITTEST make dependency broken MAINTAINERS: Pantelis Antoniou device tree overlay maintainer of: Add of_graph_get_port_by_id function of: Add for_each_endpoint_of_node helper macro of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint
This commit is contained in:
commit
bb1dc08c94
|
@ -1,60 +1,60 @@
|
||||||
1) OF selftest platform device
|
1) OF unittest platform device
|
||||||
|
|
||||||
** selftest
|
** unittest
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: must be "selftest"
|
- compatible: must be "unittest"
|
||||||
|
|
||||||
All other properties are optional.
|
All other properties are optional.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
selftest {
|
unittest {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
2) OF selftest i2c adapter platform device
|
2) OF unittest i2c adapter platform device
|
||||||
|
|
||||||
** platform device unittest adapter
|
** platform device unittest adapter
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: must be selftest-i2c-bus
|
- compatible: must be unittest-i2c-bus
|
||||||
|
|
||||||
Children nodes contain selftest i2c devices.
|
Children nodes contain unittest i2c devices.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
selftest-i2c-bus {
|
unittest-i2c-bus {
|
||||||
compatible = "selftest-i2c-bus";
|
compatible = "unittest-i2c-bus";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
3) OF selftest i2c device
|
3) OF unittest i2c device
|
||||||
|
|
||||||
** I2C selftest device
|
** I2C unittest device
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: must be selftest-i2c-dev
|
- compatible: must be unittest-i2c-dev
|
||||||
|
|
||||||
All other properties are optional
|
All other properties are optional
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
selftest-i2c-dev {
|
unittest-i2c-dev {
|
||||||
compatible = "selftest-i2c-dev";
|
compatible = "unittest-i2c-dev";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
4) OF selftest i2c mux device
|
4) OF unittest i2c mux device
|
||||||
|
|
||||||
** I2C selftest mux
|
** I2C unittest mux
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: must be selftest-i2c-mux
|
- compatible: must be unittest-i2c-mux
|
||||||
|
|
||||||
Children nodes contain selftest i2c bus nodes per channel.
|
Children nodes contain unittest i2c bus nodes per channel.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
selftest-i2c-mux {
|
unittest-i2c-mux {
|
||||||
compatible = "selftest-i2c-mux";
|
compatible = "unittest-i2c-mux";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
@ -64,7 +64,7 @@ Example:
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
i2c-dev {
|
i2c-dev {
|
||||||
reg = <8>;
|
reg = <8>;
|
||||||
compatible = "selftest-i2c-dev";
|
compatible = "unittest-i2c-dev";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
Open Firmware Device Tree Selftest
|
Open Firmware Device Tree Unittest
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
Author: Gaurav Minocha <gaurav.minocha.os@gmail.com>
|
Author: Gaurav Minocha <gaurav.minocha.os@gmail.com>
|
||||||
|
|
||||||
1. Introduction
|
1. Introduction
|
||||||
|
|
||||||
This document explains how the test data required for executing OF selftest
|
This document explains how the test data required for executing OF unittest
|
||||||
is attached to the live tree dynamically, independent of the machine's
|
is attached to the live tree dynamically, independent of the machine's
|
||||||
architecture.
|
architecture.
|
||||||
|
|
||||||
|
@ -22,31 +22,31 @@ most of the device drivers in various use cases.
|
||||||
|
|
||||||
2. Test-data
|
2. Test-data
|
||||||
|
|
||||||
The Device Tree Source file (drivers/of/testcase-data/testcases.dts) contains
|
The Device Tree Source file (drivers/of/unittest-data/testcases.dts) contains
|
||||||
the test data required for executing the unit tests automated in
|
the test data required for executing the unit tests automated in
|
||||||
drivers/of/selftests.c. Currently, following Device Tree Source Include files
|
drivers/of/unittest.c. Currently, following Device Tree Source Include files
|
||||||
(.dtsi) are included in testcase.dts:
|
(.dtsi) are included in testcases.dts:
|
||||||
|
|
||||||
drivers/of/testcase-data/tests-interrupts.dtsi
|
drivers/of/unittest-data/tests-interrupts.dtsi
|
||||||
drivers/of/testcase-data/tests-platform.dtsi
|
drivers/of/unittest-data/tests-platform.dtsi
|
||||||
drivers/of/testcase-data/tests-phandle.dtsi
|
drivers/of/unittest-data/tests-phandle.dtsi
|
||||||
drivers/of/testcase-data/tests-match.dtsi
|
drivers/of/unittest-data/tests-match.dtsi
|
||||||
|
|
||||||
When the kernel is build with OF_SELFTEST enabled, then the following make rule
|
When the kernel is build with OF_SELFTEST enabled, then the following make rule
|
||||||
|
|
||||||
$(obj)/%.dtb: $(src)/%.dts FORCE
|
$(obj)/%.dtb: $(src)/%.dts FORCE
|
||||||
$(call if_changed_dep, dtc)
|
$(call if_changed_dep, dtc)
|
||||||
|
|
||||||
is used to compile the DT source file (testcase.dts) into a binary blob
|
is used to compile the DT source file (testcases.dts) into a binary blob
|
||||||
(testcase.dtb), also referred as flattened DT.
|
(testcases.dtb), also referred as flattened DT.
|
||||||
|
|
||||||
After that, using the following rule the binary blob above is wrapped as an
|
After that, using the following rule the binary blob above is wrapped as an
|
||||||
assembly file (testcase.dtb.S).
|
assembly file (testcases.dtb.S).
|
||||||
|
|
||||||
$(obj)/%.dtb.S: $(obj)/%.dtb
|
$(obj)/%.dtb.S: $(obj)/%.dtb
|
||||||
$(call cmd, dt_S_dtb)
|
$(call cmd, dt_S_dtb)
|
||||||
|
|
||||||
The assembly file is compiled into an object file (testcase.dtb.o), and is
|
The assembly file is compiled into an object file (testcases.dtb.o), and is
|
||||||
linked into the kernel image.
|
linked into the kernel image.
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ child11 -> sibling12 -> sibling13 -> sibling14 -> null
|
||||||
Figure 1: Generic structure of un-flattened device tree
|
Figure 1: Generic structure of un-flattened device tree
|
||||||
|
|
||||||
|
|
||||||
Before executing OF selftest, it is required to attach the test data to
|
Before executing OF unittest, it is required to attach the test data to
|
||||||
machine's device tree (if present). So, when selftest_data_add() is called,
|
machine's device tree (if present). So, when selftest_data_add() is called,
|
||||||
at first it reads the flattened device tree data linked into the kernel image
|
at first it reads the flattened device tree data linked into the kernel image
|
||||||
via the following kernel symbols:
|
via the following kernel symbols:
|
|
@ -7192,6 +7192,15 @@ F: Documentation/devicetree/
|
||||||
F: arch/*/boot/dts/
|
F: arch/*/boot/dts/
|
||||||
F: include/dt-bindings/
|
F: include/dt-bindings/
|
||||||
|
|
||||||
|
OPEN FIRMWARE AND DEVICE TREE OVERLAYS
|
||||||
|
M: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
|
||||||
|
L: devicetree@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/dynamic-resolution-notes.txt
|
||||||
|
F: Documentation/devicetree/overlay-notes.txt
|
||||||
|
F: drivers/of/overlay.c
|
||||||
|
F: drivers/of/resolver.c
|
||||||
|
|
||||||
OPENRISC ARCHITECTURE
|
OPENRISC ARCHITECTURE
|
||||||
M: Jonas Bonn <jonas@southpole.se>
|
M: Jonas Bonn <jonas@southpole.se>
|
||||||
W: http://openrisc.net
|
W: http://openrisc.net
|
||||||
|
|
|
@ -52,15 +52,6 @@ of_coresight_get_endpoint_device(struct device_node *endpoint)
|
||||||
endpoint, of_dev_node_match);
|
endpoint, of_dev_node_match);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct device_node *of_get_coresight_endpoint(
|
|
||||||
const struct device_node *parent, struct device_node *prev)
|
|
||||||
{
|
|
||||||
struct device_node *node = of_graph_get_next_endpoint(parent, prev);
|
|
||||||
|
|
||||||
of_node_put(prev);
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void of_coresight_get_ports(struct device_node *node,
|
static void of_coresight_get_ports(struct device_node *node,
|
||||||
int *nr_inport, int *nr_outport)
|
int *nr_inport, int *nr_outport)
|
||||||
{
|
{
|
||||||
|
@ -68,7 +59,7 @@ static void of_coresight_get_ports(struct device_node *node,
|
||||||
int in = 0, out = 0;
|
int in = 0, out = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ep = of_get_coresight_endpoint(node, ep);
|
ep = of_graph_get_next_endpoint(node, ep);
|
||||||
if (!ep)
|
if (!ep)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -140,7 +131,7 @@ struct coresight_platform_data *of_get_coresight_platform_data(
|
||||||
/* Iterate through each port to discover topology */
|
/* Iterate through each port to discover topology */
|
||||||
do {
|
do {
|
||||||
/* Get a handle on a port */
|
/* Get a handle on a port */
|
||||||
ep = of_get_coresight_endpoint(node, ep);
|
ep = of_graph_get_next_endpoint(node, ep);
|
||||||
if (!ep)
|
if (!ep)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -43,14 +43,10 @@ static uint32_t drm_crtc_port_mask(struct drm_device *dev,
|
||||||
uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
|
uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
|
||||||
struct device_node *port)
|
struct device_node *port)
|
||||||
{
|
{
|
||||||
struct device_node *remote_port, *ep = NULL;
|
struct device_node *remote_port, *ep;
|
||||||
uint32_t possible_crtcs = 0;
|
uint32_t possible_crtcs = 0;
|
||||||
|
|
||||||
do {
|
for_each_endpoint_of_node(port, ep) {
|
||||||
ep = of_graph_get_next_endpoint(port, ep);
|
|
||||||
if (!ep)
|
|
||||||
break;
|
|
||||||
|
|
||||||
remote_port = of_graph_get_remote_port(ep);
|
remote_port = of_graph_get_remote_port(ep);
|
||||||
if (!remote_port) {
|
if (!remote_port) {
|
||||||
of_node_put(ep);
|
of_node_put(ep);
|
||||||
|
@ -60,7 +56,7 @@ uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
|
||||||
possible_crtcs |= drm_crtc_port_mask(dev, remote_port);
|
possible_crtcs |= drm_crtc_port_mask(dev, remote_port);
|
||||||
|
|
||||||
of_node_put(remote_port);
|
of_node_put(remote_port);
|
||||||
} while (1);
|
}
|
||||||
|
|
||||||
return possible_crtcs;
|
return possible_crtcs;
|
||||||
}
|
}
|
||||||
|
|
|
@ -431,15 +431,6 @@ int imx_drm_encoder_parse_of(struct drm_device *drm,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(imx_drm_encoder_parse_of);
|
EXPORT_SYMBOL_GPL(imx_drm_encoder_parse_of);
|
||||||
|
|
||||||
static struct device_node *imx_drm_of_get_next_endpoint(
|
|
||||||
const struct device_node *parent, struct device_node *prev)
|
|
||||||
{
|
|
||||||
struct device_node *node = of_graph_get_next_endpoint(parent, prev);
|
|
||||||
|
|
||||||
of_node_put(prev);
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @node: device tree node containing encoder input ports
|
* @node: device tree node containing encoder input ports
|
||||||
* @encoder: drm_encoder
|
* @encoder: drm_encoder
|
||||||
|
@ -448,7 +439,7 @@ int imx_drm_encoder_get_mux_id(struct device_node *node,
|
||||||
struct drm_encoder *encoder)
|
struct drm_encoder *encoder)
|
||||||
{
|
{
|
||||||
struct imx_drm_crtc *imx_crtc = imx_drm_find_crtc(encoder->crtc);
|
struct imx_drm_crtc *imx_crtc = imx_drm_find_crtc(encoder->crtc);
|
||||||
struct device_node *ep = NULL;
|
struct device_node *ep;
|
||||||
struct of_endpoint endpoint;
|
struct of_endpoint endpoint;
|
||||||
struct device_node *port;
|
struct device_node *port;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -456,18 +447,15 @@ int imx_drm_encoder_get_mux_id(struct device_node *node,
|
||||||
if (!node || !imx_crtc)
|
if (!node || !imx_crtc)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
do {
|
for_each_endpoint_of_node(node, ep) {
|
||||||
ep = imx_drm_of_get_next_endpoint(node, ep);
|
|
||||||
if (!ep)
|
|
||||||
break;
|
|
||||||
|
|
||||||
port = of_graph_get_remote_port(ep);
|
port = of_graph_get_remote_port(ep);
|
||||||
of_node_put(port);
|
of_node_put(port);
|
||||||
if (port == imx_crtc->crtc->port) {
|
if (port == imx_crtc->crtc->port) {
|
||||||
ret = of_graph_parse_endpoint(ep, &endpoint);
|
ret = of_graph_parse_endpoint(ep, &endpoint);
|
||||||
|
of_node_put(ep);
|
||||||
return ret ? ret : endpoint.port;
|
return ret ? ret : endpoint.port;
|
||||||
}
|
}
|
||||||
} while (ep);
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -509,7 +509,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
|
||||||
enum rcar_du_encoder_type enc_type = RCAR_DU_ENCODER_NONE;
|
enum rcar_du_encoder_type enc_type = RCAR_DU_ENCODER_NONE;
|
||||||
struct device_node *connector = NULL;
|
struct device_node *connector = NULL;
|
||||||
struct device_node *encoder = NULL;
|
struct device_node *encoder = NULL;
|
||||||
struct device_node *prev = NULL;
|
struct device_node *ep_node = NULL;
|
||||||
struct device_node *entity_ep_node;
|
struct device_node *entity_ep_node;
|
||||||
struct device_node *entity;
|
struct device_node *entity;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -527,16 +527,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
|
||||||
|
|
||||||
entity_ep_node = of_parse_phandle(ep->local_node, "remote-endpoint", 0);
|
entity_ep_node = of_parse_phandle(ep->local_node, "remote-endpoint", 0);
|
||||||
|
|
||||||
while (1) {
|
for_each_endpoint_of_node(entity, ep_node) {
|
||||||
struct device_node *ep_node;
|
|
||||||
|
|
||||||
ep_node = of_graph_get_next_endpoint(entity, prev);
|
|
||||||
of_node_put(prev);
|
|
||||||
prev = ep_node;
|
|
||||||
|
|
||||||
if (!ep_node)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (ep_node == entity_ep_node)
|
if (ep_node == entity_ep_node)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -603,27 +594,19 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
|
||||||
static int rcar_du_encoders_init(struct rcar_du_device *rcdu)
|
static int rcar_du_encoders_init(struct rcar_du_device *rcdu)
|
||||||
{
|
{
|
||||||
struct device_node *np = rcdu->dev->of_node;
|
struct device_node *np = rcdu->dev->of_node;
|
||||||
struct device_node *prev = NULL;
|
struct device_node *ep_node;
|
||||||
unsigned int num_encoders = 0;
|
unsigned int num_encoders = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Iterate over the endpoints and create one encoder for each output
|
* Iterate over the endpoints and create one encoder for each output
|
||||||
* pipeline.
|
* pipeline.
|
||||||
*/
|
*/
|
||||||
while (1) {
|
for_each_endpoint_of_node(np, ep_node) {
|
||||||
struct device_node *ep_node;
|
|
||||||
enum rcar_du_output output;
|
enum rcar_du_output output;
|
||||||
struct of_endpoint ep;
|
struct of_endpoint ep;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ep_node = of_graph_get_next_endpoint(np, prev);
|
|
||||||
of_node_put(prev);
|
|
||||||
prev = ep_node;
|
|
||||||
|
|
||||||
if (ep_node == NULL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
ret = of_graph_parse_endpoint(ep_node, &ep);
|
ret = of_graph_parse_endpoint(ep_node, &ep);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
of_node_put(ep_node);
|
of_node_put(ep_node);
|
||||||
|
|
|
@ -385,7 +385,7 @@ static const struct dev_pm_ops rockchip_drm_pm_ops = {
|
||||||
int rockchip_drm_encoder_get_mux_id(struct device_node *node,
|
int rockchip_drm_encoder_get_mux_id(struct device_node *node,
|
||||||
struct drm_encoder *encoder)
|
struct drm_encoder *encoder)
|
||||||
{
|
{
|
||||||
struct device_node *ep = NULL;
|
struct device_node *ep;
|
||||||
struct drm_crtc *crtc = encoder->crtc;
|
struct drm_crtc *crtc = encoder->crtc;
|
||||||
struct of_endpoint endpoint;
|
struct of_endpoint endpoint;
|
||||||
struct device_node *port;
|
struct device_node *port;
|
||||||
|
@ -394,18 +394,15 @@ int rockchip_drm_encoder_get_mux_id(struct device_node *node,
|
||||||
if (!node || !crtc)
|
if (!node || !crtc)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
do {
|
for_each_endpoint_of_node(node, ep) {
|
||||||
ep = of_graph_get_next_endpoint(node, ep);
|
|
||||||
if (!ep)
|
|
||||||
break;
|
|
||||||
|
|
||||||
port = of_graph_get_remote_port(ep);
|
port = of_graph_get_remote_port(ep);
|
||||||
of_node_put(port);
|
of_node_put(port);
|
||||||
if (port == crtc->port) {
|
if (port == crtc->port) {
|
||||||
ret = of_graph_parse_endpoint(ep, &endpoint);
|
ret = of_graph_parse_endpoint(ep, &endpoint);
|
||||||
|
of_node_put(ep);
|
||||||
return ret ?: endpoint.id;
|
return ret ?: endpoint.id;
|
||||||
}
|
}
|
||||||
} while (ep);
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2504,7 +2504,6 @@ vpfe_get_pdata(struct platform_device *pdev)
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
pdata->asd[i]->match_type = V4L2_ASYNC_MATCH_OF;
|
pdata->asd[i]->match_type = V4L2_ASYNC_MATCH_OF;
|
||||||
pdata->asd[i]->match.of.node = rem;
|
pdata->asd[i]->match.of.node = rem;
|
||||||
of_node_put(endpoint);
|
|
||||||
of_node_put(rem);
|
of_node_put(rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1694,7 +1694,6 @@ static void scan_of_host(struct soc_camera_host *ici)
|
||||||
if (!i)
|
if (!i)
|
||||||
soc_of_bind(ici, epn, ren->parent);
|
soc_of_bind(ici, epn, ren->parent);
|
||||||
|
|
||||||
of_node_put(epn);
|
|
||||||
of_node_put(ren);
|
of_node_put(ren);
|
||||||
|
|
||||||
if (i) {
|
if (i) {
|
||||||
|
@ -1702,6 +1701,8 @@ static void scan_of_host(struct soc_camera_host *ici)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
of_node_put(epn);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -6,8 +6,7 @@ obj-$(CONFIG_OF_PROMTREE) += pdt.o
|
||||||
obj-$(CONFIG_OF_ADDRESS) += address.o
|
obj-$(CONFIG_OF_ADDRESS) += address.o
|
||||||
obj-$(CONFIG_OF_IRQ) += irq.o
|
obj-$(CONFIG_OF_IRQ) += irq.o
|
||||||
obj-$(CONFIG_OF_NET) += of_net.o
|
obj-$(CONFIG_OF_NET) += of_net.o
|
||||||
obj-$(CONFIG_OF_UNITTEST) += of_unittest.o
|
obj-$(CONFIG_OF_UNITTEST) += unittest.o
|
||||||
of_unittest-objs := unittest.o unittest-data/testcases.dtb.o
|
|
||||||
obj-$(CONFIG_OF_MDIO) += of_mdio.o
|
obj-$(CONFIG_OF_MDIO) += of_mdio.o
|
||||||
obj-$(CONFIG_OF_PCI) += of_pci.o
|
obj-$(CONFIG_OF_PCI) += of_pci.o
|
||||||
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
|
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
|
||||||
|
@ -16,5 +15,7 @@ obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o
|
||||||
obj-$(CONFIG_OF_RESOLVE) += resolver.o
|
obj-$(CONFIG_OF_RESOLVE) += resolver.o
|
||||||
obj-$(CONFIG_OF_OVERLAY) += overlay.o
|
obj-$(CONFIG_OF_OVERLAY) += overlay.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_OF_UNITTEST) += unittest-data/
|
||||||
|
|
||||||
CFLAGS_fdt.o = -I$(src)/../../scripts/dtc/libfdt
|
CFLAGS_fdt.o = -I$(src)/../../scripts/dtc/libfdt
|
||||||
CFLAGS_fdt_address.o = -I$(src)/../../scripts/dtc/libfdt
|
CFLAGS_fdt_address.o = -I$(src)/../../scripts/dtc/libfdt
|
||||||
|
|
|
@ -2082,14 +2082,45 @@ int of_graph_parse_endpoint(const struct device_node *node,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_graph_parse_endpoint);
|
EXPORT_SYMBOL(of_graph_parse_endpoint);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* of_graph_get_port_by_id() - get the port matching a given id
|
||||||
|
* @parent: pointer to the parent device node
|
||||||
|
* @id: id of the port
|
||||||
|
*
|
||||||
|
* Return: A 'port' node pointer with refcount incremented. The caller
|
||||||
|
* has to use of_node_put() on it when done.
|
||||||
|
*/
|
||||||
|
struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id)
|
||||||
|
{
|
||||||
|
struct device_node *node, *port;
|
||||||
|
|
||||||
|
node = of_get_child_by_name(parent, "ports");
|
||||||
|
if (node)
|
||||||
|
parent = node;
|
||||||
|
|
||||||
|
for_each_child_of_node(parent, port) {
|
||||||
|
u32 port_id = 0;
|
||||||
|
|
||||||
|
if (of_node_cmp(port->name, "port") != 0)
|
||||||
|
continue;
|
||||||
|
of_property_read_u32(port, "reg", &port_id);
|
||||||
|
if (id == port_id)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
of_node_put(node);
|
||||||
|
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(of_graph_get_port_by_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* of_graph_get_next_endpoint() - get next endpoint node
|
* of_graph_get_next_endpoint() - get next endpoint node
|
||||||
* @parent: pointer to the parent device node
|
* @parent: pointer to the parent device node
|
||||||
* @prev: previous endpoint node, or NULL to get first
|
* @prev: previous endpoint node, or NULL to get first
|
||||||
*
|
*
|
||||||
* Return: An 'endpoint' node pointer with refcount incremented. Refcount
|
* Return: An 'endpoint' node pointer with refcount incremented. Refcount
|
||||||
* of the passed @prev node is not decremented, the caller have to use
|
* of the passed @prev node is decremented.
|
||||||
* of_node_put() on it when done.
|
|
||||||
*/
|
*/
|
||||||
struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
|
struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
|
||||||
struct device_node *prev)
|
struct device_node *prev)
|
||||||
|
@ -2125,12 +2156,6 @@ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
|
||||||
if (WARN_ONCE(!port, "%s(): endpoint %s has no parent node\n",
|
if (WARN_ONCE(!port, "%s(): endpoint %s has no parent node\n",
|
||||||
__func__, prev->full_name))
|
__func__, prev->full_name))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/*
|
|
||||||
* Avoid dropping prev node refcount to 0 when getting the next
|
|
||||||
* child below.
|
|
||||||
*/
|
|
||||||
of_node_get(prev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
2
drivers/of/unittest-data/.gitignore
vendored
Normal file
2
drivers/of/unittest-data/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
testcases.dtb
|
||||||
|
testcases.dtb.S
|
7
drivers/of/unittest-data/Makefile
Normal file
7
drivers/of/unittest-data/Makefile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
obj-y += testcases.dtb.o
|
||||||
|
|
||||||
|
targets += testcases.dtb testcases.dtb.S
|
||||||
|
|
||||||
|
.SECONDARY: \
|
||||||
|
$(obj)/testcases.dtb.S \
|
||||||
|
$(obj)/testcases.dtb
|
|
@ -4,94 +4,94 @@
|
||||||
overlay-node {
|
overlay-node {
|
||||||
|
|
||||||
/* test bus */
|
/* test bus */
|
||||||
selftestbus: test-bus {
|
unittestbus: test-bus {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
selftest100: test-selftest100 {
|
unittest100: test-unittest100 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <100>;
|
reg = <100>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest101: test-selftest101 {
|
unittest101: test-unittest101 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <101>;
|
reg = <101>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest0: test-selftest0 {
|
unittest0: test-unittest0 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest1: test-selftest1 {
|
unittest1: test-unittest1 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest2: test-selftest2 {
|
unittest2: test-unittest2 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <2>;
|
reg = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest3: test-selftest3 {
|
unittest3: test-unittest3 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <3>;
|
reg = <3>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest5: test-selftest5 {
|
unittest5: test-unittest5 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <5>;
|
reg = <5>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest6: test-selftest6 {
|
unittest6: test-unittest6 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <6>;
|
reg = <6>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest7: test-selftest7 {
|
unittest7: test-unittest7 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <7>;
|
reg = <7>;
|
||||||
};
|
};
|
||||||
|
|
||||||
selftest8: test-selftest8 {
|
unittest8: test-unittest8 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <8>;
|
reg = <8>;
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c-test-bus {
|
i2c-test-bus {
|
||||||
compatible = "selftest-i2c-bus";
|
compatible = "unittest-i2c-bus";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <50>;
|
reg = <50>;
|
||||||
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
test-selftest12 {
|
test-unittest12 {
|
||||||
reg = <8>;
|
reg = <8>;
|
||||||
compatible = "selftest-i2c-dev";
|
compatible = "unittest-i2c-dev";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
test-selftest13 {
|
test-unittest13 {
|
||||||
reg = <9>;
|
reg = <9>;
|
||||||
compatible = "selftest-i2c-dev";
|
compatible = "unittest-i2c-dev";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
test-selftest14 {
|
test-unittest14 {
|
||||||
reg = <10>;
|
reg = <10>;
|
||||||
compatible = "selftest-i2c-mux";
|
compatible = "unittest-i2c-mux";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -104,7 +104,7 @@
|
||||||
|
|
||||||
test-mux-dev {
|
test-mux-dev {
|
||||||
reg = <32>;
|
reg = <32>;
|
||||||
compatible = "selftest-i2c-dev";
|
compatible = "unittest-i2c-dev";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -116,7 +116,7 @@
|
||||||
/* test enable using absolute target path */
|
/* test enable using absolute target path */
|
||||||
overlay0 {
|
overlay0 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/test-selftest0";
|
target-path = "/testcase-data/overlay-node/test-bus/test-unittest0";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -126,7 +126,7 @@
|
||||||
/* test disable using absolute target path */
|
/* test disable using absolute target path */
|
||||||
overlay1 {
|
overlay1 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/test-selftest1";
|
target-path = "/testcase-data/overlay-node/test-bus/test-unittest1";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -136,7 +136,7 @@
|
||||||
/* test enable using label */
|
/* test enable using label */
|
||||||
overlay2 {
|
overlay2 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target = <&selftest2>;
|
target = <&unittest2>;
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -146,7 +146,7 @@
|
||||||
/* test disable using label */
|
/* test disable using label */
|
||||||
overlay3 {
|
overlay3 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target = <&selftest3>;
|
target = <&unittest3>;
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -156,15 +156,15 @@
|
||||||
/* test insertion of a full node */
|
/* test insertion of a full node */
|
||||||
overlay4 {
|
overlay4 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target = <&selftestbus>;
|
target = <&unittestbus>;
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
|
|
||||||
/* suppress DTC warning */
|
/* suppress DTC warning */
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
test-selftest4 {
|
test-unittest4 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <4>;
|
reg = <4>;
|
||||||
};
|
};
|
||||||
|
@ -175,7 +175,7 @@
|
||||||
/* test overlay apply revert */
|
/* test overlay apply revert */
|
||||||
overlay5 {
|
overlay5 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/test-selftest5";
|
target-path = "/testcase-data/overlay-node/test-bus/test-unittest5";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -185,7 +185,7 @@
|
||||||
/* test overlays application and removal in sequence */
|
/* test overlays application and removal in sequence */
|
||||||
overlay6 {
|
overlay6 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/test-selftest6";
|
target-path = "/testcase-data/overlay-node/test-bus/test-unittest6";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -193,7 +193,7 @@
|
||||||
};
|
};
|
||||||
overlay7 {
|
overlay7 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/test-selftest7";
|
target-path = "/testcase-data/overlay-node/test-bus/test-unittest7";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -203,7 +203,7 @@
|
||||||
/* test overlays application and removal in bad sequence */
|
/* test overlays application and removal in bad sequence */
|
||||||
overlay8 {
|
overlay8 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/test-selftest8";
|
target-path = "/testcase-data/overlay-node/test-bus/test-unittest8";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -211,7 +211,7 @@
|
||||||
};
|
};
|
||||||
overlay9 {
|
overlay9 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/test-selftest8";
|
target-path = "/testcase-data/overlay-node/test-bus/test-unittest8";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
property-foo = "bar";
|
property-foo = "bar";
|
||||||
};
|
};
|
||||||
|
@ -227,16 +227,16 @@
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
test-selftest10 {
|
test-unittest10 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <10>;
|
reg = <10>;
|
||||||
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
test-selftest101 {
|
test-unittest101 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
};
|
};
|
||||||
|
@ -255,16 +255,16 @@
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
test-selftest11 {
|
test-unittest11 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <11>;
|
reg = <11>;
|
||||||
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
test-selftest111 {
|
test-unittest111 {
|
||||||
compatible = "selftest";
|
compatible = "unittest";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
};
|
};
|
||||||
|
@ -277,7 +277,7 @@
|
||||||
/* test enable using absolute target path (i2c) */
|
/* test enable using absolute target path (i2c) */
|
||||||
overlay12 {
|
overlay12 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-selftest12";
|
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest12";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -287,7 +287,7 @@
|
||||||
/* test disable using absolute target path (i2c) */
|
/* test disable using absolute target path (i2c) */
|
||||||
overlay13 {
|
overlay13 {
|
||||||
fragment@0 {
|
fragment@0 {
|
||||||
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-selftest13";
|
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest13";
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -301,9 +301,9 @@
|
||||||
__overlay__ {
|
__overlay__ {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
test-selftest15 {
|
test-unittest15 {
|
||||||
reg = <11>;
|
reg = <11>;
|
||||||
compatible = "selftest-i2c-mux";
|
compatible = "unittest-i2c-mux";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -316,7 +316,7 @@
|
||||||
|
|
||||||
test-mux-dev {
|
test-mux-dev {
|
||||||
reg = <32>;
|
reg = <32>;
|
||||||
compatible = "selftest-i2c-dev";
|
compatible = "unittest-i2c-dev";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -164,20 +164,15 @@ static void __init omapdss_walk_device(struct device_node *node, bool root)
|
||||||
|
|
||||||
pn = of_graph_get_remote_port_parent(n);
|
pn = of_graph_get_remote_port_parent(n);
|
||||||
|
|
||||||
if (!pn) {
|
if (!pn)
|
||||||
of_node_put(n);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if (!of_device_is_available(pn) || omapdss_list_contains(pn)) {
|
if (!of_device_is_available(pn) || omapdss_list_contains(pn)) {
|
||||||
of_node_put(pn);
|
of_node_put(pn);
|
||||||
of_node_put(n);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
omapdss_walk_device(pn, false);
|
omapdss_walk_device(pn, false);
|
||||||
|
|
||||||
of_node_put(n);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#ifndef __LINUX_OF_GRAPH_H
|
#ifndef __LINUX_OF_GRAPH_H
|
||||||
#define __LINUX_OF_GRAPH_H
|
#define __LINUX_OF_GRAPH_H
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct of_endpoint - the OF graph endpoint data structure
|
* struct of_endpoint - the OF graph endpoint data structure
|
||||||
* @port: identifier (value of reg property) of a port this endpoint belongs to
|
* @port: identifier (value of reg property) of a port this endpoint belongs to
|
||||||
|
@ -26,9 +28,21 @@ struct of_endpoint {
|
||||||
const struct device_node *local_node;
|
const struct device_node *local_node;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for_each_endpoint_of_node - iterate over every endpoint in a device node
|
||||||
|
* @parent: parent device node containing ports and endpoints
|
||||||
|
* @child: loop variable pointing to the current endpoint node
|
||||||
|
*
|
||||||
|
* When breaking out of the loop, of_node_put(child) has to be called manually.
|
||||||
|
*/
|
||||||
|
#define for_each_endpoint_of_node(parent, child) \
|
||||||
|
for (child = of_graph_get_next_endpoint(parent, NULL); child != NULL; \
|
||||||
|
child = of_graph_get_next_endpoint(parent, child))
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
int of_graph_parse_endpoint(const struct device_node *node,
|
int of_graph_parse_endpoint(const struct device_node *node,
|
||||||
struct of_endpoint *endpoint);
|
struct of_endpoint *endpoint);
|
||||||
|
struct device_node *of_graph_get_port_by_id(struct device_node *node, u32 id);
|
||||||
struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
|
struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
|
||||||
struct device_node *previous);
|
struct device_node *previous);
|
||||||
struct device_node *of_graph_get_remote_port_parent(
|
struct device_node *of_graph_get_remote_port_parent(
|
||||||
|
@ -42,6 +56,12 @@ static inline int of_graph_parse_endpoint(const struct device_node *node,
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct device_node *of_graph_get_port_by_id(
|
||||||
|
struct device_node *node, u32 id)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct device_node *of_graph_get_next_endpoint(
|
static inline struct device_node *of_graph_get_next_endpoint(
|
||||||
const struct device_node *parent,
|
const struct device_node *parent,
|
||||||
struct device_node *previous)
|
struct device_node *previous)
|
||||||
|
|
Loading…
Reference in a new issue