diff --git a/drivers/media/video/pvrusb2/pvrusb2-dvb.c b/drivers/media/video/pvrusb2/pvrusb2-dvb.c index 1772400516740d27bb80469b868cccd314e2000b..1a7c3ddace07b8c7bc372213ff996d2bd0f9f3ba 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-dvb.c +++ b/drivers/media/video/pvrusb2/pvrusb2-dvb.c @@ -381,12 +381,13 @@ static int pvr2_dvb_frontend_exit(struct pvr2_dvb_adapter *adap) return 0; } -static void pvr2_dvb_done(struct pvr2_dvb_adapter *adap) +static void pvr2_dvb_destroy(struct pvr2_dvb_adapter *adap) { pvr2_dvb_stream_end(adap); pvr2_dvb_frontend_exit(adap); pvr2_dvb_adapter_exit(adap); pvr2_channel_done(&adap->channel); + kfree(adap); } static void pvr2_dvb_internal_check(struct pvr2_channel *chp) @@ -394,10 +395,10 @@ static void pvr2_dvb_internal_check(struct pvr2_channel *chp) struct pvr2_dvb_adapter *adap; adap = container_of(chp, struct pvr2_dvb_adapter, channel); if (!adap->channel.mc_head->disconnect_flag) return; - pvr2_dvb_done(adap); + pvr2_dvb_destroy(adap); } -int pvr2_dvb_init(struct pvr2_context *pvr) +struct pvr2_dvb_adapter *pvr2_dvb_create(struct pvr2_context *pvr) { int ret = 0; struct pvr2_dvb_adapter *adap; @@ -406,21 +407,22 @@ int pvr2_dvb_init(struct pvr2_context *pvr) the DVB side of the driver either. For now. */ return 0; } - adap = &pvr->hdw->dvb; + adap = kzalloc(sizeof(*adap), GFP_KERNEL); + if (!adap) return adap; pvr2_channel_init(&adap->channel, pvr); adap->channel.check_func = pvr2_dvb_internal_check; init_waitqueue_head(&adap->buffer_wait_data); - mutex_init(&pvr->hdw->dvb.lock); - ret = pvr2_dvb_adapter_init(&pvr->hdw->dvb); + mutex_init(&adap->lock); + ret = pvr2_dvb_adapter_init(adap); if (ret < 0) goto fail1; - ret = pvr2_dvb_frontend_init(&pvr->hdw->dvb); + ret = pvr2_dvb_frontend_init(adap); if (ret < 0) goto fail2; - return 0; + return adap; fail2: pvr2_dvb_adapter_exit(adap); fail1: pvr2_channel_done(&adap->channel); - return ret; + return NULL; } diff --git a/drivers/media/video/pvrusb2/pvrusb2-dvb.h b/drivers/media/video/pvrusb2/pvrusb2-dvb.h index e37cb7bc2fc6bc962963ca64950f339fbac326b3..884ff916a352cce11c0e7e48e9afdb1f1fbb942b 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-dvb.h +++ b/drivers/media/video/pvrusb2/pvrusb2-dvb.h @@ -36,6 +36,6 @@ struct pvr2_dvb_props { int (*tuner_attach) (struct pvr2_dvb_adapter *); }; -int pvr2_dvb_init(struct pvr2_context *pvr); +struct pvr2_dvb_adapter *pvr2_dvb_create(struct pvr2_context *pvr); #endif /* __PVRUSB2_DVB_H__ */ diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h index 6fe0a882209f2dcbf06e9280270c10746891bf19..c725495826ceb895c3c9ab914c22a6e664e3ff85 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h @@ -41,7 +41,6 @@ #include "pvrusb2-io.h" #include #include "pvrusb2-devattr.h" -#include "pvrusb2-dvb.h" /* Legal values for PVR2_CID_HSM */ #define PVR2_CVAL_HSM_FAIL 0 @@ -374,8 +373,6 @@ struct pvr2_hdw { struct pvr2_ctrl *controls; unsigned int control_cnt; - - struct pvr2_dvb_adapter dvb; }; /* This function gets the current frequency */ diff --git a/drivers/media/video/pvrusb2/pvrusb2-main.c b/drivers/media/video/pvrusb2/pvrusb2-main.c index 42b4c8d5a1ed7525adb1750cbeffd22051c2e802..54d9f168d7ad5d3faaea36a79ea41c63868f2087 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-main.c +++ b/drivers/media/video/pvrusb2/pvrusb2-main.c @@ -62,7 +62,7 @@ static void pvr_setup_attach(struct pvr2_context *pvr) pvr2_v4l2_create(pvr); #ifdef CONFIG_VIDEO_PVRUSB2_DVB /* Create association with dvb layer */ - pvr2_dvb_init(pvr); + pvr2_dvb_create(pvr); #endif #ifdef CONFIG_VIDEO_PVRUSB2_SYSFS pvr2_sysfs_create(pvr,class_ptr);