This patch provides a clean solution to customise the TwinHan DST modules if
they are not needed.
The basic theoretical work was done by Trent Piepho, the basic testing work was
done by Mauro Chehab.
I only adapted it for the current kernel (2.6.22-rc3) and changed the help
section for better user understanding (i. e. card examples instead of
expressions like ASIC f. ex.).
I do appreciate further SOBs of the relevant Cced people.
Signed-off-by: Uwe Bugla <[EMAIL PROTECTED]>
--- a/drivers/media/dvb/bt8xx/dst.c Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dst.c Mon May 28 19:46:33 2007
@@ -1729,12 +1729,22 @@ static void dst_release(struct dvb_front
static struct dvb_frontend_ops dst_dvbc_ops;
static struct dvb_frontend_ops dst_atsc_ops;
-struct dst_state *dst_attach(struct dst_state *state, struct dvb_adapter
*dvb_adapter)
-{
+struct dvb_frontend *dst_attach(struct dst_config *config, struct bt878 *bt,
+ struct i2c_adapter *i2c)
+{
+struct dst_state *state = kzalloc(sizeof(*state), GFP_KERNEL);
+
+ if (!state) {
+ printk(KERN_ERR "dst: No memory!\n");
+ return NULL;;
+ }
+ state->i2c = i2c;
+ state->config = config;
+ state->bt = bt;
+
/* check if the ASIC is there */
if (dst_probe(state) < 0) {
- kfree(state);
- return NULL;
+ goto fail;
}
/* determine settings based on type */
/* create dvb_frontend */
@@ -1753,12 +1763,15 @@ struct dst_state *dst_attach(struct dst_
break;
default:
dprintk(verbose, DST_ERROR, 1, "unknown DST type. please report
to the LinuxTV.org DVB mailinglist.");
- kfree(state);
- return NULL;
+ goto fail;
}
state->frontend.demodulator_priv = state;
- return state; /* Manu (DST is a card not
a frontend) */
+ return &state->frontend; /* Manu (DST is a card not a frontend) */
+
+ fail:
+ kfree(state);
+ return NULL;
}
EXPORT_SYMBOL(dst_attach);
--- a/drivers/media/dvb/bt8xx/dst_ca.c Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dst_ca.c Mon May 28 19:47:33 2007
@@ -699,8 +699,9 @@ static struct dvb_device dvbdev_ca = {
.fops = &dst_ca_fops
};
-struct dvb_device *dst_ca_attach(struct dst_state *dst, struct dvb_adapter
*dvb_adapter)
-{
+struct dvb_device *dst_ca_attach(struct dvb_frontend *fe, struct dvb_adapter
*dvb_adapter)
+{
+ struct dst_state *dst = fe->demodulator_priv;
struct dvb_device *dvbdev;
dprintk(verbose, DST_CA_ERROR, 1, "registering DST-CA device");
--- a/drivers/media/dvb/bt8xx/dst_common.h Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dst_common.h Mon May 28 19:47:33 2007
@@ -177,11 +177,25 @@ int write_dst(struct dst_state *state, u
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);
-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);
-
-
+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);
+
+#if defined(CONFIG_DVB_DST) || (defined(CONFIG_DVB_DST_MODULE) &&
defined(MODULE))
+struct dvb_frontend *dst_attach(struct dst_config *config, struct bt878 *bt,
+struct i2c_adapter *i2c);
+struct dvb_device *dst_ca_attach(struct dvb_frontend *fe, struct dvb_adapter
*dvb_adapter);
+#else
+static inline struct dvb_frontend *dst_attach(struct dst_config *config,
+ struct bt878 *bt, struct i2c_adapter *i2c)
+{
+ printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
+ return NULL;
+}
+static inline struct dvb_device *dst_ca_attach(struct dvb_frontend *fe,
+ struct dvb_adapter *dvb_adapter)
+{
+ printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
+ return NULL;
+}
+#endif // CONFIG_DVB_DST
#endif // DST_COMMON_H
--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c Mon May 28 19:47:33 2007
@@ -659,26 +659,17 @@ static void frontend_init(struct dvb_bt8
case BTTV_BOARD_TWINHAN_DST:
/* DST is not a frontend driver !!! */
- state = kmalloc(sizeof (struct dst_state), GFP_KERNEL);
- if (!state) {
- printk("dvb_bt8xx: No memory\n");
- break;
- }
- /* Setup the Card */
- 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__);
+ card->fe = dvb_attach(dst_attach, &dst_config, card->bt,
+ card->i2c_adapter);
+ if (card->fe != NULL) {
+ printk(KERN_ERR "%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);
+ dvb_attach(dst_ca_attach, card->fe, &card->dvb_adapter);
break;
case BTTV_BOARD_PINNACLESAT:
--- a/drivers/media/dvb/bt8xx/Makefile Mon Apr 30 12:39:33 2007
+++ b/drivers/media/dvb/bt8xx/Makefile Thu May 28 19:47:00 2007
@@ -1,3 +1,4 @@ obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-b
-obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o dst.o dst_ca.o
+obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o
+obj-$(CONFIG_DVB_DST) += dst.o dst_ca.o
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video/bt8xx
-Idrivers/media/dvb/frontends
--- a/drivers/media/dvb/bt8xx/Kconfig Mon Apr 30 12:39:33 2007
+++ b/drivers/media/dvb/bt8xx/Kconfig Mon May 28 19:47:00 2007
@@ -9,6 +9,7 @@ config DVB_BT8XX
select DVB_LGDT330X if !DVB_FE_CUSTOMISE
select DVB_PLL
select DVB_ZL10353 if !DVB_FE_CUSTOMISE
+ select DVB_DST if !DVB_FE_CUSTOMISE
select FW_LOADER
help
Support for PCI cards based on the Bt8xx PCI bridge. Examples are
@@ -21,3 +22,11 @@ config DVB_BT8XX
an external software decoder to watch TV on your computer.
Say Y if you own such a device and want to use it.
+
+config DVB_DST
+ tristate "Support for TwinHan DST boards (CA) and clones"
+ depends on DVB_BT8XX && DVB_CORE && I2C
+ default m if DVB_FE_CUSTOMISE
+ help
+ Support for the following boards: TwinHan DST or clones, Pinnacle
PCTV Sat CI, Chaintech DST-1000, DNTV Live !
+ Say Y if you own such a device and want to use it.
--
Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten
Browser-Versionen downloaden: http://www.gmx.net/de/go/browser
--- a/drivers/media/dvb/bt8xx/dst.c Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dst.c Mon May 28 19:46:33 2007
@@ -1729,12 +1729,22 @@ static void dst_release(struct dvb_front
static struct dvb_frontend_ops dst_dvbc_ops;
static struct dvb_frontend_ops dst_atsc_ops;
-struct dst_state *dst_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter)
-{
+struct dvb_frontend *dst_attach(struct dst_config *config, struct bt878 *bt,
+ struct i2c_adapter *i2c)
+{
+struct dst_state *state = kzalloc(sizeof(*state), GFP_KERNEL);
+
+ if (!state) {
+ printk(KERN_ERR "dst: No memory!\n");
+ return NULL;;
+ }
+ state->i2c = i2c;
+ state->config = config;
+ state->bt = bt;
+
/* check if the ASIC is there */
if (dst_probe(state) < 0) {
- kfree(state);
- return NULL;
+ goto fail;
}
/* determine settings based on type */
/* create dvb_frontend */
@@ -1753,12 +1763,15 @@ struct dst_state *dst_attach(struct dst_
break;
default:
dprintk(verbose, DST_ERROR, 1, "unknown DST type. please report to the LinuxTV.org DVB mailinglist.");
- kfree(state);
- return NULL;
+ goto fail;
}
state->frontend.demodulator_priv = state;
- return state; /* Manu (DST is a card not a frontend) */
+ return &state->frontend; /* Manu (DST is a card not a frontend) */
+
+ fail:
+ kfree(state);
+ return NULL;
}
EXPORT_SYMBOL(dst_attach);
--- a/drivers/media/dvb/bt8xx/dst_ca.c Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dst_ca.c Mon May 28 19:47:33 2007
@@ -699,8 +699,9 @@ static struct dvb_device dvbdev_ca = {
.fops = &dst_ca_fops
};
-struct dvb_device *dst_ca_attach(struct dst_state *dst, struct dvb_adapter *dvb_adapter)
-{
+struct dvb_device *dst_ca_attach(struct dvb_frontend *fe, struct dvb_adapter *dvb_adapter)
+{
+ struct dst_state *dst = fe->demodulator_priv;
struct dvb_device *dvbdev;
dprintk(verbose, DST_CA_ERROR, 1, "registering DST-CA device");
--- a/drivers/media/dvb/bt8xx/dst_common.h Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dst_common.h Mon May 28 19:47:33 2007
@@ -177,11 +177,25 @@ int write_dst(struct dst_state *state, u
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);
-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);
-
-
+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);
+
+#if defined(CONFIG_DVB_DST) || (defined(CONFIG_DVB_DST_MODULE) && defined(MODULE))
+struct dvb_frontend *dst_attach(struct dst_config *config, struct bt878 *bt,
+struct i2c_adapter *i2c);
+struct dvb_device *dst_ca_attach(struct dvb_frontend *fe, struct dvb_adapter *dvb_adapter);
+#else
+static inline struct dvb_frontend *dst_attach(struct dst_config *config,
+ struct bt878 *bt, struct i2c_adapter *i2c)
+{
+ printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
+ return NULL;
+}
+static inline struct dvb_device *dst_ca_attach(struct dvb_frontend *fe,
+ struct dvb_adapter *dvb_adapter)
+{
+ printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
+ return NULL;
+}
+#endif // CONFIG_DVB_DST
#endif // DST_COMMON_H
--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c Fri Apr 27 12:16:31 2007
+++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c Mon May 28 19:47:33 2007
@@ -659,26 +659,17 @@ static void frontend_init(struct dvb_bt8
case BTTV_BOARD_TWINHAN_DST:
/* DST is not a frontend driver !!! */
- state = kmalloc(sizeof (struct dst_state), GFP_KERNEL);
- if (!state) {
- printk("dvb_bt8xx: No memory\n");
- break;
- }
- /* Setup the Card */
- 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__);
+ card->fe = dvb_attach(dst_attach, &dst_config, card->bt,
+ card->i2c_adapter);
+ if (card->fe != NULL) {
+ printk(KERN_ERR "%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);
+ dvb_attach(dst_ca_attach, card->fe, &card->dvb_adapter);
break;
case BTTV_BOARD_PINNACLESAT:
--- a/drivers/media/dvb/bt8xx/Makefile Mon Apr 30 12:39:33 2007
+++ b/drivers/media/dvb/bt8xx/Makefile Thu May 28 19:47:00 2007
@@ -1,3 +1,4 @@ obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-b
-obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o dst.o dst_ca.o
+obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o
+obj-$(CONFIG_DVB_DST) += dst.o dst_ca.o
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video/bt8xx -Idrivers/media/dvb/frontends
--- a/drivers/media/dvb/bt8xx/Kconfig Mon Apr 30 12:39:33 2007
+++ b/drivers/media/dvb/bt8xx/Kconfig Mon May 28 19:47:00 2007
@@ -9,6 +9,7 @@ config DVB_BT8XX
select DVB_LGDT330X if !DVB_FE_CUSTOMISE
select DVB_PLL
select DVB_ZL10353 if !DVB_FE_CUSTOMISE
+ select DVB_DST if !DVB_FE_CUSTOMISE
select FW_LOADER
help
Support for PCI cards based on the Bt8xx PCI bridge. Examples are
@@ -21,3 +22,11 @@ config DVB_BT8XX
an external software decoder to watch TV on your computer.
Say Y if you own such a device and want to use it.
+
+config DVB_DST
+ tristate "Support for TwinHan DST boards (CA) and clones"
+ depends on DVB_BT8XX && DVB_CORE && I2C
+ default m if DVB_FE_CUSTOMISE
+ help
+ Support for the following boards: TwinHan DST or clones, Pinnacle PCTV Sat CI, Chaintech DST-1000, DNTV Live !
+ Say Y if you own such a device and want to use it.
_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb