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>
30 .id = "simple",
37 .height = -1,
38 .width = -1,
48 u32 *pal = info->pseudo_palette; in simplefb_setcolreg()
49 u32 cr = red >> (16 - info->var.red.length); in simplefb_setcolreg()
50 u32 cg = green >> (16 - info->var.green.length); in simplefb_setcolreg()
51 u32 cb = blue >> (16 - info->var.blue.length); in simplefb_setcolreg()
55 return -EINVAL; in simplefb_setcolreg()
57 value = (cr << info->var.red.offset) | in simplefb_setcolreg()
58 (cg << info->var.green.offset) | in simplefb_setcolreg()
59 (cb << info->var.blue.offset); in simplefb_setcolreg()
60 if (info->var.transp.length > 0) { in simplefb_setcolreg()
61 u32 mask = (1 << info->var.transp.length) - 1; in simplefb_setcolreg()
62 mask <<= info->var.transp.offset; in simplefb_setcolreg()
96 struct simplefb_par *par = info->par; in simplefb_destroy()
97 struct resource *mem = par->mem; in simplefb_destroy()
99 simplefb_regulators_destroy(info->par); in simplefb_destroy()
100 simplefb_clocks_destroy(info->par); in simplefb_destroy()
101 if (info->screen_base) in simplefb_destroy()
102 iounmap(info->screen_base); in simplefb_destroy()
107 release_mem_region(mem->start, resource_size(mem)); in simplefb_destroy()
129 struct device_node *np = pdev->dev.of_node; in simplefb_parse_dt()
134 ret = of_property_read_u32(np, "width", ¶ms->width); in simplefb_parse_dt()
136 dev_err(&pdev->dev, "Can't parse width property\n"); in simplefb_parse_dt()
140 ret = of_property_read_u32(np, "height", ¶ms->height); in simplefb_parse_dt()
142 dev_err(&pdev->dev, "Can't parse height property\n"); in simplefb_parse_dt()
146 ret = of_property_read_u32(np, "stride", ¶ms->stride); in simplefb_parse_dt()
148 dev_err(&pdev->dev, "Can't parse stride property\n"); in simplefb_parse_dt()
154 dev_err(&pdev->dev, "Can't parse format property\n"); in simplefb_parse_dt()
157 params->format = NULL; in simplefb_parse_dt()
161 params->format = &simplefb_formats[i]; in simplefb_parse_dt()
164 if (!params->format) { in simplefb_parse_dt()
165 dev_err(&pdev->dev, "Invalid format value\n"); in simplefb_parse_dt()
166 return -EINVAL; in simplefb_parse_dt()
175 struct simplefb_platform_data *pd = dev_get_platdata(&pdev->dev); in simplefb_parse_pd()
178 params->width = pd->width; in simplefb_parse_pd()
179 params->height = pd->height; in simplefb_parse_pd()
180 params->stride = pd->stride; in simplefb_parse_pd()
182 params->format = NULL; in simplefb_parse_pd()
184 if (strcmp(pd->format, simplefb_formats[i].name)) in simplefb_parse_pd()
187 params->format = &simplefb_formats[i]; in simplefb_parse_pd()
191 if (!params->format) { in simplefb_parse_pd()
192 dev_err(&pdev->dev, "Invalid format value\n"); in simplefb_parse_pd()
193 return -EINVAL; in simplefb_parse_pd()
203 * Here we handle the clocks property of our "simple-framebuffer" dt node.
221 struct device_node *np = pdev->dev.of_node; in simplefb_clocks_get()
225 if (dev_get_platdata(&pdev->dev) || !np) in simplefb_clocks_get()
228 par->clk_count = of_clk_get_parent_count(np); in simplefb_clocks_get()
229 if (!par->clk_count) in simplefb_clocks_get()
232 par->clks = kcalloc(par->clk_count, sizeof(struct clk *), GFP_KERNEL); in simplefb_clocks_get()
233 if (!par->clks) in simplefb_clocks_get()
234 return -ENOMEM; in simplefb_clocks_get()
236 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_get()
239 if (PTR_ERR(clock) == -EPROBE_DEFER) { in simplefb_clocks_get()
240 while (--i >= 0) { in simplefb_clocks_get()
241 clk_put(par->clks[i]); in simplefb_clocks_get()
243 kfree(par->clks); in simplefb_clocks_get()
244 return -EPROBE_DEFER; in simplefb_clocks_get()
246 dev_err(&pdev->dev, "%s: clock %d not found: %ld\n", in simplefb_clocks_get()
250 par->clks[i] = clock; in simplefb_clocks_get()
261 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_enable()
262 if (par->clks[i]) { in simplefb_clocks_enable()
263 ret = clk_prepare_enable(par->clks[i]); in simplefb_clocks_enable()
265 dev_err(&pdev->dev, in simplefb_clocks_enable()
268 clk_put(par->clks[i]); in simplefb_clocks_enable()
269 par->clks[i] = NULL; in simplefb_clocks_enable()
273 par->clks_enabled = true; in simplefb_clocks_enable()
280 if (!par->clks) in simplefb_clocks_destroy()
283 for (i = 0; i < par->clk_count; i++) { in simplefb_clocks_destroy()
284 if (par->clks[i]) { in simplefb_clocks_destroy()
285 if (par->clks_enabled) in simplefb_clocks_destroy()
286 clk_disable_unprepare(par->clks[i]); in simplefb_clocks_destroy()
287 clk_put(par->clks[i]); in simplefb_clocks_destroy()
291 kfree(par->clks); in simplefb_clocks_destroy()
303 #define SUPPLY_SUFFIX "-supply"
308 * Here we handle the num-supplies and vin*-supply properties of our
309 * "simple-framebuffer" dt node. This is necessary so that we can make sure
327 struct device_node *np = pdev->dev.of_node; in simplefb_regulators_get()
333 if (dev_get_platdata(&pdev->dev) || !np) in simplefb_regulators_get()
338 p = strstr(prop->name, SUPPLY_SUFFIX); in simplefb_regulators_get()
339 if (p && p != prop->name) in simplefb_regulators_get()
346 par->regulators = devm_kcalloc(&pdev->dev, count, in simplefb_regulators_get()
348 if (!par->regulators) in simplefb_regulators_get()
349 return -ENOMEM; in simplefb_regulators_get()
355 p = strstr(prop->name, SUPPLY_SUFFIX); in simplefb_regulators_get()
356 if (!p || p == prop->name) in simplefb_regulators_get()
359 strscpy(name, prop->name, in simplefb_regulators_get()
360 strlen(prop->name) - strlen(SUPPLY_SUFFIX) + 1); in simplefb_regulators_get()
361 regulator = devm_regulator_get_optional(&pdev->dev, name); in simplefb_regulators_get()
363 if (PTR_ERR(regulator) == -EPROBE_DEFER) in simplefb_regulators_get()
364 return -EPROBE_DEFER; in simplefb_regulators_get()
365 dev_err(&pdev->dev, "regulator %s not found: %ld\n", in simplefb_regulators_get()
369 par->regulators[i++] = regulator; in simplefb_regulators_get()
371 par->regulator_count = i; in simplefb_regulators_get()
382 for (i = 0; i < par->regulator_count; i++) { in simplefb_regulators_enable()
383 ret = regulator_enable(par->regulators[i]); in simplefb_regulators_enable()
385 dev_err(&pdev->dev, in simplefb_regulators_enable()
388 devm_regulator_put(par->regulators[i]); in simplefb_regulators_enable()
389 par->regulators[i] = NULL; in simplefb_regulators_enable()
392 par->regulators_enabled = true; in simplefb_regulators_enable()
399 if (!par->regulators || !par->regulators_enabled) in simplefb_regulators_destroy()
402 for (i = 0; i < par->regulator_count; i++) in simplefb_regulators_destroy()
403 if (par->regulators[i]) in simplefb_regulators_destroy()
404 regulator_disable(par->regulators[i]); in simplefb_regulators_destroy()
423 return -ENODEV; in simplefb_probe()
425 ret = -ENODEV; in simplefb_probe()
426 if (dev_get_platdata(&pdev->dev)) in simplefb_probe()
428 else if (pdev->dev.of_node) in simplefb_probe()
436 dev_err(&pdev->dev, "No memory resource\n"); in simplefb_probe()
437 return -EINVAL; in simplefb_probe()
440 mem = request_mem_region(res->start, resource_size(res), "simplefb"); in simplefb_probe()
445 * the I/O-memory resource as-is and try to map that instead. in simplefb_probe()
447 dev_warn(&pdev->dev, "simplefb: cannot reserve video memory at %pR\n", res); in simplefb_probe()
451 info = framebuffer_alloc(sizeof(struct simplefb_par), &pdev->dev); in simplefb_probe()
453 ret = -ENOMEM; in simplefb_probe()
458 par = info->par; in simplefb_probe()
460 info->fix = simplefb_fix; in simplefb_probe()
461 info->fix.smem_start = mem->start; in simplefb_probe()
462 info->fix.smem_len = resource_size(mem); in simplefb_probe()
463 info->fix.line_length = params.stride; in simplefb_probe()
465 info->var = simplefb_var; in simplefb_probe()
466 info->var.xres = params.width; in simplefb_probe()
467 info->var.yres = params.height; in simplefb_probe()
468 info->var.xres_virtual = params.width; in simplefb_probe()
469 info->var.yres_virtual = params.height; in simplefb_probe()
470 info->var.bits_per_pixel = params.format->bits_per_pixel; in simplefb_probe()
471 info->var.red = params.format->red; in simplefb_probe()
472 info->var.green = params.format->green; in simplefb_probe()
473 info->var.blue = params.format->blue; in simplefb_probe()
474 info->var.transp = params.format->transp; in simplefb_probe()
476 par->base = info->fix.smem_start; in simplefb_probe()
477 par->size = info->fix.smem_len; in simplefb_probe()
479 info->fbops = &simplefb_ops; in simplefb_probe()
480 info->screen_base = ioremap_wc(info->fix.smem_start, in simplefb_probe()
481 info->fix.smem_len); in simplefb_probe()
482 if (!info->screen_base) { in simplefb_probe()
483 ret = -ENOMEM; in simplefb_probe()
486 info->pseudo_palette = par->palette; in simplefb_probe()
499 dev_info(&pdev->dev, "framebuffer at 0x%lx, 0x%x bytes\n", in simplefb_probe()
500 info->fix.smem_start, info->fix.smem_len); in simplefb_probe()
501 dev_info(&pdev->dev, "format=%s, mode=%dx%dx%d, linelength=%d\n", in simplefb_probe()
502 params.format->name, in simplefb_probe()
503 info->var.xres, info->var.yres, in simplefb_probe()
504 info->var.bits_per_pixel, info->fix.line_length); in simplefb_probe()
507 par->mem = mem; /* release in clean-up handler */ in simplefb_probe()
509 ret = devm_aperture_acquire_for_platform_device(pdev, par->base, par->size); in simplefb_probe()
511 dev_err(&pdev->dev, "Unable to acquire aperture: %d\n", ret); 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()
547 { .compatible = "simple-framebuffer", },
554 .name = "simple-framebuffer",
564 MODULE_DESCRIPTION("Simple framebuffer driver");