mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-16 01:24:08 +08:00
media: vidtv: fix driver unbind/remove
The current remove logic is broken and causes an OOPS. Fix it. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
1f9a704601
commit
63101b7568
@ -472,30 +472,16 @@ static int vidtv_bridge_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
mutex_destroy(&dvb->feed_lock);
|
mutex_destroy(&dvb->feed_lock);
|
||||||
|
|
||||||
for (i = 0; i < NUM_FE; ++i)
|
for (i = 0; i < NUM_FE; ++i) {
|
||||||
dvb->demux.dmx.remove_frontend(&dvb->demux.dmx,
|
dvb_unregister_frontend(dvb->fe[i]);
|
||||||
&dvb->dmx_fe[i]);
|
dvb_module_release(dvb->i2c_client_tuner[i]);
|
||||||
|
dvb_module_release(dvb->i2c_client_demod[i]);
|
||||||
|
}
|
||||||
|
|
||||||
dvb_dmxdev_release(&dvb->dmx_dev);
|
dvb_dmxdev_release(&dvb->dmx_dev);
|
||||||
dvb_dmx_release(&dvb->demux);
|
dvb_dmx_release(&dvb->demux);
|
||||||
|
|
||||||
for (i = 0; i < NUM_FE; ++i) {
|
|
||||||
dvb_unregister_frontend(dvb->fe[i]);
|
|
||||||
dvb_frontend_detach(dvb->fe[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
dvb_unregister_adapter(&dvb->adapter);
|
dvb_unregister_adapter(&dvb->adapter);
|
||||||
|
|
||||||
for (i = 0; i < NUM_FE; i++)
|
|
||||||
dvb_module_release(dvb->i2c_client_tuner[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_FE ; i++)
|
|
||||||
dvb_module_release(dvb->i2c_client_demod[i]);
|
|
||||||
|
|
||||||
dvb_unregister_adapter(&dvb->adapter);
|
|
||||||
|
|
||||||
i2c_del_adapter(&dvb->i2c_adapter);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,8 +416,6 @@ static int vidtv_demod_i2c_remove(struct i2c_client *client)
|
|||||||
{
|
{
|
||||||
struct vidtv_demod_state *state = i2c_get_clientdata(client);
|
struct vidtv_demod_state *state = i2c_get_clientdata(client);
|
||||||
|
|
||||||
memset(&state->frontend.ops, 0, sizeof(struct dvb_frontend_ops));
|
|
||||||
state->frontend.demodulator_priv = NULL;
|
|
||||||
kfree(state);
|
kfree(state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -402,10 +402,7 @@ static int vidtv_tuner_i2c_probe(struct i2c_client *client,
|
|||||||
static int vidtv_tuner_i2c_remove(struct i2c_client *client)
|
static int vidtv_tuner_i2c_remove(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
struct vidtv_tuner_dev *tuner_dev = i2c_get_clientdata(client);
|
struct vidtv_tuner_dev *tuner_dev = i2c_get_clientdata(client);
|
||||||
struct dvb_frontend *fe = tuner_dev->fe;
|
|
||||||
|
|
||||||
memset(&fe->ops.tuner_ops, 0, sizeof(struct dvb_tuner_ops));
|
|
||||||
fe->tuner_priv = NULL;
|
|
||||||
kfree(tuner_dev);
|
kfree(tuner_dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user