Commit d0f34f10 authored by Anatolij Gustschin's avatar Anatolij Gustschin
Browse files

Merge branch 'for-v2013.04'



Conflicts:
	drivers/video/Makefile
Signed-off-by: default avatarAnatolij Gustschin <agust@denx.de>
parents 009d75cc acf3baad
......@@ -45,8 +45,8 @@ int display_get_info(int type, struct display_info *di)
case DISPLAY_TYPE_LCD:
di->pixel_width = panel_info.vl_col;
di->pixel_height = panel_info.vl_row;
di->screen_rows = CONSOLE_ROWS;
di->screen_cols = CONSOLE_COLS;
di->screen_rows = lcd_get_screen_rows();
di->screen_cols = lcd_get_screen_columns();
break;
#endif
}
......
......@@ -33,7 +33,6 @@ COBJS-$(CONFIG_CPU_PXA27X) = pxa2xx.o
COBJS-y += cpuinfo.o
COBJS = $(COBJS-y)
COBJS += pxafb.o
COBJS += timer.o
COBJS += usb.o
......
......@@ -37,7 +37,6 @@ COBJS-y += fec.o
COBJS-$(CONFIG_OF_LIBFDT) += fdt.o
COBJS-y += i2c.o
COBJS-y += interrupts.o
COBJS-y += lcd.o
COBJS-y += scc.o
COBJS-y += serial.o
COBJS-y += speed.o
......
......@@ -381,14 +381,6 @@ static enum display_type env_parse_displaytype(char *displaytype)
return NONE;
}
int lcd_line_length;
int lcd_color_fg;
int lcd_color_bg;
void *lcd_base;
short console_col;
short console_row;
void *lcd_console_address;
void lcd_ctrl_init(void *lcdbase)
{
struct prcm *prcm = (struct prcm *)PRCM_BASE;
......
......@@ -68,32 +68,12 @@ vidinfo_t panel_info = {
LCD_WIDTH, LCD_HEIGHT, LCD_BPP
};
int lcd_line_length;
int lcd_color_fg;
int lcd_color_bg;
/*
* Frame buffer memory information
*/
void *lcd_base; /* Start of framebuffer memory */
void *lcd_console_address; /* Start of console buffer */
short console_col = 0;
short console_row = 0;
/*
* The device we use to communicate with PSoC
*/
int serial_inited = 0;
/*
* Exported functions
*/
void lcd_initcolregs (void);
void lcd_ctrl_init (void *lcdbase);
void lcd_enable (void);
/*
* Imported functions to support the PSoC protocol
*/
......@@ -156,12 +136,12 @@ void lcd_enable (void)
#if !defined(SWAPPED_LCD)
for (i=0; i<fb_size; i++) {
serial_putc_raw_dev (PSOC_PSC, ((char *)lcd_base)[i]);
serial_putc_raw_dev(PSOC_PSC, ((char *)gd->fb_base)[i]);
}
#else
{
int x, y, pwidth;
char *p = (char *)lcd_base;
char *p = (char *)gd->fb_base;
pwidth = ((panel_info.vl_col+7) >> 3);
for (y=0; y<panel_info.vl_row; y++) {
......
......@@ -83,9 +83,35 @@
#define CONFIG_CONSOLE_SCROLL_LINES 1
#endif
DECLARE_GLOBAL_DATA_PTR;
/************************************************************************/
/* ** CONSOLE DEFINITIONS & FUNCTIONS */
/************************************************************************/
#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
# define CONSOLE_ROWS ((panel_info.vl_row-BMP_LOGO_HEIGHT) \
/ VIDEO_FONT_HEIGHT)
#else
# define CONSOLE_ROWS (panel_info.vl_row / VIDEO_FONT_HEIGHT)
#endif
#define CONSOLE_COLS (panel_info.vl_col / VIDEO_FONT_WIDTH)
#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * lcd_line_length)
#define CONSOLE_ROW_FIRST lcd_console_address
#define CONSOLE_ROW_SECOND (lcd_console_address + CONSOLE_ROW_SIZE)
#define CONSOLE_ROW_LAST (lcd_console_address + CONSOLE_SIZE \
- CONSOLE_ROW_SIZE)
#define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS)
#define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE)
ulong lcd_setmem (ulong addr);
#if LCD_BPP == LCD_MONOCHROME
# define COLOR_MASK(c) ((c) | (c) << 1 | (c) << 2 | (c) << 3 | \
(c) << 4 | (c) << 5 | (c) << 6 | (c) << 7)
#elif (LCD_BPP == LCD_COLOR8) || (LCD_BPP == LCD_COLOR16)
# define COLOR_MASK(c) (c)
#else
# error Unsupported LCD BPP.
#endif
DECLARE_GLOBAL_DATA_PTR;
static void lcd_drawchars(ushort x, ushort y, uchar *str, int count);
static inline void lcd_puts_xy(ushort x, ushort y, uchar *s);
......@@ -93,22 +119,25 @@ static inline void lcd_putc_xy(ushort x, ushort y, uchar c);
static int lcd_init(void *lcdbase);
static void *lcd_logo (void);
static void *lcd_logo(void);
static int lcd_getbgcolor(void);
static void lcd_setfgcolor(int color);
static void lcd_setbgcolor(int color);
static int lcd_color_fg;
static int lcd_color_bg;
int lcd_line_length;
char lcd_is_enabled = 0;
static char lcd_flush_dcache; /* 1 to flush dcache after each lcd update */
static short console_col;
static short console_row;
static void *lcd_console_address;
static void *lcd_base; /* Start of framebuffer memory */
#ifdef NOT_USED_SO_FAR
static void lcd_getcolreg(ushort regno,
ushort *red, ushort *green, ushort *blue);
static int lcd_getfgcolor(void);
#endif /* NOT_USED_SO_FAR */
static char lcd_flush_dcache; /* 1 to flush dcache after each lcd update */
/************************************************************************/
......@@ -148,7 +177,7 @@ static void console_scrollup(void)
/* Clear the last rows */
memset(lcd_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows,
COLOR_MASK(lcd_color_bg),
CONSOLE_ROW_SIZE * rows);
CONSOLE_ROW_SIZE * rows);
lcd_sync();
console_row -= rows;
......@@ -160,9 +189,8 @@ static inline void console_back(void)
{
if (--console_col < 0) {
console_col = CONSOLE_COLS-1 ;
if (--console_row < 0) {
if (--console_row < 0)
console_row = 0;
}
}
lcd_putc_xy(console_col * VIDEO_FONT_WIDTH,
......@@ -173,16 +201,13 @@ static inline void console_back(void)
static inline void console_newline(void)
{
++console_row;
console_col = 0;
/* Check if we need to scroll the terminal */
if (console_row >= CONSOLE_ROWS) {
/* Scroll everything up */
if (++console_row >= CONSOLE_ROWS)
console_scrollup();
} else {
else
lcd_sync();
}
}
/*----------------------------------------------------------------------*/
......@@ -234,9 +259,9 @@ void lcd_puts(const char *s)
return;
}
while (*s) {
while (*s)
lcd_putc(*s++);
}
lcd_sync();
}
......@@ -283,7 +308,7 @@ static void lcd_drawchars(ushort x, ushort y, uchar *str, int count)
#endif
#if LCD_BPP == LCD_MONOCHROME
uchar rest = *d & -(1 << (8-off));
uchar rest = *d & -(1 << (8 - off));
uchar sym;
#endif
for (i = 0; i < count; ++i) {
......@@ -313,7 +338,7 @@ static void lcd_drawchars(ushort x, ushort y, uchar *str, int count)
#endif
}
#if LCD_BPP == LCD_MONOCHROME
*d = rest | (*d & ((1 << (8-off)) - 1));
*d = rest | (*d & ((1 << (8 - off)) - 1));
#endif
}
}
......@@ -340,7 +365,7 @@ static inline void lcd_putc_xy(ushort x, ushort y, uchar c)
#define N_BLK_VERT 2
#define N_BLK_HOR 3
static int test_colors[N_BLK_HOR*N_BLK_VERT] = {
static int test_colors[N_BLK_HOR * N_BLK_VERT] = {
CONSOLE_COLOR_RED, CONSOLE_COLOR_GREEN, CONSOLE_COLOR_YELLOW,
CONSOLE_COLOR_BLUE, CONSOLE_COLOR_MAGENTA, CONSOLE_COLOR_CYAN,
};
......@@ -361,7 +386,7 @@ static void test_pattern(void)
for (v = 0; v < v_max; ++v) {
uchar iy = v / v_step;
for (h = 0; h < h_max; ++h) {
uchar ix = N_BLK_HOR * iy + (h/h_step);
uchar ix = N_BLK_HOR * iy + h / h_step;
*pix++ = test_colors[ix];
}
}
......@@ -379,12 +404,12 @@ int lcd_get_size(int *line_length)
return *line_length * panel_info.vl_row;
}
int drv_lcd_init (void)
int drv_lcd_init(void)
{
struct stdio_dev lcddev;
int rc;
lcd_base = (void *)(gd->fb_base);
lcd_base = (void *) gd->fb_base;
lcd_init(lcd_base); /* LCD initialization */
......@@ -397,7 +422,7 @@ int drv_lcd_init (void)
lcddev.putc = lcd_putc; /* 'putc' function */
lcddev.puts = lcd_puts; /* 'puts' function */
rc = stdio_register (&lcddev);
rc = stdio_register(&lcddev);
return (rc == 0) ? 1 : rc;
}
......@@ -436,11 +461,11 @@ void lcd_clear(void)
/* set framebuffer to background color */
memset((char *)lcd_base,
COLOR_MASK(lcd_getbgcolor()),
lcd_line_length*panel_info.vl_row);
lcd_line_length * panel_info.vl_row);
#endif
/* Paint the logo and retrieve LCD base address */
debug("[LCD] Drawing the logo...\n");
lcd_console_address = lcd_logo ();
lcd_console_address = lcd_logo();
console_col = 0;
console_row = 0;
......@@ -472,7 +497,7 @@ static int lcd_init(void *lcdbase)
lcd_line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8;
lcd_is_enabled = 1;
lcd_clear();
lcd_enable ();
lcd_enable();
/* Initialize the console */
console_col = 0;
......@@ -513,7 +538,8 @@ ulong lcd_setmem(ulong addr)
/* Allocate pages for the frame buffer. */
addr -= size;
debug("Reserving %ldk for LCD Framebuffer at: %08lx\n", size>>10, addr);
debug("Reserving %ldk for LCD Framebuffer at: %08lx\n",
size >> 10, addr);
return addr;
}
......@@ -534,12 +560,10 @@ static void lcd_setbgcolor(int color)
/*----------------------------------------------------------------------*/
#ifdef NOT_USED_SO_FAR
static int lcd_getfgcolor(void)
int lcd_getfgcolor(void)
{
return lcd_color_fg;
}
#endif /* NOT_USED_SO_FAR */
/*----------------------------------------------------------------------*/
......@@ -548,8 +572,6 @@ static int lcd_getbgcolor(void)
return lcd_color_bg;
}
/*----------------------------------------------------------------------*/
/************************************************************************/
/* ** Chipset depending Bitmap / Logo stuff... */
/************************************************************************/
......@@ -566,13 +588,11 @@ static inline ushort *configuration_get_cmap(void)
return (ushort *)(panel_info.mmio + ATMEL_LCDC_LUT(0));
#elif !defined(CONFIG_ATMEL_HLCD) && !defined(CONFIG_EXYNOS_FB)
return panel_info.cmap;
#else
#if defined(CONFIG_LCD_LOGO)
#elif defined(CONFIG_LCD_LOGO)
return bmp_logo_palette;
#else
return NULL;
#endif
#endif
}
#ifdef CONFIG_LCD_LOGO
......@@ -591,15 +611,16 @@ void bitmap_plot(int x, int y)
immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
cpm8xx_t *cp = &(immr->im_cpm);
#endif
unsigned bpix = NBITS(panel_info.vl_bpix);
debug("Logo: width %d height %d colors %d cmap %d\n",
BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, BMP_LOGO_COLORS,
ARRAY_SIZE(bmp_logo_palette));
bmap = &bmp_logo_bitmap[0];
fb = (uchar *)(lcd_base + y * lcd_line_length + x);
fb = (uchar *)(lcd_base + y * lcd_line_length + x * bpix / 8);
if (NBITS(panel_info.vl_bpix) < 12) {
if (bpix < 12) {
/* Leave room for default color map
* default case: generic system with no cmap (most likely 16bpp)
* cmap was set to the source palette, so no change is done.
......@@ -645,12 +666,12 @@ void bitmap_plot(int x, int y)
for (i = 0; i < BMP_LOGO_HEIGHT; ++i) {
memcpy(fb, bmap, BMP_LOGO_WIDTH);
bmap += BMP_LOGO_WIDTH;
fb += panel_info.vl_col;
fb += panel_info.vl_col;
}
}
else { /* true color mode */
u16 col16;
fb16 = (ushort *)(lcd_base + y * lcd_line_length + x);
fb16 = (ushort *)fb;
for (i = 0; i < BMP_LOGO_HEIGHT; ++i) {
for (j = 0; j < BMP_LOGO_WIDTH; j++) {
col16 = bmp_logo_palette[(bmap[j]-16)];
......@@ -736,12 +757,11 @@ static void draw_encoded_bitmap(ushort **fbp, ushort c, int cnt)
*fb++ = c;
cnt--;
}
(*fbp) = fb;
*fbp = fb;
}
/*
* Do not call this function directly, must be called from
* lcd_display_bitmap.
* Do not call this function directly, must be called from lcd_display_bitmap.
*/
static void lcd_display_rle8_bitmap(bmp_image_t *bmp, ushort *cmap, uchar *fb,
int x_off, int y_off)
......@@ -868,8 +888,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
unsigned long pwidth = panel_info.vl_col;
unsigned colors, bpix, bmp_bpix;
if (!bmp || !((bmp->header.signature[0] == 'B') &&
(bmp->header.signature[1] == 'M'))) {
if (!bmp || !(bmp->header.signature[0] == 'B' &&
bmp->header.signature[1] == 'M')) {
printf("Error: no valid bmp image at %lx\n", bmp_image);
return 1;
......@@ -882,7 +902,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
bpix = NBITS(panel_info.vl_bpix);
if ((bpix != 1) && (bpix != 8) && (bpix != 16) && (bpix != 32)) {
if (bpix != 1 && bpix != 8 && bpix != 16 && bpix != 32) {
printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
bpix, bmp_bpix);
......@@ -950,7 +970,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
}
#endif
padded_width = (width&0x3) ? ((width&~0x3)+4) : (width);
padded_width = (width & 0x3 ? (width & ~0x3) + 4 : width);
#ifdef CONFIG_SPLASH_SCREEN_ALIGN
splash_align_axis(&x, pwidth, width);
......@@ -962,7 +982,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
if ((y + height) > panel_info.vl_row)
height = panel_info.vl_row - y;
bmap = (uchar *)bmp + le32_to_cpu(bmp->header.data_offset);
bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset);
fb = (uchar *) (lcd_base +
(y + height - 1) * lcd_line_length + x * bpix / 8);
......@@ -997,7 +1017,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
}
}
bmap += (padded_width - width);
fb -= (byte_width + lcd_line_length);
fb -= byte_width + lcd_line_length;
}
break;
......@@ -1009,7 +1029,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
fb_put_word(&fb, &bmap);
bmap += (padded_width - width) * 2;
fb -= (width * 2 + lcd_line_length);
fb -= width * 2 + lcd_line_length;
}
break;
#endif /* CONFIG_BMP_16BPP */
......@@ -1023,7 +1043,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
*(fb++) = *(bmap++);
*(fb++) = *(bmap++);
}
fb -= (lcd_line_length + width * (bpix / 8));
fb -= lcd_line_length + width * (bpix / 8);
}
break;
#endif /* CONFIG_BMP_32BPP */
......@@ -1098,7 +1118,7 @@ static void *lcd_logo(void)
return (void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length);
#else
return (void *)lcd_base;
#endif /* CONFIG_LCD_LOGO && !CONFIG_LCD_INFO_BELOW_LOGO */
#endif /* CONFIG_LCD_LOGO && !defined(CONFIG_LCD_INFO_BELOW_LOGO) */
}
#ifdef CONFIG_SPLASHIMAGE_GUARD
......@@ -1150,6 +1170,3 @@ int lcd_get_screen_columns(void)
{
return CONSOLE_COLS;
}
/************************************************************************/
/************************************************************************/
......@@ -35,11 +35,12 @@ COBJS-$(CONFIG_EXYNOS_MIPI_DSIM) += exynos_mipi_dsi.o exynos_mipi_dsi_common.o \
exynos_mipi_dsi_lowlevel.o
COBJS-$(CONFIG_EXYNOS_PWM_BL) += exynos_pwm_bl.o
COBJS-$(CONFIG_FSL_DIU_FB) += fsl_diu_fb.o videomodes.o
COBJS-$(CONFIG_MPC8XX_LCD) += mpc8xx_lcd.o
COBJS-$(CONFIG_PXA_LCD) += pxa_lcd.o
COBJS-$(CONFIG_S6E8AX0) += s6e8ax0.o
COBJS-$(CONFIG_S6E63D6) += s6e63d6.o
COBJS-$(CONFIG_LD9040) += ld9040.o
COBJS-$(CONFIG_SED156X) += sed156x.o
COBJS-$(CONFIG_VIDEO_AMBA) += amba.o
COBJS-$(CONFIG_VIDEO_BCM2835) += bcm2835.o
COBJS-$(CONFIG_VIDEO_COREBOOT) += coreboot_fb.o
COBJS-$(CONFIG_VIDEO_CT69000) += ct69000.o videomodes.o
......
/*
* Driver for AMBA PrimeCell CLCD
*
* Copyright (C) 2009 Alessandro Rubini
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/io.h>
#include <lcd.h>
#include <amba_clcd.h>
/* These variables are required by lcd.c -- although it sets them by itself */
int lcd_line_length;
int lcd_color_fg;
int lcd_color_bg;
void *lcd_base;
void *lcd_console_address;
short console_col;
short console_row;
/*
* To use this driver you need to provide the following in board files:
* a panel_info definition
* an lcd_enable function (can't define a weak default with current code)
*/
/* There is nothing to do with color registers, we use true color */
void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue)
{
return;
}
/* Low level initialization of the logic cell: depends on panel_info */
void lcd_ctrl_init(void *lcdbase)
{
struct clcd_config *config;
struct clcd_registers *regs;
u32 cntl;
config = panel_info.priv;
regs = config->address;
cntl = config->cntl & ~CNTL_LCDEN;
/* Lazily, just copy the registers over: first control with disable */
writel(cntl, &regs->cntl);
writel(config->tim0, &regs->tim0);
writel(config->tim1, &regs->tim1);
writel(config->tim2, &regs->tim2);
writel(config->tim3, &regs->tim3);
writel((u32)lcdbase, &regs->ubas);
/* finally, enable */
writel(cntl | CNTL_LCDEN, &regs->cntl);
}
/* This is trivial, and copied from atmel_lcdfb.c */
ulong calc_fbsize(void)
{
return ((panel_info.vl_col * panel_info.vl_row *
NBITS(panel_info.vl_bpix)) / 8) + PAGE_SIZE;
}
......@@ -29,16 +29,6 @@
#include <lcd.h>
#include <atmel_hlcdc.h>
int lcd_line_length;
int lcd_color_fg;
int lcd_color_bg;
void *lcd_base; /* Start of framebuffer memory */
void *lcd_console_address; /* Start of console buffer */
short console_col;
short console_row;
/* configurable parameters */
#define ATMEL_LCDC_CVAL_DEFAULT 0xc8
#define ATMEL_LCDC_DMA_BURST_LEN 8
......
......@@ -29,16 +29,6 @@
#include <lcd.h>
#include <atmel_lcdc.h>
int lcd_line_length;
int lcd_color_fg;
int lcd_color_bg;
void *lcd_base; /* Start of framebuffer memory */
void *lcd_console_address; /* Start of console buffer */
short console_col;
short console_row;
/* configurable parameters */
#define ATMEL_LCDC_CVAL_DEFAULT 0xc8
#define ATMEL_LCDC_DMA_BURST_LEN 8
......
......@@ -1515,13 +1515,6 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3;
/*
* Just ignore elements which are completely beyond screen
* dimensions.
*/
if ((x >= VIDEO_VISIBLE_COLS) || (y >= VIDEO_VISIBLE_ROWS))
return 0;
#ifdef CONFIG_SPLASH_SCREEN_ALIGN
if (x == BMP_ALIGN_CENTER)
x = max(0, (VIDEO_VISIBLE_COLS - width) / 2);
......@@ -1534,6 +1527,13 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
y = max(0, 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)
......
......@@ -33,15 +33,7 @@
#include "exynos_fb.h"
int lcd_line_length;
int lcd_color_fg;
int lcd_color_bg;
void *lcd_base;