[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>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
0f0b270f90
commit
1b7c41ef33
@@ -436,6 +436,7 @@ static struct pci_driver ngene_pci_driver = {
|
|||||||
.probe = ngene_probe,
|
.probe = ngene_probe,
|
||||||
.remove = __devexit_p(ngene_remove),
|
.remove = __devexit_p(ngene_remove),
|
||||||
.err_handler = &ngene_errors,
|
.err_handler = &ngene_errors,
|
||||||
|
.shutdown = ngene_shutdown,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init int module_init_ngene(void)
|
static __init int module_init_ngene(void)
|
||||||
|
@@ -45,6 +45,10 @@ static int one_adapter = 1;
|
|||||||
module_param(one_adapter, int, 0444);
|
module_param(one_adapter, int, 0444);
|
||||||
MODULE_PARM_DESC(one_adapter, "Use only one adapter.");
|
MODULE_PARM_DESC(one_adapter, "Use only one adapter.");
|
||||||
|
|
||||||
|
static int shutdown_workaround;
|
||||||
|
module_param(shutdown_workaround, int, 0644);
|
||||||
|
MODULE_PARM_DESC(one_adapter, "Activate workaround for shutdown problem with some chipsets.");
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
module_param(debug, int, 0444);
|
module_param(debug, int, 0444);
|
||||||
MODULE_PARM_DESC(debug, "Print debugging information.");
|
MODULE_PARM_DESC(debug, "Print debugging information.");
|
||||||
@@ -1574,6 +1578,39 @@ static void cxd_detach(struct ngene *dev)
|
|||||||
ci->en = 0;
|
ci->en = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************/
|
||||||
|
/* workaround for shutdown failure */
|
||||||
|
/***********************************/
|
||||||
|
|
||||||
|
static void ngene_unlink(struct ngene *dev)
|
||||||
|
{
|
||||||
|
struct ngene_command com;
|
||||||
|
|
||||||
|
com.cmd.hdr.Opcode = CMD_MEM_WRITE;
|
||||||
|
com.cmd.hdr.Length = 3;
|
||||||
|
com.cmd.MemoryWrite.address = 0x910c;
|
||||||
|
com.cmd.MemoryWrite.data = 0xff;
|
||||||
|
com.in_len = 3;
|
||||||
|
com.out_len = 1;
|
||||||
|
|
||||||
|
down(&dev->cmd_mutex);
|
||||||
|
ngwritel(0, NGENE_INT_ENABLE);
|
||||||
|
ngene_command_mutex(dev, &com);
|
||||||
|
up(&dev->cmd_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ngene_shutdown(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
struct ngene *dev = (struct ngene *)pci_get_drvdata(pdev);
|
||||||
|
|
||||||
|
if (!dev || !shutdown_workaround)
|
||||||
|
return;
|
||||||
|
|
||||||
|
printk(KERN_INFO DEVICE_NAME ": shutdown workaround...\n");
|
||||||
|
ngene_unlink(dev);
|
||||||
|
pci_disable_device(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/* device probe/remove calls ************************************************/
|
/* device probe/remove calls ************************************************/
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
@@ -881,6 +881,7 @@ struct ngene_buffer {
|
|||||||
int __devinit ngene_probe(struct pci_dev *pci_dev,
|
int __devinit ngene_probe(struct pci_dev *pci_dev,
|
||||||
const struct pci_device_id *id);
|
const struct pci_device_id *id);
|
||||||
void __devexit ngene_remove(struct pci_dev *pdev);
|
void __devexit ngene_remove(struct pci_dev *pdev);
|
||||||
|
void ngene_shutdown(struct pci_dev *pdev);
|
||||||
int ngene_command(struct ngene *dev, struct ngene_command *com);
|
int ngene_command(struct ngene *dev, struct ngene_command *com);
|
||||||
int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
|
int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
|
||||||
void set_transfer(struct ngene_channel *chan, int state);
|
void set_transfer(struct ngene_channel *chan, int state);
|
||||||
|
Reference in New Issue
Block a user