1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2b5146b28SSimon Glass /*
3b5146b28SSimon Glass * Copyright (c) 2015 Google, Inc
4b5146b28SSimon Glass * (C) Copyright 2015
5b5146b28SSimon Glass * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com
6b5146b28SSimon Glass */
7b5146b28SSimon Glass
8b5146b28SSimon Glass #include <common.h>
9b5146b28SSimon Glass #include <dm.h>
10b5146b28SSimon Glass #include <video.h>
11b5146b28SSimon Glass #include <video_console.h>
12b5146b28SSimon Glass #include <video_font.h> /* Get font data, width and height */
13b5146b28SSimon Glass
console_set_row_1(struct udevice * dev,uint row,int clr)14b5146b28SSimon Glass static int console_set_row_1(struct udevice *dev, uint row, int clr)
15b5146b28SSimon Glass {
16b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
17b5146b28SSimon Glass int pbytes = VNBYTES(vid_priv->bpix);
18b5146b28SSimon Glass void *line;
19b5146b28SSimon Glass int i, j;
20b5146b28SSimon Glass
21b5146b28SSimon Glass line = vid_priv->fb + vid_priv->line_length -
22b5146b28SSimon Glass (row + 1) * VIDEO_FONT_HEIGHT * pbytes;
23b5146b28SSimon Glass for (j = 0; j < vid_priv->ysize; j++) {
24b5146b28SSimon Glass switch (vid_priv->bpix) {
25b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP8
26b5146b28SSimon Glass case VIDEO_BPP8: {
27b5146b28SSimon Glass uint8_t *dst = line;
28b5146b28SSimon Glass
29b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
30b5146b28SSimon Glass *dst++ = clr;
31b5146b28SSimon Glass break;
32b5146b28SSimon Glass }
33b5146b28SSimon Glass #endif
34b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP16
35b5146b28SSimon Glass case VIDEO_BPP16: {
36b5146b28SSimon Glass uint16_t *dst = line;
37b5146b28SSimon Glass
38b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
39b5146b28SSimon Glass *dst++ = clr;
40b5146b28SSimon Glass break;
41b5146b28SSimon Glass }
42b5146b28SSimon Glass #endif
43b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP32
44b5146b28SSimon Glass case VIDEO_BPP32: {
45b5146b28SSimon Glass uint32_t *dst = line;
46b5146b28SSimon Glass
47b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
48b5146b28SSimon Glass *dst++ = clr;
49b5146b28SSimon Glass break;
50b5146b28SSimon Glass }
51b5146b28SSimon Glass #endif
52b5146b28SSimon Glass default:
53b5146b28SSimon Glass return -ENOSYS;
54b5146b28SSimon Glass }
55b5146b28SSimon Glass line += vid_priv->line_length;
56b5146b28SSimon Glass }
57b5146b28SSimon Glass
58b5146b28SSimon Glass return 0;
59b5146b28SSimon Glass }
60b5146b28SSimon Glass
console_move_rows_1(struct udevice * dev,uint rowdst,uint rowsrc,uint count)61b5146b28SSimon Glass static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc,
62b5146b28SSimon Glass uint count)
63b5146b28SSimon Glass {
64b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
65b5146b28SSimon Glass void *dst;
66b5146b28SSimon Glass void *src;
67b5146b28SSimon Glass int pbytes = VNBYTES(vid_priv->bpix);
68b5146b28SSimon Glass int j;
69b5146b28SSimon Glass
70b5146b28SSimon Glass dst = vid_priv->fb + vid_priv->line_length -
71b5146b28SSimon Glass (rowdst + count) * VIDEO_FONT_HEIGHT * pbytes;
72b5146b28SSimon Glass src = vid_priv->fb + vid_priv->line_length -
73b5146b28SSimon Glass (rowsrc + count) * VIDEO_FONT_HEIGHT * pbytes;
74b5146b28SSimon Glass
75b5146b28SSimon Glass for (j = 0; j < vid_priv->ysize; j++) {
76b5146b28SSimon Glass memmove(dst, src, VIDEO_FONT_HEIGHT * pbytes * count);
77b5146b28SSimon Glass src += vid_priv->line_length;
78b5146b28SSimon Glass dst += vid_priv->line_length;
79b5146b28SSimon Glass }
80b5146b28SSimon Glass
81b5146b28SSimon Glass return 0;
82b5146b28SSimon Glass }
83b5146b28SSimon Glass
console_putc_xy_1(struct udevice * dev,uint x_frac,uint y,char ch)84f2661786SSimon Glass static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
85b5146b28SSimon Glass {
86f2661786SSimon Glass struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
87b5146b28SSimon Glass struct udevice *vid = dev->parent;
88b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid);
89b5146b28SSimon Glass int pbytes = VNBYTES(vid_priv->bpix);
90b5146b28SSimon Glass int i, col;
91b5146b28SSimon Glass int mask = 0x80;
92f2661786SSimon Glass void *line;
93b5146b28SSimon Glass uchar *pfont = video_fontdata + ch * VIDEO_FONT_HEIGHT;
94b5146b28SSimon Glass
95f2661786SSimon Glass line = vid_priv->fb + (VID_TO_PIXEL(x_frac) + 1) *
96f2661786SSimon Glass vid_priv->line_length - (y + 1) * pbytes;
97f2661786SSimon Glass if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
98f2661786SSimon Glass return -EAGAIN;
99f2661786SSimon Glass
100b5146b28SSimon Glass for (col = 0; col < VIDEO_FONT_HEIGHT; col++) {
101b5146b28SSimon Glass switch (vid_priv->bpix) {
102b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP8
103b5146b28SSimon Glass case VIDEO_BPP8: {
104b5146b28SSimon Glass uint8_t *dst = line;
105b5146b28SSimon Glass
106b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++) {
107b5146b28SSimon Glass *dst-- = (pfont[i] & mask) ? vid_priv->colour_fg
108b5146b28SSimon Glass : vid_priv->colour_bg;
109b5146b28SSimon Glass }
110b5146b28SSimon Glass break;
111b5146b28SSimon Glass }
112b5146b28SSimon Glass #endif
113b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP16
114b5146b28SSimon Glass case VIDEO_BPP16: {
115b5146b28SSimon Glass uint16_t *dst = line;
116b5146b28SSimon Glass
117b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++) {
118b5146b28SSimon Glass *dst-- = (pfont[i] & mask) ? vid_priv->colour_fg
119b5146b28SSimon Glass : vid_priv->colour_bg;
120b5146b28SSimon Glass }
121b5146b28SSimon Glass break;
122b5146b28SSimon Glass }
123b5146b28SSimon Glass #endif
124b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP32
125b5146b28SSimon Glass case VIDEO_BPP32: {
126b5146b28SSimon Glass uint32_t *dst = line;
127b5146b28SSimon Glass
128b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++) {
129b5146b28SSimon Glass *dst-- = (pfont[i] & mask) ? vid_priv->colour_fg
130b5146b28SSimon Glass : vid_priv->colour_bg;
131b5146b28SSimon Glass }
132b5146b28SSimon Glass break;
133b5146b28SSimon Glass }
134b5146b28SSimon Glass #endif
135b5146b28SSimon Glass default:
136b5146b28SSimon Glass return -ENOSYS;
137b5146b28SSimon Glass }
138b5146b28SSimon Glass line += vid_priv->line_length;
139b5146b28SSimon Glass mask >>= 1;
140b5146b28SSimon Glass }
141b5146b28SSimon Glass
142f2661786SSimon Glass return VID_TO_POS(VIDEO_FONT_WIDTH);
143b5146b28SSimon Glass }
144b5146b28SSimon Glass
145b5146b28SSimon Glass
console_set_row_2(struct udevice * dev,uint row,int clr)146b5146b28SSimon Glass static int console_set_row_2(struct udevice *dev, uint row, int clr)
147b5146b28SSimon Glass {
148b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
149b5146b28SSimon Glass void *line;
150b5146b28SSimon Glass int pixels = VIDEO_FONT_HEIGHT * vid_priv->xsize;
151b5146b28SSimon Glass int i;
152b5146b28SSimon Glass
153b5146b28SSimon Glass line = vid_priv->fb + vid_priv->ysize * vid_priv->line_length -
154b5146b28SSimon Glass (row + 1) * VIDEO_FONT_HEIGHT * vid_priv->line_length;
155b5146b28SSimon Glass switch (vid_priv->bpix) {
156b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP8
157b5146b28SSimon Glass case VIDEO_BPP8: {
158b5146b28SSimon Glass uint8_t *dst = line;
159b5146b28SSimon Glass
160b5146b28SSimon Glass for (i = 0; i < pixels; i++)
161b5146b28SSimon Glass *dst++ = clr;
162b5146b28SSimon Glass break;
163b5146b28SSimon Glass }
164b5146b28SSimon Glass #endif
165b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP16
166b5146b28SSimon Glass case VIDEO_BPP16: {
167b5146b28SSimon Glass uint16_t *dst = line;
168b5146b28SSimon Glass
169b5146b28SSimon Glass for (i = 0; i < pixels; i++)
170b5146b28SSimon Glass *dst++ = clr;
171b5146b28SSimon Glass break;
172b5146b28SSimon Glass }
173b5146b28SSimon Glass #endif
174b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP32
175b5146b28SSimon Glass case VIDEO_BPP32: {
176b5146b28SSimon Glass uint32_t *dst = line;
177b5146b28SSimon Glass
178b5146b28SSimon Glass for (i = 0; i < pixels; i++)
179b5146b28SSimon Glass *dst++ = clr;
180b5146b28SSimon Glass break;
181b5146b28SSimon Glass }
182b5146b28SSimon Glass #endif
183b5146b28SSimon Glass default:
184b5146b28SSimon Glass return -ENOSYS;
185b5146b28SSimon Glass }
186b5146b28SSimon Glass
187b5146b28SSimon Glass return 0;
188b5146b28SSimon Glass }
189b5146b28SSimon Glass
console_move_rows_2(struct udevice * dev,uint rowdst,uint rowsrc,uint count)190b5146b28SSimon Glass static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc,
191b5146b28SSimon Glass uint count)
192b5146b28SSimon Glass {
193b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
194b5146b28SSimon Glass void *dst;
195b5146b28SSimon Glass void *src;
196b5146b28SSimon Glass void *end;
197b5146b28SSimon Glass
198b5146b28SSimon Glass end = vid_priv->fb + vid_priv->ysize * vid_priv->line_length;
199b5146b28SSimon Glass dst = end - (rowdst + count) * VIDEO_FONT_HEIGHT *
200b5146b28SSimon Glass vid_priv->line_length;
201b5146b28SSimon Glass src = end - (rowsrc + count) * VIDEO_FONT_HEIGHT *
202b5146b28SSimon Glass vid_priv->line_length;
203b5146b28SSimon Glass memmove(dst, src, VIDEO_FONT_HEIGHT * vid_priv->line_length * count);
204b5146b28SSimon Glass
205b5146b28SSimon Glass return 0;
206b5146b28SSimon Glass }
207b5146b28SSimon Glass
console_putc_xy_2(struct udevice * dev,uint x_frac,uint y,char ch)208f2661786SSimon Glass static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
209b5146b28SSimon Glass {
210f2661786SSimon Glass struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
211b5146b28SSimon Glass struct udevice *vid = dev->parent;
212b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid);
213b5146b28SSimon Glass int i, row;
214b5146b28SSimon Glass void *line;
215b5146b28SSimon Glass
216f2661786SSimon Glass if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
217f2661786SSimon Glass return -EAGAIN;
218f2661786SSimon Glass
219b5146b28SSimon Glass line = vid_priv->fb + (vid_priv->ysize - y - 1) *
220b5146b28SSimon Glass vid_priv->line_length +
221f2661786SSimon Glass (vid_priv->xsize - VID_TO_PIXEL(x_frac) -
222f2661786SSimon Glass VIDEO_FONT_WIDTH - 1) * VNBYTES(vid_priv->bpix);
223b5146b28SSimon Glass
224b5146b28SSimon Glass for (row = 0; row < VIDEO_FONT_HEIGHT; row++) {
225b5146b28SSimon Glass uchar bits = video_fontdata[ch * VIDEO_FONT_HEIGHT + row];
226b5146b28SSimon Glass
227b5146b28SSimon Glass switch (vid_priv->bpix) {
228b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP8
229b5146b28SSimon Glass case VIDEO_BPP8: {
230b5146b28SSimon Glass uint8_t *dst = line;
231b5146b28SSimon Glass
232b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
233b5146b28SSimon Glass *dst-- = (bits & 0x80) ? vid_priv->colour_fg
234b5146b28SSimon Glass : vid_priv->colour_bg;
235b5146b28SSimon Glass bits <<= 1;
236b5146b28SSimon Glass }
237b5146b28SSimon Glass break;
238b5146b28SSimon Glass }
239b5146b28SSimon Glass #endif
240b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP16
241b5146b28SSimon Glass case VIDEO_BPP16: {
242b5146b28SSimon Glass uint16_t *dst = line;
243b5146b28SSimon Glass
244b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
245b5146b28SSimon Glass *dst-- = (bits & 0x80) ? vid_priv->colour_fg
246b5146b28SSimon Glass : vid_priv->colour_bg;
247b5146b28SSimon Glass bits <<= 1;
248b5146b28SSimon Glass }
249b5146b28SSimon Glass break;
250b5146b28SSimon Glass }
251b5146b28SSimon Glass #endif
252b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP32
253b5146b28SSimon Glass case VIDEO_BPP32: {
254b5146b28SSimon Glass uint32_t *dst = line;
255b5146b28SSimon Glass
256b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
257b5146b28SSimon Glass *dst-- = (bits & 0x80) ? vid_priv->colour_fg
258b5146b28SSimon Glass : vid_priv->colour_bg;
259b5146b28SSimon Glass bits <<= 1;
260b5146b28SSimon Glass }
261b5146b28SSimon Glass break;
262b5146b28SSimon Glass }
263b5146b28SSimon Glass #endif
264b5146b28SSimon Glass default:
265b5146b28SSimon Glass return -ENOSYS;
266b5146b28SSimon Glass }
267b5146b28SSimon Glass line -= vid_priv->line_length;
268b5146b28SSimon Glass }
269b5146b28SSimon Glass
270f2661786SSimon Glass return VID_TO_POS(VIDEO_FONT_WIDTH);
271b5146b28SSimon Glass }
272b5146b28SSimon Glass
console_set_row_3(struct udevice * dev,uint row,int clr)273b5146b28SSimon Glass static int console_set_row_3(struct udevice *dev, uint row, int clr)
274b5146b28SSimon Glass {
275b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
276b5146b28SSimon Glass int pbytes = VNBYTES(vid_priv->bpix);
277b5146b28SSimon Glass void *line;
278b5146b28SSimon Glass int i, j;
279b5146b28SSimon Glass
280b5146b28SSimon Glass line = vid_priv->fb + row * VIDEO_FONT_HEIGHT * pbytes;
281b5146b28SSimon Glass for (j = 0; j < vid_priv->ysize; j++) {
282b5146b28SSimon Glass switch (vid_priv->bpix) {
283b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP8
284b5146b28SSimon Glass case VIDEO_BPP8: {
285b5146b28SSimon Glass uint8_t *dst = line;
286b5146b28SSimon Glass
287b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
288b5146b28SSimon Glass *dst++ = clr;
289b5146b28SSimon Glass break;
290b5146b28SSimon Glass }
291b5146b28SSimon Glass #endif
292b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP16
293b5146b28SSimon Glass case VIDEO_BPP16: {
294b5146b28SSimon Glass uint16_t *dst = line;
295b5146b28SSimon Glass
296b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
297b5146b28SSimon Glass *dst++ = clr;
298b5146b28SSimon Glass break;
299b5146b28SSimon Glass }
300b5146b28SSimon Glass #endif
301b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP32
302b5146b28SSimon Glass case VIDEO_BPP32: {
303b5146b28SSimon Glass uint32_t *dst = line;
304b5146b28SSimon Glass
305b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
306b5146b28SSimon Glass *dst++ = clr;
307b5146b28SSimon Glass break;
308b5146b28SSimon Glass }
309b5146b28SSimon Glass #endif
310b5146b28SSimon Glass default:
311b5146b28SSimon Glass return -ENOSYS;
312b5146b28SSimon Glass }
313b5146b28SSimon Glass line += vid_priv->line_length;
314b5146b28SSimon Glass }
315b5146b28SSimon Glass
316b5146b28SSimon Glass return 0;
317b5146b28SSimon Glass }
318b5146b28SSimon Glass
console_move_rows_3(struct udevice * dev,uint rowdst,uint rowsrc,uint count)319b5146b28SSimon Glass static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc,
320b5146b28SSimon Glass uint count)
321b5146b28SSimon Glass {
322b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
323b5146b28SSimon Glass void *dst;
324b5146b28SSimon Glass void *src;
325b5146b28SSimon Glass int pbytes = VNBYTES(vid_priv->bpix);
326b5146b28SSimon Glass int j;
327b5146b28SSimon Glass
328b5146b28SSimon Glass dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * pbytes;
329b5146b28SSimon Glass src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * pbytes;
330b5146b28SSimon Glass
331b5146b28SSimon Glass for (j = 0; j < vid_priv->ysize; j++) {
332b5146b28SSimon Glass memmove(dst, src, VIDEO_FONT_HEIGHT * pbytes * count);
333b5146b28SSimon Glass src += vid_priv->line_length;
334b5146b28SSimon Glass dst += vid_priv->line_length;
335b5146b28SSimon Glass }
336b5146b28SSimon Glass
337b5146b28SSimon Glass return 0;
338b5146b28SSimon Glass }
339b5146b28SSimon Glass
console_putc_xy_3(struct udevice * dev,uint x_frac,uint y,char ch)340f2661786SSimon Glass static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
341b5146b28SSimon Glass {
342f2661786SSimon Glass struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
343b5146b28SSimon Glass struct udevice *vid = dev->parent;
344b5146b28SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid);
345b5146b28SSimon Glass int pbytes = VNBYTES(vid_priv->bpix);
346b5146b28SSimon Glass int i, col;
347b5146b28SSimon Glass int mask = 0x80;
348f2661786SSimon Glass void *line = vid_priv->fb +
349f2661786SSimon Glass (vid_priv->ysize - VID_TO_PIXEL(x_frac) - 1) *
350b5146b28SSimon Glass vid_priv->line_length + y * pbytes;
351b5146b28SSimon Glass uchar *pfont = video_fontdata + ch * VIDEO_FONT_HEIGHT;
352b5146b28SSimon Glass
353f2661786SSimon Glass if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
354f2661786SSimon Glass return -EAGAIN;
355f2661786SSimon Glass
356b5146b28SSimon Glass for (col = 0; col < VIDEO_FONT_HEIGHT; col++) {
357b5146b28SSimon Glass switch (vid_priv->bpix) {
358b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP8
359b5146b28SSimon Glass case VIDEO_BPP8: {
360b5146b28SSimon Glass uint8_t *dst = line;
361b5146b28SSimon Glass
362b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++) {
363b5146b28SSimon Glass *dst++ = (pfont[i] & mask) ? vid_priv->colour_fg
364b5146b28SSimon Glass : vid_priv->colour_bg;
365b5146b28SSimon Glass }
366b5146b28SSimon Glass break;
367b5146b28SSimon Glass }
368b5146b28SSimon Glass #endif
369b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP16
370b5146b28SSimon Glass case VIDEO_BPP16: {
371b5146b28SSimon Glass uint16_t *dst = line;
372b5146b28SSimon Glass
373b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++) {
374b5146b28SSimon Glass *dst++ = (pfont[i] & mask) ? vid_priv->colour_fg
375b5146b28SSimon Glass : vid_priv->colour_bg;
376b5146b28SSimon Glass }
377b5146b28SSimon Glass break;
378b5146b28SSimon Glass }
379b5146b28SSimon Glass #endif
380b5146b28SSimon Glass #ifdef CONFIG_VIDEO_BPP32
381b5146b28SSimon Glass case VIDEO_BPP32: {
382b5146b28SSimon Glass uint32_t *dst = line;
383b5146b28SSimon Glass
384b5146b28SSimon Glass for (i = 0; i < VIDEO_FONT_HEIGHT; i++) {
385b5146b28SSimon Glass *dst++ = (pfont[i] & mask) ? vid_priv->colour_fg
386b5146b28SSimon Glass : vid_priv->colour_bg;
387b5146b28SSimon Glass }
388b5146b28SSimon Glass break;
389b5146b28SSimon Glass }
390b5146b28SSimon Glass #endif
391b5146b28SSimon Glass default:
392b5146b28SSimon Glass return -ENOSYS;
393b5146b28SSimon Glass }
394b5146b28SSimon Glass line -= vid_priv->line_length;
395b5146b28SSimon Glass mask >>= 1;
396b5146b28SSimon Glass }
397b5146b28SSimon Glass
398f2661786SSimon Glass return VID_TO_POS(VIDEO_FONT_WIDTH);
399b5146b28SSimon Glass }
400b5146b28SSimon Glass
401b5146b28SSimon Glass
console_probe_2(struct udevice * dev)402f2661786SSimon Glass static int console_probe_2(struct udevice *dev)
403f2661786SSimon Glass {
404f2661786SSimon Glass struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
405f2661786SSimon Glass struct udevice *vid_dev = dev->parent;
406f2661786SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev);
407f2661786SSimon Glass
408f2661786SSimon Glass vc_priv->x_charsize = VIDEO_FONT_WIDTH;
409f2661786SSimon Glass vc_priv->y_charsize = VIDEO_FONT_HEIGHT;
410f2661786SSimon Glass vc_priv->cols = vid_priv->xsize / VIDEO_FONT_WIDTH;
411f2661786SSimon Glass vc_priv->rows = vid_priv->ysize / VIDEO_FONT_HEIGHT;
412f2661786SSimon Glass
413f2661786SSimon Glass return 0;
414f2661786SSimon Glass }
415f2661786SSimon Glass
console_probe_1_3(struct udevice * dev)416b5146b28SSimon Glass static int console_probe_1_3(struct udevice *dev)
417b5146b28SSimon Glass {
418f2661786SSimon Glass struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
419f2661786SSimon Glass struct udevice *vid_dev = dev->parent;
420f2661786SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev);
421b5146b28SSimon Glass
422f2661786SSimon Glass vc_priv->x_charsize = VIDEO_FONT_WIDTH;
423f2661786SSimon Glass vc_priv->y_charsize = VIDEO_FONT_HEIGHT;
424f2661786SSimon Glass vc_priv->cols = vid_priv->ysize / VIDEO_FONT_WIDTH;
425f2661786SSimon Glass vc_priv->rows = vid_priv->xsize / VIDEO_FONT_HEIGHT;
426f2661786SSimon Glass vc_priv->xsize_frac = VID_TO_POS(vid_priv->ysize);
427b5146b28SSimon Glass
428b5146b28SSimon Glass return 0;
429b5146b28SSimon Glass }
430b5146b28SSimon Glass
431b5146b28SSimon Glass struct vidconsole_ops console_ops_1 = {
432b5146b28SSimon Glass .putc_xy = console_putc_xy_1,
433b5146b28SSimon Glass .move_rows = console_move_rows_1,
434b5146b28SSimon Glass .set_row = console_set_row_1,
435b5146b28SSimon Glass };
436b5146b28SSimon Glass
437b5146b28SSimon Glass struct vidconsole_ops console_ops_2 = {
438b5146b28SSimon Glass .putc_xy = console_putc_xy_2,
439b5146b28SSimon Glass .move_rows = console_move_rows_2,
440b5146b28SSimon Glass .set_row = console_set_row_2,
441b5146b28SSimon Glass };
442b5146b28SSimon Glass
443b5146b28SSimon Glass struct vidconsole_ops console_ops_3 = {
444b5146b28SSimon Glass .putc_xy = console_putc_xy_3,
445b5146b28SSimon Glass .move_rows = console_move_rows_3,
446b5146b28SSimon Glass .set_row = console_set_row_3,
447b5146b28SSimon Glass };
448b5146b28SSimon Glass
449b5146b28SSimon Glass U_BOOT_DRIVER(vidconsole_1) = {
450b5146b28SSimon Glass .name = "vidconsole1",
451b5146b28SSimon Glass .id = UCLASS_VIDEO_CONSOLE,
452b5146b28SSimon Glass .ops = &console_ops_1,
453b5146b28SSimon Glass .probe = console_probe_1_3,
454b5146b28SSimon Glass };
455b5146b28SSimon Glass
456b5146b28SSimon Glass U_BOOT_DRIVER(vidconsole_2) = {
457b5146b28SSimon Glass .name = "vidconsole2",
458b5146b28SSimon Glass .id = UCLASS_VIDEO_CONSOLE,
459b5146b28SSimon Glass .ops = &console_ops_2,
460f2661786SSimon Glass .probe = console_probe_2,
461b5146b28SSimon Glass };
462b5146b28SSimon Glass
463b5146b28SSimon Glass U_BOOT_DRIVER(vidconsole_3) = {
464b5146b28SSimon Glass .name = "vidconsole3",
465b5146b28SSimon Glass .id = UCLASS_VIDEO_CONSOLE,
466b5146b28SSimon Glass .ops = &console_ops_3,
467b5146b28SSimon Glass .probe = console_probe_1_3,
468b5146b28SSimon Glass };
469