X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Fvideo%2Frockchip%2Fhdmi%2Frk_hdmi_lcdc.c;h=f41a73a19fabebf9060cf998fc55229fd58f667b;hb=e0c93ffd0ad917e2614f9ed895f1c7643ba266c4;hp=7fe7787bccb03e997432f6bd289ef92a6b5fb38a;hpb=2ffcdebe6d71b6d89422d7b5ac66e0823a4a65b6;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c b/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c index 7fe7787bccb0..f41a73a19fab 100755 --- a/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c +++ b/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c @@ -8,56 +8,74 @@ #define SWAP_RB 0 #define LCD_ACLK 800000000 -static const struct fb_videomode hdmi_mode [] = { - //name refresh xres yres pixclock h_bp h_fp v_bp v_fp h_pw v_pw polariry PorI flag(used for vic) -//{ "640x480p@60Hz", 60, 640, 480, 25175000, 48, 16, 33, 10, 96, 2, 0, 0, 1 }, -//{ "720x480i@60Hz", 60, 720, 480, 27000000, 114, 38, 15, 4, 124, 3, 0, 1, 6 }, -//{ "720x576i@50Hz", 50, 720, 576, 27000000, 138, 24, 19, 2, 126, 3, 0, 1, 21 }, -{ "720x480p@60Hz", 60, 720, 480, 27000000, 60, 16, 30, 9, 62, 6, 0, 0, 2 }, -{ "720x576p@50Hz", 50, 720, 576, 27000000, 68, 12, 39, 5, 64, 5, 0, 0, 17 }, -//{ "1280x720p@24Hz", 24, 1280, 720, 59400000, 220, 1760, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 60 }, -//{ "1280x720p@25Hz", 25, 1280, 720, 74250000, 220, 2420, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 61 }, -//{ "1280x720p@30Hz", 30, 1280, 720, 74250000, 220, 1760, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 62 }, -{ "1280x720p@50Hz", 50, 1280, 720, 74250000, 220, 440, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 19 }, -{ "1280x720p@60Hz", 60, 1280, 720, 74250000, 220, 110, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 4 }, -//{ "1920x1080p@24Hz", 24, 1920, 1080, 74250000, 148, 638, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 32 }, -//{ "1920x1080p@25Hz", 25, 1920, 1080, 74250000, 148, 528, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 33 }, -//{ "1920x1080p@30Hz", 30, 1920, 1080, 74250000, 148, 88, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 34 }, -//{ "1920x1080i@50Hz_2", 50, 1920, 1080, 72000000, 184, 32, 57, 23, 168, 5, FB_SYNC_HOR_HIGH_ACT, 1, 39 }, -//{ "1920x1080i@50Hz", 50, 1920, 1080, 74250000, 148, 528, 15, 2, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 1, 20 }, -//{ "1920x1080i@60Hz", 60, 1920, 1080, 74250000, 148, 88, 15, 2, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 1, 5 }, -{ "1920x1080p@50Hz", 50, 1920, 1080, 148500000, 148, 528, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 31 }, -{ "1920x1080p@60Hz", 60, 1920, 1080, 148500000, 148, 88, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 16 }, +struct hdmi *m_hdmi_drv; + +static const struct fb_videomode hdmi_mode[] = { + /* name refresh xres yres pixclock h_bp h_fp v_bp v_fp h_pw v_pw polariry PorI flag(used for vic) */ +/* + {"640x480p@60Hz", 60, 640, 480, 25175000, 48, 16, 33, 10, 96, 2, 0, 0, 1 }, +*/ + {"720x480i@60Hz", 60, 720, 480, 27000000, 57, 19, 15, 4, 62, 3, 0, 1, 6 }, + {"720x576i@50Hz", 50, 720, 576, 27000000, 69, 12, 19, 2, 63, 3, 0, 1, 21}, + {"720x480p@60Hz", 60, 720, 480, 27000000, 60, 16, 30, 9, 62, 6, 0, 0, 2 }, + {"720x576p@50Hz", 50, 720, 576, 27000000, 68, 12, 39, 5, 64, 5, 0, 0, 17}, +/* + {"1280x720p@24Hz", 24, 1280, 720, 59400000, 220, 1760, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 60}, + {"1280x720p@25Hz", 25, 1280, 720, 74250000, 220, 2420, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 61}, + {"1280x720p@30Hz", 30, 1280, 720, 74250000, 220, 1760, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 62}, +*/ + {"1280x720p@50Hz", 50, 1280, 720, 74250000, 220, 440, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 19}, + {"1280x720p@60Hz", 60, 1280, 720, 74250000, 220, 110, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 4 }, +/* + {"1920x1080p@24Hz", 24, 1920, 1080, 74250000, 148, 638, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 32}, + {"1920x1080p@25Hz", 25, 1920, 1080, 74250000, 148, 528, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 33}, + {"1920x1080p@30Hz", 30, 1920, 1080, 74250000, 148, 88, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 34}, + {"1920x1080i@50Hz_2", 50, 1920, 1080, 72000000, 184, 32, 57, 23, 168, 5, FB_SYNC_HOR_HIGH_ACT, 1, 39}, +*/ + {"1920x1080i@50Hz", 50, 1920, 1080, 74250000, 148, 528, 15, 2, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 1, 20}, + {"1920x1080i@60Hz", 60, 1920, 1080, 74250000, 148, 88, 15, 2, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 1, 5 }, + {"1920x1080p@50Hz", 50, 1920, 1080, 148500000, 148, 528, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 31}, + {"1920x1080p@60Hz", 60, 1920, 1080, 148500000, 148, 88, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 16}, /* -{ "1440x288p@50Hz", 50, 720, 480, 27000000, 138, 24, 19, 2, 126, 3, 0, 0, 23 }, -{ "2880x576i@50Hz", 50, 1440, 240, 54000000, 276, 48, 19, 2, 252, 3, 0, 1, 25 }, -{ "2880x288p@50Hz", 50, 2880, 480, 54000000, 276, 48, 19, 3, 252, 3, 0, 0, 27 }, -{ "1440x576p@50Hz", 50, 2880, 480, 54000000, 136, 24, 39, 5, 128, 5, 0, 0, 29 }, -{ "2880x576p@50Hz", 50, 1920, 1080, 108000000, 272, 48, 39, 5, 256, 5, 0, 0, 37 }, -{ "1440x240p@60Hz", 60, 1440, 240, 27000000, 114, 38, 15, 4, 124, 3, 0, 0, 8 }, -{ "2880x480i@60Hz", 60, 2880, 480, 54000000, 228, 76, 15, 4, 248, 3, 0, 1, 10 }, -{ "2880x480p@60Hz", 60, 2880, 480, 54000000, 228, 76, 15, 4, 248, 3, 0, 0, 12 }, -{ "1440x480p@60Hz", 60, 1440, 480, 54000000, 120, 32, 30, 9, 124, 6, 0, 0, 14 }, -{ "2880x480p@60Hz", 60, 2880, 480, 54000000, 240, 64, 30, 9, 248, 6, 0, 0, 35 }, - -{ "1920x1080i@100Hz", 100, 1920, 1080, 148500000, 148, 528, 15, 2, 44, 5, 1, 1, 40 }, -{ "1280x720p@100Hz", 100, 1280, 720, 148500000, 220, 440, 20, 5, 40, 5, 1, 0, 41 }, -{ "720x576p@100Hz", 100, 720, 576, 54000000, 68, 12, 39, 5, 64, 5, 0, 0, 42 }, -{ "1440x576i@100Hz", 100, 1440, 576, 54000000, 138, 24, 19, 2, 12, 3, 0, 1, 44 }, -{ "1920x1080p@100Hz", 100, 1920, 1080, 297000000, 148, 528, 36, 4, 44, 5, 1, 0, 64 }, - -{ "1920x1080i@120Hz", 120, 1920, 1080, 148500000, 148, 88, 15, 2, 44, 5, 1, 1, 46 }, -{ "1280x720p@120Hz", 120, 1280, 720, 148500000, 220, 110, 20, 5, 40, 5, 1, 0, 47 }, -{ "720x480p@120Hz", 120, 720, 480, 54000000, 60, 16, 30, 9, 62, 6, 0, 0, 48 }, -{ "1440x480i@120Hz", 120, 1440, 480, 54000000, 114, 38, 15, 4, 12, 3, 0, 1, 50 }, -{ "1920x1080p@120Hz", 120, 1920, 1080, 297000000, 148, 88, 36, 4, 44, 5, 1, 0, 63 }, - -{ "720x576p@200Hz", 200, 720, 576, 108000000, 68, 12, 39, 5, 64, 5, 0, 0, 52 }, -{ "1440x576i@200Hz", 200, 1920, 1080, 108000000, 138, 24, 19, 2, 12, 3, 0, 1, 54 }, - -{ "720x480p@240Hz", 240, 720, 480, 108000000, 60, 16, 30, 9, 62, 6, 0, 0, 56 }, -{ "1440x480i@240Hz", 240, 1440, 480, 108000000, 114, 38, 15, 4, 12, 3, 0, 1, 58 }, + {"1440x288p@50Hz", 50, 720, 480, 27000000, 138, 24, 19, 2, 126, 3, 0, 0, 23}, + {"2880x576i@50Hz", 50, 1440, 240, 54000000, 276, 48, 19, 2, 252, 3, 0, 1, 25}, + {"2880x288p@50Hz", 50, 2880, 480, 54000000, 276, 48, 19, 3, 252, 3, 0, 0, 27}, + {"1440x576p@50Hz", 50, 2880, 480, 54000000, 136, 24, 39, 5, 128, 5, 0, 0, 29}, + {"2880x576p@50Hz", 50, 1920, 1080, 108000000, 272, 48, 39, 5, 256, 5, 0, 0, 37}, + {"1440x240p@60Hz", 60, 1440, 240, 27000000, 114, 38, 15, 4, 124, 3, 0, 0, 8 }, + {"2880x480i@60Hz", 60, 2880, 480, 54000000, 228, 76, 15, 4, 248, 3, 0, 1, 10}, + {"2880x480p@60Hz", 60, 2880, 480, 54000000, 228, 76, 15, 4, 248, 3, 0, 0, 12}, + {"1440x480p@60Hz", 60, 1440, 480, 54000000, 120, 32, 30, 9, 124, 6, 0, 0, 14}, + {"2880x480p@60Hz", 60, 2880, 480, 54000000, 240, 64, 30, 9, 248, 6, 0, 0, 35}, + + {"1920x1080i@100Hz", 100, 1920, 1080, 148500000, 148, 528, 15, 2, 44, 5, 1, 1, 40}, + {"1280x720p@100Hz", 100, 1280, 720, 148500000, 220, 440, 20, 5, 40, 5, 1, 0, 41}, + {"720x576p@100Hz", 100, 720, 576, 54000000, 68, 12, 39, 5, 64, 5, 0, 0, 42}, + {"1440x576i@100Hz", 100, 1440, 576, 54000000, 138, 24, 19, 2, 12, 3, 0, 1, 44}, + {"1920x1080p@100Hz", 100, 1920, 1080, 297000000, 148, 528, 36, 4, 44, 5, 1, 0, 64}, + + {"1920x1080i@120Hz", 120, 1920, 1080, 148500000, 148, 88, 15, 2, 44, 5, 1, 1, 46}, + {"1280x720p@120Hz", 120, 1280, 720, 148500000, 220, 110, 20, 5, 40, 5, 1, 0, 47}, + {"720x480p@120Hz", 120, 720, 480, 54000000, 60, 16, 30, 9, 62, 6, 0, 0, 48}, + {"1440x480i@120Hz", 120, 1440, 480, 54000000, 114, 38, 15, 4, 12, 3, 0, 1, 50}, + {"1920x1080p@120Hz", 120, 1920, 1080, 297000000, 148, 88, 36, 4, 44, 5, 1, 0, 63}, + + {"720x576p@200Hz", 200, 720, 576, 108000000, 68, 12, 39, 5, 64, 5, 0, 0, 52}, + {"1440x576i@200Hz", 200, 1920, 1080, 108000000, 138, 24, 19, 2, 12, 3, 0, 1, 54}, + + {"720x480p@240Hz", 240, 720, 480, 108000000, 60, 16, 30, 9, 62, 6, 0, 0, 56}, + {"1440x480i@240Hz", 240, 1440, 480, 108000000, 114, 38, 15, 4, 12, 3, 0, 1, 58}, */ + {"3840x2160p@24Hz", 24, 3840, 2160, 297000000, 296, 1276, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 93}, + {"3840x2160p@25Hz", 25, 3840, 2160, 297000000, 296, 1056, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 94}, + {"3840x2160p@30Hz", 30, 3840, 2160, 297000000, 296, 176, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 95}, + {"3840x2160p@50Hz", 50, 3840, 2160, 594000000, 296, 1056, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 96}, + {"3840x2160p@60Hz", 60, 3840, 2160, 594000000, 296, 176, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 97}, + {"4096x2160p@24Hz", 24, 4096, 2160, 297000000, 296, 1020, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 98}, + {"4096x2160p@25Hz", 25, 4096, 2160, 297000000, 128, 968, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 99}, + {"4096x2160p@30Hz", 30, 4096, 2160, 297000000, 128, 88, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 100}, + {"4096x2160p@50Hz", 50, 4096, 2160, 594000000, 128, 968, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 101}, + {"4096x2160p@60Hz", 60, 4096, 2160, 594000000, 128, 88, 72, 8, 88, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 102}, }; @@ -68,55 +86,59 @@ void hdmi_init_lcdc(struct rk_screen *screen, struct rk29lcd_info *lcd_info) int hdmi_set_info(struct rk_screen *screen, unsigned int vic) { - int i; - - if(screen == NULL) - return -1; - - if(vic == 0) - vic = HDMI_VIDEO_DEFAULT_MODE; - - for(i = 0; i < ARRAY_SIZE(hdmi_mode); i++) - { - if(hdmi_mode[i].flag == vic) - break; - } - if(i == ARRAY_SIZE(hdmi_mode)) - return -1; - - memset(screen, 0, sizeof(struct rk_screen)); - - /* screen type & face */ - screen->type = OUT_TYPE; - screen->face = OUT_FACE; - - /* Screen size */ - screen->mode.xres = hdmi_mode[i].xres; - screen->mode.yres = hdmi_mode[i].yres; - - /* Timing */ - screen->mode.pixclock = hdmi_mode[i].pixclock; - screen->mode.refresh = hdmi_mode[i].refresh; - //screen->lcdc_aclk = LCD_ACLK; + int i; + + if (screen == NULL) + return -1; + + if (vic == 0) + vic = HDMI_VIDEO_DEFAULT_MODE; + + for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { + if (hdmi_mode[i].flag == vic) + break; + } + if (i == ARRAY_SIZE(hdmi_mode)) + return -1; + + memset(screen, 0, sizeof(struct rk_screen)); + + /* screen type & face */ + screen->type = OUT_TYPE; + screen->face = OUT_FACE; + screen->color_mode = COLOR_YCBCR; + + /* Screen size */ + screen->mode.xres = hdmi_mode[i].xres; + screen->mode.yres = hdmi_mode[i].yres; + + /* Timing */ + screen->mode.pixclock = hdmi_mode[i].pixclock; + screen->mode.refresh = hdmi_mode[i].refresh; + /* screen->lcdc_aclk = LCD_ACLK; */ screen->mode.left_margin = hdmi_mode[i].left_margin; screen->mode.right_margin = hdmi_mode[i].right_margin; screen->mode.hsync_len = hdmi_mode[i].hsync_len; screen->mode.upper_margin = hdmi_mode[i].upper_margin; screen->mode.lower_margin = hdmi_mode[i].lower_margin; screen->mode.vsync_len = hdmi_mode[i].vsync_len; + screen->mode.vmode = hdmi_mode[i].vmode; screen->hdmi_resolution = hdmi_mode[i].flag; + if ((screen->hdmi_resolution == HDMI_720X480I_60HZ_VIC) || + (screen->hdmi_resolution == HDMI_720X576I_50HZ_VIC)) + screen->pixelrepeat = 1; /* Pin polarity */ #if defined(CONFIG_HDMI_RK616) && !defined(CONFIG_ARCH_RK3026) screen->pin_hsync = 0; screen->pin_vsync = 0; -#else +#else screen->pin_hsync = 0; - if(FB_SYNC_HOR_HIGH_ACT & hdmi_mode[i].sync) + if (FB_SYNC_HOR_HIGH_ACT & hdmi_mode[i].sync) screen->pin_hsync = 1; else screen->pin_hsync = 0; - if(FB_SYNC_VERT_HIGH_ACT & hdmi_mode[i].sync) + if (FB_SYNC_VERT_HIGH_ACT & hdmi_mode[i].sync) screen->pin_vsync = 1; else screen->pin_vsync = 0; @@ -125,19 +147,38 @@ int hdmi_set_info(struct rk_screen *screen, unsigned int vic) screen->pin_dclk = DCLK_POL; /* Swap rule */ - screen->swap_rb = SWAP_RB; - screen->swap_rg = 0; - screen->swap_gb = 0; - screen->swap_delta = 0; - screen->swap_dumy = 0; - - /* Operation function*/ - screen->init = NULL; - screen->standby = NULL; - - return 0; + screen->swap_rb = SWAP_RB; + screen->swap_rg = 0; + screen->swap_gb = 0; + screen->swap_delta = 0; + screen->swap_dumy = 0; + + /* Operation function */ + screen->init = NULL; + screen->standby = NULL; + + /* Init Default Overscan Value: + * TODO modify the value according to your need adjust value + */ + switch (vic) { + case 16: /* 1080p-60Hz */ + screen->overscan.left = 97; + screen->overscan.top = 97; + screen->overscan.right = 97; + screen->overscan.bottom = 97; + break; + default: + screen->overscan.left = 96; + screen->overscan.top = 96; + screen->overscan.right = 96; + screen->overscan.bottom = 96; + break; + } + + return 0; } +#ifdef HDMI_DEBUG static void hdmi_show_sink_info(struct hdmi *hdmi) { struct list_head *pos, *head = &hdmi->edid.modelist; @@ -147,91 +188,90 @@ static void hdmi_show_sink_info(struct hdmi *hdmi) struct hdmi_audio *audio; hdmi_dbg(hdmi->dev, "******** Show Sink Info ********\n"); - hdmi_dbg(hdmi->dev, "Support video mode: \n"); + hdmi_dbg(hdmi->dev, "Support video mode:\n"); list_for_each(pos, head) { modelist = list_entry(pos, struct fb_modelist, list); m = &modelist->mode; hdmi_dbg(hdmi->dev, " %s.\n", m->name); } - - for(i = 0; i < hdmi->edid.audio_num; i++) - { + + for (i = 0; i < hdmi->edid.audio_num; i++) { audio = &(hdmi->edid.audio[i]); - switch(audio->type) - { - case HDMI_AUDIO_LPCM: - hdmi_dbg(hdmi->dev, "Support audio type: LPCM\n"); - break; - case HDMI_AUDIO_AC3: - hdmi_dbg(hdmi->dev, "Support audio type: AC3\n"); - break; - case HDMI_AUDIO_MPEG1: - hdmi_dbg(hdmi->dev, "Support audio type: MPEG1\n"); - break; - case HDMI_AUDIO_MP3: - hdmi_dbg(hdmi->dev, "Support audio type: MP3\n"); - break; - case HDMI_AUDIO_MPEG2: - hdmi_dbg(hdmi->dev, "Support audio type: MPEG2\n"); - break; - case HDMI_AUDIO_AAC_LC: - hdmi_dbg(hdmi->dev, "Support audio type: AAC\n"); - break; - case HDMI_AUDIO_DTS: - hdmi_dbg(hdmi->dev, "Support audio type: DTS\n"); - break; - case HDMI_AUDIO_ATARC: - hdmi_dbg(hdmi->dev, "Support audio type: ATARC\n"); - break; - case HDMI_AUDIO_DSD: - hdmi_dbg(hdmi->dev, "Support audio type: DSD\n"); - break; - case HDMI_AUDIO_E_AC3: - hdmi_dbg(hdmi->dev, "Support audio type: E-AC3\n"); - break; - case HDMI_AUDIO_DTS_HD: - hdmi_dbg(hdmi->dev, "Support audio type: DTS-HD\n"); - break; - case HDMI_AUDIO_MLP: - hdmi_dbg(hdmi->dev, "Support audio type: MLP\n"); - break; - case HDMI_AUDIO_DST: - hdmi_dbg(hdmi->dev, "Support audio type: DST\n"); - break; - case HDMI_AUDIO_WMA_PRO: - hdmi_dbg(hdmi->dev, "Support audio type: WMP-PRO\n"); - break; - default: - hdmi_dbg(hdmi->dev, "Support audio type: Unkown\n"); - break; + switch (audio->type) { + case HDMI_AUDIO_LPCM: + hdmi_dbg(hdmi->dev, "Support audio type: LPCM\n"); + break; + case HDMI_AUDIO_AC3: + hdmi_dbg(hdmi->dev, "Support audio type: AC3\n"); + break; + case HDMI_AUDIO_MPEG1: + hdmi_dbg(hdmi->dev, "Support audio type: MPEG1\n"); + break; + case HDMI_AUDIO_MP3: + hdmi_dbg(hdmi->dev, "Support audio type: MP3\n"); + break; + case HDMI_AUDIO_MPEG2: + hdmi_dbg(hdmi->dev, "Support audio type: MPEG2\n"); + break; + case HDMI_AUDIO_AAC_LC: + hdmi_dbg(hdmi->dev, "Support audio type: AAC\n"); + break; + case HDMI_AUDIO_DTS: + hdmi_dbg(hdmi->dev, "Support audio type: DTS\n"); + break; + case HDMI_AUDIO_ATARC: + hdmi_dbg(hdmi->dev, "Support audio type: ATARC\n"); + break; + case HDMI_AUDIO_DSD: + hdmi_dbg(hdmi->dev, "Support audio type: DSD\n"); + break; + case HDMI_AUDIO_E_AC3: + hdmi_dbg(hdmi->dev, "Support audio type: E-AC3\n"); + break; + case HDMI_AUDIO_DTS_HD: + hdmi_dbg(hdmi->dev, "Support audio type: DTS-HD\n"); + break; + case HDMI_AUDIO_MLP: + hdmi_dbg(hdmi->dev, "Support audio type: MLP\n"); + break; + case HDMI_AUDIO_DST: + hdmi_dbg(hdmi->dev, "Support audio type: DST\n"); + break; + case HDMI_AUDIO_WMA_PRO: + hdmi_dbg(hdmi->dev, "Support audio type: WMP-PRO\n"); + break; + default: + hdmi_dbg(hdmi->dev, "Support audio type: Unkown\n"); + break; } - - hdmi_dbg(hdmi->dev, "Support audio sample rate: \n"); - if(audio->rate & HDMI_AUDIO_FS_32000) + + hdmi_dbg(hdmi->dev, "Support audio sample rate:\n"); + if (audio->rate & HDMI_AUDIO_FS_32000) hdmi_dbg(hdmi->dev, " 32000\n"); - if(audio->rate & HDMI_AUDIO_FS_44100) + if (audio->rate & HDMI_AUDIO_FS_44100) hdmi_dbg(hdmi->dev, " 44100\n"); - if(audio->rate & HDMI_AUDIO_FS_48000) + if (audio->rate & HDMI_AUDIO_FS_48000) hdmi_dbg(hdmi->dev, " 48000\n"); - if(audio->rate & HDMI_AUDIO_FS_88200) + if (audio->rate & HDMI_AUDIO_FS_88200) hdmi_dbg(hdmi->dev, " 88200\n"); - if(audio->rate & HDMI_AUDIO_FS_96000) + if (audio->rate & HDMI_AUDIO_FS_96000) hdmi_dbg(hdmi->dev, " 96000\n"); - if(audio->rate & HDMI_AUDIO_FS_176400) + if (audio->rate & HDMI_AUDIO_FS_176400) hdmi_dbg(hdmi->dev, " 176400\n"); - if(audio->rate & HDMI_AUDIO_FS_192000) + if (audio->rate & HDMI_AUDIO_FS_192000) hdmi_dbg(hdmi->dev, " 192000\n"); - - hdmi_dbg(hdmi->dev, "Support audio word lenght: \n"); - if(audio->rate & HDMI_AUDIO_WORD_LENGTH_16bit) + + hdmi_dbg(hdmi->dev, "Support audio word lenght:\n"); + if (audio->rate & HDMI_AUDIO_WORD_LENGTH_16bit) hdmi_dbg(hdmi->dev, " 16bit\n"); - if(audio->rate & HDMI_AUDIO_WORD_LENGTH_20bit) + if (audio->rate & HDMI_AUDIO_WORD_LENGTH_20bit) hdmi_dbg(hdmi->dev, " 20bit\n"); - if(audio->rate & HDMI_AUDIO_WORD_LENGTH_24bit) + if (audio->rate & HDMI_AUDIO_WORD_LENGTH_24bit) hdmi_dbg(hdmi->dev, " 24bit\n"); } hdmi_dbg(hdmi->dev, "******** Show Sink Info ********\n"); } +#endif /** * hdmi_ouputmode_select - select hdmi transmitter output mode: hdmi or dvi? @@ -241,68 +281,73 @@ static void hdmi_show_sink_info(struct hdmi *hdmi) int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok) { struct list_head *head = &hdmi->edid.modelist; - struct fb_monspecs *specs = hdmi->edid.specs; + struct fb_monspecs *specs = hdmi->edid.specs; struct fb_videomode *modedb = NULL; int i, pixclock; - - if(edid_ok != HDMI_ERROR_SUCESS) { - dev_err(hdmi->dev, "warning: EDID error, assume sink as HDMI and asume minitor support audio output!!!!"); + + if (edid_ok != HDMI_ERROR_SUCESS) { + dev_err(hdmi->dev, + "warning: EDID error, assume sink as HDMI and asume minitor support audio output!!!!"); hdmi->edid.sink_hdmi = 1; - //if edid error,asume monitor support audio output. + /* if edid error,asume monitor support audio output */ hdmi->edid.base_audio_support = 1; } - if(edid_ok != HDMI_ERROR_SUCESS) { + if (edid_ok != HDMI_ERROR_SUCESS) { hdmi->edid.ycbcr444 = 0; hdmi->edid.ycbcr422 = 0; hdmi->autoconfig = HDMI_DISABLE; } - if(head->next == head) { - dev_info(hdmi->dev, "warning: no CEA video mode parsed from EDID !!!!"); - // If EDID get error, list all system supported mode. - // If output mode is set to DVI and EDID is ok, check - // the output timing. - - if(hdmi->edid.sink_hdmi == 0 && specs && specs->modedb_len) { + if (head->next == head) { + dev_info(hdmi->dev, + "warning: no CEA video mode parsed from EDID !!!!"); + /* If EDID get error, list all system supported mode. + * If output mode is set to DVI and EDID is ok, check + * the output timing. + */ + + if (hdmi->edid.sink_hdmi == 0 && specs && specs->modedb_len) { /* Get max resolution timing */ modedb = &specs->modedb[0]; for (i = 0; i < specs->modedb_len; i++) { - if(specs->modedb[i].xres > modedb->xres) + if (specs->modedb[i].xres > modedb->xres) modedb = &specs->modedb[i]; - else if(specs->modedb[i].yres > modedb->yres) + else if (specs->modedb[i].yres > modedb->yres) modedb = &specs->modedb[i]; } - // For some monitor, the max pixclock read from EDID is smaller - // than the clock of max resolution mode supported. We fix it. + /* For some monitor, the max pixclock read from EDID + * is smaller than the clock of + * max resolution mode supported. + */ pixclock = PICOS2KHZ(modedb->pixclock); pixclock /= 250; pixclock *= 250; pixclock *= 1000; - if(pixclock == 148250000) + if (pixclock == 148250000) pixclock = 148500000; - if(pixclock > specs->dclkmax) + if (pixclock > specs->dclkmax) specs->dclkmax = pixclock; } - - for(i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { - if(modedb) { - if( (hdmi_mode[i].pixclock < specs->dclkmin) || - (hdmi_mode[i].pixclock > specs->dclkmax) || - (hdmi_mode[i].refresh < specs->vfmin) || - (hdmi_mode[i].refresh > specs->vfmax) || - (hdmi_mode[i].xres > modedb->xres) || - (hdmi_mode[i].yres > modedb->yres) ) - continue; + + for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { + if (modedb) { + if ((hdmi_mode[i].pixclock < specs->dclkmin) || + (hdmi_mode[i].pixclock > specs->dclkmax) || + (hdmi_mode[i].refresh < specs->vfmin) || + (hdmi_mode[i].refresh > specs->vfmax) || + (hdmi_mode[i].xres > modedb->xres) || + (hdmi_mode[i].yres > modedb->yres)) + continue; } hdmi_add_videomode(&hdmi_mode[i], head); } } - - #ifdef HDMI_DEBUG +#ifdef HDMI_DEBUG hdmi_show_sink_info(hdmi); - #endif +#endif return HDMI_ERROR_SUCESS; } + /** * hdmi_videomode_compare - compare 2 videomodes * @mode1: first videomode @@ -312,29 +357,27 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok) * 1 if mode1 > mode2, 0 if mode1 = mode2, -1 mode1 < mode2 */ static int hdmi_videomode_compare(const struct fb_videomode *mode1, - const struct fb_videomode *mode2) + const struct fb_videomode *mode2) { - if(mode1->xres > mode2->xres) + if (mode1->xres > mode2->xres) return 1; - else if(mode1->xres == mode2->xres) - { - if(mode1->yres > mode2->yres) + else if (mode1->xres == mode2->xres) { + if (mode1->yres > mode2->yres) return 1; - else if(mode1->yres == mode2->yres) - { - if(mode1->pixclock > mode2->pixclock) + else if (mode1->yres == mode2->yres) { + if (mode1->pixclock > mode2->pixclock) return 1; - else if(mode1->pixclock == mode2->pixclock) - { - if(mode1->refresh > mode2->refresh) + else if (mode1->pixclock == mode2->pixclock) { + if (mode1->refresh > mode2->refresh) return 1; - else if(mode1->refresh == mode2->refresh) + else if (mode1->refresh == mode2->refresh) return 0; } } } - return -1; + return -1; } + /** * hdmi_add_videomode: adds videomode entry to modelist * @mode: videomode to add @@ -350,67 +393,62 @@ int hdmi_add_videomode(const struct fb_videomode *mode, struct list_head *head) struct fb_videomode *m; int i, found = 0; - for(i = 0; i < ARRAY_SIZE(hdmi_mode); i++) - { - m =(struct fb_videomode*) &hdmi_mode[i]; - if (fb_mode_is_equal(m, mode)) { + for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { + m = (struct fb_videomode *)&hdmi_mode[i]; + if (fb_mode_is_equal(m, mode)) { found = 1; break; } - } + } if (found) { list_for_each(pos, head) { modelist = list_entry(pos, struct fb_modelist, list); m = &modelist->mode; if (fb_mode_is_equal(m, mode)) { - // m == mode + /* m == mode */ return 0; - } - else - { - if(hdmi_videomode_compare(m, mode) == -1) { + } else { + if (hdmi_videomode_compare(m, mode) == -1) break; - } } } - modelist_new = kmalloc(sizeof(struct fb_modelist), - GFP_KERNEL); + modelist_new = kmalloc(sizeof(struct fb_modelist), GFP_KERNEL); if (!modelist_new) - return -ENOMEM; + return -ENOMEM; modelist_new->mode = hdmi_mode[i]; list_add_tail(&modelist_new->list, pos); } - + return 0; } /** * hdmi_videomode_to_vic: transverse video mode to vic * @vmode: videomode to transverse - * + * */ int hdmi_videomode_to_vic(struct fb_videomode *vmode) { unsigned char vic = 0; int i = 0; - - for(i = 0; i < ARRAY_SIZE(hdmi_mode); i++) - { - if( vmode->vmode == hdmi_mode[i].vmode && - vmode->refresh == hdmi_mode[i].refresh && - vmode->xres == hdmi_mode[i].xres && - vmode->left_margin == hdmi_mode[i].left_margin && - vmode->right_margin == hdmi_mode[i].right_margin && - vmode->upper_margin == hdmi_mode[i].upper_margin && - vmode->lower_margin == hdmi_mode[i].lower_margin && - vmode->hsync_len == hdmi_mode[i].hsync_len && - vmode->vsync_len == hdmi_mode[i].vsync_len) - { - if( (vmode->vmode == FB_VMODE_NONINTERLACED && vmode->yres == hdmi_mode[i].yres) || - (vmode->vmode == FB_VMODE_INTERLACED && vmode->yres == hdmi_mode[i].yres/2)) - { + + for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { + if (vmode->vmode == hdmi_mode[i].vmode && + vmode->refresh == hdmi_mode[i].refresh && + vmode->xres == hdmi_mode[i].xres && + vmode->left_margin == hdmi_mode[i].left_margin && + vmode->right_margin == hdmi_mode[i].right_margin && + vmode->upper_margin == hdmi_mode[i].upper_margin && + vmode->lower_margin == hdmi_mode[i].lower_margin && + vmode->hsync_len == hdmi_mode[i].hsync_len && + vmode->vsync_len == hdmi_mode[i].vsync_len) { + /*if ((vmode->vmode == FB_VMODE_NONINTERLACED + && vmode->yres == hdmi_mode[i].yres) + || (vmode->vmode == FB_VMODE_INTERLACED + && vmode->yres == hdmi_mode[i].yres / 2))*/ + { vic = hdmi_mode[i].flag; break; } @@ -422,18 +460,17 @@ int hdmi_videomode_to_vic(struct fb_videomode *vmode) /** * hdmi_vic_to_videomode: transverse vic mode to video mode * @vmode: vic to transverse - * + * */ -const struct fb_videomode* hdmi_vic_to_videomode(int vic) +const struct fb_videomode *hdmi_vic_to_videomode(int vic) { int i; - - if(vic == 0) + + if (vic == 0) return NULL; - - for(i = 0; i < ARRAY_SIZE(hdmi_mode); i++) - { - if(hdmi_mode[i].flag == vic) + + for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { + if (hdmi_mode[i].flag == vic) return &hdmi_mode[i]; } return NULL; @@ -441,37 +478,34 @@ const struct fb_videomode* hdmi_vic_to_videomode(int vic) /** * hdmi_find_best_mode: find the video mode nearest to input vic - * @hdmi: + * @hdmi: * @vic: input vic - * + * * NOTES: * If vic is zero, return the high resolution video mode vic. */ -int hdmi_find_best_mode(struct hdmi* hdmi, int vic) +int hdmi_find_best_mode(struct hdmi *hdmi, int vic) { struct list_head *pos, *head = &hdmi->edid.modelist; struct fb_modelist *modelist; struct fb_videomode *m = NULL; int found = 0; - - if(vic) - { + + if (vic) { list_for_each(pos, head) { modelist = list_entry(pos, struct fb_modelist, list); m = &modelist->mode; - if(m->flag == vic) - { - found = 1; + if (m->flag == vic) { + found = 1; break; } } } - if( (vic == 0 || found == 0) && head->next != head) - { + if ((vic == 0 || found == 0) && head->next != head) { modelist = list_entry(head->next, struct fb_modelist, list); m = &modelist->mode; } - if(m != NULL) + if (m != NULL) return m->flag; else return 0; @@ -480,13 +514,12 @@ int hdmi_find_best_mode(struct hdmi* hdmi, int vic) const char *hdmi_get_video_mode_name(unsigned char vic) { int i; - - for(i = 0; i < ARRAY_SIZE(hdmi_mode); i++) - { - if(vic == hdmi_mode[i].flag) + + for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { + if (vic == hdmi_mode[i].flag) break; } - if(i == ARRAY_SIZE(hdmi_mode)) + if (i == ARRAY_SIZE(hdmi_mode)) return NULL; else return hdmi_mode[i].name; @@ -494,54 +527,123 @@ const char *hdmi_get_video_mode_name(unsigned char vic) /** * hdmi_switch_fb: switch lcdc mode to required video mode - * @hdmi: + * @hdmi: * @type: - * + * * NOTES: - * + * */ int hdmi_switch_fb(struct hdmi *hdmi, int vic) { int rc = 0; struct rk_screen *screen; - - - screen = kzalloc(sizeof(struct rk_screen), GFP_KERNEL); - if(screen == NULL) + + screen = kzalloc(sizeof(struct rk_screen), GFP_KERNEL); + if (screen == NULL) return -1; - - if(hdmi->vic == 0) + + if (hdmi->vic == 0) hdmi->vic = HDMI_VIDEO_DEFAULT_MODE; - rc = hdmi_set_info(screen, hdmi->vic); - if(rc == 0) { - if(hdmi->set_vif) - hdmi->set_vif(hdmi,screen,0); //turn off vif for jettab + if (rc == 0) { + if (hdmi->set_vif) /* turn off vif for jettab */ + hdmi->set_vif(hdmi, screen, 0); rk_fb_switch_screen(screen, 1, hdmi->lcdc->id); rk_fb_disp_scale(hdmi->xscale, hdmi->yscale, hdmi->lcdc->id); - if(hdmi->set_vif) - hdmi->set_vif(hdmi,screen,1); + if (hdmi->set_vif) + hdmi->set_vif(hdmi, screen, 1); } - + kfree(screen); - + return rc; } +/** + * hdmi_init_video_para: init video_para variable + * + * NOTES: + *This parameters should be modified according to need by user + */ +int hdmi_init_video_para(struct hdmi *hdmi_drv, struct hdmi_video_para *video) +{ + struct rk_lcdc_driver *lcdc_drv = NULL; + + if (unlikely(hdmi_drv == NULL)) + return -1; + + lcdc_drv = hdmi_drv->lcdc; + if (unlikely(lcdc_drv == NULL)) + return -1; + + memset(video, 0, sizeof(struct hdmi_video_para)); + + video->vic = hdmi_drv->vic; + video->input_mode = VIDEO_INPUT_RGB_YCBCR_444; + if (lcdc_drv->output_color == COLOR_RGB) + video->input_color = VIDEO_INPUT_COLOR_RGB; + else + video->input_color = VIDEO_INPUT_COLOR_YCBCR444; + + video->output_mode = hdmi_drv->edid.sink_hdmi; + video->format_3d = 0; /* TODO modify according to EDID if need */ + video->pixel_repet = 0; + /* 0:IT Video Format 1:CE Video Format + * TODO modify according to EDID + */ + video->color_limit_range = 1; + +#ifdef SOURCE_ABOVE_10BIT + if (hdmi_drv->edid.deepcolor & HDMI_COLOR_DEPTH_16BIT) + video->color_depth = HDMI_COLOR_DEPTH_16BIT; + else if (hdmi_drv->edid.deepcolor & HDMI_COLOR_DEPTH_12BIT) + video->color_depth = HDMI_COLOR_DEPTH_12BIT; + else +#endif + if (hdmi_drv->edid.deepcolor & HDMI_COLOR_DEPTH_10BIT) + video->color_depth = HDMI_COLOR_DEPTH_10BIT; + else + video->color_depth = HDMI_COLOR_DEPTH_8BIT; + + if (hdmi_drv->edid.ycbcr444) + video->output_color = VIDEO_OUTPUT_YCBCR444; + else if (hdmi_drv->edid.ycbcr422) + video->output_color = VIDEO_OUTPUT_YCBCR422; + else + video->output_color = VIDEO_OUTPUT_RGB444; + + /*For DVI, output RGB */ + if (hdmi_drv->edid.sink_hdmi == 0) + video->output_color = VIDEO_OUTPUT_RGB444; + + return 0; +} + +/** + * hdmi_drv_register: init hdmi_drv variable + * + * NOTES: + * + */ +int hdmi_drv_register(struct hdmi *hdmi_drv) +{ + m_hdmi_drv = hdmi_drv; + return 0; +} + /** * hdmi_get_status: get hdmi hotplug status - * + * * NOTES: - * + * */ -extern struct hdmi *hdmi; int hdmi_get_hotplug(void) { - if(hdmi) - return hdmi->hotplug; + if (m_hdmi_drv) + return m_hdmi_drv->hotplug; else return HDMI_HPD_REMOVED; }