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()
93 struct simplefb_par *par = info->par; in simplefb_destroy()
94 struct resource *mem = par->mem; in simplefb_destroy()
96 simplefb_regulators_destroy(info->par); in simplefb_destroy()
97 simplefb_clocks_destroy(info->par); in simplefb_destroy()
98 if (info->screen_base) in simplefb_destroy()
99 iounmap(info->screen_base); in simplefb_destroy()
104 release_mem_region(mem->start, resource_size(mem)); in simplefb_destroy()
128 struct device_node *np = pdev->dev.of_node; in simplefb_parse_dt()
133 ret = of_property_read_u32(np, "width", &params->width); in simplefb_parse_dt()
135 dev_err(&pdev->dev, "Can't parse width property\n"); in simplefb_parse_dt()
139 ret = of_property_read_u32(np, "height", &params->height); in simplefb_parse_dt()
141 dev_err(&pdev->dev, "Can't parse height property\n"); in simplefb_parse_dt()
145 ret = of_property_read_u32(np, "stride", &params->stride); in simplefb_parse_dt()
147 dev_err(&pdev->dev, "Can't parse stride property\n"); in simplefb_parse_dt()
153 dev_err(&pdev->dev, "Can't parse format property\n"); in simplefb_parse_dt()
156 params->format = NULL; in simplefb_parse_dt()
160 params->format = &simplefb_formats[i]; in simplefb_parse_dt()
163 if (!params->format) { in simplefb_parse_dt()
164 dev_err(&pdev->dev, "Invalid format value\n"); in simplefb_parse_dt()
165 return -EINVAL; in simplefb_parse_dt()
174 struct simplefb_platform_data *pd = dev_get_platdata(&pdev->dev); in simplefb_parse_pd()
177 params->width = pd->width; in simplefb_parse_pd()
178 params->height = pd->height; in simplefb_parse_pd()
179 params->stride = pd->stride; in simplefb_parse_pd()
181 params->format = NULL; in simplefb_parse_pd()
183 if (strcmp(pd->format, simplefb_formats[i].name)) in simplefb_parse_pd()
186 params->format = &simplefb_formats[i]; in simplefb_parse_pd()
190 if (!params->format) { in simplefb_parse_pd()
191 dev_err(&pdev->dev, "Invalid format value\n"); in simplefb_parse_pd()
192 return -EINVAL; in simplefb_parse_pd()
202 * Here we handle the clocks property of our "simple-framebuffer" dt node.
220 struct device_node *np = pdev->dev.of_node; in simplefb_clocks_get()
224 if (dev_get_platdata(&pdev->dev) || !np) in simplefb_clocks_get()
227 par->clk_count = of_clk_get_parent_count(np); in simplefb_clocks_get()
228 if (!par->clk_count) in simplefb_clocks_get()
231 par->clks = kcalloc(par->clk_count, sizeof(struct clk *), GFP_KERNEL); in simplefb_clocks_get()
232 if (!par->clks) in simplefb_clocks_get()
233 return -ENOMEM; in simplefb_clocks_get()
235 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_get()
238 if (PTR_ERR(clock) == -EPROBE_DEFER) { in simplefb_clocks_get()
239 while (--i >= 0) { in simplefb_clocks_get()
240 clk_put(par->clks[i]); in simplefb_clocks_get()
242 kfree(par->clks); in simplefb_clocks_get()
243 return -EPROBE_DEFER; in simplefb_clocks_get()
245 dev_err(&pdev->dev, "%s: clock %d not found: %ld\n", in simplefb_clocks_get()
249 par->clks[i] = clock; in simplefb_clocks_get()
260 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_enable()
261 if (par->clks[i]) { in simplefb_clocks_enable()
262 ret = clk_prepare_enable(par->clks[i]); in simplefb_clocks_enable()
264 dev_err(&pdev->dev, in simplefb_clocks_enable()
267 clk_put(par->clks[i]); in simplefb_clocks_enable()
268 par->clks[i] = NULL; in simplefb_clocks_enable()
272 par->clks_enabled = true; in simplefb_clocks_enable()
279 if (!par->clks) in simplefb_clocks_destroy()
282 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_destroy()
283 if (par->clks[i]) { in simplefb_clocks_destroy()
284 if (par->clks_enabled) in simplefb_clocks_destroy()
285 clk_disable_unprepare(par->clks[i]); in simplefb_clocks_destroy()
286 clk_put(par->clks[i]); in simplefb_clocks_destroy()
290 kfree(par->clks); in simplefb_clocks_destroy()
302 #define SUPPLY_SUFFIX "-supply"
307 * Here we handle the num-supplies and vin*-supply properties of our
308 * "simple-framebuffer" dt node. This is necessary so that we can make sure
326 struct device_node *np = pdev->dev.of_node; in simplefb_regulators_get()
332 if (dev_get_platdata(&pdev->dev) || !np) in simplefb_regulators_get()
337 p = strstr(prop->name, SUPPLY_SUFFIX); in simplefb_regulators_get()
338 if (p && p != prop->name) in simplefb_regulators_get()
345 par->regulators = devm_kcalloc(&pdev->dev, count, in simplefb_regulators_get()
347 if (!par->regulators) in simplefb_regulators_get()
348 return -ENOMEM; in simplefb_regulators_get()
354 p = strstr(prop->name, SUPPLY_SUFFIX); in simplefb_regulators_get()
355 if (!p || p == prop->name) in simplefb_regulators_get()
358 strscpy(name, prop->name, in simplefb_regulators_get()
359 strlen(prop->name) - strlen(SUPPLY_SUFFIX) + 1); in simplefb_regulators_get()
360 regulator = devm_regulator_get_optional(&pdev->dev, name); in simplefb_regulators_get()
362 if (PTR_ERR(regulator) == -EPROBE_DEFER) in simplefb_regulators_get()
363 return -EPROBE_DEFER; in simplefb_regulators_get()
364 dev_err(&pdev->dev, "regulator %s not found: %ld\n", in simplefb_regulators_get()
368 par->regulators[i++] = regulator; in simplefb_regulators_get()
370 par->regulator_count = i; in simplefb_regulators_get()
381 for (i = 0; i < par->regulator_count; i++) { in simplefb_regulators_enable()
382 ret = regulator_enable(par->regulators[i]); in simplefb_regulators_enable()
384 dev_err(&pdev->dev, in simplefb_regulators_enable()
387 devm_regulator_put(par->regulators[i]); in simplefb_regulators_enable()
388 par->regulators[i] = NULL; in simplefb_regulators_enable()
391 par->regulators_enabled = true; in simplefb_regulators_enable()
398 if (!par->regulators || !par->regulators_enabled) in simplefb_regulators_destroy()
401 for (i = 0; i < par->regulator_count; i++) in simplefb_regulators_destroy()
402 if (par->regulators[i]) in simplefb_regulators_destroy()
403 regulator_disable(par->regulators[i]); in simplefb_regulators_destroy()
422 return -ENODEV; in simplefb_probe()
424 ret = -ENODEV; in simplefb_probe()
425 if (dev_get_platdata(&pdev->dev)) in simplefb_probe()
427 else if (pdev->dev.of_node) in simplefb_probe()
435 dev_err(&pdev->dev, "No memory resource\n"); in simplefb_probe()
436 return -EINVAL; in simplefb_probe()
439 mem = request_mem_region(res->start, resource_size(res), "simplefb"); in simplefb_probe()
444 * the I/O-memory resource as-is and try to map that instead. in simplefb_probe()
446 dev_warn(&pdev->dev, "simplefb: cannot reserve video memory at %pR\n", res); in simplefb_probe()
450 info = framebuffer_alloc(sizeof(struct simplefb_par), &pdev->dev); in simplefb_probe()
452 ret = -ENOMEM; in simplefb_probe()
457 par = info->par; in simplefb_probe()
459 info->fix = simplefb_fix; in simplefb_probe()
460 info->fix.smem_start = mem->start; in simplefb_probe()
461 info->fix.smem_len = resource_size(mem); in simplefb_probe()
462 info->fix.line_length = params.stride; in simplefb_probe()
464 info->var = simplefb_var; in simplefb_probe()
465 info->var.xres = params.width; in simplefb_probe()
466 info->var.yres = params.height; in simplefb_probe()
467 info->var.xres_virtual = params.width; in simplefb_probe()
468 info->var.yres_virtual = params.height; in simplefb_probe()
469 info->var.bits_per_pixel = params.format->bits_per_pixel; in simplefb_probe()
470 info->var.red = params.format->red; in simplefb_probe()
471 info->var.green = params.format->green; in simplefb_probe()
472 info->var.blue = params.format->blue; in simplefb_probe()
473 info->var.transp = params.format->transp; in simplefb_probe()
475 info->apertures = alloc_apertures(1); in simplefb_probe()
476 if (!info->apertures) { in simplefb_probe()
477 ret = -ENOMEM; in simplefb_probe()
480 info->apertures->ranges[0].base = info->fix.smem_start; in simplefb_probe()
481 info->apertures->ranges[0].size = info->fix.smem_len; in simplefb_probe()
483 info->fbops = &simplefb_ops; in simplefb_probe()
484 info->flags = FBINFO_DEFAULT | FBINFO_MISC_FIRMWARE; in simplefb_probe()
485 info->screen_base = ioremap_wc(info->fix.smem_start, in simplefb_probe()
486 info->fix.smem_len); in simplefb_probe()
487 if (!info->screen_base) { in simplefb_probe()
488 ret = -ENOMEM; in simplefb_probe()
491 info->pseudo_palette = par->palette; in simplefb_probe()
504 dev_info(&pdev->dev, "framebuffer at 0x%lx, 0x%x bytes\n", in simplefb_probe()
505 info->fix.smem_start, info->fix.smem_len); in simplefb_probe()
506 dev_info(&pdev->dev, "format=%s, mode=%dx%dx%d, linelength=%d\n", in simplefb_probe()
507 params.format->name, in simplefb_probe()
508 info->var.xres, info->var.yres, in simplefb_probe()
509 info->var.bits_per_pixel, info->fix.line_length); in simplefb_probe()
512 par->mem = mem; /* release in clean-up handler */ in simplefb_probe()
516 dev_err(&pdev->dev, "Unable to register simplefb: %d\n", ret); in simplefb_probe()
520 dev_info(&pdev->dev, "fb%d: simplefb registered!\n", info->node); in simplefb_probe()
529 iounmap(info->screen_base); in simplefb_probe()
534 release_mem_region(mem->start, resource_size(mem)); in simplefb_probe()
549 { .compatible = "simple-framebuffer", },
556 .name = "simple-framebuffer",
566 MODULE_DESCRIPTION("Simple framebuffer driver");