Lines Matching +full:simple +full:- +full:framebuffer
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Simplest possible simple frame-buffer driver, as a platform device
8 * Copyright (C) 2001 Richard Zidlicky <rz@linux-m68k.org>
29 .id = "simple",
36 .height = -1,
37 .width = -1,
47 u32 *pal = info->pseudo_palette; in simplefb_setcolreg()
48 u32 cr = red >> (16 - info->var.red.length); in simplefb_setcolreg()
49 u32 cg = green >> (16 - info->var.green.length); in simplefb_setcolreg()
50 u32 cb = blue >> (16 - info->var.blue.length); in simplefb_setcolreg()
54 return -EINVAL; in simplefb_setcolreg()
56 value = (cr << info->var.red.offset) | in simplefb_setcolreg()
57 (cg << info->var.green.offset) | in simplefb_setcolreg()
58 (cb << info->var.blue.offset); in simplefb_setcolreg()
59 if (info->var.transp.length > 0) { in simplefb_setcolreg()
60 u32 mask = (1 << info->var.transp.length) - 1; in simplefb_setcolreg()
61 mask <<= info->var.transp.offset; in simplefb_setcolreg()
75 simplefb_regulators_destroy(info->par); in simplefb_destroy()
76 simplefb_clocks_destroy(info->par); in simplefb_destroy()
77 if (info->screen_base) in simplefb_destroy()
78 iounmap(info->screen_base); in simplefb_destroy()
102 struct device_node *np = pdev->dev.of_node; in simplefb_parse_dt()
107 ret = of_property_read_u32(np, "width", ¶ms->width); in simplefb_parse_dt()
109 dev_err(&pdev->dev, "Can't parse width property\n"); in simplefb_parse_dt()
113 ret = of_property_read_u32(np, "height", ¶ms->height); in simplefb_parse_dt()
115 dev_err(&pdev->dev, "Can't parse height property\n"); in simplefb_parse_dt()
119 ret = of_property_read_u32(np, "stride", ¶ms->stride); in simplefb_parse_dt()
121 dev_err(&pdev->dev, "Can't parse stride property\n"); in simplefb_parse_dt()
127 dev_err(&pdev->dev, "Can't parse format property\n"); in simplefb_parse_dt()
130 params->format = NULL; in simplefb_parse_dt()
134 params->format = &simplefb_formats[i]; in simplefb_parse_dt()
137 if (!params->format) { in simplefb_parse_dt()
138 dev_err(&pdev->dev, "Invalid format value\n"); in simplefb_parse_dt()
139 return -EINVAL; in simplefb_parse_dt()
148 struct simplefb_platform_data *pd = dev_get_platdata(&pdev->dev); in simplefb_parse_pd()
151 params->width = pd->width; in simplefb_parse_pd()
152 params->height = pd->height; in simplefb_parse_pd()
153 params->stride = pd->stride; in simplefb_parse_pd()
155 params->format = NULL; in simplefb_parse_pd()
157 if (strcmp(pd->format, simplefb_formats[i].name)) in simplefb_parse_pd()
160 params->format = &simplefb_formats[i]; in simplefb_parse_pd()
164 if (!params->format) { in simplefb_parse_pd()
165 dev_err(&pdev->dev, "Invalid format value\n"); in simplefb_parse_pd()
166 return -EINVAL; in simplefb_parse_pd()
190 * Here we handle the clocks property of our "simple-framebuffer" dt node.
208 struct device_node *np = pdev->dev.of_node; in simplefb_clocks_get()
212 if (dev_get_platdata(&pdev->dev) || !np) in simplefb_clocks_get()
215 par->clk_count = of_clk_get_parent_count(np); in simplefb_clocks_get()
216 if (!par->clk_count) in simplefb_clocks_get()
219 par->clks = kcalloc(par->clk_count, sizeof(struct clk *), GFP_KERNEL); in simplefb_clocks_get()
220 if (!par->clks) in simplefb_clocks_get()
221 return -ENOMEM; in simplefb_clocks_get()
223 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_get()
226 if (PTR_ERR(clock) == -EPROBE_DEFER) { in simplefb_clocks_get()
227 while (--i >= 0) { in simplefb_clocks_get()
228 if (par->clks[i]) in simplefb_clocks_get()
229 clk_put(par->clks[i]); in simplefb_clocks_get()
231 kfree(par->clks); in simplefb_clocks_get()
232 return -EPROBE_DEFER; in simplefb_clocks_get()
234 dev_err(&pdev->dev, "%s: clock %d not found: %ld\n", in simplefb_clocks_get()
238 par->clks[i] = clock; in simplefb_clocks_get()
249 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_enable()
250 if (par->clks[i]) { in simplefb_clocks_enable()
251 ret = clk_prepare_enable(par->clks[i]); in simplefb_clocks_enable()
253 dev_err(&pdev->dev, in simplefb_clocks_enable()
256 clk_put(par->clks[i]); in simplefb_clocks_enable()
257 par->clks[i] = NULL; in simplefb_clocks_enable()
261 par->clks_enabled = true; in simplefb_clocks_enable()
268 if (!par->clks) in simplefb_clocks_destroy()
271 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_destroy()
272 if (par->clks[i]) { in simplefb_clocks_destroy()
273 if (par->clks_enabled) in simplefb_clocks_destroy()
274 clk_disable_unprepare(par->clks[i]); in simplefb_clocks_destroy()
275 clk_put(par->clks[i]); in simplefb_clocks_destroy()
279 kfree(par->clks); in simplefb_clocks_destroy()
291 #define SUPPLY_SUFFIX "-supply"
296 * Here we handle the num-supplies and vin*-supply properties of our
297 * "simple-framebuffer" dt node. This is necessary so that we can make sure
315 struct device_node *np = pdev->dev.of_node; in simplefb_regulators_get()
321 if (dev_get_platdata(&pdev->dev) || !np) in simplefb_regulators_get()
326 p = strstr(prop->name, SUPPLY_SUFFIX); in simplefb_regulators_get()
327 if (p && p != prop->name) in simplefb_regulators_get()
334 par->regulators = devm_kcalloc(&pdev->dev, count, in simplefb_regulators_get()
336 if (!par->regulators) in simplefb_regulators_get()
337 return -ENOMEM; in simplefb_regulators_get()
343 p = strstr(prop->name, SUPPLY_SUFFIX); in simplefb_regulators_get()
344 if (!p || p == prop->name) in simplefb_regulators_get()
347 strlcpy(name, prop->name, in simplefb_regulators_get()
348 strlen(prop->name) - strlen(SUPPLY_SUFFIX) + 1); in simplefb_regulators_get()
349 regulator = devm_regulator_get_optional(&pdev->dev, name); in simplefb_regulators_get()
351 if (PTR_ERR(regulator) == -EPROBE_DEFER) in simplefb_regulators_get()
352 return -EPROBE_DEFER; in simplefb_regulators_get()
353 dev_err(&pdev->dev, "regulator %s not found: %ld\n", in simplefb_regulators_get()
357 par->regulators[i++] = regulator; in simplefb_regulators_get()
359 par->regulator_count = i; in simplefb_regulators_get()
370 for (i = 0; i < par->regulator_count; i++) { in simplefb_regulators_enable()
371 ret = regulator_enable(par->regulators[i]); in simplefb_regulators_enable()
373 dev_err(&pdev->dev, in simplefb_regulators_enable()
376 devm_regulator_put(par->regulators[i]); in simplefb_regulators_enable()
377 par->regulators[i] = NULL; in simplefb_regulators_enable()
380 par->regulators_enabled = true; in simplefb_regulators_enable()
387 if (!par->regulators || !par->regulators_enabled) in simplefb_regulators_destroy()
390 for (i = 0; i < par->regulator_count; i++) in simplefb_regulators_destroy()
391 if (par->regulators[i]) in simplefb_regulators_destroy()
392 regulator_disable(par->regulators[i]); in simplefb_regulators_destroy()
411 return -ENODEV; in simplefb_probe()
413 ret = -ENODEV; in simplefb_probe()
414 if (dev_get_platdata(&pdev->dev)) in simplefb_probe()
416 else if (pdev->dev.of_node) in simplefb_probe()
424 dev_err(&pdev->dev, "No memory resource\n"); in simplefb_probe()
425 return -EINVAL; in simplefb_probe()
428 info = framebuffer_alloc(sizeof(struct simplefb_par), &pdev->dev); in simplefb_probe()
430 return -ENOMEM; in simplefb_probe()
433 par = info->par; in simplefb_probe()
435 info->fix = simplefb_fix; in simplefb_probe()
436 info->fix.smem_start = mem->start; in simplefb_probe()
437 info->fix.smem_len = resource_size(mem); in simplefb_probe()
438 info->fix.line_length = params.stride; in simplefb_probe()
440 info->var = simplefb_var; in simplefb_probe()
441 info->var.xres = params.width; in simplefb_probe()
442 info->var.yres = params.height; in simplefb_probe()
443 info->var.xres_virtual = params.width; in simplefb_probe()
444 info->var.yres_virtual = params.height; in simplefb_probe()
445 info->var.bits_per_pixel = params.format->bits_per_pixel; in simplefb_probe()
446 info->var.red = params.format->red; in simplefb_probe()
447 info->var.green = params.format->green; in simplefb_probe()
448 info->var.blue = params.format->blue; in simplefb_probe()
449 info->var.transp = params.format->transp; in simplefb_probe()
451 info->apertures = alloc_apertures(1); in simplefb_probe()
452 if (!info->apertures) { in simplefb_probe()
453 ret = -ENOMEM; in simplefb_probe()
456 info->apertures->ranges[0].base = info->fix.smem_start; in simplefb_probe()
457 info->apertures->ranges[0].size = info->fix.smem_len; in simplefb_probe()
459 info->fbops = &simplefb_ops; in simplefb_probe()
460 info->flags = FBINFO_DEFAULT | FBINFO_MISC_FIRMWARE; in simplefb_probe()
461 info->screen_base = ioremap_wc(info->fix.smem_start, in simplefb_probe()
462 info->fix.smem_len); in simplefb_probe()
463 if (!info->screen_base) { in simplefb_probe()
464 ret = -ENOMEM; in simplefb_probe()
467 info->pseudo_palette = par->palette; in simplefb_probe()
480 dev_info(&pdev->dev, "framebuffer at 0x%lx, 0x%x bytes, mapped to 0x%p\n", in simplefb_probe()
481 info->fix.smem_start, info->fix.smem_len, in simplefb_probe()
482 info->screen_base); in simplefb_probe()
483 dev_info(&pdev->dev, "format=%s, mode=%dx%dx%d, linelength=%d\n", in simplefb_probe()
484 params.format->name, in simplefb_probe()
485 info->var.xres, info->var.yres, in simplefb_probe()
486 info->var.bits_per_pixel, info->fix.line_length); in simplefb_probe()
490 dev_err(&pdev->dev, "Unable to register simplefb: %d\n", ret); in simplefb_probe()
494 dev_info(&pdev->dev, "fb%d: simplefb registered!\n", info->node); in simplefb_probe()
503 iounmap(info->screen_base); in simplefb_probe()
520 { .compatible = "simple-framebuffer", },
527 .name = "simple-framebuffer",
545 if (of_device_is_compatible(np, "simple-framebuffer")) in simplefb_init()
556 MODULE_DESCRIPTION("Simple framebuffer driver");