1ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari/* 2ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * HDIC HD29L2 DMB-TH demodulator driver 3ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * 4ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * Copyright (C) 2011 Metropolia University of Applied Sciences, Electria R&D 5ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * 6ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * Author: Antti Palosaari <crope@iki.fi> 7ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * 8ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * This program is free software; you can redistribute it and/or modify 9ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * it under the terms of the GNU General Public License as published by 10ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * the Free Software Foundation; either version 2 of the License, or 11ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * (at your option) any later version. 12ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * 13ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * This program is distributed in the hope that it will be useful, 14ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * but WITHOUT ANY WARRANTY; without even the implied warranty of 15ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * GNU General Public License for more details. 17ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * 18ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * You should have received a copy of the GNU General Public License 19ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * along with this program; if not, write to the Free Software 20ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari */ 22ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 23ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari#include "hd29l2_priv.h" 24ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 25ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari/* write multiple registers */ 26ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_wr_regs(struct hd29l2_priv *priv, u8 reg, u8 *val, int len) 27ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 28ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 29dab734ec95168488c4b32632e968ce885a083078Antti Palosaari u8 buf[2 + len]; 30ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct i2c_msg msg[1] = { 31ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 32ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .addr = priv->cfg.i2c_addr, 33ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .flags = 0, 34ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .len = sizeof(buf), 35ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .buf = buf, 36ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 37ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari }; 38ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 39ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari buf[0] = 0x00; 40ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari buf[1] = reg; 41ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari memcpy(&buf[2], val, len); 42ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 43ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = i2c_transfer(priv->i2c, msg, 1); 44ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret == 1) { 45ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = 0; 46ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } else { 47a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_warn(&priv->i2c->dev, 48a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari "%s: i2c wr failed=%d reg=%02x len=%d\n", 49a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari KBUILD_MODNAME, ret, reg, len); 50ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = -EREMOTEIO; 51ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 52ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 53ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 54ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 55ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 56ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari/* read multiple registers */ 57ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_rd_regs(struct hd29l2_priv *priv, u8 reg, u8 *val, int len) 58ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 59ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 60ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 buf[2] = { 0x00, reg }; 61ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct i2c_msg msg[2] = { 62ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 63ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .addr = priv->cfg.i2c_addr, 64ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .flags = 0, 65ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .len = 2, 66ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .buf = buf, 67ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari }, { 68ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .addr = priv->cfg.i2c_addr, 69ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .flags = I2C_M_RD, 70ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .len = len, 71ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .buf = val, 72ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 73ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari }; 74ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 75ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = i2c_transfer(priv->i2c, msg, 2); 76ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret == 2) { 77ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = 0; 78ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } else { 79a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_warn(&priv->i2c->dev, 80a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari "%s: i2c rd failed=%d reg=%02x len=%d\n", 81a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari KBUILD_MODNAME, ret, reg, len); 82ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = -EREMOTEIO; 83ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 84ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 85ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 86ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 87ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 88ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari/* write single register */ 89ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_wr_reg(struct hd29l2_priv *priv, u8 reg, u8 val) 90ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 91ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return hd29l2_wr_regs(priv, reg, &val, 1); 92ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 93ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 94ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari/* read single register */ 95ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_rd_reg(struct hd29l2_priv *priv, u8 reg, u8 *val) 96ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 97ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return hd29l2_rd_regs(priv, reg, val, 1); 98ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 99ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 100ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari/* write single register with mask */ 101ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_wr_reg_mask(struct hd29l2_priv *priv, u8 reg, u8 val, u8 mask) 102ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 103ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 104ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 tmp; 105ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 106ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* no need for read if whole reg is written */ 107ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (mask != 0xff) { 108ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_regs(priv, reg, &tmp, 1); 109ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 110ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 111ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 112ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari val &= mask; 113ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp &= ~mask; 114ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari val |= tmp; 115ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 116ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 117ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return hd29l2_wr_regs(priv, reg, &val, 1); 118ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 119ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 120ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari/* read single register with mask */ 121ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaariint hd29l2_rd_reg_mask(struct hd29l2_priv *priv, u8 reg, u8 *val, u8 mask) 122ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 123ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret, i; 124ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 tmp; 125ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 126ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_regs(priv, reg, &tmp, 1); 127ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 128ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 129ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 130ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp &= mask; 131ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 132ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* find position of the first bit */ 133ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari for (i = 0; i < 8; i++) { 134ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if ((mask >> i) & 0x01) 135ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 136ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 137ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *val = tmp >> i; 138ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 139ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 140ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 141ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 142ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_soft_reset(struct hd29l2_priv *priv) 143ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 144ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 145ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 tmp; 146ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 147ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x26, &tmp); 148ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 149ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 150ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 151ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0x26, 0x0d); 152ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 153ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 154ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 155ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari usleep_range(10000, 20000); 156ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 157ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0x26, tmp); 158ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 159ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 160ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 161ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 162ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 163a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 164ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 165ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 166ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 167ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) 168ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 169ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret, i; 170ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 171ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 tmp; 172ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 173a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: enable=%d\n", __func__, enable); 174ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 175ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* set tuner address for demod */ 176ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (!priv->tuner_i2c_addr_programmed && enable) { 177ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* no need to set tuner address every time, once is enough */ 178ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0x9d, priv->cfg.tuner_i2c_addr << 1); 179ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 180ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 181ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 182ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari priv->tuner_i2c_addr_programmed = true; 183ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 184ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 185ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* open / close gate */ 186ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0x9f, enable); 187ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 188ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 189ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 190ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* wait demod ready */ 191ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari for (i = 10; i; i--) { 192ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x9e, &tmp); 193ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 194ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 195ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 196ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (tmp == enable) 197ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 198ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 199ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari usleep_range(5000, 10000); 200ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 201ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 202a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i); 203ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 204ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 205ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 206a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 207ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 208ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 209ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 210ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_read_status(struct dvb_frontend *fe, fe_status_t *status) 211ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 212ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 213ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 214ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 buf[2]; 215ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 216ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *status = 0; 217ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 218ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x05, &buf[0]); 219ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 220ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 221ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 222ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (buf[0] & 0x01) { 223ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* full lock */ 224ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | 225ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_HAS_SYNC | FE_HAS_LOCK; 226ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } else { 227ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x0d, &buf[1]); 228ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 229ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 230ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 231ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if ((buf[1] & 0xfe) == 0x78) 232ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* partial lock */ 233ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | 234ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_HAS_VITERBI | FE_HAS_SYNC; 235ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 236ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 237ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari priv->fe_status = *status; 238ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 239ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 240ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 241a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 242ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 243ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 244ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 245ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_read_snr(struct dvb_frontend *fe, u16 *snr) 246ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 247ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 248ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 249ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 buf[2]; 250ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u16 tmp; 251ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 252ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (!(priv->fe_status & FE_HAS_LOCK)) { 253ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *snr = 0; 254ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = 0; 255ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 256ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 257ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 258ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_regs(priv, 0x0b, buf, 2); 259ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 260ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 261ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 262ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = (buf[0] << 8) | buf[1]; 263ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 264ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* report SNR in dB * 10 */ 265ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari #define LOG10_20736_24 72422627 /* log10(20736) << 24 */ 266ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (tmp) 267ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *snr = (LOG10_20736_24 - intlog10(tmp)) / ((1 << 24) / 100); 268ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari else 269ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *snr = 0; 270ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 271ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 272ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 273a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 274ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 275ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 276ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 277ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 278ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 279ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 280ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 281ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 buf[2]; 282ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u16 tmp; 283ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 284ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *strength = 0; 285ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 286ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_regs(priv, 0xd5, buf, 2); 287ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 288ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 289ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 290ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = buf[0] << 8 | buf[1]; 291ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = ~tmp & 0x0fff; 292ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 293ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* scale value to 0x0000-0xffff from 0x0000-0x0fff */ 294ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *strength = tmp * 0xffff / 0x0fff; 295ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 296ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 297ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 298a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 299ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 300ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 301ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 302ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_read_ber(struct dvb_frontend *fe, u32 *ber) 303ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 304ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 305ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 306ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 buf[2]; 307ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 308ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (!(priv->fe_status & FE_HAS_SYNC)) { 309ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *ber = 0; 310ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = 0; 311ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 312ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 313ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 314ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_regs(priv, 0xd9, buf, 2); 315ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) { 316ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *ber = 0; 317ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 318ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 319ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 320ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* LDPC BER */ 321ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *ber = ((buf[0] & 0x0f) << 8) | buf[1]; 322ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 323ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 324ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 325a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 326ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 327ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 328ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 329ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 330ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 331ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* no way to read? */ 332ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *ucblocks = 0; 333ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 334ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 335ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 3366964c308ec84f99a5c3dbc29d9711b71616fcbfcAntti Palosaaristatic enum dvbfe_search hd29l2_search(struct dvb_frontend *fe) 337ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 338ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret, i; 339ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 340ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct dtv_frontend_properties *c = &fe->dtv_property_cache; 341ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 tmp, buf[3]; 342ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 modulation, carrier, guard_interval, interleave, code_rate; 343ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u64 num64; 344ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u32 if_freq, if_ctl; 345ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari bool auto_mode; 346ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 347a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: delivery_system=%d frequency=%d " \ 348a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari "bandwidth_hz=%d modulation=%d inversion=%d " \ 349a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari "fec_inner=%d guard_interval=%d\n", __func__, 350a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari c->delivery_system, c->frequency, c->bandwidth_hz, 351a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari c->modulation, c->inversion, c->fec_inner, 352a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari c->guard_interval); 353ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 354ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* as for now we detect always params automatically */ 355ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari auto_mode = true; 356ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 357ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* program tuner */ 358ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (fe->ops.tuner_ops.set_params) 3596964c308ec84f99a5c3dbc29d9711b71616fcbfcAntti Palosaari fe->ops.tuner_ops.set_params(fe); 360ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 361ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* get and program IF */ 362ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (fe->ops.tuner_ops.get_if_frequency) 363ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari fe->ops.tuner_ops.get_if_frequency(fe, &if_freq); 364ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari else 365ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if_freq = 0; 366ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 367ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (if_freq) { 368ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* normal IF */ 369ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 370ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* calc IF control value */ 371ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari num64 = if_freq; 372ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari num64 *= 0x800000; 373ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari num64 = div_u64(num64, HD29L2_XTAL); 374ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari num64 -= 0x800000; 375ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if_ctl = num64; 376ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 377ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = 0xfc; /* tuner type normal */ 378ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } else { 379ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* zero IF */ 380ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if_ctl = 0; 381ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = 0xfe; /* tuner type Zero-IF */ 382ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 383ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 384ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari buf[0] = ((if_ctl >> 0) & 0xff); 385ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari buf[1] = ((if_ctl >> 8) & 0xff); 386ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari buf[2] = ((if_ctl >> 16) & 0xff); 387ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 388ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* program IF control */ 389ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_regs(priv, 0x14, buf, 3); 390ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 391ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 392ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 393ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* program tuner type */ 394ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0xab, tmp); 395ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 396ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 397ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 398a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: if_freq=%d if_ctl=%x\n", 399a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari __func__, if_freq, if_ctl); 400ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 401ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (auto_mode) { 402ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* 403ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * use auto mode 404ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari */ 405ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 406ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* disable quick mode */ 407ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg_mask(priv, 0xac, 0 << 7, 0x80); 408ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 409ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 410ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 411ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg_mask(priv, 0x82, 1 << 1, 0x02); 412ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 413ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 414ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 415ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* enable auto mode */ 416ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg_mask(priv, 0x7d, 1 << 6, 0x40); 417ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 418ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 419ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 420ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg_mask(priv, 0x81, 1 << 3, 0x08); 421ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 422ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 423ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 424ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* soft reset */ 425ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_soft_reset(priv); 426ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 427ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 428ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 429ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* detect modulation */ 430ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari for (i = 30; i; i--) { 431ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari msleep(100); 432ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 433ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x0d, &tmp); 434ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 435ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 436ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 437ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if ((((tmp & 0xf0) >= 0x10) && 438ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ((tmp & 0x0f) == 0x08)) || (tmp >= 0x2c)) 439ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 440ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 441ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 442a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i); 443ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 444ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (i == 0) 445ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* detection failed */ 446ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return DVBFE_ALGO_SEARCH_FAILED; 447ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 448ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* read modulation */ 449ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg_mask(priv, 0x7d, &modulation, 0x07); 450ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 451ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 452ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } else { 453ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* 454ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * use manual mode 455ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari */ 456ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 457ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari modulation = HD29L2_QAM64; 458ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari carrier = HD29L2_CARRIER_MULTI; 459ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari guard_interval = HD29L2_PN945; 460ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari interleave = HD29L2_INTERLEAVER_420; 461ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari code_rate = HD29L2_CODE_RATE_08; 462ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 463ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = (code_rate << 3) | modulation; 464ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg_mask(priv, 0x7d, tmp, 0x5f); 465ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 466ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 467ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 468ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = (carrier << 2) | guard_interval; 469ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg_mask(priv, 0x81, tmp, 0x0f); 470ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 471ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 472ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 473ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp = interleave; 474ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg_mask(priv, 0x82, tmp, 0x03); 475ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 476ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 477ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 478ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 479ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* ensure modulation validy */ 480ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* 0=QAM4_NR, 1=QAM4, 2=QAM16, 3=QAM32, 4=QAM64 */ 481dab734ec95168488c4b32632e968ce885a083078Antti Palosaari if (modulation > (ARRAY_SIZE(reg_mod_vals_tab[0].val) - 1)) { 482a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: modulation=%d not valid\n", 483a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari __func__, modulation); 484ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 485ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 486ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 487ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* program registers according to modulation */ 488ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari for (i = 0; i < ARRAY_SIZE(reg_mod_vals_tab); i++) { 489ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, reg_mod_vals_tab[i].reg, 490ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari reg_mod_vals_tab[i].val[modulation]); 491ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 492ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 493ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 494ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 495ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* read guard interval */ 496ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg_mask(priv, 0x81, &guard_interval, 0x03); 497ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 498ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 499ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 500ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* read carrier mode */ 501ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg_mask(priv, 0x81, &carrier, 0x04); 502ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 503ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 504ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 505a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, 506a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari "%s: modulation=%d guard_interval=%d carrier=%d\n", 507a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari __func__, modulation, guard_interval, carrier); 508ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 509ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if ((carrier == HD29L2_CARRIER_MULTI) && (modulation == HD29L2_QAM64) && 510ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari (guard_interval == HD29L2_PN945)) { 511a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: C=3780 && QAM64 && PN945\n", 512a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari __func__); 513ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 514ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0x42, 0x33); 515ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 516ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 517ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 518ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0xdd, 0x01); 519ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 520ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 521ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 522ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 523ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari usleep_range(10000, 20000); 524ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 525ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* soft reset */ 526ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_soft_reset(priv); 527ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 528ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 529ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 530ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* wait demod lock */ 531ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari for (i = 30; i; i--) { 532ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari msleep(100); 533ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 534ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* read lock bit */ 535ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg_mask(priv, 0x05, &tmp, 0x01); 536ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 537ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 538ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 539ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (tmp) 540ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 541ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 542ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 543a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i); 544ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 545ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (i == 0) 546ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return DVBFE_ALGO_SEARCH_AGAIN; 547ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 548ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return DVBFE_ALGO_SEARCH_SUCCESS; 549ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 550a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 551ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return DVBFE_ALGO_SEARCH_ERROR; 552ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 553ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 554ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_get_frontend_algo(struct dvb_frontend *fe) 555ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 556ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return DVBFE_ALGO_CUSTOM; 557ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 558ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 5596964c308ec84f99a5c3dbc29d9711b71616fcbfcAntti Palosaaristatic int hd29l2_get_frontend(struct dvb_frontend *fe) 560ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 561ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 562ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 563ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct dtv_frontend_properties *c = &fe->dtv_property_cache; 564ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 buf[3]; 565ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u32 if_ctl; 566ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari char *str_constellation, *str_code_rate, *str_constellation_code_rate, 567ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *str_guard_interval, *str_carrier, *str_guard_interval_carrier, 568ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari *str_interleave, *str_interleave_; 569ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 570ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x7d, &buf[0]); 571ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 572ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 573ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 574ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_regs(priv, 0x81, &buf[1], 2); 575ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 576ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 577ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 578ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* constellation, 0x7d[2:0] */ 579ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[0] >> 0) & 0x07) { 580ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: /* QAM4NR */ 581ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation = "QAM4NR"; 582ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->modulation = QAM_AUTO; /* FIXME */ 583ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 584ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: /* QAM4 */ 585ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation = "QAM4"; 586ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->modulation = QPSK; /* FIXME */ 587ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 588ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 2: 589ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation = "QAM16"; 590ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->modulation = QAM_16; 591ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 592ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 3: 593ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation = "QAM32"; 594ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->modulation = QAM_32; 595ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 596ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 4: 597ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation = "QAM64"; 598ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->modulation = QAM_64; 599ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 600ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 601ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation = "?"; 602ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 603ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 604ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* LDPC code rate, 0x7d[4:3] */ 605ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[0] >> 3) & 0x03) { 606ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: /* 0.4 */ 607ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_code_rate = "0.4"; 608ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->fec_inner = FEC_AUTO; /* FIXME */ 609ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 610ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: /* 0.6 */ 611ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_code_rate = "0.6"; 612ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->fec_inner = FEC_3_5; 613ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 614ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 2: /* 0.8 */ 615ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_code_rate = "0.8"; 616ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->fec_inner = FEC_4_5; 617ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 618ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 619ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_code_rate = "?"; 620ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 621ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 622ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* constellation & code rate set, 0x7d[6] */ 623ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[0] >> 6) & 0x01) { 624ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: 625ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation_code_rate = "manual"; 626ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 627ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: 628ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation_code_rate = "auto"; 629ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 630ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 631ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_constellation_code_rate = "?"; 632ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 633ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 634ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* frame header, 0x81[1:0] */ 635ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[1] >> 0) & 0x03) { 636ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: /* PN945 */ 637ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_guard_interval = "PN945"; 638ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->guard_interval = GUARD_INTERVAL_AUTO; /* FIXME */ 639ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 640ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: /* PN595 */ 641ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_guard_interval = "PN595"; 642ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->guard_interval = GUARD_INTERVAL_AUTO; /* FIXME */ 643ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 644ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 2: /* PN420 */ 645ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_guard_interval = "PN420"; 646ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari c->guard_interval = GUARD_INTERVAL_AUTO; /* FIXME */ 647ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 648ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 649ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_guard_interval = "?"; 650ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 651ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 652ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* carrier, 0x81[2] */ 653ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[1] >> 2) & 0x01) { 654ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: 655ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_carrier = "C=1"; 656ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 657ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: 658ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_carrier = "C=3780"; 659ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 660ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 661ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_carrier = "?"; 662ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 663ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 664ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* frame header & carrier set, 0x81[3] */ 665ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[1] >> 3) & 0x01) { 666ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: 667ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_guard_interval_carrier = "manual"; 668ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 669ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: 670ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_guard_interval_carrier = "auto"; 671ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 672ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 673ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_guard_interval_carrier = "?"; 674ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 675ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 676ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* interleave, 0x82[0] */ 677ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[2] >> 0) & 0x01) { 678ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: 679ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_interleave = "M=720"; 680ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 681ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: 682ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_interleave = "M=240"; 683ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 684ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 685ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_interleave = "?"; 686ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 687ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 688ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* interleave set, 0x82[1] */ 689ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari switch ((buf[2] >> 1) & 0x01) { 690ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 0: 691ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_interleave_ = "manual"; 692ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 693ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari case 1: 694ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_interleave_ = "auto"; 695ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari break; 696ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari default: 697ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari str_interleave_ = "?"; 698ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 699ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 700ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* 701ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * We can read out current detected NCO and use that value next 702ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * time instead of calculating new value from targed IF. 703ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * I think it will not effect receiver sensitivity but gaining lock 704ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari * after tune could be easier... 705ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari */ 706ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_regs(priv, 0xb1, &buf[0], 3); 707ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 708ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 709ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 710ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if_ctl = (buf[0] << 16) | ((buf[1] - 7) << 8) | buf[2]; 711ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 712a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: %s %s %s | %s %s %s | %s %s | NCO=%06x\n", 713a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari __func__, str_constellation, str_code_rate, 714a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari str_constellation_code_rate, str_guard_interval, 715a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari str_carrier, str_guard_interval_carrier, str_interleave, 716a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari str_interleave_, if_ctl); 717ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return 0; 718ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 719a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 720ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 721ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 722ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 723ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic int hd29l2_init(struct dvb_frontend *fe) 724ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 725ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret, i; 726ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 727ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 tmp; 728ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari static const struct reg_val tab[] = { 729ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 0x3a, 0x06 }, 730ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 0x3b, 0x03 }, 731ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 0x3c, 0x04 }, 732ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 0xaf, 0x06 }, 733ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 0xb0, 0x1b }, 734ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 0x80, 0x64 }, 735ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari { 0x10, 0x38 }, 736ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari }; 737ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 738a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s:\n", __func__); 739ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 740ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* reset demod */ 741ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* it is recommended to HW reset chip using RST_N pin */ 742ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (fe->callback) { 743dab734ec95168488c4b32632e968ce885a083078Antti Palosaari ret = fe->callback(fe, DVB_FRONTEND_COMPONENT_DEMOD, 0, 0); 744ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 745ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 746ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 747ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* reprogramming needed because HW reset clears registers */ 748ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari priv->tuner_i2c_addr_programmed = false; 749ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 750ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 751ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* init */ 752ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari for (i = 0; i < ARRAY_SIZE(tab); i++) { 753ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, tab[i].reg, tab[i].val); 754ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 755ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 756ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari } 757ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 758ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* TS params */ 759ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x36, &tmp); 760ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 761ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 762ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 763ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp &= 0x1b; 764ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp |= priv->cfg.ts_mode; 765ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0x36, tmp); 766ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 767ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 768ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 769ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x31, &tmp); 770ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp &= 0xef; 771ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 772ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (!(priv->cfg.ts_mode >> 7)) 773ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* set b4 for serial TS */ 774ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari tmp |= 0x10; 775ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 776ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_wr_reg(priv, 0x31, tmp); 777ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 778ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 779ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 780ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 781ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 782a44850df5a2776f7785abc95051a161e39f8e541Antti Palosaari dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); 783ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return ret; 784ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 785ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 786ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic void hd29l2_release(struct dvb_frontend *fe) 787ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 788ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = fe->demodulator_priv; 789ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari kfree(priv); 790ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 791ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 792ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic struct dvb_frontend_ops hd29l2_ops; 793ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 794ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristruct dvb_frontend *hd29l2_attach(const struct hd29l2_config *config, 795ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct i2c_adapter *i2c) 796ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari{ 797ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari int ret; 798ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari struct hd29l2_priv *priv = NULL; 799ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari u8 tmp; 800ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 801ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* allocate memory for the internal state */ 802ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari priv = kzalloc(sizeof(struct hd29l2_priv), GFP_KERNEL); 803ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (priv == NULL) 804ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 805ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 806ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* setup the state */ 807ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari priv->i2c = i2c; 808ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari memcpy(&priv->cfg, config, sizeof(struct hd29l2_config)); 809ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 810ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 811ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* check if the demod is there */ 812ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari ret = hd29l2_rd_reg(priv, 0x00, &tmp); 813ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari if (ret) 814ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari goto err; 815ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 816ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari /* create dvb_frontend */ 817ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari memcpy(&priv->fe.ops, &hd29l2_ops, sizeof(struct dvb_frontend_ops)); 818ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari priv->fe.demodulator_priv = priv; 819ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 820ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return &priv->fe; 821ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaarierr: 822ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari kfree(priv); 823ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari return NULL; 824ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari} 825ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti PalosaariEXPORT_SYMBOL(hd29l2_attach); 826ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 827ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaaristatic struct dvb_frontend_ops hd29l2_ops = { 8286964c308ec84f99a5c3dbc29d9711b71616fcbfcAntti Palosaari .delsys = { SYS_DVBT }, 829ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .info = { 830ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .name = "HDIC HD29L2 DMB-TH", 831ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .frequency_min = 474000000, 832ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .frequency_max = 858000000, 833ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .frequency_stepsize = 10000, 834ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .caps = FE_CAN_FEC_AUTO | 835ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_QPSK | 836ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_QAM_16 | 837ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_QAM_32 | 838ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_QAM_64 | 839ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_QAM_AUTO | 840ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_TRANSMISSION_MODE_AUTO | 841ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_BANDWIDTH_AUTO | 842ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_GUARD_INTERVAL_AUTO | 843ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_HIERARCHY_AUTO | 844ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari FE_CAN_RECOVER 845ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari }, 846ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 847ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .release = hd29l2_release, 848ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 849ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .init = hd29l2_init, 850ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 851ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .get_frontend_algo = hd29l2_get_frontend_algo, 852ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .search = hd29l2_search, 853ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .get_frontend = hd29l2_get_frontend, 854ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 855ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .read_status = hd29l2_read_status, 856ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .read_snr = hd29l2_read_snr, 857ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .read_signal_strength = hd29l2_read_signal_strength, 858ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .read_ber = hd29l2_read_ber, 859ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .read_ucblocks = hd29l2_read_ucblocks, 860ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 861ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari .i2c_gate_ctrl = hd29l2_i2c_gate_ctrl, 862ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari}; 863ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti Palosaari 864ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti PalosaariMODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); 865ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti PalosaariMODULE_DESCRIPTION("HDIC HD29L2 DMB-TH demodulator driver"); 866ee9b8c8c27679b2b8ab5e8749cb3813d55b49755Antti PalosaariMODULE_LICENSE("GPL"); 867