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, | |||
403 | struct altera_cvp_conf *conf; | 403 | struct altera_cvp_conf *conf; |
404 | struct fpga_manager *mgr; | 404 | struct fpga_manager *mgr; |
405 | u16 cmd, val; | 405 | u16 cmd, val; |
406 | u32 regval; | ||
406 | int ret; | 407 | int ret; |
407 | 408 | ||
408 | /* | 409 | /* |
@@ -416,6 +417,14 @@ static int altera_cvp_probe(struct pci_dev *pdev, | |||
416 | return -ENODEV; | 417 | return -ENODEV; |
417 | } | 418 | } |
418 | 419 | ||
420 | pci_read_config_dword(pdev, VSE_CVP_STATUS, ®val); | ||
421 | if (!(regval & VSE_CVP_STATUS_CVP_EN)) { | ||
422 | dev_err(&pdev->dev, | ||
423 | "CVP is disabled for this device: CVP_STATUS Reg 0x%x\n", | ||
424 | regval); | ||
425 | return -ENODEV; | ||
426 | } | ||
427 | |||
419 | conf = devm_kzalloc(&pdev->dev, sizeof(*conf), GFP_KERNEL); | 428 | conf = devm_kzalloc(&pdev->dev, sizeof(*conf), GFP_KERNEL); |
420 | if (!conf) | 429 | if (!conf) |
421 | return -ENOMEM; | 430 | return -ENOMEM; |
@@ -466,18 +475,11 @@ static int altera_cvp_probe(struct pci_dev *pdev, | |||
466 | if (ret) | 475 | if (ret) |
467 | goto err_unmap; | 476 | goto err_unmap; |
468 | 477 | ||
469 | ret = driver_create_file(&altera_cvp_driver.driver, | ||
470 | &driver_attr_chkcfg); | ||
471 | if (ret) { | ||
472 | dev_err(&pdev->dev, "Can't create sysfs chkcfg file\n"); | ||
473 | fpga_mgr_unregister(mgr); | ||
474 | goto err_unmap; | ||
475 | } | ||
476 | |||
477 | return 0; | 478 | return 0; |
478 | 479 | ||
479 | err_unmap: | 480 | err_unmap: |
480 | pci_iounmap(pdev, conf->map); | 481 | if (conf->map) |
482 | pci_iounmap(pdev, conf->map); | ||
481 | pci_release_region(pdev, CVP_BAR); | 483 | pci_release_region(pdev, CVP_BAR); |
482 | err_disable: | 484 | err_disable: |
483 | cmd &= ~PCI_COMMAND_MEMORY; | 485 | cmd &= ~PCI_COMMAND_MEMORY; |
@@ -491,16 +493,39 @@ static void altera_cvp_remove(struct pci_dev *pdev) | |||
491 | struct altera_cvp_conf *conf = mgr->priv; | 493 | struct altera_cvp_conf *conf = mgr->priv; |
492 | u16 cmd; | 494 | u16 cmd; |
493 | 495 | ||
494 | driver_remove_file(&altera_cvp_driver.driver, &driver_attr_chkcfg); | ||
495 | fpga_mgr_unregister(mgr); | 496 | fpga_mgr_unregister(mgr); |
496 | pci_iounmap(pdev, conf->map); | 497 | if (conf->map) |
498 | pci_iounmap(pdev, conf->map); | ||
497 | pci_release_region(pdev, CVP_BAR); | 499 | pci_release_region(pdev, CVP_BAR); |
498 | pci_read_config_word(pdev, PCI_COMMAND, &cmd); | 500 | pci_read_config_word(pdev, PCI_COMMAND, &cmd); |
499 | cmd &= ~PCI_COMMAND_MEMORY; | 501 | cmd &= ~PCI_COMMAND_MEMORY; |
500 | pci_write_config_word(pdev, PCI_COMMAND, cmd); | 502 | pci_write_config_word(pdev, PCI_COMMAND, cmd); |
501 | } | 503 | } |
502 | 504 | ||
503 | module_pci_driver(altera_cvp_driver); | 505 | static int __init altera_cvp_init(void) |
506 | { | ||
507 | int ret; | ||
508 | |||
509 | ret = pci_register_driver(&altera_cvp_driver); | ||
510 | if (ret) | ||
511 | return ret; | ||
512 | |||
513 | ret = driver_create_file(&altera_cvp_driver.driver, | ||
514 | &driver_attr_chkcfg); | ||
515 | if (ret) | ||
516 | pr_warn("Can't create sysfs chkcfg file\n"); | ||
517 | |||
518 | return 0; | ||
519 | } | ||
520 | |||
521 | static void __exit altera_cvp_exit(void) | ||
522 | { | ||
523 | driver_remove_file(&altera_cvp_driver.driver, &driver_attr_chkcfg); | ||
524 | pci_unregister_driver(&altera_cvp_driver); | ||
525 | } | ||
526 | |||
527 | module_init(altera_cvp_init); | ||
528 | module_exit(altera_cvp_exit); | ||
504 | 529 | ||
505 | MODULE_LICENSE("GPL v2"); | 530 | MODULE_LICENSE("GPL v2"); |
506 | MODULE_AUTHOR("Anatolij Gustschin <agust@denx.de>"); | 531 | MODULE_AUTHOR("Anatolij Gustschin <agust@denx.de>"); |