1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * BRIEF MODULE DESCRIPTION 3*4882a593Smuzhiyun * Hardware definitions for the Au1100 LCD controller 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2002 MontaVista Software 6*4882a593Smuzhiyun * Copyright 2002 Alchemy Semiconductor 7*4882a593Smuzhiyun * Author: Alchemy Semiconductor, MontaVista Software 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 10*4882a593Smuzhiyun * under the terms of the GNU General Public License as published by the 11*4882a593Smuzhiyun * Free Software Foundation; either version 2 of the License, or (at your 12*4882a593Smuzhiyun * option) any later version. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 15*4882a593Smuzhiyun * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 16*4882a593Smuzhiyun * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 17*4882a593Smuzhiyun * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18*4882a593Smuzhiyun * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19*4882a593Smuzhiyun * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 20*4882a593Smuzhiyun * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 21*4882a593Smuzhiyun * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*4882a593Smuzhiyun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23*4882a593Smuzhiyun * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * You should have received a copy of the GNU General Public License along 26*4882a593Smuzhiyun * with this program; if not, write to the Free Software Foundation, Inc., 27*4882a593Smuzhiyun * 675 Mass Ave, Cambridge, MA 02139, USA. 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #ifndef _AU1100LCD_H 31*4882a593Smuzhiyun #define _AU1100LCD_H 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #include <asm/mach-au1x00/au1000.h> 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define print_err(f, arg...) printk(KERN_ERR DRIVER_NAME ": " f "\n", ## arg) 36*4882a593Smuzhiyun #define print_warn(f, arg...) printk(KERN_WARNING DRIVER_NAME ": " f "\n", ## arg) 37*4882a593Smuzhiyun #define print_info(f, arg...) printk(KERN_INFO DRIVER_NAME ": " f "\n", ## arg) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #if DEBUG 40*4882a593Smuzhiyun #define print_dbg(f, arg...) printk(__FILE__ ": " f "\n", ## arg) 41*4882a593Smuzhiyun #else 42*4882a593Smuzhiyun #define print_dbg(f, arg...) do {} while (0) 43*4882a593Smuzhiyun #endif 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #if defined(__BIG_ENDIAN) 46*4882a593Smuzhiyun #define LCD_CONTROL_DEFAULT_PO LCD_CONTROL_PO_11 47*4882a593Smuzhiyun #else 48*4882a593Smuzhiyun #define LCD_CONTROL_DEFAULT_PO LCD_CONTROL_PO_00 49*4882a593Smuzhiyun #endif 50*4882a593Smuzhiyun #define LCD_CONTROL_DEFAULT_SBPPF LCD_CONTROL_SBPPF_565 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /********************************************************************/ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* LCD controller restrictions */ 55*4882a593Smuzhiyun #define AU1100_LCD_MAX_XRES 800 56*4882a593Smuzhiyun #define AU1100_LCD_MAX_YRES 600 57*4882a593Smuzhiyun #define AU1100_LCD_MAX_BPP 16 58*4882a593Smuzhiyun #define AU1100_LCD_MAX_CLK 48000000 59*4882a593Smuzhiyun #define AU1100_LCD_NBR_PALETTE_ENTRIES 256 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Default number of visible screen buffer to allocate */ 62*4882a593Smuzhiyun #define AU1100FB_NBR_VIDEO_BUFFERS 4 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /********************************************************************/ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct au1100fb_panel 67*4882a593Smuzhiyun { 68*4882a593Smuzhiyun const char name[25]; /* Full name <vendor>_<model> */ 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun u32 control_base; /* Mode-independent control values */ 71*4882a593Smuzhiyun u32 clkcontrol_base; /* Panel pixclock preferences */ 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun u32 horztiming; 74*4882a593Smuzhiyun u32 verttiming; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun u32 xres; /* Maximum horizontal resolution */ 77*4882a593Smuzhiyun u32 yres; /* Maximum vertical resolution */ 78*4882a593Smuzhiyun u32 bpp; /* Maximum depth supported */ 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct au1100fb_regs 82*4882a593Smuzhiyun { 83*4882a593Smuzhiyun u32 lcd_control; 84*4882a593Smuzhiyun u32 lcd_intstatus; 85*4882a593Smuzhiyun u32 lcd_intenable; 86*4882a593Smuzhiyun u32 lcd_horztiming; 87*4882a593Smuzhiyun u32 lcd_verttiming; 88*4882a593Smuzhiyun u32 lcd_clkcontrol; 89*4882a593Smuzhiyun u32 lcd_dmaaddr0; 90*4882a593Smuzhiyun u32 lcd_dmaaddr1; 91*4882a593Smuzhiyun u32 lcd_words; 92*4882a593Smuzhiyun u32 lcd_pwmdiv; 93*4882a593Smuzhiyun u32 lcd_pwmhi; 94*4882a593Smuzhiyun u32 reserved[(0x0400-0x002C)/4]; 95*4882a593Smuzhiyun u32 lcd_pallettebase[256]; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct au1100fb_device { 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct fb_info info; /* FB driver info record */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct au1100fb_panel *panel; /* Panel connected to this device */ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct au1100fb_regs* regs; /* Registers memory map */ 105*4882a593Smuzhiyun size_t regs_len; 106*4882a593Smuzhiyun unsigned int regs_phys; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun unsigned char* fb_mem; /* FrameBuffer memory map */ 109*4882a593Smuzhiyun size_t fb_len; 110*4882a593Smuzhiyun dma_addr_t fb_phys; 111*4882a593Smuzhiyun int panel_idx; 112*4882a593Smuzhiyun struct clk *lcdclk; 113*4882a593Smuzhiyun struct device *dev; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /********************************************************************/ 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define LCD_CONTROL (AU1100_LCD_BASE + 0x0) 119*4882a593Smuzhiyun #define LCD_CONTROL_SBB_BIT 21 120*4882a593Smuzhiyun #define LCD_CONTROL_SBB_MASK (0x3 << LCD_CONTROL_SBB_BIT) 121*4882a593Smuzhiyun #define LCD_CONTROL_SBB_1 (0 << LCD_CONTROL_SBB_BIT) 122*4882a593Smuzhiyun #define LCD_CONTROL_SBB_2 (1 << LCD_CONTROL_SBB_BIT) 123*4882a593Smuzhiyun #define LCD_CONTROL_SBB_3 (2 << LCD_CONTROL_SBB_BIT) 124*4882a593Smuzhiyun #define LCD_CONTROL_SBB_4 (3 << LCD_CONTROL_SBB_BIT) 125*4882a593Smuzhiyun #define LCD_CONTROL_SBPPF_BIT 18 126*4882a593Smuzhiyun #define LCD_CONTROL_SBPPF_MASK (0x7 << LCD_CONTROL_SBPPF_BIT) 127*4882a593Smuzhiyun #define LCD_CONTROL_SBPPF_655 (0 << LCD_CONTROL_SBPPF_BIT) 128*4882a593Smuzhiyun #define LCD_CONTROL_SBPPF_565 (1 << LCD_CONTROL_SBPPF_BIT) 129*4882a593Smuzhiyun #define LCD_CONTROL_SBPPF_556 (2 << LCD_CONTROL_SBPPF_BIT) 130*4882a593Smuzhiyun #define LCD_CONTROL_SBPPF_1555 (3 << LCD_CONTROL_SBPPF_BIT) 131*4882a593Smuzhiyun #define LCD_CONTROL_SBPPF_5551 (4 << LCD_CONTROL_SBPPF_BIT) 132*4882a593Smuzhiyun #define LCD_CONTROL_WP (1<<17) 133*4882a593Smuzhiyun #define LCD_CONTROL_WD (1<<16) 134*4882a593Smuzhiyun #define LCD_CONTROL_C (1<<15) 135*4882a593Smuzhiyun #define LCD_CONTROL_SM_BIT 13 136*4882a593Smuzhiyun #define LCD_CONTROL_SM_MASK (0x3 << LCD_CONTROL_SM_BIT) 137*4882a593Smuzhiyun #define LCD_CONTROL_SM_0 (0 << LCD_CONTROL_SM_BIT) 138*4882a593Smuzhiyun #define LCD_CONTROL_SM_90 (1 << LCD_CONTROL_SM_BIT) 139*4882a593Smuzhiyun #define LCD_CONTROL_SM_180 (2 << LCD_CONTROL_SM_BIT) 140*4882a593Smuzhiyun #define LCD_CONTROL_SM_270 (3 << LCD_CONTROL_SM_BIT) 141*4882a593Smuzhiyun #define LCD_CONTROL_DB (1<<12) 142*4882a593Smuzhiyun #define LCD_CONTROL_CCO (1<<11) 143*4882a593Smuzhiyun #define LCD_CONTROL_DP (1<<10) 144*4882a593Smuzhiyun #define LCD_CONTROL_PO_BIT 8 145*4882a593Smuzhiyun #define LCD_CONTROL_PO_MASK (0x3 << LCD_CONTROL_PO_BIT) 146*4882a593Smuzhiyun #define LCD_CONTROL_PO_00 (0 << LCD_CONTROL_PO_BIT) 147*4882a593Smuzhiyun #define LCD_CONTROL_PO_01 (1 << LCD_CONTROL_PO_BIT) 148*4882a593Smuzhiyun #define LCD_CONTROL_PO_10 (2 << LCD_CONTROL_PO_BIT) 149*4882a593Smuzhiyun #define LCD_CONTROL_PO_11 (3 << LCD_CONTROL_PO_BIT) 150*4882a593Smuzhiyun #define LCD_CONTROL_MPI (1<<7) 151*4882a593Smuzhiyun #define LCD_CONTROL_PT (1<<6) 152*4882a593Smuzhiyun #define LCD_CONTROL_PC (1<<5) 153*4882a593Smuzhiyun #define LCD_CONTROL_BPP_BIT 1 154*4882a593Smuzhiyun #define LCD_CONTROL_BPP_MASK (0x7 << LCD_CONTROL_BPP_BIT) 155*4882a593Smuzhiyun #define LCD_CONTROL_BPP_1 (0 << LCD_CONTROL_BPP_BIT) 156*4882a593Smuzhiyun #define LCD_CONTROL_BPP_2 (1 << LCD_CONTROL_BPP_BIT) 157*4882a593Smuzhiyun #define LCD_CONTROL_BPP_4 (2 << LCD_CONTROL_BPP_BIT) 158*4882a593Smuzhiyun #define LCD_CONTROL_BPP_8 (3 << LCD_CONTROL_BPP_BIT) 159*4882a593Smuzhiyun #define LCD_CONTROL_BPP_12 (4 << LCD_CONTROL_BPP_BIT) 160*4882a593Smuzhiyun #define LCD_CONTROL_BPP_16 (5 << LCD_CONTROL_BPP_BIT) 161*4882a593Smuzhiyun #define LCD_CONTROL_GO (1<<0) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #define LCD_INTSTATUS (AU1100_LCD_BASE + 0x4) 164*4882a593Smuzhiyun #define LCD_INTENABLE (AU1100_LCD_BASE + 0x8) 165*4882a593Smuzhiyun #define LCD_INT_SD (1<<7) 166*4882a593Smuzhiyun #define LCD_INT_OF (1<<6) 167*4882a593Smuzhiyun #define LCD_INT_UF (1<<5) 168*4882a593Smuzhiyun #define LCD_INT_SA (1<<3) 169*4882a593Smuzhiyun #define LCD_INT_SS (1<<2) 170*4882a593Smuzhiyun #define LCD_INT_S1 (1<<1) 171*4882a593Smuzhiyun #define LCD_INT_S0 (1<<0) 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define LCD_HORZTIMING (AU1100_LCD_BASE + 0xC) 174*4882a593Smuzhiyun #define LCD_HORZTIMING_HN2_BIT 24 175*4882a593Smuzhiyun #define LCD_HORZTIMING_HN2_MASK (0xFF << LCD_HORZTIMING_HN2_BIT) 176*4882a593Smuzhiyun #define LCD_HORZTIMING_HN2_N(N) ((((N)-1) << LCD_HORZTIMING_HN2_BIT) & LCD_HORZTIMING_HN2_MASK) 177*4882a593Smuzhiyun #define LCD_HORZTIMING_HN1_BIT 16 178*4882a593Smuzhiyun #define LCD_HORZTIMING_HN1_MASK (0xFF << LCD_HORZTIMING_HN1_BIT) 179*4882a593Smuzhiyun #define LCD_HORZTIMING_HN1_N(N) ((((N)-1) << LCD_HORZTIMING_HN1_BIT) & LCD_HORZTIMING_HN1_MASK) 180*4882a593Smuzhiyun #define LCD_HORZTIMING_HPW_BIT 10 181*4882a593Smuzhiyun #define LCD_HORZTIMING_HPW_MASK (0x3F << LCD_HORZTIMING_HPW_BIT) 182*4882a593Smuzhiyun #define LCD_HORZTIMING_HPW_N(N) ((((N)-1) << LCD_HORZTIMING_HPW_BIT) & LCD_HORZTIMING_HPW_MASK) 183*4882a593Smuzhiyun #define LCD_HORZTIMING_PPL_BIT 0 184*4882a593Smuzhiyun #define LCD_HORZTIMING_PPL_MASK (0x3FF << LCD_HORZTIMING_PPL_BIT) 185*4882a593Smuzhiyun #define LCD_HORZTIMING_PPL_N(N) ((((N)-1) << LCD_HORZTIMING_PPL_BIT) & LCD_HORZTIMING_PPL_MASK) 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define LCD_VERTTIMING (AU1100_LCD_BASE + 0x10) 188*4882a593Smuzhiyun #define LCD_VERTTIMING_VN2_BIT 24 189*4882a593Smuzhiyun #define LCD_VERTTIMING_VN2_MASK (0xFF << LCD_VERTTIMING_VN2_BIT) 190*4882a593Smuzhiyun #define LCD_VERTTIMING_VN2_N(N) ((((N)-1) << LCD_VERTTIMING_VN2_BIT) & LCD_VERTTIMING_VN2_MASK) 191*4882a593Smuzhiyun #define LCD_VERTTIMING_VN1_BIT 16 192*4882a593Smuzhiyun #define LCD_VERTTIMING_VN1_MASK (0xFF << LCD_VERTTIMING_VN1_BIT) 193*4882a593Smuzhiyun #define LCD_VERTTIMING_VN1_N(N) ((((N)-1) << LCD_VERTTIMING_VN1_BIT) & LCD_VERTTIMING_VN1_MASK) 194*4882a593Smuzhiyun #define LCD_VERTTIMING_VPW_BIT 10 195*4882a593Smuzhiyun #define LCD_VERTTIMING_VPW_MASK (0x3F << LCD_VERTTIMING_VPW_BIT) 196*4882a593Smuzhiyun #define LCD_VERTTIMING_VPW_N(N) ((((N)-1) << LCD_VERTTIMING_VPW_BIT) & LCD_VERTTIMING_VPW_MASK) 197*4882a593Smuzhiyun #define LCD_VERTTIMING_LPP_BIT 0 198*4882a593Smuzhiyun #define LCD_VERTTIMING_LPP_MASK (0x3FF << LCD_VERTTIMING_LPP_BIT) 199*4882a593Smuzhiyun #define LCD_VERTTIMING_LPP_N(N) ((((N)-1) << LCD_VERTTIMING_LPP_BIT) & LCD_VERTTIMING_LPP_MASK) 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #define LCD_CLKCONTROL (AU1100_LCD_BASE + 0x14) 202*4882a593Smuzhiyun #define LCD_CLKCONTROL_IB (1<<18) 203*4882a593Smuzhiyun #define LCD_CLKCONTROL_IC (1<<17) 204*4882a593Smuzhiyun #define LCD_CLKCONTROL_IH (1<<16) 205*4882a593Smuzhiyun #define LCD_CLKCONTROL_IV (1<<15) 206*4882a593Smuzhiyun #define LCD_CLKCONTROL_BF_BIT 10 207*4882a593Smuzhiyun #define LCD_CLKCONTROL_BF_MASK (0x1F << LCD_CLKCONTROL_BF_BIT) 208*4882a593Smuzhiyun #define LCD_CLKCONTROL_BF_N(N) ((((N)-1) << LCD_CLKCONTROL_BF_BIT) & LCD_CLKCONTROL_BF_MASK) 209*4882a593Smuzhiyun #define LCD_CLKCONTROL_PCD_BIT 0 210*4882a593Smuzhiyun #define LCD_CLKCONTROL_PCD_MASK (0x3FF << LCD_CLKCONTROL_PCD_BIT) 211*4882a593Smuzhiyun #define LCD_CLKCONTROL_PCD_N(N) (((N) << LCD_CLKCONTROL_PCD_BIT) & LCD_CLKCONTROL_PCD_MASK) 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun #define LCD_DMAADDR0 (AU1100_LCD_BASE + 0x18) 214*4882a593Smuzhiyun #define LCD_DMAADDR1 (AU1100_LCD_BASE + 0x1C) 215*4882a593Smuzhiyun #define LCD_DMA_SA_BIT 5 216*4882a593Smuzhiyun #define LCD_DMA_SA_MASK (0x7FFFFFF << LCD_DMA_SA_BIT) 217*4882a593Smuzhiyun #define LCD_DMA_SA_N(N) ((N) & LCD_DMA_SA_MASK) 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun #define LCD_WORDS (AU1100_LCD_BASE + 0x20) 220*4882a593Smuzhiyun #define LCD_WRD_WRDS_BIT 0 221*4882a593Smuzhiyun #define LCD_WRD_WRDS_MASK (0xFFFFFFFF << LCD_WRD_WRDS_BIT) 222*4882a593Smuzhiyun #define LCD_WRD_WRDS_N(N) ((((N)-1) << LCD_WRD_WRDS_BIT) & LCD_WRD_WRDS_MASK) 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun #define LCD_PWMDIV (AU1100_LCD_BASE + 0x24) 225*4882a593Smuzhiyun #define LCD_PWMDIV_EN (1<<12) 226*4882a593Smuzhiyun #define LCD_PWMDIV_PWMDIV_BIT 0 227*4882a593Smuzhiyun #define LCD_PWMDIV_PWMDIV_MASK (0xFFF << LCD_PWMDIV_PWMDIV_BIT) 228*4882a593Smuzhiyun #define LCD_PWMDIV_PWMDIV_N(N) ((((N)-1) << LCD_PWMDIV_PWMDIV_BIT) & LCD_PWMDIV_PWMDIV_MASK) 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun #define LCD_PWMHI (AU1100_LCD_BASE + 0x28) 231*4882a593Smuzhiyun #define LCD_PWMHI_PWMHI1_BIT 12 232*4882a593Smuzhiyun #define LCD_PWMHI_PWMHI1_MASK (0xFFF << LCD_PWMHI_PWMHI1_BIT) 233*4882a593Smuzhiyun #define LCD_PWMHI_PWMHI1_N(N) (((N) << LCD_PWMHI_PWMHI1_BIT) & LCD_PWMHI_PWMHI1_MASK) 234*4882a593Smuzhiyun #define LCD_PWMHI_PWMHI0_BIT 0 235*4882a593Smuzhiyun #define LCD_PWMHI_PWMHI0_MASK (0xFFF << LCD_PWMHI_PWMHI0_BIT) 236*4882a593Smuzhiyun #define LCD_PWMHI_PWMHI0_N(N) (((N) << LCD_PWMHI_PWMHI0_BIT) & LCD_PWMHI_PWMHI0_MASK) 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun #define LCD_PALLETTEBASE (AU1100_LCD_BASE + 0x400) 239*4882a593Smuzhiyun #define LCD_PALLETTE_MONO_MI_BIT 0 240*4882a593Smuzhiyun #define LCD_PALLETTE_MONO_MI_MASK (0xF << LCD_PALLETTE_MONO_MI_BIT) 241*4882a593Smuzhiyun #define LCD_PALLETTE_MONO_MI_N(N) (((N)<< LCD_PALLETTE_MONO_MI_BIT) & LCD_PALLETTE_MONO_MI_MASK) 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_RI_BIT 8 244*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_RI_MASK (0xF << LCD_PALLETTE_COLOR_RI_BIT) 245*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_RI_N(N) (((N)<< LCD_PALLETTE_COLOR_RI_BIT) & LCD_PALLETTE_COLOR_RI_MASK) 246*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_GI_BIT 4 247*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_GI_MASK (0xF << LCD_PALLETTE_COLOR_GI_BIT) 248*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_GI_N(N) (((N)<< LCD_PALLETTE_COLOR_GI_BIT) & LCD_PALLETTE_COLOR_GI_MASK) 249*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_BI_BIT 0 250*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_BI_MASK (0xF << LCD_PALLETTE_COLOR_BI_BIT) 251*4882a593Smuzhiyun #define LCD_PALLETTE_COLOR_BI_N(N) (((N)<< LCD_PALLETTE_COLOR_BI_BIT) & LCD_PALLETTE_COLOR_BI_MASK) 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun #define LCD_PALLETTE_TFT_DC_BIT 0 254*4882a593Smuzhiyun #define LCD_PALLETTE_TFT_DC_MASK (0xFFFF << LCD_PALLETTE_TFT_DC_BIT) 255*4882a593Smuzhiyun #define LCD_PALLETTE_TFT_DC_N(N) (((N)<< LCD_PALLETTE_TFT_DC_BIT) & LCD_PALLETTE_TFT_DC_MASK) 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /********************************************************************/ 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* List of panels known to work with the AU1100 LCD controller. 260*4882a593Smuzhiyun * To add a new panel, enter the same specifications as the 261*4882a593Smuzhiyun * Generic_TFT one, and MAKE SURE that it doesn't conflicts 262*4882a593Smuzhiyun * with the controller restrictions. Restrictions are: 263*4882a593Smuzhiyun * 264*4882a593Smuzhiyun * STN color panels: max_bpp <= 12 265*4882a593Smuzhiyun * STN mono panels: max_bpp <= 4 266*4882a593Smuzhiyun * TFT panels: max_bpp <= 16 267*4882a593Smuzhiyun * max_xres <= 800 268*4882a593Smuzhiyun * max_yres <= 600 269*4882a593Smuzhiyun */ 270*4882a593Smuzhiyun static struct au1100fb_panel known_lcd_panels[] = 271*4882a593Smuzhiyun { 272*4882a593Smuzhiyun /* 800x600x16bpp CRT */ 273*4882a593Smuzhiyun [0] = { 274*4882a593Smuzhiyun .name = "CRT_800x600_16", 275*4882a593Smuzhiyun .xres = 800, 276*4882a593Smuzhiyun .yres = 600, 277*4882a593Smuzhiyun .bpp = 16, 278*4882a593Smuzhiyun .control_base = 0x0004886A | 279*4882a593Smuzhiyun LCD_CONTROL_DEFAULT_PO | LCD_CONTROL_DEFAULT_SBPPF | 280*4882a593Smuzhiyun LCD_CONTROL_BPP_16 | LCD_CONTROL_SBB_4, 281*4882a593Smuzhiyun .clkcontrol_base = 0x00020000, 282*4882a593Smuzhiyun .horztiming = 0x005aff1f, 283*4882a593Smuzhiyun .verttiming = 0x16000e57, 284*4882a593Smuzhiyun }, 285*4882a593Smuzhiyun /* just the standard LCD */ 286*4882a593Smuzhiyun [1] = { 287*4882a593Smuzhiyun .name = "WWPC LCD", 288*4882a593Smuzhiyun .xres = 240, 289*4882a593Smuzhiyun .yres = 320, 290*4882a593Smuzhiyun .bpp = 16, 291*4882a593Smuzhiyun .control_base = 0x0006806A, 292*4882a593Smuzhiyun .horztiming = 0x0A1010EF, 293*4882a593Smuzhiyun .verttiming = 0x0301013F, 294*4882a593Smuzhiyun .clkcontrol_base = 0x00018001, 295*4882a593Smuzhiyun }, 296*4882a593Smuzhiyun /* Sharp 320x240 TFT panel */ 297*4882a593Smuzhiyun [2] = { 298*4882a593Smuzhiyun .name = "Sharp_LQ038Q5DR01", 299*4882a593Smuzhiyun .xres = 320, 300*4882a593Smuzhiyun .yres = 240, 301*4882a593Smuzhiyun .bpp = 16, 302*4882a593Smuzhiyun .control_base = 303*4882a593Smuzhiyun ( LCD_CONTROL_SBPPF_565 304*4882a593Smuzhiyun | LCD_CONTROL_C 305*4882a593Smuzhiyun | LCD_CONTROL_SM_0 306*4882a593Smuzhiyun | LCD_CONTROL_DEFAULT_PO 307*4882a593Smuzhiyun | LCD_CONTROL_PT 308*4882a593Smuzhiyun | LCD_CONTROL_PC 309*4882a593Smuzhiyun | LCD_CONTROL_BPP_16 ), 310*4882a593Smuzhiyun .horztiming = 311*4882a593Smuzhiyun ( LCD_HORZTIMING_HN2_N(8) 312*4882a593Smuzhiyun | LCD_HORZTIMING_HN1_N(60) 313*4882a593Smuzhiyun | LCD_HORZTIMING_HPW_N(12) 314*4882a593Smuzhiyun | LCD_HORZTIMING_PPL_N(320) ), 315*4882a593Smuzhiyun .verttiming = 316*4882a593Smuzhiyun ( LCD_VERTTIMING_VN2_N(5) 317*4882a593Smuzhiyun | LCD_VERTTIMING_VN1_N(17) 318*4882a593Smuzhiyun | LCD_VERTTIMING_VPW_N(1) 319*4882a593Smuzhiyun | LCD_VERTTIMING_LPP_N(240) ), 320*4882a593Smuzhiyun .clkcontrol_base = LCD_CLKCONTROL_PCD_N(1), 321*4882a593Smuzhiyun }, 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun /* Hitachi SP14Q005 and possibly others */ 324*4882a593Smuzhiyun [3] = { 325*4882a593Smuzhiyun .name = "Hitachi_SP14Qxxx", 326*4882a593Smuzhiyun .xres = 320, 327*4882a593Smuzhiyun .yres = 240, 328*4882a593Smuzhiyun .bpp = 4, 329*4882a593Smuzhiyun .control_base = 330*4882a593Smuzhiyun ( LCD_CONTROL_C 331*4882a593Smuzhiyun | LCD_CONTROL_BPP_4 ), 332*4882a593Smuzhiyun .horztiming = 333*4882a593Smuzhiyun ( LCD_HORZTIMING_HN2_N(1) 334*4882a593Smuzhiyun | LCD_HORZTIMING_HN1_N(1) 335*4882a593Smuzhiyun | LCD_HORZTIMING_HPW_N(1) 336*4882a593Smuzhiyun | LCD_HORZTIMING_PPL_N(320) ), 337*4882a593Smuzhiyun .verttiming = 338*4882a593Smuzhiyun ( LCD_VERTTIMING_VN2_N(1) 339*4882a593Smuzhiyun | LCD_VERTTIMING_VN1_N(1) 340*4882a593Smuzhiyun | LCD_VERTTIMING_VPW_N(1) 341*4882a593Smuzhiyun | LCD_VERTTIMING_LPP_N(240) ), 342*4882a593Smuzhiyun .clkcontrol_base = LCD_CLKCONTROL_PCD_N(4), 343*4882a593Smuzhiyun }, 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun /* Generic 640x480 TFT panel */ 346*4882a593Smuzhiyun [4] = { 347*4882a593Smuzhiyun .name = "TFT_640x480_16", 348*4882a593Smuzhiyun .xres = 640, 349*4882a593Smuzhiyun .yres = 480, 350*4882a593Smuzhiyun .bpp = 16, 351*4882a593Smuzhiyun .control_base = 0x004806a | LCD_CONTROL_DEFAULT_PO, 352*4882a593Smuzhiyun .horztiming = 0x3434d67f, 353*4882a593Smuzhiyun .verttiming = 0x0e0e39df, 354*4882a593Smuzhiyun .clkcontrol_base = LCD_CLKCONTROL_PCD_N(1), 355*4882a593Smuzhiyun }, 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun /* Pb1100 LCDB 640x480 PrimeView TFT panel */ 358*4882a593Smuzhiyun [5] = { 359*4882a593Smuzhiyun .name = "PrimeView_640x480_16", 360*4882a593Smuzhiyun .xres = 640, 361*4882a593Smuzhiyun .yres = 480, 362*4882a593Smuzhiyun .bpp = 16, 363*4882a593Smuzhiyun .control_base = 0x0004886a | LCD_CONTROL_DEFAULT_PO, 364*4882a593Smuzhiyun .horztiming = 0x0e4bfe7f, 365*4882a593Smuzhiyun .verttiming = 0x210805df, 366*4882a593Smuzhiyun .clkcontrol_base = 0x00038001, 367*4882a593Smuzhiyun }, 368*4882a593Smuzhiyun }; 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun /********************************************************************/ 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun /* Inline helpers */ 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun #define panel_is_dual(panel) (panel->control_base & LCD_CONTROL_DP) 375*4882a593Smuzhiyun #define panel_is_active(panel)(panel->control_base & LCD_CONTROL_PT) 376*4882a593Smuzhiyun #define panel_is_color(panel) (panel->control_base & LCD_CONTROL_PC) 377*4882a593Smuzhiyun #define panel_swap_rgb(panel) (panel->control_base & LCD_CONTROL_CCO) 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun #endif /* _AU1100LCD_H */ 380