diff options
Diffstat (limited to 'drivers/fpga/altera-cvp.c')
| -rw-r--r-- | drivers/fpga/altera-cvp.c | 49 | 
1 files changed, 37 insertions, 12 deletions
diff --git a/drivers/fpga/altera-cvp.c b/drivers/fpga/altera-cvp.c index 610a1558e0ed..35c3aa5792e2 100644 --- a/drivers/fpga/altera-cvp.c +++ b/drivers/fpga/altera-cvp.c @@ -403,6 +403,7 @@ static int altera_cvp_probe(struct pci_dev *pdev,  	struct altera_cvp_conf *conf;  	struct fpga_manager *mgr;  	u16 cmd, val; +	u32 regval;  	int ret;  	/* @@ -416,6 +417,14 @@ static int altera_cvp_probe(struct pci_dev *pdev,  		return -ENODEV;  	} +	pci_read_config_dword(pdev, VSE_CVP_STATUS, ®val); +	if (!(regval & VSE_CVP_STATUS_CVP_EN)) { +		dev_err(&pdev->dev, +			"CVP is disabled for this device: CVP_STATUS Reg 0x%x\n", +			regval); +		return -ENODEV; +	} +  	conf = devm_kzalloc(&pdev->dev, sizeof(*conf), GFP_KERNEL);  	if (!conf)  		return -ENOMEM; @@ -466,18 +475,11 @@ static int altera_cvp_probe(struct pci_dev *pdev,  	if (ret)  		goto err_unmap; -	ret = driver_create_file(&altera_cvp_driver.driver, -				 &driver_attr_chkcfg); -	if (ret) { -		dev_err(&pdev->dev, "Can't create sysfs chkcfg file\n"); -		fpga_mgr_unregister(mgr); -		goto err_unmap; -	} -  	return 0;  err_unmap: -	pci_iounmap(pdev, conf->map); +	if (conf->map) +		pci_iounmap(pdev, conf->map);  	pci_release_region(pdev, CVP_BAR);  err_disable:  	cmd &= ~PCI_COMMAND_MEMORY; @@ -491,16 +493,39 @@ static void altera_cvp_remove(struct pci_dev *pdev)  	struct altera_cvp_conf *conf = mgr->priv;  	u16 cmd; -	driver_remove_file(&altera_cvp_driver.driver, &driver_attr_chkcfg);  	fpga_mgr_unregister(mgr); -	pci_iounmap(pdev, conf->map); +	if (conf->map) +		pci_iounmap(pdev, conf->map);  	pci_release_region(pdev, CVP_BAR);  	pci_read_config_word(pdev, PCI_COMMAND, &cmd);  	cmd &= ~PCI_COMMAND_MEMORY;  	pci_write_config_word(pdev, PCI_COMMAND, cmd);  } -module_pci_driver(altera_cvp_driver); +static int __init altera_cvp_init(void) +{ +	int ret; + +	ret = pci_register_driver(&altera_cvp_driver); +	if (ret) +		return ret; + +	ret = driver_create_file(&altera_cvp_driver.driver, +				 &driver_attr_chkcfg); +	if (ret) +		pr_warn("Can't create sysfs chkcfg file\n"); + +	return 0; +} + +static void __exit altera_cvp_exit(void) +{ +	driver_remove_file(&altera_cvp_driver.driver, &driver_attr_chkcfg); +	pci_unregister_driver(&altera_cvp_driver); +} + +module_init(altera_cvp_init); +module_exit(altera_cvp_exit);  MODULE_LICENSE("GPL v2");  MODULE_AUTHOR("Anatolij Gustschin <agust@denx.de>");  | 
