Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/exynos: refactor driver and device registration code

This patch refactors driver and device registration by moving all drivers
to the common array. This way additional flags can be added later for
new features. #ifdef-based code has been replaced by IS_ENABLED() macro
usage.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>

authored by

Marek Szyprowski and committed by
Inki Dae
a5fb26cd cbf0acef

+109 -129
+109 -128
drivers/gpu/drm/exynos/exynos_drm_drv.c
··· 481 481 /* forward declaration */ 482 482 static struct platform_driver exynos_drm_platform_driver; 483 483 484 + struct exynos_drm_driver_info { 485 + struct platform_driver *driver; 486 + unsigned int flags; 487 + }; 488 + 489 + #define DRM_COMPONENT_DRIVER BIT(0) /* supports component framework */ 490 + #define DRM_VIRTUAL_DEVICE BIT(1) /* create virtual platform device */ 491 + 492 + #define DRV_PTR(drv, cond) (IS_ENABLED(cond) ? &drv : NULL) 493 + 484 494 /* 485 495 * Connector drivers should not be placed before associated crtc drivers, 486 496 * because connector requires pipe number of its crtc during initialization. 487 497 */ 488 - static struct platform_driver *const exynos_drm_kms_drivers[] = { 489 - #ifdef CONFIG_DRM_EXYNOS_FIMD 490 - &fimd_driver, 491 - #endif 492 - #ifdef CONFIG_DRM_EXYNOS5433_DECON 493 - &exynos5433_decon_driver, 494 - #endif 495 - #ifdef CONFIG_DRM_EXYNOS7_DECON 496 - &decon_driver, 497 - #endif 498 - #ifdef CONFIG_DRM_EXYNOS_MIC 499 - &mic_driver, 500 - #endif 501 - #ifdef CONFIG_DRM_EXYNOS_DP 502 - &dp_driver, 503 - #endif 504 - #ifdef CONFIG_DRM_EXYNOS_DSI 505 - &dsi_driver, 506 - #endif 507 - #ifdef CONFIG_DRM_EXYNOS_MIXER 508 - &mixer_driver, 509 - #endif 510 - #ifdef CONFIG_DRM_EXYNOS_HDMI 511 - &hdmi_driver, 512 - #endif 513 - #ifdef CONFIG_DRM_EXYNOS_VIDI 514 - &vidi_driver, 515 - #endif 498 + static struct exynos_drm_driver_info exynos_drm_drivers[] = { 499 + { 500 + DRV_PTR(fimd_driver, CONFIG_DRM_EXYNOS_FIMD), 501 + DRM_COMPONENT_DRIVER 502 + }, { 503 + DRV_PTR(exynos5433_decon_driver, CONFIG_DRM_EXYNOS5433_DECON), 504 + DRM_COMPONENT_DRIVER 505 + }, { 506 + DRV_PTR(decon_driver, CONFIG_DRM_EXYNOS7_DECON), 507 + DRM_COMPONENT_DRIVER 508 + }, { 509 + DRV_PTR(mixer_driver, CONFIG_DRM_EXYNOS_MIXER), 510 + DRM_COMPONENT_DRIVER 511 + }, { 512 + DRV_PTR(mic_driver, CONFIG_DRM_EXYNOS_MIC), 513 + DRM_COMPONENT_DRIVER 514 + }, { 515 + DRV_PTR(dp_driver, CONFIG_DRM_EXYNOS_DP), 516 + DRM_COMPONENT_DRIVER 517 + }, { 518 + DRV_PTR(dsi_driver, CONFIG_DRM_EXYNOS_DSI), 519 + DRM_COMPONENT_DRIVER 520 + }, { 521 + DRV_PTR(hdmi_driver, CONFIG_DRM_EXYNOS_HDMI), 522 + DRM_COMPONENT_DRIVER 523 + }, { 524 + DRV_PTR(vidi_driver, CONFIG_DRM_EXYNOS_VIDI), 525 + DRM_COMPONENT_DRIVER | DRM_VIRTUAL_DEVICE 526 + }, { 527 + DRV_PTR(g2d_driver, CONFIG_DRM_EXYNOS_G2D), 528 + }, { 529 + DRV_PTR(fimc_driver, CONFIG_DRM_EXYNOS_FIMC), 530 + }, { 531 + DRV_PTR(rotator_driver, CONFIG_DRM_EXYNOS_ROTATOR), 532 + }, { 533 + DRV_PTR(gsc_driver, CONFIG_DRM_EXYNOS_GSC), 534 + }, { 535 + DRV_PTR(ipp_driver, CONFIG_DRM_EXYNOS_IPP), 536 + DRM_VIRTUAL_DEVICE 537 + }, { 538 + &exynos_drm_platform_driver, 539 + DRM_VIRTUAL_DEVICE 540 + } 516 541 }; 517 - 518 - static struct platform_driver *const exynos_drm_non_kms_drivers[] = { 519 - #ifdef CONFIG_DRM_EXYNOS_G2D 520 - &g2d_driver, 521 - #endif 522 - #ifdef CONFIG_DRM_EXYNOS_FIMC 523 - &fimc_driver, 524 - #endif 525 - #ifdef CONFIG_DRM_EXYNOS_ROTATOR 526 - &rotator_driver, 527 - #endif 528 - #ifdef CONFIG_DRM_EXYNOS_GSC 529 - &gsc_driver, 530 - #endif 531 - #ifdef CONFIG_DRM_EXYNOS_IPP 532 - &ipp_driver, 533 - #endif 534 - &exynos_drm_platform_driver, 535 - }; 536 - 537 - static struct platform_driver *const exynos_drm_drv_with_simple_dev[] = { 538 - #ifdef CONFIG_DRM_EXYNOS_VIDI 539 - &vidi_driver, 540 - #endif 541 - #ifdef CONFIG_DRM_EXYNOS_IPP 542 - &ipp_driver, 543 - #endif 544 - &exynos_drm_platform_driver, 545 - }; 546 - #define PDEV_COUNT ARRAY_SIZE(exynos_drm_drv_with_simple_dev) 547 542 548 543 static int compare_dev(struct device *dev, void *data) 549 544 { ··· 550 555 struct component_match *match = NULL; 551 556 int i; 552 557 553 - for (i = 0; i < ARRAY_SIZE(exynos_drm_kms_drivers); ++i) { 554 - struct device_driver *drv = &exynos_drm_kms_drivers[i]->driver; 558 + for (i = 0; i < ARRAY_SIZE(exynos_drm_drivers); ++i) { 559 + struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 555 560 struct device *p = NULL, *d; 556 561 557 - while ((d = bus_find_device(&platform_bus_type, p, drv, 562 + if (!info->driver || !(info->flags & DRM_COMPONENT_DRIVER)) 563 + continue; 564 + 565 + while ((d = bus_find_device(&platform_bus_type, p, 566 + &info->driver->driver, 558 567 (void *)platform_bus_type.match))) { 559 568 put_device(p); 560 569 component_match_add(dev, &match, compare_dev, d); ··· 615 616 }, 616 617 }; 617 618 618 - static struct platform_device *exynos_drm_pdevs[PDEV_COUNT]; 619 - 620 619 static void exynos_drm_unregister_devices(void) 621 620 { 622 - int i = PDEV_COUNT; 621 + int i; 623 622 624 - while (--i >= 0) { 625 - platform_device_unregister(exynos_drm_pdevs[i]); 626 - exynos_drm_pdevs[i] = NULL; 623 + for (i = ARRAY_SIZE(exynos_drm_drivers) - 1; i >= 0; --i) { 624 + struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 625 + struct device *dev; 626 + 627 + if (!info->driver || !(info->flags & DRM_VIRTUAL_DEVICE)) 628 + continue; 629 + 630 + while ((dev = bus_find_device(&platform_bus_type, NULL, 631 + &info->driver->driver, 632 + (void *)platform_bus_type.match))) { 633 + put_device(dev); 634 + platform_device_unregister(to_platform_device(dev)); 635 + } 627 636 } 628 637 } 629 638 630 639 static int exynos_drm_register_devices(void) 631 640 { 641 + struct platform_device *pdev; 632 642 int i; 633 643 634 - for (i = 0; i < PDEV_COUNT; ++i) { 635 - struct platform_driver *d = exynos_drm_drv_with_simple_dev[i]; 636 - struct platform_device *pdev = 637 - platform_device_register_simple(d->driver.name, -1, 638 - NULL, 0); 644 + for (i = 0; i < ARRAY_SIZE(exynos_drm_drivers); ++i) { 645 + struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 639 646 640 - if (!IS_ERR(pdev)) { 641 - exynos_drm_pdevs[i] = pdev; 647 + if (!info->driver || !(info->flags & DRM_VIRTUAL_DEVICE)) 642 648 continue; 643 - } 644 - while (--i >= 0) { 645 - platform_device_unregister(exynos_drm_pdevs[i]); 646 - exynos_drm_pdevs[i] = NULL; 647 - } 648 649 649 - return PTR_ERR(pdev); 650 + pdev = platform_device_register_simple( 651 + info->driver->driver.name, -1, NULL, 0); 652 + if (IS_ERR(pdev)) 653 + goto fail; 650 654 } 651 655 652 656 return 0; 657 + fail: 658 + exynos_drm_unregister_devices(); 659 + return PTR_ERR(pdev); 653 660 } 654 661 655 - static void exynos_drm_unregister_drivers(struct platform_driver * const *drv, 656 - int count) 662 + static void exynos_drm_unregister_drivers(void) 657 663 { 658 - while (--count >= 0) 659 - platform_driver_unregister(drv[count]); 664 + int i; 665 + 666 + for (i = ARRAY_SIZE(exynos_drm_drivers) - 1; i >= 0; --i) { 667 + struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 668 + 669 + if (!info->driver) 670 + continue; 671 + 672 + platform_driver_unregister(info->driver); 673 + } 660 674 } 661 675 662 - static int exynos_drm_register_drivers(struct platform_driver * const *drv, 663 - int count) 676 + static int exynos_drm_register_drivers(void) 664 677 { 665 678 int i, ret; 666 679 667 - for (i = 0; i < count; ++i) { 668 - ret = platform_driver_register(drv[i]); 669 - if (!ret) 680 + for (i = 0; i < ARRAY_SIZE(exynos_drm_drivers); ++i) { 681 + struct exynos_drm_driver_info *info = &exynos_drm_drivers[i]; 682 + 683 + if (!info->driver) 670 684 continue; 671 685 672 - while (--i >= 0) 673 - platform_driver_unregister(drv[i]); 674 - 675 - return ret; 686 + ret = platform_driver_register(info->driver); 687 + if (ret) 688 + goto fail; 676 689 } 677 - 678 690 return 0; 679 - } 680 - 681 - static inline int exynos_drm_register_kms_drivers(void) 682 - { 683 - return exynos_drm_register_drivers(exynos_drm_kms_drivers, 684 - ARRAY_SIZE(exynos_drm_kms_drivers)); 685 - } 686 - 687 - static inline int exynos_drm_register_non_kms_drivers(void) 688 - { 689 - return exynos_drm_register_drivers(exynos_drm_non_kms_drivers, 690 - ARRAY_SIZE(exynos_drm_non_kms_drivers)); 691 - } 692 - 693 - static inline void exynos_drm_unregister_kms_drivers(void) 694 - { 695 - exynos_drm_unregister_drivers(exynos_drm_kms_drivers, 696 - ARRAY_SIZE(exynos_drm_kms_drivers)); 697 - } 698 - 699 - static inline void exynos_drm_unregister_non_kms_drivers(void) 700 - { 701 - exynos_drm_unregister_drivers(exynos_drm_non_kms_drivers, 702 - ARRAY_SIZE(exynos_drm_non_kms_drivers)); 691 + fail: 692 + exynos_drm_unregister_drivers(); 693 + return ret; 703 694 } 704 695 705 696 static int exynos_drm_init(void) ··· 700 711 if (ret) 701 712 return ret; 702 713 703 - ret = exynos_drm_register_kms_drivers(); 714 + ret = exynos_drm_register_drivers(); 704 715 if (ret) 705 716 goto err_unregister_pdevs; 706 717 707 - ret = exynos_drm_register_non_kms_drivers(); 708 - if (ret) 709 - goto err_unregister_kms_drivers; 710 - 711 718 return 0; 712 - 713 - err_unregister_kms_drivers: 714 - exynos_drm_unregister_kms_drivers(); 715 719 716 720 err_unregister_pdevs: 717 721 exynos_drm_unregister_devices(); ··· 714 732 715 733 static void exynos_drm_exit(void) 716 734 { 717 - exynos_drm_unregister_non_kms_drivers(); 718 - exynos_drm_unregister_kms_drivers(); 735 + exynos_drm_unregister_drivers(); 719 736 exynos_drm_unregister_devices(); 720 737 } 721 738
-1
drivers/gpu/drm/exynos/exynos_drm_drv.h
··· 297 297 extern struct platform_driver dsi_driver; 298 298 extern struct platform_driver mixer_driver; 299 299 extern struct platform_driver hdmi_driver; 300 - extern struct platform_driver exynos_drm_common_hdmi_driver; 301 300 extern struct platform_driver vidi_driver; 302 301 extern struct platform_driver g2d_driver; 303 302 extern struct platform_driver fimc_driver;