6 #define GP_REG_COUNT    (0x7c / 4)
 
   7 #define DC_REG_COUNT    (0xf0 / 4)
 
   8 #define VP_REG_COUNT    (0x158 / 8)
 
   9 #define FP_REG_COUNT    (0x60 / 8)
 
  11 #define DC_PAL_COUNT    0x104
 
  12 #define DC_HFILT_COUNT  0x100
 
  13 #define DC_VFILT_COUNT  0x100
 
  14 #define VP_COEFF_SIZE   0x1000
 
  16 #define OUTPUT_CRT   0x01
 
  17 #define OUTPUT_PANEL 0x02
 
  22         void __iomem *gp_regs;
 
  23         void __iomem *dc_regs;
 
  24         void __iomem *vp_regs;
 
  28         /* register state, for power mgmt functionality */
 
  36         uint32_t gp[GP_REG_COUNT];
 
  37         uint32_t dc[DC_REG_COUNT];
 
  38         uint64_t vp[VP_REG_COUNT];
 
  39         uint64_t fp[FP_REG_COUNT];
 
  41         uint32_t pal[DC_PAL_COUNT];
 
  42         uint32_t hcoeff[DC_HFILT_COUNT * 2];
 
  43         uint32_t vcoeff[DC_VFILT_COUNT];
 
  44         uint32_t vp_coeff[VP_COEFF_SIZE / 4];
 
  48 static inline unsigned int lx_get_pitch(unsigned int xres, int bpp)
 
  50         return (((xres * (bpp >> 3)) + 7) & ~7);
 
  53 void lx_set_mode(struct fb_info *);
 
  54 unsigned int lx_framebuffer_size(void);
 
  55 int lx_blank_display(struct fb_info *, int);
 
  56 void lx_set_palette_reg(struct fb_info *, unsigned int, unsigned int,
 
  57                         unsigned int, unsigned int);
 
  60 int lx_powerdown(struct fb_info *info);
 
  61 int lx_powerup(struct fb_info *info);
 
  65 /* Graphics Processor registers (table 6-29 from the data book) */
 
 104         GP_INT_CNTRL, /* 0x78 */
 
 107 #define GP_BLT_STATUS_CE                (1 << 4)        /* cmd buf empty */
 
 108 #define GP_BLT_STATUS_PB                (1 << 0)        /* primative busy */
 
 111 /* Display Controller registers (table 6-47 from the data book) */
 
 180         DC_VID_EVEN_Y_ST_OFFSET,
 
 181         DC_VID_EVEN_U_ST_OFFSET,
 
 183         DC_VID_EVEN_V_ST_OFFSET,
 
 184         DC_V_ACTIVE_EVEN_TIMING,
 
 185         DC_V_BLANK_EVEN_TIMING,
 
 186         DC_V_SYNC_EVEN_TIMING,  /* 0xec */
 
 189 #define DC_UNLOCK_LOCK                  0x00000000
 
 190 #define DC_UNLOCK_UNLOCK                0x00004758      /* magic value */
 
 192 #define DC_GENERAL_CFG_FDTY             (1 << 17)
 
 193 #define DC_GENERAL_CFG_DFHPEL_SHIFT     (12)
 
 194 #define DC_GENERAL_CFG_DFHPSL_SHIFT     (8)
 
 195 #define DC_GENERAL_CFG_VGAE             (1 << 7)
 
 196 #define DC_GENERAL_CFG_DECE             (1 << 6)
 
 197 #define DC_GENERAL_CFG_CMPE             (1 << 5)
 
 198 #define DC_GENERAL_CFG_VIDE             (1 << 3)
 
 199 #define DC_GENERAL_CFG_DFLE             (1 << 0)
 
 201 #define DC_DISPLAY_CFG_VISL             (1 << 27)
 
 202 #define DC_DISPLAY_CFG_PALB             (1 << 25)
 
 203 #define DC_DISPLAY_CFG_DCEN             (1 << 24)
 
 204 #define DC_DISPLAY_CFG_DISP_MODE_24BPP  (1 << 9)
 
 205 #define DC_DISPLAY_CFG_DISP_MODE_16BPP  (1 << 8)
 
 206 #define DC_DISPLAY_CFG_DISP_MODE_8BPP   (0)
 
 207 #define DC_DISPLAY_CFG_TRUP             (1 << 6)
 
 208 #define DC_DISPLAY_CFG_VDEN             (1 << 4)
 
 209 #define DC_DISPLAY_CFG_GDEN             (1 << 3)
 
 210 #define DC_DISPLAY_CFG_TGEN             (1 << 0)
 
 212 #define DC_DV_TOP_DV_TOP_EN             (1 << 0)
 
 214 #define DC_DV_CTL_DV_LINE_SIZE          ((1 << 10) | (1 << 11))
 
 215 #define DC_DV_CTL_DV_LINE_SIZE_1K       (0)
 
 216 #define DC_DV_CTL_DV_LINE_SIZE_2K       (1 << 10)
 
 217 #define DC_DV_CTL_DV_LINE_SIZE_4K       (1 << 11)
 
 218 #define DC_DV_CTL_DV_LINE_SIZE_8K       ((1 << 10) | (1 << 11))
 
 219 #define DC_DV_CTL_CLEAR_DV_RAM          (1 << 0)
 
 221 #define DC_IRQ_FILT_CTL_H_FILT_SEL      (1 << 10)
 
 223 #define DC_CLR_KEY_CLR_KEY_EN           (1 << 24)
 
 225 #define DC_IRQ_VIP_VSYNC_IRQ_STATUS     (1 << 21)       /* undocumented? */
 
 226 #define DC_IRQ_STATUS                   (1 << 20)       /* undocumented? */
 
 227 #define DC_IRQ_VIP_VSYNC_LOSS_IRQ_MASK  (1 << 1)
 
 228 #define DC_IRQ_MASK                     (1 << 0)
 
 230 #define DC_GENLK_CTL_FLICK_SEL_MASK     (0x0F << 28)
 
 231 #define DC_GENLK_CTL_ALPHA_FLICK_EN     (1 << 25)
 
 232 #define DC_GENLK_CTL_FLICK_EN           (1 << 24)
 
 233 #define DC_GENLK_CTL_GENLK_EN           (1 << 18)
 
 237  * Video Processor registers (table 6-71).
 
 238  * There is space for 64 bit values, but we never use more than the
 
 239  * lower 32 bits.  The actual register save/restore code only bothers
 
 240  * to restore those 32 bits.
 
 308         VP_VCR = 0x1000, /* 0x1000 - 0x1fff */
 
 311 #define VP_VCFG_VID_EN                  (1 << 0)
 
 313 #define VP_DCFG_GV_GAM                  (1 << 21)
 
 314 #define VP_DCFG_PWR_SEQ_DELAY           ((1 << 17) | (1 << 18) | (1 << 19))
 
 315 #define VP_DCFG_PWR_SEQ_DELAY_DEFAULT   (1 << 19)       /* undocumented */
 
 316 #define VP_DCFG_CRT_SYNC_SKW            ((1 << 14) | (1 << 15) | (1 << 16))
 
 317 #define VP_DCFG_CRT_SYNC_SKW_DEFAULT    (1 << 16)
 
 318 #define VP_DCFG_CRT_VSYNC_POL           (1 << 9)
 
 319 #define VP_DCFG_CRT_HSYNC_POL           (1 << 8)
 
 320 #define VP_DCFG_DAC_BL_EN               (1 << 3)
 
 321 #define VP_DCFG_VSYNC_EN                (1 << 2)
 
 322 #define VP_DCFG_HSYNC_EN                (1 << 1)
 
 323 #define VP_DCFG_CRT_EN                  (1 << 0)
 
 325 #define VP_MISC_APWRDN                  (1 << 11)
 
 326 #define VP_MISC_DACPWRDN                (1 << 10)
 
 327 #define VP_MISC_BYP_BOTH                (1 << 0)
 
 331  * Flat Panel registers (table 6-71).
 
 332  * Also 64 bit registers; see above note about 32-bit handling.
 
 335 /* we're actually in the VP register space, starting at address 0x400 */
 
 336 #define VP_FP_START     0x400
 
 358 #define FP_PT2_SCRC                     (1 << 27)       /* shfclk free */
 
 360 #define FP_PM_P                         (1 << 24)       /* panel power ctl */
 
 361 #define FP_PM_PANEL_PWR_UP              (1 << 3)        /* r/o */
 
 362 #define FP_PM_PANEL_PWR_DOWN            (1 << 2)        /* r/o */
 
 363 #define FP_PM_PANEL_OFF                 (1 << 1)        /* r/o */
 
 364 #define FP_PM_PANEL_ON                  (1 << 0)        /* r/o */
 
 366 #define FP_DFC_BC                       ((1 << 4) | (1 << 5) | (1 << 6))
 
 369 /* register access functions */
 
 371 static inline uint32_t read_gp(struct lxfb_par *par, int reg)
 
 373         return readl(par->gp_regs + 4*reg);
 
 376 static inline void write_gp(struct lxfb_par *par, int reg, uint32_t val)
 
 378         writel(val, par->gp_regs + 4*reg);
 
 381 static inline uint32_t read_dc(struct lxfb_par *par, int reg)
 
 383         return readl(par->dc_regs + 4*reg);
 
 386 static inline void write_dc(struct lxfb_par *par, int reg, uint32_t val)
 
 388         writel(val, par->dc_regs + 4*reg);
 
 391 static inline uint32_t read_vp(struct lxfb_par *par, int reg)
 
 393         return readl(par->vp_regs + 8*reg);
 
 396 static inline void write_vp(struct lxfb_par *par, int reg, uint32_t val)
 
 398         writel(val, par->vp_regs + 8*reg);
 
 401 static inline uint32_t read_fp(struct lxfb_par *par, int reg)
 
 403         return readl(par->vp_regs + 8*reg + VP_FP_START);
 
 406 static inline void write_fp(struct lxfb_par *par, int reg, uint32_t val)
 
 408         writel(val, par->vp_regs + 8*reg + VP_FP_START);
 
 412 /* MSRs are defined in asm/geode.h; their bitfields are here */
 
 414 #define MSR_GLCP_DOTPLL_LOCK            (1 << 25)       /* r/o */
 
 415 #define MSR_GLCP_DOTPLL_HALFPIX         (1 << 24)
 
 416 #define MSR_GLCP_DOTPLL_BYPASS          (1 << 15)
 
 417 #define MSR_GLCP_DOTPLL_DOTRESET        (1 << 0)
 
 419 /* note: this is actually the VP's GLD_MSR_CONFIG */
 
 420 #define MSR_LX_GLD_MSR_CONFIG_FMT       ((1 << 3) | (1 << 4) | (1 << 5))
 
 421 #define MSR_LX_GLD_MSR_CONFIG_FMT_FP    (1 << 3)
 
 422 #define MSR_LX_GLD_MSR_CONFIG_FMT_CRT   (0)
 
 423 #define MSR_LX_GLD_MSR_CONFIG_FPC       (1 << 15)       /* FP *and* CRT */
 
 425 #define MSR_LX_MSR_PADSEL_TFT_SEL_LOW   0xDFFFFFFF      /* ??? */
 
 426 #define MSR_LX_MSR_PADSEL_TFT_SEL_HIGH  0x0000003F      /* ??? */
 
 428 #define MSR_LX_SPARE_MSR_DIS_CFIFO_HGO  (1 << 11)       /* undocumented */
 
 429 #define MSR_LX_SPARE_MSR_VFIFO_ARB_SEL  (1 << 10)       /* undocumented */
 
 430 #define MSR_LX_SPARE_MSR_WM_LPEN_OVRD   (1 << 9)        /* undocumented */
 
 431 #define MSR_LX_SPARE_MSR_LOAD_WM_LPEN_M (1 << 8)        /* undocumented */
 
 432 #define MSR_LX_SPARE_MSR_DIS_INIT_V_PRI (1 << 7)        /* undocumented */
 
 433 #define MSR_LX_SPARE_MSR_DIS_VIFO_WM    (1 << 6)
 
 434 #define MSR_LX_SPARE_MSR_DIS_CWD_CHECK  (1 << 5)        /* undocumented */
 
 435 #define MSR_LX_SPARE_MSR_PIX8_PAN_FIX   (1 << 4)        /* undocumented */
 
 436 #define MSR_LX_SPARE_MSR_FIRST_REQ_MASK (1 << 1)        /* undocumented */