102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab/*
202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  Driver for the Conexant CX25821 PCIe bridge
302b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *
4bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab *  Copyright (C) 2009 Conexant Systems Inc.
502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  Authors  <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *
702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  This program is free software; you can redistribute it and/or modify
802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  it under the terms of the GNU General Public License as published by
902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  the Free Software Foundation; either version 2 of the License, or
1002b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  (at your option) any later version.
1102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *
1202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  This program is distributed in the hope that it will be useful,
1302b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  but WITHOUT ANY WARRANTY; without even the implied warranty of
1402b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *
1602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  GNU General Public License for more details.
1702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *
1802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  You should have received a copy of the GNU General Public License
1902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  along with this program; if not, write to the Free Software
2002b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
2102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab */
2202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
2336d89f7de4a4937848de86d9b35cb03a9f0357e1Joe Perches#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2436d89f7de4a4937848de86d9b35cb03a9f0357e1Joe Perches
2502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab#include "cx25821.h"
2602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab#include "cx25821-medusa-video.h"
2702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab#include "cx25821-biffuncs.h"
2802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
290dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu/*
300dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu * medusa_enable_bluefield_output()
310dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu *
320dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu * Enable the generation of blue filed output if no video
330dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu *
340dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu */
351a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehabstatic void medusa_enable_bluefield_output(struct cx25821_dev *dev, int channel,
361a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab					   int enable)
3702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
381a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 value = 0;
391a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 tmp = 0;
401a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int out_ctrl = OUT_CTRL1;
411a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int out_ctrl_ns = OUT_CTRL_NS;
42bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
431a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	switch (channel) {
44bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	default:
45bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_A:
461a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
47bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_B:
481a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl = VDEC_B_OUT_CTRL1;
491a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl_ns = VDEC_B_OUT_CTRL_NS;
501a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
51bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_C:
521a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl = VDEC_C_OUT_CTRL1;
531a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl_ns = VDEC_C_OUT_CTRL_NS;
541a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
55bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_D:
561a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl = VDEC_D_OUT_CTRL1;
571a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl_ns = VDEC_D_OUT_CTRL_NS;
581a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
59bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_E:
601a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl = VDEC_E_OUT_CTRL1;
611a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl_ns = VDEC_E_OUT_CTRL_NS;
621a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return;
63bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_F:
641a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl = VDEC_F_OUT_CTRL1;
651a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl_ns = VDEC_F_OUT_CTRL_NS;
661a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return;
67bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_G:
681a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl = VDEC_G_OUT_CTRL1;
691a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl_ns = VDEC_G_OUT_CTRL_NS;
701a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return;
71bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_H:
721a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl = VDEC_H_OUT_CTRL1;
731a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		out_ctrl_ns = VDEC_H_OUT_CTRL_NS;
741a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return;
751a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
761a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
771a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], out_ctrl, &tmp);
780dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	value &= 0xFFFFFF7F;	/* clear BLUE_FIELD_EN */
791a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	if (enable)
800dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x00000080;	/* set BLUE_FIELD_EN */
8130fdf035874a3b3f5d54f75147bddc2467cb0b7dHans Verkuil	cx25821_i2c_write(&dev->i2c_bus[0], out_ctrl, value);
821a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
831a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], out_ctrl_ns, &tmp);
841a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0xFFFFFF7F;
851a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	if (enable)
860dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x00000080;	/* set BLUE_FIELD_EN */
8730fdf035874a3b3f5d54f75147bddc2467cb0b7dHans Verkuil	cx25821_i2c_write(&dev->i2c_bus[0], out_ctrl_ns, value);
8802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
8902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
9002b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabstatic int medusa_initialize_ntsc(struct cx25821_dev *dev)
9102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
921a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int ret_val = 0;
931a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int i = 0;
941a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 value = 0;
951a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 tmp = 0;
961a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
971a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	for (i = 0; i < MAX_DECODERS; i++) {
980dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* set video format NTSC-M */
9914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
10014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MODE_CTRL + (0x200 * i), &tmp);
1011a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFFFFF0;
1020dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* enable the fast locking mode bit[16] */
1030dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x10001;
10414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
10514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MODE_CTRL + (0x200 * i), value);
1061a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1070dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* resolution NTSC 720x480 */
10814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
10914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				HORIZ_TIM_CTRL + (0x200 * i), &tmp);
1101a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0x00C00C00;
1111a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x612D0074;
11214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
11314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				HORIZ_TIM_CTRL + (0x200 * i), value);
1141a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
11514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
11614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				VERT_TIM_CTRL + (0x200 * i), &tmp);
1171a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0x00C00C00;
1180dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x1C1E001A;	/* vblank_cnt + 2 to get camera ID */
11914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
12014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				VERT_TIM_CTRL + (0x200 * i), value);
1211a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1220dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* chroma subcarrier step size */
12314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
12414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				SC_STEP_SIZE + (0x200 * i), 0x43E00000);
1251a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1260dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* enable VIP optional active */
12714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
12814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL_NS + (0x200 * i), &tmp);
1291a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFBFFFF;
1301a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x00040000;
13114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
13214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL_NS + (0x200 * i), value);
1331a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1340dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* enable VIP optional active (VIP_OPT_AL) for direct output. */
13514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
13614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL1 + (0x200 * i), &tmp);
1371a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFBFFFF;
1381a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x00040000;
13914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
14014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL1 + (0x200 * i), value);
1411a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1420dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/*
1430dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 * clear VPRES_VERT_EN bit, fixes the chroma run away problem
1440dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 * when the input switching rate < 16 fields
1450dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		*/
14614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
14714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MISC_TIM_CTRL + (0x200 * i), &tmp);
1480dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* disable special play detection */
1490dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value = setBitAtPos(value, 14);
1501a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value = clearBitAtPos(value, 15);
15114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
15214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MISC_TIM_CTRL + (0x200 * i), value);
1531a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1540dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* set vbi_gate_en to 0 */
15514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
15614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DFE_CTRL1 + (0x200 * i), &tmp);
1571a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value = clearBitAtPos(value, 29);
15814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
15914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DFE_CTRL1 + (0x200 * i), value);
1601a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1610dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* Enable the generation of blue field output if no video */
1621a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		medusa_enable_bluefield_output(dev, i, 1);
1631a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
1641a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1651a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	for (i = 0; i < MAX_ENCODERS; i++) {
1660dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* NTSC hclock */
16714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
16814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_1 + (0x100 * i), &tmp);
1691a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xF000FC00;
1701a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x06B402D0;
17114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
17214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_1 + (0x100 * i), value);
1731a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1740dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* burst begin and burst end */
17514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
17614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_2 + (0x100 * i), &tmp);
1771a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFF000000;
1781a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x007E9054;
17914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
18014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_2 + (0x100 * i), value);
1811a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
18214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
18314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_3 + (0x100 * i), &tmp);
1841a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFC00FE00;
1851a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x00EC00F0;
18614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
18714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_3 + (0x100 * i), value);
1881a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
1890dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* set NTSC vblank, no phase alternation, 7.5 IRE pedestal */
19014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
19114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_4 + (0x100 * i), &tmp);
1921a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0x00FCFFFF;
1931a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x13020000;
19414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
19514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_4 + (0x100 * i), value);
1961a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
19714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
19814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_5 + (0x100 * i), &tmp);
1991a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFF0000;
2001a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x0000E575;
20114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
20214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_5 + (0x100 * i), value);
2031a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
20414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
20514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_6 + (0x100 * i), 0x009A89C1);
2061a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2070dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* Subcarrier Increment */
20814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
20914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_7 + (0x100 * i), 0x21F07C1F);
2101a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
2111a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2120dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* set picture resolutions */
2130dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* 0 - 720 */
2140dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HSCALE_CTRL, 0x0);
2150dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* 0 - 480 */
2160dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VSCALE_CTRL, 0x0);
2171a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2180dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* set Bypass input format to NTSC 525 lines */
2191a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], BYP_AB_CTRL, &tmp);
2201a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value |= 0x00080200;
2211a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], BYP_AB_CTRL, value);
22202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
2231a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return ret_val;
2241a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab}
22502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
22602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabstatic int medusa_PALCombInit(struct cx25821_dev *dev, int dec)
22702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
2281a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int ret_val = -1;
2291a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 value = 0, tmp = 0;
2301a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2310dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* Setup for 2D threshold */
23214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
23314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			COMB_2D_HFS_CFG + (0x200 * dec), 0x20002861);
23414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
23514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			COMB_2D_HFD_CFG + (0x200 * dec), 0x20002861);
23614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
23714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			COMB_2D_LF_CFG + (0x200 * dec), 0x200A1023);
2381a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2390dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* Setup flat chroma and luma thresholds */
24014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	value = cx25821_i2c_read(&dev->i2c_bus[0],
24114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			COMB_FLAT_THRESH_CTRL + (0x200 * dec), &tmp);
2421a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0x06230000;
24314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
24414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			COMB_FLAT_THRESH_CTRL + (0x200 * dec), value);
2451a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2460dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* set comb 2D blend */
24714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
24814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			COMB_2D_BLEND + (0x200 * dec), 0x210F0F0F);
2491a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2500dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* COMB MISC CONTROL */
25114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
25214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			COMB_MISC_CTRL + (0x200 * dec), 0x41120A7F);
2531a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2541a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return ret_val;
25502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
25602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
25702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabstatic int medusa_initialize_pal(struct cx25821_dev *dev)
25802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
2591a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int ret_val = 0;
2601a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int i = 0;
2611a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 value = 0;
2621a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 tmp = 0;
2631a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2641a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	for (i = 0; i < MAX_DECODERS; i++) {
2650dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* set video format PAL-BDGHI */
26614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
26714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MODE_CTRL + (0x200 * i), &tmp);
2681a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFFFFF0;
2690dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* enable the fast locking mode bit[16] */
2700dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x10004;
27114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
27214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MODE_CTRL + (0x200 * i), value);
2731a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2740dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* resolution PAL 720x576 */
27514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
27614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				HORIZ_TIM_CTRL + (0x200 * i), &tmp);
2771a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0x00C00C00;
2781a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x632D007D;
27914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
28014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				HORIZ_TIM_CTRL + (0x200 * i), value);
2811a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2820dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* vblank656_cnt=x26, vactive_cnt=240h, vblank_cnt=x24 */
28314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
28414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				VERT_TIM_CTRL + (0x200 * i), &tmp);
2851a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0x00C00C00;
2860dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x28240026;	/* vblank_cnt + 2 to get camera ID */
28714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
28814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				VERT_TIM_CTRL + (0x200 * i), value);
2891a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2900dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* chroma subcarrier step size */
29114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
29214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				SC_STEP_SIZE + (0x200 * i), 0x5411E2D0);
2931a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
2940dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* enable VIP optional active */
29514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
29614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL_NS + (0x200 * i), &tmp);
2971a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFBFFFF;
2981a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x00040000;
29914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
30014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL_NS + (0x200 * i), value);
3011a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3020dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* enable VIP optional active (VIP_OPT_AL) for direct output. */
30314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
30414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL1 + (0x200 * i), &tmp);
3051a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFBFFFF;
3061a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x00040000;
30714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
30814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				OUT_CTRL1 + (0x200 * i), value);
3091a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3100dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/*
3110dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 * clear VPRES_VERT_EN bit, fixes the chroma run away problem
3120dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 * when the input switching rate < 16 fields
3130dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 */
31414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
31514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MISC_TIM_CTRL + (0x200 * i), &tmp);
3160dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* disable special play detection */
3170dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value = setBitAtPos(value, 14);
3181a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value = clearBitAtPos(value, 15);
31914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
32014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				MISC_TIM_CTRL + (0x200 * i), value);
3211a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3220dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* set vbi_gate_en to 0 */
32314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
32414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DFE_CTRL1 + (0x200 * i), &tmp);
3251a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value = clearBitAtPos(value, 29);
32614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
32714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DFE_CTRL1 + (0x200 * i), value);
3281a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3291a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		medusa_PALCombInit(dev, i);
3301a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3310dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* Enable the generation of blue field output if no video */
3321a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		medusa_enable_bluefield_output(dev, i, 1);
3331a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
3341a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3351a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	for (i = 0; i < MAX_ENCODERS; i++) {
3360dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* PAL hclock */
33714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
33814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_1 + (0x100 * i), &tmp);
3391a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xF000FC00;
3401a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x06C002D0;
34114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
34214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_1 + (0x100 * i), value);
3431a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3440dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* burst begin and burst end */
34514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
34614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_2 + (0x100 * i), &tmp);
3471a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFF000000;
3481a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x007E9754;
34914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
35014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_2 + (0x100 * i), value);
3511a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3520dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* hblank and vactive */
35314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
35414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_3 + (0x100 * i), &tmp);
3551a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFC00FE00;
3561a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x00FC0120;
35714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
35814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_3 + (0x100 * i), value);
3591a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3600dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* set PAL vblank, phase alternation, 0 IRE pedestal */
36114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
36214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_4 + (0x100 * i), &tmp);
3631a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0x00FCFFFF;
3641a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x14010000;
36514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
36614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_4 + (0x100 * i), value);
3671a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
36814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		value = cx25821_i2c_read(&dev->i2c_bus[0],
36914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_5 + (0x100 * i), &tmp);
3701a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value &= 0xFFFF0000;
3711a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		value |= 0x0000F078;
37214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
37314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_5 + (0x100 * i), value);
3741a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
37514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
37614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_6 + (0x100 * i), 0x00A493CF);
3771a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3780dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* Subcarrier Increment */
37914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		ret_val = cx25821_i2c_write(&dev->i2c_bus[0],
38014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				DENC_A_REG_7 + (0x100 * i), 0x2A098ACB);
3811a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
3821a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3830dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* set picture resolutions */
3840dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* 0 - 720 */
3850dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HSCALE_CTRL, 0x0);
3860dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* 0 - 576 */
3870dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VSCALE_CTRL, 0x0);
3881a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3890dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* set Bypass input format to PAL 625 lines */
3901a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], BYP_AB_CTRL, &tmp);
3911a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0xFFF7FDFF;
3921a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], BYP_AB_CTRL, value);
3931a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
3941a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return ret_val;
3951a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab}
39602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
39702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabint medusa_set_videostandard(struct cx25821_dev *dev)
39802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
399bad1f29d0f98972665e6503a286d058125212aa5Hans Verkuil	int status = 0;
4001a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 value = 0, tmp = 0;
4011a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4020dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	if (dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
4031a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		status = medusa_initialize_pal(dev);
4040dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	else
4051a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		status = medusa_initialize_ntsc(dev);
4061a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4070dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* Enable DENC_A output */
4081a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_4, &tmp);
4091a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = setBitAtPos(value, 4);
4101a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	status = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_4, value);
4111a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4120dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* Enable DENC_B output */
4131a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_B_REG_4, &tmp);
4141a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = setBitAtPos(value, 4);
4151a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	status = cx25821_i2c_write(&dev->i2c_bus[0], DENC_B_REG_4, value);
4161a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4171a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return status;
41802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
41902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
4201a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehabvoid medusa_set_resolution(struct cx25821_dev *dev, int width,
4211a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab			   int decoder_select)
42202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
4231a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int decoder = 0;
4241a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int decoder_count = 0;
4251a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 hscale = 0x0;
4261a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 vscale = 0x0;
4271a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	const int MAX_WIDTH = 720;
4281a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
42909c35440308138059e23a9a8e04f053094fb81a8Leonid V. Fedorenchik	/* validate the width */
4301a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	if (width > MAX_WIDTH) {
43136d89f7de4a4937848de86d9b35cb03a9f0357e1Joe Perches		pr_info("%s(): width %d > MAX_WIDTH %d ! resetting to MAX_WIDTH\n",
43236d89f7de4a4937848de86d9b35cb03a9f0357e1Joe Perches			__func__, width, MAX_WIDTH);
4331a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		width = MAX_WIDTH;
4341a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
4351a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4361a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	if (decoder_select <= 7 && decoder_select >= 0) {
4371a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		decoder = decoder_select;
4381a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		decoder_count = decoder_select + 1;
4391a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	} else {
4401a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		decoder = 0;
44160b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil		decoder_count = dev->_max_num_decoders;
4421a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
4431a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4441a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	switch (width) {
445bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case 320:
4461a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		hscale = 0x13E34B;
4471a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		vscale = 0x0;
4481a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
449bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
450bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case 352:
4511a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		hscale = 0x10A273;
4521a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		vscale = 0x0;
4531a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
454bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
455bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case 176:
4561a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		hscale = 0x3115B2;
4571a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		vscale = 0x1E00;
4581a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
459bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
460bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case 160:
4611a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		hscale = 0x378D84;
4621a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		vscale = 0x1E00;
4631a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
4641a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4650dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	default:		/* 720 */
4661a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		hscale = 0x0;
4671a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		vscale = 0x0;
4681a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
4691a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
4701a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
4711a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	for (; decoder < decoder_count; decoder++) {
4720dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* write scaling values for each decoder */
47330fdf035874a3b3f5d54f75147bddc2467cb0b7dHans Verkuil		cx25821_i2c_write(&dev->i2c_bus[0],
47414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				HSCALE_CTRL + (0x200 * decoder), hscale);
47530fdf035874a3b3f5d54f75147bddc2467cb0b7dHans Verkuil		cx25821_i2c_write(&dev->i2c_bus[0],
47614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik				VSCALE_CTRL + (0x200 * decoder), vscale);
4771a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
47802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
47902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
4801a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehabstatic void medusa_set_decoderduration(struct cx25821_dev *dev, int decoder,
4811a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab				       int duration)
48202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
4831a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 fld_cnt = 0;
4841a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 tmp = 0;
4851a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 disp_cnt_reg = DISP_AB_CNT;
486bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
4870dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* no support */
488c79a3c352469ea0a9cb2ed9e32c1932a7ff66c5cAlan Cox	if (decoder < VDEC_A || decoder > VDEC_H) {
4891a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return;
4901a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
49102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
4921a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	switch (decoder) {
493bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	default:
4941a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
495bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_C:
496bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_D:
4971a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		disp_cnt_reg = DISP_CD_CNT;
4981a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
499bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_E:
500bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_F:
5011a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		disp_cnt_reg = DISP_EF_CNT;
5021a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
503bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_G:
504bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab	case VDEC_H:
5051a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		disp_cnt_reg = DISP_GH_CNT;
5061a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		break;
5071a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
50802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
5090dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* update hardware */
5101a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	fld_cnt = cx25821_i2c_read(&dev->i2c_bus[0], disp_cnt_reg, &tmp);
511bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
5120dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	if (!(decoder % 2)) {	/* EVEN decoder */
5131a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		fld_cnt &= 0xFFFF0000;
5141a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		fld_cnt |= duration;
5151a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	} else {
5161a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		fld_cnt &= 0x0000FFFF;
5171a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		fld_cnt |= ((u32) duration) << 16;
5181a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
51902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
52030fdf035874a3b3f5d54f75147bddc2467cb0b7dHans Verkuil	cx25821_i2c_write(&dev->i2c_bus[0], disp_cnt_reg, fld_cnt);
52102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
52202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
5230dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu/* Map to Medusa register setting */
52414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchikstatic int mapM(int srcMin, int srcMax, int srcVal, int dstMin, int dstMax,
52514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik		int *dstVal)
52602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
5271a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int numerator;
5281a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int denominator;
5291a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int quotient;
5301a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
5310dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	if ((srcMin == srcMax) || (srcVal < srcMin) || (srcVal > srcMax))
5321a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return -1;
5330dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/*
5340dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	 * This is the overall expression used:
5350dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	 * *dstVal =
5360dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	 *   (srcVal - srcMin)*(dstMax - dstMin) / (srcMax - srcMin) + dstMin;
5370dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	 * but we need to account for rounding so below we use the modulus
5380dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	 * operator to find the remainder and increment if necessary.
5390dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	 */
5401a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	numerator = (srcVal - srcMin) * (dstMax - dstMin);
5411a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	denominator = srcMax - srcMin;
5421a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	quotient = numerator / denominator;
5431a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
5440dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	if (2 * (numerator % denominator) >= denominator)
5451a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		quotient++;
5461a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
5471a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	*dstVal = quotient + dstMin;
5481a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
5491a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return 0;
55002b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
55102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
55202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabstatic unsigned long convert_to_twos(long numeric, unsigned long bits_len)
55302b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
5541a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	unsigned char temp;
5551a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
5561a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	if (numeric >= 0)
5571a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return numeric;
5581a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	else {
5591a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		temp = ~(abs(numeric) & 0xFF);
5601a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		temp += 1;
5611a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return temp;
5621a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
56302b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
5641a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
56502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabint medusa_set_brightness(struct cx25821_dev *dev, int brightness, int decoder)
56602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
5671a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int ret_val = 0;
5681a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int value = 0;
5691a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 val = 0, tmp = 0;
5701a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
57149faae869fb1647b8201859602e11bed18230702Leonid V. Fedorenchik	if ((brightness > VIDEO_PROCAMP_MAX) ||
57249faae869fb1647b8201859602e11bed18230702Leonid V. Fedorenchik	    (brightness < VIDEO_PROCAMP_MIN)) {
5731a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return -1;
5741a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
57514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, brightness,
57614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			SIGNED_BYTE_MIN, SIGNED_BYTE_MAX, &value);
5771a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = convert_to_twos(value, 8);
57814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	val = cx25821_i2c_read(&dev->i2c_bus[0],
57914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_BRITE_CTRL + (0x200 * decoder), &tmp);
5801a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	val &= 0xFFFFFF00;
58114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val |= cx25821_i2c_write(&dev->i2c_bus[0],
58214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_BRITE_CTRL + (0x200 * decoder), val | value);
5831a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return ret_val;
58402b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
58502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
58602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabint medusa_set_contrast(struct cx25821_dev *dev, int contrast, int decoder)
58702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
5881a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int ret_val = 0;
5891a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int value = 0;
5901a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 val = 0, tmp = 0;
5911a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
5921a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	if ((contrast > VIDEO_PROCAMP_MAX) || (contrast < VIDEO_PROCAMP_MIN)) {
5931a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return -1;
5941a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
5951a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
59614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, contrast,
59714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			UNSIGNED_BYTE_MIN, UNSIGNED_BYTE_MAX, &value);
59814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	val = cx25821_i2c_read(&dev->i2c_bus[0],
59914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_CNTRST_CTRL + (0x200 * decoder), &tmp);
6001a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	val &= 0xFFFFFF00;
60114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val |= cx25821_i2c_write(&dev->i2c_bus[0],
60214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_CNTRST_CTRL + (0x200 * decoder), val | value);
603bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
6041a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return ret_val;
60502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
60602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
60702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabint medusa_set_hue(struct cx25821_dev *dev, int hue, int decoder)
60802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
6091a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int ret_val = 0;
6101a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int value = 0;
6111a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 val = 0, tmp = 0;
61202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
6131a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	if ((hue > VIDEO_PROCAMP_MAX) || (hue < VIDEO_PROCAMP_MIN)) {
6141a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return -1;
6151a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
61602b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
61714098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, hue,
61814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			SIGNED_BYTE_MIN, SIGNED_BYTE_MAX, &value);
619bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
6201a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = convert_to_twos(value, 8);
62114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	val = cx25821_i2c_read(&dev->i2c_bus[0],
62214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_HUE_CTRL + (0x200 * decoder), &tmp);
6231a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	val &= 0xFFFFFF00;
62402b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
62514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val |= cx25821_i2c_write(&dev->i2c_bus[0],
62614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_HUE_CTRL + (0x200 * decoder), val | value);
62702b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
6281a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return ret_val;
62902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
63002b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
63102b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabint medusa_set_saturation(struct cx25821_dev *dev, int saturation, int decoder)
63202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
6331a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int ret_val = 0;
6341a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	int value = 0;
6351a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	u32 val = 0, tmp = 0;
6361a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
63749faae869fb1647b8201859602e11bed18230702Leonid V. Fedorenchik	if ((saturation > VIDEO_PROCAMP_MAX) ||
63849faae869fb1647b8201859602e11bed18230702Leonid V. Fedorenchik	    (saturation < VIDEO_PROCAMP_MIN)) {
6391a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab		return -1;
6401a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
6411a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
64214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, saturation,
64314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			UNSIGNED_BYTE_MIN, UNSIGNED_BYTE_MAX, &value);
6441a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
64514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	val = cx25821_i2c_read(&dev->i2c_bus[0],
64614098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_USAT_CTRL + (0x200 * decoder), &tmp);
6471a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	val &= 0xFFFFFF00;
64814098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val |= cx25821_i2c_write(&dev->i2c_bus[0],
64914098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_USAT_CTRL + (0x200 * decoder), val | value);
65014098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik
65114098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	val = cx25821_i2c_read(&dev->i2c_bus[0],
65214098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_VSAT_CTRL + (0x200 * decoder), &tmp);
6531a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	val &= 0xFFFFFF00;
65414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val |= cx25821_i2c_write(&dev->i2c_bus[0],
65514098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			VDEC_A_VSAT_CTRL + (0x200 * decoder), val | value);
656bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
6571a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	return ret_val;
65802b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
65902b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
6600dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu/* Program the display sequence and monitor output. */
6610dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu
66202b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehabint medusa_video_init(struct cx25821_dev *dev)
66302b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab{
664e4115bb2841019aa19cc5bcf0f1aa24789d05ccfRuslan Pisarev	u32 value = 0, tmp = 0;
665e4115bb2841019aa19cc5bcf0f1aa24789d05ccfRuslan Pisarev	int ret_val = 0;
666e4115bb2841019aa19cc5bcf0f1aa24789d05ccfRuslan Pisarev	int i = 0;
667bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
6680dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* disable Auto source selection on all video decoders */
6691a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp);
6701a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0xFFFFF0FF;
6711a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value);
6726d8c2ba1d154f2a94303fc92691887525065199ePalash Bandyopadhyay
67364561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab	if (ret_val < 0)
67464561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab		goto error;
67502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
6760dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* Turn off Master source switch enable */
6771a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp);
6781a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0xFFFFFFDF;
6791a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value);
6806d8c2ba1d154f2a94303fc92691887525065199ePalash Bandyopadhyay
6817a02f549fcc30fe6be0c0024beae9a3db22e1af6Dan Carpenter	if (ret_val < 0)
68264561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab		goto error;
68302b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab
68460b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	/*
68560b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	 * FIXME: due to a coding bug the duration was always 0. It's
68660b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	 * likely that it really should be something else, but due to the
68760b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	 * lack of documentation I have no idea what it should be. For
68860b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	 * now just fill in 0 as the duration.
68960b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	 */
69060b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	for (i = 0; i < dev->_max_num_decoders; i++)
69160b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil		medusa_set_decoderduration(dev, i, 0);
6921a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
6930dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* Select monitor as DENC A input, power up the DAC */
6941a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_AB_CTRL, &tmp);
6951a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0xFF70FF70;
6960dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	value |= 0x00090008;	/* set en_active */
6971a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_AB_CTRL, value);
6986d8c2ba1d154f2a94303fc92691887525065199ePalash Bandyopadhyay
69964561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab	if (ret_val < 0)
70064561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab		goto error;
7011a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
7020dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* enable input is VIP/656 */
7031a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], BYP_AB_CTRL, &tmp);
7040dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	value |= 0x00040100;	/* enable VIP */
7051a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], BYP_AB_CTRL, value);
7061a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
70764561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab	if (ret_val < 0)
70864561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab		goto error;
70964561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab
7100dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* select AFE clock to output mode */
7111a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp);
7121a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0x83FFFFFF;
71314098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL,
71414098bc73080fcb945423a4fd36eec0a89fb35bdLeonid V. Fedorenchik			value | 0x10000000);
7156d8c2ba1d154f2a94303fc92691887525065199ePalash Bandyopadhyay
71664561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab	if (ret_val < 0)
71764561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab		goto error;
7181a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
7190dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu	/* Turn on all of the data out and control output pins. */
7201a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value = cx25821_i2c_read(&dev->i2c_bus[0], PIN_OE_CTRL, &tmp);
7211a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value &= 0xFEF0FE00;
72260b3b4d2de93f0bfa59dbd3104f2f40afd630d1cHans Verkuil	if (dev->_max_num_decoders == MAX_DECODERS) {
7230dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/*
7240dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 * Note: The octal board does not support control pins(bit16-19)
7250dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 * These bits are ignored in the octal board.
7260dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 *
7270dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 * disable VDEC A-C port, default to Mobilygen Interface
7280dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		 */
7290dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x010001F8;
7301a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	} else {
7310dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		/* disable VDEC A-C port, default to Mobilygen Interface */
7320dd8be8c94d0f273685092106daf0875d9287da0Olimpiu Pascariu		value |= 0x010F0108;
7331a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	}
7341a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab
7351a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	value |= 7;
7361a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = cx25821_i2c_write(&dev->i2c_bus[0], PIN_OE_CTRL, value);
7376d8c2ba1d154f2a94303fc92691887525065199ePalash Bandyopadhyay
73864561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab	if (ret_val < 0)
73964561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab		goto error;
740bb4c9a74b88aac4c30566cc8616a01c47028761fMauro Carvalho Chehab
7411a9fc855643f8770c92ba99fad5f209358c6030dMauro Carvalho Chehab	ret_val = medusa_set_videostandard(dev);
7426d8c2ba1d154f2a94303fc92691887525065199ePalash Bandyopadhyay
74364561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehaberror:
74464561a38838c66de1af059e7f4c14bbaa7dd3d54Mauro Carvalho Chehab	return ret_val;
74502b20b0b4cde011f7ad6b5363fb88b93f7ad4e5bMauro Carvalho Chehab}
746