root/drivers/media/dvb-frontends/dvb-pll.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. thomson_dtt759x_bw
  2. thomson_dtt7520x_bw
  3. tda665x_bw
  4. tua6034_bw
  5. tded4_bw
  6. opera1_bw
  7. samsung_dtos403ih102a_set
  8. dvb_pll_configure
  9. dvb_pll_release
  10. dvb_pll_sleep
  11. dvb_pll_set_params
  12. dvb_pll_calc_regs
  13. dvb_pll_get_frequency
  14. dvb_pll_get_bandwidth
  15. dvb_pll_init
  16. dvb_pll_attach
  17. dvb_pll_probe
  18. dvb_pll_remove

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * descriptions + helper functions for simple dvb plls.
   4  *
   5  * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
   6  */
   7 
   8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   9 
  10 #include <linux/slab.h>
  11 #include <linux/module.h>
  12 #include <linux/idr.h>
  13 #include <linux/dvb/frontend.h>
  14 #include <asm/types.h>
  15 
  16 #include "dvb-pll.h"
  17 
  18 #define dprintk(fmt, arg...) \
  19         printk(KERN_DEBUG pr_fmt("%s: " fmt), __func__, ##arg)
  20 
  21 struct dvb_pll_priv {
  22         /* pll number */
  23         int nr;
  24 
  25         /* i2c details */
  26         int pll_i2c_address;
  27         struct i2c_adapter *i2c;
  28 
  29         /* the PLL descriptor */
  30         const struct dvb_pll_desc *pll_desc;
  31 
  32         /* cached frequency/bandwidth */
  33         u32 frequency;
  34         u32 bandwidth;
  35 };
  36 
  37 #define DVB_PLL_MAX 64
  38 static DEFINE_IDA(pll_ida);
  39 
  40 static int debug;
  41 module_param(debug, int, 0644);
  42 MODULE_PARM_DESC(debug, "enable verbose debug messages");
  43 
  44 static unsigned int id[DVB_PLL_MAX] =
  45         { [ 0 ... (DVB_PLL_MAX-1) ] = DVB_PLL_UNDEFINED };
  46 module_param_array(id, int, NULL, 0644);
  47 MODULE_PARM_DESC(id, "force pll id to use (DEBUG ONLY)");
  48 
  49 /* ----------------------------------------------------------- */
  50 
  51 struct dvb_pll_desc {
  52         const char *name;
  53         u32  min;
  54         u32  max;
  55         u32  iffreq;
  56         void (*set)(struct dvb_frontend *fe, u8 *buf);
  57         u8   *initdata;
  58         u8   *initdata2;
  59         u8   *sleepdata;
  60         int  count;
  61         struct {
  62                 u32 limit;
  63                 u32 stepsize;
  64                 u8  config;
  65                 u8  cb;
  66         } entries[];
  67 };
  68 
  69 /* ----------------------------------------------------------- */
  70 /* descriptions                                                */
  71 
  72 static const struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
  73         .name  = "Thomson dtt7579",
  74         .min   = 177 * MHz,
  75         .max   = 858 * MHz,
  76         .iffreq= 36166667,
  77         .sleepdata = (u8[]){ 2, 0xb4, 0x03 },
  78         .count = 4,
  79         .entries = {
  80                 {  443250000, 166667, 0xb4, 0x02 },
  81                 {  542000000, 166667, 0xb4, 0x08 },
  82                 {  771000000, 166667, 0xbc, 0x08 },
  83                 {  999999999, 166667, 0xf4, 0x08 },
  84         },
  85 };
  86 
  87 static void thomson_dtt759x_bw(struct dvb_frontend *fe, u8 *buf)
  88 {
  89         u32 bw = fe->dtv_property_cache.bandwidth_hz;
  90         if (bw == 7000000)
  91                 buf[3] |= 0x10;
  92 }
  93 
  94 static const struct dvb_pll_desc dvb_pll_thomson_dtt759x = {
  95         .name  = "Thomson dtt759x",
  96         .min   = 177 * MHz,
  97         .max   = 896 * MHz,
  98         .set   = thomson_dtt759x_bw,
  99         .iffreq= 36166667,
 100         .sleepdata = (u8[]){ 2, 0x84, 0x03 },
 101         .count = 5,
 102         .entries = {
 103                 {  264000000, 166667, 0xb4, 0x02 },
 104                 {  470000000, 166667, 0xbc, 0x02 },
 105                 {  735000000, 166667, 0xbc, 0x08 },
 106                 {  835000000, 166667, 0xf4, 0x08 },
 107                 {  999999999, 166667, 0xfc, 0x08 },
 108         },
 109 };
 110 
 111 static void thomson_dtt7520x_bw(struct dvb_frontend *fe, u8 *buf)
 112 {
 113         u32 bw = fe->dtv_property_cache.bandwidth_hz;
 114         if (bw == 8000000)
 115                 buf[3] ^= 0x10;
 116 }
 117 
 118 static const struct dvb_pll_desc dvb_pll_thomson_dtt7520x = {
 119         .name  = "Thomson dtt7520x",
 120         .min   = 185 * MHz,
 121         .max   = 900 * MHz,
 122         .set   = thomson_dtt7520x_bw,
 123         .iffreq = 36166667,
 124         .count = 7,
 125         .entries = {
 126                 {  305000000, 166667, 0xb4, 0x12 },
 127                 {  405000000, 166667, 0xbc, 0x12 },
 128                 {  445000000, 166667, 0xbc, 0x12 },
 129                 {  465000000, 166667, 0xf4, 0x18 },
 130                 {  735000000, 166667, 0xfc, 0x18 },
 131                 {  835000000, 166667, 0xbc, 0x18 },
 132                 {  999999999, 166667, 0xfc, 0x18 },
 133         },
 134 };
 135 
 136 static const struct dvb_pll_desc dvb_pll_lg_z201 = {
 137         .name  = "LG z201",
 138         .min   = 174 * MHz,
 139         .max   = 862 * MHz,
 140         .iffreq= 36166667,
 141         .sleepdata = (u8[]){ 2, 0xbc, 0x03 },
 142         .count = 5,
 143         .entries = {
 144                 {  157500000, 166667, 0xbc, 0x01 },
 145                 {  443250000, 166667, 0xbc, 0x02 },
 146                 {  542000000, 166667, 0xbc, 0x04 },
 147                 {  830000000, 166667, 0xf4, 0x04 },
 148                 {  999999999, 166667, 0xfc, 0x04 },
 149         },
 150 };
 151 
 152 static const struct dvb_pll_desc dvb_pll_unknown_1 = {
 153         .name  = "unknown 1", /* used by dntv live dvb-t */
 154         .min   = 174 * MHz,
 155         .max   = 862 * MHz,
 156         .iffreq= 36166667,
 157         .count = 9,
 158         .entries = {
 159                 {  150000000, 166667, 0xb4, 0x01 },
 160                 {  173000000, 166667, 0xbc, 0x01 },
 161                 {  250000000, 166667, 0xb4, 0x02 },
 162                 {  400000000, 166667, 0xbc, 0x02 },
 163                 {  420000000, 166667, 0xf4, 0x02 },
 164                 {  470000000, 166667, 0xfc, 0x02 },
 165                 {  600000000, 166667, 0xbc, 0x08 },
 166                 {  730000000, 166667, 0xf4, 0x08 },
 167                 {  999999999, 166667, 0xfc, 0x08 },
 168         },
 169 };
 170 
 171 /* Infineon TUA6010XS
 172  * used in Thomson Cable Tuner
 173  */
 174 static const struct dvb_pll_desc dvb_pll_tua6010xs = {
 175         .name  = "Infineon TUA6010XS",
 176         .min   = 44250 * kHz,
 177         .max   = 858 * MHz,
 178         .iffreq= 36125000,
 179         .count = 3,
 180         .entries = {
 181                 {  115750000, 62500, 0x8e, 0x03 },
 182                 {  403250000, 62500, 0x8e, 0x06 },
 183                 {  999999999, 62500, 0x8e, 0x85 },
 184         },
 185 };
 186 
 187 /* Panasonic env57h1xd5 (some Philips PLL ?) */
 188 static const struct dvb_pll_desc dvb_pll_env57h1xd5 = {
 189         .name  = "Panasonic ENV57H1XD5",
 190         .min   = 44250 * kHz,
 191         .max   = 858 * MHz,
 192         .iffreq= 36125000,
 193         .count = 4,
 194         .entries = {
 195                 {  153000000, 166667, 0xc2, 0x41 },
 196                 {  470000000, 166667, 0xc2, 0x42 },
 197                 {  526000000, 166667, 0xc2, 0x84 },
 198                 {  999999999, 166667, 0xc2, 0xa4 },
 199         },
 200 };
 201 
 202 /* Philips TDA6650/TDA6651
 203  * used in Panasonic ENV77H11D5
 204  */
 205 static void tda665x_bw(struct dvb_frontend *fe, u8 *buf)
 206 {
 207         u32 bw = fe->dtv_property_cache.bandwidth_hz;
 208         if (bw == 8000000)
 209                 buf[3] |= 0x08;
 210 }
 211 
 212 static const struct dvb_pll_desc dvb_pll_tda665x = {
 213         .name  = "Philips TDA6650/TDA6651",
 214         .min   = 44250 * kHz,
 215         .max   = 858 * MHz,
 216         .set   = tda665x_bw,
 217         .iffreq= 36166667,
 218         .initdata = (u8[]){ 4, 0x0b, 0xf5, 0x85, 0xab },
 219         .count = 12,
 220         .entries = {
 221                 {   93834000, 166667, 0xca, 0x61 /* 011 0 0 0  01 */ },
 222                 {  123834000, 166667, 0xca, 0xa1 /* 101 0 0 0  01 */ },
 223                 {  161000000, 166667, 0xca, 0xa1 /* 101 0 0 0  01 */ },
 224                 {  163834000, 166667, 0xca, 0xc2 /* 110 0 0 0  10 */ },
 225                 {  253834000, 166667, 0xca, 0x62 /* 011 0 0 0  10 */ },
 226                 {  383834000, 166667, 0xca, 0xa2 /* 101 0 0 0  10 */ },
 227                 {  443834000, 166667, 0xca, 0xc2 /* 110 0 0 0  10 */ },
 228                 {  444000000, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
 229                 {  583834000, 166667, 0xca, 0x64 /* 011 0 0 1  00 */ },
 230                 {  793834000, 166667, 0xca, 0xa4 /* 101 0 0 1  00 */ },
 231                 {  444834000, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
 232                 {  861000000, 166667, 0xca, 0xe4 /* 111 0 0 1  00 */ },
 233         }
 234 };
 235 
 236 /* Infineon TUA6034
 237  * used in LG TDTP E102P
 238  */
 239 static void tua6034_bw(struct dvb_frontend *fe, u8 *buf)
 240 {
 241         u32 bw = fe->dtv_property_cache.bandwidth_hz;
 242         if (bw == 7000000)
 243                 buf[3] |= 0x08;
 244 }
 245 
 246 static const struct dvb_pll_desc dvb_pll_tua6034 = {
 247         .name  = "Infineon TUA6034",
 248         .min   = 44250 * kHz,
 249         .max   = 858 * MHz,
 250         .iffreq= 36166667,
 251         .count = 3,
 252         .set   = tua6034_bw,
 253         .entries = {
 254                 {  174500000, 62500, 0xce, 0x01 },
 255                 {  230000000, 62500, 0xce, 0x02 },
 256                 {  999999999, 62500, 0xce, 0x04 },
 257         },
 258 };
 259 
 260 /* ALPS TDED4
 261  * used in Nebula-Cards and USB boxes
 262  */
 263 static void tded4_bw(struct dvb_frontend *fe, u8 *buf)
 264 {
 265         u32 bw = fe->dtv_property_cache.bandwidth_hz;
 266         if (bw == 8000000)
 267                 buf[3] |= 0x04;
 268 }
 269 
 270 static const struct dvb_pll_desc dvb_pll_tded4 = {
 271         .name = "ALPS TDED4",
 272         .min =  47 * MHz,
 273         .max = 863 * MHz,
 274         .iffreq= 36166667,
 275         .set   = tded4_bw,
 276         .count = 4,
 277         .entries = {
 278                 { 153000000, 166667, 0x85, 0x01 },
 279                 { 470000000, 166667, 0x85, 0x02 },
 280                 { 823000000, 166667, 0x85, 0x08 },
 281                 { 999999999, 166667, 0x85, 0x88 },
 282         }
 283 };
 284 
 285 /* ALPS TDHU2
 286  * used in AverTVHD MCE A180
 287  */
 288 static const struct dvb_pll_desc dvb_pll_tdhu2 = {
 289         .name = "ALPS TDHU2",
 290         .min =  54 * MHz,
 291         .max = 864 * MHz,
 292         .iffreq= 44000000,
 293         .count = 4,
 294         .entries = {
 295                 { 162000000, 62500, 0x85, 0x01 },
 296                 { 426000000, 62500, 0x85, 0x02 },
 297                 { 782000000, 62500, 0x85, 0x08 },
 298                 { 999999999, 62500, 0x85, 0x88 },
 299         }
 300 };
 301 
 302 /* Samsung TBMV30111IN / TBMV30712IN1
 303  * used in Air2PC ATSC - 2nd generation (nxt2002)
 304  */
 305 static const struct dvb_pll_desc dvb_pll_samsung_tbmv = {
 306         .name = "Samsung TBMV30111IN / TBMV30712IN1",
 307         .min =  54 * MHz,
 308         .max = 860 * MHz,
 309         .iffreq= 44000000,
 310         .count = 6,
 311         .entries = {
 312                 { 172000000, 166667, 0xb4, 0x01 },
 313                 { 214000000, 166667, 0xb4, 0x02 },
 314                 { 467000000, 166667, 0xbc, 0x02 },
 315                 { 721000000, 166667, 0xbc, 0x08 },
 316                 { 841000000, 166667, 0xf4, 0x08 },
 317                 { 999999999, 166667, 0xfc, 0x02 },
 318         }
 319 };
 320 
 321 /*
 322  * Philips SD1878 Tuner.
 323  */
 324 static const struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
 325         .name  = "Philips SD1878",
 326         .min   =  950 * MHz,
 327         .max   = 2150 * MHz,
 328         .iffreq= 249, /* zero-IF, offset 249 is to round up */
 329         .count = 4,
 330         .entries = {
 331                 { 1250000, 500, 0xc4, 0x00},
 332                 { 1450000, 500, 0xc4, 0x40},
 333                 { 2050000, 500, 0xc4, 0x80},
 334                 { 2150000, 500, 0xc4, 0xc0},
 335         },
 336 };
 337 
 338 static void opera1_bw(struct dvb_frontend *fe, u8 *buf)
 339 {
 340         struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 341         struct dvb_pll_priv *priv = fe->tuner_priv;
 342         u32 b_w  = (c->symbol_rate * 27) / 32000;
 343         struct i2c_msg msg = {
 344                 .addr = priv->pll_i2c_address,
 345                 .flags = 0,
 346                 .buf = buf,
 347                 .len = 4
 348         };
 349         int result;
 350         u8 lpf;
 351 
 352         if (fe->ops.i2c_gate_ctrl)
 353                 fe->ops.i2c_gate_ctrl(fe, 1);
 354 
 355         result = i2c_transfer(priv->i2c, &msg, 1);
 356         if (result != 1)
 357                 pr_err("%s: i2c_transfer failed:%d",
 358                         __func__, result);
 359 
 360         if (b_w <= 10000)
 361                 lpf = 0xc;
 362         else if (b_w <= 12000)
 363                 lpf = 0x2;
 364         else if (b_w <= 14000)
 365                 lpf = 0xa;
 366         else if (b_w <= 16000)
 367                 lpf = 0x6;
 368         else if (b_w <= 18000)
 369                 lpf = 0xe;
 370         else if (b_w <= 20000)
 371                 lpf = 0x1;
 372         else if (b_w <= 22000)
 373                 lpf = 0x9;
 374         else if (b_w <= 24000)
 375                 lpf = 0x5;
 376         else if (b_w <= 26000)
 377                 lpf = 0xd;
 378         else if (b_w <= 28000)
 379                 lpf = 0x3;
 380                 else
 381                 lpf = 0xb;
 382         buf[2] ^= 0x1c; /* Flip bits 3-5 */
 383         /* Set lpf */
 384         buf[2] |= ((lpf >> 2) & 0x3) << 3;
 385         buf[3] |= (lpf & 0x3) << 2;
 386 
 387         return;
 388 }
 389 
 390 static const struct dvb_pll_desc dvb_pll_opera1 = {
 391         .name  = "Opera Tuner",
 392         .min   =  900 * MHz,
 393         .max   = 2250 * MHz,
 394         .initdata = (u8[]){ 4, 0x08, 0xe5, 0xe1, 0x00 },
 395         .initdata2 = (u8[]){ 4, 0x08, 0xe5, 0xe5, 0x00 },
 396         .iffreq= 0,
 397         .set   = opera1_bw,
 398         .count = 8,
 399         .entries = {
 400                 { 1064000, 500, 0xf9, 0xc2 },
 401                 { 1169000, 500, 0xf9, 0xe2 },
 402                 { 1299000, 500, 0xf9, 0x20 },
 403                 { 1444000, 500, 0xf9, 0x40 },
 404                 { 1606000, 500, 0xf9, 0x60 },
 405                 { 1777000, 500, 0xf9, 0x80 },
 406                 { 1941000, 500, 0xf9, 0xa0 },
 407                 { 2250000, 500, 0xf9, 0xc0 },
 408         }
 409 };
 410 
 411 static void samsung_dtos403ih102a_set(struct dvb_frontend *fe, u8 *buf)
 412 {
 413         struct dvb_pll_priv *priv = fe->tuner_priv;
 414         struct i2c_msg msg = {
 415                 .addr = priv->pll_i2c_address,
 416                 .flags = 0,
 417                 .buf = buf,
 418                 .len = 4
 419         };
 420         int result;
 421 
 422         if (fe->ops.i2c_gate_ctrl)
 423                 fe->ops.i2c_gate_ctrl(fe, 1);
 424 
 425         result = i2c_transfer(priv->i2c, &msg, 1);
 426         if (result != 1)
 427                 pr_err("%s: i2c_transfer failed:%d",
 428                         __func__, result);
 429 
 430         buf[2] = 0x9e;
 431         buf[3] = 0x90;
 432 
 433         return;
 434 }
 435 
 436 /* unknown pll used in Samsung DTOS403IH102A DVB-C tuner */
 437 static const struct dvb_pll_desc dvb_pll_samsung_dtos403ih102a = {
 438         .name   = "Samsung DTOS403IH102A",
 439         .min    = 44250 * kHz,
 440         .max    = 858 * MHz,
 441         .iffreq =  36125000,
 442         .count  = 8,
 443         .set    = samsung_dtos403ih102a_set,
 444         .entries = {
 445                 { 135000000, 62500, 0xbe, 0x01 },
 446                 { 177000000, 62500, 0xf6, 0x01 },
 447                 { 370000000, 62500, 0xbe, 0x02 },
 448                 { 450000000, 62500, 0xf6, 0x02 },
 449                 { 466000000, 62500, 0xfe, 0x02 },
 450                 { 538000000, 62500, 0xbe, 0x08 },
 451                 { 826000000, 62500, 0xf6, 0x08 },
 452                 { 999999999, 62500, 0xfe, 0x08 },
 453         }
 454 };
 455 
 456 /* Samsung TDTC9251DH0 DVB-T NIM, as used on AirStar 2 */
 457 static const struct dvb_pll_desc dvb_pll_samsung_tdtc9251dh0 = {
 458         .name   = "Samsung TDTC9251DH0",
 459         .min    =  48 * MHz,
 460         .max    = 863 * MHz,
 461         .iffreq =  36166667,
 462         .count  = 3,
 463         .entries = {
 464                 { 157500000, 166667, 0xcc, 0x09 },
 465                 { 443000000, 166667, 0xcc, 0x0a },
 466                 { 863000000, 166667, 0xcc, 0x08 },
 467         }
 468 };
 469 
 470 /* Samsung TBDU18132 DVB-S NIM with TSA5059 PLL, used in SkyStar2 DVB-S 2.3 */
 471 static const struct dvb_pll_desc dvb_pll_samsung_tbdu18132 = {
 472         .name = "Samsung TBDU18132",
 473         .min    =  950 * MHz,
 474         .max    = 2150 * MHz, /* guesses */
 475         .iffreq = 0,
 476         .count = 2,
 477         .entries = {
 478                 { 1550000, 125, 0x84, 0x82 },
 479                 { 4095937, 125, 0x84, 0x80 },
 480         }
 481         /* TSA5059 PLL has a 17 bit divisor rather than the 15 bits supported
 482          * by this driver.  The two extra bits are 0x60 in the third byte.  15
 483          * bits is enough for over 4 GHz, which is enough to cover the range
 484          * of this tuner.  We could use the additional divisor bits by adding
 485          * more entries, e.g.
 486          { 0x0ffff * 125 + 125/2, 125, 0x84 | 0x20, },
 487          { 0x17fff * 125 + 125/2, 125, 0x84 | 0x40, },
 488          { 0x1ffff * 125 + 125/2, 125, 0x84 | 0x60, }, */
 489 };
 490 
 491 /* Samsung TBMU24112 DVB-S NIM with SL1935 zero-IF tuner */
 492 static const struct dvb_pll_desc dvb_pll_samsung_tbmu24112 = {
 493         .name = "Samsung TBMU24112",
 494         .min    =  950 * MHz,
 495         .max    = 2150 * MHz, /* guesses */
 496         .iffreq = 0,
 497         .count = 2,
 498         .entries = {
 499                 { 1500000, 125, 0x84, 0x18 },
 500                 { 9999999, 125, 0x84, 0x08 },
 501         }
 502 };
 503 
 504 /* Alps TDEE4 DVB-C NIM, used on Cablestar 2 */
 505 /* byte 4 : 1  *   *   AGD R3  R2  R1  R0
 506  * byte 5 : C1 *   RE  RTS BS4 BS3 BS2 BS1
 507  * AGD = 1, R3 R2 R1 R0 = 0 1 0 1 => byte 4 = 1**10101 = 0x95
 508  * Range(MHz)  C1 *  RE RTS BS4 BS3 BS2 BS1  Byte 5
 509  *  47 - 153   0  *  0   0   0   0   0   1   0x01
 510  * 153 - 430   0  *  0   0   0   0   1   0   0x02
 511  * 430 - 822   0  *  0   0   1   0   0   0   0x08
 512  * 822 - 862   1  *  0   0   1   0   0   0   0x88 */
 513 static const struct dvb_pll_desc dvb_pll_alps_tdee4 = {
 514         .name = "ALPS TDEE4",
 515         .min    =  47 * MHz,
 516         .max    = 862 * MHz,
 517         .iffreq =  36125000,
 518         .count = 4,
 519         .entries = {
 520                 { 153000000, 62500, 0x95, 0x01 },
 521                 { 430000000, 62500, 0x95, 0x02 },
 522                 { 822000000, 62500, 0x95, 0x08 },
 523                 { 999999999, 62500, 0x95, 0x88 },
 524         }
 525 };
 526 
 527 /* Infineon TUA6034 ISDB-T, used in Friio */
 528 /* CP cur. 50uA, AGC takeover: 103dBuV, PORT3 on */
 529 static const struct dvb_pll_desc dvb_pll_tua6034_friio = {
 530         .name   = "Infineon TUA6034 ISDB-T (Friio)",
 531         .min    =  90 * MHz,
 532         .max    = 770 * MHz,
 533         .iffreq =  57000000,
 534         .initdata = (u8[]){ 4, 0x9a, 0x50, 0xb2, 0x08 },
 535         .sleepdata = (u8[]){ 4, 0x9a, 0x70, 0xb3, 0x0b },
 536         .count = 3,
 537         .entries = {
 538                 { 170000000, 142857, 0xba, 0x09 },
 539                 { 470000000, 142857, 0xba, 0x0a },
 540                 { 770000000, 142857, 0xb2, 0x08 },
 541         }
 542 };
 543 
 544 /* Philips TDA6651 ISDB-T, used in Earthsoft PT1 */
 545 static const struct dvb_pll_desc dvb_pll_tda665x_earth_pt1 = {
 546         .name   = "Philips TDA6651 ISDB-T (EarthSoft PT1)",
 547         .min    =  90 * MHz,
 548         .max    = 770 * MHz,
 549         .iffreq =  57000000,
 550         .initdata = (u8[]){ 5, 0x0e, 0x7f, 0xc1, 0x80, 0x80 },
 551         .count = 10,
 552         .entries = {
 553                 { 140000000, 142857, 0xc1, 0x81 },
 554                 { 170000000, 142857, 0xc1, 0xa1 },
 555                 { 220000000, 142857, 0xc1, 0x62 },
 556                 { 330000000, 142857, 0xc1, 0xa2 },
 557                 { 402000000, 142857, 0xc1, 0xe2 },
 558                 { 450000000, 142857, 0xc1, 0x64 },
 559                 { 550000000, 142857, 0xc1, 0x84 },
 560                 { 600000000, 142857, 0xc1, 0xa4 },
 561                 { 700000000, 142857, 0xc1, 0xc4 },
 562                 { 770000000, 142857, 0xc1, 0xe4 },
 563         }
 564 };
 565 
 566 /* ----------------------------------------------------------- */
 567 
 568 static const struct dvb_pll_desc *pll_list[] = {
 569         [DVB_PLL_UNDEFINED]              = NULL,
 570         [DVB_PLL_THOMSON_DTT7579]        = &dvb_pll_thomson_dtt7579,
 571         [DVB_PLL_THOMSON_DTT759X]        = &dvb_pll_thomson_dtt759x,
 572         [DVB_PLL_THOMSON_DTT7520X]       = &dvb_pll_thomson_dtt7520x,
 573         [DVB_PLL_LG_Z201]                = &dvb_pll_lg_z201,
 574         [DVB_PLL_UNKNOWN_1]              = &dvb_pll_unknown_1,
 575         [DVB_PLL_TUA6010XS]              = &dvb_pll_tua6010xs,
 576         [DVB_PLL_ENV57H1XD5]             = &dvb_pll_env57h1xd5,
 577         [DVB_PLL_TUA6034]                = &dvb_pll_tua6034,
 578         [DVB_PLL_TDA665X]                = &dvb_pll_tda665x,
 579         [DVB_PLL_TDED4]                  = &dvb_pll_tded4,
 580         [DVB_PLL_TDEE4]                  = &dvb_pll_alps_tdee4,
 581         [DVB_PLL_TDHU2]                  = &dvb_pll_tdhu2,
 582         [DVB_PLL_SAMSUNG_TBMV]           = &dvb_pll_samsung_tbmv,
 583         [DVB_PLL_PHILIPS_SD1878_TDA8261] = &dvb_pll_philips_sd1878_tda8261,
 584         [DVB_PLL_OPERA1]                 = &dvb_pll_opera1,
 585         [DVB_PLL_SAMSUNG_DTOS403IH102A]  = &dvb_pll_samsung_dtos403ih102a,
 586         [DVB_PLL_SAMSUNG_TDTC9251DH0]    = &dvb_pll_samsung_tdtc9251dh0,
 587         [DVB_PLL_SAMSUNG_TBDU18132]      = &dvb_pll_samsung_tbdu18132,
 588         [DVB_PLL_SAMSUNG_TBMU24112]      = &dvb_pll_samsung_tbmu24112,
 589         [DVB_PLL_TUA6034_FRIIO]          = &dvb_pll_tua6034_friio,
 590         [DVB_PLL_TDA665X_EARTH_PT1]      = &dvb_pll_tda665x_earth_pt1,
 591 };
 592 
 593 /* ----------------------------------------------------------- */
 594 /* code                                                        */
 595 
 596 static int dvb_pll_configure(struct dvb_frontend *fe, u8 *buf,
 597                              const u32 frequency)
 598 {
 599         struct dvb_pll_priv *priv = fe->tuner_priv;
 600         const struct dvb_pll_desc *desc = priv->pll_desc;
 601         u32 div;
 602         int i;
 603 
 604         for (i = 0; i < desc->count; i++) {
 605                 if (frequency > desc->entries[i].limit)
 606                         continue;
 607                 break;
 608         }
 609 
 610         if (debug)
 611                 dprintk("pll: %s: freq=%d | i=%d/%d\n", desc->name,
 612                        frequency, i, desc->count);
 613         if (i == desc->count)
 614                 return -EINVAL;
 615 
 616         div = (frequency + desc->iffreq +
 617                desc->entries[i].stepsize/2) / desc->entries[i].stepsize;
 618         buf[0] = div >> 8;
 619         buf[1] = div & 0xff;
 620         buf[2] = desc->entries[i].config;
 621         buf[3] = desc->entries[i].cb;
 622 
 623         if (desc->set)
 624                 desc->set(fe, buf);
 625 
 626         if (debug)
 627                 dprintk("pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
 628                        desc->name, div, buf[0], buf[1], buf[2], buf[3]);
 629 
 630         // calculate the frequency we set it to
 631         return (div * desc->entries[i].stepsize) - desc->iffreq;
 632 }
 633 
 634 static void dvb_pll_release(struct dvb_frontend *fe)
 635 {
 636         kfree(fe->tuner_priv);
 637         fe->tuner_priv = NULL;
 638 }
 639 
 640 static int dvb_pll_sleep(struct dvb_frontend *fe)
 641 {
 642         struct dvb_pll_priv *priv = fe->tuner_priv;
 643 
 644         if (priv->i2c == NULL)
 645                 return -EINVAL;
 646 
 647         if (priv->pll_desc->sleepdata) {
 648                 struct i2c_msg msg = { .flags = 0,
 649                         .addr = priv->pll_i2c_address,
 650                         .buf = priv->pll_desc->sleepdata + 1,
 651                         .len = priv->pll_desc->sleepdata[0] };
 652 
 653                 int result;
 654 
 655                 if (fe->ops.i2c_gate_ctrl)
 656                         fe->ops.i2c_gate_ctrl(fe, 1);
 657                 if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
 658                         return result;
 659                 }
 660                 return 0;
 661         }
 662         /* Shouldn't be called when initdata is NULL, maybe BUG()? */
 663         return -EINVAL;
 664 }
 665 
 666 static int dvb_pll_set_params(struct dvb_frontend *fe)
 667 {
 668         struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 669         struct dvb_pll_priv *priv = fe->tuner_priv;
 670         u8 buf[4];
 671         struct i2c_msg msg =
 672                 { .addr = priv->pll_i2c_address, .flags = 0,
 673                   .buf = buf, .len = sizeof(buf) };
 674         int result;
 675         u32 frequency = 0;
 676 
 677         if (priv->i2c == NULL)
 678                 return -EINVAL;
 679 
 680         result = dvb_pll_configure(fe, buf, c->frequency);
 681         if (result < 0)
 682                 return result;
 683         else
 684                 frequency = result;
 685 
 686         if (fe->ops.i2c_gate_ctrl)
 687                 fe->ops.i2c_gate_ctrl(fe, 1);
 688         if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
 689                 return result;
 690         }
 691 
 692         priv->frequency = frequency;
 693         priv->bandwidth = c->bandwidth_hz;
 694 
 695         return 0;
 696 }
 697 
 698 static int dvb_pll_calc_regs(struct dvb_frontend *fe,
 699                              u8 *buf, int buf_len)
 700 {
 701         struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 702         struct dvb_pll_priv *priv = fe->tuner_priv;
 703         int result;
 704         u32 frequency = 0;
 705 
 706         if (buf_len < 5)
 707                 return -EINVAL;
 708 
 709         result = dvb_pll_configure(fe, buf + 1, c->frequency);
 710         if (result < 0)
 711                 return result;
 712         else
 713                 frequency = result;
 714 
 715         buf[0] = priv->pll_i2c_address;
 716 
 717         priv->frequency = frequency;
 718         priv->bandwidth = c->bandwidth_hz;
 719 
 720         return 5;
 721 }
 722 
 723 static int dvb_pll_get_frequency(struct dvb_frontend *fe, u32 *frequency)
 724 {
 725         struct dvb_pll_priv *priv = fe->tuner_priv;
 726         *frequency = priv->frequency;
 727         return 0;
 728 }
 729 
 730 static int dvb_pll_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
 731 {
 732         struct dvb_pll_priv *priv = fe->tuner_priv;
 733         *bandwidth = priv->bandwidth;
 734         return 0;
 735 }
 736 
 737 static int dvb_pll_init(struct dvb_frontend *fe)
 738 {
 739         struct dvb_pll_priv *priv = fe->tuner_priv;
 740 
 741         if (priv->i2c == NULL)
 742                 return -EINVAL;
 743 
 744         if (priv->pll_desc->initdata) {
 745                 struct i2c_msg msg = { .flags = 0,
 746                         .addr = priv->pll_i2c_address,
 747                         .buf = priv->pll_desc->initdata + 1,
 748                         .len = priv->pll_desc->initdata[0] };
 749 
 750                 int result;
 751                 if (fe->ops.i2c_gate_ctrl)
 752                         fe->ops.i2c_gate_ctrl(fe, 1);
 753                 result = i2c_transfer(priv->i2c, &msg, 1);
 754                 if (result != 1)
 755                         return result;
 756                 if (priv->pll_desc->initdata2) {
 757                         msg.buf = priv->pll_desc->initdata2 + 1;
 758                         msg.len = priv->pll_desc->initdata2[0];
 759                         if (fe->ops.i2c_gate_ctrl)
 760                                 fe->ops.i2c_gate_ctrl(fe, 1);
 761                         result = i2c_transfer(priv->i2c, &msg, 1);
 762                         if (result != 1)
 763                                 return result;
 764                 }
 765                 return 0;
 766         }
 767         /* Shouldn't be called when initdata is NULL, maybe BUG()? */
 768         return -EINVAL;
 769 }
 770 
 771 static const struct dvb_tuner_ops dvb_pll_tuner_ops = {
 772         .release = dvb_pll_release,
 773         .sleep = dvb_pll_sleep,
 774         .init = dvb_pll_init,
 775         .set_params = dvb_pll_set_params,
 776         .calc_regs = dvb_pll_calc_regs,
 777         .get_frequency = dvb_pll_get_frequency,
 778         .get_bandwidth = dvb_pll_get_bandwidth,
 779 };
 780 
 781 struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,
 782                                     struct i2c_adapter *i2c,
 783                                     unsigned int pll_desc_id)
 784 {
 785         u8 *b1;
 786         struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .len = 1 };
 787         struct dvb_pll_priv *priv = NULL;
 788         int ret;
 789         const struct dvb_pll_desc *desc;
 790         int nr;
 791 
 792         b1 = kmalloc(1, GFP_KERNEL);
 793         if (!b1)
 794                 return NULL;
 795 
 796         b1[0] = 0;
 797         msg.buf = b1;
 798 
 799         nr = ida_simple_get(&pll_ida, 0, DVB_PLL_MAX, GFP_KERNEL);
 800         if (nr < 0) {
 801                 kfree(b1);
 802                 return NULL;
 803         }
 804 
 805         if (id[nr] > DVB_PLL_UNDEFINED && id[nr] < ARRAY_SIZE(pll_list))
 806                 pll_desc_id = id[nr];
 807 
 808         BUG_ON(pll_desc_id < 1 || pll_desc_id >= ARRAY_SIZE(pll_list));
 809 
 810         desc = pll_list[pll_desc_id];
 811 
 812         if (i2c != NULL) {
 813                 if (fe->ops.i2c_gate_ctrl)
 814                         fe->ops.i2c_gate_ctrl(fe, 1);
 815 
 816                 ret = i2c_transfer (i2c, &msg, 1);
 817                 if (ret != 1)
 818                         goto out;
 819                 if (fe->ops.i2c_gate_ctrl)
 820                              fe->ops.i2c_gate_ctrl(fe, 0);
 821         }
 822 
 823         priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL);
 824         if (!priv)
 825                 goto out;
 826 
 827         priv->pll_i2c_address = pll_addr;
 828         priv->i2c = i2c;
 829         priv->pll_desc = desc;
 830         priv->nr = nr;
 831 
 832         memcpy(&fe->ops.tuner_ops, &dvb_pll_tuner_ops,
 833                sizeof(struct dvb_tuner_ops));
 834 
 835         strscpy(fe->ops.tuner_ops.info.name, desc->name,
 836                 sizeof(fe->ops.tuner_ops.info.name));
 837 
 838         fe->ops.tuner_ops.info.frequency_min_hz = desc->min;
 839         fe->ops.tuner_ops.info.frequency_max_hz = desc->max;
 840 
 841         dprintk("%s tuner, frequency range: %u...%u\n",
 842                 desc->name, desc->min, desc->max);
 843 
 844         if (!desc->initdata)
 845                 fe->ops.tuner_ops.init = NULL;
 846         if (!desc->sleepdata)
 847                 fe->ops.tuner_ops.sleep = NULL;
 848 
 849         fe->tuner_priv = priv;
 850 
 851         if ((debug) || (id[priv->nr] == pll_desc_id)) {
 852                 dprintk("dvb-pll[%d]", priv->nr);
 853                 if (i2c != NULL)
 854                         pr_cont(" %d-%04x", i2c_adapter_id(i2c), pll_addr);
 855                 pr_cont(": id# %d (%s) attached, %s\n", pll_desc_id, desc->name,
 856                        id[priv->nr] == pll_desc_id ?
 857                                 "insmod option" : "autodetected");
 858         }
 859 
 860         kfree(b1);
 861 
 862         return fe;
 863 out:
 864         kfree(b1);
 865         ida_simple_remove(&pll_ida, nr);
 866 
 867         return NULL;
 868 }
 869 EXPORT_SYMBOL(dvb_pll_attach);
 870 
 871 
 872 static int
 873 dvb_pll_probe(struct i2c_client *client, const struct i2c_device_id *id)
 874 {
 875         struct dvb_pll_config *cfg;
 876         struct dvb_frontend *fe;
 877         unsigned int desc_id;
 878 
 879         cfg = client->dev.platform_data;
 880         fe = cfg->fe;
 881         i2c_set_clientdata(client, fe);
 882         desc_id = (unsigned int) id->driver_data;
 883 
 884         if (!dvb_pll_attach(fe, client->addr, client->adapter, desc_id))
 885                 return -ENOMEM;
 886 
 887         /*
 888          * Unset tuner_ops.release (== dvb_pll_release)
 889          * which has been just set in the above dvb_pll_attach(),
 890          * because if tuner_ops.release was left defined,
 891          * this module would be 'put' twice on exit:
 892          * once by dvb_frontend_detach() and another by dvb_module_release().
 893          *
 894          * dvb_pll_release is instead executed in the i2c driver's .remove(),
 895          * keeping dvb_pll_attach untouched for legacy (dvb_attach) drivers.
 896          */
 897         fe->ops.tuner_ops.release = NULL;
 898         dev_info(&client->dev, "DVB Simple Tuner attached.\n");
 899         return 0;
 900 }
 901 
 902 static int dvb_pll_remove(struct i2c_client *client)
 903 {
 904         struct dvb_frontend *fe = i2c_get_clientdata(client);
 905         struct dvb_pll_priv *priv = fe->tuner_priv;
 906 
 907         ida_simple_remove(&pll_ida, priv->nr);
 908         dvb_pll_release(fe);
 909         return 0;
 910 }
 911 
 912 
 913 static const struct i2c_device_id dvb_pll_id[] = {
 914         {"dtt7579",             DVB_PLL_THOMSON_DTT7579},
 915         {"dtt759x",             DVB_PLL_THOMSON_DTT759X},
 916         {"z201",                DVB_PLL_LG_Z201},
 917         {"unknown_1",           DVB_PLL_UNKNOWN_1},
 918         {"tua6010xs",           DVB_PLL_TUA6010XS},
 919         {"env57h1xd5",          DVB_PLL_ENV57H1XD5},
 920         {"tua6034",             DVB_PLL_TUA6034},
 921         {"tda665x",             DVB_PLL_TDA665X},
 922         {"tded4",               DVB_PLL_TDED4},
 923         {"tdhu2",               DVB_PLL_TDHU2},
 924         {"tbmv",                DVB_PLL_SAMSUNG_TBMV},
 925         {"sd1878_tda8261",      DVB_PLL_PHILIPS_SD1878_TDA8261},
 926         {"opera1",              DVB_PLL_OPERA1},
 927         {"dtos403ih102a",       DVB_PLL_SAMSUNG_DTOS403IH102A},
 928         {"tdtc9251dh0",         DVB_PLL_SAMSUNG_TDTC9251DH0},
 929         {"tbdu18132",           DVB_PLL_SAMSUNG_TBDU18132},
 930         {"tbmu24112",           DVB_PLL_SAMSUNG_TBMU24112},
 931         {"tdee4",               DVB_PLL_TDEE4},
 932         {"dtt7520x",            DVB_PLL_THOMSON_DTT7520X},
 933         {"tua6034_friio",       DVB_PLL_TUA6034_FRIIO},
 934         {"tda665x_earthpt1",    DVB_PLL_TDA665X_EARTH_PT1},
 935         {}
 936 };
 937 
 938 
 939 MODULE_DEVICE_TABLE(i2c, dvb_pll_id);
 940 
 941 static struct i2c_driver dvb_pll_driver = {
 942         .driver = {
 943                 .name = "dvb_pll",
 944         },
 945         .probe    = dvb_pll_probe,
 946         .remove   = dvb_pll_remove,
 947         .id_table = dvb_pll_id,
 948 };
 949 
 950 module_i2c_driver(dvb_pll_driver);
 951 
 952 MODULE_DESCRIPTION("dvb pll library");
 953 MODULE_AUTHOR("Gerd Knorr");
 954 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */