Lines Matching +full:logicvc +full:- +full:3

1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2019-2022 Bootlin
40 struct logicvc_drm *logicvc = logicvc_drm(drm_dev); in logicvc_drm_gem_dma_dumb_create() local
43 args->pitch = logicvc->config.row_stride * DIV_ROUND_UP(args->bpp, 8); in logicvc_drm_gem_dma_dumb_create()
53 .name = "logicvc-drm",
54 .desc = "Xylon LogiCVC DRM driver",
66 .name = "logicvc-drm",
71 struct logicvc_drm *logicvc = data; in logicvc_drm_irq_handler() local
76 regmap_read(logicvc->regmap, LOGICVC_INT_STAT_REG, &stat); in logicvc_drm_irq_handler()
79 regmap_write(logicvc->regmap, LOGICVC_INT_STAT_REG, stat); in logicvc_drm_irq_handler()
82 logicvc_crtc_vblank_handler(logicvc); in logicvc_drm_irq_handler()
89 static int logicvc_drm_config_parse(struct logicvc_drm *logicvc) in logicvc_drm_config_parse() argument
91 struct drm_device *drm_dev = &logicvc->drm_dev; in logicvc_drm_config_parse()
92 struct device *dev = drm_dev->dev; in logicvc_drm_config_parse()
93 struct device_node *of_node = dev->of_node; in logicvc_drm_config_parse()
94 struct logicvc_drm_config *config = &logicvc->config; in logicvc_drm_config_parse()
99 &config->dithering); in logicvc_drm_config_parse()
102 &config->background_layer); in logicvc_drm_config_parse()
105 &config->layers_configurable); in logicvc_drm_config_parse()
109 &config->display_interface); in logicvc_drm_config_parse()
115 &config->display_colorspace); in logicvc_drm_config_parse()
121 &config->display_depth); in logicvc_drm_config_parse()
127 &config->row_stride); in logicvc_drm_config_parse()
133 drm_err(drm_dev, "Missing non-optional layers node\n"); in logicvc_drm_config_parse()
134 return -EINVAL; in logicvc_drm_config_parse()
137 config->layers_count = of_get_child_count(layers_node); in logicvc_drm_config_parse()
138 if (!config->layers_count) { in logicvc_drm_config_parse()
140 "Missing a non-optional layers children node\n"); in logicvc_drm_config_parse()
141 return -EINVAL; in logicvc_drm_config_parse()
147 static int logicvc_clocks_prepare(struct logicvc_drm *logicvc) in logicvc_clocks_prepare() argument
149 struct drm_device *drm_dev = &logicvc->drm_dev; in logicvc_clocks_prepare()
150 struct device *dev = drm_dev->dev; in logicvc_clocks_prepare()
158 .clk = &logicvc->vclk, in logicvc_clocks_prepare()
163 .clk = &logicvc->vclk2, in logicvc_clocks_prepare()
168 .clk = &logicvc->lvdsclk, in logicvc_clocks_prepare()
173 .clk = &logicvc->lvdsclkn, in logicvc_clocks_prepare()
186 if (PTR_ERR(clk) == -ENOENT && clocks_map[i].optional) in logicvc_clocks_prepare()
189 drm_err(drm_dev, "Missing non-optional clock %s\n", in logicvc_clocks_prepare()
221 static int logicvc_clocks_unprepare(struct logicvc_drm *logicvc) in logicvc_clocks_unprepare() argument
224 &logicvc->vclk, in logicvc_clocks_unprepare()
225 &logicvc->vclk2, in logicvc_clocks_unprepare()
226 &logicvc->lvdsclk, in logicvc_clocks_unprepare()
227 &logicvc->lvdsclkn, in logicvc_clocks_unprepare()
244 .major = 3,
258 logicvc_drm_caps_match(struct logicvc_drm *logicvc) in logicvc_drm_caps_match() argument
260 struct drm_device *drm_dev = &logicvc->drm_dev; in logicvc_drm_caps_match()
267 regmap_read(logicvc->regmap, LOGICVC_IP_VERSION_REG, &version); in logicvc_drm_caps_match()
289 drm_info(drm_dev, "LogiCVC version %d.%02d.%c\n", major, minor, level); in logicvc_drm_caps_match()
296 struct device_node *of_node = pdev->dev.of_node; in logicvc_drm_probe()
300 struct logicvc_drm *logicvc; in logicvc_drm_probe() local
301 struct device *dev = &pdev->dev; in logicvc_drm_probe()
310 if (ret && ret != -ENODEV) { in logicvc_drm_probe()
315 reserved_mem_node = of_parse_phandle(of_node, "memory-region", 0); in logicvc_drm_probe()
322 if (of_node->parent) in logicvc_drm_probe()
323 regmap = syscon_node_to_regmap(of_node->parent); in logicvc_drm_probe()
340 logicvc_drm_regmap_config.max_register = resource_size(&res) - in logicvc_drm_probe()
354 ret = -ENODEV; in logicvc_drm_probe()
358 logicvc = devm_drm_dev_alloc(dev, &logicvc_drm_driver, in logicvc_drm_probe()
360 if (IS_ERR(logicvc)) { in logicvc_drm_probe()
361 ret = PTR_ERR(logicvc); in logicvc_drm_probe()
365 platform_set_drvdata(pdev, logicvc); in logicvc_drm_probe()
366 drm_dev = &logicvc->drm_dev; in logicvc_drm_probe()
368 logicvc->regmap = regmap; in logicvc_drm_probe()
369 INIT_LIST_HEAD(&logicvc->layers_list); in logicvc_drm_probe()
371 caps = logicvc_drm_caps_match(logicvc); in logicvc_drm_probe()
373 ret = -EINVAL; in logicvc_drm_probe()
377 logicvc->caps = caps; in logicvc_drm_probe()
380 logicvc->reserved_mem_base = reserved_mem->base; in logicvc_drm_probe()
382 ret = logicvc_clocks_prepare(logicvc); in logicvc_drm_probe()
389 dev_name(dev), logicvc); in logicvc_drm_probe()
395 ret = logicvc_drm_config_parse(logicvc); in logicvc_drm_probe()
396 if (ret && ret != -ENODEV) { in logicvc_drm_probe()
407 ret = logicvc_layers_init(logicvc); in logicvc_drm_probe()
413 ret = logicvc_crtc_init(logicvc); in logicvc_drm_probe()
419 logicvc_layers_attach_crtc(logicvc); in logicvc_drm_probe()
421 ret = logicvc_interface_init(logicvc); in logicvc_drm_probe()
423 if (ret != -EPROBE_DEFER) in logicvc_drm_probe()
429 logicvc_interface_attach_crtc(logicvc); in logicvc_drm_probe()
431 ret = logicvc_mode_init(logicvc); in logicvc_drm_probe()
448 logicvc_mode_fini(logicvc); in logicvc_drm_probe()
451 logicvc_clocks_unprepare(logicvc); in logicvc_drm_probe()
462 struct logicvc_drm *logicvc = platform_get_drvdata(pdev); in logicvc_drm_remove() local
463 struct device *dev = &pdev->dev; in logicvc_drm_remove()
464 struct drm_device *drm_dev = &logicvc->drm_dev; in logicvc_drm_remove()
469 logicvc_mode_fini(logicvc); in logicvc_drm_remove()
471 logicvc_clocks_unprepare(logicvc); in logicvc_drm_remove()
478 struct logicvc_drm *logicvc = platform_get_drvdata(pdev); in logicvc_drm_shutdown() local
479 struct drm_device *drm_dev = &logicvc->drm_dev; in logicvc_drm_shutdown()
485 { .compatible = "xylon,logicvc-3.02.a-display" },
486 { .compatible = "xylon,logicvc-4.01.a-display" },
496 .name = "logicvc-drm",
504 MODULE_DESCRIPTION("Xylon LogiCVC DRM driver");