1 /* 2 * stv6110.c 3 * 4 * Driver for ST STV6110 satellite tuner IC. 5 * 6 * Copyright (C) 2009 NetUP Inc. 7 * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * 18 * GNU General Public License for more details. 19 */ 20 21 #include <linux/slab.h> 22 #include <linux/module.h> 23 #include <linux/dvb/frontend.h> 24 25 #include <linux/types.h> 26 27 #include "stv6110.h" 28 29 /* Max transfer size done by I2C transfer functions */ 30 #define MAX_XFER_SIZE 64 31 32 static int debug; 33 34 struct stv6110_priv { 35 int i2c_address; 36 struct i2c_adapter *i2c; 37 38 u32 mclk; 39 u8 clk_div; 40 u8 gain; 41 u8 regs[8]; 42 }; 43 44 #define dprintk(args...) \ 45 do { \ 46 if (debug) \ 47 printk(KERN_DEBUG args); \ 48 } while (0) 49 50 static s32 abssub(s32 a, s32 b) 51 { 52 if (a > b) 53 return a - b; 54 else 55 return b - a; 56 }; 57 58 static void stv6110_release(struct dvb_frontend *fe) 59 { 60 kfree(fe->tuner_priv); 61 fe->tuner_priv = NULL; 62 } 63 64 static int stv6110_write_regs(struct dvb_frontend *fe, u8 buf[], 65 int start, int len) 66 { 67 struct stv6110_priv *priv = fe->tuner_priv; 68 int rc; 69 u8 cmdbuf[MAX_XFER_SIZE]; 70 struct i2c_msg msg = { 71 .addr = priv->i2c_address, 72 .flags = 0, 73 .buf = cmdbuf, 74 .len = len + 1 75 }; 76 77 dprintk("%s\n", __func__); 78 79 if (1 + len > sizeof(cmdbuf)) { 80 printk(KERN_WARNING 81 "%s: i2c wr: len=%d is too big!\n", 82 KBUILD_MODNAME, len); 83 return -EINVAL; 84 } 85 86 if (start + len > 8) 87 return -EINVAL; 88 89 memcpy(&cmdbuf[1], buf, len); 90 cmdbuf[0] = start; 91 92 if (fe->ops.i2c_gate_ctrl) 93 fe->ops.i2c_gate_ctrl(fe, 1); 94 95 rc = i2c_transfer(priv->i2c, &msg, 1); 96 if (rc != 1) 97 dprintk("%s: i2c error\n", __func__); 98 99 if (fe->ops.i2c_gate_ctrl) 100 fe->ops.i2c_gate_ctrl(fe, 0); 101 102 return 0; 103 } 104 105 static int stv6110_read_regs(struct dvb_frontend *fe, u8 regs[], 106 int start, int len) 107 { 108 struct stv6110_priv *priv = fe->tuner_priv; 109 int rc; 110 u8 reg[] = { start }; 111 struct i2c_msg msg[] = { 112 { 113 .addr = priv->i2c_address, 114 .flags = 0, 115 .buf = reg, 116 .len = 1, 117 }, { 118 .addr = priv->i2c_address, 119 .flags = I2C_M_RD, 120 .buf = regs, 121 .len = len, 122 }, 123 }; 124 125 if (fe->ops.i2c_gate_ctrl) 126 fe->ops.i2c_gate_ctrl(fe, 1); 127 128 rc = i2c_transfer(priv->i2c, msg, 2); 129 if (rc != 2) 130 dprintk("%s: i2c error\n", __func__); 131 132 if (fe->ops.i2c_gate_ctrl) 133 fe->ops.i2c_gate_ctrl(fe, 0); 134 135 memcpy(&priv->regs[start], regs, len); 136 137 return 0; 138 } 139 140 static int stv6110_read_reg(struct dvb_frontend *fe, int start) 141 { 142 u8 buf[] = { 0 }; 143 stv6110_read_regs(fe, buf, start, 1); 144 145 return buf[0]; 146 } 147 148 static int stv6110_sleep(struct dvb_frontend *fe) 149 { 150 u8 reg[] = { 0 }; 151 stv6110_write_regs(fe, reg, 0, 1); 152 153 return 0; 154 } 155 156 static u32 carrier_width(u32 symbol_rate, enum fe_rolloff rolloff) 157 { 158 u32 rlf; 159 160 switch (rolloff) { 161 case ROLLOFF_20: 162 rlf = 20; 163 break; 164 case ROLLOFF_25: 165 rlf = 25; 166 break; 167 default: 168 rlf = 35; 169 break; 170 } 171 172 return symbol_rate + ((symbol_rate * rlf) / 100); 173 } 174 175 static int stv6110_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth) 176 { 177 struct stv6110_priv *priv = fe->tuner_priv; 178 u8 r8, ret = 0x04; 179 int i; 180 181 if ((bandwidth / 2) > 36000000) /*BW/2 max=31+5=36 mhz for r8=31*/ 182 r8 = 31; 183 else if ((bandwidth / 2) < 5000000) /* BW/2 min=5Mhz for F=0 */ 184 r8 = 0; 185 else /*if 5 < BW/2 < 36*/ 186 r8 = (bandwidth / 2) / 1000000 - 5; 187 188 /* ctrl3, RCCLKOFF = 0 Activate the calibration Clock */ 189 /* ctrl3, CF = r8 Set the LPF value */ 190 priv->regs[RSTV6110_CTRL3] &= ~((1 << 6) | 0x1f); 191 priv->regs[RSTV6110_CTRL3] |= (r8 & 0x1f); 192 stv6110_write_regs(fe, &priv->regs[RSTV6110_CTRL3], RSTV6110_CTRL3, 1); 193 /* stat1, CALRCSTRT = 1 Start LPF auto calibration*/ 194 priv->regs[RSTV6110_STAT1] |= 0x02; 195 stv6110_write_regs(fe, &priv->regs[RSTV6110_STAT1], RSTV6110_STAT1, 1); 196 197 i = 0; 198 /* Wait for CALRCSTRT == 0 */ 199 while ((i < 10) && (ret != 0)) { 200 ret = ((stv6110_read_reg(fe, RSTV6110_STAT1)) & 0x02); 201 mdelay(1); /* wait for LPF auto calibration */ 202 i++; 203 } 204 205 /* RCCLKOFF = 1 calibration done, desactivate the calibration Clock */ 206 priv->regs[RSTV6110_CTRL3] |= (1 << 6); 207 stv6110_write_regs(fe, &priv->regs[RSTV6110_CTRL3], RSTV6110_CTRL3, 1); 208 return 0; 209 } 210 211 static int stv6110_init(struct dvb_frontend *fe) 212 { 213 struct stv6110_priv *priv = fe->tuner_priv; 214 u8 buf0[] = { 0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e }; 215 216 memcpy(priv->regs, buf0, 8); 217 /* K = (Reference / 1000000) - 16 */ 218 priv->regs[RSTV6110_CTRL1] &= ~(0x1f << 3); 219 priv->regs[RSTV6110_CTRL1] |= 220 ((((priv->mclk / 1000000) - 16) & 0x1f) << 3); 221 222 /* divisor value for the output clock */ 223 priv->regs[RSTV6110_CTRL2] &= ~0xc0; 224 priv->regs[RSTV6110_CTRL2] |= (priv->clk_div << 6); 225 226 stv6110_write_regs(fe, &priv->regs[RSTV6110_CTRL1], RSTV6110_CTRL1, 8); 227 msleep(1); 228 stv6110_set_bandwidth(fe, 72000000); 229 230 return 0; 231 } 232 233 static int stv6110_get_frequency(struct dvb_frontend *fe, u32 *frequency) 234 { 235 struct stv6110_priv *priv = fe->tuner_priv; 236 u32 nbsteps, divider, psd2, freq; 237 u8 regs[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 238 239 stv6110_read_regs(fe, regs, 0, 8); 240 /*N*/ 241 divider = (priv->regs[RSTV6110_TUNING2] & 0x0f) << 8; 242 divider += priv->regs[RSTV6110_TUNING1]; 243 244 /*R*/ 245 nbsteps = (priv->regs[RSTV6110_TUNING2] >> 6) & 3; 246 /*p*/ 247 psd2 = (priv->regs[RSTV6110_TUNING2] >> 4) & 1; 248 249 freq = divider * (priv->mclk / 1000); 250 freq /= (1 << (nbsteps + psd2)); 251 freq /= 4; 252 253 *frequency = freq; 254 255 return 0; 256 } 257 258 static int stv6110_set_frequency(struct dvb_frontend *fe, u32 frequency) 259 { 260 struct stv6110_priv *priv = fe->tuner_priv; 261 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 262 u8 ret = 0x04; 263 u32 divider, ref, p, presc, i, result_freq, vco_freq; 264 s32 p_calc, p_calc_opt = 1000, r_div, r_div_opt = 0, p_val; 265 s32 srate; 266 267 dprintk("%s, freq=%d kHz, mclk=%d Hz\n", __func__, 268 frequency, priv->mclk); 269 270 /* K = (Reference / 1000000) - 16 */ 271 priv->regs[RSTV6110_CTRL1] &= ~(0x1f << 3); 272 priv->regs[RSTV6110_CTRL1] |= 273 ((((priv->mclk / 1000000) - 16) & 0x1f) << 3); 274 275 /* BB_GAIN = db/2 */ 276 if (fe->ops.set_property && fe->ops.get_property) { 277 srate = c->symbol_rate; 278 dprintk("%s: Get Frontend parameters: srate=%d\n", 279 __func__, srate); 280 } else 281 srate = 15000000; 282 283 priv->regs[RSTV6110_CTRL2] &= ~0x0f; 284 priv->regs[RSTV6110_CTRL2] |= (priv->gain & 0x0f); 285 286 if (frequency <= 1023000) { 287 p = 1; 288 presc = 0; 289 } else if (frequency <= 1300000) { 290 p = 1; 291 presc = 1; 292 } else if (frequency <= 2046000) { 293 p = 0; 294 presc = 0; 295 } else { 296 p = 0; 297 presc = 1; 298 } 299 /* DIV4SEL = p*/ 300 priv->regs[RSTV6110_TUNING2] &= ~(1 << 4); 301 priv->regs[RSTV6110_TUNING2] |= (p << 4); 302 303 /* PRESC32ON = presc */ 304 priv->regs[RSTV6110_TUNING2] &= ~(1 << 5); 305 priv->regs[RSTV6110_TUNING2] |= (presc << 5); 306 307 p_val = (int)(1 << (p + 1)) * 10;/* P = 2 or P = 4 */ 308 for (r_div = 0; r_div <= 3; r_div++) { 309 p_calc = (priv->mclk / 100000); 310 p_calc /= (1 << (r_div + 1)); 311 if ((abssub(p_calc, p_val)) < (abssub(p_calc_opt, p_val))) 312 r_div_opt = r_div; 313 314 p_calc_opt = (priv->mclk / 100000); 315 p_calc_opt /= (1 << (r_div_opt + 1)); 316 } 317 318 ref = priv->mclk / ((1 << (r_div_opt + 1)) * (1 << (p + 1))); 319 divider = (((frequency * 1000) + (ref >> 1)) / ref); 320 321 /* RDIV = r_div_opt */ 322 priv->regs[RSTV6110_TUNING2] &= ~(3 << 6); 323 priv->regs[RSTV6110_TUNING2] |= (((r_div_opt) & 3) << 6); 324 325 /* NDIV_MSB = MSB(divider) */ 326 priv->regs[RSTV6110_TUNING2] &= ~0x0f; 327 priv->regs[RSTV6110_TUNING2] |= (((divider) >> 8) & 0x0f); 328 329 /* NDIV_LSB, LSB(divider) */ 330 priv->regs[RSTV6110_TUNING1] = (divider & 0xff); 331 332 /* CALVCOSTRT = 1 VCO Auto Calibration */ 333 priv->regs[RSTV6110_STAT1] |= 0x04; 334 stv6110_write_regs(fe, &priv->regs[RSTV6110_CTRL1], 335 RSTV6110_CTRL1, 8); 336 337 i = 0; 338 /* Wait for CALVCOSTRT == 0 */ 339 while ((i < 10) && (ret != 0)) { 340 ret = ((stv6110_read_reg(fe, RSTV6110_STAT1)) & 0x04); 341 msleep(1); /* wait for VCO auto calibration */ 342 i++; 343 } 344 345 ret = stv6110_read_reg(fe, RSTV6110_STAT1); 346 stv6110_get_frequency(fe, &result_freq); 347 348 vco_freq = divider * ((priv->mclk / 1000) / ((1 << (r_div_opt + 1)))); 349 dprintk("%s, stat1=%x, lo_freq=%d kHz, vco_frec=%d kHz\n", __func__, 350 ret, result_freq, vco_freq); 351 352 return 0; 353 } 354 355 static int stv6110_set_params(struct dvb_frontend *fe) 356 { 357 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 358 u32 bandwidth = carrier_width(c->symbol_rate, c->rolloff); 359 360 stv6110_set_frequency(fe, c->frequency); 361 stv6110_set_bandwidth(fe, bandwidth); 362 363 return 0; 364 } 365 366 static int stv6110_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) 367 { 368 struct stv6110_priv *priv = fe->tuner_priv; 369 u8 r8 = 0; 370 u8 regs[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 371 stv6110_read_regs(fe, regs, 0, 8); 372 373 /* CF */ 374 r8 = priv->regs[RSTV6110_CTRL3] & 0x1f; 375 *bandwidth = (r8 + 5) * 2000000;/* x2 for ZIF tuner BW/2 = F+5 Mhz */ 376 377 return 0; 378 } 379 380 static const struct dvb_tuner_ops stv6110_tuner_ops = { 381 .info = { 382 .name = "ST STV6110", 383 .frequency_min = 950000, 384 .frequency_max = 2150000, 385 .frequency_step = 1000, 386 }, 387 .init = stv6110_init, 388 .release = stv6110_release, 389 .sleep = stv6110_sleep, 390 .set_params = stv6110_set_params, 391 .get_frequency = stv6110_get_frequency, 392 .set_frequency = stv6110_set_frequency, 393 .get_bandwidth = stv6110_get_bandwidth, 394 .set_bandwidth = stv6110_set_bandwidth, 395 396 }; 397 398 struct dvb_frontend *stv6110_attach(struct dvb_frontend *fe, 399 const struct stv6110_config *config, 400 struct i2c_adapter *i2c) 401 { 402 struct stv6110_priv *priv = NULL; 403 u8 reg0[] = { 0x00, 0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e }; 404 405 struct i2c_msg msg[] = { 406 { 407 .addr = config->i2c_address, 408 .flags = 0, 409 .buf = reg0, 410 .len = 9 411 } 412 }; 413 int ret; 414 415 /* divisor value for the output clock */ 416 reg0[2] &= ~0xc0; 417 reg0[2] |= (config->clk_div << 6); 418 419 if (fe->ops.i2c_gate_ctrl) 420 fe->ops.i2c_gate_ctrl(fe, 1); 421 422 ret = i2c_transfer(i2c, msg, 1); 423 424 if (fe->ops.i2c_gate_ctrl) 425 fe->ops.i2c_gate_ctrl(fe, 0); 426 427 if (ret != 1) 428 return NULL; 429 430 priv = kzalloc(sizeof(struct stv6110_priv), GFP_KERNEL); 431 if (priv == NULL) 432 return NULL; 433 434 priv->i2c_address = config->i2c_address; 435 priv->i2c = i2c; 436 priv->mclk = config->mclk; 437 priv->clk_div = config->clk_div; 438 priv->gain = config->gain; 439 440 memcpy(&priv->regs, ®0[1], 8); 441 442 memcpy(&fe->ops.tuner_ops, &stv6110_tuner_ops, 443 sizeof(struct dvb_tuner_ops)); 444 fe->tuner_priv = priv; 445 printk(KERN_INFO "STV6110 attached on addr=%x!\n", priv->i2c_address); 446 447 return fe; 448 } 449 EXPORT_SYMBOL(stv6110_attach); 450 451 module_param(debug, int, 0644); 452 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); 453 454 MODULE_DESCRIPTION("ST STV6110 driver"); 455 MODULE_AUTHOR("Igor M. Liplianin"); 456 MODULE_LICENSE("GPL"); 457