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

[PATCH] DVB: skystar2 dvb bt8xx update

- [DVB] convert drivers from dvb-i2c to kernel-i2c
- [DVB] convert MODULE_PARM() to module_param()
- [DVB] convert dvb_delay() to mdelay()
- [DVB] dvb-bt8xx: convert home-brewn bttv i2c access to a real bttv sub-driver
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 c1013373
...@@ -30,14 +30,16 @@ ...@@ -30,14 +30,16 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <asm/io.h> #include <asm/io.h>
#include "dvb_i2c.h"
#include "dvb_frontend.h" #include "dvb_frontend.h"
#include <linux/dvb/frontend.h> #include <linux/dvb/frontend.h>
...@@ -49,12 +51,17 @@ ...@@ -49,12 +51,17 @@
#include "demux.h" #include "demux.h"
#include "dvb_net.h" #include "dvb_net.h"
#include "dvb_functions.h"
static int debug = 0; static int debug;
static int enable_hw_filters = 2;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Set debugging level (0 = default, 1 = most messages, 2 = all messages).");
module_param(enable_hw_filters, int, 0444);
MODULE_PARM_DESC(enable_hw_filters, "enable hardware filters: supported values: 0 (none), 1, 2");
#define dprintk(x...) do { if (debug>=1) printk(x); } while (0) #define dprintk(x...) do { if (debug>=1) printk(x); } while (0)
#define ddprintk(x...) do { if (debug>=2) printk(x); } while (0) #define ddprintk(x...) do { if (debug>=2) printk(x); } while (0)
static int enable_hw_filters = 2;
#define SIZE_OF_BUF_DMA1 0x3ac00 #define SIZE_OF_BUF_DMA1 0x3ac00
#define SIZE_OF_BUF_DMA2 0x758 #define SIZE_OF_BUF_DMA2 0x758
...@@ -89,7 +96,7 @@ struct adapter { ...@@ -89,7 +96,7 @@ struct adapter {
struct dmxdev dmxdev; struct dmxdev dmxdev;
struct dmx_frontend hw_frontend; struct dmx_frontend hw_frontend;
struct dmx_frontend mem_frontend; struct dmx_frontend mem_frontend;
struct dvb_i2c_bus *i2c_bus; struct i2c_adapter i2c_adap;
struct dvb_net dvbnet; struct dvb_net dvbnet;
struct semaphore i2c_sem; struct semaphore i2c_sem;
...@@ -277,9 +284,9 @@ static u32 flex_i2c_write(struct adapter *adapter, u32 device, u32 bus, u32 addr ...@@ -277,9 +284,9 @@ static u32 flex_i2c_write(struct adapter *adapter, u32 device, u32 bus, u32 addr
return buf - start; return buf - start;
} }
static int master_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg *msgs, int num) static int master_xfer(struct i2c_adapter* adapter, struct i2c_msg msgs[], int num)
{ {
struct adapter *tmp = i2c->data; struct adapter *tmp = i2c_get_adapdata(adapter);
int i, ret = 0; int i, ret = 0;
if (down_interruptible(&tmp->i2c_sem)) if (down_interruptible(&tmp->i2c_sem))
...@@ -291,10 +298,10 @@ static int master_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg *msgs, int ...@@ -291,10 +298,10 @@ static int master_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg *msgs, int
ddprintk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i, ddprintk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len); msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
/* allow only the mt312 and stv0299 frontends to access the bus */ /* allow only the mt312, mt352 and stv0299 frontends to access the bus */
if ((msgs[i].addr != 0x0e) && (msgs[i].addr != 0x68) && (msgs[i].addr != 0x61)) { if ((msgs[i].addr != 0x0e) && (msgs[i].addr != 0x68) &&
(msgs[i].addr != 0x61) && (msgs[i].addr != 0x0f)) {
up(&tmp->i2c_sem); up(&tmp->i2c_sem);
return -EREMOTEIO; return -EREMOTEIO;
} }
} }
...@@ -2122,7 +2129,7 @@ static int send_diseqc_msg(struct adapter *adapter, int len, u8 *msg, unsigned l ...@@ -2122,7 +2129,7 @@ static int send_diseqc_msg(struct adapter *adapter, int len, u8 *msg, unsigned l
udelay(12500); udelay(12500);
set_tuner_tone(adapter, 0); set_tuner_tone(adapter, 0);
} }
dvb_delay(20); msleep(20);
} }
return 0; return 0;
...@@ -2228,6 +2235,44 @@ static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void ...@@ -2228,6 +2235,44 @@ static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void
return 0; return 0;
} }
int client_register(struct i2c_client *client)
{
struct adapter *adapter = (struct adapter*)i2c_get_adapdata(client->adapter);
dprintk("client_register\n");
if (client->driver->command)
return client->driver->command(client, FE_REGISTER, adapter->dvb_adapter);
return 0;
}
int client_unregister(struct i2c_client *client)
{
struct adapter *adapter = (struct adapter*)i2c_get_adapdata(client->adapter);
dprintk("client_unregister\n");
if (client->driver->command)
return client->driver->command(client, FE_UNREGISTER, adapter->dvb_adapter);
return 0;
}
u32 flexcop_i2c_func(struct i2c_adapter *adapter)
{
printk("flexcop_i2c_func\n");
return I2C_FUNC_I2C;
}
static struct i2c_algorithm flexcop_algo = {
.name = "flexcop i2c algorithm",
.id = I2C_ALGO_BIT,
.master_xfer = master_xfer,
.functionality = flexcop_i2c_func,
};
static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
struct adapter *adapter; struct adapter *adapter;
...@@ -2258,10 +2303,27 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2258,10 +2303,27 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
init_MUTEX(&adapter->i2c_sem); init_MUTEX(&adapter->i2c_sem);
adapter->i2c_bus = dvb_register_i2c_bus(master_xfer, adapter, adapter->dvb_adapter, 0);
if (!adapter->i2c_bus) memset(&adapter->i2c_adap, 0, sizeof(struct i2c_adapter));
strcpy(adapter->i2c_adap.name, "SkyStar2");
i2c_set_adapdata(&adapter->i2c_adap, adapter);
#ifdef I2C_ADAP_CLASS_TV_DIGITAL
adapter->i2c_adap.class = I2C_ADAP_CLASS_TV_DIGITAL;
#else
adapter->i2c_adap.class = I2C_CLASS_TV_DIGITAL;
#endif
adapter->i2c_adap.algo = &flexcop_algo;
adapter->i2c_adap.algo_data = NULL;
adapter->i2c_adap.id = I2C_ALGO_BIT;
adapter->i2c_adap.client_register = client_register;
adapter->i2c_adap.client_unregister = client_unregister;
if (i2c_add_adapter(&adapter->i2c_adap) < 0) {
dvb_unregister_adapter (adapter->dvb_adapter);
return -ENOMEM; return -ENOMEM;
}
dvb_add_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL, adapter); dvb_add_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL, adapter);
...@@ -2327,8 +2389,7 @@ static void skystar2_remove(struct pci_dev *pdev) ...@@ -2327,8 +2389,7 @@ static void skystar2_remove(struct pci_dev *pdev)
if (adapter->dvb_adapter != NULL) { if (adapter->dvb_adapter != NULL) {
dvb_remove_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL); dvb_remove_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL);
if (adapter->i2c_bus != NULL) i2c_del_adapter(&adapter->i2c_adap);
dvb_unregister_i2c_bus(master_xfer, adapter->i2c_bus->adapter, adapter->i2c_bus->id);
dvb_unregister_adapter(adapter->dvb_adapter); dvb_unregister_adapter(adapter->dvb_adapter);
} }
...@@ -2364,10 +2425,5 @@ static void skystar2_cleanup(void) ...@@ -2364,10 +2425,5 @@ static void skystar2_cleanup(void)
module_init(skystar2_init); module_init(skystar2_init);
module_exit(skystar2_cleanup); module_exit(skystar2_cleanup);
MODULE_PARM(debug, "i");
MODULE_PARM_DESC(debug, "enable verbose debug messages: supported values: 1 and 2");
MODULE_PARM(enable_hw_filters, "i");
MODULE_PARM_DESC(enable_hw_filters, "enable hardware filters: supported values: 0 (none), 1, 2");
MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver"); MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
config DVB_BT8XX config DVB_BT8XX
tristate "Nebula/Pinnacle PCTV PCI cards" tristate "Nebula/Pinnacle PCTV/Twinhan PCI cards"
depends on DVB_CORE && PCI && VIDEO_BT848 depends on DVB_CORE && PCI && VIDEO_BT848
help help
Support for PCI cards based on the Bt8xx PCI bridge. Examples are Support for PCI cards based on the Bt8xx PCI bridge. Examples are
the Nebula cards, the Pinnacle PCTV cards, and Twinhan DST cards. the Nebula cards, the Pinnacle PCTV cards and Twinhan DST cards.
Since these cards have no MPEG decoder onboard, they transmit Since these cards have no MPEG decoder onboard, they transmit
only compressed MPEG data over the PCI bus, so you need only compressed MPEG data over the PCI bus, so you need
an external software decoder to watch TV on your computer. an external software decoder to watch TV on your computer.
If you have a Twinhan card, don't forget to select
"Twinhan DST based DVB-S/-T frontend".
Say Y if you own such a device and want to use it. Say Y if you own such a device and want to use it.
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
* *
*/ */
#include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -46,20 +46,19 @@ ...@@ -46,20 +46,19 @@
#include "bt878.h" #include "bt878.h"
#include "dst-bt878.h" #include "dst-bt878.h"
#include "dvb_functions.h"
/**************************************/ /**************************************/
/* Miscellaneous utility definitions */ /* Miscellaneous utility definitions */
/**************************************/ /**************************************/
unsigned int bt878_verbose = 1; static unsigned int bt878_verbose = 1;
unsigned int bt878_debug = 0; static unsigned int bt878_debug;
MODULE_PARM(bt878_verbose, "i");
module_param_named(verbose, bt878_verbose, int, 0444);
MODULE_PARM_DESC(bt878_verbose, MODULE_PARM_DESC(bt878_verbose,
"verbose startup messages, default is 1 (yes)"); "verbose startup messages, default is 1 (yes)");
MODULE_PARM(bt878_debug, "i"); module_param_named(debug, bt878_debug, int, 0644);
MODULE_PARM_DESC(bt878_debug, "debug messages, default is 0 (no)"); MODULE_PARM_DESC(bt878_debug, "Turn on/off debugging (default:off).");
MODULE_LICENSE("GPL");
int bt878_num; int bt878_num;
struct bt878 bt878[BT878_MAX]; struct bt878 bt878[BT878_MAX];
...@@ -339,10 +338,6 @@ static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs) ...@@ -339,10 +338,6 @@ static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
extern int bttv_gpio_enable(unsigned int card, unsigned long mask, unsigned long data);
extern int bttv_read_gpio(unsigned int card, unsigned long *data);
extern int bttv_write_gpio(unsigned int card, unsigned long mask, unsigned long data);
int int
bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp) bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp)
{ {
...@@ -386,20 +381,20 @@ bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet * ...@@ -386,20 +381,20 @@ bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *
EXPORT_SYMBOL(bt878_device_control); EXPORT_SYMBOL(bt878_device_control);
struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap) struct bt878 *bt878_find_by_i2c_adap(struct i2c_adapter *adapter)
{ {
unsigned int card_nr; unsigned int card_nr;
printk("bt878 find by dvb adap: checking \"%s\"\n",adap->name); printk("bt878 find by dvb adap: checking \"%s\"\n",adapter->name);
for (card_nr = 0; card_nr < bt878_num; card_nr++) { for (card_nr = 0; card_nr < bt878_num; card_nr++) {
if (bt878[card_nr].adap_ptr == adap) if (bt878[card_nr].adapter == adapter)
return &bt878[card_nr]; return &bt878[card_nr];
} }
printk("bt878 find by dvb adap: NOT found \"%s\"\n",adap->name); printk("bt878 find by dvb adap: NOT found \"%s\"\n",adapter->name);
return NULL; return NULL;
} }
EXPORT_SYMBOL(bt878_find_by_dvb_adap); EXPORT_SYMBOL(bt878_find_by_i2c_adap);
/***********************/ /***********************/
/* PCI device handling */ /* PCI device handling */
...@@ -611,6 +606,9 @@ EXPORT_SYMBOL(bt878_cleanup_module); ...@@ -611,6 +606,9 @@ EXPORT_SYMBOL(bt878_cleanup_module);
module_init(bt878_init_module); module_init(bt878_init_module);
module_exit(bt878_cleanup_module); module_exit(bt878_cleanup_module);
MODULE_LICENSE("GPL");
/* /*
* Local variables: * Local variables:
* c-basic-offset: 8 * c-basic-offset: 8
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include "bt848.h" #include "bt848.h"
#include "bttv.h"
#define BT878_VERSION_CODE 0x000000 #define BT878_VERSION_CODE 0x000000
...@@ -94,7 +95,7 @@ struct bt878 { ...@@ -94,7 +95,7 @@ struct bt878 {
struct semaphore gpio_lock; struct semaphore gpio_lock;
unsigned int nr; unsigned int nr;
unsigned int bttv_nr; unsigned int bttv_nr;
struct dvb_adapter *adap_ptr; struct i2c_adapter *adapter;
struct pci_dev *dev; struct pci_dev *dev;
unsigned int id; unsigned int id;
unsigned int TS_Size; unsigned int TS_Size;
......
This diff is collapsed.
...@@ -25,9 +25,9 @@ ...@@ -25,9 +25,9 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include "dvbdev.h" #include "dvbdev.h"
#include "dvb_net.h" #include "dvb_net.h"
#include "bttv.h"
struct dvb_bt8xx_card { struct dvb_bt8xx_card {
struct list_head list; struct list_head list;
u8 active; u8 active;
char card_name[32]; char card_name[32];
......
...@@ -32,7 +32,6 @@ union dst_gpio_packet { ...@@ -32,7 +32,6 @@ union dst_gpio_packet {
struct bt878 ; struct bt878 ;
int int bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp);
bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp);
struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap); struct bt878 *bt878_find_by_i2c_adap(struct i2c_adapter *adap);
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