David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 2 | /* |
| 3 | STB6100 Silicon Tuner |
| 4 | Copyright (C) Manu Abraham (abraham.manu@gmail.com) |
| 5 | |
| 6 | Copyright (C) ST Microelectronics |
| 7 | |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 8 | */ |
| 9 | |
| 10 | #include <linux/dvb/frontend.h> |
| 11 | #include <media/dvb_frontend.h> |
| 12 | |
| 13 | static int stb6100_get_frequency(struct dvb_frontend *fe, u32 *frequency) |
| 14 | { |
| 15 | struct dvb_frontend_ops *frontend_ops = &fe->ops; |
| 16 | struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; |
| 17 | int err = 0; |
| 18 | |
| 19 | if (tuner_ops->get_frequency) { |
| 20 | err = tuner_ops->get_frequency(fe, frequency); |
| 21 | if (err < 0) { |
| 22 | printk("%s: Invalid parameter\n", __func__); |
| 23 | return err; |
| 24 | } |
| 25 | } |
| 26 | return 0; |
| 27 | } |
| 28 | |
| 29 | static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency) |
| 30 | { |
| 31 | struct dvb_frontend_ops *frontend_ops = &fe->ops; |
| 32 | struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; |
| 33 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
| 34 | u32 bw = c->bandwidth_hz; |
| 35 | int err = 0; |
| 36 | |
| 37 | c->frequency = frequency; |
| 38 | c->bandwidth_hz = 0; /* Don't adjust the bandwidth */ |
| 39 | |
| 40 | if (tuner_ops->set_params) { |
| 41 | err = tuner_ops->set_params(fe); |
| 42 | c->bandwidth_hz = bw; |
| 43 | if (err < 0) { |
| 44 | printk("%s: Invalid parameter\n", __func__); |
| 45 | return err; |
| 46 | } |
| 47 | } |
| 48 | return 0; |
| 49 | } |
| 50 | |
| 51 | static int stb6100_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) |
| 52 | { |
| 53 | struct dvb_frontend_ops *frontend_ops = &fe->ops; |
| 54 | struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; |
| 55 | int err = 0; |
| 56 | |
| 57 | if (tuner_ops->get_bandwidth) { |
| 58 | err = tuner_ops->get_bandwidth(fe, bandwidth); |
| 59 | if (err < 0) { |
| 60 | printk("%s: Invalid parameter\n", __func__); |
| 61 | return err; |
| 62 | } |
| 63 | } |
| 64 | return 0; |
| 65 | } |
| 66 | |
| 67 | static int stb6100_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth) |
| 68 | { |
| 69 | struct dvb_frontend_ops *frontend_ops = &fe->ops; |
| 70 | struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops; |
| 71 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
| 72 | u32 freq = c->frequency; |
| 73 | int err = 0; |
| 74 | |
| 75 | c->bandwidth_hz = bandwidth; |
| 76 | c->frequency = 0; /* Don't adjust the frequency */ |
| 77 | |
| 78 | if (tuner_ops->set_params) { |
| 79 | err = tuner_ops->set_params(fe); |
| 80 | c->frequency = freq; |
| 81 | if (err < 0) { |
| 82 | printk("%s: Invalid parameter\n", __func__); |
| 83 | return err; |
| 84 | } |
| 85 | } |
| 86 | return 0; |
| 87 | } |