Message ID | 20240422191903.255642-7-sui.jingfeng@linux.dev (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/bridge: Allow using fwnode API to get the next bridge | expand |
On Tue, Apr 23, 2024 at 03:19:00AM +0800, Sui Jingfeng wrote: > Make this driver less DT-dependent by calling the freshly created helper > functions, which reduce boilerplate. Should be no functional changes for > DT based systems. > > Signed-off-by: Sui Jingfeng <sui.jingfeng@linux.dev> > --- > drivers/gpu/drm/bridge/sii902x.c | 43 +++++++++++--------------------- > 1 file changed, 14 insertions(+), 29 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c > index 8f84e98249c7..04436f318c7f 100644 > --- a/drivers/gpu/drm/bridge/sii902x.c > +++ b/drivers/gpu/drm/bridge/sii902x.c > @@ -827,20 +827,19 @@ static int sii902x_audio_codec_init(struct sii902x *sii902x, > .spdif = 0, > .max_i2s_channels = 0, > }; > + struct fwnode_handle *fwnode = dev_fwnode(dev); > u8 lanes[4]; > int num_lanes, i; > > - if (!of_property_read_bool(dev->of_node, "#sound-dai-cells")) { > + if (!fwnode_property_present(fwnode, "#sound-dai-cells")) { > dev_dbg(dev, "%s: No \"#sound-dai-cells\", no audio\n", > __func__); > return 0; > } > > - num_lanes = of_property_read_variable_u8_array(dev->of_node, > - "sil,i2s-data-lanes", > - lanes, 1, > - ARRAY_SIZE(lanes)); > - > + num_lanes = fwnode_property_read_u8_array(fwnode, > + "sil,i2s-data-lanes", > + lanes, ARRAY_SIZE(lanes)); You have lost support for having less than 4 lanes. Please see the documentation for this function. > if (num_lanes == -EINVAL) { > dev_dbg(dev, > "%s: No \"sil,i2s-data-lanes\", use default <0>\n", > @@ -1097,13 +1096,13 @@ static int sii902x_init(struct sii902x *sii902x) > goto err_unreg_audio; > > sii902x->bridge.funcs = &sii902x_bridge_funcs; > - sii902x->bridge.of_node = dev->of_node; > sii902x->bridge.timings = &default_sii902x_timings; > sii902x->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; > > if (sii902x->i2c->irq > 0) > sii902x->bridge.ops |= DRM_BRIDGE_OP_HPD; > > + drm_bridge_set_node(&sii902x->bridge, dev_fwnode(dev)); Move back to the place of the of_node setter. > drm_bridge_add(&sii902x->bridge); > > return 0; > @@ -1118,7 +1117,6 @@ static int sii902x_init(struct sii902x *sii902x) > static int sii902x_probe(struct i2c_client *client) > { > struct device *dev = &client->dev; > - struct device_node *endpoint; > struct sii902x *sii902x; > static const char * const supplies[] = {"iovcc", "cvcc12"}; > int ret; > @@ -1147,27 +1145,14 @@ static int sii902x_probe(struct i2c_client *client) > return PTR_ERR(sii902x->reset_gpio); > } > > - endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1); > - if (endpoint) { > - struct device_node *remote = of_graph_get_remote_port_parent(endpoint); > - > - of_node_put(endpoint); > - if (!remote) { > - dev_err(dev, "Endpoint in port@1 unconnected\n"); > - return -ENODEV; > - } > - > - if (!of_device_is_available(remote)) { > - dev_err(dev, "port@1 remote device is disabled\n"); > - of_node_put(remote); > - return -ENODEV; > - } > - > - sii902x->next_bridge = of_drm_find_bridge(remote); > - of_node_put(remote); > - if (!sii902x->next_bridge) > - return dev_err_probe(dev, -EPROBE_DEFER, > - "Failed to find remote bridge\n"); > + sii902x->next_bridge = drm_bridge_find_next_bridge_by_fwnode(dev_fwnode(dev), 1); > + if (!sii902x->next_bridge) { > + return dev_err_probe(dev, -EPROBE_DEFER, > + "Failed to find the next bridge\n"); > + } else if (IS_ERR(sii902x->next_bridge)) { > + ret = PTR_ERR(sii902x->next_bridge); > + dev_err(dev, "Error on find the next bridge: %d\n", ret); > + return ret; > } > > mutex_init(&sii902x->mutex); > -- > 2.34.1 >
diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c index 8f84e98249c7..04436f318c7f 100644 --- a/drivers/gpu/drm/bridge/sii902x.c +++ b/drivers/gpu/drm/bridge/sii902x.c @@ -827,20 +827,19 @@ static int sii902x_audio_codec_init(struct sii902x *sii902x, .spdif = 0, .max_i2s_channels = 0, }; + struct fwnode_handle *fwnode = dev_fwnode(dev); u8 lanes[4]; int num_lanes, i; - if (!of_property_read_bool(dev->of_node, "#sound-dai-cells")) { + if (!fwnode_property_present(fwnode, "#sound-dai-cells")) { dev_dbg(dev, "%s: No \"#sound-dai-cells\", no audio\n", __func__); return 0; } - num_lanes = of_property_read_variable_u8_array(dev->of_node, - "sil,i2s-data-lanes", - lanes, 1, - ARRAY_SIZE(lanes)); - + num_lanes = fwnode_property_read_u8_array(fwnode, + "sil,i2s-data-lanes", + lanes, ARRAY_SIZE(lanes)); if (num_lanes == -EINVAL) { dev_dbg(dev, "%s: No \"sil,i2s-data-lanes\", use default <0>\n", @@ -1097,13 +1096,13 @@ static int sii902x_init(struct sii902x *sii902x) goto err_unreg_audio; sii902x->bridge.funcs = &sii902x_bridge_funcs; - sii902x->bridge.of_node = dev->of_node; sii902x->bridge.timings = &default_sii902x_timings; sii902x->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; if (sii902x->i2c->irq > 0) sii902x->bridge.ops |= DRM_BRIDGE_OP_HPD; + drm_bridge_set_node(&sii902x->bridge, dev_fwnode(dev)); drm_bridge_add(&sii902x->bridge); return 0; @@ -1118,7 +1117,6 @@ static int sii902x_init(struct sii902x *sii902x) static int sii902x_probe(struct i2c_client *client) { struct device *dev = &client->dev; - struct device_node *endpoint; struct sii902x *sii902x; static const char * const supplies[] = {"iovcc", "cvcc12"}; int ret; @@ -1147,27 +1145,14 @@ static int sii902x_probe(struct i2c_client *client) return PTR_ERR(sii902x->reset_gpio); } - endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1); - if (endpoint) { - struct device_node *remote = of_graph_get_remote_port_parent(endpoint); - - of_node_put(endpoint); - if (!remote) { - dev_err(dev, "Endpoint in port@1 unconnected\n"); - return -ENODEV; - } - - if (!of_device_is_available(remote)) { - dev_err(dev, "port@1 remote device is disabled\n"); - of_node_put(remote); - return -ENODEV; - } - - sii902x->next_bridge = of_drm_find_bridge(remote); - of_node_put(remote); - if (!sii902x->next_bridge) - return dev_err_probe(dev, -EPROBE_DEFER, - "Failed to find remote bridge\n"); + sii902x->next_bridge = drm_bridge_find_next_bridge_by_fwnode(dev_fwnode(dev), 1); + if (!sii902x->next_bridge) { + return dev_err_probe(dev, -EPROBE_DEFER, + "Failed to find the next bridge\n"); + } else if (IS_ERR(sii902x->next_bridge)) { + ret = PTR_ERR(sii902x->next_bridge); + dev_err(dev, "Error on find the next bridge: %d\n", ret); + return ret; } mutex_init(&sii902x->mutex);
Make this driver less DT-dependent by calling the freshly created helper functions, which reduce boilerplate. Should be no functional changes for DT based systems. Signed-off-by: Sui Jingfeng <sui.jingfeng@linux.dev> --- drivers/gpu/drm/bridge/sii902x.c | 43 +++++++++++--------------------- 1 file changed, 14 insertions(+), 29 deletions(-)