1*74ba9207SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
29a0bf528SMauro Carvalho Chehab /*
39a0bf528SMauro Carvalho Chehab STB6100 Silicon Tuner wrapper
49a0bf528SMauro Carvalho Chehab Copyright (C)2009 Igor M. Liplianin (liplianin@me.by)
59a0bf528SMauro Carvalho Chehab
69a0bf528SMauro Carvalho Chehab */
79a0bf528SMauro Carvalho Chehab
865f0f686SMauro Carvalho Chehab #include <linux/dvb/frontend.h>
9fada1935SMauro Carvalho Chehab #include <media/dvb_frontend.h>
1065f0f686SMauro Carvalho Chehab
stb6100_get_freq(struct dvb_frontend * fe,u32 * frequency)119a0bf528SMauro Carvalho Chehab static int stb6100_get_freq(struct dvb_frontend *fe, u32 *frequency)
129a0bf528SMauro Carvalho Chehab {
1320721185SEmil Goode struct dvb_frontend_ops *frontend_ops = &fe->ops;
1420721185SEmil Goode struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
159a0bf528SMauro Carvalho Chehab int err = 0;
169a0bf528SMauro Carvalho Chehab
1765f0f686SMauro Carvalho Chehab if (tuner_ops->get_frequency) {
189a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
199a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 1);
209a0bf528SMauro Carvalho Chehab
2165f0f686SMauro Carvalho Chehab err = tuner_ops->get_frequency(fe, frequency);
229a0bf528SMauro Carvalho Chehab if (err < 0) {
2365f0f686SMauro Carvalho Chehab printk("%s: Invalid parameter\n", __func__);
249a0bf528SMauro Carvalho Chehab return err;
259a0bf528SMauro Carvalho Chehab }
269a0bf528SMauro Carvalho Chehab
279a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
289a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 0);
299a0bf528SMauro Carvalho Chehab }
309a0bf528SMauro Carvalho Chehab
319a0bf528SMauro Carvalho Chehab return 0;
329a0bf528SMauro Carvalho Chehab }
339a0bf528SMauro Carvalho Chehab
stb6100_set_freq(struct dvb_frontend * fe,u32 frequency)349a0bf528SMauro Carvalho Chehab static int stb6100_set_freq(struct dvb_frontend *fe, u32 frequency)
359a0bf528SMauro Carvalho Chehab {
3620721185SEmil Goode struct dvb_frontend_ops *frontend_ops = &fe->ops;
3720721185SEmil Goode struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
3865f0f686SMauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache;
3965f0f686SMauro Carvalho Chehab u32 bw = c->bandwidth_hz;
409a0bf528SMauro Carvalho Chehab int err = 0;
419a0bf528SMauro Carvalho Chehab
4265f0f686SMauro Carvalho Chehab c->frequency = frequency;
4365f0f686SMauro Carvalho Chehab c->bandwidth_hz = 0; /* Don't adjust the bandwidth */
4420721185SEmil Goode
4565f0f686SMauro Carvalho Chehab if (tuner_ops->set_params) {
469a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
479a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 1);
489a0bf528SMauro Carvalho Chehab
4965f0f686SMauro Carvalho Chehab err = tuner_ops->set_params(fe);
5065f0f686SMauro Carvalho Chehab c->bandwidth_hz = bw;
519a0bf528SMauro Carvalho Chehab if (err < 0) {
5265f0f686SMauro Carvalho Chehab printk("%s: Invalid parameter\n", __func__);
539a0bf528SMauro Carvalho Chehab return err;
549a0bf528SMauro Carvalho Chehab }
559a0bf528SMauro Carvalho Chehab
569a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
579a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 0);
589a0bf528SMauro Carvalho Chehab
599a0bf528SMauro Carvalho Chehab }
609a0bf528SMauro Carvalho Chehab
619a0bf528SMauro Carvalho Chehab return 0;
629a0bf528SMauro Carvalho Chehab }
639a0bf528SMauro Carvalho Chehab
stb6100_get_bandw(struct dvb_frontend * fe,u32 * bandwidth)649a0bf528SMauro Carvalho Chehab static int stb6100_get_bandw(struct dvb_frontend *fe, u32 *bandwidth)
659a0bf528SMauro Carvalho Chehab {
6620721185SEmil Goode struct dvb_frontend_ops *frontend_ops = &fe->ops;
6720721185SEmil Goode struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
689a0bf528SMauro Carvalho Chehab int err = 0;
699a0bf528SMauro Carvalho Chehab
7065f0f686SMauro Carvalho Chehab if (tuner_ops->get_bandwidth) {
719a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
729a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 1);
739a0bf528SMauro Carvalho Chehab
7465f0f686SMauro Carvalho Chehab err = tuner_ops->get_bandwidth(fe, bandwidth);
759a0bf528SMauro Carvalho Chehab if (err < 0) {
769a0bf528SMauro Carvalho Chehab printk(KERN_ERR "%s: Invalid parameter\n", __func__);
779a0bf528SMauro Carvalho Chehab return err;
789a0bf528SMauro Carvalho Chehab }
799a0bf528SMauro Carvalho Chehab
809a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
819a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 0);
829a0bf528SMauro Carvalho Chehab }
839a0bf528SMauro Carvalho Chehab
849a0bf528SMauro Carvalho Chehab return 0;
859a0bf528SMauro Carvalho Chehab }
869a0bf528SMauro Carvalho Chehab
stb6100_set_bandw(struct dvb_frontend * fe,u32 bandwidth)879a0bf528SMauro Carvalho Chehab static int stb6100_set_bandw(struct dvb_frontend *fe, u32 bandwidth)
889a0bf528SMauro Carvalho Chehab {
8920721185SEmil Goode struct dvb_frontend_ops *frontend_ops = &fe->ops;
9020721185SEmil Goode struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
9165f0f686SMauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache;
9265f0f686SMauro Carvalho Chehab u32 freq = c->frequency;
939a0bf528SMauro Carvalho Chehab int err = 0;
949a0bf528SMauro Carvalho Chehab
9565f0f686SMauro Carvalho Chehab c->bandwidth_hz = bandwidth;
9665f0f686SMauro Carvalho Chehab c->frequency = 0; /* Don't adjust the frequency */
9720721185SEmil Goode
9865f0f686SMauro Carvalho Chehab if (tuner_ops->set_params) {
999a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
1009a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 1);
1019a0bf528SMauro Carvalho Chehab
10265f0f686SMauro Carvalho Chehab err = tuner_ops->set_params(fe);
10365f0f686SMauro Carvalho Chehab c->frequency = freq;
1049a0bf528SMauro Carvalho Chehab if (err < 0) {
1059a0bf528SMauro Carvalho Chehab printk(KERN_ERR "%s: Invalid parameter\n", __func__);
1069a0bf528SMauro Carvalho Chehab return err;
1079a0bf528SMauro Carvalho Chehab }
1089a0bf528SMauro Carvalho Chehab
1099a0bf528SMauro Carvalho Chehab if (frontend_ops->i2c_gate_ctrl)
1109a0bf528SMauro Carvalho Chehab frontend_ops->i2c_gate_ctrl(fe, 0);
1119a0bf528SMauro Carvalho Chehab
1129a0bf528SMauro Carvalho Chehab }
1139a0bf528SMauro Carvalho Chehab
1149a0bf528SMauro Carvalho Chehab return 0;
1159a0bf528SMauro Carvalho Chehab }
116