From 2a6ce103af688918863469a23157ac79d2159ab1 Mon Sep 17 00:00:00 2001 From: Manu Abraham Date: Tue, 8 Aug 2006 15:48:08 -0300 Subject: [PATCH] --- yaml --- r: 37366 b: refs/heads/master c: bbdd11fa957913d6648cabbca59be1da479180ed h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/media/dvb/bt8xx/dst.c | 14 +++++++++----- trunk/drivers/media/dvb/bt8xx/dst_ca.c | 10 ++++++++-- trunk/drivers/media/dvb/bt8xx/dst_common.h | 3 ++- trunk/drivers/media/dvb/bt8xx/dvb-bt8xx.c | 6 +++++- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 52bf02c9bfc3..221caba75cee 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e4a49d76ca4e2c0b2b4c89d59d43486d781ffe95 +refs/heads/master: bbdd11fa957913d6648cabbca59be1da479180ed diff --git a/trunk/drivers/media/dvb/bt8xx/dst.c b/trunk/drivers/media/dvb/bt8xx/dst.c index 52b6fb2455f9..9f72b7000c08 100644 --- a/trunk/drivers/media/dvb/bt8xx/dst.c +++ b/trunk/drivers/media/dvb/bt8xx/dst.c @@ -1715,6 +1715,15 @@ static int dst_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_paramet static void dst_release(struct dvb_frontend *fe) { struct dst_state *state = fe->demodulator_priv; + if (state->dst_ca) { + dvb_unregister_device(state->dst_ca); +#ifdef CONFIG_DVB_CORE_ATTACH + symbol_put(dst_ca_attach); +#endif + } +#ifdef CONFIG_DVB_CORE_ATTACH + symbol_put(dst_attach); +#endif kfree(state); } @@ -1752,11 +1761,6 @@ struct dst_state *dst_attach(struct dst_state *state, struct dvb_adapter *dvb_ad } state->frontend.demodulator_priv = state; - /* Attach other DST peripherals if any */ - /* Conditional Access device */ - if (state->dst_hw_cap & DST_TYPE_HAS_CA) - dst_ca_attach(state, dvb_adapter); - return state; /* Manu (DST is a card not a frontend) */ } diff --git a/trunk/drivers/media/dvb/bt8xx/dst_ca.c b/trunk/drivers/media/dvb/bt8xx/dst_ca.c index df0f68fbf24b..240ad084fa78 100644 --- a/trunk/drivers/media/dvb/bt8xx/dst_ca.c +++ b/trunk/drivers/media/dvb/bt8xx/dst_ca.c @@ -699,11 +699,17 @@ static struct dvb_device dvbdev_ca = { .fops = &dst_ca_fops }; -void dst_ca_attach(struct dst_state *dst, struct dvb_adapter *dvb_adapter) +struct dvb_device *dst_ca_attach(struct dst_state *dst, struct dvb_adapter *dvb_adapter) { struct dvb_device *dvbdev; + dprintk(verbose, DST_CA_ERROR, 1, "registering DST-CA device"); - dvb_register_device(dvb_adapter, &dvbdev, &dvbdev_ca, dst, DVB_DEVICE_CA); + if (dvb_register_device(dvb_adapter, &dvbdev, &dvbdev_ca, dst, DVB_DEVICE_CA) == 0) { + dst->dst_ca = dvbdev; + return dst->dst_ca; + } + + return NULL; } EXPORT_SYMBOL(dst_ca_attach); diff --git a/trunk/drivers/media/dvb/bt8xx/dst_common.h b/trunk/drivers/media/dvb/bt8xx/dst_common.h index 66bc082824ad..3bf084f2e522 100644 --- a/trunk/drivers/media/dvb/bt8xx/dst_common.h +++ b/trunk/drivers/media/dvb/bt8xx/dst_common.h @@ -140,6 +140,7 @@ struct dst_state { char *tuner_name; struct mutex dst_mutex; u8 fw_name[8]; + struct dvb_device *dst_ca; }; struct tuner_types { @@ -178,7 +179,7 @@ int write_dst(struct dst_state *state, u8 * data, u8 len); int read_dst(struct dst_state *state, u8 * ret, u8 len); u8 dst_check_sum(u8 * buf, u32 len); struct dst_state* dst_attach(struct dst_state* state, struct dvb_adapter *dvb_adapter); -void dst_ca_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter); +struct dvb_device *dst_ca_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter); int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int delay); int dst_command(struct dst_state* state, u8 * data, u8 len); diff --git a/trunk/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/trunk/drivers/media/dvb/bt8xx/dvb-bt8xx.c index a19991f7af47..fb6c4cc8477d 100644 --- a/trunk/drivers/media/dvb/bt8xx/dvb-bt8xx.c +++ b/trunk/drivers/media/dvb/bt8xx/dvb-bt8xx.c @@ -669,13 +669,17 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) state->config = &dst_config; state->i2c = card->i2c_adapter; state->bt = card->bt; - + state->dst_ca = NULL; /* DST is not a frontend, attaching the ASIC */ if (dvb_attach(dst_attach, state, &card->dvb_adapter) == NULL) { printk("%s: Could not find a Twinhan DST.\n", __FUNCTION__); break; } + /* Attach other DST peripherals if any */ + /* Conditional Access device */ card->fe = &state->frontend; + if (state->dst_hw_cap & DST_TYPE_HAS_CA) + dvb_attach(dst_ca_attach, state, &card->dvb_adapter); break; case BTTV_BOARD_PINNACLESAT: