|  | /* | 
|  | * $Id: dvb-pll.c,v 1.7 2005/02/10 11:52:02 kraxel Exp $ | 
|  | * | 
|  | * descriptions + helper functions for simple dvb plls. | 
|  | * | 
|  | * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] | 
|  | * | 
|  | *  This program is free software; you can redistribute it and/or modify | 
|  | *  it under the terms of the GNU General Public License as published by | 
|  | *  the Free Software Foundation; either version 2 of the License, or | 
|  | *  (at your option) any later version. | 
|  | * | 
|  | *  This program is distributed in the hope that it will be useful, | 
|  | *  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | *  GNU General Public License for more details. | 
|  | * | 
|  | *  You should have received a copy of the GNU General Public License | 
|  | *  along with this program; if not, write to the Free Software | 
|  | *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  | */ | 
|  |  | 
|  | #include <linux/module.h> | 
|  | #include <linux/dvb/frontend.h> | 
|  | #include <asm/types.h> | 
|  |  | 
|  | #include "dvb-pll.h" | 
|  |  | 
|  | /* ----------------------------------------------------------- */ | 
|  | /* descriptions                                                */ | 
|  |  | 
|  | struct dvb_pll_desc dvb_pll_thomson_dtt7579 = { | 
|  | .name  = "Thomson dtt7579", | 
|  | .min   = 177000000, | 
|  | .max   = 858000000, | 
|  | .count = 5, | 
|  | .entries = { | 
|  | {          0, 36166667, 166666, 0xb4, 0x03 }, /* go sleep */ | 
|  | {  443250000, 36166667, 166666, 0xb4, 0x02 }, | 
|  | {  542000000, 36166667, 166666, 0xb4, 0x08 }, | 
|  | {  771000000, 36166667, 166666, 0xbc, 0x08 }, | 
|  | {  999999999, 36166667, 166666, 0xf4, 0x08 }, | 
|  | }, | 
|  | }; | 
|  | EXPORT_SYMBOL(dvb_pll_thomson_dtt7579); | 
|  |  | 
|  | struct dvb_pll_desc dvb_pll_thomson_dtt7610 = { | 
|  | .name  = "Thomson dtt7610", | 
|  | .min   =  44000000, | 
|  | .max   = 958000000, | 
|  | .count = 3, | 
|  | .entries = { | 
|  | { 157250000, 44000000, 62500, 0x8e, 0x39 }, | 
|  | { 454000000, 44000000, 62500, 0x8e, 0x3a }, | 
|  | { 999999999, 44000000, 62500, 0x8e, 0x3c }, | 
|  | }, | 
|  | }; | 
|  | EXPORT_SYMBOL(dvb_pll_thomson_dtt7610); | 
|  |  | 
|  | static void thomson_dtt759x_bw(u8 *buf, int bandwidth) | 
|  | { | 
|  | if (BANDWIDTH_7_MHZ == bandwidth) | 
|  | buf[3] |= 0x10; | 
|  | } | 
|  |  | 
|  | struct dvb_pll_desc dvb_pll_thomson_dtt759x = { | 
|  | .name  = "Thomson dtt759x", | 
|  | .min   = 177000000, | 
|  | .max   = 896000000, | 
|  | .setbw = thomson_dtt759x_bw, | 
|  | .count = 6, | 
|  | .entries = { | 
|  | {          0, 36166667, 166666, 0x84, 0x03 }, | 
|  | {  264000000, 36166667, 166666, 0xb4, 0x02 }, | 
|  | {  470000000, 36166667, 166666, 0xbc, 0x02 }, | 
|  | {  735000000, 36166667, 166666, 0xbc, 0x08 }, | 
|  | {  835000000, 36166667, 166666, 0xf4, 0x08 }, | 
|  | {  999999999, 36166667, 166666, 0xfc, 0x08 }, | 
|  | }, | 
|  | }; | 
|  | EXPORT_SYMBOL(dvb_pll_thomson_dtt759x); | 
|  |  | 
|  | struct dvb_pll_desc dvb_pll_lg_z201 = { | 
|  | .name  = "LG z201", | 
|  | .min   = 174000000, | 
|  | .max   = 862000000, | 
|  | .count = 5, | 
|  | .entries = { | 
|  | {          0, 36166667, 166666, 0xbc, 0x03 }, | 
|  | {  443250000, 36166667, 166666, 0xbc, 0x01 }, | 
|  | {  542000000, 36166667, 166666, 0xbc, 0x02 }, | 
|  | {  830000000, 36166667, 166666, 0xf4, 0x02 }, | 
|  | {  999999999, 36166667, 166666, 0xfc, 0x02 }, | 
|  | }, | 
|  | }; | 
|  | EXPORT_SYMBOL(dvb_pll_lg_z201); | 
|  |  | 
|  | struct dvb_pll_desc dvb_pll_unknown_1 = { | 
|  | .name  = "unknown 1", /* used by dntv live dvb-t */ | 
|  | .min   = 174000000, | 
|  | .max   = 862000000, | 
|  | .count = 9, | 
|  | .entries = { | 
|  | {  150000000, 36166667, 166666, 0xb4, 0x01 }, | 
|  | {  173000000, 36166667, 166666, 0xbc, 0x01 }, | 
|  | {  250000000, 36166667, 166666, 0xb4, 0x02 }, | 
|  | {  400000000, 36166667, 166666, 0xbc, 0x02 }, | 
|  | {  420000000, 36166667, 166666, 0xf4, 0x02 }, | 
|  | {  470000000, 36166667, 166666, 0xfc, 0x02 }, | 
|  | {  600000000, 36166667, 166666, 0xbc, 0x08 }, | 
|  | {  730000000, 36166667, 166666, 0xf4, 0x08 }, | 
|  | {  999999999, 36166667, 166666, 0xfc, 0x08 }, | 
|  | }, | 
|  | }; | 
|  | EXPORT_SYMBOL(dvb_pll_unknown_1); | 
|  |  | 
|  | /* ----------------------------------------------------------- */ | 
|  | /* code                                                        */ | 
|  |  | 
|  | static int debug = 0; | 
|  | module_param(debug, int, 0644); | 
|  | MODULE_PARM_DESC(debug, "enable verbose debug messages"); | 
|  |  | 
|  | int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf, | 
|  | u32 freq, int bandwidth) | 
|  | { | 
|  | u32 div; | 
|  | int i; | 
|  |  | 
|  | if (freq != 0 && (freq < desc->min || freq > desc->max)) | 
|  | return -EINVAL; | 
|  |  | 
|  | for (i = 0; i < desc->count; i++) { | 
|  | if (freq > desc->entries[i].limit) | 
|  | continue; | 
|  | break; | 
|  | } | 
|  | if (debug) | 
|  | printk("pll: %s: freq=%d bw=%d | i=%d/%d\n", | 
|  | desc->name, freq, bandwidth, i, desc->count); | 
|  | BUG_ON(i == desc->count); | 
|  |  | 
|  | div = (freq + desc->entries[i].offset) / desc->entries[i].stepsize; | 
|  | buf[0] = div >> 8; | 
|  | buf[1] = div & 0xff; | 
|  | buf[2] = desc->entries[i].cb1; | 
|  | buf[3] = desc->entries[i].cb2; | 
|  |  | 
|  | if (desc->setbw) | 
|  | desc->setbw(buf, bandwidth); | 
|  |  | 
|  | if (debug) | 
|  | printk("pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n", | 
|  | desc->name, div, buf[0], buf[1], buf[2], buf[3]); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | EXPORT_SYMBOL(dvb_pll_configure); | 
|  |  | 
|  | MODULE_DESCRIPTION("dvb pll library"); | 
|  | MODULE_AUTHOR("Gerd Knorr"); | 
|  | MODULE_LICENSE("GPL"); | 
|  |  | 
|  | /* | 
|  | * Local variables: | 
|  | * c-basic-offset: 8 | 
|  | * End: | 
|  | */ |