1 /* 2 STB6100 Silicon Tuner wrapper 3 Copyright (C)2009 Igor M. Liplianin (liplianin@me.by) 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 */ 19 20 #include <linux/dvb/frontend.h> 21 #include <media/dvb_frontend.h> 22 23 static int stb6100_get_freq(struct dvb_frontend *fe, u32 *frequency) 24 { 25 struct dvb_frontend_ops *frontend_ops = &fe->ops; 26 struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 27 int err = 0; 28 29 if (tuner_ops->get_frequency) { 30 if (frontend_ops->i2c_gate_ctrl) 31 frontend_ops->i2c_gate_ctrl(fe, 1); 32 33 err = tuner_ops->get_frequency(fe, frequency); 34 if (err < 0) { 35 printk("%s: Invalid parameter\n", __func__); 36 return err; 37 } 38 39 if (frontend_ops->i2c_gate_ctrl) 40 frontend_ops->i2c_gate_ctrl(fe, 0); 41 } 42 43 return 0; 44 } 45 46 static int stb6100_set_freq(struct dvb_frontend *fe, u32 frequency) 47 { 48 struct dvb_frontend_ops *frontend_ops = &fe->ops; 49 struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 50 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 51 u32 bw = c->bandwidth_hz; 52 int err = 0; 53 54 c->frequency = frequency; 55 c->bandwidth_hz = 0; /* Don't adjust the bandwidth */ 56 57 if (tuner_ops->set_params) { 58 if (frontend_ops->i2c_gate_ctrl) 59 frontend_ops->i2c_gate_ctrl(fe, 1); 60 61 err = tuner_ops->set_params(fe); 62 c->bandwidth_hz = bw; 63 if (err < 0) { 64 printk("%s: Invalid parameter\n", __func__); 65 return err; 66 } 67 68 if (frontend_ops->i2c_gate_ctrl) 69 frontend_ops->i2c_gate_ctrl(fe, 0); 70 71 } 72 73 return 0; 74 } 75 76 static int stb6100_get_bandw(struct dvb_frontend *fe, u32 *bandwidth) 77 { 78 struct dvb_frontend_ops *frontend_ops = &fe->ops; 79 struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 80 int err = 0; 81 82 if (tuner_ops->get_bandwidth) { 83 if (frontend_ops->i2c_gate_ctrl) 84 frontend_ops->i2c_gate_ctrl(fe, 1); 85 86 err = tuner_ops->get_bandwidth(fe, bandwidth); 87 if (err < 0) { 88 printk(KERN_ERR "%s: Invalid parameter\n", __func__); 89 return err; 90 } 91 92 if (frontend_ops->i2c_gate_ctrl) 93 frontend_ops->i2c_gate_ctrl(fe, 0); 94 } 95 96 return 0; 97 } 98 99 static int stb6100_set_bandw(struct dvb_frontend *fe, u32 bandwidth) 100 { 101 struct dvb_frontend_ops *frontend_ops = &fe->ops; 102 struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 103 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 104 u32 freq = c->frequency; 105 int err = 0; 106 107 c->bandwidth_hz = bandwidth; 108 c->frequency = 0; /* Don't adjust the frequency */ 109 110 if (tuner_ops->set_params) { 111 if (frontend_ops->i2c_gate_ctrl) 112 frontend_ops->i2c_gate_ctrl(fe, 1); 113 114 err = tuner_ops->set_params(fe); 115 c->frequency = freq; 116 if (err < 0) { 117 printk(KERN_ERR "%s: Invalid parameter\n", __func__); 118 return err; 119 } 120 121 if (frontend_ops->i2c_gate_ctrl) 122 frontend_ops->i2c_gate_ctrl(fe, 0); 123 124 } 125 126 return 0; 127 } 128