diff -Naurp v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dst.c v4l-dvb/linux/drivers/media/dvb/bt8xx/dst.c --- v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dst.c 2006-08-02 00:12:33.000000000 +0400 +++ v4l-dvb/linux/drivers/media/dvb/bt8xx/dst.c 2006-08-02 08:41:18.000000000 +0400 @@ -1729,6 +1729,7 @@ static struct dvb_frontend_ops dst_atsc_ struct dst_state *dst_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter) { + /* check if the ASIC is there */ if (dst_probe(state) < 0) { kfree(state); @@ -1756,12 +1757,7 @@ struct dst_state *dst_attach(struct dst_ } 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) */ + return state; } EXPORT_SYMBOL(dst_attach); diff -Naurp v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dst_ca.c v4l-dvb/linux/drivers/media/dvb/bt8xx/dst_ca.c --- v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dst_ca.c 2006-08-02 00:12:33.000000000 +0400 +++ v4l-dvb/linux/drivers/media/dvb/bt8xx/dst_ca.c 2006-08-02 08:41:22.000000000 +0400 @@ -756,7 +756,10 @@ static int dst_ca_open(struct inode *ino static int dst_ca_release(struct inode *inode, struct file *file) { + struct dst_state *state = file->private_data; + dprintk(verbose, DST_CA_DEBUG, 1, " Device closed."); + dvb_unregister_device(state->dst_ca); module_put(THIS_MODULE); return 0; @@ -795,11 +798,13 @@ static struct dvb_device dvbdev_ca = { .fops = &dst_ca_fops }; -void dst_ca_attach(struct dst_state *dst, struct dvb_adapter *dvb_adapter) +int 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, &dst->dst_ca, &dvbdev_ca, dst, DVB_DEVICE_CA)) + return -1; + else + return 0; } EXPORT_SYMBOL(dst_ca_attach); diff -Naurp v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dst_common.h v4l-dvb/linux/drivers/media/dvb/bt8xx/dst_common.h --- v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dst_common.h 2006-08-02 00:12:33.000000000 +0400 +++ v4l-dvb/linux/drivers/media/dvb/bt8xx/dst_common.h 2006-08-02 08:41:25.000000000 +0400 @@ -147,6 +147,7 @@ struct dst_state { struct semaphore dst_mutex; #endif u8 fw_name[8]; + struct dvb_device *dst_ca; }; struct tuner_types { @@ -184,8 +185,8 @@ int dst_comm_init(struct dst_state* stat 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 dst_state *dst_attach(struct dst_state* state, struct dvb_adapter *dvb_adapter); +int 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 -Naurp v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c v4l-dvb/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c --- v4l-dvb.orig/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c 2006-08-02 00:12:33.000000000 +0400 +++ v4l-dvb/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c 2006-08-02 08:41:31.000000000 +0400 @@ -670,6 +670,7 @@ static void frontend_init(struct dvb_bt8 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) { @@ -677,6 +678,11 @@ static void frontend_init(struct dvb_bt8 break; } card->fe = &state->frontend; + if (state->dst_hw_cap & DST_TYPE_HAS_CA) { + dvb_attach(dst_ca_attach, state, &card->dvb_adapter); + if (state->dst_ca == NULL) + dprintk("%s: dst_ca_attach: failed\n", __func__); + } break; case BTTV_BOARD_PINNACLESAT: