aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/ngene
diff options
context:
space:
mode:
authorRalph Metzler <rjkm@metzlerbros.de>2011-01-10 04:36:16 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-03-21 19:31:45 -0400
commit1b7c41ef33f38c88dcf9a1b7544d9e4eaa045e6f (patch)
treefe26e57f0fc9e70c4fa53d1156a72ba630315aa8 /drivers/media/dvb/ngene
parent0f0b270f905bbb0c8e75988ceaf10ff9a401e712 (diff)
[media] ngene: Shutdown workaround
Implement shutdown workaround for some chipsets. Signed-off-by: Ralph Metzler <rjkm@metzlerbros.de> Signed-off-by: Oliver Endriss <o.endriss@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/ngene')
-rw-r--r--drivers/media/dvb/ngene/ngene-cards.c1
-rw-r--r--drivers/media/dvb/ngene/ngene-core.c37
-rw-r--r--drivers/media/dvb/ngene/ngene.h1
3 files changed, 39 insertions, 0 deletions
diff --git a/drivers/media/dvb/ngene/ngene-cards.c b/drivers/media/dvb/ngene/ngene-cards.c
index 93e6f9e954c..6d87427d214 100644
--- a/drivers/media/dvb/ngene/ngene-cards.c
+++ b/drivers/media/dvb/ngene/ngene-cards.c
@@ -436,6 +436,7 @@ static struct pci_driver ngene_pci_driver = {
436 .probe = ngene_probe, 436 .probe = ngene_probe,
437 .remove = __devexit_p(ngene_remove), 437 .remove = __devexit_p(ngene_remove),
438 .err_handler = &ngene_errors, 438 .err_handler = &ngene_errors,
439 .shutdown = ngene_shutdown,
439}; 440};
440 441
441static __init int module_init_ngene(void) 442static __init int module_init_ngene(void)
diff --git a/drivers/media/dvb/ngene/ngene-core.c b/drivers/media/dvb/ngene/ngene-core.c
index deaf72aab05..422f83b9dca 100644
--- a/drivers/media/dvb/ngene/ngene-core.c
+++ b/drivers/media/dvb/ngene/ngene-core.c
@@ -45,6 +45,10 @@ static int one_adapter = 1;
45module_param(one_adapter, int, 0444); 45module_param(one_adapter, int, 0444);
46MODULE_PARM_DESC(one_adapter, "Use only one adapter."); 46MODULE_PARM_DESC(one_adapter, "Use only one adapter.");
47 47
48static int shutdown_workaround;
49module_param(shutdown_workaround, int, 0644);
50MODULE_PARM_DESC(one_adapter, "Activate workaround for shutdown problem with some chipsets.");
51
48static int debug; 52static int debug;
49module_param(debug, int, 0444); 53module_param(debug, int, 0444);
50MODULE_PARM_DESC(debug, "Print debugging information."); 54MODULE_PARM_DESC(debug, "Print debugging information.");
@@ -1574,6 +1578,39 @@ static void cxd_detach(struct ngene *dev)
1574 ci->en = 0; 1578 ci->en = 0;
1575} 1579}
1576 1580
1581/***********************************/
1582/* workaround for shutdown failure */
1583/***********************************/
1584
1585static void ngene_unlink(struct ngene *dev)
1586{
1587 struct ngene_command com;
1588
1589 com.cmd.hdr.Opcode = CMD_MEM_WRITE;
1590 com.cmd.hdr.Length = 3;
1591 com.cmd.MemoryWrite.address = 0x910c;
1592 com.cmd.MemoryWrite.data = 0xff;
1593 com.in_len = 3;
1594 com.out_len = 1;
1595
1596 down(&dev->cmd_mutex);
1597 ngwritel(0, NGENE_INT_ENABLE);
1598 ngene_command_mutex(dev, &com);
1599 up(&dev->cmd_mutex);
1600}
1601
1602void ngene_shutdown(struct pci_dev *pdev)
1603{
1604 struct ngene *dev = (struct ngene *)pci_get_drvdata(pdev);
1605
1606 if (!dev || !shutdown_workaround)
1607 return;
1608
1609 printk(KERN_INFO DEVICE_NAME ": shutdown workaround...\n");
1610 ngene_unlink(dev);
1611 pci_disable_device(pdev);
1612}
1613
1577/****************************************************************************/ 1614/****************************************************************************/
1578/* device probe/remove calls ************************************************/ 1615/* device probe/remove calls ************************************************/
1579/****************************************************************************/ 1616/****************************************************************************/
diff --git a/drivers/media/dvb/ngene/ngene.h b/drivers/media/dvb/ngene/ngene.h
index f7834066386..c1bb81014fb 100644
--- a/drivers/media/dvb/ngene/ngene.h
+++ b/drivers/media/dvb/ngene/ngene.h
@@ -881,6 +881,7 @@ struct ngene_buffer {
881int __devinit ngene_probe(struct pci_dev *pci_dev, 881int __devinit ngene_probe(struct pci_dev *pci_dev,
882 const struct pci_device_id *id); 882 const struct pci_device_id *id);
883void __devexit ngene_remove(struct pci_dev *pdev); 883void __devexit ngene_remove(struct pci_dev *pdev);
884void ngene_shutdown(struct pci_dev *pdev);
884int ngene_command(struct ngene *dev, struct ngene_command *com); 885int ngene_command(struct ngene *dev, struct ngene_command *com);
885int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level); 886int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
886void set_transfer(struct ngene_channel *chan, int state); 887void set_transfer(struct ngene_channel *chan, int state);