Lines Matching +full:display +full:- +full:bridge

1 // SPDX-License-Identifier: GPL-2.0+
19 #include <linux/media-bus-format.h>
28 WR_DISPLAY_SIZE = 0x12, /* Write Display Size */
57 struct drm_bridge bridge; member
70 static inline struct dlpc *bridge_to_dlpc(struct drm_bridge *bridge) in bridge_to_dlpc() argument
72 return container_of(bridge, struct dlpc, bridge); in bridge_to_dlpc()
107 static void dlpc_atomic_enable(struct drm_bridge *bridge, in dlpc_atomic_enable() argument
110 struct dlpc *dlpc = bridge_to_dlpc(bridge); in dlpc_atomic_enable()
111 struct device *dev = dlpc->dev; in dlpc_atomic_enable()
112 struct drm_display_mode *mode = &dlpc->mode; in dlpc_atomic_enable()
113 struct regmap *regmap = dlpc->regmap; in dlpc_atomic_enable()
136 buf[4] = mode->hdisplay & 0xff; in dlpc_atomic_enable()
137 buf[5] = (mode->hdisplay & 0xff00) >> 8; in dlpc_atomic_enable()
138 buf[6] = mode->vdisplay & 0xff; in dlpc_atomic_enable()
139 buf[7] = (mode->vdisplay & 0xff00) >> 8; in dlpc_atomic_enable()
142 /* set display size */ in dlpc_atomic_enable()
143 buf[4] = mode->hdisplay & 0xff; in dlpc_atomic_enable()
144 buf[5] = (mode->hdisplay & 0xff00) >> 8; in dlpc_atomic_enable()
145 buf[6] = mode->vdisplay & 0xff; in dlpc_atomic_enable()
146 buf[7] = (mode->vdisplay & 0xff00) >> 8; in dlpc_atomic_enable()
150 buf[0] = mode->hdisplay & 0xff; in dlpc_atomic_enable()
151 buf[1] = (mode->hdisplay & 0xff00) >> 8; in dlpc_atomic_enable()
152 buf[2] = mode->vdisplay & 0xff; in dlpc_atomic_enable()
153 buf[3] = (mode->vdisplay & 0xff00) >> 8; in dlpc_atomic_enable()
172 static void dlpc_atomic_pre_enable(struct drm_bridge *bridge, in dlpc_atomic_pre_enable() argument
175 struct dlpc *dlpc = bridge_to_dlpc(bridge); in dlpc_atomic_pre_enable()
178 gpiod_set_value(dlpc->enable_gpio, 1); in dlpc_atomic_pre_enable()
182 ret = regulator_enable(dlpc->vcc_intf); in dlpc_atomic_pre_enable()
184 DRM_DEV_ERROR(dlpc->dev, in dlpc_atomic_pre_enable()
187 ret = regulator_enable(dlpc->vcc_flsh); in dlpc_atomic_pre_enable()
189 DRM_DEV_ERROR(dlpc->dev, in dlpc_atomic_pre_enable()
195 static void dlpc_atomic_post_disable(struct drm_bridge *bridge, in dlpc_atomic_post_disable() argument
198 struct dlpc *dlpc = bridge_to_dlpc(bridge); in dlpc_atomic_post_disable()
200 regulator_disable(dlpc->vcc_flsh); in dlpc_atomic_post_disable()
201 regulator_disable(dlpc->vcc_intf); in dlpc_atomic_post_disable()
205 gpiod_set_value(dlpc->enable_gpio, 0); in dlpc_atomic_post_disable()
213 dlpc_atomic_get_input_bus_fmts(struct drm_bridge *bridge, in dlpc_atomic_get_input_bus_fmts() argument
229 /* This is the DSI-end bus format */ in dlpc_atomic_get_input_bus_fmts()
236 static void dlpc_mode_set(struct drm_bridge *bridge, in dlpc_mode_set() argument
240 struct dlpc *dlpc = bridge_to_dlpc(bridge); in dlpc_mode_set()
242 drm_mode_copy(&dlpc->mode, adjusted_mode); in dlpc_mode_set()
245 static int dlpc_attach(struct drm_bridge *bridge, in dlpc_attach() argument
248 struct dlpc *dlpc = bridge_to_dlpc(bridge); in dlpc_attach()
250 return drm_bridge_attach(bridge->encoder, dlpc->next_bridge, bridge, flags); in dlpc_attach()
267 struct device *dev = dlpc->dev; in dlpc3433_parse_dt()
271 dlpc->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); in dlpc3433_parse_dt()
272 if (IS_ERR(dlpc->enable_gpio)) in dlpc3433_parse_dt()
273 return PTR_ERR(dlpc->enable_gpio); in dlpc3433_parse_dt()
275 dlpc->vcc_intf = devm_regulator_get(dlpc->dev, "vcc_intf"); in dlpc3433_parse_dt()
276 if (IS_ERR(dlpc->vcc_intf)) in dlpc3433_parse_dt()
277 return dev_err_probe(dev, PTR_ERR(dlpc->vcc_intf), in dlpc3433_parse_dt()
280 dlpc->vcc_flsh = devm_regulator_get(dlpc->dev, "vcc_flsh"); in dlpc3433_parse_dt()
281 if (IS_ERR(dlpc->vcc_flsh)) in dlpc3433_parse_dt()
282 return dev_err_probe(dev, PTR_ERR(dlpc->vcc_flsh), in dlpc3433_parse_dt()
285 dlpc->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0); in dlpc3433_parse_dt()
286 if (IS_ERR(dlpc->next_bridge)) in dlpc3433_parse_dt()
287 return PTR_ERR(dlpc->next_bridge); in dlpc3433_parse_dt()
289 endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, 0); in dlpc3433_parse_dt()
290 dlpc->dsi_lanes = of_property_count_u32_elems(endpoint, "data-lanes"); in dlpc3433_parse_dt()
291 if (dlpc->dsi_lanes < 0 || dlpc->dsi_lanes > 4) { in dlpc3433_parse_dt()
292 ret = -EINVAL; in dlpc3433_parse_dt()
296 dlpc->host_node = of_graph_get_remote_port_parent(endpoint); in dlpc3433_parse_dt()
297 if (!dlpc->host_node) { in dlpc3433_parse_dt()
298 ret = -ENODEV; in dlpc3433_parse_dt()
307 of_node_put(dlpc->host_node); in dlpc3433_parse_dt()
315 struct device *dev = dlpc->dev; in dlpc_host_attach()
324 host = of_find_mipi_dsi_host_by_node(dlpc->host_node); in dlpc_host_attach()
326 return dev_err_probe(dev, -EPROBE_DEFER, "failed to find dsi host\n"); in dlpc_host_attach()
328 dlpc->dsi = mipi_dsi_device_register_full(host, &info); in dlpc_host_attach()
329 if (IS_ERR(dlpc->dsi)) { in dlpc_host_attach()
331 return PTR_ERR(dlpc->dsi); in dlpc_host_attach()
334 dlpc->dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST; in dlpc_host_attach()
335 dlpc->dsi->format = MIPI_DSI_FMT_RGB565; in dlpc_host_attach()
336 dlpc->dsi->lanes = dlpc->dsi_lanes; in dlpc_host_attach()
338 ret = devm_mipi_dsi_attach(dev, dlpc->dsi); in dlpc_host_attach()
347 struct device *dev = &client->dev; in dlpc3433_probe()
353 return -ENOMEM; in dlpc3433_probe()
355 dlpc->dev = dev; in dlpc3433_probe()
357 dlpc->regmap = devm_regmap_init_i2c(client, &dlpc_regmap_config); in dlpc3433_probe()
358 if (IS_ERR(dlpc->regmap)) in dlpc3433_probe()
359 return PTR_ERR(dlpc->regmap); in dlpc3433_probe()
368 dlpc->bridge.funcs = &dlpc_bridge_funcs; in dlpc3433_probe()
369 dlpc->bridge.of_node = dev->of_node; in dlpc3433_probe()
370 drm_bridge_add(&dlpc->bridge); in dlpc3433_probe()
379 drm_bridge_remove(&dlpc->bridge); in dlpc3433_probe()
387 drm_bridge_remove(&dlpc->bridge); in dlpc3433_remove()
388 of_node_put(dlpc->host_node); in dlpc3433_remove()
408 .name = "ti-dlpc3433",
416 MODULE_DESCRIPTION("TI DLPC3433 MIPI DSI Display Controller Bridge");