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