18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci	STB6100 Silicon Tuner
48c2ecf20Sopenharmony_ci	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci	Copyright (C) ST Microelectronics
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci*/
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/dvb/frontend.h>
118c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_cistatic int stb6100_get_frequency(struct dvb_frontend *fe, u32 *frequency)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	struct dvb_frontend_ops	*frontend_ops = &fe->ops;
168c2ecf20Sopenharmony_ci	struct dvb_tuner_ops	*tuner_ops = &frontend_ops->tuner_ops;
178c2ecf20Sopenharmony_ci	int err = 0;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	if (tuner_ops->get_frequency) {
208c2ecf20Sopenharmony_ci		err = tuner_ops->get_frequency(fe, frequency);
218c2ecf20Sopenharmony_ci		if (err < 0) {
228c2ecf20Sopenharmony_ci			printk("%s: Invalid parameter\n", __func__);
238c2ecf20Sopenharmony_ci			return err;
248c2ecf20Sopenharmony_ci		}
258c2ecf20Sopenharmony_ci	}
268c2ecf20Sopenharmony_ci	return 0;
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistatic int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency)
308c2ecf20Sopenharmony_ci{
318c2ecf20Sopenharmony_ci	struct dvb_frontend_ops	*frontend_ops = &fe->ops;
328c2ecf20Sopenharmony_ci	struct dvb_tuner_ops	*tuner_ops = &frontend_ops->tuner_ops;
338c2ecf20Sopenharmony_ci	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
348c2ecf20Sopenharmony_ci	u32 bw = c->bandwidth_hz;
358c2ecf20Sopenharmony_ci	int err = 0;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	c->frequency = frequency;
388c2ecf20Sopenharmony_ci	c->bandwidth_hz = 0;		/* Don't adjust the bandwidth */
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	if (tuner_ops->set_params) {
418c2ecf20Sopenharmony_ci		err = tuner_ops->set_params(fe);
428c2ecf20Sopenharmony_ci		c->bandwidth_hz = bw;
438c2ecf20Sopenharmony_ci		if (err < 0) {
448c2ecf20Sopenharmony_ci			printk("%s: Invalid parameter\n", __func__);
458c2ecf20Sopenharmony_ci			return err;
468c2ecf20Sopenharmony_ci		}
478c2ecf20Sopenharmony_ci	}
488c2ecf20Sopenharmony_ci	return 0;
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic int stb6100_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	struct dvb_frontend_ops	*frontend_ops = &fe->ops;
548c2ecf20Sopenharmony_ci	struct dvb_tuner_ops	*tuner_ops = &frontend_ops->tuner_ops;
558c2ecf20Sopenharmony_ci	int err = 0;
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	if (tuner_ops->get_bandwidth) {
588c2ecf20Sopenharmony_ci		err = tuner_ops->get_bandwidth(fe, bandwidth);
598c2ecf20Sopenharmony_ci		if (err < 0) {
608c2ecf20Sopenharmony_ci			printk("%s: Invalid parameter\n", __func__);
618c2ecf20Sopenharmony_ci			return err;
628c2ecf20Sopenharmony_ci		}
638c2ecf20Sopenharmony_ci	}
648c2ecf20Sopenharmony_ci	return 0;
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistatic int stb6100_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth)
688c2ecf20Sopenharmony_ci{
698c2ecf20Sopenharmony_ci	struct dvb_frontend_ops	*frontend_ops = &fe->ops;
708c2ecf20Sopenharmony_ci	struct dvb_tuner_ops	*tuner_ops = &frontend_ops->tuner_ops;
718c2ecf20Sopenharmony_ci	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
728c2ecf20Sopenharmony_ci	u32 freq = c->frequency;
738c2ecf20Sopenharmony_ci	int err = 0;
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	c->bandwidth_hz = bandwidth;
768c2ecf20Sopenharmony_ci	c->frequency = 0;		/* Don't adjust the frequency */
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci	if (tuner_ops->set_params) {
798c2ecf20Sopenharmony_ci		err = tuner_ops->set_params(fe);
808c2ecf20Sopenharmony_ci		c->frequency = freq;
818c2ecf20Sopenharmony_ci		if (err < 0) {
828c2ecf20Sopenharmony_ci			printk("%s: Invalid parameter\n", __func__);
838c2ecf20Sopenharmony_ci			return err;
848c2ecf20Sopenharmony_ci		}
858c2ecf20Sopenharmony_ci	}
868c2ecf20Sopenharmony_ci	return 0;
878c2ecf20Sopenharmony_ci}
88