127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari/* 227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * Sony CXD2820R demodulator driver 327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * 427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * Copyright (C) 2010 Antti Palosaari <crope@iki.fi> 527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * 627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * This program is free software; you can redistribute it and/or modify 727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * it under the terms of the GNU General Public License as published by 827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * the Free Software Foundation; either version 2 of the License, or 927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * (at your option) any later version. 1027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * 1127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * This program is distributed in the hope that it will be useful, 1227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * but WITHOUT ANY WARRANTY; without even the implied warranty of 1327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * GNU General Public License for more details. 1527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * 1627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * You should have received a copy of the GNU General Public License along 1727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * with this program; if not, write to the Free Software Foundation, Inc., 1827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 1927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari */ 2027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 2127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 229ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrison#include "cxd2820r_priv.h" 239ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrison 24f311f68abba633426643bb5e743e4edac4ddf838Mauro Carvalho Chehabint cxd2820r_set_frontend_t2(struct dvb_frontend *fe) 2527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 2627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct cxd2820r_priv *priv = fe->demodulator_priv; 2727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct dtv_frontend_properties *c = &fe->dtv_property_cache; 2813d723ba98545c451bb40711e718087d28985b0fAntti Palosaari int ret, i, bw_i; 29fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari u32 if_freq, if_ctl; 3027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u64 num; 3127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u8 buf[3], bw_param; 3227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u8 bw_params1[][5] = { 3327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x1c, 0xb3, 0x33, 0x33, 0x33 }, /* 5 MHz */ 3427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x17, 0xea, 0xaa, 0xaa, 0xaa }, /* 6 MHz */ 3527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x14, 0x80, 0x00, 0x00, 0x00 }, /* 7 MHz */ 3627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x11, 0xf0, 0x00, 0x00, 0x00 }, /* 8 MHz */ 3727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari }; 3827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct reg_val_mask tab[] = { 3927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00080, 0x02, 0xff }, 4027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00081, 0x20, 0xff }, 4127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00085, 0x07, 0xff }, 4227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00088, 0x01, 0xff }, 4327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02069, 0x01, 0xff }, 4427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 4527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x0207f, 0x2a, 0xff }, 4627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02082, 0x0a, 0xff }, 4727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02083, 0x0a, 0xff }, 4827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x020cb, priv->cfg.if_agc_polarity << 6, 0x40 }, 4927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02070, priv->cfg.ts_mode, 0xff }, 5027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x020b5, priv->cfg.spec_inv << 4, 0x10 }, 5127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02567, 0x07, 0x0f }, 5227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02569, 0x03, 0x03 }, 5327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02595, 0x1a, 0xff }, 5427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02596, 0x50, 0xff }, 5527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02a8c, 0x00, 0xff }, 5627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02a8d, 0x34, 0xff }, 5727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02a45, 0x06, 0x07 }, 5827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x03f10, 0x0d, 0xff }, 5927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x03f11, 0x02, 0xff }, 6027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x03f12, 0x01, 0xff }, 6127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x03f23, 0x2c, 0xff }, 6227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x03f51, 0x13, 0xff }, 6327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x03f52, 0x01, 0xff }, 6427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x03f53, 0x00, 0xff }, 6527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x027e6, 0x14, 0xff }, 6627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02786, 0x02, 0x07 }, 6727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02787, 0x40, 0xe0 }, 6827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x027ef, 0x10, 0x18 }, 6927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari }; 7027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 7127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: RF=%d BW=%d", __func__, c->frequency, c->bandwidth_hz); 7227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 7313d723ba98545c451bb40711e718087d28985b0fAntti Palosaari switch (c->bandwidth_hz) { 7413d723ba98545c451bb40711e718087d28985b0fAntti Palosaari case 5000000: 7513d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_i = 0; 7613d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_param = 3; 7713d723ba98545c451bb40711e718087d28985b0fAntti Palosaari break; 7813d723ba98545c451bb40711e718087d28985b0fAntti Palosaari case 6000000: 7913d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_i = 1; 8013d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_param = 2; 8113d723ba98545c451bb40711e718087d28985b0fAntti Palosaari break; 8213d723ba98545c451bb40711e718087d28985b0fAntti Palosaari case 7000000: 8313d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_i = 2; 8413d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_param = 1; 8513d723ba98545c451bb40711e718087d28985b0fAntti Palosaari break; 8613d723ba98545c451bb40711e718087d28985b0fAntti Palosaari case 8000000: 8713d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_i = 3; 8813d723ba98545c451bb40711e718087d28985b0fAntti Palosaari bw_param = 0; 8913d723ba98545c451bb40711e718087d28985b0fAntti Palosaari break; 9013d723ba98545c451bb40711e718087d28985b0fAntti Palosaari default: 9113d723ba98545c451bb40711e718087d28985b0fAntti Palosaari return -EINVAL; 9213d723ba98545c451bb40711e718087d28985b0fAntti Palosaari } 9313d723ba98545c451bb40711e718087d28985b0fAntti Palosaari 9427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari /* update GPIOs */ 9527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_gpio(fe); 9627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 9727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 9827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 9927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari /* program tuner */ 10027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (fe->ops.tuner_ops.set_params) 10114d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehab fe->ops.tuner_ops.set_params(fe); 10227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 10327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (priv->delivery_system != SYS_DVBT2) { 10427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari for (i = 0; i < ARRAY_SIZE(tab); i++) { 10527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_wr_reg_mask(priv, tab[i].reg, 10627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari tab[i].val, tab[i].mask); 10727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 10827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 10927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 11027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 11127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 11227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari priv->delivery_system = SYS_DVBT2; 11327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 114fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari /* program IF frequency */ 115fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari if (fe->ops.tuner_ops.get_if_frequency) { 116fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq); 117fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari if (ret) 118fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari goto error; 119fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari } else 120fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari if_freq = 0; 121fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari 122fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari dbg("%s: if_freq=%d", __func__, if_freq); 123fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari 124fda23faaff3b28a987c22da5f3a17b9f3d4acef8Antti Palosaari num = if_freq / 1000; /* Hz => kHz */ 12527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari num *= 0x1000000; 12627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if_ctl = cxd2820r_div_u64_round_closest(num, 41000); 12727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari buf[0] = ((if_ctl >> 16) & 0xff); 12827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari buf[1] = ((if_ctl >> 8) & 0xff); 12927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari buf[2] = ((if_ctl >> 0) & 0xff); 13027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 13127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_wr_regs(priv, 0x020b6, buf, 3); 13227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 13327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 13427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 13513d723ba98545c451bb40711e718087d28985b0fAntti Palosaari ret = cxd2820r_wr_regs(priv, 0x0209f, bw_params1[bw_i], 5); 13627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 13727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 13827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 13927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_wr_reg_mask(priv, 0x020d7, bw_param << 6, 0xc0); 14027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 14127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 14227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 14327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_wr_reg(priv, 0x000ff, 0x08); 14427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 14527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 14627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 14727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_wr_reg(priv, 0x000fe, 0x01); 14827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 14927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 15027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 15127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 15227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaarierror: 15327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: failed:%d", __func__, ret); 15427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 15527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 15627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 15727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 158f311f68abba633426643bb5e743e4edac4ddf838Mauro Carvalho Chehabint cxd2820r_get_frontend_t2(struct dvb_frontend *fe) 15927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 16027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct cxd2820r_priv *priv = fe->demodulator_priv; 16127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct dtv_frontend_properties *c = &fe->dtv_property_cache; 16227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari int ret; 16327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u8 buf[2]; 16427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 16527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_rd_regs(priv, 0x0205c, buf, 2); 16627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 16727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 16827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 16927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari switch ((buf[0] >> 0) & 0x07) { 17027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 0: 17127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->transmission_mode = TRANSMISSION_MODE_2K; 17227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 17327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 1: 17427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->transmission_mode = TRANSMISSION_MODE_8K; 17527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 17627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 2: 17727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->transmission_mode = TRANSMISSION_MODE_4K; 17827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 17927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 3: 18027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->transmission_mode = TRANSMISSION_MODE_1K; 18127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 18227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 4: 18327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->transmission_mode = TRANSMISSION_MODE_16K; 18427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 18527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 5: 18627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->transmission_mode = TRANSMISSION_MODE_32K; 18727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 18827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 18927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 19027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari switch ((buf[1] >> 4) & 0x07) { 19127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 0: 19227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->guard_interval = GUARD_INTERVAL_1_32; 19327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 19427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 1: 19527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->guard_interval = GUARD_INTERVAL_1_16; 19627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 19727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 2: 19827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->guard_interval = GUARD_INTERVAL_1_8; 19927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 20027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 3: 20127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->guard_interval = GUARD_INTERVAL_1_4; 20227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 20327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 4: 20427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->guard_interval = GUARD_INTERVAL_1_128; 20527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 20627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 5: 20727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->guard_interval = GUARD_INTERVAL_19_128; 20827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 20927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 6: 21027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->guard_interval = GUARD_INTERVAL_19_256; 21127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 21227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 21327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 21427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_rd_regs(priv, 0x0225b, buf, 2); 21527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 21627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 21727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 21827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari switch ((buf[0] >> 0) & 0x07) { 21927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 0: 22027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->fec_inner = FEC_1_2; 22127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 22227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 1: 22327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->fec_inner = FEC_3_5; 22427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 22527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 2: 22627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->fec_inner = FEC_2_3; 22727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 22827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 3: 22927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->fec_inner = FEC_3_4; 23027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 23127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 4: 23227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->fec_inner = FEC_4_5; 23327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 23427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 5: 23527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->fec_inner = FEC_5_6; 23627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 23727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 23827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 23927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari switch ((buf[1] >> 0) & 0x07) { 24027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 0: 24127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->modulation = QPSK; 24227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 24327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 1: 24427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->modulation = QAM_16; 24527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 24627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 2: 24727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->modulation = QAM_64; 24827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 24927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 3: 25027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->modulation = QAM_256; 25127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 25227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 25327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 25427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_rd_reg(priv, 0x020b5, &buf[0]); 25527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 25627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 25727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 25827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari switch ((buf[0] >> 4) & 0x01) { 25927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 0: 26027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->inversion = INVERSION_OFF; 26127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 26227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari case 1: 26327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari c->inversion = INVERSION_ON; 26427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari break; 26527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 26627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 26727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 26827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaarierror: 26927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: failed:%d", __func__, ret); 27027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 27127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 27227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 2739ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrisonint cxd2820r_read_status_t2(struct dvb_frontend *fe, fe_status_t *status) 27427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 27527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct cxd2820r_priv *priv = fe->demodulator_priv; 27627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari int ret; 27727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u8 buf[1]; 27827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *status = 0; 27927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 28027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_rd_reg(priv, 0x02010 , &buf[0]); 28127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 28227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 28327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 28427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if ((buf[0] & 0x07) == 6) { 28527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (((buf[0] >> 5) & 0x01) == 1) { 28627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | 28727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; 28827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } else { 28927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | 29027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari FE_HAS_VITERBI | FE_HAS_SYNC; 29127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 29227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 29327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 29427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: lock=%02x", __func__, buf[0]); 29527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 29627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 29727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaarierror: 29827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: failed:%d", __func__, ret); 29927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 30027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 30127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 3029ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrisonint cxd2820r_read_ber_t2(struct dvb_frontend *fe, u32 *ber) 30327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 30427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct cxd2820r_priv *priv = fe->demodulator_priv; 30527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari int ret; 30627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u8 buf[4]; 30727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari unsigned int errbits; 30827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *ber = 0; 30927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari /* FIXME: correct calculation */ 31027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 31127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_rd_regs(priv, 0x02039, buf, sizeof(buf)); 31227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 31327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 31427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 31527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if ((buf[0] >> 4) & 0x01) { 31627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari errbits = (buf[0] & 0x0f) << 24 | buf[1] << 16 | 31727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari buf[2] << 8 | buf[3]; 31827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 31927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (errbits) 32027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *ber = errbits * 64 / 16588800; 32127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 32227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 32327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 32427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaarierror: 32527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: failed:%d", __func__, ret); 32627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 32727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 32827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 3299ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrisonint cxd2820r_read_signal_strength_t2(struct dvb_frontend *fe, 33027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u16 *strength) 33127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 33227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct cxd2820r_priv *priv = fe->demodulator_priv; 33327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari int ret; 33427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u8 buf[2]; 33527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u16 tmp; 33627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 33727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_rd_regs(priv, 0x02026, buf, sizeof(buf)); 33827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 33927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 34027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 34127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari tmp = (buf[0] & 0x0f) << 8 | buf[1]; 34227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari tmp = ~tmp & 0x0fff; 34327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 34427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari /* scale value to 0x0000-0xffff from 0x0000-0x0fff */ 34527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *strength = tmp * 0xffff / 0x0fff; 34627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 34727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 34827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaarierror: 34927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: failed:%d", __func__, ret); 35027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 35127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 35227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 3539ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrisonint cxd2820r_read_snr_t2(struct dvb_frontend *fe, u16 *snr) 35427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 35527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct cxd2820r_priv *priv = fe->demodulator_priv; 35627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari int ret; 35727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u8 buf[2]; 35827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari u16 tmp; 35927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari /* report SNR in dB * 10 */ 36027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 36127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_rd_regs(priv, 0x02028, buf, sizeof(buf)); 36227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 36327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 36427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 36527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari tmp = (buf[0] & 0x0f) << 8 | buf[1]; 36627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari #define CXD2820R_LOG10_8_24 15151336 /* log10(8) << 24 */ 36727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (tmp) 36827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *snr = (intlog10(tmp) - CXD2820R_LOG10_8_24) / ((1 << 24) 36927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari / 100); 37027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari else 37127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *snr = 0; 37227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 37327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: dBx10=%d val=%04x", __func__, *snr, tmp); 37427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 37527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 37627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaarierror: 37727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: failed:%d", __func__, ret); 37827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 37927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 38027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 3819ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrisonint cxd2820r_read_ucblocks_t2(struct dvb_frontend *fe, u32 *ucblocks) 38227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 38327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari *ucblocks = 0; 38427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari /* no way to read ? */ 38527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return 0; 38627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 38727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 3889ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrisonint cxd2820r_sleep_t2(struct dvb_frontend *fe) 38927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 39027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct cxd2820r_priv *priv = fe->demodulator_priv; 39127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari int ret, i; 39227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct reg_val_mask tab[] = { 39327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x000ff, 0x1f, 0xff }, 39427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00085, 0x00, 0xff }, 39527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00088, 0x01, 0xff }, 39627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x02069, 0x00, 0xff }, 39727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00081, 0x00, 0xff }, 39827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari { 0x00080, 0x00, 0xff }, 39927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari }; 40027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 40127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s", __func__); 40227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 40327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari for (i = 0; i < ARRAY_SIZE(tab); i++) { 40427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari ret = cxd2820r_wr_reg_mask(priv, tab[i].reg, tab[i].val, 40527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari tab[i].mask); 40627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari if (ret) 40727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari goto error; 40827cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari } 40927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 41027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari priv->delivery_system = SYS_UNDEFINED; 41127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 41227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 41327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaarierror: 41427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari dbg("%s: failed:%d", __func__, ret); 41527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return ret; 41627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 41727cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 4189ac51c5e53d6b16c9a3fa541117cf96dedd6b3ddSteve Kerrisonint cxd2820r_get_tune_settings_t2(struct dvb_frontend *fe, 41927cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari struct dvb_frontend_tune_settings *s) 42027cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari{ 42127cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari s->min_delay_ms = 1500; 42227cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari s->step_size = fe->ops.info.frequency_stepsize * 2; 42327cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1; 42427cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari 42527cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari return 0; 42627cfc85e3dae187a470f7aa54123689a487970f2Antti Palosaari} 427