dlpc
struct dlpc *dlpc = bridge_to_dlpc(bridge);
struct device *dev = dlpc->dev;
struct drm_display_mode *mode = &dlpc->mode;
struct regmap *regmap = dlpc->regmap;
struct dlpc *dlpc = bridge_to_dlpc(bridge);
gpiod_set_value(dlpc->enable_gpio, 1);
ret = regulator_enable(dlpc->vcc_intf);
DRM_DEV_ERROR(dlpc->dev,
ret = regulator_enable(dlpc->vcc_flsh);
DRM_DEV_ERROR(dlpc->dev,
struct dlpc *dlpc = bridge_to_dlpc(bridge);
regulator_disable(dlpc->vcc_flsh);
regulator_disable(dlpc->vcc_intf);
gpiod_set_value(dlpc->enable_gpio, 0);
struct dlpc *dlpc = bridge_to_dlpc(bridge);
drm_mode_copy(&dlpc->mode, adjusted_mode);
struct dlpc *dlpc = bridge_to_dlpc(bridge);
return drm_bridge_attach(encoder, dlpc->next_bridge, bridge, flags);
static int dlpc3433_parse_dt(struct dlpc *dlpc)
struct device *dev = dlpc->dev;
dlpc->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
if (IS_ERR(dlpc->enable_gpio))
return PTR_ERR(dlpc->enable_gpio);
dlpc->vcc_intf = devm_regulator_get(dlpc->dev, "vcc_intf");
if (IS_ERR(dlpc->vcc_intf))
return dev_err_probe(dev, PTR_ERR(dlpc->vcc_intf),
dlpc->vcc_flsh = devm_regulator_get(dlpc->dev, "vcc_flsh");
if (IS_ERR(dlpc->vcc_flsh))
return dev_err_probe(dev, PTR_ERR(dlpc->vcc_flsh),
dlpc->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
if (IS_ERR(dlpc->next_bridge))
return PTR_ERR(dlpc->next_bridge);
dlpc->dsi_lanes = of_property_count_u32_elems(endpoint, "data-lanes");
if (dlpc->dsi_lanes < 0 || dlpc->dsi_lanes > 4) {
dlpc->host_node = of_graph_get_remote_port_parent(endpoint);
if (!dlpc->host_node) {
of_node_put(dlpc->host_node);
static int dlpc_host_attach(struct dlpc *dlpc)
struct device *dev = dlpc->dev;
host = of_find_mipi_dsi_host_by_node(dlpc->host_node);
dlpc->dsi = mipi_dsi_device_register_full(host, &info);
if (IS_ERR(dlpc->dsi)) {
return PTR_ERR(dlpc->dsi);
dlpc->dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST;
dlpc->dsi->format = MIPI_DSI_FMT_RGB565;
dlpc->dsi->lanes = dlpc->dsi_lanes;
ret = devm_mipi_dsi_attach(dev, dlpc->dsi);
struct dlpc *dlpc;
dlpc = devm_drm_bridge_alloc(dev, struct dlpc, bridge,
if (IS_ERR(dlpc))
return PTR_ERR(dlpc);
dlpc->dev = dev;
dlpc->regmap = devm_regmap_init_i2c(client, &dlpc_regmap_config);
if (IS_ERR(dlpc->regmap))
return PTR_ERR(dlpc->regmap);
ret = dlpc3433_parse_dt(dlpc);
dev_set_drvdata(dev, dlpc);
i2c_set_clientdata(client, dlpc);
dlpc->bridge.of_node = dev->of_node;
drm_bridge_add(&dlpc->bridge);
ret = dlpc_host_attach(dlpc);
drm_bridge_remove(&dlpc->bridge);
struct dlpc *dlpc = i2c_get_clientdata(client);
drm_bridge_remove(&dlpc->bridge);
of_node_put(dlpc->host_node);
static inline struct dlpc *bridge_to_dlpc(struct drm_bridge *bridge)
return container_of(bridge, struct dlpc, bridge);