Merge with /home/tur/git/u-boot#cm5200-si
[platform/kernel/u-boot.git] / drivers / ct69000.c
index 7962f74..29d82e4 100644 (file)
@@ -1,6 +1,8 @@
-/*
- * (C) Copyright 2002
- * Denis Peter, MPL AG Switzerland
+/* ported from ctfb.c (linux kernel):
+ * Created in Jan - July 2000 by Thomas Höhenleitner <th@visuelle-maschinen.de>
+ *
+ * Ported to U-Boot:
+ * (C) Copyright 2002 Denis Peter, MPL AG Switzerland
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  * MA 02111-1307 USA
  */
 
-/*
- * ported from ctfb.c (linux kernel) for the U-Boot
- *
- */
-
-/************************************************************************
-  Get Parameters for the video mode:
-  Parameters can be set via the variable "videomode" in the environment.
-  2 diferent ways are possible:
-  "videomode=301"   - 301 is a hexadecimal number describing the VESA
-                      mode. Following modes are implemented:
-
-                      Colors    640x480 800x600 1024x768 1152x864
-                     --------+-----------------------------------
-                      8 bits |  0x301   0x303    0x305    0x161
-                     15 bits |  0x310   0x313    0x316    0x162
-                     16 bits |  0x311   0x314    0x317    0x163
-                     24 bits |  0x312   0x315    0x318      ?
-                     --------+-----------------------------------
-  "videomode=bootargs"
-                   - the parameters are parsed from the bootargs.
-                      The format is "NAME:VALUE,NAME:VALUE" etc.
-                      Ex.:
-                      "bootargs=video=ctfb:x:800,y:600,depth:16,pclk:25000"
-                      Parameters not included in the list will be taken from
-                      the default mode, which is one of the following:
-                      mode:0  640x480x24
-                      mode:1  800x600x16
-                      mode:2  1024x768x8
-                      mode:3  960x720x24
-                      mode:4  1152x864x16
-                      if "mode" is not provided within the parameter list,
-                      mode:0 is assumed.
-                      Following parameters are supported:
-                      x       xres = visible resolution horizontal
-                      y       yres = visible resolution vertical
-                      pclk    pixelclocks in pico sec
-                      le      left_marging time from sync to picture in pixelclocks
-                      ri      right_marging time from picture to sync in pixelclocks
-                      up      upper_margin time from sync to picture
-                      lo      lower_margin
-                      hs      hsync_len length of horizontal sync
-                      vs      vsync_len length of vertical sync
-                      sync    see FB_SYNC_*
-                      vmode   see FB_VMODE_*
-                      depth   Color depth in bits per pixel
-                      All other parameters in the variable bootargs are ignored.
-                      It is also possible to set the parameters direct in the
-                      variable "videomode", or in another variable i.e.
-                      "myvideo" and setting the variable "videomode=myvideo"..
-****************************************************************************/
-
 #include <common.h>
 
 #ifdef CONFIG_VIDEO
 
 #include <pci.h>
 #include <video_fb.h>
+#include "videomodes.h"
 
 #ifdef CONFIG_VIDEO_CT69000
 
