Commit 67dfafeb authored by Michael Hunold's avatar Michael Hunold Committed by Linus Torvalds

[PATCH] DVB: frontend conversion #3

- [DVB] dvb_dummy_fe, grundig_29504-401, grundig_29504-491, mt312: convert
  from dvb-i2c to kernel-i2c, MODULE_PARM() to module_param(), dvb_delay() to
  mdelay()

- [DVB] update frontend Kconfig
Signed-off-by: default avatarMichael Hunold <hunold@linuxtv.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ac1a4632
comment "Supported Frontend Modules"
depends on DVB
config DVB_TWINHAN_DST
tristate "TWINHAN DST based DVB-S frontend (QPSK)"
depends on DVB_CORE && DVB_BT8XX
help
Used in such cards as the VP-1020/1030, Twinhan DST,
VVmer TV@SAT. Say Y when you want to support frontends
using this asic.
This module requires the dvb-bt8xx driver and dvb bt878
module.
comment "DVB-S (satellite) frontends"
depends on DVB_CORE
config DVB_STV0299
tristate "STV0299 based DVB-S frontend (QPSK)"
tristate "ST STV0299 based"
depends on DVB_CORE
help
The stv0299 by ST is used in many DVB-S tuner modules,
say Y when you want to support frontends based on this
DVB-S demodulator.
A DVB-S tuner module. Say Y when you want to support this frontend.
Some examples are the Alps BSRU6, the Philips SU1278 and
the LG TDQB-S00x.
......@@ -27,92 +14,83 @@ config DVB_STV0299
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_SP887X
tristate "Frontends with sp887x demodulators, e.g. Microtune DTF7072"
config DVB_CX24110
tristate "Connexant CX24110 based"
depends on DVB_CORE
help
A DVB-T demodulator driver. Say Y when you want to support the sp887x.
A DVB-S tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_SP887X_FIRMWARE_FILE
string "Full pathname of sp887x firmware file"
depends on DVB_SP887X
default "/usr/lib/hotplug/firmware/sc_main.mc"
help
This driver needs a copy of the Avermedia firmware. The version tested
is part of the Avermedia DVB-T 1.3.26.3 Application. This can be downloaded
from the Avermedia web site.
If the software is installed in Windows the file will be in the
/Program Files/AVerTV DVB-T/ directory and is called sc_main.mc.
Alternatively it can "extracted" from the install cab files but this will have
to be done in windows as I don't know of a linux version of extract.exe.
Copy this file to /usr/lib/hotplug/firmware/sc_main.mc.
With this version of the file the first 10 bytes are discarded and the next
0x4000 loaded. This may change in future versions.
config DVB_ALPS_TDLB7
tristate "Alps TDLB7 (OFDM)"
config DVB_GRUNDIG_29504_491
tristate "Grundig 29504-491 based"
depends on DVB_CORE
help
A DVB-T tuner module. Say Y when you want to support this frontend.
This tuner module needs some microcode located in a file called
"Sc_main.mc" in the windows driver. Please pass the module parameter
mcfile="/PATH/FILENAME" when loading alps_tdlb7.o.
A DVB-S tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_ALPS_TDMB7
tristate "Alps TDMB7 (OFDM)"
config DVB_MT312
tristate "Zarlink MT312 based"
depends on DVB_CORE
help
A DVB-T tuner module. Say Y when you want to support this frontend.
A DVB-S tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_ATMEL_AT76C651
tristate "Atmel AT76C651 (QAM)"
config DVB_VES1X93
tristate "VLSI VES1893 or VES1993 based"
depends on DVB_CORE
help
The AT76C651 Demodulator is used in some DVB-C SetTopBoxes. Say Y
when you see this demodulator chip near your tuner module.
A DVB-S tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_CX24110
tristate "Frontends with Connexant CX24110 demodulator (QPSK)"
comment "DVB-T (terrestrial) frontends"
depends on DVB_CORE
config DVB_SP887X
tristate "Microtune sp887x based (i.e. Microtune DTF7072)"
depends on DVB_CORE
help
The CX24110 Demodulator is used in some DVB-S frontends.
Say Y if you want support for this chip in your kernel.
A DVB-T tuner module. Say Y when you want to support this frontend.
This driver needs a copy of the Avermedia firmware. The version tested
is part of the Avermedia DVB-T 1.3.26.3 Application. If the software is
installed in Windoze the file will be in the /Program Files/AVerTV DVB-T/
directory and is called sc_main.mc. Alternatively it can "extracted" from
the install cab files.
Copy this file to '/usr/lib/hotplug/firmware/dvb-fe-sp887x.fw'.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_GRUNDIG_29504_491
tristate "Grundig 29504-491 (QPSK)"
config DVB_ALPS_TDLB7
tristate "Alps TDLB7 based"
depends on DVB_CORE
help
A DVB-S tuner module. Say Y when you want to support this frontend.
A DVB-T tuner module. Say Y when you want to support this frontend.
This driver needs a copy of the firmware file from the Haupauge
Windoze driver. Copy 'Sc_main.mc' to
'/usr/lib/hotplug/firmware/dvb-fe-tdlb7.fw'.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_GRUNDIG_29504_401
tristate "Grundig 29504-401 (OFDM)"
config DVB_ALPS_TDMB7
tristate "Alps TDMB7 based"
depends on DVB_CORE
help
A DVB-T tuner module. Say Y when you want to support this frontend.
......@@ -121,40 +99,38 @@ config DVB_GRUNDIG_29504_401
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_MT312
tristate "Zarlink MT312 Satellite Channel Decoder (QPSK)"
config DVB_GRUNDIG_29504_401
tristate "Grundig 29504-401 based"
depends on DVB_CORE
help
A DVB-S tuner module. Say Y when you want to support this frontend.
A DVB-T tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_VES1820
tristate "Frontends with external VES1820 demodulator (QAM)"
config DVB_TDA1004X
tristate "Philips TDA10045H/TDA10046H based"
depends on DVB_CORE
help
The VES1820 Demodulator is used on many DVB-C PCI cards and in some
DVB-C SetTopBoxes. Say Y when you see this demodulator chip near your
tuner module.
A DVB-T tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_VES1X93
tristate "Frontends with VES1893 or VES1993 demodulator (QPSK)"
config DVB_NXT6000
tristate "NxtWave Communications NXT6000 based"
depends on DVB_CORE
help
A DVB-S tuner module. Say Y when you want to support this frontend.
A DVB-T tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_TDA1004X
tristate "Frontends with external TDA10045H or TDA10046H demodulators (OFDM)"
config DVB_MT352
tristate "Zarlink MT352 based"
depends on DVB_CORE
help
A DVB-T tuner module. Say Y when you want to support this frontend.
......@@ -163,25 +139,36 @@ config DVB_TDA1004X
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_TDA1004X_FIRMWARE_FILE
string "Full pathname of tda1004x.bin firmware file"
depends on DVB_TDA1004X
default "/usr/lib/hotplug/firmware/tda1004x.bin"
comment "DVB-C (cable) frontends"
depends on DVB_CORE
config DVB_ATMEL_AT76C651
tristate "Atmel AT76C651 based"
depends on DVB_CORE
help
The TDA1004X requires additional firmware in order to function.
The firmware file can obtained as follows:
wget http://www.technotrend.de/new/215/TTweb_215a_budget_20_05_2003.zip
unzip -j TTweb_215a_budget_20_05_2003.zip Software/Oem/PCI/App/ttlcdacc.dll
mv ttlcdacc.dll /usr/lib/hotplug/firmware/tda1004x.bin
Note: even if you're using a USB device, you MUST get the file from the
TechnoTrend PCI drivers.
A DVB-C tuner module. Say Y when you want to support this frontend.
config DVB_NXT6000
tristate "Frontends with NxtWave Communications NXT6000 demodulator (OFDM)"
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_VES1820
tristate "VLSI VES1820 based"
depends on DVB_CORE
help
A DVB-T tuner module. Say Y when you want to support this frontend.
A DVB-C tuner module. Say Y when you want to support this frontend.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
comment "Misc. Frontend Modules"
depends on DVB_CORE
config DVB_TWINHAN_DST
tristate "Twinhan DST based DVB-S/-T frontend"
depends on DVB_CORE && DVB_BT8XX
help
Used in such cards as the VP-1020/1030, Twinhan DST,
VVmer TV@SAT. Say Y when you want to support frontends
using this asic.
......@@ -20,12 +20,16 @@
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include "dvb_frontend.h"
static int sct = 0;
#define FRONTEND_NAME "dvbfe_dummy"
static int frontend_type;
module_param(frontend_type, int, 0444);
MODULE_PARM_DESC(frontend_type, "0 == DVB-S, 1 == DVB-C, 2 == DVB-T");
/* depending on module parameter sct deliver different infos
*/
......@@ -87,8 +91,7 @@ static struct dvb_frontend_info dvb_t_dummyfe_info = {
struct dvb_frontend_info *frontend_info(void)
{
switch(sct)
{
switch(frontend_type) {
case 2:
return &dvb_t_dummyfe_info;
case 1:
......@@ -168,30 +171,89 @@ static int dvbdummyfe_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *ar
return 0;
}
static struct i2c_client client_template;
static int dvbdummyfe_attach (struct dvb_i2c_bus *i2c, void **data)
static int dvbdummyfe_attach_adapter(struct i2c_adapter *adapter)
{
return dvb_register_frontend (dvbdummyfe_ioctl, i2c, NULL, frontend_info());
struct dvb_adapter *dvb;
struct i2c_client *client;
int ret;
if ((client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL)) == NULL)
return -ENOMEM;
memcpy(client, &client_template, sizeof(struct i2c_client));
client->adapter = adapter;
if ((ret = i2c_attach_client(client))) {
kfree(client);
return ret;
}
dvb = i2c_get_clientdata(client);
BUG_ON(!dvb);
if ((ret = dvb_register_frontend(dvbdummyfe_ioctl, dvb, NULL,
frontend_info(), THIS_MODULE))) {
kfree(client);
return ret;
}
return 0;
}
static void dvbdummyfe_detach (struct dvb_i2c_bus *i2c, void *data)
static int dvbdummyfe_detach_client(struct i2c_client *client)
{
dvb_unregister_frontend (dvbdummyfe_ioctl, i2c);
struct dvb_adapter *dvb = i2c_get_clientdata(client);
dvb_unregister_frontend_new(dvbdummyfe_ioctl, dvb);
i2c_detach_client(client);
kfree(client);
return 0;
}
static int dvbdummyfe_command(struct i2c_client *client,
unsigned int cmd, void *arg)
{
switch(cmd) {
case FE_REGISTER:
i2c_set_clientdata(client, arg);
break;
case FE_UNREGISTER:
break;
default:
return -EOPNOTSUPP;
}
return 0;
}
static struct i2c_driver driver = {
.owner = THIS_MODULE,
.name = FRONTEND_NAME,
.id = I2C_DRIVERID_DVBFE_DUMMY,
.flags = I2C_DF_NOTIFY,
.attach_adapter = dvbdummyfe_attach_adapter,
.detach_client = dvbdummyfe_detach_client,
.command = dvbdummyfe_command,
};
static struct i2c_client client_template = {
.name = FRONTEND_NAME,
.flags = I2C_CLIENT_ALLOW_USE,
.driver = &driver,
};
static int __init init_dvbdummyfe (void)
{
return dvb_register_i2c_device (THIS_MODULE,
dvbdummyfe_attach,
dvbdummyfe_detach);
return i2c_add_driver(&driver);
}
static void __exit exit_dvbdummyfe (void)
{
dvb_unregister_i2c_device (dvbdummyfe_attach);
if (i2c_del_driver(&driver))
printk(KERN_ERR "dummyfe: driver deregistration failed.\n");
}
......@@ -202,4 +264,4 @@ module_exit(exit_dvbdummyfe);
MODULE_DESCRIPTION("DVB DUMMY Frontend");
MODULE_AUTHOR("Emard");
MODULE_LICENSE("GPL");
MODULE_PARM(sct, "i");
......@@ -27,17 +27,31 @@
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/string.h>
#include <linux/slab.h>
#include "dvb_frontend.h"
#include "dvb_functions.h"
static int debug = 0;
#define dprintk if (debug) printk
#define FRONTEND_NAME "dvbfe_tda8083"
#define dprintk(args...) \
do { \
if (debug) printk(KERN_DEBUG FRONTEND_NAME ": " args); \
} while (0)
static struct dvb_frontend_info grundig_29504_491_info = {
static int debug;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
struct tda8083_state {
struct i2c_adapter *i2c;
struct dvb_adapter *dvb;
};
static struct dvb_frontend_info tda8083_info = {
.name = "Grundig 29504-491, (TDA8083 based)",
.type = FE_QPSK,
.frequency_min = 950000, /* FIXME: guessed! */
......@@ -67,14 +81,13 @@ static u8 tda8083_init_tab [] = {
};
static int tda8083_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
static int tda8083_writereg (struct i2c_adapter *i2c, u8 reg, u8 data)
{
int ret;
u8 buf [] = { reg, data };
struct i2c_msg msg = { .addr = 0x68, .flags = 0, .buf = buf, .len = 2 };
ret = i2c->xfer (i2c, &msg, 1);
ret = i2c_transfer(i2c, &msg, 1);
if (ret != 1)
dprintk ("%s: writereg error (reg %02x, ret == %i)\n",
......@@ -84,13 +97,13 @@ static int tda8083_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
}
static int tda8083_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len)
static int tda8083_readregs (struct i2c_adapter *i2c, u8 reg1, u8 *b, u8 len)
{
int ret;
struct i2c_msg msg [] = { { .addr = 0x68, .flags = 0, .buf = &reg1, .len = 1 },
{ .addr = 0x68, .flags = I2C_M_RD, .buf = b, .len = len } };
ret = i2c->xfer (i2c, msg, 2);
ret = i2c_transfer(i2c, msg, 2);
if (ret != 2)
dprintk ("%s: readreg error (reg %02x, ret == %i)\n",
......@@ -100,7 +113,7 @@ static int tda8083_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len)
}
static inline u8 tda8083_readreg (struct dvb_i2c_bus *i2c, u8 reg)
static inline u8 tda8083_readreg (struct i2c_adapter *i2c, u8 reg)
{
u8 val;
......@@ -110,12 +123,12 @@ static inline u8 tda8083_readreg (struct dvb_i2c_bus *i2c, u8 reg)
}
static int tsa5522_write (struct dvb_i2c_bus *i2c, u8 data [4])
static int tsa5522_write (struct i2c_adapter *i2c, u8 data [4])
{
int ret;
struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = 4 };
ret = i2c->xfer (i2c, &msg, 1);
ret = i2c_transfer(i2c, &msg, 1);
if (ret != 1)
dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
......@@ -128,7 +141,7 @@ static int tsa5522_write (struct dvb_i2c_bus *i2c, u8 data [4])
* set up the downconverter frequency divisor for a
* reference clock comparision frequency of 125 kHz.
*/
static int tsa5522_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq)
static int tsa5522_set_tv_freq (struct i2c_adapter *i2c, u32 freq)
{
u32 div = freq / 125;
u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x8e, 0x00 };
......@@ -137,7 +150,7 @@ static int tsa5522_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq)
}
static int tda8083_init (struct dvb_i2c_bus *i2c)
static int tda8083_init (struct i2c_adapter *i2c)
{
int i;
......@@ -150,7 +163,7 @@ static int tda8083_init (struct dvb_i2c_bus *i2c)
}
static int tda8083_set_inversion (struct dvb_i2c_bus *i2c, fe_spectral_inversion_t inversion)
static int tda8083_set_inversion (struct i2c_adapter *i2c, fe_spectral_inversion_t inversion)
{
/* XXX FIXME: implement other modes than FEC_AUTO */
if (inversion == INVERSION_AUTO)
......@@ -160,7 +173,7 @@ static int tda8083_set_inversion (struct dvb_i2c_bus *i2c, fe_spectral_inversion
}
static int tda8083_set_fec (struct dvb_i2c_bus *i2c, fe_code_rate_t fec)
static int tda8083_set_fec (struct i2c_adapter *i2c, fe_code_rate_t fec)
{
if (fec == FEC_AUTO)
return tda8083_writereg (i2c, 0x07, 0xff);
......@@ -172,7 +185,7 @@ static int tda8083_set_fec (struct dvb_i2c_bus *i2c, fe_code_rate_t fec)
}
static fe_code_rate_t tda8083_get_fec (struct dvb_i2c_bus *i2c)
static fe_code_rate_t tda8083_get_fec (struct i2c_adapter *i2c)
{
u8 index;
static fe_code_rate_t fec_tab [] = { FEC_8_9, FEC_1_2, FEC_2_3, FEC_3_4,
......@@ -184,7 +197,7 @@ static fe_code_rate_t tda8083_get_fec (struct dvb_i2c_bus *i2c)
}
static int tda8083_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
static int tda8083_set_symbolrate (struct i2c_adapter *i2c, u32 srate)
{
u32 ratio;
u32 tmp;
......@@ -224,19 +237,19 @@ static int tda8083_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
}
static void tda8083_wait_diseqc_fifo (struct dvb_i2c_bus *i2c, int timeout)
static void tda8083_wait_diseqc_fifo (struct i2c_adapter *i2c, int timeout)
{
unsigned long start = jiffies;
while (jiffies - start < timeout &&
!(tda8083_readreg(i2c, 0x02) & 0x80))
{
dvb_delay(50);
msleep(50);
};
}
static int tda8083_send_diseqc_msg (struct dvb_i2c_bus *i2c,
static int tda8083_send_diseqc_msg (struct i2c_adapter *i2c,
struct dvb_diseqc_master_cmd *m)
{
int i;
......@@ -254,7 +267,7 @@ static int tda8083_send_diseqc_msg (struct dvb_i2c_bus *i2c,
}
static int tda8083_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst)
static int tda8083_send_diseqc_burst (struct i2c_adapter *i2c, fe_sec_mini_cmd_t burst)
{
switch (burst) {
case SEC_MINI_A:
......@@ -273,7 +286,7 @@ static int tda8083_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t
}
static int tda8083_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone)
static int tda8083_set_tone (struct i2c_adapter *i2c, fe_sec_tone_mode_t tone)
{
tda8083_writereg (i2c, 0x26, 0xf1);
......@@ -288,7 +301,7 @@ static int tda8083_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone)
}
static int tda8083_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage)
static int tda8083_set_voltage (struct i2c_adapter *i2c, fe_sec_voltage_t voltage)
{
switch (voltage) {
case SEC_VOLTAGE_13:
......@@ -301,15 +314,15 @@ static int tda8083_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltag
}
static int grundig_29504_491_ioctl (struct dvb_frontend *fe, unsigned int cmd,
static int tda8083_ioctl(struct dvb_frontend *fe, unsigned int cmd,
void *arg)
{
struct dvb_i2c_bus *i2c = fe->i2c;
struct tda8083_state *state = fe->data;
struct i2c_adapter *i2c = state->i2c;
switch (cmd) {
case FE_GET_INFO:
memcpy (arg, &grundig_29504_491_info,
sizeof(struct dvb_frontend_info));
memcpy (arg, &tda8083_info, sizeof(struct dvb_frontend_info));
break;
case FE_READ_STATUS:
......@@ -426,40 +439,119 @@ static int grundig_29504_491_ioctl (struct dvb_frontend *fe, unsigned int cmd,
return 0;
}
static struct i2c_client client_template;
static int tda8083_attach (struct dvb_i2c_bus *i2c, void **data)
static int tda8083_attach_adapter(struct i2c_adapter *adapter)
{
if ((tda8083_readreg (i2c, 0x00)) != 0x05)
struct tda8083_state *state;
struct i2c_client *client;
int ret;
dprintk("Trying to attach to adapter 0x%x:%s.\n",
adapter->id, adapter->name);
if ((tda8083_readreg (adapter, 0x00)) != 0x05)
return -ENODEV;
return dvb_register_frontend (grundig_29504_491_ioctl, i2c, NULL,
&grundig_29504_491_info);
if ( !(state = kmalloc(sizeof(struct tda8083_state), GFP_KERNEL)) )
return -ENOMEM;
if ( !(client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL)) ) {
kfree(state);
return -ENOMEM;
}
memset(state, 0, sizeof(struct tda8083_state));
state->i2c = adapter;
memcpy(client, &client_template, sizeof(struct i2c_client));
client->adapter = adapter;
client->addr = 0; //XXX
i2c_set_clientdata(client, state);
if ((ret = i2c_attach_client(client))) {
kfree(state);
kfree(client);
return ret;
}
BUG_ON(!state->dvb);
if ((ret = dvb_register_frontend(tda8083_ioctl, state->dvb, state,
&tda8083_info, THIS_MODULE))) {
i2c_detach_client(client);
kfree(state);
kfree(client);
return ret;
}
static void tda8083_detach (struct dvb_i2c_bus *i2c, void *data)
return 0;
}
static int tda8083_detach_client(struct i2c_client *client)
{
dvb_unregister_frontend (grundig_29504_491_ioctl, i2c);
struct tda8083_state *state = i2c_get_clientdata(client);
dvb_unregister_frontend_new (tda8083_ioctl, state->dvb);
i2c_detach_client(client);
BUG_ON(state->dvb);
kfree(client);
kfree(state);
return 0;
}
static int tda8083_command (struct i2c_client *client, unsigned int cmd, void *arg)
{
struct tda8083_state *data = i2c_get_clientdata(client);
dprintk ("%s\n", __FUNCTION__);
switch (cmd) {
case FE_REGISTER: {
data->dvb = arg;
break;
}
case FE_UNREGISTER: {
data->dvb = NULL;
break;
}
default:
return -EOPNOTSUPP;
}
return 0;
}
static struct i2c_driver driver = {
.owner = THIS_MODULE,
.name = FRONTEND_NAME,
.id = I2C_DRIVERID_DVBFE_TDA8083,
.flags = I2C_DF_NOTIFY,
.attach_adapter = tda8083_attach_adapter,
.detach_client = tda8083_detach_client,
.command = tda8083_command,
};
static struct i2c_client client_template = {
.name = FRONTEND_NAME,
.flags = I2C_CLIENT_ALLOW_USE,
.driver = &driver,
};
static int __init init_tda8083 (void)
{
return dvb_register_i2c_device (THIS_MODULE,
tda8083_attach, tda8083_detach);
return i2c_add_driver(&driver);
}
static void __exit exit_tda8083 (void)
{
dvb_unregister_i2c_device (tda8083_attach);
if (i2c_del_driver(&driver))
printk("grundig_29504_401: driver deregistration failed\n");
}
module_init(init_tda8083);
module_exit(exit_tda8083);
MODULE_PARM(debug,"i");
MODULE_DESCRIPTION("Grundig 29504-491 DVB frontend driver");
MODULE_DESCRIPTION("Grundig 29504-491 DVB frontend driver (TDA8083 Based)");
MODULE_AUTHOR("Ralph Metzler, Holger Waechtler");
MODULE_LICENSE("GPL");
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment