171d7fec4Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nsc/gfx/vid_5530.c,v 1.2 2003/02/21 16:51:10 alanh Exp $ */ 271d7fec4Smrg/* 371d7fec4Smrg * $Workfile: vid_5530.c $ 471d7fec4Smrg * 571d7fec4Smrg * This file contains routines to control the CS5530 video overlay hardware. 671d7fec4Smrg * 771d7fec4Smrg * NSC_LIC_ALTERNATIVE_PREAMBLE 871d7fec4Smrg * 971d7fec4Smrg * Revision 1.0 1071d7fec4Smrg * 1171d7fec4Smrg * National Semiconductor Alternative GPL-BSD License 1271d7fec4Smrg * 1371d7fec4Smrg * National Semiconductor Corporation licenses this software 1471d7fec4Smrg * ("Software"): 1571d7fec4Smrg * 1671d7fec4Smrg * Durango 1771d7fec4Smrg * 1871d7fec4Smrg * under one of the two following licenses, depending on how the 1971d7fec4Smrg * Software is received by the Licensee. 2071d7fec4Smrg * 2171d7fec4Smrg * If this Software is received as part of the Linux Framebuffer or 2271d7fec4Smrg * other GPL licensed software, then the GPL license designated 2371d7fec4Smrg * NSC_LIC_GPL applies to this Software; in all other circumstances 2471d7fec4Smrg * then the BSD-style license designated NSC_LIC_BSD shall apply. 2571d7fec4Smrg * 2671d7fec4Smrg * END_NSC_LIC_ALTERNATIVE_PREAMBLE */ 2771d7fec4Smrg 2871d7fec4Smrg/* NSC_LIC_BSD 2971d7fec4Smrg * 3071d7fec4Smrg * National Semiconductor Corporation Open Source License for Durango 3171d7fec4Smrg * 3271d7fec4Smrg * (BSD License with Export Notice) 3371d7fec4Smrg * 3471d7fec4Smrg * Copyright (c) 1999-2001 3571d7fec4Smrg * National Semiconductor Corporation. 3671d7fec4Smrg * All rights reserved. 3771d7fec4Smrg * 3871d7fec4Smrg * Redistribution and use in source and binary forms, with or without 3971d7fec4Smrg * modification, are permitted provided that the following conditions 4071d7fec4Smrg * are met: 4171d7fec4Smrg * 4271d7fec4Smrg * * Redistributions of source code must retain the above copyright 4371d7fec4Smrg * notice, this list of conditions and the following disclaimer. 4471d7fec4Smrg * 4571d7fec4Smrg * * Redistributions in binary form must reproduce the above 4671d7fec4Smrg * copyright notice, this list of conditions and the following 4771d7fec4Smrg * disclaimer in the documentation and/or other materials provided 4871d7fec4Smrg * with the distribution. 4971d7fec4Smrg * 5071d7fec4Smrg * * Neither the name of the National Semiconductor Corporation nor 5171d7fec4Smrg * the names of its contributors may be used to endorse or promote 5271d7fec4Smrg * products derived from this software without specific prior 5371d7fec4Smrg * written permission. 5471d7fec4Smrg * 5571d7fec4Smrg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 5671d7fec4Smrg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 5771d7fec4Smrg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 5871d7fec4Smrg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 5971d7fec4Smrg * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY 6071d7fec4Smrg * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 6171d7fec4Smrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 6271d7fec4Smrg * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 6371d7fec4Smrg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 6471d7fec4Smrg * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE, 6571d7fec4Smrg * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY 6671d7fec4Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 6771d7fec4Smrg * OF SUCH DAMAGE. 6871d7fec4Smrg * 6971d7fec4Smrg * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF 7071d7fec4Smrg * YOUR JURISDICTION. It is licensee's responsibility to comply with 7171d7fec4Smrg * any export regulations applicable in licensee's jurisdiction. Under 7271d7fec4Smrg * CURRENT (2001) U.S. export regulations this software 7371d7fec4Smrg * is eligible for export from the U.S. and can be downloaded by or 7471d7fec4Smrg * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed 7571d7fec4Smrg * destinations which include Cuba, Iraq, Libya, North Korea, Iran, 7671d7fec4Smrg * Syria, Sudan, Afghanistan and any other country to which the U.S. 7771d7fec4Smrg * has embargoed goods and services. 7871d7fec4Smrg * 7971d7fec4Smrg * END_NSC_LIC_BSD */ 8071d7fec4Smrg 8171d7fec4Smrg/* NSC_LIC_GPL 8271d7fec4Smrg * 8371d7fec4Smrg * National Semiconductor Corporation Gnu General Public License for Durango 8471d7fec4Smrg * 8571d7fec4Smrg * (GPL License with Export Notice) 8671d7fec4Smrg * 8771d7fec4Smrg * Copyright (c) 1999-2001 8871d7fec4Smrg * National Semiconductor Corporation. 8971d7fec4Smrg * All rights reserved. 9071d7fec4Smrg * 9171d7fec4Smrg * Redistribution and use in source and binary forms, with or without 9271d7fec4Smrg * modification, are permitted under the terms of the GNU General 9371d7fec4Smrg * Public License as published by the Free Software Foundation; either 9471d7fec4Smrg * version 2 of the License, or (at your option) any later version 9571d7fec4Smrg * 9671d7fec4Smrg * In addition to the terms of the GNU General Public License, neither 9771d7fec4Smrg * the name of the National Semiconductor Corporation nor the names of 9871d7fec4Smrg * its contributors may be used to endorse or promote products derived 9971d7fec4Smrg * from this software without specific prior written permission. 10071d7fec4Smrg * 10171d7fec4Smrg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 10271d7fec4Smrg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10371d7fec4Smrg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 10471d7fec4Smrg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 10571d7fec4Smrg * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY 10671d7fec4Smrg * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 10771d7fec4Smrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 10871d7fec4Smrg * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 10971d7fec4Smrg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 11071d7fec4Smrg * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE, 11171d7fec4Smrg * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY 11271d7fec4Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 11371d7fec4Smrg * OF SUCH DAMAGE. See the GNU General Public License for more details. 11471d7fec4Smrg * 11571d7fec4Smrg * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF 11671d7fec4Smrg * YOUR JURISDICTION. It is licensee's responsibility to comply with 11771d7fec4Smrg * any export regulations applicable in licensee's jurisdiction. Under 11871d7fec4Smrg * CURRENT (2001) U.S. export regulations this software 11971d7fec4Smrg * is eligible for export from the U.S. and can be downloaded by or 12071d7fec4Smrg * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed 12171d7fec4Smrg * destinations which include Cuba, Iraq, Libya, North Korea, Iran, 12271d7fec4Smrg * Syria, Sudan, Afghanistan and any other country to which the U.S. 12371d7fec4Smrg * has embargoed goods and services. 12471d7fec4Smrg * 12571d7fec4Smrg * You should have received a copy of the GNU General Public License 12671d7fec4Smrg * along with this file; if not, write to the Free Software Foundation, 12771d7fec4Smrg * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 12871d7fec4Smrg * 12971d7fec4Smrg * END_NSC_LIC_GPL */ 13071d7fec4Smrg 13171d7fec4Smrg/*---------------------------------------------------------------------------- 13271d7fec4Smrg * CS5530 PLL TABLE 13371d7fec4Smrg *---------------------------------------------------------------------------- 13471d7fec4Smrg */ 13571d7fec4Smrgtypedef struct tagCS5530PLLENTRY 13671d7fec4Smrg{ 13771d7fec4Smrg long frequency; /* 16.16 fixed point frequency */ 13871d7fec4Smrg unsigned long pll_value; /* associated register value */ 13971d7fec4Smrg} 14071d7fec4SmrgCS5530PLLENTRY; 14171d7fec4Smrg 14271d7fec4SmrgCS5530PLLENTRY CS5530_PLLtable[] = { 14371d7fec4Smrg {0x00192CCC, 0x31C45801,}, /* 25.1750 */ 14471d7fec4Smrg {0x001C526E, 0x20E36802,}, /* 28.3220 */ 14571d7fec4Smrg {0x001F8000, 0x33915801,}, /* 31.5000 */ 14671d7fec4Smrg {0x00240000, 0x31EC4801,}, /* 36.0000 */ 14771d7fec4Smrg {0x00258000, 0x21E22801,}, /* 37.5000 */ 14871d7fec4Smrg {0x00280000, 0x33088801,}, /* 40.0000 */ 14971d7fec4Smrg {0x002CE666, 0x33E22801,}, /* 44.9000 */ 15071d7fec4Smrg {0x00318000, 0x336C4801,}, /* 49.5000 */ 15171d7fec4Smrg {0x00320000, 0x23088801,}, /* 50.0000 */ 15271d7fec4Smrg {0x00325999, 0x23088801,}, /* 50.3500 */ 15371d7fec4Smrg {0x00360000, 0x3708A801,}, /* 54.0000 */ 15471d7fec4Smrg {0x00384000, 0x23E36802,}, /* 56.2500 */ 15571d7fec4Smrg {0x0038643F, 0x23E36802,}, /* 56.3916 */ 15671d7fec4Smrg {0x0038A4DD, 0x23E36802,}, /* 56.6444 */ 15771d7fec4Smrg {0x003B0000, 0x37C45801,}, /* 59.0000 */ 15871d7fec4Smrg {0x003F0000, 0x23EC4801,}, /* 63.0000 */ 15971d7fec4Smrg {0x00410000, 0x37911801,}, /* 65.0000 */ 16071d7fec4Smrg {0x00438000, 0x37963803,}, /* 67.5000 */ 16171d7fec4Smrg {0x0046CCCC, 0x37058803,}, /* 70.8000 */ 16271d7fec4Smrg {0x00480000, 0x3710C805,}, /* 72.0000 */ 16371d7fec4Smrg {0x004B0000, 0x37E22801,}, /* 75.0000 */ 16471d7fec4Smrg {0x004EC000, 0x27915801,}, /* 78.7500 */ 16571d7fec4Smrg {0x00500000, 0x37D8D802,}, /* 80.0000 */ 16671d7fec4Smrg {0x0059CCCC, 0x27588802,}, /* 89.8000 */ 16771d7fec4Smrg {0x005E8000, 0x27EC4802,}, /* 94.5000 */ 16871d7fec4Smrg {0x00630000, 0x27AC6803,}, /* 99.0000 */ 16971d7fec4Smrg {0x00640000, 0x27088801,}, /* 100.0000 */ 17071d7fec4Smrg {0x006C0000, 0x2710C805,}, /* 108.0000 */ 17171d7fec4Smrg {0x00708000, 0x27E36802,}, /* 112.5000 */ 17271d7fec4Smrg {0x00820000, 0x27C58803,}, /* 130.0000 */ 17371d7fec4Smrg {0x00870000, 0x27316803,}, /* 135.0000 */ 17471d7fec4Smrg {0x009D8000, 0x2F915801,}, /* 157.5000 */ 17571d7fec4Smrg {0x00A20000, 0x2F08A801,}, /* 162.0000 */ 17671d7fec4Smrg {0x00AF0000, 0x2FB11802,}, /* 175.0000 */ 17771d7fec4Smrg {0x00BD0000, 0x2FEC4802,}, /* 189.0000 */ 17871d7fec4Smrg {0x00CA0000, 0x2F963803,}, /* 202.0000 */ 17971d7fec4Smrg {0x00E80000, 0x2FB1B802,}, /* 232.0000 */ 18071d7fec4Smrg}; 18171d7fec4Smrg 18271d7fec4Smrg#define NUM_CS5530_FREQUENCIES sizeof(CS5530_PLLtable)/sizeof(CS5530PLLENTRY) 18371d7fec4Smrg 18471d7fec4Smrgint cs5530_set_video_enable(int enable); 18571d7fec4Smrgint cs5530_set_video_format(unsigned long format); 18671d7fec4Smrgint cs5530_set_video_size(unsigned short width, unsigned short height); 18771d7fec4Smrgint cs5530_set_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch); 18871d7fec4Smrgint cs5530_set_video_offset(unsigned long offset); 18971d7fec4Smrgint cs5530_set_video_yuv_offsets(unsigned long yoffset, unsigned long uoffset, 19071d7fec4Smrg unsigned long voffset); 19171d7fec4Smrgint cs5530_set_video_window(short x, short y, unsigned short w, 19271d7fec4Smrg unsigned short h); 19371d7fec4Smrgint cs5530_set_video_left_crop(unsigned short x); 19471d7fec4Smrgint cs5530_set_video_upscale(unsigned short srcw, unsigned short srch, 19571d7fec4Smrg unsigned short dstw, unsigned short dsth); 19671d7fec4Smrgint cs5530_set_video_scale(unsigned short srcw, unsigned short srch, 19771d7fec4Smrg unsigned short dstw, unsigned short dsth); 19871d7fec4Smrgint cs5530_set_video_vertical_downscale(unsigned short srch, 19971d7fec4Smrg unsigned short dsth); 20071d7fec4Smrgvoid cs5530_set_video_vertical_downscale_enable(int enable); 20171d7fec4Smrgint cs5530_set_video_downscale_config(unsigned short type, unsigned short m); 20271d7fec4Smrgint cs5530_set_video_color_key(unsigned long key, unsigned long mask, 20371d7fec4Smrg int bluescreen); 20471d7fec4Smrgint cs5530_set_video_filter(int xfilter, int yfilter); 20571d7fec4Smrgint cs5530_set_video_palette(unsigned long *palette); 20671d7fec4Smrgint cs5530_set_video_palette_entry(unsigned long index, unsigned long color); 20771d7fec4Smrgint cs5530_set_video_downscale_coefficients(unsigned short coef1, 20871d7fec4Smrg unsigned short coef2, 20971d7fec4Smrg unsigned short coef3, 21071d7fec4Smrg unsigned short coef4); 21171d7fec4Smrgint cs5530_set_video_downscale_enable(int enable); 21271d7fec4Smrgint cs5530_set_video_source(VideoSourceType source); 21371d7fec4Smrgint cs5530_set_vbi_source(VbiSourceType source); 21471d7fec4Smrgint cs5530_set_vbi_lines(unsigned long even, unsigned long odd); 21571d7fec4Smrgint cs5530_set_vbi_total(unsigned long even, unsigned long odd); 21671d7fec4Smrgint cs5530_set_video_interlaced(int enable); 21771d7fec4Smrgint cs5530_set_color_space_YUV(int enable); 21871d7fec4Smrgint cs5530_set_vertical_scaler_offset(char offset); 21971d7fec4Smrgint cs5530_set_top_line_in_odd(int enable); 22071d7fec4Smrgint cs5530_set_genlock_delay(unsigned long delay); 22171d7fec4Smrgint cs5530_set_genlock_enable(int flags); 22271d7fec4Smrgint cs5530_set_video_cursor(unsigned long key, unsigned long mask, 22371d7fec4Smrg unsigned short select_color2, 22471d7fec4Smrg unsigned long color1, unsigned long color2); 22571d7fec4Smrgint cs5530_set_video_cursor_enable(int enable); 22671d7fec4Smrgint cs5530_set_video_request(short x, short y); 22771d7fec4Smrg 22871d7fec4Smrgint cs5530_select_alpha_region(int region); 22971d7fec4Smrgint cs5530_set_alpha_enable(int enable); 23071d7fec4Smrgint cs5530_set_alpha_window(short x, short y, 23171d7fec4Smrg unsigned short width, unsigned short height); 23271d7fec4Smrgint cs5530_set_alpha_value(unsigned char alpha, char delta); 23371d7fec4Smrgint cs5530_set_alpha_priority(int priority); 23471d7fec4Smrgint cs5530_set_alpha_color(unsigned long color); 23571d7fec4Smrgint cs5530_set_alpha_color_enable(int enable); 23671d7fec4Smrgint cs5530_set_no_ck_outside_alpha(int enable); 23771d7fec4Smrgint cs5530_disable_softvga(void); 23871d7fec4Smrgint cs5530_enable_softvga(void); 23971d7fec4Smrgint cs5530_set_macrovision_enable(int enable); 24071d7fec4Smrgint cs5530_set_crt_enable(int enable); 24171d7fec4Smrgvoid cs5530_reset_video(void); 24271d7fec4Smrgint cs5530_set_display_control(int sync_polarities); 24371d7fec4Smrgvoid cs5530_set_clock_frequency(unsigned long frequency); 24471d7fec4Smrg 24571d7fec4Smrg/* READ ROUTINES IN GFX_VID.C */ 24671d7fec4Smrg 24771d7fec4Smrgint cs5530_get_video_enable(void); 24871d7fec4Smrgint cs5530_get_video_format(void); 24971d7fec4Smrgunsigned long cs5530_get_video_src_size(void); 25071d7fec4Smrgunsigned long cs5530_get_video_line_size(void); 25171d7fec4Smrgunsigned long cs5530_get_video_xclip(void); 25271d7fec4Smrgunsigned long cs5530_get_video_offset(void); 25371d7fec4Smrgvoid cs5530_get_video_yuv_offsets(unsigned long *yoffset, 25471d7fec4Smrg unsigned long *uoffset, 25571d7fec4Smrg unsigned long *voffset); 25671d7fec4Smrgvoid cs5530_get_video_yuv_pitch(unsigned long *ypitch, 25771d7fec4Smrg unsigned long *uvpitch); 25871d7fec4Smrgunsigned long cs5530_get_video_upscale(void); 25971d7fec4Smrgunsigned long cs5530_get_video_scale(void); 26071d7fec4Smrgunsigned long cs5530_get_video_downscale_delta(void); 26171d7fec4Smrgint cs5530_get_video_vertical_downscale_enable(void); 26271d7fec4Smrgint cs5530_get_video_downscale_config(unsigned short *type, 26371d7fec4Smrg unsigned short *m); 26471d7fec4Smrgvoid cs5530_get_video_downscale_coefficients(unsigned short *coef1, 26571d7fec4Smrg unsigned short *coef2, 26671d7fec4Smrg unsigned short *coef3, 26771d7fec4Smrg unsigned short *coef4); 26871d7fec4Smrgvoid cs5530_get_video_downscale_enable(int *enable); 26971d7fec4Smrgunsigned long cs5530_get_video_dst_size(void); 27071d7fec4Smrgunsigned long cs5530_get_video_position(void); 27171d7fec4Smrgunsigned long cs5530_get_video_color_key(void); 27271d7fec4Smrgunsigned long cs5530_get_video_color_key_mask(void); 27371d7fec4Smrgint cs5530_get_video_palette_entry(unsigned long index, 27471d7fec4Smrg unsigned long *palette); 27571d7fec4Smrgint cs5530_get_video_color_key_src(void); 27671d7fec4Smrgint cs5530_get_video_filter(void); 27771d7fec4Smrgint cs5530_get_video_request(short *x, short *y); 27871d7fec4Smrgint cs5530_get_video_source(VideoSourceType * source); 27971d7fec4Smrgint cs5530_get_vbi_source(VbiSourceType * source); 28071d7fec4Smrgunsigned long cs5530_get_vbi_lines(int odd); 28171d7fec4Smrgunsigned long cs5530_get_vbi_total(int odd); 28271d7fec4Smrgint cs5530_get_video_interlaced(void); 28371d7fec4Smrgint cs5530_get_color_space_YUV(void); 28471d7fec4Smrgint cs5530_get_vertical_scaler_offset(char *offset); 28571d7fec4Smrgunsigned long cs5530_get_genlock_delay(void); 28671d7fec4Smrgint cs5530_get_genlock_enable(void); 28771d7fec4Smrgint cs5530_get_video_cursor(unsigned long *key, unsigned long *mask, 28871d7fec4Smrg unsigned short *select_color2, 28971d7fec4Smrg unsigned long *color1, unsigned short *color2); 29071d7fec4Smrgunsigned long cs5530_read_crc(void); 29171d7fec4Smrgunsigned long cs5530_read_crc32(void); 29271d7fec4Smrgunsigned long cs5530_read_window_crc(int source, unsigned short x, 29371d7fec4Smrg unsigned short y, unsigned short width, 29471d7fec4Smrg unsigned short height, int crc32); 29571d7fec4Smrgint cs5530_get_macrovision_enable(void); 29671d7fec4Smrg 29771d7fec4Smrgvoid cs5530_get_alpha_enable(int *enable); 29871d7fec4Smrgvoid cs5530_get_alpha_size(unsigned short *x, unsigned short *y, 29971d7fec4Smrg unsigned short *width, unsigned short *height); 30071d7fec4Smrgvoid cs5530_get_alpha_value(unsigned char *alpha, char *delta); 30171d7fec4Smrgvoid cs5530_get_alpha_priority(int *priority); 30271d7fec4Smrgvoid cs5530_get_alpha_color(unsigned long *color); 30371d7fec4Smrgunsigned long cs5530_get_clock_frequency(void); 30471d7fec4Smrgint cs5530_get_vsa2_softvga_enable(void); 30571d7fec4Smrgint cs5530_get_sync_polarities(void); 30671d7fec4Smrg 30771d7fec4Smrg/*--------------------------------------------------------------------------- 30871d7fec4Smrg * gfx_set_crt_enable 30971d7fec4Smrg * 31071d7fec4Smrg * This routine enables or disables the CRT output from the video processor. 31171d7fec4Smrg *--------------------------------------------------------------------------- 31271d7fec4Smrg */ 31371d7fec4Smrg#if GFX_VIDEO_DYNAMIC 31471d7fec4Smrgint 31571d7fec4Smrgcs5530_set_crt_enable(int enable) 31671d7fec4Smrg#else 31771d7fec4Smrgint 31871d7fec4Smrggfx_set_crt_enable(int enable) 31971d7fec4Smrg#endif 32071d7fec4Smrg{ 32171d7fec4Smrg unsigned long config; 32271d7fec4Smrg 32371d7fec4Smrg config = READ_VID32(CS5530_DISPLAY_CONFIG); 32471d7fec4Smrg 32571d7fec4Smrg switch (enable) { 32671d7fec4Smrg case CRT_DISABLE: /* Disable everything */ 32771d7fec4Smrg 32871d7fec4Smrg WRITE_VID32(CS5530_DISPLAY_CONFIG, 32971d7fec4Smrg config & ~(CS5530_DCFG_DIS_EN | CS5530_DCFG_HSYNC_EN | 33071d7fec4Smrg CS5530_DCFG_VSYNC_EN | CS5530_DCFG_DAC_BL_EN | 33171d7fec4Smrg CS5530_DCFG_DAC_PWDNX)); 33271d7fec4Smrg break; 33371d7fec4Smrg 33471d7fec4Smrg case CRT_ENABLE: /* Enable CRT display, including display logic */ 33571d7fec4Smrg 33671d7fec4Smrg WRITE_VID32(CS5530_DISPLAY_CONFIG, 33771d7fec4Smrg config | CS5530_DCFG_DIS_EN | CS5530_DCFG_HSYNC_EN | 33871d7fec4Smrg CS5530_DCFG_VSYNC_EN | CS5530_DCFG_DAC_BL_EN | 33971d7fec4Smrg CS5530_DCFG_DAC_PWDNX); 34071d7fec4Smrg break; 34171d7fec4Smrg 34271d7fec4Smrg case CRT_STANDBY: /* HSync:Off VSync:On */ 34371d7fec4Smrg 34471d7fec4Smrg WRITE_VID32(CS5530_DISPLAY_CONFIG, 34571d7fec4Smrg (config & 34671d7fec4Smrg ~(CS5530_DCFG_DIS_EN | CS5530_DCFG_HSYNC_EN | 34771d7fec4Smrg CS5530_DCFG_DAC_BL_EN | CS5530_DCFG_DAC_PWDNX)) 34871d7fec4Smrg | CS5530_DCFG_VSYNC_EN); 34971d7fec4Smrg break; 35071d7fec4Smrg 35171d7fec4Smrg case CRT_SUSPEND: /* HSync:On VSync:Off */ 35271d7fec4Smrg 35371d7fec4Smrg WRITE_VID32(CS5530_DISPLAY_CONFIG, 35471d7fec4Smrg (config & 35571d7fec4Smrg ~(CS5530_DCFG_DIS_EN | CS5530_DCFG_VSYNC_EN | 35671d7fec4Smrg CS5530_DCFG_DAC_BL_EN | CS5530_DCFG_DAC_PWDNX)) 35771d7fec4Smrg | CS5530_DCFG_HSYNC_EN); 35871d7fec4Smrg break; 35971d7fec4Smrg 36071d7fec4Smrg default: 36171d7fec4Smrg return (GFX_STATUS_BAD_PARAMETER); 36271d7fec4Smrg } 36371d7fec4Smrg return (GFX_STATUS_OK); 36471d7fec4Smrg} 36571d7fec4Smrg 36671d7fec4Smrg/*--------------------------------------------------------------------------- 36771d7fec4Smrg * gfx_reset_video (PRIVATE ROUTINE: NOT PART OF DURANGO API) 36871d7fec4Smrg * 36971d7fec4Smrg * This routine is used to disable all components of video overlay before 37071d7fec4Smrg * performing a mode switch. 37171d7fec4Smrg *--------------------------------------------------------------------------- 37271d7fec4Smrg */ 37371d7fec4Smrg#if GFX_VIDEO_DYNAMIC 37471d7fec4Smrgvoid 37571d7fec4Smrgcs5530_reset_video(void) 37671d7fec4Smrg#else 37771d7fec4Smrgvoid 37871d7fec4Smrggfx_reset_video(void) 37971d7fec4Smrg#endif 38071d7fec4Smrg{ 38171d7fec4Smrg gfx_set_video_enable(0); 38271d7fec4Smrg} 38371d7fec4Smrg 38471d7fec4Smrg/*----------------------------------------------------------------------------- 38571d7fec4Smrg * gfx_set_display_control (PRIVATE ROUTINE: NOT PART OF DURANGO API) 38671d7fec4Smrg * 38771d7fec4Smrg * This routine configures the display output. 38871d7fec4Smrg * 38971d7fec4Smrg * "sync_polarities" is used to set the polarities of the sync pulses according 39071d7fec4Smrg * to the following mask: 39171d7fec4Smrg * 39271d7fec4Smrg * Bit 0: If set to 1, negative horizontal polarity is programmed, 39371d7fec4Smrg * otherwise positive horizontal polarity is programmed. 39471d7fec4Smrg * Bit 1: If set to 1, negative vertical polarity is programmed, 39571d7fec4Smrg * otherwise positive vertical polarity is programmed. 39671d7fec4Smrg * 39771d7fec4Smrg *----------------------------------------------------------------------------- 39871d7fec4Smrg */ 39971d7fec4Smrg#if GFX_VIDEO_DYNAMIC 40071d7fec4Smrgint 40171d7fec4Smrgcs5530_set_display_control(int sync_polarities) 40271d7fec4Smrg#else 40371d7fec4Smrgint 40471d7fec4Smrggfx_set_display_control(int sync_polarities) 40571d7fec4Smrg#endif 40671d7fec4Smrg{ 40771d7fec4Smrg unsigned long dcfg; 40871d7fec4Smrg 40971d7fec4Smrg /* ENABLE DISPLAY OUTPUT FROM CX5530 */ 41071d7fec4Smrg 41171d7fec4Smrg dcfg = READ_VID32(CS5530_DISPLAY_CONFIG); 41271d7fec4Smrg 41371d7fec4Smrg /* CLEAR RELEVANT FIELDS */ 41471d7fec4Smrg 41571d7fec4Smrg dcfg &= ~(CS5530_DCFG_CRT_SYNC_SKW_MASK | CS5530_DCFG_PWR_SEQ_DLY_MASK | 41671d7fec4Smrg CS5530_DCFG_CRT_HSYNC_POL | CS5530_DCFG_CRT_VSYNC_POL | 41771d7fec4Smrg CS5530_DCFG_FP_PWR_EN | CS5530_DCFG_FP_DATA_EN); 41871d7fec4Smrg 41971d7fec4Smrg /* INITIALIZATION */ 42071d7fec4Smrg 42171d7fec4Smrg dcfg |= (CS5530_DCFG_CRT_SYNC_SKW_INIT | 42271d7fec4Smrg CS5530_DCFG_PWR_SEQ_DLY_INIT | CS5530_DCFG_GV_PAL_BYP); 42371d7fec4Smrg 42471d7fec4Smrg if (PanelEnable) { 42571d7fec4Smrg dcfg |= CS5530_DCFG_FP_PWR_EN; 42671d7fec4Smrg dcfg |= CS5530_DCFG_FP_DATA_EN; 42771d7fec4Smrg } 42871d7fec4Smrg 42971d7fec4Smrg /* SET APPROPRIATE SYNC POLARITIES */ 43071d7fec4Smrg 43171d7fec4Smrg if (sync_polarities & 1) 43271d7fec4Smrg dcfg |= CS5530_DCFG_CRT_HSYNC_POL; 43371d7fec4Smrg if (sync_polarities & 2) 43471d7fec4Smrg dcfg |= CS5530_DCFG_CRT_VSYNC_POL; 43571d7fec4Smrg 43671d7fec4Smrg WRITE_VID32(CS5530_DISPLAY_CONFIG, dcfg); 43771d7fec4Smrg return (0); 43871d7fec4Smrg} 43971d7fec4Smrg 44071d7fec4Smrg/*--------------------------------------------------------------------------- 44171d7fec4Smrg * gfx_set_clock_frequency 44271d7fec4Smrg * 44371d7fec4Smrg * This routine sets the clock frequency, specified as a 16.16 fixed point 44471d7fec4Smrg * value (0x00318000 = 49.5 MHz). It will set the closest frequency found 44571d7fec4Smrg * in the lookup table. 44671d7fec4Smrg *--------------------------------------------------------------------------- 44771d7fec4Smrg */ 44871d7fec4Smrg#if GFX_VIDEO_DYNAMIC 44971d7fec4Smrgvoid 45071d7fec4Smrgcs5530_set_clock_frequency(unsigned long frequency) 45171d7fec4Smrg#else 45271d7fec4Smrgvoid 45371d7fec4Smrggfx_set_clock_frequency(unsigned long frequency) 45471d7fec4Smrg#endif 45571d7fec4Smrg{ 45671d7fec4Smrg unsigned int index; 45771d7fec4Smrg unsigned long value; 45871d7fec4Smrg long min, diff; 45971d7fec4Smrg 46071d7fec4Smrg /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ 46171d7fec4Smrg /* Search the table for the closest frequency (16.16 format). */ 46271d7fec4Smrg 46371d7fec4Smrg value = CS5530_PLLtable[0].pll_value; 46471d7fec4Smrg min = (long)CS5530_PLLtable[0].frequency - frequency; 46571d7fec4Smrg if (min < 0L) 46671d7fec4Smrg min = -min; 46771d7fec4Smrg for (index = 1; index < NUM_CS5530_FREQUENCIES; index++) { 46871d7fec4Smrg diff = (long)CS5530_PLLtable[index].frequency - frequency; 46971d7fec4Smrg if (diff < 0L) 47071d7fec4Smrg diff = -diff; 47171d7fec4Smrg if (diff < min) { 47271d7fec4Smrg min = diff; 47371d7fec4Smrg value = CS5530_PLLtable[index].pll_value; 47471d7fec4Smrg } 47571d7fec4Smrg } 47671d7fec4Smrg 47771d7fec4Smrg /* SET THE DOT CLOCK REGISTER */ 47871d7fec4Smrg 47971d7fec4Smrg WRITE_VID32(CS5530_DOT_CLK_CONFIG, value); 48071d7fec4Smrg WRITE_VID32(CS5530_DOT_CLK_CONFIG, value | 0x80000100); /* set reset/bypass */ 48171d7fec4Smrg gfx_delay_milliseconds(1); /* wait for PLL to settle */ 48271d7fec4Smrg WRITE_VID32(CS5530_DOT_CLK_CONFIG, value & 0x7FFFFFFF); /* clear reset */ 48371d7fec4Smrg WRITE_VID32(CS5530_DOT_CLK_CONFIG, value & 0x7FFFFEFF); /* clear bypass */ 48471d7fec4Smrg return; 48571d7fec4Smrg} 48671d7fec4Smrg 48771d7fec4Smrg/*----------------------------------------------------------------------------- 48871d7fec4Smrg * gfx_set_video_enable 48971d7fec4Smrg * 49071d7fec4Smrg * This routine enables or disables the video overlay functionality. 49171d7fec4Smrg *----------------------------------------------------------------------------- 49271d7fec4Smrg */ 49371d7fec4Smrg#if GFX_VIDEO_DYNAMIC 49471d7fec4Smrgint 49571d7fec4Smrgcs5530_set_video_enable(int enable) 49671d7fec4Smrg#else 49771d7fec4Smrgint 49871d7fec4Smrggfx_set_video_enable(int enable) 49971d7fec4Smrg#endif 50071d7fec4Smrg{ 50171d7fec4Smrg unsigned long vcfg; 50271d7fec4Smrg 50371d7fec4Smrg /* WAIT FOR VERTICAL BLANK TO START */ 50471d7fec4Smrg /* Otherwise a glitch can be observed. */ 50571d7fec4Smrg 50671d7fec4Smrg if (gfx_test_timing_active()) { 50771d7fec4Smrg if (!gfx_test_vertical_active()) { 50871d7fec4Smrg while (!gfx_test_vertical_active()) ; 50971d7fec4Smrg } 51071d7fec4Smrg while (gfx_test_vertical_active()) ; 51171d7fec4Smrg } 51271d7fec4Smrg vcfg = READ_VID32(CS5530_VIDEO_CONFIG); 51371d7fec4Smrg if (enable) { 51471d7fec4Smrg /* ENABLE VIDEO OVERLAY FROM DISPLAY CONTROLLER */ 51571d7fec4Smrg /* Use private routine to abstract the display controller. */ 51671d7fec4Smrg 51771d7fec4Smrg gfx_set_display_video_enable(1); 51871d7fec4Smrg 51971d7fec4Smrg /* SET CS5530 BUS CONTROL PARAMETERS */ 52071d7fec4Smrg /* Currently always high speed, 8-bit interface. */ 52171d7fec4Smrg 52271d7fec4Smrg vcfg |= CS5530_VCFG_HIGH_SPD_INT; 52371d7fec4Smrg vcfg &= ~(CS5530_VCFG_EARLY_VID_RDY | CS5530_VCFG_16_BIT_EN); 52471d7fec4Smrg 52571d7fec4Smrg /* ENABLE CS5530 VIDEO OVERLAY */ 52671d7fec4Smrg 52771d7fec4Smrg vcfg |= CS5530_VCFG_VID_EN; 52871d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 52971d7fec4Smrg } else { 53071d7fec4Smrg /* DISABLE CS5530 VIDEO OVERLAY */ 53171d7fec4Smrg 53271d7fec4Smrg vcfg &= ~CS5530_VCFG_VID_EN; 53371d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 53471d7fec4Smrg 53571d7fec4Smrg /* DISABLE VIDEO OVERLAY FROM DISPLAY CONTROLLER */ 53671d7fec4Smrg /* Use private routine to abstract the display controller. */ 53771d7fec4Smrg 53871d7fec4Smrg gfx_set_display_video_enable(0); 53971d7fec4Smrg } 54071d7fec4Smrg return (0); 54171d7fec4Smrg} 54271d7fec4Smrg 54371d7fec4Smrg/*----------------------------------------------------------------------------- 54471d7fec4Smrg * gfx_set_video_format 54571d7fec4Smrg * 54671d7fec4Smrg * Currently only sets 4:2:0 format, Y1 V Y0 U. 54771d7fec4Smrg *----------------------------------------------------------------------------- 54871d7fec4Smrg */ 54971d7fec4Smrg#if GFX_VIDEO_DYNAMIC 55071d7fec4Smrgint 55171d7fec4Smrgcs5530_set_video_format(unsigned long format) 55271d7fec4Smrg#else 55371d7fec4Smrgint 55471d7fec4Smrggfx_set_video_format(unsigned long format) 55571d7fec4Smrg#endif 55671d7fec4Smrg{ 55771d7fec4Smrg unsigned long vcfg = 0; 55871d7fec4Smrg 55971d7fec4Smrg /* SET THE CS5530 VIDEO INPUT FORMAT */ 56071d7fec4Smrg 56171d7fec4Smrg vcfg = READ_VID32(CS5530_VIDEO_CONFIG); 56271d7fec4Smrg vcfg &= ~(CS5530_VCFG_VID_INP_FORMAT | CS5530_VCFG_4_2_0_MODE); 56371d7fec4Smrg vcfg &= ~(CS5530_VCFG_CSC_BYPASS); 56471d7fec4Smrg vcfg &= ~(CS5530_VCFG_GV_SEL); 56571d7fec4Smrg 56671d7fec4Smrg if (format < 4) 56771d7fec4Smrg vcfg |= (format << 2); 56871d7fec4Smrg else { 56971d7fec4Smrg if (format == VIDEO_FORMAT_Y0Y1Y2Y3) { 57071d7fec4Smrg vcfg |= CS5530_VCFG_4_2_0_MODE; 57171d7fec4Smrg vcfg |= 1 << 2; 57271d7fec4Smrg } 57371d7fec4Smrg if (format == VIDEO_FORMAT_RGB) { 57471d7fec4Smrg vcfg |= CS5530_VCFG_CSC_BYPASS; 57571d7fec4Smrg vcfg |= CS5530_VCFG_GV_SEL; 57671d7fec4Smrg } 57771d7fec4Smrg } 57871d7fec4Smrg 57971d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 58071d7fec4Smrg return (0); 58171d7fec4Smrg} 58271d7fec4Smrg 58371d7fec4Smrg/*----------------------------------------------------------------------------- 58471d7fec4Smrg * gfx_set_video_size 58571d7fec4Smrg * 58671d7fec4Smrg * This routine specifies the size of the source data. It is used only 58771d7fec4Smrg * to determine how much data to transfer per frame, and is not used to 58871d7fec4Smrg * calculate the scaling value (that is handled by a separate routine). 58971d7fec4Smrg *----------------------------------------------------------------------------- 59071d7fec4Smrg */ 59171d7fec4Smrg#if GFX_VIDEO_DYNAMIC 59271d7fec4Smrgint 59371d7fec4Smrgcs5530_set_video_size(unsigned short width, unsigned short height) 59471d7fec4Smrg#else 59571d7fec4Smrgint 59671d7fec4Smrggfx_set_video_size(unsigned short width, unsigned short height) 59771d7fec4Smrg#endif 59871d7fec4Smrg{ 59971d7fec4Smrg unsigned long size, vcfg; 60071d7fec4Smrg 60171d7fec4Smrg /* SET THE CS5530 VIDEO LINE SIZE */ 60271d7fec4Smrg 60371d7fec4Smrg vcfg = READ_VID32(CS5530_VIDEO_CONFIG); 60471d7fec4Smrg vcfg &= ~(CS5530_VCFG_LINE_SIZE_LOWER_MASK | CS5530_VCFG_LINE_SIZE_UPPER); 60571d7fec4Smrg size = (width >> 1); 60671d7fec4Smrg vcfg |= (size & 0x00FF) << 8; 60771d7fec4Smrg if (size & 0x0100) 60871d7fec4Smrg vcfg |= CS5530_VCFG_LINE_SIZE_UPPER; 60971d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 61071d7fec4Smrg 61171d7fec4Smrg /* SET TOTAL VIDEO BUFFER SIZE IN DISPLAY CONTROLLER */ 61271d7fec4Smrg /* Use private routine to abstract the display controller. */ 61371d7fec4Smrg 61471d7fec4Smrg gfx_set_display_video_size(width, height); 61571d7fec4Smrg return (0); 61671d7fec4Smrg} 61771d7fec4Smrg 61871d7fec4Smrg/*----------------------------------------------------------------------------- 61971d7fec4Smrg * gfx_set_video_offset 62071d7fec4Smrg * 62171d7fec4Smrg * This routine sets the starting offset for the video buffer when only 62271d7fec4Smrg * one offset needs to be specified. 62371d7fec4Smrg *----------------------------------------------------------------------------- 62471d7fec4Smrg */ 62571d7fec4Smrg#if GFX_VIDEO_DYNAMIC 62671d7fec4Smrgint 62771d7fec4Smrgcs5530_set_video_offset(unsigned long offset) 62871d7fec4Smrg#else 62971d7fec4Smrgint 63071d7fec4Smrggfx_set_video_offset(unsigned long offset) 63171d7fec4Smrg#endif 63271d7fec4Smrg{ 63371d7fec4Smrg /* SAVE VALUE FOR FUTURE CLIPPING OF THE TOP OF THE VIDEO WINDOW */ 63471d7fec4Smrg 63571d7fec4Smrg gfx_vid_offset = offset; 63671d7fec4Smrg 63771d7fec4Smrg /* SET VIDEO BUFFER OFFSET IN DISPLAY CONTROLLER */ 63871d7fec4Smrg /* Use private routine to abstract the display controller. */ 63971d7fec4Smrg 64071d7fec4Smrg gfx_set_display_video_offset(offset); 64171d7fec4Smrg return (0); 64271d7fec4Smrg} 64371d7fec4Smrg 64471d7fec4Smrg/*--------------------------------------------------------------------------- 64571d7fec4Smrg * gfx_set_video_scale 64671d7fec4Smrg * 64771d7fec4Smrg * This routine sets the scale factor for the video overlay window. The 64871d7fec4Smrg * size of the source and destination regions are specified in pixels. 64971d7fec4Smrg *--------------------------------------------------------------------------- 65071d7fec4Smrg */ 65171d7fec4Smrg#if GFX_VIDEO_DYNAMIC 65271d7fec4Smrgint 65371d7fec4Smrgcs5530_set_video_scale(unsigned short srcw, unsigned short srch, 65471d7fec4Smrg unsigned short dstw, unsigned short dsth) 65571d7fec4Smrg#else 65671d7fec4Smrgint 65771d7fec4Smrggfx_set_video_scale(unsigned short srcw, unsigned short srch, 65871d7fec4Smrg unsigned short dstw, unsigned short dsth) 65971d7fec4Smrg#endif 66071d7fec4Smrg{ 66171d7fec4Smrg unsigned long xscale, yscale; 66271d7fec4Smrg 66371d7fec4Smrg /* SAVE PARAMETERS */ 66471d7fec4Smrg /* These are needed for clipping the video window later. */ 66571d7fec4Smrg 66671d7fec4Smrg gfx_vid_srcw = srcw; 66771d7fec4Smrg gfx_vid_srch = srch; 66871d7fec4Smrg gfx_vid_dstw = dstw; 66971d7fec4Smrg gfx_vid_dsth = dsth; 67071d7fec4Smrg 67171d7fec4Smrg /* CALCULATE CS5530 SCALE FACTORS */ 67271d7fec4Smrg /* No downscaling in CS5530 so force to 1x if attempted. */ 67371d7fec4Smrg 67471d7fec4Smrg if (dstw <= srcw) 67571d7fec4Smrg xscale = 0x1FFF; 67671d7fec4Smrg else if (dstw == 1 || srcw == 1) 67771d7fec4Smrg return GFX_STATUS_BAD_PARAMETER; 67871d7fec4Smrg else 67971d7fec4Smrg xscale = (0x2000l * (srcw - 1l)) / (dstw - 1l); 68071d7fec4Smrg if (dsth <= srch) 68171d7fec4Smrg yscale = 0x1FFF; 68271d7fec4Smrg else if (dsth == 1 || srch == 1) 68371d7fec4Smrg return GFX_STATUS_BAD_PARAMETER; 68471d7fec4Smrg else 68571d7fec4Smrg yscale = (0x2000l * (srch - 1l)) / (dsth - 1l); 68671d7fec4Smrg WRITE_VID32(CS5530_VIDEO_SCALE, (yscale << 16) | xscale); 68771d7fec4Smrg 68871d7fec4Smrg /* CALL ROUTINE TO UPDATE WINDOW POSITION */ 68971d7fec4Smrg /* This is required because the scale values effect the number of */ 69071d7fec4Smrg /* source data pixels that need to be clipped, as well as the */ 69171d7fec4Smrg /* amount of data that needs to be transferred. */ 69271d7fec4Smrg 69371d7fec4Smrg gfx_set_video_window(gfx_vid_xpos, gfx_vid_ypos, gfx_vid_width, 69471d7fec4Smrg gfx_vid_height); 69571d7fec4Smrg return (0); 69671d7fec4Smrg} 69771d7fec4Smrg 69871d7fec4Smrg/*--------------------------------------------------------------------------- 69971d7fec4Smrg * gfx_set_video_window 70071d7fec4Smrg * 70171d7fec4Smrg * This routine sets the position and size of the video overlay window. The 70271d7fec4Smrg * position is specified in screen relative coordinates, and may be negative. 70371d7fec4Smrg * The size of destination region is specified in pixels. The line size 70471d7fec4Smrg * indicates the number of bytes of source data per scanline. 70571d7fec4Smrg *--------------------------------------------------------------------------- 70671d7fec4Smrg */ 70771d7fec4Smrg#if GFX_VIDEO_DYNAMIC 70871d7fec4Smrgint 70971d7fec4Smrgcs5530_set_video_window(short x, short y, unsigned short w, unsigned short h) 71071d7fec4Smrg#else 71171d7fec4Smrgint 71271d7fec4Smrggfx_set_video_window(short x, short y, unsigned short w, unsigned short h) 71371d7fec4Smrg#endif 71471d7fec4Smrg{ 71571d7fec4Smrg unsigned long vcfg = 0; 71671d7fec4Smrg unsigned long hadjust, vadjust; 71771d7fec4Smrg unsigned long xstart, ystart, xend, yend; 71871d7fec4Smrg 71971d7fec4Smrg /* SAVE PARAMETERS */ 72071d7fec4Smrg /* These are needed to call this routine if the scale value changes. */ 72171d7fec4Smrg 72271d7fec4Smrg gfx_vid_xpos = x; 72371d7fec4Smrg gfx_vid_ypos = y; 72471d7fec4Smrg gfx_vid_width = w; 72571d7fec4Smrg gfx_vid_height = h; 72671d7fec4Smrg 72771d7fec4Smrg /* GET ADJUSTMENT VALUES */ 72871d7fec4Smrg /* Use routines to abstract version of display controller. */ 72971d7fec4Smrg 73071d7fec4Smrg hadjust = gfx_get_htotal() - gfx_get_hsync_end() - 13l; 73171d7fec4Smrg vadjust = gfx_get_vtotal() - gfx_get_vsync_end() + 1l; 73271d7fec4Smrg 73371d7fec4Smrg /* HORIZONTAL START */ 73471d7fec4Smrg xstart = (unsigned long)x + hadjust; 73571d7fec4Smrg 73671d7fec4Smrg /* HORIZONTAL END */ 73771d7fec4Smrg /* End positions in register are non-inclusive (one more than the actual end) */ 73871d7fec4Smrg 73971d7fec4Smrg if ((x + w) < gfx_get_hactive()) 74071d7fec4Smrg xend = (unsigned long)x + (unsigned long)w + hadjust; 74171d7fec4Smrg else /* right clipping needed */ 74271d7fec4Smrg xend = (unsigned long)gfx_get_hactive() + hadjust; 74371d7fec4Smrg 74471d7fec4Smrg /* VERTICAL START */ 74571d7fec4Smrg 74671d7fec4Smrg ystart = (unsigned long)y + vadjust; 74771d7fec4Smrg 74871d7fec4Smrg /* VERTICAL END */ 74971d7fec4Smrg 75071d7fec4Smrg if ((y + h) < gfx_get_vactive()) 75171d7fec4Smrg yend = (unsigned long)y + (unsigned long)h + vadjust; 75271d7fec4Smrg else /* bottom clipping needed */ 75371d7fec4Smrg yend = (unsigned long)gfx_get_vactive() + vadjust; 75471d7fec4Smrg 75571d7fec4Smrg /* DISABLE REGISTER UPDATES */ 75671d7fec4Smrg 75771d7fec4Smrg vcfg = READ_VID32(CS5530_VIDEO_CONFIG); 75871d7fec4Smrg vcfg &= ~CS5530_VCFG_VID_REG_UPDATE; 75971d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 76071d7fec4Smrg 76171d7fec4Smrg /* SET VIDEO POSITION */ 76271d7fec4Smrg 76371d7fec4Smrg WRITE_VID32(CS5530_VIDEO_X_POS, (xend << 16) | xstart); 76471d7fec4Smrg WRITE_VID32(CS5530_VIDEO_Y_POS, (yend << 16) | ystart); 76571d7fec4Smrg 76671d7fec4Smrg vcfg |= CS5530_VCFG_VID_REG_UPDATE; 76771d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 76871d7fec4Smrg 76971d7fec4Smrg return (0); 77071d7fec4Smrg} 77171d7fec4Smrg 77271d7fec4Smrg/*--------------------------------------------------------------------------- 77371d7fec4Smrg * gfx_set_video_left_crop 77471d7fec4Smrg * 77571d7fec4Smrg * This routine sets the number of pixels which will be cropped from the 77671d7fec4Smrg * beginning of each video line. The video window will begin to display only 77771d7fec4Smrg * from the pixel following the cropped pixels, and the cropped pixels 77871d7fec4Smrg * will be ignored. 77971d7fec4Smrg *--------------------------------------------------------------------------- 78071d7fec4Smrg */ 78171d7fec4Smrg#if GFX_VIDEO_DYNAMIC 78271d7fec4Smrgint 78371d7fec4Smrgcs5530_set_video_left_crop(unsigned short x) 78471d7fec4Smrg#else 78571d7fec4Smrgint 78671d7fec4Smrggfx_set_video_left_crop(unsigned short x) 78771d7fec4Smrg#endif 78871d7fec4Smrg{ 78971d7fec4Smrg unsigned long vcfg, initread; 79071d7fec4Smrg 79171d7fec4Smrg /* CLIPPING ON LEFT */ 79271d7fec4Smrg /* Adjust initial read for scale, checking for divide by zero */ 79371d7fec4Smrg 79471d7fec4Smrg if (gfx_vid_dstw) 79571d7fec4Smrg initread = (unsigned long)x *gfx_vid_srcw / gfx_vid_dstw; 79671d7fec4Smrg 79771d7fec4Smrg else 79871d7fec4Smrg initread = 0; 79971d7fec4Smrg 80071d7fec4Smrg /* SET INITIAL READ ADDRESS AND ENABLE REGISTER UPDATES */ 80171d7fec4Smrg 80271d7fec4Smrg vcfg = READ_VID32(CS5530_VIDEO_CONFIG); 80371d7fec4Smrg vcfg &= ~CS5530_VCFG_INIT_READ_MASK; 80471d7fec4Smrg vcfg |= (initread << 15) & CS5530_VCFG_INIT_READ_MASK; 80571d7fec4Smrg vcfg |= CS5530_VCFG_VID_REG_UPDATE; 80671d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 80771d7fec4Smrg return (0); 80871d7fec4Smrg} 80971d7fec4Smrg 81071d7fec4Smrg/*--------------------------------------------------------------------------- 81171d7fec4Smrg * gfx_set_video_color_key 81271d7fec4Smrg * 81371d7fec4Smrg * This routine specifies the color key value and mask for the video overlay 81471d7fec4Smrg * hardware. To disable color key, the color and mask should both be set to 81571d7fec4Smrg * zero. The hardware uses the color key in the following equation: 81671d7fec4Smrg * 81771d7fec4Smrg * ((source data) & (color key mask)) == ((color key) & (color key mask)) 81871d7fec4Smrg * 81971d7fec4Smrg * The source data can be either graphics data or video data. The bluescreen 82071d7fec4Smrg * parameter is set to have the hardware compare video data and clear to 82171d7fec4Smrg * comapare graphics data. 82271d7fec4Smrg *--------------------------------------------------------------------------- 82371d7fec4Smrg */ 82471d7fec4Smrg#if GFX_VIDEO_DYNAMIC 82571d7fec4Smrgint 82671d7fec4Smrgcs5530_set_video_color_key(unsigned long key, unsigned long mask, 82771d7fec4Smrg int graphics) 82871d7fec4Smrg#else 82971d7fec4Smrgint 83071d7fec4Smrggfx_set_video_color_key(unsigned long key, unsigned long mask, int graphics) 83171d7fec4Smrg#endif 83271d7fec4Smrg{ 83371d7fec4Smrg unsigned long dcfg = 0; 83471d7fec4Smrg 83571d7fec4Smrg /* SET CS5530 COLOR KEY VALUE */ 83671d7fec4Smrg 83771d7fec4Smrg WRITE_VID32(CS5530_VIDEO_COLOR_KEY, key); 83871d7fec4Smrg WRITE_VID32(CS5530_VIDEO_COLOR_MASK, mask); 83971d7fec4Smrg 84071d7fec4Smrg /* SELECT GRAPHICS OR VIDEO DATA TO COMPARE TO THE COLOR KEY */ 84171d7fec4Smrg 84271d7fec4Smrg dcfg = READ_VID32(CS5530_DISPLAY_CONFIG); 84371d7fec4Smrg if (graphics & 0x01) 84471d7fec4Smrg dcfg &= ~CS5530_DCFG_VG_CK; 84571d7fec4Smrg else 84671d7fec4Smrg dcfg |= CS5530_DCFG_VG_CK; 84771d7fec4Smrg WRITE_VID32(CS5530_DISPLAY_CONFIG, dcfg); 84871d7fec4Smrg return (0); 84971d7fec4Smrg} 85071d7fec4Smrg 85171d7fec4Smrg/*--------------------------------------------------------------------------- 85271d7fec4Smrg * gfx_set_video_filter 85371d7fec4Smrg * 85471d7fec4Smrg * This routine enables or disables the video overlay filters. 85571d7fec4Smrg *--------------------------------------------------------------------------- 85671d7fec4Smrg */ 85771d7fec4Smrg#if GFX_VIDEO_DYNAMIC 85871d7fec4Smrgint 85971d7fec4Smrgcs5530_set_video_filter(int xfilter, int yfilter) 86071d7fec4Smrg#else 86171d7fec4Smrgint 86271d7fec4Smrggfx_set_video_filter(int xfilter, int yfilter) 86371d7fec4Smrg#endif 86471d7fec4Smrg{ 86571d7fec4Smrg unsigned long vcfg = 0; 86671d7fec4Smrg 86771d7fec4Smrg /* ENABLE OR DISABLE CS5530 VIDEO OVERLAY FILTERS */ 86871d7fec4Smrg 86971d7fec4Smrg vcfg = READ_VID32(CS5530_VIDEO_CONFIG); 87071d7fec4Smrg vcfg &= ~(CS5530_VCFG_X_FILTER_EN | CS5530_VCFG_Y_FILTER_EN); 87171d7fec4Smrg if (xfilter) 87271d7fec4Smrg vcfg |= CS5530_VCFG_X_FILTER_EN; 87371d7fec4Smrg if (yfilter) 87471d7fec4Smrg vcfg |= CS5530_VCFG_Y_FILTER_EN; 87571d7fec4Smrg WRITE_VID32(CS5530_VIDEO_CONFIG, vcfg); 87671d7fec4Smrg 87771d7fec4Smrg return (0); 87871d7fec4Smrg} 87971d7fec4Smrg 88071d7fec4Smrg/*--------------------------------------------------------------------------- 88171d7fec4Smrg * gfx_set_video_palette 88271d7fec4Smrg * 88371d7fec4Smrg * This routine loads the video hardware palette. If a NULL pointer is 88471d7fec4Smrg * specified, the palette is bypassed (for CS5530, this means loading the 88571d7fec4Smrg * palette with identity values). 88671d7fec4Smrg *--------------------------------------------------------------------------- 88771d7fec4Smrg */ 88871d7fec4Smrg#if GFX_VIDEO_DYNAMIC 88971d7fec4Smrgint 89071d7fec4Smrgcs5530_set_video_palette(unsigned long *palette) 89171d7fec4Smrg#else 89271d7fec4Smrgint 89371d7fec4Smrggfx_set_video_palette(unsigned long *palette) 89471d7fec4Smrg#endif 89571d7fec4Smrg{ 89671d7fec4Smrg unsigned long i, entry; 89771d7fec4Smrg 89871d7fec4Smrg /* LOAD CS5530 VIDEO PALETTE */ 89971d7fec4Smrg 90071d7fec4Smrg WRITE_VID32(CS5530_PALETTE_ADDRESS, 0); 90171d7fec4Smrg for (i = 0; i < 256; i++) { 90271d7fec4Smrg if (palette) 90371d7fec4Smrg entry = palette[i]; 90471d7fec4Smrg else 90571d7fec4Smrg entry = i | (i << 8) | (i << 16); 90671d7fec4Smrg WRITE_VID32(CS5530_PALETTE_DATA, entry); 90771d7fec4Smrg } 90871d7fec4Smrg return (0); 90971d7fec4Smrg} 91071d7fec4Smrg 91171d7fec4Smrg/*--------------------------------------------------------------------------- 91271d7fec4Smrg * gfx_set_video_palette_entry 91371d7fec4Smrg * 91471d7fec4Smrg * This routine loads a single entry of the video hardware palette. 91571d7fec4Smrg *--------------------------------------------------------------------------- 91671d7fec4Smrg */ 91771d7fec4Smrg#if GFX_VIDEO_DYNAMIC 91871d7fec4Smrgint 91971d7fec4Smrgcs5530_set_video_palette_entry(unsigned long index, unsigned long palette) 92071d7fec4Smrg#else 92171d7fec4Smrgint 92271d7fec4Smrggfx_set_video_palette_entry(unsigned long index, unsigned long palette) 92371d7fec4Smrg#endif 92471d7fec4Smrg{ 92571d7fec4Smrg if (index > 0xFF) 92671d7fec4Smrg return GFX_STATUS_BAD_PARAMETER; 92771d7fec4Smrg 92871d7fec4Smrg /* SET A SINGLE ENTRY */ 92971d7fec4Smrg 93071d7fec4Smrg WRITE_VID32(CS5530_PALETTE_ADDRESS, index); 93171d7fec4Smrg WRITE_VID32(CS5530_PALETTE_DATA, palette); 93271d7fec4Smrg 93371d7fec4Smrg return (0); 93471d7fec4Smrg} 93571d7fec4Smrg 93671d7fec4Smrg#define CX55xx_VIDEO_PCI_44 0x80009444 93771d7fec4Smrg 93871d7fec4Smrg/*--------------------------------------------------------------------------- 93971d7fec4Smrg * gfx_disable_softvga 94071d7fec4Smrg * 94171d7fec4Smrg * Disables SoftVga. This function is only valid with VSA2, Returns 1 if 94271d7fec4Smrg * SoftVga can be disabled; 0 if not. 94371d7fec4Smrg *--------------------------------------------------------------------------- 94471d7fec4Smrg */ 94571d7fec4Smrg#if GFX_VIDEO_DYNAMIC 94671d7fec4Smrgint 94771d7fec4Smrgcs5530_disable_softvga(void) 94871d7fec4Smrg#else 94971d7fec4Smrgint 95071d7fec4Smrggfx_disable_softvga(void) 95171d7fec4Smrg#endif 95271d7fec4Smrg{ 95371d7fec4Smrg unsigned long reg_val; 95471d7fec4Smrg 95571d7fec4Smrg /* get the current value */ 95671d7fec4Smrg reg_val = gfx_pci_config_read(CX55xx_VIDEO_PCI_44); 95771d7fec4Smrg /* setting video PCI register 44 bit 0 to 1 disables SoftVga */ 95871d7fec4Smrg reg_val |= 0x1; 95971d7fec4Smrg gfx_pci_config_write(CX55xx_VIDEO_PCI_44, reg_val); 96071d7fec4Smrg 96171d7fec4Smrg /* see if we set the bit and return the appropriate value */ 96271d7fec4Smrg reg_val = gfx_pci_config_read(CX55xx_VIDEO_PCI_44); 96371d7fec4Smrg if ((reg_val & 0x1) == 0x1) 96471d7fec4Smrg return (1); 96571d7fec4Smrg else 96671d7fec4Smrg return (0); 96771d7fec4Smrg 96871d7fec4Smrg} 96971d7fec4Smrg 97071d7fec4Smrg/*--------------------------------------------------------------------------- 97171d7fec4Smrg * gfx_enable_softvga 97271d7fec4Smrg * 97371d7fec4Smrg * Enables SoftVga. This function is only valid with VSA2, Returns 1 if 97471d7fec4Smrg * SoftVga can be enbled; 0 if not. 97571d7fec4Smrg *--------------------------------------------------------------------------- 97671d7fec4Smrg */ 97771d7fec4Smrg#if GFX_VIDEO_DYNAMIC 97871d7fec4Smrgint 97971d7fec4Smrgcs5530_enable_softvga(void) 98071d7fec4Smrg#else 98171d7fec4Smrgint 98271d7fec4Smrggfx_enable_softvga(void) 98371d7fec4Smrg#endif 98471d7fec4Smrg{ 98571d7fec4Smrg unsigned long reg_val; 98671d7fec4Smrg 98771d7fec4Smrg /* get the current value */ 98871d7fec4Smrg reg_val = gfx_pci_config_read(CX55xx_VIDEO_PCI_44); 98971d7fec4Smrg /* clearing video PCI register 44 bit 0 enables SoftVga */ 99071d7fec4Smrg gfx_pci_config_write(CX55xx_VIDEO_PCI_44, reg_val & 0xfffffffe); 99171d7fec4Smrg 99271d7fec4Smrg /* see if we cleared the bit and return the appropriate value */ 99371d7fec4Smrg reg_val = gfx_pci_config_read(CX55xx_VIDEO_PCI_44); 99471d7fec4Smrg if ((reg_val & 0x1) == 0) 99571d7fec4Smrg return (1); 99671d7fec4Smrg else 99771d7fec4Smrg return (0); 99871d7fec4Smrg 99971d7fec4Smrg} 100071d7fec4Smrg 100171d7fec4Smrg/*--------------------------------------------------------------------------- 100271d7fec4Smrg * gfx_get_clock_frequency 100371d7fec4Smrg * 100471d7fec4Smrg * This routine returns the current clock frequency in 16.16 format. 100571d7fec4Smrg * It reads the current register value and finds the match in the table. 100671d7fec4Smrg * If no match is found, this routine returns 0. 100771d7fec4Smrg *--------------------------------------------------------------------------- 100871d7fec4Smrg */ 100971d7fec4Smrg#if GFX_VIDEO_DYNAMIC 101071d7fec4Smrgunsigned long 101171d7fec4Smrgcs5530_get_clock_frequency(void) 101271d7fec4Smrg#else 101371d7fec4Smrgunsigned long 101471d7fec4Smrggfx_get_clock_frequency(void) 101571d7fec4Smrg#endif 101671d7fec4Smrg{ 101771d7fec4Smrg unsigned int index; 101871d7fec4Smrg unsigned long value, mask; 101971d7fec4Smrg 102071d7fec4Smrg mask = 0x7FFFFEDC; 102171d7fec4Smrg value = READ_VID32(CS5530_DOT_CLK_CONFIG) & mask; 102271d7fec4Smrg for (index = 0; index < NUM_CS5530_FREQUENCIES; index++) { 102371d7fec4Smrg if ((CS5530_PLLtable[index].pll_value & mask) == value) 102471d7fec4Smrg return (CS5530_PLLtable[index].frequency); 102571d7fec4Smrg } 102671d7fec4Smrg return (0); 102771d7fec4Smrg} 102871d7fec4Smrg 102971d7fec4Smrg/*************************************************************/ 103071d7fec4Smrg/* READ ROUTINES | INCLUDED FOR DIAGNOSTIC PURPOSES ONLY */ 103171d7fec4Smrg/*************************************************************/ 103271d7fec4Smrg 103371d7fec4Smrg#if GFX_READ_ROUTINES 103471d7fec4Smrg 103571d7fec4Smrg/*--------------------------------------------------------------------------- 103671d7fec4Smrg * gfx_get_vsa2_softvga_enable 103771d7fec4Smrg * 103871d7fec4Smrg * This function returns the enable status of SoftVGA. It is valid 103971d7fec4Smrg * only if VSAII is present. 104071d7fec4Smrg *--------------------------------------------------------------------------- 104171d7fec4Smrg */ 104271d7fec4Smrg#if GFX_VIDEO_DYNAMIC 104371d7fec4Smrgint 104471d7fec4Smrgcs5530_get_vsa2_softvga_enable(void) 104571d7fec4Smrg#else 104671d7fec4Smrgint 104771d7fec4Smrggfx_get_vsa2_softvga_enable(void) 104871d7fec4Smrg#endif 104971d7fec4Smrg{ 105071d7fec4Smrg unsigned long reg_val; 105171d7fec4Smrg 105271d7fec4Smrg reg_val = gfx_pci_config_read(CX55xx_VIDEO_PCI_44); 105371d7fec4Smrg if ((reg_val & 0x1) == 0) 105471d7fec4Smrg return (1); 105571d7fec4Smrg else 105671d7fec4Smrg return (0); 105771d7fec4Smrg 105871d7fec4Smrg} 105971d7fec4Smrg 106071d7fec4Smrg/*--------------------------------------------------------------------------- 106171d7fec4Smrg * gfx_get_sync_polarities 106271d7fec4Smrg * 106371d7fec4Smrg * This routine returns the polarities of the sync pulses: 106471d7fec4Smrg * Bit 0: Set if negative horizontal polarity. 106571d7fec4Smrg * Bit 1: Set if negative vertical polarity. 106671d7fec4Smrg *--------------------------------------------------------------------------- 106771d7fec4Smrg */ 106871d7fec4Smrg#if GFX_VIDEO_DYNAMIC 106971d7fec4Smrgint 107071d7fec4Smrgcs5530_get_sync_polarities(void) 107171d7fec4Smrg#else 107271d7fec4Smrgint 107371d7fec4Smrggfx_get_sync_polarities(void) 107471d7fec4Smrg#endif 107571d7fec4Smrg{ 107671d7fec4Smrg int polarities = 0; 107771d7fec4Smrg 107871d7fec4Smrg if (READ_VID32(CS5530_DISPLAY_CONFIG) & 0x00000100) 107971d7fec4Smrg polarities |= 1; 108071d7fec4Smrg if (READ_VID32(CS5530_DISPLAY_CONFIG) & 0x00000200) 108171d7fec4Smrg polarities |= 2; 108271d7fec4Smrg return (polarities); 108371d7fec4Smrg} 108471d7fec4Smrg 108571d7fec4Smrg/*--------------------------------------------------------------------------- 108671d7fec4Smrg * gfx_get_video_palette_entry 108771d7fec4Smrg * 108871d7fec4Smrg * This routine returns a single palette entry. 108971d7fec4Smrg *--------------------------------------------------------------------------- 109071d7fec4Smrg */ 109171d7fec4Smrg#if GFX_VIDEO_DYNAMIC 109271d7fec4Smrgint 109371d7fec4Smrgcs5530_get_video_palette_entry(unsigned long index, unsigned long *palette) 109471d7fec4Smrg#else 109571d7fec4Smrgint 109671d7fec4Smrggfx_get_video_palette_entry(unsigned long index, unsigned long *palette) 109771d7fec4Smrg#endif 109871d7fec4Smrg{ 109971d7fec4Smrg if (index > 0xFF) 110071d7fec4Smrg return GFX_STATUS_BAD_PARAMETER; 110171d7fec4Smrg 110271d7fec4Smrg /* READ A SINGLE ENTRY */ 110371d7fec4Smrg 110471d7fec4Smrg WRITE_VID32(CS5530_PALETTE_ADDRESS, index); 110571d7fec4Smrg *palette = READ_VID32(CS5530_PALETTE_DATA); 110671d7fec4Smrg 110771d7fec4Smrg return (GFX_STATUS_OK); 110871d7fec4Smrg} 110971d7fec4Smrg 111071d7fec4Smrg/*----------------------------------------------------------------------------- 111171d7fec4Smrg * gfx_get_video_enable 111271d7fec4Smrg * 111371d7fec4Smrg * This routine returns the value "one" if video overlay is currently enabled, 111471d7fec4Smrg * otherwise it returns the value "zero". 111571d7fec4Smrg *----------------------------------------------------------------------------- 111671d7fec4Smrg */ 111771d7fec4Smrg#if GFX_VIDEO_DYNAMIC 111871d7fec4Smrgint 111971d7fec4Smrgcs5530_get_video_enable(void) 112071d7fec4Smrg#else 112171d7fec4Smrgint 112271d7fec4Smrggfx_get_video_enable(void) 112371d7fec4Smrg#endif 112471d7fec4Smrg{ 112571d7fec4Smrg if (READ_VID32(CS5530_VIDEO_CONFIG) & CS5530_VCFG_VID_EN) 112671d7fec4Smrg return (1); 112771d7fec4Smrg return (0); 112871d7fec4Smrg} 112971d7fec4Smrg 113071d7fec4Smrg/*----------------------------------------------------------------------------- 113171d7fec4Smrg * gfx_get_video_format 113271d7fec4Smrg * 113371d7fec4Smrg * This routine returns the current video overlay format. 113471d7fec4Smrg *----------------------------------------------------------------------------- 113571d7fec4Smrg */ 113671d7fec4Smrg#if GFX_VIDEO_DYNAMIC 113771d7fec4Smrgint 113871d7fec4Smrgcs5530_get_video_format(void) 113971d7fec4Smrg#else 114071d7fec4Smrgint 114171d7fec4Smrggfx_get_video_format(void) 114271d7fec4Smrg#endif 114371d7fec4Smrg{ 114471d7fec4Smrg unsigned long vcfg; 114571d7fec4Smrg 114671d7fec4Smrg vcfg = READ_VID32(CS5530_VIDEO_CONFIG); 114771d7fec4Smrg if (vcfg & CS5530_VCFG_CSC_BYPASS) 114871d7fec4Smrg return (VIDEO_FORMAT_RGB); 114971d7fec4Smrg if (vcfg & CS5530_VCFG_4_2_0_MODE) 115071d7fec4Smrg return (VIDEO_FORMAT_Y0Y1Y2Y3); 115171d7fec4Smrg 115271d7fec4Smrg return ((int)((vcfg >> 2) & 3)); 115371d7fec4Smrg} 115471d7fec4Smrg 115571d7fec4Smrg/*----------------------------------------------------------------------------- 115671d7fec4Smrg * gfx_get_video_src_size 115771d7fec4Smrg * 115871d7fec4Smrg * This routine returns the size of the source video overlay buffer. The 115971d7fec4Smrg * return value is (height << 16) | width. 116071d7fec4Smrg *----------------------------------------------------------------------------- 116171d7fec4Smrg */ 116271d7fec4Smrg#if GFX_VIDEO_DYNAMIC 116371d7fec4Smrgunsigned long 116471d7fec4Smrgcs5530_get_video_src_size(void) 116571d7fec4Smrg#else 116671d7fec4Smrgunsigned long 116771d7fec4Smrggfx_get_video_src_size(void) 116871d7fec4Smrg#endif 116971d7fec4Smrg{ 117071d7fec4Smrg unsigned long width = 0, height = 0; 117171d7fec4Smrg 117271d7fec4Smrg /* DETERMINE SOURCE WIDTH FROM THE CS5530 VIDEO LINE SIZE */ 117371d7fec4Smrg 117471d7fec4Smrg width = (READ_VID32(CS5530_VIDEO_CONFIG) >> 7) & 0x000001FE; 117571d7fec4Smrg if (READ_VID32(CS5530_VIDEO_CONFIG) & CS5530_VCFG_LINE_SIZE_UPPER) 117671d7fec4Smrg width += 512l; 117771d7fec4Smrg 117871d7fec4Smrg if (width) { 117971d7fec4Smrg /* DETERMINE HEIGHT BY DIVIDING TOTAL SIZE BY WIDTH */ 118071d7fec4Smrg /* Get total size from display controller - abtracted. */ 118171d7fec4Smrg 118271d7fec4Smrg height = gfx_get_display_video_size() / (width << 1); 118371d7fec4Smrg } 118471d7fec4Smrg return ((height << 16) | width); 118571d7fec4Smrg} 118671d7fec4Smrg 118771d7fec4Smrg/*----------------------------------------------------------------------------- 118871d7fec4Smrg * gfx_get_video_line_size 118971d7fec4Smrg * 119071d7fec4Smrg * This routine returns the line size of the source video overlay buffer, in 119171d7fec4Smrg * pixels. 119271d7fec4Smrg *----------------------------------------------------------------------------- 119371d7fec4Smrg */ 119471d7fec4Smrg#if GFX_VIDEO_DYNAMIC 119571d7fec4Smrgunsigned long 119671d7fec4Smrgcs5530_get_video_line_size(void) 119771d7fec4Smrg#else 119871d7fec4Smrgunsigned long 119971d7fec4Smrggfx_get_video_line_size(void) 120071d7fec4Smrg#endif 120171d7fec4Smrg{ 120271d7fec4Smrg unsigned long width = 0; 120371d7fec4Smrg 120471d7fec4Smrg /* DETERMINE SOURCE WIDTH FROM THE CS5530 VIDEO LINE SIZE */ 120571d7fec4Smrg 120671d7fec4Smrg width = (READ_VID32(CS5530_VIDEO_CONFIG) >> 7) & 0x000001FE; 120771d7fec4Smrg if (READ_VID32(CS5530_VIDEO_CONFIG) & CS5530_VCFG_LINE_SIZE_UPPER) 120871d7fec4Smrg width += 512l; 120971d7fec4Smrg return (width); 121071d7fec4Smrg} 121171d7fec4Smrg 121271d7fec4Smrg/*----------------------------------------------------------------------------- 121371d7fec4Smrg * gfx_get_video_xclip 121471d7fec4Smrg * 121571d7fec4Smrg * This routine returns the number of bytes clipped on the left side of a 121671d7fec4Smrg * video overlay line (skipped at beginning). 121771d7fec4Smrg *----------------------------------------------------------------------------- 121871d7fec4Smrg */ 121971d7fec4Smrg#if GFX_VIDEO_DYNAMIC 122071d7fec4Smrgunsigned long 122171d7fec4Smrgcs5530_get_video_xclip(void) 122271d7fec4Smrg#else 122371d7fec4Smrgunsigned long 122471d7fec4Smrggfx_get_video_xclip(void) 122571d7fec4Smrg#endif 122671d7fec4Smrg{ 122771d7fec4Smrg unsigned long clip = 0; 122871d7fec4Smrg 122971d7fec4Smrg /* DETERMINE SOURCE WIDTH FROM THE CS5530 VIDEO LINE SIZE */ 123071d7fec4Smrg 123171d7fec4Smrg clip = (READ_VID32(CS5530_VIDEO_CONFIG) >> 14) & 0x000007FC; 123271d7fec4Smrg return (clip); 123371d7fec4Smrg} 123471d7fec4Smrg 123571d7fec4Smrg/*----------------------------------------------------------------------------- 123671d7fec4Smrg * gfx_get_video_offset 123771d7fec4Smrg * 123871d7fec4Smrg * This routine returns the current offset for the video overlay buffer. 123971d7fec4Smrg *----------------------------------------------------------------------------- 124071d7fec4Smrg */ 124171d7fec4Smrg#if GFX_VIDEO_DYNAMIC 124271d7fec4Smrgunsigned long 124371d7fec4Smrgcs5530_get_video_offset(void) 124471d7fec4Smrg#else 124571d7fec4Smrgunsigned long 124671d7fec4Smrggfx_get_video_offset(void) 124771d7fec4Smrg#endif 124871d7fec4Smrg{ 124971d7fec4Smrg return (gfx_get_display_video_offset()); 125071d7fec4Smrg} 125171d7fec4Smrg 125271d7fec4Smrg/*--------------------------------------------------------------------------- 125371d7fec4Smrg * gfx_get_video_scale 125471d7fec4Smrg * 125571d7fec4Smrg * This routine returns the scale factor for the video overlay window. 125671d7fec4Smrg *--------------------------------------------------------------------------- 125771d7fec4Smrg */ 125871d7fec4Smrg#if GFX_VIDEO_DYNAMIC 125971d7fec4Smrgunsigned long 126071d7fec4Smrgcs5530_get_video_scale(void) 126171d7fec4Smrg#else 126271d7fec4Smrgunsigned long 126371d7fec4Smrggfx_get_video_scale(void) 126471d7fec4Smrg#endif 126571d7fec4Smrg{ 126671d7fec4Smrg return (READ_VID32(CS5530_VIDEO_SCALE)); 126771d7fec4Smrg} 126871d7fec4Smrg 126971d7fec4Smrg/*--------------------------------------------------------------------------- 127071d7fec4Smrg * gfx_get_video_dst_size 127171d7fec4Smrg * 127271d7fec4Smrg * This routine returns the size of the displayed video overlay window. 127371d7fec4Smrg * NOTE: This is the displayed window size, which may be different from 127471d7fec4Smrg * the real window size if clipped. 127571d7fec4Smrg *--------------------------------------------------------------------------- 127671d7fec4Smrg */ 127771d7fec4Smrg#if GFX_VIDEO_DYNAMIC 127871d7fec4Smrgunsigned long 127971d7fec4Smrgcs5530_get_video_dst_size(void) 128071d7fec4Smrg#else 128171d7fec4Smrgunsigned long 128271d7fec4Smrggfx_get_video_dst_size(void) 128371d7fec4Smrg#endif 128471d7fec4Smrg{ 128571d7fec4Smrg unsigned long xsize, ysize; 128671d7fec4Smrg 128771d7fec4Smrg xsize = READ_VID32(CS5530_VIDEO_X_POS); 128871d7fec4Smrg xsize = ((xsize >> 16) & 0x7FF) - (xsize & 0x07FF); 128971d7fec4Smrg ysize = READ_VID32(CS5530_VIDEO_Y_POS); 129071d7fec4Smrg ysize = ((ysize >> 16) & 0x7FF) - (ysize & 0x07FF); 129171d7fec4Smrg return ((ysize << 16) | xsize); 129271d7fec4Smrg} 129371d7fec4Smrg 129471d7fec4Smrg/*--------------------------------------------------------------------------- 129571d7fec4Smrg * gfx_get_video_position 129671d7fec4Smrg * 129771d7fec4Smrg * This routine returns the position of the video overlay window. The 129871d7fec4Smrg * return value is (ypos << 16) | xpos. 129971d7fec4Smrg * NOTE: This is the displayed window position, which may be different from 130071d7fec4Smrg * the real window position if clipped. 130171d7fec4Smrg *--------------------------------------------------------------------------- 130271d7fec4Smrg */ 130371d7fec4Smrg#if GFX_VIDEO_DYNAMIC 130471d7fec4Smrgunsigned long 130571d7fec4Smrgcs5530_get_video_position(void) 130671d7fec4Smrg#else 130771d7fec4Smrgunsigned long 130871d7fec4Smrggfx_get_video_position(void) 130971d7fec4Smrg#endif 131071d7fec4Smrg{ 131171d7fec4Smrg unsigned long hadjust, vadjust; 131271d7fec4Smrg unsigned long xpos, ypos; 131371d7fec4Smrg 131471d7fec4Smrg /* READ HARDWARE POSITION */ 131571d7fec4Smrg 131671d7fec4Smrg xpos = READ_VID32(CS5530_VIDEO_X_POS) & 0x000007FF; 131771d7fec4Smrg ypos = READ_VID32(CS5530_VIDEO_Y_POS) & 0x000007FF; 131871d7fec4Smrg 131971d7fec4Smrg /* GET ADJUSTMENT VALUES */ 132071d7fec4Smrg /* Use routines to abstract version of display controller. */ 132171d7fec4Smrg 132271d7fec4Smrg hadjust = gfx_get_htotal() - gfx_get_hsync_end() - 13l; 132371d7fec4Smrg vadjust = gfx_get_vtotal() - gfx_get_vsync_end() + 1l; 132471d7fec4Smrg xpos -= hadjust; 132571d7fec4Smrg ypos -= vadjust; 132671d7fec4Smrg return ((ypos << 16) | (xpos & 0x0000FFFF)); 132771d7fec4Smrg} 132871d7fec4Smrg 132971d7fec4Smrg/*--------------------------------------------------------------------------- 133071d7fec4Smrg * gfx_get_video_color_key 133171d7fec4Smrg * 133271d7fec4Smrg * This routine returns the current video color key value. 133371d7fec4Smrg *--------------------------------------------------------------------------- 133471d7fec4Smrg */ 133571d7fec4Smrg#if GFX_VIDEO_DYNAMIC 133671d7fec4Smrgunsigned long 133771d7fec4Smrgcs5530_get_video_color_key(void) 133871d7fec4Smrg#else 133971d7fec4Smrgunsigned long 134071d7fec4Smrggfx_get_video_color_key(void) 134171d7fec4Smrg#endif 134271d7fec4Smrg{ 134371d7fec4Smrg return (READ_VID32(CS5530_VIDEO_COLOR_KEY)); 134471d7fec4Smrg} 134571d7fec4Smrg 134671d7fec4Smrg/*--------------------------------------------------------------------------- 134771d7fec4Smrg * gfx_get_video_color_key_mask 134871d7fec4Smrg * 134971d7fec4Smrg * This routine returns the current video color mask value. 135071d7fec4Smrg *--------------------------------------------------------------------------- 135171d7fec4Smrg */ 135271d7fec4Smrg#if GFX_VIDEO_DYNAMIC 135371d7fec4Smrgunsigned long 135471d7fec4Smrgcs5530_get_video_color_key_mask(void) 135571d7fec4Smrg#else 135671d7fec4Smrgunsigned long 135771d7fec4Smrggfx_get_video_color_key_mask(void) 135871d7fec4Smrg#endif 135971d7fec4Smrg{ 136071d7fec4Smrg return (READ_VID32(CS5530_VIDEO_COLOR_MASK)); 136171d7fec4Smrg} 136271d7fec4Smrg 136371d7fec4Smrg/*--------------------------------------------------------------------------- 136471d7fec4Smrg * gfx_get_video_color_key_src 136571d7fec4Smrg * 136671d7fec4Smrg * This routine returns 0 for video data compare, 1 for graphics data. 136771d7fec4Smrg *--------------------------------------------------------------------------- 136871d7fec4Smrg */ 136971d7fec4Smrg#if GFX_VIDEO_DYNAMIC 137071d7fec4Smrgint 137171d7fec4Smrgcs5530_get_video_color_key_src(void) 137271d7fec4Smrg#else 137371d7fec4Smrgint 137471d7fec4Smrggfx_get_video_color_key_src(void) 137571d7fec4Smrg#endif 137671d7fec4Smrg{ 137771d7fec4Smrg if (READ_VID32(CS5530_DISPLAY_CONFIG) & CS5530_DCFG_VG_CK) 137871d7fec4Smrg return (0); 137971d7fec4Smrg return (1); 138071d7fec4Smrg} 138171d7fec4Smrg 138271d7fec4Smrg/*--------------------------------------------------------------------------- 138371d7fec4Smrg * gfx_get_video_filter 138471d7fec4Smrg * 138571d7fec4Smrg * This routine returns if the filters are currently enabled. 138671d7fec4Smrg *--------------------------------------------------------------------------- 138771d7fec4Smrg */ 138871d7fec4Smrg#if GFX_VIDEO_DYNAMIC 138971d7fec4Smrgint 139071d7fec4Smrgcs5530_get_video_filter(void) 139171d7fec4Smrg#else 139271d7fec4Smrgint 139371d7fec4Smrggfx_get_video_filter(void) 139471d7fec4Smrg#endif 139571d7fec4Smrg{ 139671d7fec4Smrg int retval = 0; 139771d7fec4Smrg 139871d7fec4Smrg if (READ_VID32(CS5530_VIDEO_CONFIG) & CS5530_VCFG_X_FILTER_EN) 139971d7fec4Smrg retval |= 1; 140071d7fec4Smrg if (READ_VID32(CS5530_VIDEO_CONFIG) & CS5530_VCFG_Y_FILTER_EN) 140171d7fec4Smrg retval |= 2; 140271d7fec4Smrg return (retval); 140371d7fec4Smrg} 140471d7fec4Smrg 140571d7fec4Smrg/*--------------------------------------------------------------------------- 140671d7fec4Smrg * gfx_read_crc 140771d7fec4Smrg * 140871d7fec4Smrg * This routine returns the hardware CRC value, which is used for automated 140971d7fec4Smrg * testing. The value is like a checksum, but will change if pixels move 141071d7fec4Smrg * locations. 141171d7fec4Smrg *--------------------------------------------------------------------------- 141271d7fec4Smrg */ 141371d7fec4Smrg#if GFX_VIDEO_DYNAMIC 141471d7fec4Smrgunsigned long 141571d7fec4Smrgcs5530_read_crc(void) 141671d7fec4Smrg#else 141771d7fec4Smrgunsigned long 141871d7fec4Smrggfx_read_crc(void) 141971d7fec4Smrg#endif 142071d7fec4Smrg{ 142171d7fec4Smrg unsigned long crc = 0xFFFFFFFF; 142271d7fec4Smrg 142371d7fec4Smrg if (gfx_test_timing_active()) { 142471d7fec4Smrg /* WAIT UNTIL ACTIVE DISPLAY */ 142571d7fec4Smrg 142671d7fec4Smrg while (!gfx_test_vertical_active()) ; 142771d7fec4Smrg 142871d7fec4Smrg /* RESET CRC DURING ACTIVE DISPLAY */ 142971d7fec4Smrg 143071d7fec4Smrg WRITE_VID32(CS5530_CRCSIG_TFT_TV, 0); 143171d7fec4Smrg WRITE_VID32(CS5530_CRCSIG_TFT_TV, 1); 143271d7fec4Smrg 143371d7fec4Smrg /* WAIT UNTIL NOT ACTIVE, THEN ACTIVE, NOT ACTIVE, THEN ACTIVE */ 143471d7fec4Smrg 143571d7fec4Smrg while (gfx_test_vertical_active()) ; 143671d7fec4Smrg while (!gfx_test_vertical_active()) ; 143771d7fec4Smrg while (gfx_test_vertical_active()) ; 143871d7fec4Smrg while (!gfx_test_vertical_active()) ; 143971d7fec4Smrg crc = READ_VID32(CS5530_CRCSIG_TFT_TV) >> 8; 144071d7fec4Smrg } 144171d7fec4Smrg return (crc); 144271d7fec4Smrg} 144371d7fec4Smrg 144471d7fec4Smrg#endif /* GFX_READ_ROUTINES */ 144571d7fec4Smrg 144671d7fec4Smrg/* END OF FILE */ 1447