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