aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-03-28 17:04:45 -0400
committerTom Rini <trini@konsulko.com>2022-03-28 17:04:45 -0400
commitd2e5250be49fce4653689c41a5dc7e2d7e7ecf33 (patch)
tree47a7fd743dc2266a71b23c46c2a6d7e12e4a5833 /drivers
parent34d2b7f20369d62c0f091d6572a8c0ea4655cf14 (diff)
parent60cc4094485bf44b5ad455b51076f0e07f3f793a (diff)
downloadu-boot-WIP/28Mar2022.zip
u-boot-WIP/28Mar2022.tar.gz
u-boot-WIP/28Mar2022.tar.bz2
Merge tag 'next-20220328' of https://source.denx.de/u-boot/custodians/u-boot-video into nextWIP/28Mar2022
- drop old CFB code - drop CONFIG_LCD_BMP_RLE8
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pci/pci_rom.c1
-rw-r--r--drivers/video/Kconfig129
-rw-r--r--drivers/video/Makefile5
-rw-r--r--drivers/video/cfb_console.c1865
-rw-r--r--drivers/video/da8xx-fb.c1048
-rw-r--r--drivers/video/da8xx-fb.h115
-rw-r--r--drivers/video/formike.c513
-rw-r--r--drivers/video/fsl_dcu_fb.c549
-rw-r--r--drivers/video/fsl_diu_fb.c416
-rw-r--r--drivers/video/imx/mxc_ipuv3_fb.c1
-rw-r--r--drivers/video/mxsfb.c90
-rw-r--r--drivers/video/nexell_display.c17
-rw-r--r--drivers/video/omap3_dss.c29
-rw-r--r--drivers/video/sunxi/sunxi_display.c1
14 files changed, 11 insertions, 4768 deletions
diff --git a/drivers/pci/pci_rom.c b/drivers/pci/pci_rom.c
index f8b1930..73d15e7 100644
--- a/drivers/pci/pci_rom.c
+++ b/drivers/pci/pci_rom.c
@@ -36,7 +36,6 @@
#include <pci_rom.h>
#include <vbe.h>
#include <video.h>
-#include <video_fb.h>
#include <acpi/acpi_s3.h>
#include <asm/global_data.h>
#include <linux/screen_info.h>
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 1bf7f4a..965b587 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -430,6 +430,14 @@ config ATMEL_LCD_BGR555
help
Use the BGR555 output mode. Otherwise RGB565 is used.
+config VIDEO_BCM2835
+ bool "Display support for BCM2835"
+ help
+ The graphics processor already sets up the display so this driver
+ simply checks the resolution and then sets up the frame buffer with
+ that same resolution (or as near as possible) and 32bpp depth, so
+ that U-Boot can access it with full colour depth.
+
config VIDEO_LCD_ORISETECH_OTM8009A
bool "OTM8009A DSI LCD panel support"
depends on DM_VIDEO
@@ -610,21 +618,6 @@ config VIDEO_IVYBRIDGE_IGD
a special tool which configures the VGA ROM, but the graphics
resolution can be selected in U-Boot.
-config VIDEO_FSL_DCU_FB
- bool "Enable Freescale Display Control Unit"
- depends on VIDEO || DM_VIDEO
- help
- This enables support for Freescale Display Control Unit (DCU4)
- module found on Freescale Vybrid and QorIQ family of SoCs.
-
-config VIDEO_FSL_DCU_MAX_FB_SIZE_MB
- int "Freescale DCU framebuffer size"
- depends on VIDEO_FSL_DCU_FB
- default 4194304
- help
- Set maximum framebuffer size to be used for Freescale Display
- Controller Unit (DCU4).
-
source "drivers/video/rockchip/Kconfig"
config VIDEO_ARM_MALIDP
@@ -708,89 +701,9 @@ config VIDEO
model. Video drivers typically provide a colour text console and
cursor.
-config CFB_CONSOLE
- bool "Enable colour frame buffer console"
- depends on VIDEO || ARCH_OMAP2PLUS
- default y if VIDEO
- help
- Enables the colour frame buffer driver. This supports colour
- output on a bitmap display from an in-memory frame buffer.
- Several colour devices are supported along with various options to
- adjust the supported features. The driver is implemented in
- cfb_console.c
-
- The following defines are needed (cf. smiLynxEM, i8042)
- VIDEO_FB_LITTLE_ENDIAN graphic memory organisation
- (default big endian)
- VIDEO_HW_RECTFILL graphic chip supports
- rectangle fill (cf. smiLynxEM)
- VIDEO_HW_BITBLT graphic chip supports
- bit-blit (cf. smiLynxEM)
- VIDEO_VISIBLE_COLS visible pixel columns (cols=pitch)
- VIDEO_VISIBLE_ROWS visible pixel rows
- VIDEO_PIXEL_SIZE bytes per pixel
- VIDEO_DATA_FORMAT graphic data format
- (0-5, cf. cfb_console.c)
- VIDEO_FB_ADRS framebuffer address
- VIDEO_KBD_INIT_FCT keyboard int fct (i.e. rx51_kp_init())
- VIDEO_TSTC_FCT test char fct (i.e. rx51_kp_tstc)
- VIDEO_GETC_FCT get char fct (i.e. rx51_kp_getc)
- CONFIG_VIDEO_LOGO display Linux logo in upper left corner
- CONFIG_VIDEO_BMP_LOGO use bmp_logo.h instead of linux_logo.h
- for logo. Requires CONFIG_VIDEO_LOGO
- CONFIG_CONSOLE_EXTRA_INFO
- additional board info beside
- the logo
- CONFIG_HIDE_LOGO_VERSION
- do not display bootloader
- version string
-
- When CONFIG_CFB_CONSOLE is defined, the video console is the
- default console. The serial console can be forced by setting the
- environment 'console=serial'.
-
-config CFB_CONSOLE_ANSI
- bool "Support ANSI escape sequences"
- depends on CFB_CONSOLE
- help
- This allows the colour buffer frame buffer driver to support
- a limited number of ANSI escape sequences (cursor control,
- erase functions and limited graphics rendition control). Normal
- output from U-Boot will pass through this filter.
-
-config VGA_AS_SINGLE_DEVICE
- bool "Set the video as an output-only device"
- depends on CFB_CONSOLE
- default y
- help
- If enable the framebuffer device will be initialized as an
- output-only device. The Keyboard driver will not be set up. This
- may be used if you have no keyboard device, or more than one
- (USB Keyboard, AT Keyboard).
-
-config VIDEO_SW_CURSOR
- bool "Enable a software cursor"
- depends on CFB_CONSOLE
- default y if CFB_CONSOLE
- help
- This draws a cursor after the last character. No blinking is
- provided. This makes it possible to see the current cursor
- position when entering text on the console. It is recommended to
- enable this.
-
-config CONSOLE_EXTRA_INFO
- bool "Display additional board information"
- depends on CFB_CONSOLE
- help
- Display additional board information strings that normally go to
- the serial port. When this option is enabled, a board-specific
- function video_get_info_str() is called to get the string for
- each line of the display. The function should return the string,
- which can be empty if there is nothing to display for that line.
-
config CONSOLE_SCROLL_LINES
int "Number of lines to scroll the console by"
- depends on CFB_CONSOLE || DM_VIDEO || LCD
+ depends on DM_VIDEO || LCD
default 1
help
When the console need to be scrolled, this is the number of
@@ -798,28 +711,6 @@ config CONSOLE_SCROLL_LINES
console jump but can help speed up operation when scrolling
is slow.
-config SYS_CONSOLE_BG_COL
- hex "Background colour"
- depends on CFB_CONSOLE
- default 0x00
- help
- Defines the background colour for the console. The value is from
- 0x00 to 0xff and the meaning depends on the graphics card.
- Typically, 0x00 means black and 0xff means white. Do not set
- the background and foreground to the same colour or you will see
- nothing.
-
-config SYS_CONSOLE_FG_COL
- hex "Foreground colour"
- depends on CFB_CONSOLE
- default 0xa0
- help
- Defines the foreground colour for the console. The value is from
- 0x00 to 0xff and the meaning depends on the graphics card.
- Typically, 0x00 means black and 0xff means white. Do not set
- the background and foreground to the same colour or you will see
- nothing.
-
config LCD
bool "Enable legacy LCD support"
help
@@ -1017,7 +908,7 @@ config VIDEO_BMP_GZIP
config VIDEO_BMP_RLE8
bool "Run length encoded BMP image (RLE8) support"
- depends on DM_VIDEO || CFB_CONSOLE
+ depends on DM_VIDEO
help
If this option is set, the 8-bit RLE compressed BMP images
is supported.
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index 2530791..2596580 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -30,9 +30,6 @@ obj-y += ti/
obj-$(CONFIG_ATMEL_HLCD) += atmel_hlcdfb.o
obj-$(CONFIG_ATMEL_LCD) += atmel_lcdfb.o
-obj-$(CONFIG_CFB_CONSOLE) += cfb_console.o
-obj-$(CONFIG_FORMIKE) += formike.o
-obj-$(CONFIG_FSL_DIU_FB) += fsl_diu_fb.o videomodes.o
obj-$(CONFIG_IHS_VIDEO_OUT) += ihs_video_out.o
obj-$(CONFIG_LD9040) += ld9040.o
obj-$(CONFIG_LG4573) += lg4573.o
@@ -47,11 +44,9 @@ obj-$(CONFIG_VIDEO_ARM_MALIDP) += mali_dp.o
obj-$(CONFIG_VIDEO_BCM2835) += bcm2835.o
obj-$(CONFIG_VIDEO_BROADWELL_IGD) += broadwell_igd.o
obj-$(CONFIG_VIDEO_COREBOOT) += coreboot.o
-obj-$(CONFIG_VIDEO_DA8XX) += da8xx-fb.o videomodes.o
obj-$(CONFIG_VIDEO_DW_HDMI) += dw_hdmi.o
obj-$(CONFIG_VIDEO_DW_MIPI_DSI) += dw_mipi_dsi.o
obj-$(CONFIG_VIDEO_EFI) += efi.o
-obj-$(CONFIG_VIDEO_FSL_DCU_FB) += fsl_dcu_fb.o videomodes.o
obj-$(CONFIG_VIDEO_IPUV3) += imx/
obj-$(CONFIG_VIDEO_IVYBRIDGE_IGD) += ivybridge_igd.o
obj-$(CONFIG_VIDEO_LCD_ANX9804) += anx9804.o
diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c
deleted file mode 100644
index 52b109f..0000000
--- a/drivers/video/cfb_console.c
+++ /dev/null
@@ -1,1865 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2002 ELTEC Elektronik AG
- * Frank Gottschling <fgottschling@eltec.de>
- */
-
-/*
- * cfb_console.c
- *
- * Color Framebuffer Console driver for 8/15/16/24/32 bits per pixel.
- *
- * At the moment only the 8x16 font is tested and the font fore- and
- * background color is limited to black/white/gray colors. The Linux
- * logo can be placed in the upper left corner and additional board
- * information strings (that normally goes to serial port) can be drawn.
- *
- * The console driver can use a keyboard interface for character input
- * but this is deprecated. Only rk51 uses it.
- *
- * Character output goes to a memory-mapped video
- * framebuffer with little or big-endian organisation.
- * With environment setting 'console=serial' the console i/o can be
- * forced to serial port.
- *
- * The driver uses graphic specific defines/parameters/functions:
- *
- * (for SMI LynxE graphic chip)
- *
- * VIDEO_FB_LITTLE_ENDIAN - framebuffer organisation default: big endian
- * VIDEO_HW_RECTFILL - graphic driver supports hardware rectangle fill
- * VIDEO_HW_BITBLT - graphic driver supports hardware bit blt
- *
- * Console Parameters are set by graphic drivers global struct:
- *
- * VIDEO_VISIBLE_COLS - x resolution
- * VIDEO_VISIBLE_ROWS - y resolution
- * VIDEO_PIXEL_SIZE - storage size in byte per pixel
- * VIDEO_DATA_FORMAT - graphical data format GDF
- * VIDEO_FB_ADRS - start of video memory
- *
- * VIDEO_KBD_INIT_FCT - init function for keyboard
- * VIDEO_TSTC_FCT - keyboard_tstc function
- * VIDEO_GETC_FCT - keyboard_getc function
- *
- * CONFIG_VIDEO_BMP_LOGO - use bmp_logo instead of linux_logo
- * CONFIG_CONSOLE_EXTRA_INFO - display additional board information
- * strings that normaly goes to serial
- * port. This define requires a board
- * specific function:
- * video_drawstring (VIDEO_INFO_X,
- * VIDEO_INFO_Y + i*VIDEO_FONT_HEIGHT,
- * info);
- * that fills a info buffer at i=row.
- * s.a: board/eltec/bab7xx.
- *
- * CONFIG_VIDEO_SW_CURSOR: - Draws a cursor after the last
- * character. No blinking is provided.
- * Uses the macros CURSOR_SET and
- * CURSOR_OFF.
- */
-
-#include <common.h>
-#include <command.h>
-#include <cpu_func.h>
-#include <env.h>
-#include <fdtdec.h>
-#include <gzip.h>
-#include <log.h>
-#include <version_string.h>
-#include <malloc.h>
-#include <video.h>
-#include <asm/global_data.h>
-#include <dm/ofnode.h>
-#include <linux/compiler.h>
-
-/*
- * Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc.
- */
-#include <video_fb.h>
-
-#include <splash.h>
-
-/*
- * some Macros
- */
-#define VIDEO_VISIBLE_COLS (pGD->winSizeX)
-#define VIDEO_VISIBLE_ROWS (pGD->winSizeY)
-#define VIDEO_PIXEL_SIZE (pGD->gdfBytesPP)
-#define VIDEO_DATA_FORMAT (pGD->gdfIndex)
-#define VIDEO_FB_ADRS (pGD->frameAdrs)
-
-/*
- * Console device
- */
-
-#include <linux/types.h>
-#include <stdio_dev.h>
-#include <video_font.h>
-
-#if defined(CONFIG_CMD_DATE)
-#include <rtc.h>
-#endif
-
-#if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
-#include <watchdog.h>
-#include <bmp_layout.h>
-#include <splash.h>
-#endif
-
-#if !defined(CONFIG_VIDEO_SW_CURSOR)
-/* no Cursor defined */
-#define CURSOR_ON
-#define CURSOR_OFF
-#define CURSOR_SET
-#endif
-
-#if defined(CONFIG_VIDEO_SW_CURSOR)
-void console_cursor(int state);
-
-#define CURSOR_ON console_cursor(1)
-#define CURSOR_OFF console_cursor(0)
-#define CURSOR_SET video_set_cursor()
-#endif /* CONFIG_VIDEO_SW_CURSOR */
-
-#define VIDEO_COLS VIDEO_VISIBLE_COLS
-#define VIDEO_ROWS VIDEO_VISIBLE_ROWS
-#ifndef VIDEO_LINE_LEN
-#define VIDEO_LINE_LEN (VIDEO_COLS * VIDEO_PIXEL_SIZE)
-#endif
-#define VIDEO_SIZE (VIDEO_ROWS * VIDEO_LINE_LEN)
-#define VIDEO_BURST_LEN (VIDEO_COLS/8)
-
-#define CONSOLE_ROWS (VIDEO_ROWS / VIDEO_FONT_HEIGHT)
-
-#define CONSOLE_COLS (VIDEO_COLS / VIDEO_FONT_WIDTH)
-#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN)
-#define CONSOLE_ROW_FIRST (video_console_address)
-#define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE)
-#define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE)
-#define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS)
-
-/* By default we scroll by a single line */
-#ifndef CONFIG_CONSOLE_SCROLL_LINES
-#define CONFIG_CONSOLE_SCROLL_LINES 1
-#endif
-
-/* Macros */
-#ifdef VIDEO_FB_LITTLE_ENDIAN
-#define SWAP16(x) ((((x) & 0x00ff) << 8) | \
- ((x) >> 8) \
- )
-#define SWAP32(x) ((((x) & 0x000000ff) << 24) | \
- (((x) & 0x0000ff00) << 8) | \
- (((x) & 0x00ff0000) >> 8) | \
- (((x) & 0xff000000) >> 24) \
- )
-#define SHORTSWAP32(x) ((((x) & 0x000000ff) << 8) | \
- (((x) & 0x0000ff00) >> 8) | \
- (((x) & 0x00ff0000) << 8) | \
- (((x) & 0xff000000) >> 8) \
- )
-#else
-#define SWAP16(x) (x)
-#define SWAP32(x) (x)
-#if defined(VIDEO_FB_16BPP_WORD_SWAP)
-#define SHORTSWAP32(x) (((x) >> 16) | ((x) << 16))
-#else
-#define SHORTSWAP32(x) (x)
-#endif
-#endif
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* Locals */
-static GraphicDevice *pGD; /* Pointer to Graphic array */
-
-static void *video_fb_address; /* frame buffer address */
-static void *video_console_address; /* console buffer start address */
-
-static int video_logo_height; /* not supported anymore */
-
-static int __maybe_unused cursor_state;
-static int __maybe_unused old_col;
-static int __maybe_unused old_row;
-
-static int console_col; /* cursor col */
-static int console_row; /* cursor row */
-
-static u32 eorx, fgx, bgx; /* color pats */
-
-static int cfb_do_flush_cache;
-
-#ifdef CONFIG_CFB_CONSOLE_ANSI
-static char ansi_buf[10];
-static int ansi_buf_size;
-static int ansi_colors_need_revert;
-static int ansi_cursor_hidden;
-#endif
-
-static const int video_font_draw_table8[] = {
- 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff,
- 0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff,
- 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff,
- 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff
-};
-
-static const int video_font_draw_table15[] = {
- 0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff
-};
-
-static const int video_font_draw_table16[] = {
- 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff
-};
-
-static const int video_font_draw_table24[16][3] = {
- {0x00000000, 0x00000000, 0x00000000},
- {0x00000000, 0x00000000, 0x00ffffff},
- {0x00000000, 0x0000ffff, 0xff000000},
- {0x00000000, 0x0000ffff, 0xffffffff},
- {0x000000ff, 0xffff0000, 0x00000000},
- {0x000000ff, 0xffff0000, 0x00ffffff},
- {0x000000ff, 0xffffffff, 0xff000000},
- {0x000000ff, 0xffffffff, 0xffffffff},
- {0xffffff00, 0x00000000, 0x00000000},
- {0xffffff00, 0x00000000, 0x00ffffff},
- {0xffffff00, 0x0000ffff, 0xff000000},
- {0xffffff00, 0x0000ffff, 0xffffffff},
- {0xffffffff, 0xffff0000, 0x00000000},
- {0xffffffff, 0xffff0000, 0x00ffffff},
- {0xffffffff, 0xffffffff, 0xff000000},
- {0xffffffff, 0xffffffff, 0xffffffff}
-};
-
-static const int video_font_draw_table32[16][4] = {
- {0x00000000, 0x00000000, 0x00000000, 0x00000000},
- {0x00000000, 0x00000000, 0x00000000, 0x00ffffff},
- {0x00000000, 0x00000000, 0x00ffffff, 0x00000000},
- {0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff},
- {0x00000000, 0x00ffffff, 0x00000000, 0x00000000},
- {0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff},
- {0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000},
- {0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff},
- {0x00ffffff, 0x00000000, 0x00000000, 0x00000000},
- {0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff},
- {0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000},
- {0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff},
- {0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000},
- {0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff},
- {0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000},
- {0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff}
-};
-
-/*
- * Implement a weak default function for boards that optionally
- * need to skip the cfb initialization.
- */
-__weak int board_cfb_skip(void)
-{
- /* As default, don't skip cfb init */
- return 0;
-}
-
-static void video_drawchars(int xx, int yy, unsigned char *s, int count)
-{
- u8 *cdat, *dest, *dest0;
- int rows, offset, c;
-
- offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE;
- dest0 = video_fb_address + offset;
-
- switch (VIDEO_DATA_FORMAT) {
- case GDF__8BIT_INDEX:
- case GDF__8BIT_332RGB:
- while (count--) {
- c = *s;
- cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
- for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
- rows--; dest += VIDEO_LINE_LEN) {
- u8 bits = *cdat++;
-
- ((u32 *) dest)[0] =
- (video_font_draw_table8[bits >> 4] &
- eorx) ^ bgx;
-
- if (VIDEO_FONT_WIDTH == 4)
- continue;
-
- ((u32 *) dest)[1] =
- (video_font_draw_table8[bits & 15] &
- eorx) ^ bgx;
- }
- dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
- s++;
- }
- break;
-
- case GDF_15BIT_555RGB:
- while (count--) {
- c = *s;
- cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
- for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
- rows--; dest += VIDEO_LINE_LEN) {
- u8 bits = *cdat++;
-
- ((u32 *) dest)[0] =
- SHORTSWAP32((video_font_draw_table15
- [bits >> 6] & eorx) ^
- bgx);
- ((u32 *) dest)[1] =
- SHORTSWAP32((video_font_draw_table15
- [bits >> 4 & 3] & eorx) ^
- bgx);
-
- if (VIDEO_FONT_WIDTH == 4)
- continue;
-
- ((u32 *) dest)[2] =
- SHORTSWAP32((video_font_draw_table15
- [bits >> 2 & 3] & eorx) ^
- bgx);
- ((u32 *) dest)[3] =
- SHORTSWAP32((video_font_draw_table15
- [bits & 3] & eorx) ^
- bgx);
- }
- dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
- s++;
- }
- break;
-
- case GDF_16BIT_565RGB:
- while (count--) {
- c = *s;
- cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
- for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
- rows--; dest += VIDEO_LINE_LEN) {
- u8 bits = *cdat++;
-
- ((u32 *) dest)[0] =
- SHORTSWAP32((video_font_draw_table16
- [bits >> 6] & eorx) ^
- bgx);
- ((u32 *) dest)[1] =
- SHORTSWAP32((video_font_draw_table16
- [bits >> 4 & 3] & eorx) ^
- bgx);
-
- if (VIDEO_FONT_WIDTH == 4)
- continue;
-
- ((u32 *) dest)[2] =
- SHORTSWAP32((video_font_draw_table16
- [bits >> 2 & 3] & eorx) ^
- bgx);
- ((u32 *) dest)[3] =
- SHORTSWAP32((video_font_draw_table16
- [bits & 3] & eorx) ^
- bgx);
- }
- dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
- s++;
- }
- break;
-
- case GDF_32BIT_X888RGB:
- while (count--) {
- c = *s;
- cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
- for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
- rows--; dest += VIDEO_LINE_LEN) {
- u8 bits = *cdat++;
-
- ((u32 *) dest)[0] =
- SWAP32((video_font_draw_table32
- [bits >> 4][0] & eorx) ^ bgx);
- ((u32 *) dest)[1] =
- SWAP32((video_font_draw_table32
- [bits >> 4][1] & eorx) ^ bgx);
- ((u32 *) dest)[2] =
- SWAP32((video_font_draw_table32
- [bits >> 4][2] & eorx) ^ bgx);
- ((u32 *) dest)[3] =
- SWAP32((video_font_draw_table32
- [bits >> 4][3] & eorx) ^ bgx);
-
-
- if (VIDEO_FONT_WIDTH == 4)
- continue;
-
- ((u32 *) dest)[4] =
- SWAP32((video_font_draw_table32
- [bits & 15][0] & eorx) ^ bgx);
- ((u32 *) dest)[5] =
- SWAP32((video_font_draw_table32
- [bits & 15][1] & eorx) ^ bgx);
- ((u32 *) dest)[6] =
- SWAP32((video_font_draw_table32
- [bits & 15][2] & eorx) ^ bgx);
- ((u32 *) dest)[7] =
- SWAP32((video_font_draw_table32
- [bits & 15][3] & eorx) ^ bgx);
- }
- dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
- s++;
- }
- break;
-
- case GDF_24BIT_888RGB:
- while (count--) {
- c = *s;
- cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
- for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
- rows--; dest += VIDEO_LINE_LEN) {
- u8 bits = *cdat++;
-
- ((u32 *) dest)[0] =
- (video_font_draw_table24[bits >> 4][0]
- & eorx) ^ bgx;
- ((u32 *) dest)[1] =
- (video_font_draw_table24[bits >> 4][1]
- & eorx) ^ bgx;
- ((u32 *) dest)[2] =
- (video_font_draw_table24[bits >> 4][2]
- & eorx) ^ bgx;
-
- if (VIDEO_FONT_WIDTH == 4)
- continue;
-
- ((u32 *) dest)[3] =
- (video_font_draw_table24[bits & 15][0]
- & eorx) ^ bgx;
- ((u32 *) dest)[4] =
- (video_font_draw_table24[bits & 15][1]
- & eorx) ^ bgx;
- ((u32 *) dest)[5] =
- (video_font_draw_table24[bits & 15][2]
- & eorx) ^ bgx;
- }
- dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
- s++;
- }
- break;
- }
-}
-
-static inline void video_drawstring(int xx, int yy, unsigned char *s)
-{
- video_drawchars(xx, yy, s, strlen((char *) s));
-}
-
-static void video_putchar(int xx, int yy, unsigned char c)
-{
- video_drawchars(xx, yy + video_logo_height, &c, 1);
-}
-
-#if defined(CONFIG_VIDEO_SW_CURSOR)
-static void video_set_cursor(void)
-{
- if (cursor_state)
- console_cursor(0);
- console_cursor(1);
-}
-
-static void video_invertchar(int xx, int yy)
-{
- int firstx = xx * VIDEO_PIXEL_SIZE;
- int lastx = (xx + VIDEO_FONT_WIDTH) * VIDEO_PIXEL_SIZE;
- int firsty = yy * VIDEO_LINE_LEN;
- int lasty = (yy + VIDEO_FONT_HEIGHT) * VIDEO_LINE_LEN;
- int x, y;
- for (y = firsty; y < lasty; y += VIDEO_LINE_LEN) {
- for (x = firstx; x < lastx; x++) {
- u8 *dest = (u8 *)(video_fb_address) + x + y;
- *dest = ~*dest;
- }
- }
-}
-
-void console_cursor(int state)
-{
- if (cursor_state != state) {
- if (cursor_state) {
- /* turn off the cursor */
- video_invertchar(old_col * VIDEO_FONT_WIDTH,
- old_row * VIDEO_FONT_HEIGHT +
- video_logo_height);
- } else {
- /* turn off the cursor and record where it is */
- video_invertchar(console_col * VIDEO_FONT_WIDTH,
- console_row * VIDEO_FONT_HEIGHT +
- video_logo_height);
- old_col = console_col;
- old_row = console_row;
- }
- cursor_state = state;
- }
- if (cfb_do_flush_cache)
- flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
-}
-#endif
-
-#ifndef VIDEO_HW_RECTFILL
-static void memsetl(int *p, int c, int v)
-{
- while (c--)
- *(p++) = v;
-}
-#endif
-
-#ifndef VIDEO_HW_BITBLT
-static void memcpyl(int *d, int *s, int c)
-{
- while (c--)
- *(d++) = *(s++);
-}
-#endif
-
-static void console_clear_line(int line, int begin, int end)
-{
-#ifdef VIDEO_HW_RECTFILL
- video_hw_rectfill(VIDEO_PIXEL_SIZE, /* bytes per pixel */
- VIDEO_FONT_WIDTH * begin, /* dest pos x */
- video_logo_height +
- VIDEO_FONT_HEIGHT * line, /* dest pos y */
- VIDEO_FONT_WIDTH * (end - begin + 1), /* fr. width */
- VIDEO_FONT_HEIGHT, /* frame height */
- bgx /* fill color */
- );
-#else
- if (begin == 0 && (end + 1) == CONSOLE_COLS) {
- memsetl(CONSOLE_ROW_FIRST +
- CONSOLE_ROW_SIZE * line, /* offset of row */
- CONSOLE_ROW_SIZE >> 2, /* length of row */
- bgx /* fill color */
- );
- } else {
- void *offset;
- int i, size;
-
- offset = CONSOLE_ROW_FIRST +
- CONSOLE_ROW_SIZE * line + /* offset of row */
- VIDEO_FONT_WIDTH *
- VIDEO_PIXEL_SIZE * begin; /* offset of col */
- size = VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE * (end - begin + 1);
- size >>= 2; /* length to end for memsetl() */
- /* fill at col offset of i'th line using bgx as fill color */
- for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
- memsetl(offset + i * VIDEO_LINE_LEN, size, bgx);
- }
-#endif
-}
-
-static void console_scrollup(void)
-{
- const int rows = CONFIG_CONSOLE_SCROLL_LINES;
- int i;
-
- /* copy up rows ignoring the first one */
-
-#ifdef VIDEO_HW_BITBLT
- video_hw_bitblt(VIDEO_PIXEL_SIZE, /* bytes per pixel */
- 0, /* source pos x */
- video_logo_height +
- VIDEO_FONT_HEIGHT * rows, /* source pos y */
- 0, /* dest pos x */
- video_logo_height, /* dest pos y */
- VIDEO_VISIBLE_COLS, /* frame width */
- VIDEO_VISIBLE_ROWS
- - video_logo_height
- - VIDEO_FONT_HEIGHT * rows /* frame height */
- );
-#else
- memcpyl(CONSOLE_ROW_FIRST, CONSOLE_ROW_FIRST + rows * CONSOLE_ROW_SIZE,
- (CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows) >> 2);
-#endif
- /* clear the last one */
- for (i = 1; i <= rows; i++)
- console_clear_line(CONSOLE_ROWS - i, 0, CONSOLE_COLS - 1);
-
- /* Decrement row number */
- console_row -= rows;
-}
-
-static void console_back(void)
-{
- console_col--;
-
- if (console_col < 0) {
- console_col = CONSOLE_COLS - 1;
- console_row--;
- if (console_row < 0)
- console_row = 0;
- }
-}
-
-#ifdef CONFIG_CFB_CONSOLE_ANSI
-
-static void console_clear(void)
-{
-#ifdef VIDEO_HW_RECTFILL
- video_hw_rectfill(VIDEO_PIXEL_SIZE, /* bytes per pixel */
- 0, /* dest pos x */
- video_logo_height, /* dest pos y */
- VIDEO_VISIBLE_COLS, /* frame width */
- VIDEO_VISIBLE_ROWS, /* frame height */
- bgx /* fill color */
- );
-#else
- memsetl(CONSOLE_ROW_FIRST, CONSOLE_SIZE, bgx);
-#endif
-}
-
-static void console_cursor_fix(void)
-{
- if (console_row < 0)
- console_row = 0;
- if (console_row >= CONSOLE_ROWS)
- console_row = CONSOLE_ROWS - 1;
- if (console_col < 0)
- console_col = 0;
- if (console_col >= CONSOLE_COLS)
- console_col = CONSOLE_COLS - 1;
-}
-
-static void console_cursor_up(int n)
-{
- console_row -= n;
- console_cursor_fix();
-}
-
-static void console_cursor_down(int n)
-{
- console_row += n;
- console_cursor_fix();
-}
-
-static void console_cursor_left(int n)
-{
- console_col -= n;
- console_cursor_fix();
-}
-
-static void console_cursor_right(int n)
-{
- console_col += n;
- console_cursor_fix();
-}
-
-static void console_cursor_set_position(int row, int col)
-{
- if (console_row != -1)
- console_row = row;
- if (console_col != -1)
- console_col = col;
- console_cursor_fix();
-}
-
-static void console_previousline(int n)
-{
- /* FIXME: also scroll terminal ? */
- console_row -= n;
- console_cursor_fix();
-}
-
-static void console_swap_colors(void)
-{
- eorx = fgx;
- fgx = bgx;
- bgx = eorx;
- eorx = fgx ^ bgx;
-}
-
-static inline int console_cursor_is_visible(void)
-{
- return !ansi_cursor_hidden;
-}
-#else
-static inline int console_cursor_is_visible(void)
-{
- return 1;
-}
-#endif
-
-static void console_newline(int n)
-{
- console_row += n;
- console_col = 0;
-
- /* Check if we need to scroll the terminal */
- if (console_row >= CONSOLE_ROWS) {
- /* Scroll everything up */
- console_scrollup();
- }
-}
-
-static void console_cr(void)
-{
- console_col = 0;
-}
-
-static void parse_putc(const char c)
-{
- static int nl = 1;
-
- if (console_cursor_is_visible())
- CURSOR_OFF;
-
- switch (c) {
- case 13: /* back to first column */
- console_cr();
- break;
-
- case '\n': /* next line */
- if (console_col || nl)
- console_newline(1);
- nl = 1;
- break;
-
- case 9: /* tab 8 */
- console_col |= 0x0008;
- console_col &= ~0x0007;
-
- if (console_col >= CONSOLE_COLS)
- console_newline(1);
- break;
-
- case 8: /* backspace */
- console_back();
- break;
-
- case 7: /* bell */
- break; /* ignored */
-
- default: /* draw the char */
- video_putchar(console_col * VIDEO_FONT_WIDTH,
- console_row * VIDEO_FONT_HEIGHT, c);
- console_col++;
-
- /* check for newline */
- if (console_col >= CONSOLE_COLS) {
- console_newline(1);
- nl = 0;
- }
- }
-
- if (console_cursor_is_visible())
- CURSOR_SET;
-}
-
-static void cfb_video_putc(struct stdio_dev *dev, const char c)
-{
-#ifdef CONFIG_CFB_CONSOLE_ANSI
- int i;
-
- if (c == 27) {
- for (i = 0; i < ansi_buf_size; ++i)
- parse_putc(ansi_buf[i]);
- ansi_buf[0] = 27;
- ansi_buf_size = 1;
- return;
- }
-
- if (ansi_buf_size > 0) {
- /*
- * 0 - ESC
- * 1 - [
- * 2 - num1
- * 3 - ..
- * 4 - ;
- * 5 - num2
- * 6 - ..
- * - cchar
- */
- int next = 0;
-
- int flush = 0;
- int fail = 0;
-
- int num1 = 0;
- int num2 = 0;
- int cchar = 0;
-
- ansi_buf[ansi_buf_size++] = c;
-
- if (ansi_buf_size >= sizeof(ansi_buf))
- fail = 1;
-
- for (i = 0; i < ansi_buf_size; ++i) {
- if (fail)
- break;
-
- switch (next) {
- case 0:
- if (ansi_buf[i] == 27)
- next = 1;
- else
- fail = 1;
- break;
-
- case 1:
- if (ansi_buf[i] == '[')
- next = 2;
- else
- fail = 1;
- break;
-
- case 2:
- if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
- num1 = ansi_buf[i]-'0';
- next = 3;
- } else if (ansi_buf[i] != '?') {
- --i;
- num1 = 1;
- next = 4;
- }
- break;
-
- case 3:
- if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
- num1 *= 10;
- num1 += ansi_buf[i]-'0';
- } else {
- --i;
- next = 4;
- }
- break;
-
- case 4:
- if (ansi_buf[i] != ';') {
- --i;
- next = 7;
- } else
- next = 5;
- break;
-
- case 5:
- if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
- num2 = ansi_buf[i]-'0';
- next = 6;
- } else
- fail = 1;
- break;
-
- case 6:
- if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
- num2 *= 10;
- num2 += ansi_buf[i]-'0';
- } else {
- --i;
- next = 7;
- }
- break;
-
- case 7:
- if ((ansi_buf[i] >= 'A' && ansi_buf[i] <= 'H')
- || ansi_buf[i] == 'J'
- || ansi_buf[i] == 'K'
- || ansi_buf[i] == 'h'
- || ansi_buf[i] == 'l'
- || ansi_buf[i] == 'm') {
- cchar = ansi_buf[i];
- flush = 1;
- } else
- fail = 1;
- break;
- }
- }
-
- if (fail) {
- for (i = 0; i < ansi_buf_size; ++i)
- parse_putc(ansi_buf[i]);
- ansi_buf_size = 0;
- return;
- }
-
- if (flush) {
- if (!ansi_cursor_hidden)
- CURSOR_OFF;
- ansi_buf_size = 0;
- switch (cchar) {
- case 'A':
- /* move cursor num1 rows up */
- console_cursor_up(num1);
- break;
- case 'B':
- /* move cursor num1 rows down */
- console_cursor_down(num1);
- break;
- case 'C':
- /* move cursor num1 columns forward */
- console_cursor_right(num1);
- break;
- case 'D':
- /* move cursor num1 columns back */
- console_cursor_left(num1);
- break;
- case 'E':
- /* move cursor num1 rows up at begin of row */
- console_previousline(num1);
- break;
- case 'F':
- /* move cursor num1 rows down at begin of row */
- console_newline(num1);
- break;
- case 'G':
- /* move cursor to column num1 */
- console_cursor_set_position(-1, num1-1);
- break;
- case 'H':
- /* move cursor to row num1, column num2 */
- console_cursor_set_position(num1-1, num2-1);
- break;
- case 'J':
- /* clear console and move cursor to 0, 0 */
- console_clear();
- console_cursor_set_position(0, 0);
- break;
- case 'K':
- /* clear line */
- if (num1 == 0)
- console_clear_line(console_row,
- console_col,
- CONSOLE_COLS-1);
- else if (num1 == 1)
- console_clear_line(console_row,
- 0, console_col);
- else
- console_clear_line(console_row,
- 0, CONSOLE_COLS-1);
- break;
- case 'h':
- ansi_cursor_hidden = 0;
- break;
- case 'l':
- ansi_cursor_hidden = 1;
- break;
- case 'm':
- if (num1 == 0) { /* reset swapped colors */
- if (ansi_colors_need_revert) {
- console_swap_colors();
- ansi_colors_need_revert = 0;
- }
- } else if (num1 == 7) { /* once swap colors */
- if (!ansi_colors_need_revert) {
- console_swap_colors();
- ansi_colors_need_revert = 1;
- }
- }
- break;
- }
- if (!ansi_cursor_hidden)
- CURSOR_SET;
- }
- } else {
- parse_putc(c);
- }
-#else
- parse_putc(c);
-#endif
- if (cfb_do_flush_cache)
- flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
-}
-
-static void cfb_video_puts(struct stdio_dev *dev, const char *s)
-{
- int flush = cfb_do_flush_cache;
- int count = strlen(s);
-
- /* temporarily disable cache flush */
- cfb_do_flush_cache = 0;
-
- while (count--)
- cfb_video_putc(dev, *s++);
-
- if (flush) {
- cfb_do_flush_cache = flush;
- flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
- }
-}
-
-/*
- * Do not enforce drivers (or board code) to provide empty
- * video_set_lut() if they do not support 8 bpp format.
- * Implement weak default function instead.
- */
-__weak void video_set_lut(unsigned int index, unsigned char r,
- unsigned char g, unsigned char b)
-{
-}
-
-#if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
-
-#define FILL_8BIT_332RGB(r,g,b) { \
- *fb = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6); \
- fb ++; \
-}
-
-#define FILL_15BIT_555RGB(r,g,b) { \
- *(unsigned short *)fb = \
- SWAP16((unsigned short)(((r>>3)<<10) | \
- ((g>>3)<<5) | \
- (b>>3))); \
- fb += 2; \
-}
-
-#define FILL_16BIT_565RGB(r,g,b) { \
- *(unsigned short *)fb = \
- SWAP16((unsigned short)((((r)>>3)<<11)| \
- (((g)>>2)<<5) | \
- ((b)>>3))); \
- fb += 2; \
-}
-
-#define FILL_32BIT_X888RGB(r,g,b) { \
- *(u32 *)fb = \
- SWAP32((unsigned int)(((r<<16) | \
- (g<<8) | \
- b))); \
- fb += 4; \
-}
-
-#ifdef VIDEO_FB_LITTLE_ENDIAN
-#define FILL_24BIT_888RGB(r,g,b) { \
- fb[0] = b; \
- fb[1] = g; \
- fb[2] = r; \
- fb += 3; \
-}
-#else
-#define FILL_24BIT_888RGB(r,g,b) { \
- fb[0] = r; \
- fb[1] = g; \
- fb[2] = b; \
- fb += 3; \
-}
-#endif
-
-#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
-static inline void fill_555rgb_pswap(uchar *fb, int x, u8 r, u8 g, u8 b)
-{
- ushort *dst = (ushort *) fb;
- ushort color = (ushort) (((r >> 3) << 10) |
- ((g >> 3) << 5) |
- (b >> 3));
- if (x & 1)
- *(--dst) = color;
- else
- *(++dst) = color;
-}
-#endif
-
-/*
- * RLE8 bitmap support
- */
-
-#ifdef CONFIG_VIDEO_BMP_RLE8
-/* Pre-calculated color table entry */
-struct palette {
- union {
- unsigned short w; /* word */
- unsigned int dw; /* double word */
- } ce; /* color entry */
-};
-
-/*
- * Helper to draw encoded/unencoded run.
- */
-static void draw_bitmap(uchar **fb, uchar *bm, struct palette *p,
- int cnt, int enc)
-{
- ulong addr = (ulong) *fb;
- int *off;
- int enc_off = 1;
- int i;
-
- /*
- * Setup offset of the color index in the bitmap.
- * Color index of encoded run is at offset 1.
- */
- off = enc ? &enc_off : &i;
-
- switch (VIDEO_DATA_FORMAT) {
- case GDF__8BIT_INDEX:
- for (i = 0; i < cnt; i++)
- *(unsigned char *) addr++ = bm[*off];
- break;
- case GDF_15BIT_555RGB:
- case GDF_16BIT_565RGB:
- /* differences handled while pre-calculating palette */
- for (i = 0; i < cnt; i++) {
- *(unsigned short *) addr = p[bm[*off]].ce.w;
- addr += 2;
- }
- break;
- case GDF_32BIT_X888RGB:
- for (i = 0; i < cnt; i++) {
- *(u32 *) addr = p[bm[*off]].ce.dw;
- addr += 4;
- }
- break;
- }
- *fb = (uchar *) addr; /* return modified address */
-}
-
-static int display_rle8_bitmap(struct bmp_image *img, int xoff, int yoff,
- int width, int height)
-{
- unsigned char *bm;
- unsigned char *fbp;
- unsigned int cnt, runlen;
- int decode = 1;
- int x, y, bpp, i, ncolors;
- struct palette p[256];
- struct bmp_color_table_entry cte;
- int green_shift, red_off;
- int limit = (VIDEO_LINE_LEN / VIDEO_PIXEL_SIZE) * VIDEO_ROWS;
- int pixels = 0;
-
- x = 0;
- y = __le32_to_cpu(img->header.height) - 1;
- ncolors = __le32_to_cpu(img->header.colors_used);
- bpp = VIDEO_PIXEL_SIZE;
- fbp = (unsigned char *) ((unsigned int) video_fb_address +
- (y + yoff) * VIDEO_LINE_LEN +
- xoff * bpp);
-
- bm = (uchar *) img + __le32_to_cpu(img->header.data_offset);
-
- /* pre-calculate and setup palette */
- switch (VIDEO_DATA_FORMAT) {
- case GDF__8BIT_INDEX:
- for (i = 0; i < ncolors; i++) {
- cte = img->color_table[i];
- video_set_lut(i, cte.red, cte.green, cte.blue);
- }
- break;
- case GDF_15BIT_555RGB:
- case GDF_16BIT_565RGB:
- if (VIDEO_DATA_FORMAT == GDF_15BIT_555RGB) {
- green_shift = 3;
- red_off = 10;
- } else {
- green_shift = 2;
- red_off = 11;
- }
- for (i = 0; i < ncolors; i++) {
- cte = img->color_table[i];
- p[i].ce.w = SWAP16((unsigned short)
- (((cte.red >> 3) << red_off) |
- ((cte.green >> green_shift) << 5) |
- cte.blue >> 3));
- }
- break;
- case GDF_32BIT_X888RGB:
- for (i = 0; i < ncolors; i++) {
- cte = img->color_table[i];
- p[i].ce.dw = SWAP32((cte.red << 16) |
- (cte.green << 8) |
- cte.blue);
- }
- break;
- default:
- printf("RLE Bitmap unsupported in video mode 0x%x\n",
- VIDEO_DATA_FORMAT);
- return -1;
- }
-
- while (decode) {
- switch (bm[0]) {
- case 0:
- switch (bm[1]) {
- case 0:
- /* scan line end marker */
- bm += 2;
- x = 0;
- y--;
- fbp = (unsigned char *)
- ((unsigned int) video_fb_address +
- (y + yoff) * VIDEO_LINE_LEN +
- xoff * bpp);
- continue;
- case 1:
- /* end of bitmap data marker */
- decode = 0;
- break;
- case 2:
- /* run offset marker */
- x += bm[2];
- y -= bm[3];
- fbp = (unsigned char *)
- ((unsigned int) video_fb_address +
- (y + yoff) * VIDEO_LINE_LEN +
- xoff * bpp);
- bm += 4;
- break;
- default:
- /* unencoded run */
- cnt = bm[1];
- runlen = cnt;
- pixels += cnt;
- if (pixels > limit)
- goto error;
-
- bm += 2;
- if (y < height) {
- if (x >= width) {
- x += runlen;
- goto next_run;
- }
- if (x + runlen > width)
- cnt = width - x;
- draw_bitmap(&fbp, bm, p, cnt, 0);
- x += runlen;
- }
-next_run:
- bm += runlen;
- if (runlen & 1)
- bm++; /* 0 padding if length is odd */
- }
- break;
- default:
- /* encoded run */
- cnt = bm[0];
- runlen = cnt;
- pixels += cnt;
- if (pixels > limit)
- goto error;
-
- if (y < height) { /* only draw into visible area */
- if (x >= width) {
- x += runlen;
- bm += 2;
- continue;
- }
- if (x + runlen > width)
- cnt = width - x;
- draw_bitmap(&fbp, bm, p, cnt, 1);
- x += runlen;
- }
- bm += 2;
- break;
- }
- }
-
- if (cfb_do_flush_cache)
- flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
-
- return 0;
-error:
- printf("Error: Too much encoded pixel data, validate your bitmap\n");
- return -1;
-}
-#endif
-
-/*
- * Display the BMP file located at address bmp_image.
- */
-int video_display_bitmap(ulong bmp_image, int x, int y)
-{
- ushort xcount, ycount;
- uchar *fb;
- struct bmp_image *bmp = (struct bmp_image *)bmp_image;
- uchar *bmap;
- ushort padded_line;
- unsigned long width, height, bpp;
- unsigned colors;
- unsigned long compression;
- struct bmp_color_table_entry cte;
-
-#ifdef CONFIG_VIDEO_BMP_GZIP
- unsigned char *dst = NULL;
- ulong len;
-#endif
-
- WATCHDOG_RESET();
-
- if (!((bmp->header.signature[0] == 'B') &&
- (bmp->header.signature[1] == 'M'))) {
-
-#ifdef CONFIG_VIDEO_BMP_GZIP
- /*
- * Could be a gzipped bmp image, try to decrompress...
- */
- len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE;
- dst = malloc(CONFIG_SYS_VIDEO_LOGO_MAX_SIZE);
- if (dst == NULL) {
- printf("Error: malloc in gunzip failed!\n");
- return 1;
- }
- /*
- * NB: we need to force offset of +2
- * See doc/README.displaying-bmps
- */
- if (gunzip(dst+2, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE-2,
- (uchar *) bmp_image,
- &len) != 0) {
- printf("Error: no valid bmp or bmp.gz image at %lx\n",
- bmp_image);
- free(dst);
- return 1;
- }
- if (len == CONFIG_SYS_VIDEO_LOGO_MAX_SIZE) {
- printf("Image could be truncated "
- "(increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!\n");
- }
-
- /*
- * Set addr to decompressed image
- */
- bmp = (struct bmp_image *)(dst+2);
-
- if (!((bmp->header.signature[0] == 'B') &&
- (bmp->header.signature[1] == 'M'))) {
- printf("Error: no valid bmp.gz image at %lx\n",
- bmp_image);
- free(dst);
- return 1;
- }
-#else
- printf("Error: no valid bmp image at %lx\n", bmp_image);
- return 1;
-#endif /* CONFIG_VIDEO_BMP_GZIP */
- }
-
- width = le32_to_cpu(bmp->header.width);
- height = le32_to_cpu(bmp->header.height);
- bpp = le16_to_cpu(bmp->header.bit_count);
- colors = le32_to_cpu(bmp->header.colors_used);
- compression = le32_to_cpu(bmp->header.compression);
-
- debug("Display-bmp: %ld x %ld with %d colors\n",
- width, height, colors);
-
- if (compression != BMP_BI_RGB
-#ifdef CONFIG_VIDEO_BMP_RLE8
- && compression != BMP_BI_RLE8
-#endif
- ) {
- printf("Error: compression type %ld not supported\n",
- compression);
-#ifdef CONFIG_VIDEO_BMP_GZIP
- if (dst)
- free(dst);
-#endif
- return 1;
- }
-
- padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3;
-
-#ifdef CONFIG_SPLASH_SCREEN_ALIGN
- if (x == BMP_ALIGN_CENTER)
- x = max(0, (int)(VIDEO_VISIBLE_COLS - width) / 2);
- else if (x < 0)
- x = max(0, (int)(VIDEO_VISIBLE_COLS - width + x + 1));
-
- if (y == BMP_ALIGN_CENTER)
- y = max(0, (int)(VIDEO_VISIBLE_ROWS - height) / 2);
- else if (y < 0)
- y = max(0, (int)(VIDEO_VISIBLE_ROWS - height + y + 1));
-#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
-
- /*
- * Just ignore elements which are completely beyond screen
- * dimensions.
- */
- if ((x >= VIDEO_VISIBLE_COLS) || (y >= VIDEO_VISIBLE_ROWS))
- return 0;
-
- if ((x + width) > VIDEO_VISIBLE_COLS)
- width = VIDEO_VISIBLE_COLS - x;
- if ((y + height) > VIDEO_VISIBLE_ROWS)
- height = VIDEO_VISIBLE_ROWS - y;
-
- bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset);
- fb = (uchar *) (video_fb_address +
- ((y + height - 1) * VIDEO_LINE_LEN) +
- x * VIDEO_PIXEL_SIZE);
-
-#ifdef CONFIG_VIDEO_BMP_RLE8
- if (compression == BMP_BI_RLE8) {
- return display_rle8_bitmap(bmp, x, y, width, height);
- }
-#endif
-
- /* We handle only 4, 8, or 24 bpp bitmaps */
- switch (le16_to_cpu(bmp->header.bit_count)) {
- case 4:
- padded_line -= width / 2;
- ycount = height;
-
- switch (VIDEO_DATA_FORMAT) {
- case GDF_32BIT_X888RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- /*
- * Don't assume that 'width' is an
- * even number
- */
- for (xcount = 0; xcount < width; xcount++) {
- uchar idx;
-
- if (xcount & 1) {
- idx = *bmap & 0xF;
- bmap++;
- } else
- idx = *bmap >> 4;
- cte = bmp->color_table[idx];
- FILL_32BIT_X888RGB(cte.red, cte.green,
- cte.blue);
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- default:
- puts("4bpp bitmap unsupported with current "
- "video mode\n");
- break;
- }
- break;
-
- case 8:
- padded_line -= width;
- if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) {
- /* Copy colormap */
- for (xcount = 0; xcount < colors; ++xcount) {
- cte = bmp->color_table[xcount];
- video_set_lut(xcount, cte.red, cte.green,
- cte.blue);
- }
- }
- ycount = height;
- switch (VIDEO_DATA_FORMAT) {
- case GDF__8BIT_INDEX:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- *fb++ = *bmap++;
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF__8BIT_332RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- cte = bmp->color_table[*bmap++];
- FILL_8BIT_332RGB(cte.red, cte.green,
- cte.blue);
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_15BIT_555RGB:
- while (ycount--) {
-#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
- int xpos = x;
-#endif
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- cte = bmp->color_table[*bmap++];
-#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
- fill_555rgb_pswap(fb, xpos++, cte.red,
- cte.green,
- cte.blue);
- fb += 2;
-#else
- FILL_15BIT_555RGB(cte.red, cte.green,
- cte.blue);
-#endif
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_16BIT_565RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- cte = bmp->color_table[*bmap++];
- FILL_16BIT_565RGB(cte.red, cte.green,
- cte.blue);
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_32BIT_X888RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- cte = bmp->color_table[*bmap++];
- FILL_32BIT_X888RGB(cte.red, cte.green,
- cte.blue);
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_24BIT_888RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- cte = bmp->color_table[*bmap++];
- FILL_24BIT_888RGB(cte.red, cte.green,
- cte.blue);
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- }
- break;
- case 24:
- padded_line -= 3 * width;
- ycount = height;
- switch (VIDEO_DATA_FORMAT) {
- case GDF__8BIT_332RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- FILL_8BIT_332RGB(bmap[2], bmap[1],
- bmap[0]);
- bmap += 3;
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_15BIT_555RGB:
- while (ycount--) {
-#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
- int xpos = x;
-#endif
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
-#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
- fill_555rgb_pswap(fb, xpos++, bmap[2],
- bmap[1], bmap[0]);
- fb += 2;
-#else
- FILL_15BIT_555RGB(bmap[2], bmap[1],
- bmap[0]);
-#endif
- bmap += 3;
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_16BIT_565RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- FILL_16BIT_565RGB(bmap[2], bmap[1],
- bmap[0]);
- bmap += 3;
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_32BIT_X888RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- FILL_32BIT_X888RGB(bmap[2], bmap[1],
- bmap[0]);
- bmap += 3;
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- case GDF_24BIT_888RGB:
- while (ycount--) {
- WATCHDOG_RESET();
- xcount = width;
- while (xcount--) {
- FILL_24BIT_888RGB(bmap[2], bmap[1],
- bmap[0]);
- bmap += 3;
- }
- bmap += padded_line;
- fb -= VIDEO_LINE_LEN + width *
- VIDEO_PIXEL_SIZE;
- }
- break;
- default:
- printf("Error: 24 bits/pixel bitmap incompatible "
- "with current video mode\n");
- break;
- }
- break;
- default:
- printf("Error: %d bit/pixel bitmaps not supported by U-Boot\n",
- le16_to_cpu(bmp->header.bit_count));
- break;
- }
-
-#ifdef CONFIG_VIDEO_BMP_GZIP
- if (dst) {
- free(dst);
- }
-#endif
-
- if (cfb_do_flush_cache)
- flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
- return (0);
-}
-#endif
-
-static int cfb_fb_is_in_dram(void)
-{
- struct bd_info *bd = gd->bd;
- ulong start, end;
- int i;
-
- for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
- start = bd->bi_dram[i].start;
- end = bd->bi_dram[i].start + bd->bi_dram[i].size - 1;
- if ((ulong)video_fb_address >= start &&
- (ulong)video_fb_address < end)
- return 1;
- }
-
- return 0;
-}
-
-void video_clear(void)
-{
- if (!video_fb_address)
- return;
-#ifdef VIDEO_HW_RECTFILL
- video_hw_rectfill(VIDEO_PIXEL_SIZE, /* bytes per pixel */
- 0, /* dest pos x */
- 0, /* dest pos y */
- VIDEO_VISIBLE_COLS, /* frame width */
- VIDEO_VISIBLE_ROWS, /* frame height */
- bgx /* fill color */
- );
-#else
- memsetl(video_fb_address,
- (VIDEO_VISIBLE_ROWS * VIDEO_LINE_LEN) / sizeof(int), bgx);
-#endif
-}
-
-static int cfg_video_init(void)
-{
- unsigned char color8;
-
- pGD = video_hw_init();
- if (pGD == NULL)
- return -1;
-
- video_fb_address = (void *) VIDEO_FB_ADRS;
-
- cfb_do_flush_cache = cfb_fb_is_in_dram() && dcache_status();
-
- /* Init drawing pats */
- switch (VIDEO_DATA_FORMAT) {
- case GDF__8BIT_INDEX:
- video_set_lut(0x01, CONFIG_SYS_CONSOLE_FG_COL,
- CONFIG_SYS_CONSOLE_FG_COL,
- CONFIG_SYS_CONSOLE_FG_COL);
- video_set_lut(0x00, CONFIG_SYS_CONSOLE_BG_COL,
- CONFIG_SYS_CONSOLE_BG_COL,
- CONFIG_SYS_CONSOLE_BG_COL);
- fgx = 0x01010101;
- bgx = 0x00000000;
- break;
- case GDF__8BIT_332RGB:
- color8 = ((CONFIG_SYS_CONSOLE_FG_COL & 0xe0) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 3) & 0x1c) |
- CONFIG_SYS_CONSOLE_FG_COL >> 6);
- fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) |
- color8;
- color8 = ((CONFIG_SYS_CONSOLE_BG_COL & 0xe0) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 3) & 0x1c) |
- CONFIG_SYS_CONSOLE_BG_COL >> 6);
- bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) |
- color8;
- break;
- case GDF_15BIT_555RGB:
- fgx = (((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 26) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 21) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 16) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 10) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 5) |
- (CONFIG_SYS_CONSOLE_FG_COL >> 3));
- bgx = (((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 26) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 21) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 16) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 10) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 5) |
- (CONFIG_SYS_CONSOLE_BG_COL >> 3));
- break;
- case GDF_16BIT_565RGB:
- fgx = (((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 27) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 2) << 21) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 16) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 11) |
- ((CONFIG_SYS_CONSOLE_FG_COL >> 2) << 5) |
- (CONFIG_SYS_CONSOLE_FG_COL >> 3));
- bgx = (((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 27) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 2) << 21) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 16) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 11) |
- ((CONFIG_SYS_CONSOLE_BG_COL >> 2) << 5) |
- (CONFIG_SYS_CONSOLE_BG_COL >> 3));
- break;
- case GDF_32BIT_X888RGB:
- fgx = (CONFIG_SYS_CONSOLE_FG_COL << 16) |
- (CONFIG_SYS_CONSOLE_FG_COL << 8) |
- CONFIG_SYS_CONSOLE_FG_COL;
- bgx = (CONFIG_SYS_CONSOLE_BG_COL << 16) |
- (CONFIG_SYS_CONSOLE_BG_COL << 8) |
- CONFIG_SYS_CONSOLE_BG_COL;
- break;
- case GDF_24BIT_888RGB:
- fgx = (CONFIG_SYS_CONSOLE_FG_COL << 24) |
- (CONFIG_SYS_CONSOLE_FG_COL << 16) |
- (CONFIG_SYS_CONSOLE_FG_COL << 8) |
- CONFIG_SYS_CONSOLE_FG_COL;
- bgx = (CONFIG_SYS_CONSOLE_BG_COL << 24) |
- (CONFIG_SYS_CONSOLE_BG_COL << 16) |
- (CONFIG_SYS_CONSOLE_BG_COL << 8) |
- CONFIG_SYS_CONSOLE_BG_COL;
- break;
- }
- eorx = fgx ^ bgx;
-
- if (!CONFIG_IS_ENABLED(NO_FB_CLEAR))
- video_clear();
-
-#ifdef CONFIG_VIDEO_LOGO
- /* Plot the logo and get start point of console */
- debug("Video: Drawing the logo ...\n");
- video_console_address = video_logo();
-#else
- video_console_address = video_fb_address;
-#endif
-
- /* Initialize the console */
- console_col = 0;
- console_row = 0;
-
- if (cfb_do_flush_cache)
- flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
-
- return 0;
-}
-
-/*
- * Implement a weak default function for boards that optionally
- * need to skip the video initialization.
- */
-__weak int board_video_skip(void)
-{
- /* As default, don't skip test */
- return 0;
-}
-
-int drv_video_init(void)
-{
- struct stdio_dev console_dev;
- bool have_keyboard;
- bool __maybe_unused keyboard_ok = false;
-
- /* Check if video initialization should be skipped */
- if (board_video_skip())
- return 0;
-
- /* Init video chip - returns with framebuffer cleared */
- if (cfg_video_init() == -1)
- return 0;
-
- if (board_cfb_skip())
- return 0;
-
-#if defined(CONFIG_VGA_AS_SINGLE_DEVICE)
- have_keyboard = false;
-#elif defined(CONFIG_OF_CONTROL)
- have_keyboard = !ofnode_conf_read_bool("u-boot,no-keyboard");
-#else
- have_keyboard = true;
-#endif
- if (have_keyboard) {
- debug("KBD: Keyboard init ...\n");
-#if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
- keyboard_ok = !(VIDEO_KBD_INIT_FCT == -1);
-#endif
- }
-
- /* Init vga device */
- memset(&console_dev, 0, sizeof(console_dev));
- strcpy(console_dev.name, "vga");
- console_dev.flags = DEV_FLAGS_OUTPUT;
- console_dev.putc = cfb_video_putc; /* 'putc' function */
- console_dev.puts = cfb_video_puts; /* 'puts' function */
-
-#if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
- if (have_keyboard && keyboard_ok) {
- /* Also init console device */
- console_dev.flags |= DEV_FLAGS_INPUT;
- console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */
- console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */
- }
-#endif
-
- if (stdio_register(&console_dev) != 0)
- return 0;
-
- /* Return success */
- return 1;
-}
-
-void video_position_cursor(unsigned col, unsigned row)
-{
- console_col = min(col, CONSOLE_COLS - 1);
- console_row = min(row, CONSOLE_ROWS - 1);
-}
-
-int video_get_pixel_width(void)
-{
- return VIDEO_VISIBLE_COLS;
-}
-
-int video_get_pixel_height(void)
-{
- return VIDEO_VISIBLE_ROWS;
-}
-
-int video_get_screen_rows(void)
-{
- return CONSOLE_ROWS;
-}
-
-int video_get_screen_columns(void)
-{
- return CONSOLE_COLS;
-}
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
deleted file mode 100644
index 462c318..0000000
--- a/drivers/video/da8xx-fb.c
+++ /dev/null
@@ -1,1048 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Porting to u-boot:
- *
- * (C) Copyright 2011
- * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
- *
- * Copyright (C) 2008-2009 MontaVista Software Inc.
- * Copyright (C) 2008-2009 Texas Instruments Inc
- *
- * Based on the LCD driver for TI Avalanche processors written by
- * Ajay Singh and Shalom Hai.
- */
-
-#include <common.h>
-#include <log.h>
-#include <malloc.h>
-#include <memalign.h>
-#include <video_fb.h>
-#include <asm/global_data.h>
-#include <linux/delay.h>
-#include <linux/list.h>
-#include <linux/fb.h>
-
-#include <linux/errno.h>
-#include <asm/io.h>
-#include <asm/arch/hardware.h>
-
-#include "videomodes.h"
-#include "da8xx-fb.h"
-
-#if !defined(DA8XX_LCD_CNTL_BASE)
-#define DA8XX_LCD_CNTL_BASE DAVINCI_LCD_CNTL_BASE
-#endif
-
-#define DRIVER_NAME "da8xx_lcdc"
-
-#define LCD_VERSION_1 1
-#define LCD_VERSION_2 2
-
-/* LCD Status Register */
-#define LCD_END_OF_FRAME1 (1 << 9)
-#define LCD_END_OF_FRAME0 (1 << 8)
-#define LCD_PL_LOAD_DONE (1 << 6)
-#define LCD_FIFO_UNDERFLOW (1 << 5)
-#define LCD_SYNC_LOST (1 << 2)
-
-/* LCD DMA Control Register */
-#define LCD_DMA_BURST_SIZE(x) ((x) << 4)
-#define LCD_DMA_BURST_1 0x0
-#define LCD_DMA_BURST_2 0x1
-#define LCD_DMA_BURST_4 0x2
-#define LCD_DMA_BURST_8 0x3
-#define LCD_DMA_BURST_16 0x4
-#define LCD_V1_END_OF_FRAME_INT_ENA (1 << 2)
-#define LCD_V2_END_OF_FRAME0_INT_ENA (1 << 8)
-#define LCD_V2_END_OF_FRAME1_INT_ENA (1 << 9)
-#define LCD_DUAL_FRAME_BUFFER_ENABLE (1 << 0)
-
-#define LCD_V2_TFT_24BPP_MODE (1 << 25)
-#define LCD_V2_TFT_24BPP_UNPACK (1 << 26)
-
-/* LCD Control Register */
-#define LCD_CLK_DIVISOR(x) ((x) << 8)
-#define LCD_RASTER_MODE 0x01
-
-/* LCD Raster Control Register */
-#define LCD_PALETTE_LOAD_MODE(x) ((x) << 20)
-#define PALETTE_AND_DATA 0x00
-#define PALETTE_ONLY 0x01
-#define DATA_ONLY 0x02
-
-#define LCD_MONO_8BIT_MODE (1 << 9)
-#define LCD_RASTER_ORDER (1 << 8)
-#define LCD_TFT_MODE (1 << 7)
-#define LCD_V1_UNDERFLOW_INT_ENA (1 << 6)
-#define LCD_V2_UNDERFLOW_INT_ENA (1 << 5)
-#define LCD_V1_PL_INT_ENA (1 << 4)
-#define LCD_V2_PL_INT_ENA (1 << 6)
-#define LCD_MONOCHROME_MODE (1 << 1)
-#define LCD_RASTER_ENABLE (1 << 0)
-#define LCD_TFT_ALT_ENABLE (1 << 23)
-#define LCD_STN_565_ENABLE (1 << 24)
-#define LCD_V2_DMA_CLK_EN (1 << 2)
-#define LCD_V2_LIDD_CLK_EN (1 << 1)
-#define LCD_V2_CORE_CLK_EN (1 << 0)
-#define LCD_V2_LPP_B10 26
-#define LCD_V2_TFT_24BPP_MODE (1 << 25)
-#define LCD_V2_TFT_24BPP_UNPACK (1 << 26)
-
-/* LCD Raster Timing 2 Register */
-#define LCD_AC_BIAS_TRANSITIONS_PER_INT(x) ((x) << 16)
-#define LCD_AC_BIAS_FREQUENCY(x) ((x) << 8)
-#define LCD_SYNC_CTRL (1 << 25)
-#define LCD_SYNC_EDGE (1 << 24)
-#define LCD_INVERT_PIXEL_CLOCK (1 << 22)
-#define LCD_INVERT_LINE_CLOCK (1 << 21)
-#define LCD_INVERT_FRAME_CLOCK (1 << 20)
-
-/* Clock registers available only on Version 2 */
-#define LCD_CLK_MAIN_RESET (1 << 3)
-/* LCD Block */
-struct da8xx_lcd_regs {
- u32 revid;
- u32 ctrl;
- u32 stat;
- u32 lidd_ctrl;
- u32 lidd_cs0_conf;
- u32 lidd_cs0_addr;
- u32 lidd_cs0_data;
- u32 lidd_cs1_conf;
- u32 lidd_cs1_addr;
- u32 lidd_cs1_data;
- u32 raster_ctrl;
- u32 raster_timing_0;
- u32 raster_timing_1;
- u32 raster_timing_2;
- u32 raster_subpanel;
- u32 reserved;
- u32 dma_ctrl;
- u32 dma_frm_buf_base_addr_0;
- u32 dma_frm_buf_ceiling_addr_0;
- u32 dma_frm_buf_base_addr_1;
- u32 dma_frm_buf_ceiling_addr_1;
- u32 resv1;
- u32 raw_stat;
- u32 masked_stat;
- u32 int_ena_set;
- u32 int_ena_clr;
- u32 end_of_int_ind;
- /* Clock registers available only on Version 2 */
- u32 clk_ena;
- u32 clk_reset;
-};
-
-#define LCD_NUM_BUFFERS 1
-
-#define WSI_TIMEOUT 50
-#define PALETTE_SIZE 256
-#define LEFT_MARGIN 64
-#define RIGHT_MARGIN 64
-#define UPPER_MARGIN 32
-#define LOWER_MARGIN 32
-#define WAIT_FOR_FRAME_DONE true
-#define NO_WAIT_FOR_FRAME_DONE false
-
-#define calc_fbsize() (panel.plnSizeX * panel.plnSizeY * panel.gdfBytesPP)
-
-static struct da8xx_lcd_regs *da8xx_fb_reg_base;
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* graphics setup */
-static GraphicDevice gpanel;
-static const struct da8xx_panel *lcd_panel;
-static struct fb_info *da8xx_fb_info;
-static int bits_x_pixel;
-static unsigned int lcd_revision;
-const struct lcd_ctrl_config *da8xx_lcd_cfg;
-
-static inline unsigned int lcdc_read(u32 *addr)
-{
- return (unsigned int)readl(addr);
-}
-
-static inline void lcdc_write(unsigned int val, u32 *addr)
-{
- writel(val, addr);
-}
-
-struct da8xx_fb_par {
- u32 p_palette_base;
- unsigned char *v_palette_base;
- dma_addr_t vram_phys;
- unsigned long vram_size;
- void *vram_virt;
- unsigned int dma_start;
- unsigned int dma_end;
- struct clk *lcdc_clk;
- int irq;
- unsigned short pseudo_palette[16];
- unsigned int palette_sz;
- unsigned int pxl_clk;
- int blank;
- int vsync_flag;
- int vsync_timeout;
-};
-
-
-/* Variable Screen Information */
-static struct fb_var_screeninfo da8xx_fb_var = {
- .xoffset = 0,
- .yoffset = 0,
- .transp = {0, 0, 0},
- .nonstd = 0,
- .activate = 0,
- .height = -1,
- .width = -1,
- .pixclock = 46666, /* 46us - AUO display */
- .accel_flags = 0,
- .left_margin = LEFT_MARGIN,
- .right_margin = RIGHT_MARGIN,
- .upper_margin = UPPER_MARGIN,
- .lower_margin = LOWER_MARGIN,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-static struct fb_fix_screeninfo da8xx_fb_fix = {
- .id = "DA8xx FB Drv",
- .type = FB_TYPE_PACKED_PIXELS,
- .type_aux = 0,
- .visual = FB_VISUAL_PSEUDOCOLOR,
- .xpanstep = 0,
- .ypanstep = 1,
- .ywrapstep = 0,
- .accel = FB_ACCEL_NONE
-};
-
-/* Enable the Raster Engine of the LCD Controller */
-static inline void lcd_enable_raster(void)
-{
- u32 reg;
-
- /* Put LCDC in reset for several cycles */
- if (lcd_revision == LCD_VERSION_2)
- lcdc_write(LCD_CLK_MAIN_RESET,
- &da8xx_fb_reg_base->clk_reset);
-
- udelay(1000);
- /* Bring LCDC out of reset */
- if (lcd_revision == LCD_VERSION_2)
- lcdc_write(0,
- &da8xx_fb_reg_base->clk_reset);
-
- udelay(1000);
-
- reg = lcdc_read(&da8xx_fb_reg_base->raster_ctrl);
- if (!(reg & LCD_RASTER_ENABLE))
- lcdc_write(reg | LCD_RASTER_ENABLE,
- &da8xx_fb_reg_base->raster_ctrl);
-}
-
-/* Disable the Raster Engine of the LCD Controller */
-static inline void lcd_disable_raster(bool wait_for_frame_done)
-{
- u32 reg;
- u32 loop_cnt = 0;
- u32 stat;
- u32 i = 0;
-
- if (wait_for_frame_done)
- loop_cnt = 5000;
-
- reg = lcdc_read(&da8xx_fb_reg_base->raster_ctrl);
- if (reg & LCD_RASTER_ENABLE)
- lcdc_write(reg & ~LCD_RASTER_ENABLE,
- &da8xx_fb_reg_base->raster_ctrl);
-
- /* Wait for the current frame to complete */
- do {
- if (lcd_revision == LCD_VERSION_1)
- stat = lcdc_read(&da8xx_fb_reg_base->stat);
- else
- stat = lcdc_read(&da8xx_fb_reg_base->raw_stat);
-
- mdelay(1);
- } while (!(stat & 0x01) && (i++ < loop_cnt));
-
- if (lcd_revision == LCD_VERSION_1)
- lcdc_write(stat, &da8xx_fb_reg_base->stat);
- else
- lcdc_write(stat, &da8xx_fb_reg_base->raw_stat);
-
- if ((loop_cnt != 0) && (i >= loop_cnt)) {
- printf("LCD Controller timed out\n");
- return;
- }
-}
-
-static void lcd_blit(int load_mode, struct da8xx_fb_par *par)
-{
- u32 start;
- u32 end;
- u32 reg_ras;
- u32 reg_dma;
- u32 reg_int;
-
- /* init reg to clear PLM (loading mode) fields */
- reg_ras = lcdc_read(&da8xx_fb_reg_base->raster_ctrl);
- reg_ras &= ~(3 << 20);
-
- reg_dma = lcdc_read(&da8xx_fb_reg_base->dma_ctrl);
-
- if (load_mode == LOAD_DATA) {
- start = par->dma_start;
- end = par->dma_end;
-
- reg_ras |= LCD_PALETTE_LOAD_MODE(DATA_ONLY);
- if (lcd_revision == LCD_VERSION_1) {
- reg_dma |= LCD_V1_END_OF_FRAME_INT_ENA;
- } else {
- reg_int = lcdc_read(&da8xx_fb_reg_base->int_ena_set) |
- LCD_V2_END_OF_FRAME0_INT_ENA |
- LCD_V2_END_OF_FRAME1_INT_ENA |
- LCD_V2_UNDERFLOW_INT_ENA | LCD_SYNC_LOST;
- lcdc_write(reg_int, &da8xx_fb_reg_base->int_ena_set);
- }
-
-#if (LCD_NUM_BUFFERS == 2)
- reg_dma |= LCD_DUAL_FRAME_BUFFER_ENABLE;
- lcdc_write(start, &da8xx_fb_reg_base->dma_frm_buf_base_addr_0);
- lcdc_write(end, &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_0);
- lcdc_write(start, &da8xx_fb_reg_base->dma_frm_buf_base_addr_1);
- lcdc_write(end, &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_1);
-#else
- reg_dma &= ~LCD_DUAL_FRAME_BUFFER_ENABLE;
- lcdc_write(start, &da8xx_fb_reg_base->dma_frm_buf_base_addr_0);
- lcdc_write(end, &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_0);
- lcdc_write(0, &da8xx_fb_reg_base->dma_frm_buf_base_addr_1);
- lcdc_write(0, &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_1);
-#endif
-
- } else if (load_mode == LOAD_PALETTE) {
- start = par->p_palette_base;
- end = start + par->palette_sz - 1;
-
- reg_ras |= LCD_PALETTE_LOAD_MODE(PALETTE_ONLY);
- if (lcd_revision == LCD_VERSION_1) {
- reg_ras |= LCD_V1_PL_INT_ENA;
- } else {
- reg_int = lcdc_read(&da8xx_fb_reg_base->int_ena_set) |
- LCD_V2_PL_INT_ENA;
- lcdc_write(reg_int, &da8xx_fb_reg_base->int_ena_set);
- }
-
- lcdc_write(start, &da8xx_fb_reg_base->dma_frm_buf_base_addr_0);
- lcdc_write(end, &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_0);
- }
-
- lcdc_write(reg_dma, &da8xx_fb_reg_base->dma_ctrl);
- lcdc_write(reg_ras, &da8xx_fb_reg_base->raster_ctrl);
-
- /*
- * The Raster enable bit must be set after all other control fields are
- * set.
- */
- lcd_enable_raster();
-}
-
-/* Configure the Burst Size of DMA */
-static int lcd_cfg_dma(int burst_size)
-{
- u32 reg;
-
- reg = lcdc_read(&da8xx_fb_reg_base->dma_ctrl) & 0x00000001;
- switch (burst_size) {
- case 1:
- reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_1);
- break;
- case 2:
- reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_2);
- break;
- case 4:
- reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_4);
- break;
- case 8:
- reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_8);
- break;
- case 16:
- reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_16);
- break;
- default:
- return -EINVAL;
- }
- lcdc_write(reg, &da8xx_fb_reg_base->dma_ctrl);
-
- return 0;
-}
-
-static void lcd_cfg_ac_bias(int period, int transitions_per_int)
-{
- u32 reg;
-
- /* Set the AC Bias Period and Number of Transitions per Interrupt */
- reg = lcdc_read(&da8xx_fb_reg_base->raster_timing_2) & 0xFFF00000;
- reg |= LCD_AC_BIAS_FREQUENCY(period) |
- LCD_AC_BIAS_TRANSITIONS_PER_INT(transitions_per_int);
- lcdc_write(reg, &da8xx_fb_reg_base->raster_timing_2);
-}
-
-static void lcd_cfg_horizontal_sync(int back_porch, int pulse_width,
- int front_porch)
-{
- u32 reg;
-
- reg = lcdc_read(&da8xx_fb_reg_base->raster_timing_0) & 0xf;
- reg |= ((back_porch & 0xff) << 24)
- | ((front_porch & 0xff) << 16)
- | ((pulse_width & 0x3f) << 10);
- lcdc_write(reg, &da8xx_fb_reg_base->raster_timing_0);
-}
-
-static void lcd_cfg_vertical_sync(int back_porch, int pulse_width,
- int front_porch)
-{
- u32 reg;
-
- reg = lcdc_read(&da8xx_fb_reg_base->raster_timing_1) & 0x3ff;
- reg |= ((back_porch & 0xff) << 24)
- | ((front_porch & 0xff) << 16)
- | ((pulse_width & 0x3f) << 10);
- lcdc_write(reg, &da8xx_fb_reg_base->raster_timing_1);
-}
-
-static int lcd_cfg_display(const struct lcd_ctrl_config *cfg)
-{
- u32 reg;
- u32 reg_int;
-
- reg = lcdc_read(&da8xx_fb_reg_base->raster_ctrl) & ~(LCD_TFT_MODE |
- LCD_MONO_8BIT_MODE |
- LCD_MONOCHROME_MODE);
-
- switch (cfg->p_disp_panel->panel_shade) {
- case MONOCHROME:
- reg |= LCD_MONOCHROME_MODE;
- if (cfg->mono_8bit_mode)
- reg |= LCD_MONO_8BIT_MODE;
- break;
- case COLOR_ACTIVE:
- reg |= LCD_TFT_MODE;
- if (cfg->tft_alt_mode)
- reg |= LCD_TFT_ALT_ENABLE;
- break;
-
- case COLOR_PASSIVE:
- if (cfg->stn_565_mode)
- reg |= LCD_STN_565_ENABLE;
- break;
-
- default:
- return -EINVAL;
- }
-
- /* enable additional interrupts here */
- if (lcd_revision == LCD_VERSION_1) {
- reg |= LCD_V1_UNDERFLOW_INT_ENA;
- } else {
- reg_int = lcdc_read(&da8xx_fb_reg_base->int_ena_set) |
- LCD_V2_UNDERFLOW_INT_ENA;
- lcdc_write(reg_int, &da8xx_fb_reg_base->int_ena_set);
- }
-
- lcdc_write(reg, &da8xx_fb_reg_base->raster_ctrl);
-
- reg = lcdc_read(&da8xx_fb_reg_base->raster_timing_2);
-
- if (cfg->sync_ctrl)
- reg |= LCD_SYNC_CTRL;
- else
- reg &= ~LCD_SYNC_CTRL;
-
- if (cfg->sync_edge)
- reg |= LCD_SYNC_EDGE;
- else
- reg &= ~LCD_SYNC_EDGE;
-
- if (cfg->invert_line_clock)
- reg |= LCD_INVERT_LINE_CLOCK;
- else
- reg &= ~LCD_INVERT_LINE_CLOCK;
-
- if (cfg->invert_frm_clock)
- reg |= LCD_INVERT_FRAME_CLOCK;
- else
- reg &= ~LCD_INVERT_FRAME_CLOCK;
-
- lcdc_write(reg, &da8xx_fb_reg_base->raster_timing_2);
-
- return 0;
-}
-
-static int lcd_cfg_frame_buffer(struct da8xx_fb_par *par, u32 width, u32 height,
- u32 bpp, u32 raster_order)
-{
- u32 reg;
-
- /* Set the Panel Width */
- /* Pixels per line = (PPL + 1)*16 */
- if (lcd_revision == LCD_VERSION_1) {
- /*
- * 0x3F in bits 4..9 gives max horizontal resolution = 1024
- * pixels
- */
- width &= 0x3f0;
- } else {
- /*
- * 0x7F in bits 4..10 gives max horizontal resolution = 2048
- * pixels.
- */
- width &= 0x7f0;
- }
- reg = lcdc_read(&da8xx_fb_reg_base->raster_timing_0);
- reg &= 0xfffffc00;
- if (lcd_revision == LCD_VERSION_1) {
- reg |= ((width >> 4) - 1) << 4;
- } else {
- width = (width >> 4) - 1;
- reg |= ((width & 0x3f) << 4) | ((width & 0x40) >> 3);
- }
- lcdc_write(reg, &da8xx_fb_reg_base->raster_timing_0);
-
- /* Set the Panel Height */
- /* Set bits 9:0 of Lines Per Pixel */
- reg = lcdc_read(&da8xx_fb_reg_base->raster_timing_1);
- reg = ((height - 1) & 0x3ff) | (reg & 0xfffffc00);
- lcdc_write(reg, &da8xx_fb_reg_base->raster_timing_1);
-
- /* Set bit 10 of Lines Per Pixel */
- if (lcd_revision == LCD_VERSION_2) {
- reg = lcdc_read(&da8xx_fb_reg_base->raster_timing_2);
- reg |= ((height - 1) & 0x400) << 16;
- lcdc_write(reg, &da8xx_fb_reg_base->raster_timing_2);
- }
-
- /* Set the Raster Order of the Frame Buffer */
- reg = lcdc_read(&da8xx_fb_reg_base->raster_ctrl) & ~(1 << 8);
- if (raster_order)
- reg |= LCD_RASTER_ORDER;
-
- if (bpp == 24)
- reg |= (LCD_TFT_MODE | LCD_V2_TFT_24BPP_MODE);
- else if (bpp == 32)
- reg |= (LCD_TFT_MODE | LCD_V2_TFT_24BPP_MODE
- | LCD_V2_TFT_24BPP_UNPACK);
-
- lcdc_write(reg, &da8xx_fb_reg_base->raster_ctrl);
-
- switch (bpp) {
- case 1:
- case 2:
- case 4:
- case 16:
- case 24:
- case 32:
- par->palette_sz = 16 * 2;
- break;
-
- case 8:
- par->palette_sz = 256 * 2;
- break;
-
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int fb_setcolreg(unsigned regno, unsigned red, unsigned green,
- unsigned blue, unsigned transp,
- struct fb_info *info)
-{
- struct da8xx_fb_par *par = info->par;
- unsigned short *palette = (unsigned short *) par->v_palette_base;
- u_short pal;
- int update_hw = 0;
-
- if (regno > 255)
- return 1;
-
- if (info->fix.visual == FB_VISUAL_DIRECTCOLOR)
- return 1;
-
- if (info->var.bits_per_pixel == 8) {
- red >>= 4;
- green >>= 8;
- blue >>= 12;
-
- pal = (red & 0x0f00);
- pal |= (green & 0x00f0);
- pal |= (blue & 0x000f);
-
- if (palette[regno] != pal) {
- update_hw = 1;
- palette[regno] = pal;
- }
- } else if ((info->var.bits_per_pixel == 16) && regno < 16) {
- red >>= (16 - info->var.red.length);
- red <<= info->var.red.offset;
-
- green >>= (16 - info->var.green.length);
- green <<= info->var.green.offset;
-
- blue >>= (16 - info->var.blue.length);
- blue <<= info->var.blue.offset;
-
- par->pseudo_palette[regno] = red | green | blue;
-
- if (palette[0] != 0x4000) {
- update_hw = 1;
- palette[0] = 0x4000;
- }
- } else if (((info->var.bits_per_pixel == 32) && regno < 32) ||
- ((info->var.bits_per_pixel == 24) && regno < 24)) {
- red >>= (24 - info->var.red.length);
- red <<= info->var.red.offset;
-
- green >>= (24 - info->var.green.length);
- green <<= info->var.green.offset;
-
- blue >>= (24 - info->var.blue.length);
- blue <<= info->var.blue.offset;
-
- par->pseudo_palette[regno] = red | green | blue;
-
- if (palette[0] != 0x4000) {
- update_hw = 1;
- palette[0] = 0x4000;
- }
- }
-
- /* Update the palette in the h/w as needed. */
- if (update_hw)
- lcd_blit(LOAD_PALETTE, par);
-
- return 0;
-}
-
-static void lcd_reset(struct da8xx_fb_par *par)
-{
- /* Disable the Raster if previously Enabled */
- lcd_disable_raster(NO_WAIT_FOR_FRAME_DONE);
-
- /* DMA has to be disabled */
- lcdc_write(0, &da8xx_fb_reg_base->dma_ctrl);
- lcdc_write(0, &da8xx_fb_reg_base->raster_ctrl);
-
- if (lcd_revision == LCD_VERSION_2) {
- lcdc_write(0, &da8xx_fb_reg_base->int_ena_set);
- /* Write 1 to reset */
- lcdc_write(LCD_CLK_MAIN_RESET, &da8xx_fb_reg_base->clk_reset);
- lcdc_write(0, &da8xx_fb_reg_base->clk_reset);
- }
-}
-
-static void lcd_calc_clk_divider(struct da8xx_fb_par *par)
-{
- unsigned int lcd_clk, div;
-
- /* Get clock from sysclk2 */
- lcd_clk = clk_get(2);
-
- div = lcd_clk / par->pxl_clk;
- debug("LCD Clock: %d Divider: %d PixClk: %d\n",
- lcd_clk, div, par->pxl_clk);
-
- /* Configure the LCD clock divisor. */
- lcdc_write(LCD_CLK_DIVISOR(div) |
- (LCD_RASTER_MODE & 0x1), &da8xx_fb_reg_base->ctrl);
-
- if (lcd_revision == LCD_VERSION_2)
- lcdc_write(LCD_V2_DMA_CLK_EN | LCD_V2_LIDD_CLK_EN |
- LCD_V2_CORE_CLK_EN,
- &da8xx_fb_reg_base->clk_ena);
-}
-
-static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
- const struct da8xx_panel *panel)
-{
- u32 bpp;
- int ret = 0;
-
- lcd_reset(par);
-
- /* Calculate the divider */
- lcd_calc_clk_divider(par);
-
- if (panel->invert_pxl_clk)
- lcdc_write((lcdc_read(&da8xx_fb_reg_base->raster_timing_2) |
- LCD_INVERT_PIXEL_CLOCK),
- &da8xx_fb_reg_base->raster_timing_2);
- else
- lcdc_write((lcdc_read(&da8xx_fb_reg_base->raster_timing_2) &
- ~LCD_INVERT_PIXEL_CLOCK),
- &da8xx_fb_reg_base->raster_timing_2);
-
- /* Configure the DMA burst size. */
- ret = lcd_cfg_dma(cfg->dma_burst_sz);
- if (ret < 0)
- return ret;
-
- /* Configure the AC bias properties. */
- lcd_cfg_ac_bias(cfg->ac_bias, cfg->ac_bias_intrpt);
-
- /* Configure the vertical and horizontal sync properties. */
- lcd_cfg_vertical_sync(panel->vbp, panel->vsw, panel->vfp);
- lcd_cfg_horizontal_sync(panel->hbp, panel->hsw, panel->hfp);
-
- /* Configure for display */
- ret = lcd_cfg_display(cfg);
- if (ret < 0)
- return ret;
-
- if ((QVGA != cfg->p_disp_panel->panel_type) &&
- (WVGA != cfg->p_disp_panel->panel_type))
- return -EINVAL;
-
- if (cfg->bpp <= cfg->p_disp_panel->max_bpp &&
- cfg->bpp >= cfg->p_disp_panel->min_bpp)
- bpp = cfg->bpp;
- else
- bpp = cfg->p_disp_panel->max_bpp;
- if (bpp == 12)
- bpp = 16;
- ret = lcd_cfg_frame_buffer(par, (unsigned int)panel->width,
- (unsigned int)panel->height, bpp,
- cfg->raster_order);
- if (ret < 0)
- return ret;
-
- /* Configure FDD */
- lcdc_write((lcdc_read(&da8xx_fb_reg_base->raster_ctrl) & 0xfff00fff) |
- (cfg->fdd << 12), &da8xx_fb_reg_base->raster_ctrl);
-
- return 0;
-}
-
-static void lcdc_dma_start(void)
-{
- struct da8xx_fb_par *par = da8xx_fb_info->par;
- lcdc_write(par->dma_start,
- &da8xx_fb_reg_base->dma_frm_buf_base_addr_0);
- lcdc_write(par->dma_end,
- &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_0);
- lcdc_write(0,
- &da8xx_fb_reg_base->dma_frm_buf_base_addr_1);
- lcdc_write(0,
- &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_1);
-}
-
-static u32 lcdc_irq_handler_rev01(void)
-{
- struct da8xx_fb_par *par = da8xx_fb_info->par;
- u32 stat = lcdc_read(&da8xx_fb_reg_base->stat);
- u32 reg_ras;
-
- if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) {
- debug("LCD_SYNC_LOST\n");
- lcd_disable_raster(NO_WAIT_FOR_FRAME_DONE);
- lcdc_write(stat, &da8xx_fb_reg_base->stat);
- lcd_enable_raster();
- return LCD_SYNC_LOST;
- } else if (stat & LCD_PL_LOAD_DONE) {
- debug("LCD_PL_LOAD_DONE\n");
- /*
- * Must disable raster before changing state of any control bit.
- * And also must be disabled before clearing the PL loading
- * interrupt via the following write to the status register. If
- * this is done after then one gets multiple PL done interrupts.
- */
- lcd_disable_raster(NO_WAIT_FOR_FRAME_DONE);
-
- lcdc_write(stat, &da8xx_fb_reg_base->stat);
-
- /* Disable PL completion interrupt */
- reg_ras = lcdc_read(&da8xx_fb_reg_base->raster_ctrl);
- reg_ras &= ~LCD_V1_PL_INT_ENA;
- lcdc_write(reg_ras, &da8xx_fb_reg_base->raster_ctrl);
-
- /* Setup and start data loading mode */
- lcd_blit(LOAD_DATA, par);
- return LCD_PL_LOAD_DONE;
- } else {
- lcdc_write(stat, &da8xx_fb_reg_base->stat);
-
- if (stat & LCD_END_OF_FRAME0)
- debug("LCD_END_OF_FRAME0\n");
-
- lcdc_write(par->dma_start,
- &da8xx_fb_reg_base->dma_frm_buf_base_addr_0);
- lcdc_write(par->dma_end,
- &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_0);
- par->vsync_flag = 1;
- return LCD_END_OF_FRAME0;
- }
- return stat;
-}
-
-static u32 lcdc_irq_handler_rev02(void)
-{
- struct da8xx_fb_par *par = da8xx_fb_info->par;
- u32 stat = lcdc_read(&da8xx_fb_reg_base->masked_stat);
- u32 reg_int;
-
- if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) {
- debug("LCD_SYNC_LOST\n");
- lcd_disable_raster(NO_WAIT_FOR_FRAME_DONE);
- lcdc_write(stat, &da8xx_fb_reg_base->masked_stat);
- lcd_enable_raster();
- lcdc_write(0, &da8xx_fb_reg_base->end_of_int_ind);
- return LCD_SYNC_LOST;
- } else if (stat & LCD_PL_LOAD_DONE) {
- debug("LCD_PL_LOAD_DONE\n");
- /*
- * Must disable raster before changing state of any control bit.
- * And also must be disabled before clearing the PL loading
- * interrupt via the following write to the status register. If
- * this is done after then one gets multiple PL done interrupts.
- */
- lcd_disable_raster(NO_WAIT_FOR_FRAME_DONE);
-
- lcdc_write(stat, &da8xx_fb_reg_base->masked_stat);
-
- /* Disable PL completion interrupt */
- reg_int = lcdc_read(&da8xx_fb_reg_base->int_ena_clr) |
- (LCD_V2_PL_INT_ENA);
- lcdc_write(reg_int, &da8xx_fb_reg_base->int_ena_clr);
-
- /* Setup and start data loading mode */
- lcd_blit(LOAD_DATA, par);
- lcdc_write(0, &da8xx_fb_reg_base->end_of_int_ind);
- return LCD_PL_LOAD_DONE;
- } else {
- lcdc_write(stat, &da8xx_fb_reg_base->masked_stat);
-
- if (stat & LCD_END_OF_FRAME0)
- debug("LCD_END_OF_FRAME0\n");
-
- lcdc_write(par->dma_start,
- &da8xx_fb_reg_base->dma_frm_buf_base_addr_0);
- lcdc_write(par->dma_end,
- &da8xx_fb_reg_base->dma_frm_buf_ceiling_addr_0);
- par->vsync_flag = 1;
- lcdc_write(0, &da8xx_fb_reg_base->end_of_int_ind);
- return LCD_END_OF_FRAME0;
- }
- lcdc_write(0, &da8xx_fb_reg_base->end_of_int_ind);
- return stat;
-}
-
-static u32 lcdc_irq_handler(void)
-{
- if (lcd_revision == LCD_VERSION_1)
- return lcdc_irq_handler_rev01();
- else
- return lcdc_irq_handler_rev02();
-}
-
-static u32 wait_for_event(u32 event)
-{
- u32 timeout = 50000;
- u32 ret;
-
- do {
- ret = lcdc_irq_handler();
- udelay(1000);
- --timeout;
- } while (!(ret & event) && timeout);
-
- if (!(ret & event)) {
- printf("%s: event %d not hit\n", __func__, event);
- return -1;
- }
-
- return 0;
-
-}
-
-void *video_hw_init(void)
-{
- struct da8xx_fb_par *par;
- u32 size;
- u32 rev;
- char *p;
-
- if (!lcd_panel) {
- printf("Display not initialized\n");
- return NULL;
- }
- gpanel.winSizeX = lcd_panel->width;
- gpanel.winSizeY = lcd_panel->height;
- gpanel.plnSizeX = lcd_panel->width;
- gpanel.plnSizeY = lcd_panel->height;
-
- switch (bits_x_pixel) {
- case 32:
- gpanel.gdfBytesPP = 4;
- gpanel.gdfIndex = GDF_32BIT_X888RGB;
- break;
- case 24:
- gpanel.gdfBytesPP = 4;
- gpanel.gdfIndex = GDF_32BIT_X888RGB;
- break;
- case 16:
- gpanel.gdfBytesPP = 2;
- gpanel.gdfIndex = GDF_16BIT_565RGB;
- break;
- default:
- gpanel.gdfBytesPP = 1;
- gpanel.gdfIndex = GDF__8BIT_INDEX;
- break;
- }
-
- da8xx_fb_reg_base = (struct da8xx_lcd_regs *)DA8XX_LCD_CNTL_BASE;
-
- /* Determine LCD IP Version */
- rev = lcdc_read(&da8xx_fb_reg_base->revid);
- switch (rev) {
- case 0x4C100102:
- lcd_revision = LCD_VERSION_1;
- break;
- case 0x4F200800:
- case 0x4F201000:
- lcd_revision = LCD_VERSION_2;
- break;
- default:
- printf("Unknown PID Reg value 0x%x, defaulting to LCD revision 1\n",
- rev);
- lcd_revision = LCD_VERSION_1;
- break;
- }
-
- debug("rev: 0x%x Resolution: %dx%d %d\n", rev,
- gpanel.winSizeX,
- gpanel.winSizeY,
- da8xx_lcd_cfg->bpp);
-
- size = sizeof(struct fb_info) + sizeof(struct da8xx_fb_par);
- da8xx_fb_info = malloc_cache_aligned(size);
- debug("da8xx_fb_info at %x\n", (unsigned int)da8xx_fb_info);
-
- if (!da8xx_fb_info) {
- printf("Memory allocation failed for fb_info\n");
- return NULL;
- }
- memset(da8xx_fb_info, 0, size);
- p = (char *)da8xx_fb_info;
- da8xx_fb_info->par = p + sizeof(struct fb_info);
- debug("da8xx_par at %x\n", (unsigned int)da8xx_fb_info->par);
-
- par = da8xx_fb_info->par;
- par->pxl_clk = lcd_panel->pxl_clk;
-
- if (lcd_init(par, da8xx_lcd_cfg, lcd_panel) < 0) {
- printf("lcd_init failed\n");
- goto err_release_fb;
- }
-
- /* allocate frame buffer */
- par->vram_size = lcd_panel->width * lcd_panel->height *
- da8xx_lcd_cfg->bpp;
- par->vram_size = par->vram_size * LCD_NUM_BUFFERS / 8;
-
- par->vram_virt = malloc_cache_aligned(par->vram_size);
-
- par->vram_phys = (dma_addr_t) par->vram_virt;
- debug("Requesting 0x%x bytes for framebuffer at 0x%x\n",
- (unsigned int)par->vram_size,
- (unsigned int)par->vram_virt);
- if (!par->vram_virt) {
- printf("GLCD: malloc for frame buffer failed\n");
- goto err_release_fb;
- }
- gd->fb_base = (int)par->vram_virt;
-
- gpanel.frameAdrs = (unsigned int)par->vram_virt;
- da8xx_fb_info->screen_base = (char *) par->vram_virt;
- da8xx_fb_fix.smem_start = gpanel.frameAdrs;
- da8xx_fb_fix.smem_len = par->vram_size;
- da8xx_fb_fix.line_length = (lcd_panel->width * da8xx_lcd_cfg->bpp) / 8;
-
- par->dma_start = par->vram_phys;
- par->dma_end = par->dma_start + lcd_panel->height *
- da8xx_fb_fix.line_length - 1;
-
- /* allocate palette buffer */
- par->v_palette_base = malloc_cache_aligned(PALETTE_SIZE);
- if (!par->v_palette_base) {
- printf("GLCD: malloc for palette buffer failed\n");
- goto err_release_fb_mem;
- }
- memset(par->v_palette_base, 0, PALETTE_SIZE);
- par->p_palette_base = (unsigned int)par->v_palette_base;
-
- /* Initialize par */
- da8xx_fb_info->var.bits_per_pixel = da8xx_lcd_cfg->bpp;
-
- da8xx_fb_var.xres = lcd_panel->width;
- da8xx_fb_var.xres_virtual = lcd_panel->width;
-
- da8xx_fb_var.yres = lcd_panel->height;
- da8xx_fb_var.yres_virtual = lcd_panel->height * LCD_NUM_BUFFERS;
-
- da8xx_fb_var.grayscale =
- da8xx_lcd_cfg->p_disp_panel->panel_shade == MONOCHROME ? 1 : 0;
- da8xx_fb_var.bits_per_pixel = da8xx_lcd_cfg->bpp;
-
- da8xx_fb_var.hsync_len = lcd_panel->hsw;
- da8xx_fb_var.vsync_len = lcd_panel->vsw;
-
- /* Initialize fbinfo */
- da8xx_fb_info->flags = FBINFO_FLAG_DEFAULT;
- da8xx_fb_info->fix = da8xx_fb_fix;
- da8xx_fb_info->var = da8xx_fb_var;
- da8xx_fb_info->pseudo_palette = par->pseudo_palette;
- da8xx_fb_info->fix.visual = (da8xx_fb_info->var.bits_per_pixel <= 8) ?
- FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
-
- /* Clear interrupt */
- memset((void *)par->vram_virt, 0, par->vram_size);
- lcd_disable_raster(NO_WAIT_FOR_FRAME_DONE);
- if (lcd_revision == LCD_VERSION_1)
- lcdc_write(0xFFFF, &da8xx_fb_reg_base->stat);
- else
- lcdc_write(0xFFFF, &da8xx_fb_reg_base->masked_stat);
- debug("Palette at 0x%x size %d\n", par->p_palette_base,
- par->palette_sz);
- lcdc_dma_start();
-
- /* Load a default palette */
- fb_setcolreg(0, 0, 0, 0, 0xffff, da8xx_fb_info);
-
- /* Check that the palette is loaded */
- wait_for_event(LCD_PL_LOAD_DONE);
-
- /* Wait until DMA is working */
- wait_for_event(LCD_END_OF_FRAME0);
-
- return (void *)&gpanel;
-
-err_release_fb_mem:
- free(par->vram_virt);
-
-err_release_fb:
- free(da8xx_fb_info);
-
- return NULL;
-}
-
-void da8xx_video_init(const struct da8xx_panel *panel,
- const struct lcd_ctrl_config *lcd_cfg, int bits_pixel)
-{
- lcd_panel = panel;
- da8xx_lcd_cfg = lcd_cfg;
- bits_x_pixel = bits_pixel;
-}
diff --git a/drivers/video/da8xx-fb.h b/drivers/video/da8xx-fb.h
deleted file mode 100644
index 9b30d98..0000000
--- a/drivers/video/da8xx-fb.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Porting to u-boot:
- *
- * (C) Copyright 2011
- * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
- *
- * Copyright (C) 2008-2009 MontaVista Software Inc.
- * Copyright (C) 2008-2009 Texas Instruments Inc
- *
- * Based on the LCD driver for TI Avalanche processors written by
- * Ajay Singh and Shalom Hai.
- */
-
-#ifndef DA8XX_FB_H
-#define DA8XX_FB_H
-
-enum panel_type {
- QVGA = 0,
- WVGA
-};
-
-enum panel_shade {
- MONOCHROME = 0,
- COLOR_ACTIVE,
- COLOR_PASSIVE,
-};
-
-enum raster_load_mode {
- LOAD_DATA = 1,
- LOAD_PALETTE,
-};
-
-struct display_panel {
- enum panel_type panel_type; /* QVGA */
- int max_bpp;
- int min_bpp;
- enum panel_shade panel_shade;
-};
-
-struct da8xx_panel {
- const char name[25]; /* Full name <vendor>_<model> */
- unsigned short width;
- unsigned short height;
- int hfp; /* Horizontal front porch */
- int hbp; /* Horizontal back porch */
- int hsw; /* Horizontal Sync Pulse Width */
- int vfp; /* Vertical front porch */
- int vbp; /* Vertical back porch */
- int vsw; /* Vertical Sync Pulse Width */
- unsigned int pxl_clk; /* Pixel clock */
- unsigned char invert_pxl_clk; /* Invert Pixel clock */
-};
-
-struct da8xx_lcdc_platform_data {
- const char manu_name[10];
- void *controller_data;
- const char type[25];
- void (*panel_power_ctrl)(int);
-};
-
-struct lcd_ctrl_config {
- const struct display_panel *p_disp_panel;
-
- /* AC Bias Pin Frequency */
- int ac_bias;
-
- /* AC Bias Pin Transitions per Interrupt */
- int ac_bias_intrpt;
-
- /* DMA burst size */
- int dma_burst_sz;
-
- /* Bits per pixel */
- int bpp;
-
- /* FIFO DMA Request Delay */
- int fdd;
-
- /* TFT Alternative Signal Mapping (Only for active) */
- unsigned char tft_alt_mode;
-
- /* 12 Bit Per Pixel (5-6-5) Mode (Only for passive) */
- unsigned char stn_565_mode;
-
- /* Mono 8-bit Mode: 1=D0-D7 or 0=D0-D3 */
- unsigned char mono_8bit_mode;
-
- /* Invert line clock */
- unsigned char invert_line_clock;
-
- /* Invert frame clock */
- unsigned char invert_frm_clock;
-
- /* Horizontal and Vertical Sync Edge: 0=rising 1=falling */
- unsigned char sync_edge;
-
- /* Horizontal and Vertical Sync: Control: 0=ignore */
- unsigned char sync_ctrl;
-
- /* Raster Data Order Select: 1=Most-to-least 0=Least-to-most */
- unsigned char raster_order;
-};
-
-struct lcd_sync_arg {
- int back_porch;
- int front_porch;
- int pulse_width;
-};
-
-void da8xx_video_init(const struct da8xx_panel *panel,
- const struct lcd_ctrl_config *lcd_cfg,
- int bits_pixel);
-
-#endif /* ifndef DA8XX_FB_H */
diff --git a/drivers/video/formike.c b/drivers/video/formike.c
deleted file mode 100644
index 5cbe50d..0000000
--- a/drivers/video/formike.c
+++ /dev/null
@@ -1,513 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * LCD: Formike, TFT 4.3", 480x800, RGB24, KWH043ST20-F01, DriverIC NT35510-16
- * LCD initialization via SPI
- * Based on:
- *
- */
-#include <common.h>
-#include <errno.h>
-#include <log.h>
-#include <spi.h>
-#include <linux/delay.h>
-
-#define TAG_READ 0x80
-#define TAG_WRITE 0x00
-
-#define TAG_DATA 0x40
-#define TAG_COMMAND 0x00
-
-#define TAG_ADDR_H 0x20
-#define TAG_ADDR_L 0x00
-
-static int spi_write_tag_val(struct spi_slave *spi, unsigned char tag,
- unsigned char val)
-{
- unsigned long flags = SPI_XFER_BEGIN;
- u8 buf[2];
- int ret;
-
- buf[0] = tag;
- ret = spi_xfer(spi, 8, buf, NULL, flags);
- buf[0] = val;
- flags = SPI_XFER_END;
- ret = spi_xfer(spi, 8, buf, NULL, flags);
-
-#ifdef KWH043ST20_F01_SPI_DEBUG
- printf("spi_write_tag_val: tag=%02X, val=%02X ret: %d\n",
- tag, val, ret);
-#endif /* KWH043ST20_F01_SPI_DEBUG */
- if (ret)
- debug("%s: Failed to send: %d\n", __func__, ret);
-
- return ret;
-}
-
-static void spi_write_dat(struct spi_slave *spi, unsigned int val)
-{
- spi_write_tag_val(spi, TAG_WRITE|TAG_DATA, val);
-}
-
-static void spi_write_com(struct spi_slave *spi, unsigned int addr)
-{
- spi_write_tag_val(spi, TAG_WRITE|TAG_COMMAND|TAG_ADDR_H,
- (addr & 0xff00) >> 8);
- spi_write_tag_val(spi, TAG_WRITE|TAG_COMMAND|TAG_ADDR_L,
- (addr & 0x00ff) >> 0);
-}
-
-int kwh043st20_f01_spi_startup(unsigned int bus, unsigned int cs,
- unsigned int max_hz, unsigned int spi_mode)
-{
- struct spi_slave *spi;
- int ret;
-
- spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
- if (!spi) {
- debug("%s: Failed to set up slave\n", __func__);
- return -1;
- }
-
- ret = spi_claim_bus(spi);
- if (ret) {
- debug("%s: Failed to claim SPI bus: %d\n", __func__, ret);
- goto err_claim_bus;
- }
-
-
- /* LV2 Page 1 enable */
- spi_write_com(spi, 0xF000); spi_write_dat(spi, 0x55);
- spi_write_com(spi, 0xF001); spi_write_dat(spi, 0xAA);
- spi_write_com(spi, 0xF002); spi_write_dat(spi, 0x52);
- spi_write_com(spi, 0xF003); spi_write_dat(spi, 0x08);
- spi_write_com(spi, 0xF004); spi_write_dat(spi, 0x01);
-
- /* AVDD Set AVDD 5.2V */
- spi_write_com(spi, 0xB000); spi_write_dat(spi, 0x0D);
- spi_write_com(spi, 0xB001); spi_write_dat(spi, 0x0D);
- spi_write_com(spi, 0xB002); spi_write_dat(spi, 0x0D);
-
- /* AVDD ratio */
- spi_write_com(spi, 0xB600); spi_write_dat(spi, 0x34);
- spi_write_com(spi, 0xB601); spi_write_dat(spi, 0x34);
- spi_write_com(spi, 0xB602); spi_write_dat(spi, 0x34);
-
- /* AVEE -5.2V */
- spi_write_com(spi, 0xB100); spi_write_dat(spi, 0x0D);
- spi_write_com(spi, 0xB101); spi_write_dat(spi, 0x0D);
- spi_write_com(spi, 0xB102); spi_write_dat(spi, 0x0D);
-
- /* AVEE ratio */
- spi_write_com(spi, 0xB700); spi_write_dat(spi, 0x35);
- spi_write_com(spi, 0xB701); spi_write_dat(spi, 0x35);
- spi_write_com(spi, 0xB702); spi_write_dat(spi, 0x35);
-
- /* VCL -2.5V */
- spi_write_com(spi, 0xB200); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xB201); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xB202); spi_write_dat(spi, 0x00);
-
- /* VCL ratio */
- spi_write_com(spi, 0xB800); spi_write_dat(spi, 0x24);
- spi_write_com(spi, 0xB801); spi_write_dat(spi, 0x24);
- spi_write_com(spi, 0xB802); spi_write_dat(spi, 0x24);
-
- /* VGH 15V */
- spi_write_com(spi, 0xBF00); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xB300); spi_write_dat(spi, 0x08);
- spi_write_com(spi, 0xB301); spi_write_dat(spi, 0x08);
- spi_write_com(spi, 0xB302); spi_write_dat(spi, 0x08);
-
- /* VGH ratio */
- spi_write_com(spi, 0xB900); spi_write_dat(spi, 0x34);
- spi_write_com(spi, 0xB901); spi_write_dat(spi, 0x34);
- spi_write_com(spi, 0xB902); spi_write_dat(spi, 0x34);
-
- /* VGLX ratio */
- spi_write_com(spi, 0xBA00); spi_write_dat(spi, 0x24);
- spi_write_com(spi, 0xBA01); spi_write_dat(spi, 0x24);
- spi_write_com(spi, 0xBA02); spi_write_dat(spi, 0x24);
-
- /* VGMP/VGSP 4.7V/0V */
- spi_write_com(spi, 0xBC00); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xBC01); spi_write_dat(spi, 0x88);
- spi_write_com(spi, 0xBC02); spi_write_dat(spi, 0x00);
-
- /* VGMN/VGSN -4.7V/0V */
- spi_write_com(spi, 0xBD00); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xBD01); spi_write_dat(spi, 0x88);
- spi_write_com(spi, 0xBD02); spi_write_dat(spi, 0x00);
-
- /* VCOM 1.525V */
- spi_write_com(spi, 0xBE00); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xBE01); spi_write_dat(spi, 0x7A);
-
- /* Gamma Setting */
- spi_write_com(spi, 0xD100); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD101); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xD102); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD103); spi_write_dat(spi, 0x15);
- spi_write_com(spi, 0xD104); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD105); spi_write_dat(spi, 0x30);
- spi_write_com(spi, 0xD106); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD107); spi_write_dat(spi, 0x47);
- spi_write_com(spi, 0xD108); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD109); spi_write_dat(spi, 0x5B);
- spi_write_com(spi, 0xD10A); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD10B); spi_write_dat(spi, 0x7D);
- spi_write_com(spi, 0xD10C); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD10D); spi_write_dat(spi, 0x9D);
- spi_write_com(spi, 0xD10E); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD10F); spi_write_dat(spi, 0xCC);
- spi_write_com(spi, 0xD110); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD111); spi_write_dat(spi, 0xF3);
- spi_write_com(spi, 0xD112); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD113); spi_write_dat(spi, 0x32);
- spi_write_com(spi, 0xD114); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD115); spi_write_dat(spi, 0x63);
- spi_write_com(spi, 0xD116); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD117); spi_write_dat(spi, 0xB1);
- spi_write_com(spi, 0xD118); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD119); spi_write_dat(spi, 0xF0);
- spi_write_com(spi, 0xD11A); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD11B); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD11C); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD11D); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD11E); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD11F); spi_write_dat(spi, 0x67);
- spi_write_com(spi, 0xD120); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD121); spi_write_dat(spi, 0x90);
- spi_write_com(spi, 0xD122); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD123); spi_write_dat(spi, 0xCB);
- spi_write_com(spi, 0xD124); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD125); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD126); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD127); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD128); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD129); spi_write_dat(spi, 0x51);
- spi_write_com(spi, 0xD12A); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD12B); spi_write_dat(spi, 0x80);
- spi_write_com(spi, 0xD12C); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD12D); spi_write_dat(spi, 0x9F);
- spi_write_com(spi, 0xD12E); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD12F); spi_write_dat(spi, 0xBE);
- spi_write_com(spi, 0xD130); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD131); spi_write_dat(spi, 0xF9);
- spi_write_com(spi, 0xD132); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD133); spi_write_dat(spi, 0xFF);
-
- spi_write_com(spi, 0xD200); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD201); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xD202); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD203); spi_write_dat(spi, 0x15);
- spi_write_com(spi, 0xD204); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD205); spi_write_dat(spi, 0x30);
- spi_write_com(spi, 0xD206); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD207); spi_write_dat(spi, 0x47);
- spi_write_com(spi, 0xD208); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD209); spi_write_dat(spi, 0x5B);
- spi_write_com(spi, 0xD20A); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD20B); spi_write_dat(spi, 0x7D);
- spi_write_com(spi, 0xD20C); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD20D); spi_write_dat(spi, 0x9D);
- spi_write_com(spi, 0xD20E); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD20F); spi_write_dat(spi, 0xCC);
- spi_write_com(spi, 0xD210); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD211); spi_write_dat(spi, 0xF3);
- spi_write_com(spi, 0xD212); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD213); spi_write_dat(spi, 0x32);
- spi_write_com(spi, 0xD214); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD215); spi_write_dat(spi, 0x63);
- spi_write_com(spi, 0xD216); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD217); spi_write_dat(spi, 0xB1);
- spi_write_com(spi, 0xD218); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD219); spi_write_dat(spi, 0xF0);
- spi_write_com(spi, 0xD21A); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD21B); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD21C); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD21D); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD21E); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD21F); spi_write_dat(spi, 0x67);
- spi_write_com(spi, 0xD220); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD221); spi_write_dat(spi, 0x90);
- spi_write_com(spi, 0xD222); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD223); spi_write_dat(spi, 0xCB);
- spi_write_com(spi, 0xD224); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD225); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD226); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD227); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD228); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD229); spi_write_dat(spi, 0x51);
- spi_write_com(spi, 0xD22A); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD22B); spi_write_dat(spi, 0x80);
- spi_write_com(spi, 0xD22C); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD22D); spi_write_dat(spi, 0x9F);
- spi_write_com(spi, 0xD22E); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD22F); spi_write_dat(spi, 0xBE);
- spi_write_com(spi, 0xD230); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD231); spi_write_dat(spi, 0xF9);
- spi_write_com(spi, 0xD232); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD233); spi_write_dat(spi, 0xFF);
-
- spi_write_com(spi, 0xD300); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD301); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xD302); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD303); spi_write_dat(spi, 0x15);
- spi_write_com(spi, 0xD304); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD305); spi_write_dat(spi, 0x30);
- spi_write_com(spi, 0xD306); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD307); spi_write_dat(spi, 0x47);
- spi_write_com(spi, 0xD308); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD309); spi_write_dat(spi, 0x5B);
- spi_write_com(spi, 0xD30A); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD30B); spi_write_dat(spi, 0x7D);
- spi_write_com(spi, 0xD30C); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD30D); spi_write_dat(spi, 0x9D);
- spi_write_com(spi, 0xD30E); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD30F); spi_write_dat(spi, 0xCC);
- spi_write_com(spi, 0xD310); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD311); spi_write_dat(spi, 0xF3);
- spi_write_com(spi, 0xD312); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD313); spi_write_dat(spi, 0x32);
- spi_write_com(spi, 0xD314); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD315); spi_write_dat(spi, 0x63);
- spi_write_com(spi, 0xD316); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD317); spi_write_dat(spi, 0xB1);
- spi_write_com(spi, 0xD318); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD319); spi_write_dat(spi, 0xF0);
- spi_write_com(spi, 0xD31A); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD31B); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD31C); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD31D); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD31E); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD31F); spi_write_dat(spi, 0x67);
- spi_write_com(spi, 0xD320); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD321); spi_write_dat(spi, 0x90);
- spi_write_com(spi, 0xD322); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD323); spi_write_dat(spi, 0xCB);
- spi_write_com(spi, 0xD324); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD325); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD326); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD327); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD328); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD329); spi_write_dat(spi, 0x51);
- spi_write_com(spi, 0xD32A); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD32B); spi_write_dat(spi, 0x80);
- spi_write_com(spi, 0xD32C); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD32D); spi_write_dat(spi, 0x9F);
- spi_write_com(spi, 0xD32E); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD32F); spi_write_dat(spi, 0xBE);
- spi_write_com(spi, 0xD330); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD331); spi_write_dat(spi, 0xF9);
- spi_write_com(spi, 0xD332); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD333); spi_write_dat(spi, 0xFF);
-
- spi_write_com(spi, 0xD400); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD401); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xD402); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD403); spi_write_dat(spi, 0x15);
- spi_write_com(spi, 0xD404); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD405); spi_write_dat(spi, 0x30);
- spi_write_com(spi, 0xD406); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD407); spi_write_dat(spi, 0x47);
- spi_write_com(spi, 0xD408); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD409); spi_write_dat(spi, 0x5B);
- spi_write_com(spi, 0xD40A); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD40B); spi_write_dat(spi, 0x7D);
- spi_write_com(spi, 0xD40C); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD40D); spi_write_dat(spi, 0x9D);
- spi_write_com(spi, 0xD40E); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD40F); spi_write_dat(spi, 0xCC);
- spi_write_com(spi, 0xD410); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD411); spi_write_dat(spi, 0xF3);
- spi_write_com(spi, 0xD412); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD413); spi_write_dat(spi, 0x32);
- spi_write_com(spi, 0xD414); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD415); spi_write_dat(spi, 0x63);
- spi_write_com(spi, 0xD416); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD417); spi_write_dat(spi, 0xB1);
- spi_write_com(spi, 0xD418); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD419); spi_write_dat(spi, 0xF0);
- spi_write_com(spi, 0xD41A); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD41B); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD41C); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD41D); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD41E); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD41F); spi_write_dat(spi, 0x67);
- spi_write_com(spi, 0xD420); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD421); spi_write_dat(spi, 0x90);
- spi_write_com(spi, 0xD422); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD423); spi_write_dat(spi, 0xCB);
- spi_write_com(spi, 0xD424); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD425); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD426); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD427); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD428); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD429); spi_write_dat(spi, 0x51);
- spi_write_com(spi, 0xD42A); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD42B); spi_write_dat(spi, 0x80);
- spi_write_com(spi, 0xD42C); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD42D); spi_write_dat(spi, 0x9F);
- spi_write_com(spi, 0xD42E); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD42F); spi_write_dat(spi, 0xBE);
- spi_write_com(spi, 0xD430); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD431); spi_write_dat(spi, 0xF9);
- spi_write_com(spi, 0xD432); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD433); spi_write_dat(spi, 0xFF);
-
- spi_write_com(spi, 0xD500); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD501); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xD502); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD503); spi_write_dat(spi, 0x15);
- spi_write_com(spi, 0xD504); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD505); spi_write_dat(spi, 0x30);
- spi_write_com(spi, 0xD506); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD507); spi_write_dat(spi, 0x47);
- spi_write_com(spi, 0xD508); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD509); spi_write_dat(spi, 0x5B);
- spi_write_com(spi, 0xD50A); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD50B); spi_write_dat(spi, 0x7D);
- spi_write_com(spi, 0xD50C); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD50D); spi_write_dat(spi, 0x9D);
- spi_write_com(spi, 0xD50E); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD50F); spi_write_dat(spi, 0xCC);
- spi_write_com(spi, 0xD510); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD511); spi_write_dat(spi, 0xF3);
- spi_write_com(spi, 0xD512); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD513); spi_write_dat(spi, 0x32);
- spi_write_com(spi, 0xD514); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD515); spi_write_dat(spi, 0x63);
- spi_write_com(spi, 0xD516); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD517); spi_write_dat(spi, 0xB1);
- spi_write_com(spi, 0xD518); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD519); spi_write_dat(spi, 0xF0);
- spi_write_com(spi, 0xD51A); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD51B); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD51C); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD51D); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD51E); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD51F); spi_write_dat(spi, 0x67);
- spi_write_com(spi, 0xD520); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD521); spi_write_dat(spi, 0x90);
- spi_write_com(spi, 0xD522); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD523); spi_write_dat(spi, 0xCB);
- spi_write_com(spi, 0xD524); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD525); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD526); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD527); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD528); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD529); spi_write_dat(spi, 0x51);
- spi_write_com(spi, 0xD52A); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD52B); spi_write_dat(spi, 0x80);
- spi_write_com(spi, 0xD52C); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD52D); spi_write_dat(spi, 0x9F);
- spi_write_com(spi, 0xD52E); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD52F); spi_write_dat(spi, 0xBE);
- spi_write_com(spi, 0xD530); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD531); spi_write_dat(spi, 0xF9);
- spi_write_com(spi, 0xD532); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD533); spi_write_dat(spi, 0xFF);
-
- spi_write_com(spi, 0xD600); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD601); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xD602); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD603); spi_write_dat(spi, 0x15);
- spi_write_com(spi, 0xD604); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD605); spi_write_dat(spi, 0x30);
- spi_write_com(spi, 0xD606); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD607); spi_write_dat(spi, 0x47);
- spi_write_com(spi, 0xD608); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD609); spi_write_dat(spi, 0x5B);
- spi_write_com(spi, 0xD60A); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD60B); spi_write_dat(spi, 0x7D);
- spi_write_com(spi, 0xD60C); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD60D); spi_write_dat(spi, 0x9D);
- spi_write_com(spi, 0xD60E); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD60F); spi_write_dat(spi, 0xCC);
- spi_write_com(spi, 0xD610); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xD611); spi_write_dat(spi, 0xF3);
- spi_write_com(spi, 0xD612); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD613); spi_write_dat(spi, 0x32);
- spi_write_com(spi, 0xD614); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD615); spi_write_dat(spi, 0x63);
- spi_write_com(spi, 0xD616); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD617); spi_write_dat(spi, 0xB1);
- spi_write_com(spi, 0xD618); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD619); spi_write_dat(spi, 0xF0);
- spi_write_com(spi, 0xD61A); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xD61B); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD61C); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD61D); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD61E); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD61F); spi_write_dat(spi, 0x67);
- spi_write_com(spi, 0xD620); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD621); spi_write_dat(spi, 0x90);
- spi_write_com(spi, 0xD622); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD623); spi_write_dat(spi, 0xCB);
- spi_write_com(spi, 0xD624); spi_write_dat(spi, 0x02);
- spi_write_com(spi, 0xD625); spi_write_dat(spi, 0xF2);
- spi_write_com(spi, 0xD626); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD627); spi_write_dat(spi, 0x2A);
- spi_write_com(spi, 0xD628); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD629); spi_write_dat(spi, 0x51);
- spi_write_com(spi, 0xD62A); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD62B); spi_write_dat(spi, 0x80);
- spi_write_com(spi, 0xD62C); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD62D); spi_write_dat(spi, 0x9F);
- spi_write_com(spi, 0xD62E); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD62F); spi_write_dat(spi, 0xBE);
- spi_write_com(spi, 0xD630); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD631); spi_write_dat(spi, 0xF9);
- spi_write_com(spi, 0xD632); spi_write_dat(spi, 0x03);
- spi_write_com(spi, 0xD633); spi_write_dat(spi, 0xFF);
-
- /* LV2 Page 0 enable */
- spi_write_com(spi, 0xF000); spi_write_dat(spi, 0x55);
- spi_write_com(spi, 0xF001); spi_write_dat(spi, 0xAA);
- spi_write_com(spi, 0xF002); spi_write_dat(spi, 0x52);
- spi_write_com(spi, 0xF003); spi_write_dat(spi, 0x08);
- spi_write_com(spi, 0xF004); spi_write_dat(spi, 0x00);
-
- /* Display control */
- spi_write_com(spi, 0xB100); spi_write_dat(spi, 0xFC);
- spi_write_com(spi, 0xB101); spi_write_dat(spi, 0x00);
-
- /* Source hold time */
- spi_write_com(spi, 0xB600); spi_write_dat(spi, 0x05);
-
- /* Gate EQ control */
- spi_write_com(spi, 0xB700); spi_write_dat(spi, 0x70);
- spi_write_com(spi, 0xB701); spi_write_dat(spi, 0x70);
-
- /* Source EQ control (Mode 2) */
- spi_write_com(spi, 0xB800); spi_write_dat(spi, 0x01);
- spi_write_com(spi, 0xB801); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xB802); spi_write_dat(spi, 0x05);
- spi_write_com(spi, 0xB803); spi_write_dat(spi, 0x05);
-
- /* Inversion mode (Column) */
- spi_write_com(spi, 0xBC00); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xBC01); spi_write_dat(spi, 0x00);
- spi_write_com(spi, 0xBC02); spi_write_dat(spi, 0x00);
-
- /* Timing control 8phase dual side/4H/4delay/RST_EN */
- spi_write_com(spi, 0xC900); spi_write_dat(spi, 0xD0);
- spi_write_com(spi, 0xC901); spi_write_dat(spi, 0x82);
- spi_write_com(spi, 0xC902); spi_write_dat(spi, 0x50);
- spi_write_com(spi, 0xC903); spi_write_dat(spi, 0x50);
- spi_write_com(spi, 0xC904); spi_write_dat(spi, 0x50);
-
- spi_write_com(spi, 0x3A00); spi_write_dat(spi, 0x55);
- mdelay(120);
- spi_write_com(spi, 0x1100);
- mdelay(120);
- spi_write_com(spi, 0x2900);
- mdelay(120);
- /* spi_write_com(spi, 0x2100); spi_write_dat(spi, 0x00); */
- spi_write_com(spi, 0x2C00);
-
- return 0;
-err_claim_bus:
- spi_free_slave(spi);
- return -1;
-}
diff --git a/drivers/video/fsl_dcu_fb.c b/drivers/video/fsl_dcu_fb.c
deleted file mode 100644
index dc5b24c..0000000
--- a/drivers/video/fsl_dcu_fb.c
+++ /dev/null
@@ -1,549 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2014 Freescale Semiconductor, Inc.
- * Copyright 2019 Toradex AG
- *
- * FSL DCU Framebuffer driver
- */
-
-#include <init.h>
-#include <asm/cache.h>
-#include <asm/global_data.h>
-#include <asm/io.h>
-#include <common.h>
-#include <dm.h>
-#include <fdt_support.h>
-#include <fsl_dcu_fb.h>
-#include <linux/fb.h>
-#include <malloc.h>
-#include <video.h>
-#include <video_fb.h>
-#include "videomodes.h"
-
-/* Convert the X,Y resolution pair into a single number */
-#define RESOLUTION(x, y) (((u32)(x) << 16) | (y))
-
-#ifdef CONFIG_SYS_FSL_DCU_LE
-#define dcu_read32 in_le32
-#define dcu_write32 out_le32
-#elif defined(CONFIG_SYS_FSL_DCU_BE)
-#define dcu_read32 in_be32
-#define dcu_write32 out_be32
-#endif
-
-#define DCU_MODE_BLEND_ITER(x) ((x) << 20)
-#define DCU_MODE_RASTER_EN (1 << 14)
-#define DCU_MODE_NORMAL 1
-#define DCU_MODE_COLORBAR 3
-#define DCU_BGND_R(x) ((x) << 16)
-#define DCU_BGND_G(x) ((x) << 8)
-#define DCU_BGND_B(x) (x)
-#define DCU_DISP_SIZE_DELTA_Y(x) ((x) << 16)
-#define DCU_DISP_SIZE_DELTA_X(x) (x)
-#define DCU_HSYN_PARA_BP(x) ((x) << 22)
-#define DCU_HSYN_PARA_PW(x) ((x) << 11)
-#define DCU_HSYN_PARA_FP(x) (x)
-#define DCU_VSYN_PARA_BP(x) ((x) << 22)
-#define DCU_VSYN_PARA_PW(x) ((x) << 11)
-#define DCU_VSYN_PARA_FP(x) (x)
-#define DCU_SYN_POL_INV_PXCK_FALL (1 << 6)
-#define DCU_SYN_POL_NEG_REMAIN (0 << 5)
-#define DCU_SYN_POL_INV_VS_LOW (1 << 1)
-#define DCU_SYN_POL_INV_HS_LOW (1)
-#define DCU_THRESHOLD_LS_BF_VS(x) ((x) << 16)
-#define DCU_THRESHOLD_OUT_BUF_HIGH(x) ((x) << 8)
-#define DCU_THRESHOLD_OUT_BUF_LOW(x) (x)
-#define DCU_UPDATE_MODE_MODE (1 << 31)
-#define DCU_UPDATE_MODE_READREG (1 << 30)
-
-#define DCU_CTRLDESCLN_1_HEIGHT(x) ((x) << 16)
-#define DCU_CTRLDESCLN_1_WIDTH(x) (x)
-#define DCU_CTRLDESCLN_2_POSY(x) ((x) << 16)
-#define DCU_CTRLDESCLN_2_POSX(x) (x)
-#define DCU_CTRLDESCLN_4_EN (1 << 31)
-#define DCU_CTRLDESCLN_4_TILE_EN (1 << 30)
-#define DCU_CTRLDESCLN_4_DATA_SEL_CLUT (1 << 29)
-#define DCU_CTRLDESCLN_4_SAFETY_EN (1 << 28)
-#define DCU_CTRLDESCLN_4_TRANS(x) ((x) << 20)
-#define DCU_CTRLDESCLN_4_BPP(x) ((x) << 16)
-#define DCU_CTRLDESCLN_4_RLE_EN (1 << 15)
-#define DCU_CTRLDESCLN_4_LUOFFS(x) ((x) << 4)
-#define DCU_CTRLDESCLN_4_BB_ON (1 << 2)
-#define DCU_CTRLDESCLN_4_AB(x) (x)
-#define DCU_CTRLDESCLN_5_CKMAX_R(x) ((x) << 16)
-#define DCU_CTRLDESCLN_5_CKMAX_G(x) ((x) << 8)
-#define DCU_CTRLDESCLN_5_CKMAX_B(x) (x)
-#define DCU_CTRLDESCLN_6_CKMIN_R(x) ((x) << 16)
-#define DCU_CTRLDESCLN_6_CKMIN_G(x) ((x) << 8)
-#define DCU_CTRLDESCLN_6_CKMIN_B(x) (x)
-#define DCU_CTRLDESCLN_7_TILE_VER(x) ((x) << 16)
-#define DCU_CTRLDESCLN_7_TILE_HOR(x) (x)
-#define DCU_CTRLDESCLN_8_FG_FCOLOR(x) (x)
-#define DCU_CTRLDESCLN_9_BG_BCOLOR(x) (x)
-
-#define BPP_16_RGB565 4
-#define BPP_24_RGB888 5
-#define BPP_32_ARGB8888 6
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/*
- * This setting is used for the TWR_LCD_RGB card
- */
-static struct fb_videomode fsl_dcu_mode_480_272 = {
- .name = "480x272-60",
- .refresh = 60,
- .xres = 480,
- .yres = 272,
- .pixclock = 91996,
- .left_margin = 2,
- .right_margin = 2,
- .upper_margin = 1,
- .lower_margin = 1,
- .hsync_len = 41,
- .vsync_len = 2,
- .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-/*
- * This setting is used for Siliconimage SiI9022A HDMI
- */
-static struct fb_videomode fsl_dcu_cea_mode_640_480 = {
- .name = "640x480-60",
- .refresh = 60,
- .xres = 640,
- .yres = 480,
- .pixclock = 39722,
- .left_margin = 48,
- .right_margin = 16,
- .upper_margin = 33,
- .lower_margin = 10,
- .hsync_len = 96,
- .vsync_len = 2,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED,
-};
-
-static struct fb_videomode fsl_dcu_mode_640_480 = {
- .name = "640x480-60",
- .refresh = 60,
- .xres = 640,
- .yres = 480,
- .pixclock = 25175,
- .left_margin = 40,
- .right_margin = 24,
- .upper_margin = 32,
- .lower_margin = 11,
- .hsync_len = 96,
- .vsync_len = 2,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED,
-};
-
-static struct fb_videomode fsl_dcu_mode_800_480 = {
- .name = "800x480-60",
- .refresh = 60,
- .xres = 800,
- .yres = 480,
- .pixclock = 33260,
- .left_margin = 216,
- .right_margin = 40,
- .upper_margin = 35,
- .lower_margin = 10,
- .hsync_len = 128,
- .vsync_len = 2,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED,
-};
-
-static struct fb_videomode fsl_dcu_mode_1024_600 = {
- .name = "1024x600-60",
- .refresh = 60,
- .xres = 1024,
- .yres = 600,
- .pixclock = 48000,
- .left_margin = 104,
- .right_margin = 43,
- .upper_margin = 24,
- .lower_margin = 20,
- .hsync_len = 5,
- .vsync_len = 5,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED,
-};
-
-/*
- * DCU register map
- */
-struct dcu_reg {
- u32 desc_cursor[4];
- u32 mode;
- u32 bgnd;
- u32 disp_size;
- u32 hsyn_para;
- u32 vsyn_para;
- u32 synpol;
- u32 threshold;
- u32 int_status;
- u32 int_mask;
- u32 colbar[8];
- u32 div_ratio;
- u32 sign_calc[2];
- u32 crc_val;
- u8 res_064[0x6c-0x64];
- u32 parr_err_status1;
- u8 res_070[0x7c-0x70];
- u32 parr_err_status3;
- u32 mparr_err_status1;
- u8 res_084[0x90-0x84];
- u32 mparr_err_status3;
- u32 threshold_inp_buf[2];
- u8 res_09c[0xa0-0x9c];
- u32 luma_comp;
- u32 chroma_red;
- u32 chroma_green;
- u32 chroma_blue;
- u32 crc_pos;
- u32 lyr_intpol_en;
- u32 lyr_luma_comp;
- u32 lyr_chrm_red;
- u32 lyr_chrm_grn;
- u32 lyr_chrm_blue;
- u8 res_0c4[0xcc-0xc8];
- u32 update_mode;
- u32 underrun;
- u8 res_0d4[0x100-0xd4];
- u32 gpr;
- u32 slr_l[2];
- u32 slr_disp_size;
- u32 slr_hvsync_para;
- u32 slr_pol;
- u32 slr_l_transp[2];
- u8 res_120[0x200-0x120];
- u32 ctrldescl[DCU_LAYER_MAX_NUM][16];
-};
-
-static void reset_total_layers(void)
-{
- struct dcu_reg *regs = (struct dcu_reg *)CONFIG_SYS_DCU_ADDR;
- int i;
-
- for (i = 0; i < DCU_LAYER_MAX_NUM; i++) {
- dcu_write32(&regs->ctrldescl[i][0], 0);
- dcu_write32(&regs->ctrldescl[i][1], 0);
- dcu_write32(&regs->ctrldescl[i][2], 0);
- dcu_write32(&regs->ctrldescl[i][3], 0);
- dcu_write32(&regs->ctrldescl[i][4], 0);
- dcu_write32(&regs->ctrldescl[i][5], 0);
- dcu_write32(&regs->ctrldescl[i][6], 0);
- dcu_write32(&regs->ctrldescl[i][7], 0);
- dcu_write32(&regs->ctrldescl[i][8], 0);
- dcu_write32(&regs->ctrldescl[i][9], 0);
- dcu_write32(&regs->ctrldescl[i][10], 0);
- }
-}
-
-static int layer_ctrldesc_init(struct fb_info fbinfo,
- int index, u32 pixel_format)
-{
- struct dcu_reg *regs = (struct dcu_reg *)CONFIG_SYS_DCU_ADDR;
- unsigned int bpp = BPP_24_RGB888;
-
- dcu_write32(&regs->ctrldescl[index][0],
- DCU_CTRLDESCLN_1_HEIGHT(fbinfo.var.yres) |
- DCU_CTRLDESCLN_1_WIDTH(fbinfo.var.xres));
-
- dcu_write32(&regs->ctrldescl[index][1],
- DCU_CTRLDESCLN_2_POSY(0) |
- DCU_CTRLDESCLN_2_POSX(0));
-
- dcu_write32(&regs->ctrldescl[index][2],
- (unsigned int)fbinfo.screen_base);
-
- switch (pixel_format) {
- case 16:
- bpp = BPP_16_RGB565;
- break;
- case 24:
- bpp = BPP_24_RGB888;
- break;
- case 32:
- bpp = BPP_32_ARGB8888;
- break;
- default:
- printf("unsupported color depth: %u\n", pixel_format);
- }
-
- dcu_write32(&regs->ctrldescl[index][3],
- DCU_CTRLDESCLN_4_EN |
- DCU_CTRLDESCLN_4_TRANS(0xff) |
- DCU_CTRLDESCLN_4_BPP(bpp) |
- DCU_CTRLDESCLN_4_AB(0));
-
- dcu_write32(&regs->ctrldescl[index][4],
- DCU_CTRLDESCLN_5_CKMAX_R(0xff) |
- DCU_CTRLDESCLN_5_CKMAX_G(0xff) |
- DCU_CTRLDESCLN_5_CKMAX_B(0xff));
- dcu_write32(&regs->ctrldescl[index][5],
- DCU_CTRLDESCLN_6_CKMIN_R(0) |
- DCU_CTRLDESCLN_6_CKMIN_G(0) |
- DCU_CTRLDESCLN_6_CKMIN_B(0));
-
- dcu_write32(&regs->ctrldescl[index][6],
- DCU_CTRLDESCLN_7_TILE_VER(0) |
- DCU_CTRLDESCLN_7_TILE_HOR(0));
-
- dcu_write32(&regs->ctrldescl[index][7], DCU_CTRLDESCLN_8_FG_FCOLOR(0));
- dcu_write32(&regs->ctrldescl[index][8], DCU_CTRLDESCLN_9_BG_BCOLOR(0));
-
- return 0;
-}
-
-int fsl_dcu_init(struct fb_info *fbinfo, unsigned int xres,
- unsigned int yres, unsigned int pixel_format)
-{
- struct dcu_reg *regs = (struct dcu_reg *)CONFIG_SYS_DCU_ADDR;
- unsigned int div, mode;
-/*
- * When DM_VIDEO is enabled reservation of framebuffer is done
- * in advance during bind() call.
- */
-#if !CONFIG_IS_ENABLED(DM_VIDEO)
- fbinfo->screen_size = fbinfo->var.xres * fbinfo->var.yres *
- (fbinfo->var.bits_per_pixel / 8);
-
- if (fbinfo->screen_size > CONFIG_VIDEO_FSL_DCU_MAX_FB_SIZE_MB) {
- fbinfo->screen_size = 0;
- return -ENOMEM;
- }
- /* Reserve framebuffer at the end of memory */
- gd->fb_base = gd->bd->bi_dram[0].start +
- gd->bd->bi_dram[0].size - fbinfo->screen_size;
- fbinfo->screen_base = (char *)gd->fb_base;
-
- memset(fbinfo->screen_base, 0, fbinfo->screen_size);
-#endif
-
- reset_total_layers();
-
- dcu_write32(&regs->disp_size,
- DCU_DISP_SIZE_DELTA_Y(fbinfo->var.yres) |
- DCU_DISP_SIZE_DELTA_X(fbinfo->var.xres / 16));
-
- dcu_write32(&regs->hsyn_para,
- DCU_HSYN_PARA_BP(fbinfo->var.left_margin) |
- DCU_HSYN_PARA_PW(fbinfo->var.hsync_len) |
- DCU_HSYN_PARA_FP(fbinfo->var.right_margin));
-
- dcu_write32(&regs->vsyn_para,
- DCU_VSYN_PARA_BP(fbinfo->var.upper_margin) |
- DCU_VSYN_PARA_PW(fbinfo->var.vsync_len) |
- DCU_VSYN_PARA_FP(fbinfo->var.lower_margin));
-
- dcu_write32(&regs->synpol,
- DCU_SYN_POL_INV_PXCK_FALL |
- DCU_SYN_POL_NEG_REMAIN |
- DCU_SYN_POL_INV_VS_LOW |
- DCU_SYN_POL_INV_HS_LOW);
-
- dcu_write32(&regs->bgnd,
- DCU_BGND_R(0) | DCU_BGND_G(0) | DCU_BGND_B(0));
-
- dcu_write32(&regs->mode,
- DCU_MODE_BLEND_ITER(2) |
- DCU_MODE_RASTER_EN);
-
- dcu_write32(&regs->threshold,
- DCU_THRESHOLD_LS_BF_VS(0x3) |
- DCU_THRESHOLD_OUT_BUF_HIGH(0x78) |
- DCU_THRESHOLD_OUT_BUF_LOW(0));
-
- mode = dcu_read32(&regs->mode);
- dcu_write32(&regs->mode, mode | DCU_MODE_NORMAL);
-
- layer_ctrldesc_init(*fbinfo, 0, pixel_format);
-
- div = dcu_set_pixel_clock(fbinfo->var.pixclock);
- dcu_write32(&regs->div_ratio, (div - 1));
-
- dcu_write32(&regs->update_mode, DCU_UPDATE_MODE_READREG);
-
- return 0;
-}
-
-ulong board_get_usable_ram_top(ulong total_size)
-{
- return gd->ram_top - CONFIG_VIDEO_FSL_DCU_MAX_FB_SIZE_MB;
-}
-
-int fsl_probe_common(struct fb_info *fbinfo, unsigned int *win_x,
- unsigned int *win_y)
-{
- const char *options;
- unsigned int depth = 0, freq = 0;
-
- struct fb_videomode *fsl_dcu_mode_db = &fsl_dcu_mode_480_272;
-
- if (!video_get_video_mode(win_x, win_y, &depth, &freq,
- &options))
- return -EINVAL;
-
- /* Find the monitor port, which is a required option */
- if (!options)
- return -EINVAL;
-
- if (strncmp(options, "monitor=", 8) != 0)
- return -EINVAL;
-
- switch (RESOLUTION(*win_x, *win_y)) {
- case RESOLUTION(480, 272):
- fsl_dcu_mode_db = &fsl_dcu_mode_480_272;
- break;
- case RESOLUTION(640, 480):
- if (!strncmp(options, "monitor=hdmi", 12))
- fsl_dcu_mode_db = &fsl_dcu_cea_mode_640_480;
- else
- fsl_dcu_mode_db = &fsl_dcu_mode_640_480;
- break;
- case RESOLUTION(800, 480):
- fsl_dcu_mode_db = &fsl_dcu_mode_800_480;
- break;
- case RESOLUTION(1024, 600):
- fsl_dcu_mode_db = &fsl_dcu_mode_1024_600;
- break;
- default:
- printf("unsupported resolution %ux%u\n",
- *win_x, *win_y);
- }
-
- fbinfo->var.xres = fsl_dcu_mode_db->xres;
- fbinfo->var.yres = fsl_dcu_mode_db->yres;
- fbinfo->var.bits_per_pixel = 32;
- fbinfo->var.pixclock = fsl_dcu_mode_db->pixclock;
- fbinfo->var.left_margin = fsl_dcu_mode_db->left_margin;
- fbinfo->var.right_margin = fsl_dcu_mode_db->right_margin;
- fbinfo->var.upper_margin = fsl_dcu_mode_db->upper_margin;
- fbinfo->var.lower_margin = fsl_dcu_mode_db->lower_margin;
- fbinfo->var.hsync_len = fsl_dcu_mode_db->hsync_len;
- fbinfo->var.vsync_len = fsl_dcu_mode_db->vsync_len;
- fbinfo->var.sync = fsl_dcu_mode_db->sync;
- fbinfo->var.vmode = fsl_dcu_mode_db->vmode;
- fbinfo->fix.line_length = fbinfo->var.xres *
- fbinfo->var.bits_per_pixel / 8;
-
- return platform_dcu_init(fbinfo, *win_x, *win_y,
- options + 8, fsl_dcu_mode_db);
-}
-
-#ifndef CONFIG_DM_VIDEO
-static struct fb_info info;
-
-#if defined(CONFIG_OF_BOARD_SETUP)
-int fsl_dcu_fixedfb_setup(void *blob)
-{
- u64 start, size;
- int ret;
-
- start = gd->bd->bi_dram[0].start;
- size = gd->bd->bi_dram[0].size - info.screen_size;
-
- /*
- * Align size on section size (1 MiB).
- */
- size &= 0xfff00000;
- ret = fdt_fixup_memory_banks(blob, &start, &size, 1);
- if (ret) {
- eprintf("Cannot setup fb: Error reserving memory\n");
- return ret;
- }
-
- return 0;
-}
-#endif
-
-void *video_hw_init(void)
-{
- static GraphicDevice ctfb;
-
- if (fsl_probe_common(&info, &ctfb.winSizeX, &ctfb.winSizeY) < 0)
- return NULL;
-
- ctfb.frameAdrs = (unsigned int)info.screen_base;
- ctfb.plnSizeX = ctfb.winSizeX;
- ctfb.plnSizeY = ctfb.winSizeY;
-
- ctfb.gdfBytesPP = 4;
- ctfb.gdfIndex = GDF_32BIT_X888RGB;
-
- ctfb.memSize = info.screen_size;
-
- return &ctfb;
-}
-
-#else /* ifndef CONFIG_DM_VIDEO */
-
-static int fsl_dcu_video_probe(struct udevice *dev)
-{
- struct video_uc_plat *plat = dev_get_uclass_plat(dev);
- struct video_priv *uc_priv = dev_get_uclass_priv(dev);
- struct fb_info fbinfo = { 0 };
- unsigned int win_x;
- unsigned int win_y;
- u32 fb_start, fb_end;
- int ret = 0;
-
- fb_start = plat->base & ~(MMU_SECTION_SIZE - 1);
- fb_end = plat->base + plat->size;
- fb_end = ALIGN(fb_end, 1 << MMU_SECTION_SHIFT);
-
- fbinfo.screen_base = (char *)fb_start;
- fbinfo.screen_size = plat->size;
-
- ret = fsl_probe_common(&fbinfo, &win_x, &win_y);
- if (ret < 0)
- return ret;
-
- uc_priv->bpix = VIDEO_BPP32;
- uc_priv->xsize = win_x;
- uc_priv->ysize = win_y;
-
- /* Enable dcache for the frame buffer */
- mmu_set_region_dcache_behaviour(fb_start, fb_end - fb_start,
- DCACHE_WRITEBACK);
- video_set_flush_dcache(dev, true);
- return ret;
-}
-
-static int fsl_dcu_video_bind(struct udevice *dev)
-{
- struct video_uc_plat *plat = dev_get_uclass_plat(dev);
- unsigned int win_x;
- unsigned int win_y;
- unsigned int depth = 0, freq = 0;
- const char *options;
- int ret = 0;
-
- ret = video_get_video_mode(&win_x, &win_y, &depth, &freq, &options);
- if (ret < 0)
- return ret;
-
- plat->size = win_x * win_y * 32;
-
- return 0;
-}
-
-static const struct udevice_id fsl_dcu_video_ids[] = {
- { .compatible = "fsl,vf610-dcu" },
- { /* sentinel */ }
-};
-
-U_BOOT_DRIVER(fsl_dcu_video) = {
- .name = "fsl_dcu_video",
- .id = UCLASS_VIDEO,
- .of_match = fsl_dcu_video_ids,
- .bind = fsl_dcu_video_bind,
- .probe = fsl_dcu_video_probe,
- .flags = DM_FLAG_PRE_RELOC,
-};
-#endif /* ifndef CONFIG_DM_VIDEO */
diff --git a/drivers/video/fsl_diu_fb.c b/drivers/video/fsl_diu_fb.c
deleted file mode 100644
index 2c21e29..0000000
--- a/drivers/video/fsl_diu_fb.c
+++ /dev/null
@@ -1,416 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2007, 2010-2011 Freescale Semiconductor, Inc.
- * Authors: York Sun <yorksun@freescale.com>
- * Timur Tabi <timur@freescale.com>
- *
- * FSL DIU Framebuffer driver
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <asm/io.h>
-
-#include "videomodes.h"
-#include <video_fb.h>
-#include <fsl_diu_fb.h>
-#include <linux/list.h>
-#include <linux/fb.h>
-
-/* This setting is used for the ifm pdm360ng with PRIMEVIEW PM070WL3 */
-static struct fb_videomode fsl_diu_mode_800_480 = {
- .name = "800x480-60",
- .refresh = 60,
- .xres = 800,
- .yres = 480,
- .pixclock = 31250,
- .left_margin = 86,
- .right_margin = 42,
- .upper_margin = 33,
- .lower_margin = 10,
- .hsync_len = 128,
- .vsync_len = 2,
- .sync = 0,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-/* For the SHARP LQ084S3LG01, used on the P1022DS board */
-static struct fb_videomode fsl_diu_mode_800_600 = {
- .name = "800x600-60",
- .refresh = 60,
- .xres = 800,
- .yres = 600,
- .pixclock = 25000,
- .left_margin = 88,
- .right_margin = 40,
- .upper_margin = 23,
- .lower_margin = 1,
- .hsync_len = 128,
- .vsync_len = 4,
- .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-/*
- * These parameters give default parameters
- * for video output 1024x768,
- * FIXME - change timing to proper amounts
- * hsync 31.5kHz, vsync 60Hz
- */
-static struct fb_videomode fsl_diu_mode_1024_768 = {
- .name = "1024x768-60",
- .refresh = 60,
- .xres = 1024,
- .yres = 768,
- .pixclock = 15385,
- .left_margin = 160,
- .right_margin = 24,
- .upper_margin = 29,
- .lower_margin = 3,
- .hsync_len = 136,
- .vsync_len = 6,
- .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-static struct fb_videomode fsl_diu_mode_1280_1024 = {
- .name = "1280x1024-60",
- .refresh = 60,
- .xres = 1280,
- .yres = 1024,
- .pixclock = 9375,
- .left_margin = 38,
- .right_margin = 128,
- .upper_margin = 2,
- .lower_margin = 7,
- .hsync_len = 216,
- .vsync_len = 37,
- .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-static struct fb_videomode fsl_diu_mode_1280_720 = {
- .name = "1280x720-60",
- .refresh = 60,
- .xres = 1280,
- .yres = 720,
- .pixclock = 13426,
- .left_margin = 192,
- .right_margin = 64,
- .upper_margin = 22,
- .lower_margin = 1,
- .hsync_len = 136,
- .vsync_len = 3,
- .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-static struct fb_videomode fsl_diu_mode_1920_1080 = {
- .name = "1920x1080-60",
- .refresh = 60,
- .xres = 1920,
- .yres = 1080,
- .pixclock = 5787,
- .left_margin = 328,
- .right_margin = 120,
- .upper_margin = 34,
- .lower_margin = 1,
- .hsync_len = 208,
- .vsync_len = 3,
- .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
- .vmode = FB_VMODE_NONINTERLACED
-};
-
-/*
- * These are the fields of area descriptor(in DDR memory) for every plane
- */
-struct diu_ad {
- /* Word 0(32-bit) in DDR memory */
- __le32 pix_fmt; /* hard coding pixel format */
- /* Word 1(32-bit) in DDR memory */
- __le32 addr;
- /* Word 2(32-bit) in DDR memory */
- __le32 src_size_g_alpha;
- /* Word 3(32-bit) in DDR memory */
- __le32 aoi_size;
- /* Word 4(32-bit) in DDR memory */
- __le32 offset_xyi;
- /* Word 5(32-bit) in DDR memory */
- __le32 offset_xyd;
- /* Word 6(32-bit) in DDR memory */
- __le32 ckmax_r:8;
- __le32 ckmax_g:8;
- __le32 ckmax_b:8;
- __le32 res9:8;
- /* Word 7(32-bit) in DDR memory */
- __le32 ckmin_r:8;
- __le32 ckmin_g:8;
- __le32 ckmin_b:8;
- __le32 res10:8;
- /* Word 8(32-bit) in DDR memory */
- __le32 next_ad;
- /* Word 9(32-bit) in DDR memory, just for 64-bit aligned */
- __le32 res[3];
-} __attribute__ ((packed));
-
-/*
- * DIU register map
- */
-struct diu {
- __be32 desc[3];
- __be32 gamma;
- __be32 pallete;
- __be32 cursor;
- __be32 curs_pos;
- __be32 diu_mode;
- __be32 bgnd;
- __be32 bgnd_wb;
- __be32 disp_size;
- __be32 wb_size;
- __be32 wb_mem_addr;
- __be32 hsyn_para;
- __be32 vsyn_para;
- __be32 syn_pol;
- __be32 thresholds;
- __be32 int_status;
- __be32 int_mask;
- __be32 colorbar[8];
- __be32 filling;
- __be32 plut;
-} __attribute__ ((packed));
-
-struct diu_addr {
- void *vaddr; /* Virtual address */
- u32 paddr; /* 32-bit physical address */
- unsigned int offset; /* Alignment offset */
-};
-
-static struct fb_info info;
-
-/*
- * Align to 64-bit(8-byte), 32-byte, etc.
- */
-static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align)
-{
- u32 offset, ssize;
- u32 mask;
-
- ssize = size + bytes_align;
- buf->vaddr = malloc(ssize);
- if (!buf->vaddr)
- return -1;
-
- memset(buf->vaddr, 0, ssize);
- mask = bytes_align - 1;
- offset = (u32)buf->vaddr & mask;
- if (offset) {
- buf->offset = bytes_align - offset;
- buf->vaddr += offset;
- } else
- buf->offset = 0;
-
- buf->paddr = virt_to_phys(buf->vaddr);
- return 0;
-}
-
-/*
- * Allocate a framebuffer and an Area Descriptor that points to it. Both
- * are created in the same memory block. The Area Descriptor is updated to
- * point to the framebuffer memory. Memory is aligned as needed.
- */
-static struct diu_ad *allocate_fb(unsigned int xres, unsigned int yres,
- unsigned int depth, char **fb)
-{
- unsigned long size = xres * yres * depth;
- struct diu_addr addr;
- struct diu_ad *ad;
- size_t ad_size = roundup(sizeof(struct diu_ad), 32);
-
- /*
- * Allocate a memory block that holds the Area Descriptor and the
- * frame buffer right behind it. To keep the code simple, everything
- * is aligned on a 32-byte address.
- */
- if (allocate_buf(&addr, ad_size + size, 32) < 0)
- return NULL;
-
- ad = addr.vaddr;
- ad->addr = cpu_to_le32(addr.paddr + ad_size);
- ad->aoi_size = cpu_to_le32((yres << 16) | xres);
- ad->src_size_g_alpha = cpu_to_le32((yres << 12) | xres);
- ad->offset_xyi = 0;
- ad->offset_xyd = 0;
-
- if (fb)
- *fb = addr.vaddr + ad_size;
-
- return ad;
-}
-
-int fsl_diu_init(u16 xres, u16 yres, u32 pixel_format, int gamma_fix)
-{
- struct fb_videomode *fsl_diu_mode_db;
- struct diu_ad *ad;
- struct diu *hw = (struct diu *)CONFIG_SYS_DIU_ADDR;
- u8 *gamma_table_base;
- unsigned int i, j;
- struct diu_addr gamma;
- struct diu_addr cursor;
-
-/* Convert the X,Y resolution pair into a single number */
-#define RESOLUTION(x, y) (((u32)(x) << 16) | (y))
-
- switch (RESOLUTION(xres, yres)) {
- case RESOLUTION(800, 480):
- fsl_diu_mode_db = &fsl_diu_mode_800_480;
- break;
- case RESOLUTION(800, 600):
- fsl_diu_mode_db = &fsl_diu_mode_800_600;
- break;
- case RESOLUTION(1024, 768):
- fsl_diu_mode_db = &fsl_diu_mode_1024_768;
- break;
- case RESOLUTION(1280, 1024):
- fsl_diu_mode_db = &fsl_diu_mode_1280_1024;
- break;
- case RESOLUTION(1280, 720):
- fsl_diu_mode_db = &fsl_diu_mode_1280_720;
- break;
- case RESOLUTION(1920, 1080):
- fsl_diu_mode_db = &fsl_diu_mode_1920_1080;
- break;
- default:
- printf("DIU: Unsupported resolution %ux%u\n", xres, yres);
- return -1;
- }
-
- /* read mode info */
- info.var.xres = fsl_diu_mode_db->xres;
- info.var.yres = fsl_diu_mode_db->yres;
- info.var.bits_per_pixel = 32;
- info.var.pixclock = fsl_diu_mode_db->pixclock;
- info.var.left_margin = fsl_diu_mode_db->left_margin;
- info.var.right_margin = fsl_diu_mode_db->right_margin;
- info.var.upper_margin = fsl_diu_mode_db->upper_margin;
- info.var.lower_margin = fsl_diu_mode_db->lower_margin;
- info.var.hsync_len = fsl_diu_mode_db->hsync_len;
- info.var.vsync_len = fsl_diu_mode_db->vsync_len;
- info.var.sync = fsl_diu_mode_db->sync;
- info.var.vmode = fsl_diu_mode_db->vmode;
- info.fix.line_length = info.var.xres * info.var.bits_per_pixel / 8;
-
- /* Memory allocation for framebuffer */
- info.screen_size =
- info.var.xres * info.var.yres * (info.var.bits_per_pixel / 8);
- ad = allocate_fb(info.var.xres, info.var.yres,
- info.var.bits_per_pixel / 8, &info.screen_base);
- if (!ad) {
- printf("DIU: Out of memory\n");
- return -1;
- }
-
- ad->pix_fmt = pixel_format;
-
- /* Disable chroma keying function */
- ad->ckmax_r = 0;
- ad->ckmax_g = 0;
- ad->ckmax_b = 0;
-
- ad->ckmin_r = 255;
- ad->ckmin_g = 255;
- ad->ckmin_b = 255;
-
- /* Initialize the gamma table */
- if (allocate_buf(&gamma, 256 * 3, 32) < 0) {
- printf("DIU: Out of memory\n");
- return -1;
- }
- gamma_table_base = gamma.vaddr;
- for (i = 0; i <= 2; i++)
- for (j = 0; j < 256; j++)
- *gamma_table_base++ = j;
-
- if (gamma_fix == 1) { /* fix the gamma */
- gamma_table_base = gamma.vaddr;
- for (i = 0; i < 256 * 3; i++) {
- gamma_table_base[i] = (gamma_table_base[i] << 2)
- | ((gamma_table_base[i] >> 6) & 0x03);
- }
- }
-
- /* Initialize the cursor */
- if (allocate_buf(&cursor, 32 * 32 * 2, 32) < 0) {
- printf("DIU: Can't alloc cursor data\n");
- return -1;
- }
-
- /* Program DIU registers */
- out_be32(&hw->diu_mode, 0); /* Temporarily disable the DIU */
-
- out_be32(&hw->gamma, gamma.paddr);
- out_be32(&hw->cursor, cursor.paddr);
- out_be32(&hw->bgnd, 0x007F7F7F);
- out_be32(&hw->disp_size, info.var.yres << 16 | info.var.xres);
- out_be32(&hw->hsyn_para, info.var.left_margin << 22 |
- info.var.hsync_len << 11 |
- info.var.right_margin);
-
- out_be32(&hw->vsyn_para, info.var.upper_margin << 22 |
- info.var.vsync_len << 11 |
- info.var.lower_margin);
-
- /* Pixel Clock configuration */
- diu_set_pixel_clock(info.var.pixclock);
-
- /* Set the frame buffers */
- out_be32(&hw->desc[0], virt_to_phys(ad));
- out_be32(&hw->desc[1], 0);
- out_be32(&hw->desc[2], 0);
-
- /* Enable the DIU, set display to all three planes */
- out_be32(&hw->diu_mode, 1);
-
- return 0;
-}
-
-void *video_hw_init(void)
-{
- static GraphicDevice ctfb;
- const char *options;
- unsigned int depth = 0, freq = 0;
-
- if (!video_get_video_mode(&ctfb.winSizeX, &ctfb.winSizeY, &depth, &freq,
- &options))
- return NULL;
-
- /* Find the monitor port, which is a required option */
- if (!options)
- return NULL;
- if (strncmp(options, "monitor=", 8) != 0)
- return NULL;
-
- if (platform_diu_init(ctfb.winSizeX, ctfb.winSizeY, options + 8) < 0)
- return NULL;
-
- /* fill in Graphic device struct */
- sprintf(ctfb.modeIdent, "%ix%ix%i %ikHz %iHz",
- ctfb.winSizeX, ctfb.winSizeY, depth, 64, freq);
-
- ctfb.frameAdrs = (unsigned int)info.screen_base;
- ctfb.plnSizeX = ctfb.winSizeX;
- ctfb.plnSizeY = ctfb.winSizeY;
-
- ctfb.gdfBytesPP = 4;
- ctfb.gdfIndex = GDF_32BIT_X888RGB;
-
- ctfb.isaBase = 0;
- ctfb.pciBase = 0;
- ctfb.memSize = info.screen_size;
-
- /* Cursor Start Address */
- ctfb.dprBase = 0;
- ctfb.vprBase = 0;
- ctfb.cprBase = 0;
-
- return &ctfb;
-}
diff --git a/drivers/video/imx/mxc_ipuv3_fb.c b/drivers/video/imx/mxc_ipuv3_fb.c
index 98228f2..49bbeef 100644
--- a/drivers/video/imx/mxc_ipuv3_fb.c
+++ b/drivers/video/imx/mxc_ipuv3_fb.c
@@ -22,7 +22,6 @@
#include <asm/io.h>
#include <asm/mach-imx/video.h>
#include <malloc.h>
-#include <video_fb.h>
#include "../videomodes.h"
#include "ipu.h"
#include "mxcfb.h"
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c
index 5f85c0c..1043394 100644
--- a/drivers/video/mxsfb.c
+++ b/drivers/video/mxsfb.c
@@ -15,7 +15,6 @@
#include <linux/errno.h>
#include <malloc.h>
#include <video.h>
-#include <video_fb.h>
#include <asm/arch/clock.h>
#include <asm/arch/imx-regs.h>
@@ -253,94 +252,6 @@ static int mxs_remove_common(u32 fb)
return 0;
}
-#ifndef CONFIG_DM_VIDEO
-
-static GraphicDevice panel;
-
-void lcdif_power_down(void)
-{
- mxs_remove_common(panel.frameAdrs);
-}
-
-void *video_hw_init(void)
-{
- int bpp = -1;
- int ret = 0;
- char *penv;
- void *fb = NULL;
- struct ctfb_res_modes mode;
- struct display_timing timings;
-
- puts("Video: ");
-
- /* Suck display configuration from "videomode" variable */
- penv = env_get("videomode");
- if (!penv) {
- puts("MXSFB: 'videomode' variable not set!\n");
- return NULL;
- }
-
- bpp = video_get_params(&mode, penv);
-
- /* fill in Graphic device struct */
- sprintf(panel.modeIdent, "%dx%dx%d", mode.xres, mode.yres, bpp);
-
- panel.winSizeX = mode.xres;
- panel.winSizeY = mode.yres;
- panel.plnSizeX = mode.xres;
- panel.plnSizeY = mode.yres;
-
- switch (bpp) {
- case 24:
- case 18:
- panel.gdfBytesPP = 4;
- panel.gdfIndex = GDF_32BIT_X888RGB;
- break;
- case 16:
- panel.gdfBytesPP = 2;
- panel.gdfIndex = GDF_16BIT_565RGB;
- break;
- case 8:
- panel.gdfBytesPP = 1;
- panel.gdfIndex = GDF__8BIT_INDEX;
- break;
- default:
- printf("MXSFB: Invalid BPP specified! (bpp = %i)\n", bpp);
- return NULL;
- }
-
- panel.memSize = mode.xres * mode.yres * panel.gdfBytesPP;
-
- /* Allocate framebuffer */
- fb = memalign(ARCH_DMA_MINALIGN,
- roundup(panel.memSize, ARCH_DMA_MINALIGN));
- if (!fb) {
- printf("MXSFB: Error allocating framebuffer!\n");
- return NULL;
- }
-
- /* Wipe framebuffer */
- memset(fb, 0, panel.memSize);
-
- panel.frameAdrs = (u32)fb;
-
- printf("%s\n", panel.modeIdent);
-
- video_ctfb_mode_to_display_timing(&mode, &timings);
-
- ret = mxs_probe_common(NULL, &timings, bpp, (u32)fb);
- if (ret)
- goto dealloc_fb;
-
- return (void *)&panel;
-
-dealloc_fb:
- free(fb);
-
- return NULL;
-}
-#else /* ifndef CONFIG_DM_VIDEO */
-
static int mxs_of_get_timings(struct udevice *dev,
struct display_timing *timings,
u32 *bpp)
@@ -490,4 +401,3 @@ U_BOOT_DRIVER(mxs_video) = {
.remove = mxs_video_remove,
.flags = DM_FLAG_PRE_RELOC | DM_FLAG_OS_PREPARE,
};
-#endif /* ifndef CONFIG_DM_VIDEO */
diff --git a/drivers/video/nexell_display.c b/drivers/video/nexell_display.c
index c7621ef..090fd6e 100644
--- a/drivers/video/nexell_display.c
+++ b/drivers/video/nexell_display.c
@@ -16,7 +16,6 @@
#include <linux/compat.h>
#include <linux/err.h>
#include <video.h> /* For struct video_uc_plat */
-#include <video_fb.h>
#include <lcd.h>
#include <asm/global_data.h>
#include <asm/io.h>
@@ -537,7 +536,6 @@ static int nx_display_probe(struct udevice *dev)
struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
struct video_priv *uc_priv = dev_get_uclass_priv(dev);
struct nx_display_plat *plat = dev_get_plat(dev);
- static GraphicDevice *graphic_device;
char addr[64];
debug("%s()\n", __func__);
@@ -564,7 +562,6 @@ static int nx_display_probe(struct udevice *dev)
}
struct nx_display_dev *dp;
- unsigned int pp_index = 0;
dp = nx_display_setup();
if (!dp) {
@@ -575,7 +572,6 @@ static int nx_display_probe(struct udevice *dev)
switch (dp->depth) {
case 2:
- pp_index = GDF_16BIT_565RGB;
uc_priv->bpix = VIDEO_BPP16;
break;
case 3:
@@ -583,7 +579,6 @@ static int nx_display_probe(struct udevice *dev)
* type video_log2_bpp
*/
case 4:
- pp_index = GDF_32BIT_X888RGB;
uc_priv->bpix = VIDEO_BPP32;
break;
default:
@@ -596,19 +591,9 @@ static int nx_display_probe(struct udevice *dev)
uc_priv->ysize = dp->fb_plane->height;
uc_priv->rot = 0;
- graphic_device = &dp->graphic_device;
- graphic_device->frameAdrs = dp->fb_addr;
- graphic_device->gdfIndex = pp_index;
- graphic_device->gdfBytesPP = dp->depth;
- graphic_device->winSizeX = dp->fb_plane->width;
- graphic_device->winSizeY = dp->fb_plane->height;
- graphic_device->plnSizeX =
- graphic_device->winSizeX * graphic_device->gdfBytesPP;
-
/*
* set environment variable "fb_addr" (frame buffer address), required
- * for splash image. Because drv_video_init() in common/stdio.c is only
- * called when CONFIG_VIDEO is set (and not if CONFIG_DM_VIDEO is set).
+ * for splash image, which is not set if CONFIG_DM_VIDEO is enabled).
*/
sprintf(addr, "0x%x", dp->fb_addr);
debug("%s(): env_set(\"fb_addr\", %s) ...\n", __func__, addr);
diff --git a/drivers/video/omap3_dss.c b/drivers/video/omap3_dss.c
index 6efba12..432b16b 100644
--- a/drivers/video/omap3_dss.c
+++ b/drivers/video/omap3_dss.c
@@ -28,7 +28,6 @@
#include <common.h>
#include <asm/io.h>
#include <asm/arch/dss.h>
-#include <video_fb.h>
/* Configure VENC for a given Mode (NTSC / PAL) */
void omap3_dss_venc_config(const struct venc_regs *venc_cfg,
@@ -137,31 +136,3 @@ void omap3_dss_enable(void)
l |= LCD_ENABLE | GO_LCD | DIG_ENABLE | GO_DIG | GP_OUT0 | GP_OUT1;
writel(l, &dispc->control);
}
-
-#ifdef CONFIG_CFB_CONSOLE
-int __board_video_init(void)
-{
- return -1;
-}
-
-int board_video_init(void)
- __attribute__((weak, alias("__board_video_init")));
-
-void *video_hw_init(void)
-{
- static GraphicDevice dssfb;
- GraphicDevice *pGD = &dssfb;
- struct dispc_regs *dispc = (struct dispc_regs *) OMAP3_DISPC_BASE;
-
- if (board_video_init() || !readl(&dispc->gfx_ba0))
- return NULL;
-
- pGD->winSizeX = (readl(&dispc->size_lcd) & 0x7FF) + 1;
- pGD->winSizeY = ((readl(&dispc->size_lcd) >> 16) & 0x7FF) + 1;
- pGD->gdfBytesPP = 4;
- pGD->gdfIndex = GDF_32BIT_X888RGB;
- pGD->frameAdrs = readl(&dispc->gfx_ba0);
-
- return pGD;
-}
-#endif
diff --git a/drivers/video/sunxi/sunxi_display.c b/drivers/video/sunxi/sunxi_display.c
index 5a21f7a..2ee6212 100644
--- a/drivers/video/sunxi/sunxi_display.c
+++ b/drivers/video/sunxi/sunxi_display.c
@@ -30,7 +30,6 @@
#include <i2c.h>
#include <malloc.h>
#include <video.h>
-#include <video_fb.h>
#include <dm/uclass-internal.h>
#include "../videomodes.h"
#include "../anx9804.h"