@@ -304,32 +255,6 @@ static CT_CFG_TABLE xreg[] = {
  *
  */
 
-/******************************************************************
- * Resolution Struct
- ******************************************************************/
-struct ctfb_res_modes {
-       int xres;               /* visible resolution           */
-       int yres;
-       /* Timing: All values in pixclocks, except pixclock (of course) */
-       int pixclock;           /* pixel clock in ps (pico seconds) */
-       int left_margin;        /* time from sync to picture    */
-       int right_margin;       /* time from picture to sync    */
-       int upper_margin;       /* time from sync to picture    */
-       int lower_margin;
-       int hsync_len;          /* length of horizontal sync    */
-       int vsync_len;          /* length of vertical sync      */
-       int sync;               /* see FB_SYNC_*                */
-       int vmode;              /* see FB_VMODE_*               */
-};
-
-/******************************************************************
- * Vesa Mode Struct
- ******************************************************************/
-struct ctfb_vesa_modes {
-       int vesanr;             /* Vesa number as in LILO (VESA Nr + 0x200} */
-       int resindex;           /* index to resolution struct */
-       int bits_per_pixel;     /* bpp */
-};
 /*******************************************************************
  * Chips struct
  *******************************************************************/
@@ -347,62 +272,13 @@ struct ctfb_chips_properties {
 
 static const struct ctfb_chips_properties chips[] = {
        {PCI_DEVICE_ID_CT_69000, 0x200000, 1, 4, -2, 3, 257, 100, 220},
+#ifdef CONFIG_USE_CPCIDVI
+       {PCI_DEVICE_ID_CT_69030, 0x400000, 1, 4, -2, 3, 257, 100, 220},
+#endif
        {PCI_DEVICE_ID_CT_65555, 0x100000, 16, 4, 0, 1, 255, 48, 220},  /* NOT TESTED */
        {0, 0, 0, 0, 0, 0, 0, 0, 0}     /* Terminator */
 };
 
-/*************************************************
- Video Modes:
-Colours   640x400 640x480 800x600 1024x768 1152x864 1280x1024 1600x1200
---------+--------------------------------------------------------------
- 4 bits |    ?       ?     0x302      ?        ?        ?         ?
- 8 bits |  0x300   0x301   0x303    0x305    0x161    0x307     0x31C
-15 bits |    ?     0x310   0x313    0x316    0x162    0x319     0x31D
-16 bits |    ?     0x311   0x314    0x317    0x163    0x31A     0x31E
-24 bits |    ?     0x312   0x315    0x318      ?      0x31B     0x31F
-32 bits |    ?       ?       ?        ?      0x164      ?
-*/
-
-#define RES_MODE_640x480       0
-#define RES_MODE_800x600       1
-#define RES_MODE_1024x768      2
-#define RES_MODE_960_720       3
-#define RES_MODE_1152x864      4
-#define RES_MODES_COUNT                5
-
-#define VESA_MODES_COUNT 15
-
-static const struct ctfb_vesa_modes vesa_modes[VESA_MODES_COUNT] = {
-       {0x301, RES_MODE_640x480, 8},
-       {0x310, RES_MODE_640x480, 15},
-       {0x311, RES_MODE_640x480, 16},
-       {0x312, RES_MODE_640x480, 24},
-       {0x303, RES_MODE_800x600, 8},
-       {0x313, RES_MODE_800x600, 15},
-       {0x314, RES_MODE_800x600, 16},
-       {0x315, RES_MODE_800x600, 24},
-       {0x305, RES_MODE_1024x768, 8},
-       {0x316, RES_MODE_1024x768, 15},
-       {0x317, RES_MODE_1024x768, 16},
-       {0x318, RES_MODE_1024x768, 24},
-       {0x161, RES_MODE_1152x864, 8},
-       {0x162, RES_MODE_1152x864, 15},
-       {0x163, RES_MODE_1152x864, 16}
-};
-
-static const struct ctfb_res_modes res_mode_init[RES_MODES_COUNT] = {
-       /* x     y pixclk   le  ri  up  lo   hs vs  s  vmode */
-       {640, 480, 39721, 40, 24, 32, 11, 96, 2, 0,
-        FB_VMODE_NONINTERLACED},
-       {800, 600, 27778, 64, 24, 22, 1, 72, 2, 0, FB_VMODE_NONINTERLACED},
-       {1024, 768, 15384, 168, 8, 29, 3, 144, 4, 0,
-        FB_VMODE_NONINTERLACED},
-       {960, 720, 13100, 160, 40, 32, 8, 80, 4, 0,
-        FB_VMODE_NONINTERLACED},
-       {1152, 864, 12004, 200, 64, 32, 16, 80, 4, 0,
-        FB_VMODE_NONINTERLACED}
-};
-
 /*
  * The Graphic Device
  */
@@ -830,6 +706,7 @@ FindAndSetPllParamIntoXrRegs (unsigned int pixelclock,
        unsigned int m, n, vld, pd, PD, fref, xr_cb;
        unsigned int fvcomin, fvcomax, pclckmin, pclckmax, pclk;
        unsigned int pfreq, fvco, new_pixclock;
+       unsigned int D,nback,mback;
 
        fref = VIDEO_FREF;
        pd = 1;
@@ -850,10 +727,19 @@ FindAndSetPllParamIntoXrRegs (unsigned int pixelclock,
                PD++;
        }
        /* fvco is exactly pd * pixelclock and higher than the ninmal VCO frequency */
-       vld = (param->vld_set > param->vld_not_set) ?
-           param->vld_not_set : param->vld_set;
-       /* start with lower VLD (higher VLD is NOT yet implemented */
-       FindBestPQFittingMN (fvco / vld, fref, param->mn_min, param->mn_max, &m, &n);   /* rds = 1 */
+       /* first try */
+       vld = param->vld_set;
+       D=FindBestPQFittingMN (fvco / vld, fref, param->mn_min, param->mn_max, &m, &n); /* rds = 1 */
+       mback=m;
+       nback=n;
+       /* second try */
+       vld = param->vld_not_set;
+       if(D<FindBestPQFittingMN (fvco / vld, fref, param->mn_min, param->mn_max, &m, &n)) {    /* rds = 1 */
+               /* first try was better */
+               m=mback;
+               n=nback;
+               vld = param->vld_set;
+       }
        m += param->mn_diff;
        n += param->mn_diff;
        PRINTF ("VCO %d, pd %d, m %d n %d vld %d \n", fvco, pd, m, n, vld);
@@ -1069,113 +955,14 @@ SetDrawingEngine (int bits_per_pixel)
        video_wait_bitblt (pGD->pciBase + BR04_o);
 }
 
-/************************************************************************
- * Get Parameters for the video mode:
- */
-/*********************************************************************
- * returns the length to the next seperator
- */
-static int
-video_get_param_len (char *start, char sep)
-{
-       int i = 0;
-       while ((*start != 0) && (*start != sep)) {
-               start++;
-               i++;
-       }
-       return i;
-}
-
-static int
-video_search_param (char *start, char *param)
-{
-       int len, totallen, i;
-       char *p = start;
-       len = strlen (param);
-       totallen = len + strlen (start);
-       for (i = 0; i < totallen; i++) {
-               if (strncmp (p++, param, len) == 0)
-                       return (i);
-       }
-       return -1;
-}
-
-/***************************************************************
-* Get parameter via the environment as it is done for the
-* linux kernel i.e:
-* video=ctfb:x:800,xv:1280,y:600,yv:1024,depth:16,mode:0,pclk:25000,
-*       le:56,ri:48,up:26,lo:5,hs:152,vs:2,sync:0,vmode:0,accel:0
-*
-* penv is a pointer to the environment, containing the string, or the name of
-* another environment variable. It could even be the term "bootargs"
-*/
-
-#define GET_OPTION(name,var)                           \
-               if(strncmp(p,name,strlen(name))==0) {   \
-                       val_s=p+strlen(name);           \
-                       var=simple_strtoul(val_s, NULL, 10); \
-               }
-
-static int
-video_get_params (struct ctfb_res_modes *pPar, char *penv)
-{
-       char *p, *s, *val_s;
-       int i = 0, t;
-       int bpp;
-       int mode;
-       /* first search for the environment containing the real param string */
-       s = penv;
-       if ((p = getenv (s)) != NULL) {
-               s = p;
-       }
-       /* in case of the bootargs line, we have to start
-        * after "video=ctfb:"
-        */
-       i = video_search_param (s, "video=ctfb:");
-       if (i >= 0) {
-               s += i;
-               s += strlen ("video=ctfb:");
-       }
-       /* search for mode as a default value */
-       p = s;
-       t = 0;
-       mode = 0;               /* default */
-       while ((i = video_get_param_len (p, ',')) != 0) {
-               GET_OPTION ("mode:", mode)
-                   p += i;
-               if (*p != 0)
-                       p++;    /* skip ',' */
-       }
-       if (mode >= RES_MODES_COUNT)
-               mode = 0;
-       *pPar = res_mode_init[mode];    /* copy default values */
-       bpp = 24 - ((mode % 3) * 8);
-       p = s;                  /* restart */
-       while ((i = video_get_param_len (p, ',')) != 0) {
-               GET_OPTION ("x:", pPar->xres)
-                   GET_OPTION ("y:", pPar->yres)
-                   GET_OPTION ("le:", pPar->left_margin)
-                   GET_OPTION ("ri:", pPar->right_margin)
-                   GET_OPTION ("up:", pPar->upper_margin)
-                   GET_OPTION ("lo:", pPar->lower_margin)
-                   GET_OPTION ("hs:", pPar->hsync_len)
-                   GET_OPTION ("vs:", pPar->vsync_len)
-                   GET_OPTION ("sync:", pPar->sync)
-                   GET_OPTION ("vmode:", pPar->vmode)
-                   GET_OPTION ("pclk:", pPar->pixclock)
-                   GET_OPTION ("depth:", bpp)
-                   p += i;
-               if (*p != 0)
-                       p++;    /* skip ',' */
-       }
-       return bpp;
-}
-
 /****************************************************************************
 * supported Video Chips
 */
 static struct pci_device_id supported[] = {
        {PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69000},
+#ifdef CONFIG_USE_CPCIDVI
+       {PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69030},
+#endif
        {}
 };
 
@@ -1340,7 +1127,22 @@ video_hw_init (void)
        pGD->cprBase = pci_mem_base;    /* Dummy */
        /* set up Hardware */
 
+#ifdef CONFIG_USE_CPCIDVI
+       if (device_id == PCI_DEVICE_ID_CT_69030) {
+               ctWrite (CT_MSR_W_O, 0x0b);
+               ctWrite (0x3cd, 0x13);
+               ctWrite_i (CT_FP_O, 0x02, 0x00);
+               ctWrite_i (CT_FP_O, 0x05, 0x00);
+               ctWrite_i (CT_FP_O, 0x06, 0x00);
+               ctWrite (0x3c2, 0x0b);
+               ctWrite_i (CT_FP_O, 0x02, 0x10);
+               ctWrite_i (CT_FP_O, 0x01, 0x09);
+       } else {
+               ctWrite (CT_MSR_W_O, 0x01);
+       }
+#else
        ctWrite (CT_MSR_W_O, 0x01);
+#endif
 
        /* set the extended Registers */
        ctLoadRegs (CT_XR_O, xreg);