Em Tue, 26 Nov 2019 12:31:57 -0300 "Daniel W. S. Almeida" <dwlsalmeida@xxxxxxxxx> escreveu: > From: "Daniel W. S. Almeida" <dwlsalmeida@xxxxxxxxx> > > Before using the DTV frontend core, a bridge driver should register the > new frontend at the subsystem and unregister it at device detach / removal. This patch is conceptually wrong. The dummy_dvb_fe is a frontend driver. As such, it doesn't register itself as a bridge. What we need here is a separate virtual DVB bridge driver with would register itself as a DVB adapter and use the dummy_dvb_fe as its frontend. Regards, Mauro > > Signed-off-by: Daniel W. S. Almeida <dwlsalmeida@xxxxxxxxx> > --- > drivers/media/dvb-frontends/dvb_dummy_fe.c | 39 ++++++++++++++++++++-- > 1 file changed, 37 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/dvb-frontends/dvb_dummy_fe.c b/drivers/media/dvb-frontends/dvb_dummy_fe.c > index 4db679cb70ad..1ccb58c67e8e 100644 > --- a/drivers/media/dvb-frontends/dvb_dummy_fe.c > +++ b/drivers/media/dvb-frontends/dvb_dummy_fe.c > @@ -13,12 +13,12 @@ > #include <media/dvb_frontend.h> > #include "dvb_dummy_fe.h" > > +DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); > > struct dvb_dummy_fe_state { > struct dvb_frontend frontend; > }; > > - > static int dvb_dummy_fe_read_status(struct dvb_frontend *fe, > enum fe_status *status) > { > @@ -84,7 +84,36 @@ static int dvb_dummy_fe_sleep(struct dvb_frontend* fe) > > static int dvb_dummy_fe_init(struct dvb_frontend* fe) > { > - return 0; > + int result = 0; > + struct dvb_adapter *adapter = fe->dvb; > + > + result = dvb_register_adapter(adapter, > + KBUILD_MODNAME, > + THIS_MODULE, > + adapter->device, > + adapter_nr); > + > + if (!result) { > + pr_err("DVB_DUMMY_FE: Failed to register the adapter, errno:%d", > + result); > + goto err; > + } > + > + result = dvb_register_frontend(adapter, fe); > + if (!result) { > + pr_err("DVB_DUMMY_FE: Failed to register the frontend, errno:%d", > + result); > + goto err; > + } > + > + return result; > + > +err: > + dvb_unregister_adapter(adapter); > + dvb_unregister_frontend(fe); > + dvb_frontend_detach(fe); > + return result; > + > } > > static int dvb_dummy_fe_set_tone(struct dvb_frontend *fe, > @@ -102,6 +131,12 @@ static int dvb_dummy_fe_set_voltage(struct dvb_frontend *fe, > static void dvb_dummy_fe_release(struct dvb_frontend* fe) > { > struct dvb_dummy_fe_state* state = fe->demodulator_priv; > + struct dvb_adapter *adapter = fe->dvb; > + > + dvb_unregister_adapter(adapter); > + dvb_unregister_frontend(fe); > + dvb_frontend_detach(fe); > + > kfree(state); > } > Cheers, Mauro