Lines Matching +full:simple +full:- +full:framebuffer

1 // SPDX-License-Identifier: GPL-2.0-only
30 #define DRIVER_DESC "DRM driver for simple-framebuffer platform devices"
44 drm_err(dev, "simplefb: invalid framebuffer %s of %u\n", in simplefb_get_validated_int()
46 return -EINVAL; in simplefb_get_validated_int()
56 drm_err(dev, "simplefb: invalid framebuffer %s of %u\n", in simplefb_get_validated_int0()
58 return -EINVAL; in simplefb_get_validated_int0()
72 drm_err(dev, "simplefb: missing framebuffer format\n"); in simplefb_get_validated_format()
73 return ERR_PTR(-EINVAL); in simplefb_get_validated_format()
77 if (!strcmp(format_name, fmt->name)) { in simplefb_get_validated_format()
78 info = drm_format_info(fmt->fourcc); in simplefb_get_validated_format()
80 return ERR_PTR(-EINVAL); in simplefb_get_validated_format()
86 drm_err(dev, "simplefb: unknown framebuffer format %s\n", in simplefb_get_validated_format()
89 return ERR_PTR(-EINVAL); in simplefb_get_validated_format()
96 return simplefb_get_validated_int0(dev, "width", pd->width); in simplefb_get_width_pd()
103 return simplefb_get_validated_int0(dev, "height", pd->height); in simplefb_get_height_pd()
110 return simplefb_get_validated_int(dev, "stride", pd->stride); in simplefb_get_stride_pd()
117 return simplefb_get_validated_format(dev, pd->format); in simplefb_get_format_pd()
127 drm_err(dev, "simplefb: cannot parse framebuffer %s: error %d\n", in simplefb_read_u32_of()
139 drm_err(dev, "simplefb: cannot parse framebuffer %s: error %d\n", in simplefb_read_string_of()
195 np = of_parse_phandle(of_node, "memory-region", 0); in simplefb_get_memory_of()
199 res = devm_kzalloc(dev->dev, sizeof(*res), GFP_KERNEL); in simplefb_get_memory_of()
201 return ERR_PTR(-ENOMEM); in simplefb_get_memory_of()
208 drm_warn(dev, "preferring \"memory-region\" over \"reg\" property\n"); in simplefb_get_memory_of()
214 * Simple Framebuffer device
261 * Here we handle the clocks property of our "simple-framebuffer" dt node.
282 for (i = 0; i < sdev->clk_count; ++i) { in simpledrm_device_release_clocks()
283 if (sdev->clks[i]) { in simpledrm_device_release_clocks()
284 clk_disable_unprepare(sdev->clks[i]); in simpledrm_device_release_clocks()
285 clk_put(sdev->clks[i]); in simpledrm_device_release_clocks()
292 struct drm_device *dev = &sdev->dev; in simpledrm_device_init_clocks()
293 struct platform_device *pdev = to_platform_device(dev->dev); in simpledrm_device_init_clocks()
294 struct device_node *of_node = pdev->dev.of_node; in simpledrm_device_init_clocks()
299 if (dev_get_platdata(&pdev->dev) || !of_node) in simpledrm_device_init_clocks()
302 sdev->clk_count = of_clk_get_parent_count(of_node); in simpledrm_device_init_clocks()
303 if (!sdev->clk_count) in simpledrm_device_init_clocks()
306 sdev->clks = drmm_kzalloc(dev, sdev->clk_count * sizeof(sdev->clks[0]), in simpledrm_device_init_clocks()
308 if (!sdev->clks) in simpledrm_device_init_clocks()
309 return -ENOMEM; in simpledrm_device_init_clocks()
311 for (i = 0; i < sdev->clk_count; ++i) { in simpledrm_device_init_clocks()
315 if (ret == -EPROBE_DEFER) in simpledrm_device_init_clocks()
327 sdev->clks[i] = clock; in simpledrm_device_init_clocks()
330 return devm_add_action_or_reset(&pdev->dev, in simpledrm_device_init_clocks()
336 --i; in simpledrm_device_init_clocks()
337 if (sdev->clks[i]) { in simpledrm_device_init_clocks()
338 clk_disable_unprepare(sdev->clks[i]); in simpledrm_device_init_clocks()
339 clk_put(sdev->clks[i]); in simpledrm_device_init_clocks()
353 #define SUPPLY_SUFFIX "-supply"
358 * Here we handle the num-supplies and vin*-supply properties of our
359 * "simple-framebuffer" dt node. This is necessary so that we can make sure
380 for (i = 0; i < sdev->regulator_count; ++i) { in simpledrm_device_release_regulators()
381 if (sdev->regulators[i]) { in simpledrm_device_release_regulators()
382 regulator_disable(sdev->regulators[i]); in simpledrm_device_release_regulators()
383 regulator_put(sdev->regulators[i]); in simpledrm_device_release_regulators()
390 struct drm_device *dev = &sdev->dev; in simpledrm_device_init_regulators()
391 struct platform_device *pdev = to_platform_device(dev->dev); in simpledrm_device_init_regulators()
392 struct device_node *of_node = pdev->dev.of_node; in simpledrm_device_init_regulators()
399 if (dev_get_platdata(&pdev->dev) || !of_node) in simpledrm_device_init_regulators()
404 p = strstr(prop->name, SUPPLY_SUFFIX); in simpledrm_device_init_regulators()
405 if (p && p != prop->name) in simpledrm_device_init_regulators()
412 sdev->regulators = drmm_kzalloc(dev, in simpledrm_device_init_regulators()
413 count * sizeof(sdev->regulators[0]), in simpledrm_device_init_regulators()
415 if (!sdev->regulators) in simpledrm_device_init_regulators()
416 return -ENOMEM; in simpledrm_device_init_regulators()
422 p = strstr(prop->name, SUPPLY_SUFFIX); in simpledrm_device_init_regulators()
423 if (!p || p == prop->name) in simpledrm_device_init_regulators()
425 len = strlen(prop->name) - strlen(SUPPLY_SUFFIX) + 1; in simpledrm_device_init_regulators()
426 strscpy(name, prop->name, min(sizeof(name), len)); in simpledrm_device_init_regulators()
428 regulator = regulator_get_optional(&pdev->dev, name); in simpledrm_device_init_regulators()
431 if (ret == -EPROBE_DEFER) in simpledrm_device_init_regulators()
446 sdev->regulators[i++] = regulator; in simpledrm_device_init_regulators()
448 sdev->regulator_count = i; in simpledrm_device_init_regulators()
450 return devm_add_action_or_reset(&pdev->dev, in simpledrm_device_init_regulators()
456 --i; in simpledrm_device_init_regulators()
457 if (sdev->regulators[i]) { in simpledrm_device_init_regulators()
458 regulator_disable(sdev->regulators[i]); in simpledrm_device_init_regulators()
459 regulator_put(sdev->regulators[i]); in simpledrm_device_init_regulators()
486 struct drm_framebuffer *fb = plane_state->fb; in simpledrm_primary_plane_helper_atomic_update()
487 struct drm_device *dev = plane->dev; in simpledrm_primary_plane_helper_atomic_update()
502 struct drm_rect dst_clip = plane_state->dst; in simpledrm_primary_plane_helper_atomic_update()
503 struct iosys_map dst = sdev->screen_base; in simpledrm_primary_plane_helper_atomic_update()
508 iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip)); in simpledrm_primary_plane_helper_atomic_update()
509 drm_fb_blit(&dst, &sdev->pitch, sdev->format->format, shadow_plane_state->data, in simpledrm_primary_plane_helper_atomic_update()
521 struct drm_device *dev = plane->dev; in simpledrm_primary_plane_helper_atomic_disable()
529 iosys_map_memset(&sdev->screen_base, 0, 0, sdev->pitch * sdev->mode.vdisplay); in simpledrm_primary_plane_helper_atomic_disable()
551 struct simpledrm_device *sdev = simpledrm_device_of_dev(crtc->dev); in simpledrm_crtc_helper_mode_valid()
553 return drm_crtc_helper_mode_valid_fixed(crtc, mode, &sdev->mode); in simpledrm_crtc_helper_mode_valid()
581 struct simpledrm_device *sdev = simpledrm_device_of_dev(connector->dev); in simpledrm_connector_helper_get_modes()
583 return drm_connector_helper_get_modes_fixed(connector, &sdev->mode); in simpledrm_connector_helper_get_modes()
623 const struct simplefb_platform_data *pd = dev_get_platdata(&pdev->dev); in simpledrm_device_create()
624 struct device_node *of_node = pdev->dev.of_node; in simpledrm_device_create()
640 sdev = devm_drm_dev_alloc(&pdev->dev, drv, struct simpledrm_device, dev); in simpledrm_device_create()
643 dev = &sdev->dev; in simpledrm_device_create()
688 simplefb_read_u32_of(dev, panel_node, "width-mm", &width_mm); in simpledrm_device_create()
689 simplefb_read_u32_of(dev, panel_node, "height-mm", &height_mm); in simpledrm_device_create()
694 return ERR_PTR(-ENODEV); in simpledrm_device_create()
699 return ERR_PTR(-EINVAL); in simpledrm_device_create()
711 sdev->mode = simpledrm_mode(width, height, width_mm, height_mm); in simpledrm_device_create()
712 sdev->format = format; in simpledrm_device_create()
713 sdev->pitch = stride; in simpledrm_device_create()
715 drm_dbg(dev, "display mode={" DRM_MODE_FMT "}\n", DRM_MODE_ARG(&sdev->mode)); in simpledrm_device_create()
716 drm_dbg(dev, "framebuffer format=%p4cc, size=%dx%d, stride=%d byte\n", in simpledrm_device_create()
717 &format->format, width, height, stride); in simpledrm_device_create()
726 ret = devm_aperture_acquire_from_firmware(dev, mem->start, resource_size(mem)); in simpledrm_device_create()
732 drm_dbg(dev, "using system memory framebuffer at %pr\n", mem); in simpledrm_device_create()
734 screen_base = devm_memremap(dev->dev, mem->start, resource_size(mem), MEMREMAP_WC); in simpledrm_device_create()
738 iosys_map_set_vaddr(&sdev->screen_base, screen_base); in simpledrm_device_create()
744 return ERR_PTR(-EINVAL); in simpledrm_device_create()
746 ret = devm_aperture_acquire_from_firmware(dev, res->start, resource_size(res)); in simpledrm_device_create()
752 drm_dbg(dev, "using I/O memory framebuffer at %pr\n", res); in simpledrm_device_create()
754 mem = devm_request_mem_region(&pdev->dev, res->start, resource_size(res), in simpledrm_device_create()
755 drv->name); in simpledrm_device_create()
760 * the I/O-memory resource as-is and try to map that instead. in simpledrm_device_create()
766 screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem)); in simpledrm_device_create()
768 return ERR_PTR(-ENOMEM); in simpledrm_device_create()
770 iosys_map_set_vaddr_iomem(&sdev->screen_base, screen_base); in simpledrm_device_create()
784 dev->mode_config.min_width = width; in simpledrm_device_create()
785 dev->mode_config.max_width = max_width; in simpledrm_device_create()
786 dev->mode_config.min_height = height; in simpledrm_device_create()
787 dev->mode_config.max_height = max_height; in simpledrm_device_create()
788 dev->mode_config.preferred_depth = format->depth; in simpledrm_device_create()
789 dev->mode_config.funcs = &simpledrm_mode_config_funcs; in simpledrm_device_create()
793 nformats = drm_fb_build_fourcc_list(dev, &format->format, 1, in simpledrm_device_create()
794 sdev->formats, ARRAY_SIZE(sdev->formats)); in simpledrm_device_create()
796 primary_plane = &sdev->primary_plane; in simpledrm_device_create()
798 sdev->formats, nformats, in simpledrm_device_create()
808 crtc = &sdev->crtc; in simpledrm_device_create()
817 encoder = &sdev->encoder; in simpledrm_device_create()
822 encoder->possible_crtcs = drm_crtc_mask(crtc); in simpledrm_device_create()
826 connector = &sdev->connector; in simpledrm_device_create()
876 dev = &sdev->dev; in simpledrm_probe()
882 color_mode = drm_format_info_bpp(sdev->format, 0); in simpledrm_probe()
884 color_mode = sdev->format->depth; // can be 15 or 16 in simpledrm_probe()
894 struct drm_device *dev = &sdev->dev; in simpledrm_remove()
900 { .compatible = "simple-framebuffer", },
907 .name = "simple-framebuffer", /* connect to sysfb */