|
|
@@ -651,8 +651,10 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
|
|
|
int bus_format;
|
|
|
|
|
|
ret = of_property_read_u32(child, "reg", &i);
|
|
|
- if (ret || i < 0 || i > 1)
|
|
|
- return -EINVAL;
|
|
|
+ if (ret || i < 0 || i > 1) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto free_child;
|
|
|
+ }
|
|
|
|
|
|
if (!of_device_is_available(child))
|
|
|
continue;
|
|
|
@@ -665,7 +667,6 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
|
|
|
channel = &imx_ldb->channel[i];
|
|
|
channel->ldb = imx_ldb;
|
|
|
channel->chno = i;
|
|
|
- channel->child = child;
|
|
|
|
|
|
/*
|
|
|
* The output port is port@4 with an external 4-port mux or
|
|
|
@@ -675,13 +676,13 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
|
|
|
imx_ldb->lvds_mux ? 4 : 2, 0,
|
|
|
&channel->panel, &channel->bridge);
|
|
|
if (ret && ret != -ENODEV)
|
|
|
- return ret;
|
|
|
+ goto free_child;
|
|
|
|
|
|
/* panel ddc only if there is no bridge */
|
|
|
if (!channel->bridge) {
|
|
|
ret = imx_ldb_panel_ddc(dev, channel, child);
|
|
|
if (ret)
|
|
|
- return ret;
|
|
|
+ goto free_child;
|
|
|
}
|
|
|
|
|
|
bus_format = of_get_bus_format(dev, child);
|
|
|
@@ -697,18 +698,26 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
|
|
|
if (bus_format < 0) {
|
|
|
dev_err(dev, "could not determine data mapping: %d\n",
|
|
|
bus_format);
|
|
|
- return bus_format;
|
|
|
+ ret = bus_format;
|
|
|
+ goto free_child;
|
|
|
}
|
|
|
channel->bus_format = bus_format;
|
|
|
+ channel->child = child;
|
|
|
|
|
|
ret = imx_ldb_register(drm, channel);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
+ if (ret) {
|
|
|
+ channel->child = NULL;
|
|
|
+ goto free_child;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
dev_set_drvdata(dev, imx_ldb);
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+free_child:
|
|
|
+ of_node_put(child);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void imx_ldb_unbind(struct device *dev, struct device *master,
|