]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/video/bfin_adv7393fb.h
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / video / bfin_adv7393fb.h
diff --git a/drivers/video/bfin_adv7393fb.h b/drivers/video/bfin_adv7393fb.h
new file mode 100644 (file)
index 0000000..8c7f9e4
--- /dev/null
@@ -0,0 +1,321 @@
+/*
+ * Frame buffer driver for ADV7393/2 video encoder
+ *
+ * Copyright 2006-2009 Analog Devices Inc.
+ * Licensed under the GPL-2 or late.
+ */
+
+#ifndef __BFIN_ADV7393FB_H__
+#define __BFIN_ADV7393FB_H__
+
+#define BFIN_LCD_NBR_PALETTE_ENTRIES   256
+
+#ifdef CONFIG_NTSC
+# define VMODE 0
+#endif
+#ifdef CONFIG_PAL
+# define VMODE 1
+#endif
+#ifdef CONFIG_NTSC_640x480
+# define VMODE 2
+#endif
+#ifdef CONFIG_PAL_640x480
+# define VMODE 3
+#endif
+#ifdef CONFIG_NTSC_YCBCR
+# define VMODE 4
+#endif
+#ifdef CONFIG_PAL_YCBCR
+# define VMODE 5
+#endif
+
+#ifndef VMODE
+# define VMODE 1
+#endif
+
+#ifdef CONFIG_ADV7393_2XMEM
+# define VMEM 2
+#else
+# define VMEM 1
+#endif
+
+#if defined(CONFIG_BF537) || defined(CONFIG_BF536) || defined(CONFIG_BF534)
+# define DMA_CFG_VAL   0x7935  /* Set Sync Bit */
+# define VB_DUMMY_MEMORY_SOURCE        L1_DATA_B_START
+#else
+# define DMA_CFG_VAL   0x7915
+# define VB_DUMMY_MEMORY_SOURCE        BOOT_ROM_START
+#endif
+
+enum {
+       DESTRUCT,
+       BUILD,
+};
+
+enum {
+       POWER_ON,
+       POWER_DOWN,
+       BLANK_ON,
+       BLANK_OFF,
+};
+
+#define DRIVER_NAME "bfin-adv7393"
+
+struct adv7393fb_modes {
+       const s8 name[25];      /* Full name */
+       u16 xres;               /* Active Horizonzal Pixels  */
+       u16 yres;               /* Active Vertical Pixels  */
+       u16 bpp;
+       u16 vmode;
+       u16 a_lines;            /* Active Lines per Field */
+       u16 vb1_lines;          /* Vertical Blanking Field 1 Lines */
+       u16 vb2_lines;          /* Vertical Blanking Field 2 Lines */
+       u16 tot_lines;          /* Total Lines per Frame */
+       u16 boeft_blank;        /* Before Odd/Even Field Transition No. of Blank Pixels */
+       u16 aoeft_blank;        /* After Odd/Even Field Transition No. of Blank Pixels */
+       const s8 *adv7393_i2c_initd;
+       u16 adv7393_i2c_initd_len;
+};
+
+static const u8 init_NTSC_TESTPATTERN[] = {
+       0x00, 0x1E,     /* Power up all DACs and PLL */
+       0x01, 0x00,     /* SD-Only Mode */
+       0x80, 0x10,     /* SSAF Luma Filter Enabled, NTSC Mode */
+       0x82, 0xCB,     /* Step control on, pixel data valid, pedestal on, PrPb SSAF on, CVBS/YC output */
+       0x84, 0x40,     /* SD Color Bar Test Pattern Enabled, DAC 2 = Luma, DAC 3 = Chroma */
+};
+
+static const u8 init_NTSC[] = {
+       0x00, 0x1E,     /* Power up all DACs and PLL */
+       0xC3, 0x26,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xC5, 0x12,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xC2, 0x4A,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xC6, 0x5E,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xBD, 0x19,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xBF, 0x42,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0x8C, 0x1F,     /* NTSC Subcarrier Frequency */
+       0x8D, 0x7C,     /* NTSC Subcarrier Frequency */
+       0x8E, 0xF0,     /* NTSC Subcarrier Frequency */
+       0x8F, 0x21,     /* NTSC Subcarrier Frequency */
+       0x01, 0x00,     /* SD-Only Mode */
+       0x80, 0x30,     /* SSAF Luma Filter Enabled, NTSC Mode */
+       0x82, 0x8B,     /* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
+       0x87, 0x80,     /* SD Color Bar Test Pattern Enabled, DAC 2 = Luma, DAC 3 = Chroma */
+       0x86, 0x82,
+       0x8B, 0x11,
+       0x88, 0x20,
+       0x8A, 0x0d,
+};
+
+static const u8 init_PAL[] = {
+       0x00, 0x1E,     /* Power up all DACs and PLL */
+       0xC3, 0x26,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xC5, 0x12,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xC2, 0x4A,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xC6, 0x5E,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xBD, 0x19,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0xBF, 0x42,     /* Program RGB->YCrCb Color Space convertion matrix */
+       0x8C, 0xCB,     /* PAL Subcarrier Frequency */
+       0x8D, 0x8A,     /* PAL Subcarrier Frequency */
+       0x8E, 0x09,     /* PAL Subcarrier Frequency */
+       0x8F, 0x2A,     /* PAL Subcarrier Frequency */
+       0x01, 0x00,     /* SD-Only Mode */
+       0x80, 0x11,     /* SSAF Luma Filter Enabled, PAL Mode */
+       0x82, 0x8B,     /* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
+       0x87, 0x80,     /* SD Color Bar Test Pattern Enabled, DAC 2 = Luma, DAC 3 = Chroma */
+       0x86, 0x82,
+       0x8B, 0x11,
+       0x88, 0x20,
+       0x8A, 0x0d,
+};
+
+static const u8 init_NTSC_YCbCr[] = {
+       0x00, 0x1E,     /* Power up all DACs and PLL */
+       0x8C, 0x1F,     /* NTSC Subcarrier Frequency */
+       0x8D, 0x7C,     /* NTSC Subcarrier Frequency */
+       0x8E, 0xF0,     /* NTSC Subcarrier Frequency */
+       0x8F, 0x21,     /* NTSC Subcarrier Frequency */
+       0x01, 0x00,     /* SD-Only Mode */
+       0x80, 0x30,     /* SSAF Luma Filter Enabled, NTSC Mode */
+       0x82, 0x8B,     /* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
+       0x87, 0x00,     /* DAC 2 = Luma, DAC 3 = Chroma */
+       0x86, 0x82,
+       0x8B, 0x11,
+       0x88, 0x08,
+       0x8A, 0x0d,
+};
+
+static const u8 init_PAL_YCbCr[] = {
+       0x00, 0x1E,     /* Power up all DACs and PLL */
+       0x8C, 0xCB,     /* PAL Subcarrier Frequency */
+       0x8D, 0x8A,     /* PAL Subcarrier Frequency */
+       0x8E, 0x09,     /* PAL Subcarrier Frequency */
+       0x8F, 0x2A,     /* PAL Subcarrier Frequency */
+       0x01, 0x00,     /* SD-Only Mode */
+       0x80, 0x11,     /* SSAF Luma Filter Enabled, PAL Mode */
+       0x82, 0x8B,     /* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
+       0x87, 0x00,     /* DAC 2 = Luma, DAC 3 = Chroma */
+       0x86, 0x82,
+       0x8B, 0x11,
+       0x88, 0x08,
+       0x8A, 0x0d,
+};
+
+static struct adv7393fb_modes known_modes[] = {
+       /* NTSC 720x480 CRT */
+       {
+               .name = "NTSC 720x480",
+               .xres = 720,
+               .yres = 480,
+               .bpp = 16,
+               .vmode = FB_VMODE_INTERLACED,
+               .a_lines = 240,
+               .vb1_lines = 22,
+               .vb2_lines = 23,
+               .tot_lines = 525,
+               .boeft_blank = 16,
+               .aoeft_blank = 122,
+               .adv7393_i2c_initd = init_NTSC,
+               .adv7393_i2c_initd_len = sizeof(init_NTSC)
+       },
+       /* PAL 720x480 CRT */
+       {
+               .name = "PAL 720x576",
+               .xres = 720,
+               .yres = 576,
+               .bpp = 16,
+               .vmode = FB_VMODE_INTERLACED,
+               .a_lines = 288,
+               .vb1_lines = 24,
+               .vb2_lines = 25,
+               .tot_lines = 625,
+               .boeft_blank = 12,
+               .aoeft_blank = 132,
+               .adv7393_i2c_initd = init_PAL,
+               .adv7393_i2c_initd_len = sizeof(init_PAL)
+       },
+       /* NTSC 640x480 CRT Experimental */
+       {
+               .name = "NTSC 640x480",
+               .xres = 640,
+               .yres = 480,
+               .bpp = 16,
+               .vmode = FB_VMODE_INTERLACED,
+               .a_lines = 240,
+               .vb1_lines = 22,
+               .vb2_lines = 23,
+               .tot_lines = 525,
+               .boeft_blank = 16 + 40,
+               .aoeft_blank = 122 + 40,
+               .adv7393_i2c_initd = init_NTSC,
+               .adv7393_i2c_initd_len = sizeof(init_NTSC)
+       },
+       /* PAL 640x480 CRT Experimental */
+       {
+               .name = "PAL 640x480",
+               .xres = 640,
+               .yres = 480,
+               .bpp = 16,
+               .vmode = FB_VMODE_INTERLACED,
+               .a_lines = 288 - 20,
+               .vb1_lines = 24 + 20,
+               .vb2_lines = 25 + 20,
+               .tot_lines = 625,
+               .boeft_blank = 12 + 40,
+               .aoeft_blank = 132 + 40,
+               .adv7393_i2c_initd = init_PAL,
+               .adv7393_i2c_initd_len = sizeof(init_PAL)
+       },
+       /* NTSC 720x480 YCbCR */
+       {
+               .name = "NTSC 720x480 YCbCR",
+               .xres = 720,
+               .yres = 480,
+               .bpp = 16,
+               .vmode = FB_VMODE_INTERLACED,
+               .a_lines = 240,
+               .vb1_lines = 22,
+               .vb2_lines = 23,
+               .tot_lines = 525,
+               .boeft_blank = 16,
+               .aoeft_blank = 122,
+               .adv7393_i2c_initd = init_NTSC_YCbCr,
+               .adv7393_i2c_initd_len = sizeof(init_NTSC_YCbCr)
+       },
+       /* PAL 720x480 CRT */
+       {
+               .name = "PAL 720x576 YCbCR",
+               .xres = 720,
+               .yres = 576,
+               .bpp = 16,
+               .vmode = FB_VMODE_INTERLACED,
+               .a_lines = 288,
+               .vb1_lines = 24,
+               .vb2_lines = 25,
+               .tot_lines = 625,
+               .boeft_blank = 12,
+               .aoeft_blank = 132,
+               .adv7393_i2c_initd = init_PAL_YCbCr,
+               .adv7393_i2c_initd_len = sizeof(init_PAL_YCbCr)
+       }
+};
+
+struct adv7393fb_regs {
+
+};
+
+struct adv7393fb_device {
+       struct fb_info info;    /* FB driver info record */
+
+       struct i2c_client *client;
+
+       struct dmasg *descriptor_list_head;
+       struct dmasg *vb1;
+       struct dmasg *av1;
+       struct dmasg *vb2;
+       struct dmasg *av2;
+
+       dma_addr_t dma_handle;
+
+       struct fb_info bfin_adv7393_fb;
+
+       struct adv7393fb_modes *modes;
+
+       struct adv7393fb_regs *regs;    /* Registers memory map */
+       size_t regs_len;
+       size_t fb_len;
+       size_t line_len;
+       u16 open;
+       u16 *fb_mem;            /* RGB Buffer */
+
+};
+
+#define to_adv7393fb_device(_info) \
+         (_info ? container_of(_info, struct adv7393fb_device, info) : NULL);
+
+static int bfin_adv7393_fb_open(struct fb_info *info, int user);
+static int bfin_adv7393_fb_release(struct fb_info *info, int user);
+static int bfin_adv7393_fb_check_var(struct fb_var_screeninfo *var,
+                                    struct fb_info *info);
+
+static int bfin_adv7393_fb_pan_display(struct fb_var_screeninfo *var,
+                                      struct fb_info *info);
+
+static int bfin_adv7393_fb_blank(int blank, struct fb_info *info);
+
+static void bfin_config_ppi(struct adv7393fb_device *fbdev);
+static int bfin_config_dma(struct adv7393fb_device *fbdev);
+static void bfin_disable_dma(void);
+static void bfin_enable_ppi(void);
+static void bfin_disable_ppi(void);
+
+static inline int adv7393_write(struct i2c_client *client, u8 reg, u8 value);
+static inline int adv7393_read(struct i2c_client *client, u8 reg);
+static int adv7393_write_block(struct i2c_client *client, const u8 *data,
+                              unsigned int len);
+
+int bfin_adv7393_fb_cursor(struct fb_info *info, struct fb_cursor *cursor);
+static int bfin_adv7393_fb_setcolreg(u_int, u_int, u_int, u_int,
+                                    u_int, struct fb_info *info);
+
+#endif