Commit b32a2b42 authored by Daniel Scheller's avatar Daniel Scheller Committed by Mauro Carvalho Chehab

media: ddbridge: improve error handling logic on fe attach failures

This change makes sure that demod frontends are always detached whenever
a tuner frontend attach failed. Achieve this by moving the detach-on-
failure logic at the end of dvb_input_attach(), and adding a goto to this
block on every tuner attach failure case, so if an error occurs, there are
no stray attached frontends left. As a side effect, this removes some
duplicated code.
Signed-off-by: default avatarDaniel Scheller <d.scheller@gmx.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 6738d3bb
......@@ -1449,48 +1449,43 @@ static int dvb_input_attach(struct ddb_input *input)
if (demod_attach_stv0900(input, 0) < 0)
return -ENODEV;
if (tuner_attach_stv6110(input, 0) < 0)
return -ENODEV;
goto err_tuner;
break;
case DDB_TUNER_DVBS_ST_AA:
if (demod_attach_stv0900(input, 1) < 0)
return -ENODEV;
if (tuner_attach_stv6110(input, 1) < 0)
return -ENODEV;
goto err_tuner;
break;
case DDB_TUNER_DVBS_STV0910:
if (demod_attach_stv0910(input, 0) < 0)
return -ENODEV;
if (tuner_attach_stv6111(input, 0) < 0)
return -ENODEV;
goto err_tuner;
break;
case DDB_TUNER_DVBS_STV0910_PR:
if (demod_attach_stv0910(input, 1) < 0)
return -ENODEV;
if (tuner_attach_stv6111(input, 1) < 0)
return -ENODEV;
goto err_tuner;
break;
case DDB_TUNER_DVBS_STV0910_P:
if (demod_attach_stv0910(input, 0) < 0)
return -ENODEV;
if (tuner_attach_stv6111(input, 1) < 0)
return -ENODEV;
goto err_tuner;
break;
case DDB_TUNER_DVBCT_TR:
if (demod_attach_drxk(input) < 0)
return -ENODEV;
if (tuner_attach_tda18271(input) < 0)
return -ENODEV;
goto err_tuner;
break;
case DDB_TUNER_DVBCT_ST:
if (demod_attach_stv0367(input) < 0)
return -ENODEV;
if (tuner_attach_tda18212(input, port->type) < 0) {
if (dvb->fe2)
dvb_frontend_detach(dvb->fe2);
if (dvb->fe)
dvb_frontend_detach(dvb->fe);
return -ENODEV;
}
if (tuner_attach_tda18212(input, port->type) < 0)
goto err_tuner;
break;
case DDB_TUNER_DVBC2T2I_SONY_P:
if (input->port->dev->link[input->port->lnr].info->ts_quirks &
......@@ -1509,13 +1504,8 @@ static int dvb_input_attach(struct ddb_input *input)
par = 1;
if (demod_attach_cxd28xx(input, par, osc24) < 0)
return -ENODEV;
if (tuner_attach_tda18212(input, port->type) < 0) {
if (dvb->fe2)
dvb_frontend_detach(dvb->fe2);
if (dvb->fe)
dvb_frontend_detach(dvb->fe);
return -ENODEV;
}
if (tuner_attach_tda18212(input, port->type) < 0)
goto err_tuner;
break;
case DDB_TUNER_DVBC2T2I_SONY:
osc24 = 1;
......@@ -1525,13 +1515,8 @@ static int dvb_input_attach(struct ddb_input *input)
case DDB_TUNER_ISDBT_SONY:
if (demod_attach_cxd28xx(input, 0, osc24) < 0)
return -ENODEV;
if (tuner_attach_tda18212(input, port->type) < 0) {
if (dvb->fe2)
dvb_frontend_detach(dvb->fe2);
if (dvb->fe)
dvb_frontend_detach(dvb->fe);
return -ENODEV;
}
if (tuner_attach_tda18212(input, port->type) < 0)
goto err_tuner;
break;
default:
return 0;
......@@ -1554,6 +1539,16 @@ static int dvb_input_attach(struct ddb_input *input)
dvb->attached = 0x31;
return 0;
err_tuner:
dev_warn(port->dev->dev, "tuner attach failed!\n");
if (dvb->fe2)
dvb_frontend_detach(dvb->fe2);
if (dvb->fe)
dvb_frontend_detach(dvb->fe);
return -ENODEV;
}
static int port_has_encti(struct ddb_port *port)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment