19a0bf528SMauro Carvalho Chehab /* 29a0bf528SMauro Carvalho Chehab STB6100 Silicon Tuner 39a0bf528SMauro Carvalho Chehab Copyright (C) Manu Abraham (abraham.manu@gmail.com) 49a0bf528SMauro Carvalho Chehab 59a0bf528SMauro Carvalho Chehab Copyright (C) ST Microelectronics 69a0bf528SMauro Carvalho Chehab 79a0bf528SMauro Carvalho Chehab This program is free software; you can redistribute it and/or modify 89a0bf528SMauro Carvalho Chehab it under the terms of the GNU General Public License as published by 99a0bf528SMauro Carvalho Chehab the Free Software Foundation; either version 2 of the License, or 109a0bf528SMauro Carvalho Chehab (at your option) any later version. 119a0bf528SMauro Carvalho Chehab 129a0bf528SMauro Carvalho Chehab This program is distributed in the hope that it will be useful, 139a0bf528SMauro Carvalho Chehab but WITHOUT ANY WARRANTY; without even the implied warranty of 149a0bf528SMauro Carvalho Chehab MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 159a0bf528SMauro Carvalho Chehab GNU General Public License for more details. 169a0bf528SMauro Carvalho Chehab 179a0bf528SMauro Carvalho Chehab You should have received a copy of the GNU General Public License 189a0bf528SMauro Carvalho Chehab along with this program; if not, write to the Free Software 199a0bf528SMauro Carvalho Chehab Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 209a0bf528SMauro Carvalho Chehab */ 219a0bf528SMauro Carvalho Chehab 22*65f0f686SMauro Carvalho Chehab #include <linux/dvb/frontend.h> 23*65f0f686SMauro Carvalho Chehab #include "dvb_frontend.h" 24*65f0f686SMauro Carvalho Chehab 259a0bf528SMauro Carvalho Chehab static int stb6100_get_frequency(struct dvb_frontend *fe, u32 *frequency) 269a0bf528SMauro Carvalho Chehab { 2720721185SEmil Goode struct dvb_frontend_ops *frontend_ops = &fe->ops; 2820721185SEmil Goode struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 299a0bf528SMauro Carvalho Chehab int err = 0; 309a0bf528SMauro Carvalho Chehab 31*65f0f686SMauro Carvalho Chehab if (tuner_ops->get_frequency) { 32*65f0f686SMauro Carvalho Chehab err = tuner_ops->get_frequency(fe, frequency); 338f73b481SEmil Goode if (err < 0) { 349a0bf528SMauro Carvalho Chehab printk("%s: Invalid parameter\n", __func__); 359a0bf528SMauro Carvalho Chehab return err; 369a0bf528SMauro Carvalho Chehab } 379a0bf528SMauro Carvalho Chehab } 389a0bf528SMauro Carvalho Chehab return 0; 399a0bf528SMauro Carvalho Chehab } 409a0bf528SMauro Carvalho Chehab 419a0bf528SMauro Carvalho Chehab static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency) 429a0bf528SMauro Carvalho Chehab { 4320721185SEmil Goode struct dvb_frontend_ops *frontend_ops = &fe->ops; 4420721185SEmil Goode struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 45*65f0f686SMauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 46*65f0f686SMauro Carvalho Chehab u32 bw = c->bandwidth_hz; 479a0bf528SMauro Carvalho Chehab int err = 0; 489a0bf528SMauro Carvalho Chehab 49*65f0f686SMauro Carvalho Chehab c->frequency = frequency; 50*65f0f686SMauro Carvalho Chehab c->bandwidth_hz = 0; /* Don't adjust the bandwidth */ 5120721185SEmil Goode 52*65f0f686SMauro Carvalho Chehab if (tuner_ops->set_params) { 53*65f0f686SMauro Carvalho Chehab err = tuner_ops->set_params(fe); 54*65f0f686SMauro Carvalho Chehab c->bandwidth_hz = bw; 558f73b481SEmil Goode if (err < 0) { 569a0bf528SMauro Carvalho Chehab printk("%s: Invalid parameter\n", __func__); 579a0bf528SMauro Carvalho Chehab return err; 589a0bf528SMauro Carvalho Chehab } 599a0bf528SMauro Carvalho Chehab } 609a0bf528SMauro Carvalho Chehab return 0; 619a0bf528SMauro Carvalho Chehab } 629a0bf528SMauro Carvalho Chehab 639a0bf528SMauro Carvalho Chehab static int stb6100_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) 649a0bf528SMauro Carvalho Chehab { 659a0bf528SMauro Carvalho Chehab struct dvb_frontend_ops *frontend_ops = &fe->ops; 669a0bf528SMauro Carvalho Chehab struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 679a0bf528SMauro Carvalho Chehab int err = 0; 689a0bf528SMauro Carvalho Chehab 69*65f0f686SMauro Carvalho Chehab if (tuner_ops->get_bandwidth) { 70*65f0f686SMauro Carvalho Chehab err = tuner_ops->get_bandwidth(fe, bandwidth); 718f73b481SEmil Goode if (err < 0) { 729a0bf528SMauro Carvalho Chehab printk("%s: Invalid parameter\n", __func__); 739a0bf528SMauro Carvalho Chehab return err; 749a0bf528SMauro Carvalho Chehab } 759a0bf528SMauro Carvalho Chehab } 769a0bf528SMauro Carvalho Chehab return 0; 779a0bf528SMauro Carvalho Chehab } 789a0bf528SMauro Carvalho Chehab 799a0bf528SMauro Carvalho Chehab static int stb6100_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth) 809a0bf528SMauro Carvalho Chehab { 8120721185SEmil Goode struct dvb_frontend_ops *frontend_ops = &fe->ops; 8220721185SEmil Goode struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; 83*65f0f686SMauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 84*65f0f686SMauro Carvalho Chehab u32 freq = c->frequency; 859a0bf528SMauro Carvalho Chehab int err = 0; 869a0bf528SMauro Carvalho Chehab 87*65f0f686SMauro Carvalho Chehab c->bandwidth_hz = bandwidth; 88*65f0f686SMauro Carvalho Chehab c->frequency = 0; /* Don't adjust the frequency */ 8920721185SEmil Goode 90*65f0f686SMauro Carvalho Chehab if (tuner_ops->set_params) { 91*65f0f686SMauro Carvalho Chehab err = tuner_ops->set_params(fe); 92*65f0f686SMauro Carvalho Chehab c->frequency = freq; 938f73b481SEmil Goode if (err < 0) { 949a0bf528SMauro Carvalho Chehab printk("%s: Invalid parameter\n", __func__); 959a0bf528SMauro Carvalho Chehab return err; 969a0bf528SMauro Carvalho Chehab } 979a0bf528SMauro Carvalho Chehab } 989a0bf528SMauro Carvalho Chehab return 0; 999a0bf528SMauro Carvalho Chehab } 100