Lines Matching +full:panel +full:- +full:mounted
1 // SPDX-License-Identifier: GPL-2.0
3 * Panel driver for the ARM Versatile family reference designs from
9 * On the Versatile AB, these panels come mounted on daughterboards
14 * - The IB1 is a passive board where the display connector defines a
19 * - The IB2 is a more complex board intended for GSM phone development
49 /* The Versatile can detect the connected panel type */
64 * struct versatile_panel_type - lookup struct for the supported panels
68 * @name: the name of this panel
76 * @mode: the DRM display mode for this panel
80 * @bus_flags: the DRM bus flags for this panel e.g. inverted clock
84 * @width_mm: the panel width in mm
88 * @height_mm: the panel height in mm
92 * @ib2: the panel may be connected on an IB2 daughterboard
98 * struct versatile_panel - state container for the Versatile panels
106 * @panel: the DRM panel instance for this device
108 struct drm_panel panel; member
110 * @panel_type: the Versatile panel type as detected
125 * Sanyo TM38QV67A02A - 3.8 inch QVGA (320x240) Color TFT
173 * Epson L2F50113T00 - 2.2 inch QCIF 176x220 Color TFT
224 to_versatile_panel(struct drm_panel *panel) in to_versatile_panel() argument
226 return container_of(panel, struct versatile_panel, panel); in to_versatile_panel()
229 static int versatile_panel_disable(struct drm_panel *panel) in versatile_panel_disable() argument
231 struct versatile_panel *vpanel = to_versatile_panel(panel); in versatile_panel_disable()
234 if (vpanel->ib2_map) { in versatile_panel_disable()
235 dev_dbg(vpanel->dev, "disable IB2 display\n"); in versatile_panel_disable()
236 regmap_update_bits(vpanel->ib2_map, in versatile_panel_disable()
245 static int versatile_panel_enable(struct drm_panel *panel) in versatile_panel_enable() argument
247 struct versatile_panel *vpanel = to_versatile_panel(panel); in versatile_panel_enable()
250 if (vpanel->ib2_map) { in versatile_panel_enable()
251 dev_dbg(vpanel->dev, "enable IB2 display\n"); in versatile_panel_enable()
252 regmap_update_bits(vpanel->ib2_map, in versatile_panel_enable()
261 static int versatile_panel_get_modes(struct drm_panel *panel) in versatile_panel_get_modes() argument
263 struct drm_connector *connector = panel->connector; in versatile_panel_get_modes()
264 struct versatile_panel *vpanel = to_versatile_panel(panel); in versatile_panel_get_modes()
267 strncpy(connector->display_info.name, vpanel->panel_type->name, in versatile_panel_get_modes()
269 connector->display_info.width_mm = vpanel->panel_type->width_mm; in versatile_panel_get_modes()
270 connector->display_info.height_mm = vpanel->panel_type->height_mm; in versatile_panel_get_modes()
271 connector->display_info.bus_flags = vpanel->panel_type->bus_flags; in versatile_panel_get_modes()
273 mode = drm_mode_duplicate(panel->drm, &vpanel->panel_type->mode); in versatile_panel_get_modes()
275 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in versatile_panel_get_modes()
277 mode->width_mm = vpanel->panel_type->width_mm; in versatile_panel_get_modes()
278 mode->height_mm = vpanel->panel_type->height_mm; in versatile_panel_get_modes()
292 struct device *dev = &pdev->dev; in versatile_panel_probe()
300 parent = dev->parent; in versatile_panel_probe()
302 dev_err(dev, "no parent for versatile panel\n"); in versatile_panel_probe()
303 return -ENODEV; in versatile_panel_probe()
305 map = syscon_node_to_regmap(parent->of_node); in versatile_panel_probe()
307 dev_err(dev, "no regmap for versatile panel parent\n"); in versatile_panel_probe()
313 return -ENOMEM; in versatile_panel_probe()
327 if (pt->magic == val) { in versatile_panel_probe()
328 vpanel->panel_type = pt; in versatile_panel_probe()
333 /* No panel detected or VGA, let's leave this show */ in versatile_panel_probe()
335 dev_info(dev, "no panel detected\n"); in versatile_panel_probe()
336 return -ENODEV; in versatile_panel_probe()
339 dev_info(dev, "detected: %s\n", vpanel->panel_type->name); in versatile_panel_probe()
340 vpanel->dev = dev; in versatile_panel_probe()
341 vpanel->map = map; in versatile_panel_probe()
343 /* Check if the panel is mounted on an IB2 daughterboard */ in versatile_panel_probe()
344 if (vpanel->panel_type->ib2) { in versatile_panel_probe()
345 vpanel->ib2_map = syscon_regmap_lookup_by_compatible( in versatile_panel_probe()
346 "arm,versatile-ib2-syscon"); in versatile_panel_probe()
347 if (IS_ERR(vpanel->ib2_map)) in versatile_panel_probe()
348 vpanel->ib2_map = NULL; in versatile_panel_probe()
350 dev_info(dev, "panel mounted on IB2 daughterboard\n"); in versatile_panel_probe()
353 drm_panel_init(&vpanel->panel); in versatile_panel_probe()
354 vpanel->panel.dev = dev; in versatile_panel_probe()
355 vpanel->panel.funcs = &versatile_panel_drm_funcs; in versatile_panel_probe()
357 return drm_panel_add(&vpanel->panel); in versatile_panel_probe()
361 { .compatible = "arm,versatile-tft-panel", },
369 .name = "versatile-tft-panel",
376 MODULE_DESCRIPTION("ARM Versatile panel driver");