diff options
author | Ralph Metzler <rjkm@metzlerbros.de> | 2011-01-10 04:36:16 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-03-21 19:31:45 -0400 |
commit | 1b7c41ef33f38c88dcf9a1b7544d9e4eaa045e6f (patch) | |
tree | fe26e57f0fc9e70c4fa53d1156a72ba630315aa8 /drivers/media/dvb/ngene | |
parent | 0f0b270f905bbb0c8e75988ceaf10ff9a401e712 (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.c | 1 | ||||
-rw-r--r-- | drivers/media/dvb/ngene/ngene-core.c | 37 | ||||
-rw-r--r-- | drivers/media/dvb/ngene/ngene.h | 1 |
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 | ||
441 | static __init int module_init_ngene(void) | 442 | static __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; | |||
45 | module_param(one_adapter, int, 0444); | 45 | module_param(one_adapter, int, 0444); |
46 | MODULE_PARM_DESC(one_adapter, "Use only one adapter."); | 46 | MODULE_PARM_DESC(one_adapter, "Use only one adapter."); |
47 | 47 | ||
48 | static int shutdown_workaround; | ||
49 | module_param(shutdown_workaround, int, 0644); | ||
50 | MODULE_PARM_DESC(one_adapter, "Activate workaround for shutdown problem with some chipsets."); | ||
51 | |||
48 | static int debug; | 52 | static int debug; |
49 | module_param(debug, int, 0444); | 53 | module_param(debug, int, 0444); |
50 | MODULE_PARM_DESC(debug, "Print debugging information."); | 54 | MODULE_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 | |||
1585 | static 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 | |||
1602 | void 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 { | |||
881 | int __devinit ngene_probe(struct pci_dev *pci_dev, | 881 | int __devinit ngene_probe(struct pci_dev *pci_dev, |
882 | const struct pci_device_id *id); | 882 | const struct pci_device_id *id); |
883 | void __devexit ngene_remove(struct pci_dev *pdev); | 883 | void __devexit ngene_remove(struct pci_dev *pdev); |
884 | void ngene_shutdown(struct pci_dev *pdev); | ||
884 | int ngene_command(struct ngene *dev, struct ngene_command *com); | 885 | int ngene_command(struct ngene *dev, struct ngene_command *com); |
885 | int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level); | 886 | int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level); |
886 | void set_transfer(struct ngene_channel *chan, int state); | 887 | void set_transfer(struct ngene_channel *chan, int state); |