stv0900_core.c revision 8171c2059cc4b0507faf3a0e0fdf28cc83d8ac62
199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin/* 299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * stv0900_core.c 399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * 499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * Driver for ST STV0900 satellite demodulator IC. 599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * 699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * Copyright (C) ST Microelectronics. 799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * Copyright (C) 2009 NetUP Inc. 899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru> 999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * 1099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * This program is free software; you can redistribute it and/or modify 1199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * it under the terms of the GNU General Public License as published by 1299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * the Free Software Foundation; either version 2 of the License, or 1399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * (at your option) any later version. 1499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * 1599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * This program is distributed in the hope that it will be useful, 1699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * but WITHOUT ANY WARRANTY; without even the implied warranty of 1799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * 1999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * GNU General Public License for more details. 2099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * 2199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * You should have received a copy of the GNU General Public License 2299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * along with this program; if not, write to the Free Software 2399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 2499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin */ 2599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 2699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include <linux/kernel.h> 2799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include <linux/module.h> 2899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include <linux/string.h> 2999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include <linux/slab.h> 3099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include <linux/i2c.h> 3199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 3299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include "stv0900.h" 3399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include "stv0900_reg.h" 3499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include "stv0900_priv.h" 3599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin#include "stv0900_init.h" 3699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 378171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianinint stvdebug = 1; 385a771cb186dfa1f663ea15cdff3e32e04a8427e3Randy Dunlapmodule_param_named(debug, stvdebug, int, 0644); 3999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 4099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin/* internal params node */ 4199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstruct stv0900_inode { 4299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /* pointer for internal params, one for each pair of demods */ 4399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *internal; 4499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_inode *next_inode; 4599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin}; 4699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 4799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin/* first internal params */ 4899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic struct stv0900_inode *stv0900_first_inode; 4999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 5099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin/* find chip by i2c adapter and i2c address */ 5199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic struct stv0900_inode *find_inode(struct i2c_adapter *i2c_adap, 5299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 i2c_addr) 5399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 5499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_inode *temp_chip = stv0900_first_inode; 5599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 5699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (temp_chip != NULL) { 5799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /* 5899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin Search of the last stv0900 chip or 5999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin find it by i2c adapter and i2c address */ 6099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((temp_chip != NULL) && 6199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ((temp_chip->internal->i2c_adap != i2c_adap) || 6278175bf2c5e4beb0874aee27dcfce58c4c7d4fb4Igor M. Liplianin (temp_chip->internal->i2c_addr != i2c_addr))) 6399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 6499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin temp_chip = temp_chip->next_inode; 6578175bf2c5e4beb0874aee27dcfce58c4c7d4fb4Igor M. Liplianin 6699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 6799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 6899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return temp_chip; 6999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 7099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 7199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin/* deallocating chip */ 7299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic void remove_inode(struct stv0900_internal *internal) 7399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 7499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_inode *prev_node = stv0900_first_inode; 7599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_inode *del_node = find_inode(internal->i2c_adap, 7699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin internal->i2c_addr); 7799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 7899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (del_node != NULL) { 7999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (del_node == stv0900_first_inode) { 8099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_first_inode = del_node->next_inode; 8199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 8299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while (prev_node->next_inode != del_node) 8399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin prev_node = prev_node->next_inode; 8499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 8599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (del_node->next_inode == NULL) 8699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin prev_node->next_inode = NULL; 8799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 8899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin prev_node->next_inode = 8999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin prev_node->next_inode->next_inode; 9099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 9199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 9299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin kfree(del_node); 9399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 9499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 9599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 9699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin/* allocating new chip */ 9799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic struct stv0900_inode *append_internal(struct stv0900_internal *internal) 9899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 9999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_inode *new_node = stv0900_first_inode; 10099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 10199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (new_node == NULL) { 10299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin new_node = kmalloc(sizeof(struct stv0900_inode), GFP_KERNEL); 10399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_first_inode = new_node; 10499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 10599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while (new_node->next_inode != NULL) 10699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin new_node = new_node->next_inode; 10799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 10899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin new_node->next_inode = kmalloc(sizeof(struct stv0900_inode), GFP_KERNEL); 10999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (new_node->next_inode != NULL) 11099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin new_node = new_node->next_inode; 11199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 11299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin new_node = NULL; 11399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 11499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 11599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (new_node != NULL) { 11699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin new_node->internal = internal; 11799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin new_node->next_inode = NULL; 11899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 11999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 12099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return new_node; 12199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 12299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 12399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianins32 ge2comp(s32 a, s32 width) 12499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 12599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (width == 32) 12699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return a; 12799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 12899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return (a >= (1 << (width - 1))) ? (a - (1 << width)) : a; 12999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 13099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 13199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_write_reg(struct stv0900_internal *i_params, u16 reg_addr, 13299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 reg_data) 13399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 13499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 data[3]; 13599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin int ret; 13699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct i2c_msg i2cmsg = { 13799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .addr = i_params->i2c_addr, 13899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .flags = 0, 13999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .len = 3, 14099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .buf = data, 14199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin }; 14299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 14399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin data[0] = MSB(reg_addr); 14499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin data[1] = LSB(reg_addr); 14599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin data[2] = reg_data; 14699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 14799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ret = i2c_transfer(i_params->i2c_adap, &i2cmsg, 1); 14899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (ret != 1) 1498171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: i2c error %d\n", __func__, ret); 15099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 15199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 15268191edeb50773993f4a05651b0a085bd110fbebAbylay Ospanu8 stv0900_read_reg(struct stv0900_internal *i_params, u16 reg) 15399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 15499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin int ret; 15568191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan u8 b0[] = { MSB(reg), LSB(reg) }; 15668191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan u8 buf = 0; 15768191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan struct i2c_msg msg[] = { 15868191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan { 15968191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .addr = i_params->i2c_addr, 16068191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .flags = 0, 16168191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .buf = b0, 16268191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .len = 2, 16368191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan }, { 16468191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .addr = i_params->i2c_addr, 16568191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .flags = I2C_M_RD, 16668191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .buf = &buf, 16768191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan .len = 1, 16868191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan }, 16999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin }; 17099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 17168191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan ret = i2c_transfer(i_params->i2c_adap, msg, 2); 17268191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan if (ret != 2) 1738171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: i2c error %d, reg[0x%02x]\n", 17468191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan __func__, ret, reg); 17599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 17668191edeb50773993f4a05651b0a085bd110fbebAbylay Ospan return buf; 17799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 17899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 17999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid extract_mask_pos(u32 label, u8 *mask, u8 *pos) 18099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 18199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 position = 0, i = 0; 18299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 18399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin (*mask) = label & 0xff; 18499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 18599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((position == 0) && (i < 8)) { 18699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin position = ((*mask) >> i) & 0x01; 18799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 18899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 18999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 19099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin (*pos) = (i - 1); 19199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 19299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 19399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_write_bits(struct stv0900_internal *i_params, u32 label, u8 val) 19499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 19599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 reg, mask, pos; 19699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 19799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reg = stv0900_read_reg(i_params, (label >> 16) & 0xffff); 19899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin extract_mask_pos(label, &mask, &pos); 19999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 20099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin val = mask & (val << pos); 20199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 20299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reg = (reg & (~mask)) | val; 20399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, (label >> 16) & 0xffff, reg); 20499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 20599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 20699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 20799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinu8 stv0900_get_bits(struct stv0900_internal *i_params, u32 label) 20899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 20999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 val = 0xff; 21099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 mask, pos; 21199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 21299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin extract_mask_pos(label, &mask, &pos); 21399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 21499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin val = stv0900_read_reg(i_params, label >> 16); 21599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin val = (val & mask) >> pos; 21699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 21799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return val; 21899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 21999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 22099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinenum fe_stv0900_error stv0900_initialize(struct stv0900_internal *i_params) 22199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 22299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 i; 22399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_error error; 22499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 22599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params != NULL) { 22699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->chip_id = stv0900_read_reg(i_params, R0900_MID); 22799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->errs == STV0900_NO_ERROR) { 22899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /*Startup sequence*/ 22999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5c); 23099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5c); 23199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_TNRCFG, 0x6c); 23299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_TNRCFG, 0x6f); 233fc7e4a3e7201ee8a9a6359fdbcb6677231f353b5Abylay Ospan stv0900_write_reg(i_params, R0900_P1_I2CRPT, 0x20); 234fc7e4a3e7201ee8a9a6359fdbcb6677231f353b5Abylay Ospan stv0900_write_reg(i_params, R0900_P2_I2CRPT, 0x20); 23599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_NCOARSE, 0x13); 23699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(3); 23799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_I2CCFG, 0x08); 23899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 23999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (i_params->clkmode) { 24099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 0: 24199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 2: 24299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_SYNTCTRL, 0x20 24399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin | i_params->clkmode); 24499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 24599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 24699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /* preserve SELOSCI bit */ 24799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 0x02 & stv0900_read_reg(i_params, R0900_SYNTCTRL); 24899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_SYNTCTRL, 0x20 | i); 24999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 25099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 25199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 25299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(3); 253e9d4a6d5ef58a700d3add96ffb984741c6e34fffAbylay Ospan for (i = 0; i < 182; i++) 25499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, STV0900_InitVal[i][0], STV0900_InitVal[i][1]); 25599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 25699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stv0900_read_reg(i_params, R0900_MID) >= 0x20) { 25799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSGENERAL, 0x0c); 25899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (i = 0; i < 32; i++) 25999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, STV0900_Cut20_AddOnVal[i][0], STV0900_Cut20_AddOnVal[i][1]); 26099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 26199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 26299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_FSPYCFG, 0x6c); 26399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_FSPYCFG, 0x6c); 26499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSTRES0, 0x80); 26599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSTRES0, 0x00); 26699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 26799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = i_params->errs; 26899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else 26999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_INVALID_HANDLE; 27099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 27199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return error; 27299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 27399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 27499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 27599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinu32 stv0900_get_mclk_freq(struct stv0900_internal *i_params, u32 ext_clk) 27699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 27799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 mclk = 90000000, div = 0, ad_div = 0; 27899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 27999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin div = stv0900_get_bits(i_params, F0900_M_DIV); 28099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ad_div = ((stv0900_get_bits(i_params, F0900_SELX1RATIO) == 1) ? 4 : 6); 28199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 28299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mclk = (div + 1) * ext_clk / ad_div; 28399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 2848171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: Calculated Mclk = %d\n", __func__, mclk); 28599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 28699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return mclk; 28799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 28899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 28999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinenum fe_stv0900_error stv0900_set_mclk(struct stv0900_internal *i_params, u32 mclk) 29099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 29199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_error error = STV0900_NO_ERROR; 29299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 m_div, clk_sel; 29399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 2948171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: Mclk set to %d, Quartz = %d\n", __func__, mclk, 29599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->quartz); 29699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 29799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params == NULL) 29899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_INVALID_HANDLE; 29999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else { 30099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->errs) 30199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_I2C_ERROR; 30299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else { 30399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin clk_sel = ((stv0900_get_bits(i_params, F0900_SELX1RATIO) == 1) ? 4 : 6); 30499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin m_div = ((clk_sel * mclk) / i_params->quartz) - 1; 30599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_M_DIV, m_div); 30699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->mclk = stv0900_get_mclk_freq(i_params, 30799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->quartz); 30899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 30999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /*Set the DiseqC frequency to 22KHz */ 31099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /* 31199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin Formula: 31299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin DiseqC_TX_Freq= MasterClock/(32*F22TX_Reg) 31399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin DiseqC_RX_Freq= MasterClock/(32*F22RX_Reg) 31499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin */ 31599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin m_div = i_params->mclk / 704000; 31699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_F22TX, m_div); 31799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_F22RX, m_div); 31899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 31999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_F22TX, m_div); 32099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_F22RX, m_div); 32199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 32299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((i_params->errs)) 32399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_I2C_ERROR; 32499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 32599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 32699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 32799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return error; 32899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 32999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 33099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinu32 stv0900_get_err_count(struct stv0900_internal *i_params, int cntr, 33199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 33299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 33399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 lsb, msb, hsb, err_val; 33499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 err1field_hsb, err1field_msb, err1field_lsb; 33599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 err2field_hsb, err2field_msb, err2field_lsb; 33699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 33799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(err1field_hsb, F0900_P1_ERR_CNT12, F0900_P2_ERR_CNT12); 33899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(err1field_msb, F0900_P1_ERR_CNT11, F0900_P2_ERR_CNT11); 33999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(err1field_lsb, F0900_P1_ERR_CNT10, F0900_P2_ERR_CNT10); 34099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 34199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(err2field_hsb, F0900_P1_ERR_CNT22, F0900_P2_ERR_CNT22); 34299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(err2field_msb, F0900_P1_ERR_CNT21, F0900_P2_ERR_CNT21); 34399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(err2field_lsb, F0900_P1_ERR_CNT20, F0900_P2_ERR_CNT20); 34499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 34599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (cntr) { 34699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 0: 34799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 34899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin hsb = stv0900_get_bits(i_params, err1field_hsb); 34999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msb = stv0900_get_bits(i_params, err1field_msb); 35099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin lsb = stv0900_get_bits(i_params, err1field_lsb); 35199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 35299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 1: 35399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin hsb = stv0900_get_bits(i_params, err2field_hsb); 35499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msb = stv0900_get_bits(i_params, err2field_msb); 35599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin lsb = stv0900_get_bits(i_params, err2field_lsb); 35699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 35799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 35899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 35999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin err_val = (hsb << 16) + (msb << 8) + (lsb); 36099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 36199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return err_val; 36299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 36399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 36499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) 36599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 36699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 36799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 36899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod = state->demod; 36999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 37099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 fi2c; 37199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 37299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(fi2c, F0900_P1_I2CT_ON, F0900_P2_I2CT_ON); 373fc7e4a3e7201ee8a9a6359fdbcb6677231f353b5Abylay Ospan 374fc7e4a3e7201ee8a9a6359fdbcb6677231f353b5Abylay Ospan stv0900_write_bits(i_params, fi2c, enable); 37599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 37699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 37799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 37899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 37999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, 38099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_clock_type path1_ts, 38199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_clock_type path2_ts) 38299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 38399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 3848171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 38599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 38699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id >= 0x20) { 38799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path1_ts) { 38899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 38999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 39099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path2_ts) { 39199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 39299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 39399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 39499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSGENERAL, 39599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x00); 39699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 39799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 39899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 39999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSGENERAL, 40099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x06); 40199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, 40299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin F0900_P1_TSFIFO_MANSPEED, 3); 40399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, 40499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin F0900_P2_TSFIFO_MANSPEED, 0); 40599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, 40699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_P1_TSSPEED, 0x14); 40799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, 40899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_P2_TSSPEED, 0x28); 40999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 41099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 41199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 41299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 41399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 41499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 41599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path2_ts) { 41699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 41799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 41899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 41999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, 42099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_TSGENERAL, 0x0C); 42199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 42299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 42399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 42499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, 42599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_TSGENERAL, 0x0A); 4268171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: 0x0a\n", __func__); 42799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 42899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 42999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 43099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 43199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 43299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path1_ts) { 43399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 43499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 43599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path2_ts) { 43699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 43799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 43899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 43999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSGENERAL1X, 44099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x10); 44199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 44299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 44399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 44499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSGENERAL1X, 44599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x16); 44699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, 44799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin F0900_P1_TSFIFO_MANSPEED, 3); 44899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, 44999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin F0900_P2_TSFIFO_MANSPEED, 0); 45099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_TSSPEED, 45199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x14); 45299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_TSSPEED, 45399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x28); 45499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 45599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 45699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 45799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 45899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 45999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 46099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 46199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path2_ts) { 46299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 46399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 46499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 46599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSGENERAL1X, 46699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x14); 46799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 46899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 46999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 47099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_TSGENERAL1X, 47199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0x12); 4728171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: 0x12\n", __func__); 47399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 47499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 47599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 47699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 47799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 47899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 47999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 48099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path1_ts) { 48199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 48299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x00); 48399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x00); 48499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 48599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 48699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x00); 48799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x01); 48899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 48999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 49099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x01); 49199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x00); 49299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 49399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 49499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x01); 49599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x01); 49699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 49799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 49899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 49999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 50099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 50199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (path2_ts) { 50299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PARALLEL_PUNCT_CLOCK: 50399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x00); 50499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x00); 50599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 50699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBCI_CLOCK: 50799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x00); 50899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x01); 50999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 51099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_PUNCT_CLOCK: 51199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x01); 51299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x00); 51399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 51499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SERIAL_CONT_CLOCK: 51599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x01); 51699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x01); 51799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 51899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 51999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 52099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 52199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 52299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 1); 52399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 0); 52499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 1); 52599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 0); 52699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 52799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 52899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_set_tuner(struct dvb_frontend *fe, u32 frequency, 52999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 bandwidth) 53099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 53199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_frontend_ops *frontend_ops = NULL; 53299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_tuner_ops *tuner_ops = NULL; 53399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 53499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (&fe->ops) 53599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin frontend_ops = &fe->ops; 53699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 53799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (&frontend_ops->tuner_ops) 53899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin tuner_ops = &frontend_ops->tuner_ops; 53999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 54099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (tuner_ops->set_frequency) { 54199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((tuner_ops->set_frequency(fe, frequency)) < 0) 54299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Invalid parameter\n", __func__); 54399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 54499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Frequency=%d\n", __func__, frequency); 54599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 54699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 54799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 54899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (tuner_ops->set_bandwidth) { 54999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((tuner_ops->set_bandwidth(fe, bandwidth)) < 0) 55099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Invalid parameter\n", __func__); 55199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 55299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Bandwidth=%d\n", __func__, bandwidth); 55399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 55499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 55599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 55699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 55799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth) 55899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 55999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_frontend_ops *frontend_ops = NULL; 56099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_tuner_ops *tuner_ops = NULL; 56199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 56299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (&fe->ops) 56399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin frontend_ops = &fe->ops; 56499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 56599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (&frontend_ops->tuner_ops) 56699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin tuner_ops = &frontend_ops->tuner_ops; 56799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 56899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (tuner_ops->set_bandwidth) { 56999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((tuner_ops->set_bandwidth(fe, bandwidth)) < 0) 57099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Invalid parameter\n", __func__); 57199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 57299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Bandwidth=%d\n", __func__, bandwidth); 57399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 57499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 57599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 57699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 57799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic s32 stv0900_get_rf_level(struct stv0900_internal *i_params, 57899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin const struct stv0900_table *lookup, 57999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 58099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 58199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 agc_gain = 0, 58299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imin, 58399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imax, 58499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i, 58599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin rf_lvl = 0; 58699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 5878171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 58899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 58999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((lookup != NULL) && lookup->size) { 59099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod) { 59199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 59299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 59399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin agc_gain = MAKEWORD(stv0900_get_bits(i_params, F0900_P1_AGCIQ_VALUE1), 59499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_get_bits(i_params, F0900_P1_AGCIQ_VALUE0)); 59599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 59699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 59799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin agc_gain = MAKEWORD(stv0900_get_bits(i_params, F0900_P2_AGCIQ_VALUE1), 59899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_get_bits(i_params, F0900_P2_AGCIQ_VALUE0)); 59999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 60099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 60199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 60299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imin = 0; 60399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imax = lookup->size - 1; 60499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (INRANGE(lookup->table[imin].regval, agc_gain, lookup->table[imax].regval)) { 60599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((imax - imin) > 1) { 60699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = (imax + imin) >> 1; 60799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 60899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (INRANGE(lookup->table[imin].regval, agc_gain, lookup->table[i].regval)) 60999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imax = i; 61099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 61199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imin = i; 61299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 61399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 61499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin rf_lvl = (((s32)agc_gain - lookup->table[imin].regval) 61599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin * (lookup->table[imax].realval - lookup->table[imin].realval) 61699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin / (lookup->table[imax].regval - lookup->table[imin].regval)) 61799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin + lookup->table[imin].realval; 61899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else if (agc_gain > lookup->table[0].regval) 61999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin rf_lvl = 5; 62099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (agc_gain < lookup->table[lookup->size-1].regval) 62199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin rf_lvl = -100; 62299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 62399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 62499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 6258171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: RFLevel = %d\n", __func__, rf_lvl); 62699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 62799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return rf_lvl; 62899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 62999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 63099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 63199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 63299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 63399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *internal = state->internal; 63499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 rflevel = stv0900_get_rf_level(internal, &stv0900_rf, 63599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->demod); 63699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 63799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin *strength = (rflevel + 100) * (16383 / 105); 63899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 63999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 64099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 64199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 64299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 64399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic s32 stv0900_carr_get_quality(struct dvb_frontend *fe, 64499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin const struct stv0900_table *lookup) 64599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 64699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 64799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 64899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod = state->demod; 64999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 65099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 c_n = -100, 65199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin regval, imin, imax, 65299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i, 65399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin lock_flag_field, 65499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin noise_field1, 65599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin noise_field0; 65699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 6578171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 65899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 65911a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin dmd_reg(lock_flag_field, F0900_P1_LOCK_DEFINITIF, 66011a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin F0900_P2_LOCK_DEFINITIF); 66199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stv0900_get_standard(fe, demod) == STV0900_DVBS2_STANDARD) { 66211a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin dmd_reg(noise_field1, F0900_P1_NOSPLHT_NORMED1, 66311a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin F0900_P2_NOSPLHT_NORMED1); 66411a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin dmd_reg(noise_field0, F0900_P1_NOSPLHT_NORMED0, 66511a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin F0900_P2_NOSPLHT_NORMED0); 66699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 66711a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin dmd_reg(noise_field1, F0900_P1_NOSDATAT_NORMED1, 66811a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin F0900_P2_NOSDATAT_NORMED1); 66911a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin dmd_reg(noise_field0, F0900_P1_NOSDATAT_NORMED0, 6705765348cd41c17c797765174d479508ecfbd43deIgor M. Liplianin F0900_P2_NOSDATAT_NORMED0); 67199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 67299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 67399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stv0900_get_bits(i_params, lock_flag_field)) { 67499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((lookup != NULL) && lookup->size) { 67599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin regval = 0; 67699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(5); 67799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (i = 0; i < 16; i++) { 67811a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin regval += MAKEWORD(stv0900_get_bits(i_params, 67911a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin noise_field1), 68011a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin stv0900_get_bits(i_params, 68111a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin noise_field0)); 68299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(1); 68399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 68499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 68599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin regval /= 16; 68699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imin = 0; 68799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imax = lookup->size - 1; 68811a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin if (INRANGE(lookup->table[imin].regval, 68911a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin regval, 69011a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin lookup->table[imax].regval)) { 69199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((imax - imin) > 1) { 69299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = (imax + imin) >> 1; 69311a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin if (INRANGE(lookup->table[imin].regval, 69411a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin regval, 69511a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin lookup->table[i].regval)) 69699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imax = i; 69799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 69899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin imin = i; 69999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 70099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 70199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin c_n = ((regval - lookup->table[imin].regval) 70211a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin * (lookup->table[imax].realval 70311a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin - lookup->table[imin].realval) 70411a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin / (lookup->table[imax].regval 70511a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin - lookup->table[imin].regval)) 70699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin + lookup->table[imin].realval; 70799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else if (regval < lookup->table[imin].regval) 70899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin c_n = 1000; 70999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 71099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 71199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 71299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return c_n; 71399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 71499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 715ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospanstatic int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks) 716ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan{ 717ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan struct stv0900_state *state = fe->demodulator_priv; 718ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan struct stv0900_internal *i_params = state->internal; 719ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan enum fe_stv0900_demod_num demod = state->demod; 720ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan u8 err_val1, err_val0; 721ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan s32 err_field1, err_field0; 722ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan u32 header_err_val = 0; 723ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan 724ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan *ucblocks = 0x0; 725ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan if (stv0900_get_standard(fe, demod) == STV0900_DVBS2_STANDARD) { 726ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan /* DVB-S2 delineator errors count */ 727ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan 728ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan /* retreiving number for errnous headers */ 729ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan dmd_reg(err_field0, R0900_P1_BBFCRCKO0, 730ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan R0900_P2_BBFCRCKO0); 731ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan dmd_reg(err_field1, R0900_P1_BBFCRCKO1, 732ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan R0900_P2_BBFCRCKO1); 733ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan 734ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan err_val1 = stv0900_read_reg(i_params, err_field1); 735ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan err_val0 = stv0900_read_reg(i_params, err_field0); 736ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan header_err_val = (err_val1<<8) | err_val0; 737ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan 738ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan /* retreiving number for errnous packets */ 739ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan dmd_reg(err_field0, R0900_P1_UPCRCKO0, 740ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan R0900_P2_UPCRCKO0); 741ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan dmd_reg(err_field1, R0900_P1_UPCRCKO1, 742ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan R0900_P2_UPCRCKO1); 743ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan 744ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan err_val1 = stv0900_read_reg(i_params, err_field1); 745ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan err_val0 = stv0900_read_reg(i_params, err_field0); 746ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan *ucblocks = (err_val1<<8) | err_val0; 747ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan *ucblocks += header_err_val; 748ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan } 749ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan 750ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan return 0; 751ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan} 752ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan 75399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_read_snr(struct dvb_frontend *fe, u16 *snr) 75499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 75511a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin *snr = stv0900_carr_get_quality(fe, 75611a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin (const struct stv0900_table *)&stv0900_s2_cn); 75711a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin *snr += 30; 75811a84143b27303095b035931350e9233b538c4e3Igor M. Liplianin *snr *= (16383 / 1030); 75999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 76099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 76199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 76299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 76399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic u32 stv0900_get_ber(struct stv0900_internal *i_params, 76499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 76599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 76699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 ber = 10000000, i; 76799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 dmd_state_reg; 76899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 demod_state; 76999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 vstatus_reg; 77099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 prvit_field; 77199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 pdel_status_reg; 77299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 pdel_lock_field; 77399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 77499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(dmd_state_reg, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); 77599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(vstatus_reg, R0900_P1_VSTATUSVIT, R0900_P2_VSTATUSVIT); 77699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(prvit_field, F0900_P1_PRFVIT, F0900_P2_PRFVIT); 77799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(pdel_status_reg, R0900_P1_PDELSTATUS1, R0900_P2_PDELSTATUS1); 77899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(pdel_lock_field, F0900_P1_PKTDELIN_LOCK, 77999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin F0900_P2_PKTDELIN_LOCK); 78099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 78199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin demod_state = stv0900_get_bits(i_params, dmd_state_reg); 78299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 78399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod_state) { 78499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SEARCH: 78599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PLH_DETECTED: 78699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 78799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber = 10000000; 78899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 78999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBS_FOUND: 79099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber = 0; 79199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (i = 0; i < 5; i++) { 79299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(5); 79399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber += stv0900_get_err_count(i_params, 0, demod); 79499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 79599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 79699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber /= 5; 79799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stv0900_get_bits(i_params, prvit_field)) { 79899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber *= 9766; 79999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber = ber >> 13; 80099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 80199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 80299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 80399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBS2_FOUND: 80499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber = 0; 80599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (i = 0; i < 5; i++) { 80699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(5); 80799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber += stv0900_get_err_count(i_params, 0, demod); 80899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 80999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 81099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber /= 5; 81199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stv0900_get_bits(i_params, pdel_lock_field)) { 81299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber *= 9766; 81399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ber = ber >> 13; 81499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 81599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 81699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 81799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 81899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 81999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return ber; 82099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 82199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 82299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_read_ber(struct dvb_frontend *fe, u32 *ber) 82399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 82499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 82599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *internal = state->internal; 82699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 82799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin *ber = stv0900_get_ber(internal, state->demod); 82899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 82999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 83099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 83199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 83299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinint stv0900_get_demod_lock(struct stv0900_internal *i_params, 83399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod, s32 time_out) 83499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 83599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 timer = 0, 83699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin lock = 0, 83799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin header_field, 83899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin lock_field; 83999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 84099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_search_state dmd_state; 84199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 84299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(header_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); 84399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(lock_field, F0900_P1_LOCK_DEFINITIF, F0900_P2_LOCK_DEFINITIF); 84499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((timer < time_out) && (lock == 0)) { 84599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_state = stv0900_get_bits(i_params, header_field); 84699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("Demod State = %d\n", dmd_state); 84799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (dmd_state) { 84899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SEARCH: 84999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PLH_DETECTED: 85099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 85199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin lock = 0; 85299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 85399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBS2_FOUND: 85499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBS_FOUND: 85599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin lock = stv0900_get_bits(i_params, lock_field); 85699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 85799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 85899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 85999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (lock == 0) 86099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(10); 86199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 86299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin timer += 10; 86399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 86499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 86599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (lock) 86699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("DEMOD LOCK OK\n"); 86799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 86899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("DEMOD LOCK FAIL\n"); 86999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 87099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return lock; 87199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 87299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 87399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params, 87499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 87599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 87699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 regflist, 87799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i; 87899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 8798171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 88099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 88199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(regflist, R0900_P1_MODCODLST0, R0900_P2_MODCODLST0); 88299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 88399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (i = 0; i < 16; i++) 88499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, regflist + i, 0xff); 88599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 88699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 88799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_activate_s2_modcode(struct stv0900_internal *i_params, 88899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 88999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 89099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 matype, 89199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_code, 89299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin fmod, 89399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reg_index, 89499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin field_index; 89599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 8968171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 89799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 89899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id <= 0x11) { 89999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(5); 90099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 90199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod) { 90299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 90399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 90499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_code = stv0900_read_reg(i_params, 90599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_P1_PLHMODCOD); 90699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin matype = mod_code & 0x3; 90799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_code = (mod_code & 0x7f) >> 2; 90899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 90999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reg_index = R0900_P1_MODCODLSTF - mod_code / 2; 91099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin field_index = mod_code % 2; 91199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 91299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 91399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_code = stv0900_read_reg(i_params, 91499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_P2_PLHMODCOD); 91599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin matype = mod_code & 0x3; 91699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_code = (mod_code & 0x7f) >> 2; 91799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 91899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reg_index = R0900_P2_MODCODLSTF - mod_code / 2; 91999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin field_index = mod_code % 2; 92099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 92199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 92299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 92399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 92499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (matype) { 92599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 0: 92699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 92799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin fmod = 14; 92899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 92999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 1: 93099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin fmod = 13; 93199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 93299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 2: 93399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin fmod = 11; 93499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 93599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 3: 93699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin fmod = 7; 93799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 93899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 93999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 94099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((INRANGE(STV0900_QPSK_12, mod_code, STV0900_8PSK_910)) 94199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin && (matype <= 1)) { 94299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (field_index == 0) 94399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, reg_index, 94499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 0xf0 | fmod); 94599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 94699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, reg_index, 94799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin (fmod << 4) | 0xf); 94899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 94999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else if (i_params->chip_id >= 0x12) { 95099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod) { 95199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 95299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 95399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (reg_index = 0; reg_index < 7; reg_index++) 95499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_MODCODLST0 + reg_index, 0xff); 95599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 95699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_MODCODLSTE, 0xff); 95799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_MODCODLSTF, 0xcf); 95899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (reg_index = 0; reg_index < 8; reg_index++) 95999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_MODCODLST7 + reg_index, 0xcc); 96099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 96199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 96299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 96399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (reg_index = 0; reg_index < 7; reg_index++) 96499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_MODCODLST0 + reg_index, 0xff); 96599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 96699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_MODCODLSTE, 0xff); 96799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_MODCODLSTF, 0xcf); 96899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (reg_index = 0; reg_index < 8; reg_index++) 96999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_MODCODLST7 + reg_index, 0xcc); 97099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 97199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 97299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 97399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 97499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 97599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 97699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 97799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_activate_s2_modcode_single(struct stv0900_internal *i_params, 97899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 97999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 98099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 reg_index; 98199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 9828171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 98399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 98499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod) { 98599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 98699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 98799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_MODCODLST0, 0xff); 98899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_MODCODLST1, 0xf0); 98999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_MODCODLSTF, 0x0f); 99099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (reg_index = 0; reg_index < 13; reg_index++) 99199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, 99299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_P1_MODCODLST2 + reg_index, 0); 99399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 99499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 99599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 99699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_MODCODLST0, 0xff); 99799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_MODCODLST1, 0xf0); 99899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_MODCODLSTF, 0x0f); 99999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (reg_index = 0; reg_index < 13; reg_index++) 100099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, 100199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin R0900_P2_MODCODLST2 + reg_index, 0); 100299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 100399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 100499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 100599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 100699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 100799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic enum dvbfe_algo stv0900_frontend_algo(struct dvb_frontend *fe) 100899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 100999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return DVBFE_ALGO_CUSTOM; 101099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 101199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 101299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stb0900_set_property(struct dvb_frontend *fe, 101399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dtv_property *tvp) 101499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 10158171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s(..)\n", __func__); 101699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 101799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 101899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 101999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 102099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stb0900_get_property(struct dvb_frontend *fe, 102199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dtv_property *tvp) 102299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 10238171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s(..)\n", __func__); 102499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 102599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 102699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 102799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 102899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinvoid stv0900_start_search(struct stv0900_internal *i_params, 102999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 103099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 103199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 103299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod) { 103399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 103499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 103599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x1f); 103699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 103799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id == 0x10) 103899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0xaa); 103999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 104099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id < 0x20) 104199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x55); 104299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 104399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd1_symbol_rate <= 5000000) { 104499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARCFG, 0x44); 104599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CFRUP1, 0x0f); 104699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CFRUP0, 0xff); 104799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CFRLOW1, 0xf0); 104899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CFRLOW0, 0x00); 104999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x68); 105099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 105199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARCFG, 0xc4); 105299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x44); 105399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 105499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 105599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0); 105699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0); 105799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 105899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id >= 0x20) { 105999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_EQUALCFG, 0x41); 106099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_FFECFG, 0x41); 106199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 106299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS1) || (i_params->dmd1_srch_standard == STV0900_SEARCH_DSS) || (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH)) { 106399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x82); 106499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0); 106599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 106699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 106799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 106899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x00); 106999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0xe0); 107099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0xc0); 107199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 0); 107299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); 107399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_S1S2_SEQUENTIAL, 0); 107499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_RTC, 0x88); 107599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id >= 0x20) { 107699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd1_symbol_rate < 2000000) { 107799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x39); 107899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x40); 107999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 108099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 108199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd1_symbol_rate < 10000000) { 108299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x4c); 108399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x20); 108499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 108599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x4b); 108699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x20); 108799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 108899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 108999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 109099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd1_symbol_rate < 10000000) 109199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xef); 109299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 109399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed); 109499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 109599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 109699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (i_params->dmd1_srch_algo) { 109799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_WARM_START: 109899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f); 109999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); 110099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 110199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_COLD_START: 110299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f); 110399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15); 110499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 110599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 110699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 110799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 110899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 110999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 111099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 111199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x1f); 111299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id == 0x10) 111399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0xaa); 111499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 111599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id < 0x20) 111699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x55); 111799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 111899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd2_symbol_rate <= 5000000) { 111999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARCFG, 0x44); 112099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CFRUP1, 0x0f); 112199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CFRUP0, 0xff); 112299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CFRLOW1, 0xf0); 112399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CFRLOW0, 0x00); 112499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x68); 112599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 112699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARCFG, 0xc4); 112799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x44); 112899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 112999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 113099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0); 113199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0); 113299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 113399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id >= 0x20) { 113499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_EQUALCFG, 0x41); 113599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_FFECFG, 0x41); 113699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS1) || (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DSS) || (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH)) { 113799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x82); 113899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0); 113999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 114099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 114199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 114299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x00); 114399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0xe0); 114499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0xc0); 114599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 0); 114699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); 114799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_S1S2_SEQUENTIAL, 0); 114899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_RTC, 0x88); 114999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->chip_id >= 0x20) { 115099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd2_symbol_rate < 2000000) { 115199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x39); 115299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x40); 115399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 115499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 115599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd2_symbol_rate < 10000000) { 115699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x4c); 115799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x20); 115899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 115999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x4b); 116099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x20); 116199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 116299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 116399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 116499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i_params->dmd2_symbol_rate < 10000000) 116599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xef); 116699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 116799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed); 116899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 116999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 117099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (i_params->dmd2_srch_algo) { 117199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_WARM_START: 117299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f); 117399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); 117499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 117599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_COLD_START: 117699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f); 117799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15); 117899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 117999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 118099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 118199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 118299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 118399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 118499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 118599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 118699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 118799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinu8 stv0900_get_optim_carr_loop(s32 srate, enum fe_stv0900_modcode modcode, 118899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 pilot, u8 chip_id) 118999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 119099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 aclc_value = 0x29; 119199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 i; 119299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin const struct stv0900_car_loop_optim *car_loop_s2; 119399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 11948171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 119599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 119699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (chip_id <= 0x12) 119799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin car_loop_s2 = FE_STV0900_S2CarLoop; 119899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (chip_id == 0x20) 119999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin car_loop_s2 = FE_STV0900_S2CarLoopCut20; 120099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 120199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin car_loop_s2 = FE_STV0900_S2CarLoop; 120299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 120399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (modcode < STV0900_QPSK_12) { 120499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 0; 120599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((i < 3) && (modcode != FE_STV0900_S2LowQPCarLoopCut20[i].modcode)) 120699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 120799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 120899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i >= 3) 120999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 2; 121099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 121199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 0; 121299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((i < 14) && (modcode != car_loop_s2[i].modcode)) 121399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 121499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 121599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i >= 14) { 121699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 0; 121799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((i < 11) && (modcode != FE_STV0900_S2APSKCarLoopCut20[i].modcode)) 121899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 121999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 122099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (i >= 11) 122199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 10; 122299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 122399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 122499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 122599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (modcode <= STV0900_QPSK_25) { 122699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (pilot) { 122799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (srate <= 3000000) 122899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_2; 122999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 7000000) 123099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_5; 123199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 15000000) 123299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_10; 123399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 25000000) 123499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_20; 123599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 123699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_30; 123799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 123899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (srate <= 3000000) 123999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_2; 124099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 7000000) 124199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_5; 124299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 15000000) 124399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_10; 124499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 25000000) 124599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_20; 124699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 124799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_30; 124899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 124999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 125099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else if (modcode <= STV0900_8PSK_910) { 125199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (pilot) { 125299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (srate <= 3000000) 125399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_on_2; 125499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 7000000) 125599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_on_5; 125699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 15000000) 125799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_on_10; 125899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 25000000) 125999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_on_20; 126099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 126199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_on_30; 126299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 126399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (srate <= 3000000) 126499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_off_2; 126599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 7000000) 126699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_off_5; 126799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 15000000) 126899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_off_10; 126999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 25000000) 127099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_off_20; 127199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 127299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = car_loop_s2[i].car_loop_pilots_off_30; 127399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 127499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 127599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 127699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (srate <= 3000000) 127799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_2; 127899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 7000000) 127999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_5; 128099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 15000000) 128199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_10; 128299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 25000000) 128399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_20; 128499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 128599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_30; 128699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 128799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 128899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return aclc_value; 128999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 129099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 129199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinu8 stv0900_get_optim_short_carr_loop(s32 srate, enum fe_stv0900_modulation modulation, u8 chip_id) 129299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 129399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 mod_index = 0; 129499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 129599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u8 aclc_value = 0x0b; 129699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 12978171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 129899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 129999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (modulation) { 130099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_QPSK: 130199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 130299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_index = 0; 130399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 130499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_8PSK: 130599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_index = 1; 130699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 130799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_16APSK: 130899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_index = 2; 130999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 131099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_32APSK: 131199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin mod_index = 3; 131299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 131399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 131499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 131599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (chip_id) { 131699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 0x20: 131799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (srate <= 3000000) 131899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_2; 131999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 7000000) 132099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_5; 132199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 15000000) 132299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_10; 132399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 25000000) 132499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_20; 132599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 132699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_30; 132799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 132899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 132999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 0x12: 133099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 133199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (srate <= 3000000) 133299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_2; 133399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 7000000) 133499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_5; 133599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 15000000) 133699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_10; 133799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else if (srate <= 25000000) 133899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_20; 133999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 134099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_30; 134199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 134299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 134399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 134499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 134599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return aclc_value; 134699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 134799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 134899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic enum fe_stv0900_error stv0900_st_dvbs2_single(struct stv0900_internal *i_params, 134999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_mode LDPC_Mode, 135099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 135199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 135299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_error error = STV0900_NO_ERROR; 135399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 13548171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 135599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 135699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (LDPC_Mode) { 135799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DUAL: 135899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 135999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((i_params->demod_mode != STV0900_DUAL) 136099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin || (stv0900_get_bits(i_params, F0900_DDEMOD) != 1)) { 136199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_GENCFG, 0x1d); 136299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 136399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->demod_mode = STV0900_DUAL; 136499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 136599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_FRESFEC, 1); 136699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_FRESFEC, 0); 136799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 136899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 136999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 137099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SINGLE: 137199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (demod == STV0900_DEMOD_2) 137299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_GENCFG, 0x06); 137399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 137499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_GENCFG, 0x04); 137599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 137699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->demod_mode = STV0900_SINGLE; 137799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 137899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_FRESFEC, 1); 137999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_FRESFEC, 0); 138099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 1); 138199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 0); 138299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 1); 138399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 0); 138499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 138599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 138699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 138799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return error; 138899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 138999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 139099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic enum fe_stv0900_error stv0900_init_internal(struct dvb_frontend *fe, 139199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_init_params *p_init) 139299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 139399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 139499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_error error = STV0900_NO_ERROR; 139599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_error demodError = STV0900_NO_ERROR; 1396f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin int selosci, i; 139799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 139899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_inode *temp_int = find_inode(state->i2c_adap, 139999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->config->demod_address); 140099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 14018171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 140299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 140399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (temp_int != NULL) { 140499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal = temp_int->internal; 140599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin (state->internal->dmds_used)++; 14068171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: Find Internal Structure!\n", __func__); 140799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return STV0900_NO_ERROR; 140899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 140999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal = kmalloc(sizeof(struct stv0900_internal), GFP_KERNEL); 141099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin temp_int = append_internal(state->internal); 141199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->dmds_used = 1; 141299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->i2c_adap = state->i2c_adap; 141399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->i2c_addr = state->config->demod_address; 141499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->clkmode = state->config->clkmode; 141599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->errs = STV0900_NO_ERROR; 14168171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: Create New Internal Structure!\n", __func__); 141799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 141899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 141999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (state->internal != NULL) { 142099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin demodError = stv0900_initialize(state->internal); 142199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (demodError == STV0900_NO_ERROR) { 142299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_NO_ERROR; 142399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 142499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (demodError == STV0900_INVALID_HANDLE) 142599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_INVALID_HANDLE; 142699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 142799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_I2C_ERROR; 142899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 142999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 143099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (state->internal != NULL) { 143199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (error == STV0900_NO_ERROR) { 143299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->demod_mode = p_init->demod_mode; 143399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 143499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_st_dvbs2_single(state->internal, state->internal->demod_mode, STV0900_DEMOD_1); 143599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 143699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->chip_id = stv0900_read_reg(state->internal, R0900_MID); 143799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->rolloff = p_init->rolloff; 143899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->quartz = p_init->dmd_ref_clk; 143999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 144099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(state->internal, F0900_P1_ROLLOFF_CONTROL, p_init->rolloff); 144199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(state->internal, F0900_P2_ROLLOFF_CONTROL, p_init->rolloff); 144299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 1443f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin state->internal->ts_config = p_init->ts_config; 1444f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin if (state->internal->ts_config == NULL) 1445f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin stv0900_set_ts_parallel_serial(state->internal, 1446f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin p_init->path1_ts_clock, 1447f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin p_init->path2_ts_clock); 1448f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin else { 1449f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin for (i = 0; state->internal->ts_config[i].addr != 0xffff; i++) 1450f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin stv0900_write_reg(state->internal, 1451f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin state->internal->ts_config[i].addr, 1452f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin state->internal->ts_config[i].val); 1453f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin 1454f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin stv0900_write_bits(state->internal, F0900_P2_RST_HWARE, 1); 1455f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin stv0900_write_bits(state->internal, F0900_P2_RST_HWARE, 0); 1456f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin stv0900_write_bits(state->internal, F0900_P1_RST_HWARE, 1); 1457f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin stv0900_write_bits(state->internal, F0900_P1_RST_HWARE, 0); 1458f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin } 1459f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin 146099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(state->internal, F0900_P1_TUN_MADDRESS, p_init->tun1_maddress); 146199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (p_init->tuner1_adc) { 146299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 1: 146399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(state->internal, R0900_TSTTNR1, 0x26); 146499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 146599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 146699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 146799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 146899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 146999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(state->internal, F0900_P2_TUN_MADDRESS, p_init->tun2_maddress); 147099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (p_init->tuner2_adc) { 147199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 1: 147299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(state->internal, R0900_TSTTNR3, 0x26); 147399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 147499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 147599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 147699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 147799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 147899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(state->internal, F0900_P1_TUN_IQSWAP, p_init->tun1_iq_inversion); 147999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(state->internal, F0900_P2_TUN_IQSWAP, p_init->tun2_iq_inversion); 148099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_set_mclk(state->internal, 135000000); 148199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(3); 148299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 148399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (state->internal->clkmode) { 148499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 0: 148599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 2: 148699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(state->internal, R0900_SYNTCTRL, 0x20 | state->internal->clkmode); 148799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 148899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 148999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin selosci = 0x02 & stv0900_read_reg(state->internal, R0900_SYNTCTRL); 149099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(state->internal, R0900_SYNTCTRL, 0x20 | selosci); 149199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 149299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 149399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(3); 149499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 149599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->internal->mclk = stv0900_get_mclk_freq(state->internal, state->internal->quartz); 149699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (state->internal->errs) 149799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_I2C_ERROR; 149899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 149999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 150099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_INVALID_HANDLE; 150199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 150299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 150399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 150499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return error; 150599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 150699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 150799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_status(struct stv0900_internal *i_params, 150899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod) 150999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 151099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_search_state demod_state; 151199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 mode_field, delin_field, lock_field, fifo_field, lockedvit_field; 151299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin int locked = FALSE; 151399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 151499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(mode_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); 151599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(lock_field, F0900_P1_LOCK_DEFINITIF, F0900_P2_LOCK_DEFINITIF); 151699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(delin_field, F0900_P1_PKTDELIN_LOCK, F0900_P2_PKTDELIN_LOCK); 151799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(fifo_field, F0900_P1_TSFIFO_LINEOK, F0900_P2_TSFIFO_LINEOK); 151899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(lockedvit_field, F0900_P1_LOCKEDVIT, F0900_P2_LOCKEDVIT); 151999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 152099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin demod_state = stv0900_get_bits(i_params, mode_field); 152199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod_state) { 152299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_SEARCH: 152399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_PLH_DETECTED: 152499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 152599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin locked = FALSE; 152699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 152799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBS2_FOUND: 152899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin locked = stv0900_get_bits(i_params, lock_field) && 152999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_get_bits(i_params, delin_field) && 153099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_get_bits(i_params, fifo_field); 153199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 153299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DVBS_FOUND: 153399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin locked = stv0900_get_bits(i_params, lock_field) && 153499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_get_bits(i_params, lockedvit_field) && 153599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_get_bits(i_params, fifo_field); 153699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 153799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 153899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 153999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return locked; 154099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 154199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 154299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic enum dvbfe_search stv0900_search(struct dvb_frontend *fe, 154399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_frontend_parameters *params) 154499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 154599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 154699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 154799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dtv_frontend_properties *c = &fe->dtv_property_cache; 154899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 154999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_search_params p_search; 155099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_signal_info p_result; 155199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 155299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_error error = STV0900_NO_ERROR; 155399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 15548171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: ", __func__); 155599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 155699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.locked = FALSE; 155799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.path = state->demod; 155899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.frequency = c->frequency; 155999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.symbol_rate = c->symbol_rate; 156099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.search_range = 10000000; 156199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.fec = STV0900_FEC_UNKNOWN; 156299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.standard = STV0900_AUTO_SEARCH; 156399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.iq_inversion = STV0900_IQ_AUTO; 156499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_search.search_algo = STV0900_BLIND_SEARCH; 156599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 156699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((INRANGE(100000, p_search.symbol_rate, 70000000)) && 156799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin (INRANGE(100000, p_search.search_range, 50000000))) { 156899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (p_search.path) { 156999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 157099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 157199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd1_srch_standard = p_search.standard; 157299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd1_symbol_rate = p_search.symbol_rate; 157399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd1_srch_range = p_search.search_range; 157499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->tuner1_freq = p_search.frequency; 157599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd1_srch_algo = p_search.search_algo; 157699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd1_srch_iq_inv = p_search.iq_inversion; 157799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd1_fec = p_search.fec; 157899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 157999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 158099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 158199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd2_srch_stndrd = p_search.standard; 158299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd2_symbol_rate = p_search.symbol_rate; 158399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd2_srch_range = p_search.search_range; 158499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->tuner2_freq = p_search.frequency; 158599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd2_srch_algo = p_search.search_algo; 158699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd2_srch_iq_inv = p_search.iq_inversion; 158799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i_params->dmd2_fec = p_search.fec; 158899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 158999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 159099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 159199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((stv0900_algo(fe) == STV0900_RANGEOK) && 159299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin (i_params->errs == STV0900_NO_ERROR)) { 159399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (p_search.path) { 159499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 159599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 159699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.locked = i_params->dmd1_rslts.locked; 159799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.standard = i_params->dmd1_rslts.standard; 159899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.frequency = i_params->dmd1_rslts.frequency; 159999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.symbol_rate = i_params->dmd1_rslts.symbol_rate; 160099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.fec = i_params->dmd1_rslts.fec; 160199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.modcode = i_params->dmd1_rslts.modcode; 160299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.pilot = i_params->dmd1_rslts.pilot; 160399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.frame_length = i_params->dmd1_rslts.frame_length; 160499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.spectrum = i_params->dmd1_rslts.spectrum; 160599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.rolloff = i_params->dmd1_rslts.rolloff; 160699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.modulation = i_params->dmd1_rslts.modulation; 160799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 160899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 160999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.locked = i_params->dmd2_rslts.locked; 161099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.standard = i_params->dmd2_rslts.standard; 161199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.frequency = i_params->dmd2_rslts.frequency; 161299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.symbol_rate = i_params->dmd2_rslts.symbol_rate; 161399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.fec = i_params->dmd2_rslts.fec; 161499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.modcode = i_params->dmd2_rslts.modcode; 161599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.pilot = i_params->dmd2_rslts.pilot; 161699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.frame_length = i_params->dmd2_rslts.frame_length; 161799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.spectrum = i_params->dmd2_rslts.spectrum; 161899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.rolloff = i_params->dmd2_rslts.rolloff; 161999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.modulation = i_params->dmd2_rslts.modulation; 162099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 162199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 162299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 162399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 162499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin p_result.locked = FALSE; 162599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (p_search.path) { 162699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 162799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (i_params->dmd1_err) { 162899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_I2C_ERROR: 162999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_I2C_ERROR; 163099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 163199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_NO_ERROR: 163299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 163399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_SEARCH_FAILED; 163499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 163599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 163699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 163799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 163899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (i_params->dmd2_err) { 163999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_I2C_ERROR: 164099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_I2C_ERROR; 164199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 164299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_NO_ERROR: 164399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 164499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_SEARCH_FAILED; 164599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 164699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 164799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 164899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 164999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 165099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 165199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else 165299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin error = STV0900_BAD_PARAMETER; 165399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 165499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((p_result.locked == TRUE) && (error == STV0900_NO_ERROR)) { 16558171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("Search Success\n"); 165699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return DVBFE_ALGO_SEARCH_SUCCESS; 165799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 16588171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("Search Fail\n"); 165999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return DVBFE_ALGO_SEARCH_FAILED; 166099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 166199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 166299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return DVBFE_ALGO_SEARCH_ERROR; 166399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 166499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 166599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_read_status(struct dvb_frontend *fe, enum fe_status *status) 166699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 166799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 166899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 166978175bf2c5e4beb0874aee27dcfce58c4c7d4fb4Igor M. Liplianin dprintk("%s: ", __func__); 167099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 167199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((stv0900_status(state->internal, state->demod)) == TRUE) { 167299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("DEMOD LOCK OK\n"); 167399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin *status = FE_HAS_CARRIER 167499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin | FE_HAS_VITERBI 167599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin | FE_HAS_SYNC 167699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin | FE_HAS_LOCK; 167799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else 167899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("DEMOD LOCK FAIL\n"); 167999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 168099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 168199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 168299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 168399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_track(struct dvb_frontend *fe, 168499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_frontend_parameters *p) 168599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 168699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 168799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 168899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 168999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_stop_ts(struct dvb_frontend *fe, int stop_ts) 169099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 169199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 169299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 169399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 169499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod = state->demod; 169599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 rst_field; 169699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 169799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(rst_field, F0900_P1_RST_HWARE, F0900_P2_RST_HWARE); 169899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 169999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stop_ts == TRUE) 170099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, rst_field, 1); 170199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin else 170299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, rst_field, 0); 170399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 170499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 170599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 170699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 170799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_diseqc_init(struct dvb_frontend *fe) 170899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 170999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 171099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 171199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod = state->demod; 171299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 mode_field, reset_field; 171399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 171499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); 171599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(reset_field, F0900_P1_DISEQC_RESET, F0900_P2_DISEQC_RESET); 171699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 171799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, mode_field, state->config->diseqc_mode); 171899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, reset_field, 1); 171999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, reset_field, 0); 172099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 172199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 172299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 172399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 172499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_init(struct dvb_frontend *fe) 172599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 17268171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 172799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 172899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_stop_ts(fe, 1); 172999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_diseqc_init(fe); 173099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 173199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 173299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 173399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 173499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_diseqc_send(struct stv0900_internal *i_params , u8 *Data, 173599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 NbData, enum fe_stv0900_demod_num demod) 173699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 173799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 i = 0; 173899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 173999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod) { 174099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 174199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 174299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_DIS_PRECHARGE, 1); 174399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while (i < NbData) { 174499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while (stv0900_get_bits(i_params, F0900_P1_FIFO_FULL)) 174599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ;/* checkpatch complains */ 174699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P1_DISTXDATA, Data[i]); 174799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 174899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 174999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 175099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P1_DIS_PRECHARGE, 0); 175199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 0; 175299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((stv0900_get_bits(i_params, F0900_P1_TX_IDLE) != 1) && (i < 10)) { 175399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(10); 175499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 175599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 175699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 175799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 175899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 175999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_DIS_PRECHARGE, 1); 176099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 176199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while (i < NbData) { 176299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while (stv0900_get_bits(i_params, F0900_P2_FIFO_FULL)) 176399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin ;/* checkpatch complains */ 176499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, R0900_P2_DISTXDATA, Data[i]); 176599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 176699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 176799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 176899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, F0900_P2_DIS_PRECHARGE, 0); 176999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i = 0; 177099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((stv0900_get_bits(i_params, F0900_P2_TX_IDLE) != 1) && (i < 10)) { 177199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(10); 177299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 177399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 177499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 177599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 177699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 177799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 177899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 177999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 178099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 178199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_send_master_cmd(struct dvb_frontend *fe, 178299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_diseqc_master_cmd *cmd) 178399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 178499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 178599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 178699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return stv0900_diseqc_send(state->internal, 178799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin cmd->msg, 178899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin cmd->msg_len, 178999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->demod); 179099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 179199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 179299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) 179399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 179499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 179599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 179699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod = state->demod; 179799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 mode_field; 179899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin u32 diseqc_fifo; 179999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 180099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); 180199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(diseqc_fifo, R0900_P1_DISTXDATA, R0900_P2_DISTXDATA); 180299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 180399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (burst) { 180499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case SEC_MINI_A: 180599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, mode_field, 3);/* Unmodulated */ 180699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, diseqc_fifo, 0x00); 180799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 180899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case SEC_MINI_B: 180999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, mode_field, 2);/* Modulated */ 181099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_reg(i_params, diseqc_fifo, 0xff); 181199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 181299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 181399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 181499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 181599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 181699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 181799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_recv_slave_reply(struct dvb_frontend *fe, 181899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct dvb_diseqc_slave_reply *reply) 181999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 182099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 182199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 182299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 i = 0; 182399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 182499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (state->demod) { 182599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_1: 182699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 182799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reply->msg_len = 0; 182899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 182999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((stv0900_get_bits(i_params, F0900_P1_RX_END) != 1) && (i < 10)) { 183099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(10); 183199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 183299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 183399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 183499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stv0900_get_bits(i_params, F0900_P1_RX_END)) { 183599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reply->msg_len = stv0900_get_bits(i_params, F0900_P1_FIFO_BYTENBR); 183699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 183799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (i = 0; i < reply->msg_len; i++) 183899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reply->msg[i] = stv0900_read_reg(i_params, R0900_P1_DISRXDATA); 183999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 184099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 184199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case STV0900_DEMOD_2: 184299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reply->msg_len = 0; 184399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 184499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin while ((stv0900_get_bits(i_params, F0900_P2_RX_END) != 1) && (i < 10)) { 184599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin msleep(10); 184699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin i++; 184799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 184899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 184999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (stv0900_get_bits(i_params, F0900_P2_RX_END)) { 185099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reply->msg_len = stv0900_get_bits(i_params, F0900_P2_FIFO_BYTENBR); 185199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 185299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin for (i = 0; i < reply->msg_len; i++) 185399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin reply->msg[i] = stv0900_read_reg(i_params, R0900_P2_DISRXDATA); 185499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 185599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 185699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 185799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 185899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 185999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 186099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 186199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic int stv0900_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) 186299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 186399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 186499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_internal *i_params = state->internal; 186599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_demod_num demod = state->demod; 186699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin s32 mode_field, reset_field; 186799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 18688171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: %s\n", __func__, ((tone == 0) ? "Off" : "On")); 186999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 187099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); 187199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dmd_reg(reset_field, F0900_P1_DISEQC_RESET, F0900_P2_DISEQC_RESET); 187299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 187399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (tone) { 187499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /*Set the DiseqC mode to 22Khz continues tone*/ 187599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, mode_field, 0); 187699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, reset_field, 1); 187799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /*release DiseqC reset to enable the 22KHz tone*/ 187899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, reset_field, 0); 187999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } else { 188099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, mode_field, 0); 188199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin /*maintain the DiseqC reset to disable the 22KHz tone*/ 188299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin stv0900_write_bits(i_params, reset_field, 1); 188399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 188499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 188599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return 0; 188699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 188799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 188899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic void stv0900_release(struct dvb_frontend *fe) 188999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 189099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = fe->demodulator_priv; 189199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 18928171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s\n", __func__); 189399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 189499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if ((--(state->internal->dmds_used)) <= 0) { 189599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 18968171c2059cc4b0507faf3a0e0fdf28cc83d8ac62Igor M. Liplianin dprintk("%s: Actually removing\n", __func__); 189799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 189899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin remove_inode(state->internal); 189999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin kfree(state->internal); 190099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 190199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 190299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin kfree(state); 190399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 190499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 190599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstatic struct dvb_frontend_ops stv0900_ops = { 190699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 190799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .info = { 190899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .name = "STV0900 frontend", 190999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .type = FE_QPSK, 191099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .frequency_min = 950000, 191199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .frequency_max = 2150000, 191299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .frequency_stepsize = 125, 191399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .frequency_tolerance = 0, 191499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .symbol_rate_min = 1000000, 191599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .symbol_rate_max = 45000000, 191699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .symbol_rate_tolerance = 500, 191799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | 191899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | 191999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin FE_CAN_FEC_7_8 | FE_CAN_QPSK | 192099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin FE_CAN_2G_MODULATION | 192199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin FE_CAN_FEC_AUTO 192299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin }, 192399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .release = stv0900_release, 192499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .init = stv0900_init, 192599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .get_frontend_algo = stv0900_frontend_algo, 192699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .i2c_gate_ctrl = stv0900_i2c_gate_ctrl, 192799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .diseqc_send_master_cmd = stv0900_send_master_cmd, 192899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .diseqc_send_burst = stv0900_send_burst, 192999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .diseqc_recv_slave_reply = stv0900_recv_slave_reply, 193099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .set_tone = stv0900_set_tone, 193199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .set_property = stb0900_set_property, 193299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .get_property = stb0900_get_property, 193399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .search = stv0900_search, 193499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .track = stv0900_track, 193599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .read_status = stv0900_read_status, 193699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .read_ber = stv0900_read_ber, 193799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .read_signal_strength = stv0900_read_signal_strength, 193899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin .read_snr = stv0900_read_snr, 1939ee1ebcfea6ee16491f88e8023554dd214e1ba85cAbylay Ospan .read_ucblocks = stv0900_read_ucblocks, 194099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin}; 194199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 194299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinstruct dvb_frontend *stv0900_attach(const struct stv0900_config *config, 194399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct i2c_adapter *i2c, 194499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin int demod) 194599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin{ 194699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_state *state = NULL; 194799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin struct stv0900_init_params init_params; 194899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin enum fe_stv0900_error err_stv0900; 194999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 195099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state = kzalloc(sizeof(struct stv0900_state), GFP_KERNEL); 195199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (state == NULL) 195299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin goto error; 195399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 195499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->demod = demod; 195599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->config = config; 195699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->i2c_adap = i2c; 195799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 195899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin memcpy(&state->frontend.ops, &stv0900_ops, 195999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin sizeof(struct dvb_frontend_ops)); 196099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin state->frontend.demodulator_priv = state; 196199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 196299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin switch (demod) { 196399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 0: 196499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin case 1: 196599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.dmd_ref_clk = config->xtal; 196699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.demod_mode = STV0900_DUAL; 196799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.rolloff = STV0900_35; 196899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.path1_ts_clock = config->path1_mode; 196999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.tun1_maddress = config->tun1_maddress; 197099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.tun1_iq_inversion = STV0900_IQ_NORMAL; 197199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.tuner1_adc = config->tun1_adc; 197299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.path2_ts_clock = config->path2_mode; 1973f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin init_params.ts_config = config->ts_config_regs; 197499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.tun2_maddress = config->tun2_maddress; 197599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.tuner2_adc = config->tun2_adc; 197699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin init_params.tun2_iq_inversion = STV0900_IQ_SWAPPED; 197799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 197899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin err_stv0900 = stv0900_init_internal(&state->frontend, 197999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin &init_params); 198099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 198199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin if (err_stv0900) 198299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin goto error; 198399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 198499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 198599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin default: 198699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin goto error; 198799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin break; 198899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin } 198999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 199099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Attaching STV0900 demodulator(%d) \n", __func__, demod); 199199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return &state->frontend; 199299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 199399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianinerror: 199499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin dprintk("%s: Failed to attach STV0900 demodulator(%d) \n", 199599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin __func__, demod); 199699277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin kfree(state); 199799277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin return NULL; 199899277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin} 199999277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. LiplianinEXPORT_SYMBOL(stv0900_attach); 200099277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 200199277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. LiplianinMODULE_PARM_DESC(debug, "Set debug"); 200299277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. Liplianin 200399277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. LiplianinMODULE_AUTHOR("Igor M. Liplianin"); 200499277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. LiplianinMODULE_DESCRIPTION("ST STV0900 frontend"); 200599277b3824e4bfd290c30e8981929373c9a9e6a4Igor M. LiplianinMODULE_LICENSE("GPL"); 2006