lvds_codec
struct lvds_codec *lvds_codec;
lvds_codec = devm_drm_bridge_alloc(dev, struct lvds_codec, bridge,
if (IS_ERR(lvds_codec))
return PTR_ERR(lvds_codec);
lvds_codec->dev = &pdev->dev;
lvds_codec->connector_type = (uintptr_t)of_device_get_match_data(dev);
lvds_codec->vcc = devm_regulator_get(lvds_codec->dev, "power");
if (IS_ERR(lvds_codec->vcc))
return dev_err_probe(dev, PTR_ERR(lvds_codec->vcc),
lvds_codec->powerdown_gpio = devm_gpiod_get_optional(dev, "powerdown",
if (IS_ERR(lvds_codec->powerdown_gpio))
return dev_err_probe(dev, PTR_ERR(lvds_codec->powerdown_gpio),
lvds_codec->panel_bridge =
lvds_codec->connector_type);
if (IS_ERR(lvds_codec->panel_bridge))
return PTR_ERR(lvds_codec->panel_bridge);
if (lvds_codec->connector_type != DRM_MODE_CONNECTOR_LVDS) {
lvds_codec->bus_format = ret;
lvds_codec->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
if (lvds_codec->connector_type == DRM_MODE_CONNECTOR_LVDS &&
lvds_codec->timings.input_bus_flags = val ?
lvds_codec->bridge.of_node = dev->of_node;
lvds_codec->bridge.timings = &lvds_codec->timings;
drm_bridge_add(&lvds_codec->bridge);
platform_set_drvdata(pdev, lvds_codec);
struct lvds_codec *lvds_codec = platform_get_drvdata(pdev);
drm_bridge_remove(&lvds_codec->bridge);
static inline struct lvds_codec *to_lvds_codec(struct drm_bridge *bridge)
return container_of(bridge, struct lvds_codec, bridge);
struct lvds_codec *lvds_codec = to_lvds_codec(bridge);
return drm_bridge_attach(encoder, lvds_codec->panel_bridge,
struct lvds_codec *lvds_codec = to_lvds_codec(bridge);
ret = regulator_enable(lvds_codec->vcc);
dev_err(lvds_codec->dev,
if (lvds_codec->powerdown_gpio)
gpiod_set_value_cansleep(lvds_codec->powerdown_gpio, 0);
struct lvds_codec *lvds_codec = to_lvds_codec(bridge);
if (lvds_codec->powerdown_gpio)
gpiod_set_value_cansleep(lvds_codec->powerdown_gpio, 1);
ret = regulator_disable(lvds_codec->vcc);
dev_err(lvds_codec->dev,
struct lvds_codec *lvds_codec = to_lvds_codec(bridge);
input_fmts[0] = lvds_codec->bus_format;