From 40cddef24b54baaee1cec2f284cf085b991a690d Mon Sep 17 00:00:00 2001 From: "min.yang" Date: Fri, 11 Nov 2022 14:11:30 +0800 Subject: [PATCH] dvb-core: add common dvb adapter [1/2] PD#SWPL-100942 Problem: should separate adapter from dvb-extern Solution: add adapter in dvb-core module Verify: verified by T + ohm Change-Id: I305329f8d97d1a6429f2bb6600b2129ac149d90d Signed-off-by: min.yang --- drivers/media/dvb-core/dvb_frontend.c | 36 +++++++++++++++++++++++++++ include/media/dvb_frontend.h | 11 ++++++++ 2 files changed, 47 insertions(+) diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index 35b657c727bc..85c5f2bcd5fc 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -234,6 +234,42 @@ static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system) } } +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +static struct dvb_adapter frontend_adapter; +static int ref_count; +DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); +struct dvb_adapter *aml_dvb_get_adapter(struct device *dev) +{ + mutex_lock(&frontend_mutex); + if (!ref_count) { + pr_err("%s need register adapter first.\n", __func__); + dvb_register_adapter(&frontend_adapter, "amlogic-dvb", THIS_MODULE, + dev, adapter_nr); + } + ref_count++; + mutex_unlock(&frontend_mutex); + return &frontend_adapter; +} +EXPORT_SYMBOL(aml_dvb_get_adapter); + +int aml_dvb_put_adapter(struct dvb_adapter *adapter) +{ + mutex_lock(&frontend_mutex); + + if (ref_count > 0) + ref_count--; + + if (!ref_count && adapter == &frontend_adapter) { + pr_err("%s dvb unregister adapter.\n", __func__); + dvb_unregister_adapter(&frontend_adapter); + } + + mutex_unlock(&frontend_mutex); + return 0; +} +EXPORT_SYMBOL(aml_dvb_put_adapter); +#endif + #ifdef CONFIG_AMLOGIC_DVB_COMPAT void dvb_frontend_add_event(struct dvb_frontend *fe, enum fe_status status) diff --git a/include/media/dvb_frontend.h b/include/media/dvb_frontend.h index 47379e0dcfeb..0e551c31edd4 100644 --- a/include/media/dvb_frontend.h +++ b/include/media/dvb_frontend.h @@ -844,5 +844,16 @@ void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec); * dvb_frontend_add_event() - add event for the dvb frontend */ void dvb_frontend_add_event(struct dvb_frontend *fe, enum fe_status status); + +/** + * aml_dvb_get_adapter() - offer a common dvb adapter for demod, demux and CI + */ +struct dvb_adapter *aml_dvb_get_adapter(struct device *dev); +/** + * aml_dvb_put_adapter() - when call this function, ref count will -1, + * if ref count is 0, adapter would be unregistered. + */ +int aml_dvb_put_adapter(struct dvb_adapter *adapter); + #endif #endif