omap3_dss.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * (C) Copyright 2010
  3. * Texas Instruments, <www.ti.com>
  4. * Syed Mohammed Khasim <khasim@ti.com>
  5. *
  6. * Referred to Linux Kernel DSS driver files for OMAP3 by
  7. * Tomi Valkeinen from drivers/video/omap2/dss/
  8. *
  9. * See file CREDITS for list of people who contributed to this
  10. * project.
  11. *
  12. * This program is free software; you can redistribute it and/or
  13. * modify it under the terms of the GNU General Public License as
  14. * published by the Free Software Foundation's version 2 and any
  15. * later version the License.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  25. * MA 02111-1307 USA
  26. */
  27. #include <common.h>
  28. #include <asm/io.h>
  29. #include <asm/arch/dss.h>
  30. /* Configure VENC for a given Mode (NTSC / PAL) */
  31. void omap3_dss_venc_config(const struct venc_regs *venc_cfg,
  32. u32 height, u32 width)
  33. {
  34. struct venc_regs *venc = (struct venc_regs *) OMAP3_VENC_BASE;
  35. struct dss_regs *dss = (struct dss_regs *) OMAP3_DSS_BASE;
  36. struct dispc_regs *dispc = (struct dispc_regs *) OMAP3_DISPC_BASE;
  37. writel(venc_cfg->status, &venc->status);
  38. writel(venc_cfg->f_control, &venc->f_control);
  39. writel(venc_cfg->vidout_ctrl, &venc->vidout_ctrl);
  40. writel(venc_cfg->sync_ctrl, &venc->sync_ctrl);
  41. writel(venc_cfg->llen, &venc->llen);
  42. writel(venc_cfg->flens, &venc->flens);
  43. writel(venc_cfg->hfltr_ctrl, &venc->hfltr_ctrl);
  44. writel(venc_cfg->cc_carr_wss_carr, &venc->cc_carr_wss_carr);
  45. writel(venc_cfg->c_phase, &venc->c_phase);
  46. writel(venc_cfg->gain_u, &venc->gain_u);
  47. writel(venc_cfg->gain_v, &venc->gain_v);
  48. writel(venc_cfg->gain_y, &venc->gain_y);
  49. writel(venc_cfg->black_level, &venc->black_level);
  50. writel(venc_cfg->blank_level, &venc->blank_level);
  51. writel(venc_cfg->x_color, &venc->x_color);
  52. writel(venc_cfg->m_control, &venc->m_control);
  53. writel(venc_cfg->bstamp_wss_data, &venc->bstamp_wss_data);
  54. writel(venc_cfg->s_carr, &venc->s_carr);
  55. writel(venc_cfg->line21, &venc->line21);
  56. writel(venc_cfg->ln_sel, &venc->ln_sel);
  57. writel(venc_cfg->l21__wc_ctl, &venc->l21__wc_ctl);
  58. writel(venc_cfg->htrigger_vtrigger, &venc->htrigger_vtrigger);
  59. writel(venc_cfg->savid__eavid, &venc->savid__eavid);
  60. writel(venc_cfg->flen__fal, &venc->flen__fal);
  61. writel(venc_cfg->lal__phase_reset, &venc->lal__phase_reset);
  62. writel(venc_cfg->hs_int_start_stop_x, &venc->hs_int_start_stop_x);
  63. writel(venc_cfg->hs_ext_start_stop_x, &venc->hs_ext_start_stop_x);
  64. writel(venc_cfg->vs_int_start_x, &venc->vs_int_start_x);
  65. writel(venc_cfg->vs_int_stop_x__vs_int_start_y,
  66. &venc->vs_int_stop_x__vs_int_start_y);
  67. writel(venc_cfg->vs_int_stop_y__vs_ext_start_x,
  68. &venc->vs_int_stop_y__vs_ext_start_x);
  69. writel(venc_cfg->vs_ext_stop_x__vs_ext_start_y,
  70. &venc->vs_ext_stop_x__vs_ext_start_y);
  71. writel(venc_cfg->vs_ext_stop_y, &venc->vs_ext_stop_y);
  72. writel(venc_cfg->avid_start_stop_x, &venc->avid_start_stop_x);
  73. writel(venc_cfg->avid_start_stop_y, &venc->avid_start_stop_y);
  74. writel(venc_cfg->fid_int_start_x__fid_int_start_y,
  75. &venc->fid_int_start_x__fid_int_start_y);
  76. writel(venc_cfg->fid_int_offset_y__fid_ext_start_x,
  77. &venc->fid_int_offset_y__fid_ext_start_x);
  78. writel(venc_cfg->fid_ext_start_y__fid_ext_offset_y,
  79. &venc->fid_ext_start_y__fid_ext_offset_y);
  80. writel(venc_cfg->tvdetgp_int_start_stop_x,
  81. &venc->tvdetgp_int_start_stop_x);
  82. writel(venc_cfg->tvdetgp_int_start_stop_y,
  83. &venc->tvdetgp_int_start_stop_y);
  84. writel(venc_cfg->gen_ctrl, &venc->gen_ctrl);
  85. writel(venc_cfg->output_control, &venc->output_control);
  86. writel(venc_cfg->dac_b__dac_c, &venc->dac_b__dac_c);
  87. /* Configure DSS for VENC Settings */
  88. writel(VENC_CLK_ENABLE | DAC_DEMEN | DAC_POWERDN | VENC_OUT_SEL,
  89. &dss->control);
  90. /* Configure height and width for Digital out */
  91. writel(height << DIG_LPP_SHIFT | width, &dispc->size_dig);
  92. }
  93. /* Configure Panel Specific Parameters */
  94. void omap3_dss_panel_config(const struct panel_config *panel_cfg)
  95. {
  96. struct dispc_regs *dispc = (struct dispc_regs *) OMAP3_DISPC_BASE;
  97. struct dss_regs *dss = (struct dss_regs *) OMAP3_DSS_BASE;
  98. writel(DSS_SOFTRESET, &dss->sysconfig);
  99. while (!(readl(&dss->sysstatus) & DSS_RESETDONE))
  100. ;
  101. writel(panel_cfg->timing_h, &dispc->timing_h);
  102. writel(panel_cfg->timing_v, &dispc->timing_v);
  103. writel(panel_cfg->pol_freq, &dispc->pol_freq);
  104. writel(panel_cfg->divisor, &dispc->divisor);
  105. writel(panel_cfg->lcd_size, &dispc->size_lcd);
  106. writel(panel_cfg->load_mode << LOADMODE_SHIFT, &dispc->config);
  107. writel(panel_cfg->panel_type << TFTSTN_SHIFT |
  108. panel_cfg->data_lines << DATALINES_SHIFT, &dispc->control);
  109. writel(panel_cfg->panel_color, &dispc->default_color0);
  110. writel((u32) panel_cfg->frame_buffer, &dispc->gfx_ba0);
  111. if (!panel_cfg->frame_buffer)
  112. return;
  113. writel(panel_cfg->gfx_format | GFX_ENABLE, &dispc->gfx_attributes);
  114. writel(1, &dispc->gfx_row_inc);
  115. writel(1, &dispc->gfx_pixel_inc);
  116. writel(panel_cfg->lcd_size, &dispc->gfx_size);
  117. }
  118. /* Enable LCD and DIGITAL OUT in DSS */
  119. void omap3_dss_enable(void)
  120. {
  121. struct dispc_regs *dispc = (struct dispc_regs *) OMAP3_DISPC_BASE;
  122. u32 l;
  123. l = readl(&dispc->control);
  124. l |= LCD_ENABLE | GO_LCD | DIG_ENABLE | GO_DIG | GP_OUT0 | GP_OUT1;
  125. writel(l, &dispc->control);
  126. }