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