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