diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2011-02-22 22:13:26 -0500 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2011-02-28 15:22:43 -0500 |
commit | 55f19d56742a7b544e80b47339c17bfcfd0ff3b4 (patch) | |
tree | 49a576776b7da7535245de3938d93c9c4f04c91c /drivers/char | |
parent | a1e9c9dd3383e6a1a762464ad604b1081774dbda (diff) |
dt: xilinx_hwicap: merge platform and of_platform driver bindings
of_platform_driver is getting removed, and a single platform_driver
can now support both devicetree and non-devicetree use cases. This
patch merges the two driver registrations.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/xilinx_hwicap/xilinx_hwicap.c | 129 |
1 files changed, 47 insertions, 82 deletions
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c index 9f2272e6de1c..d3c9d755ed98 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | |||
@@ -714,20 +714,29 @@ static int __devexit hwicap_remove(struct device *dev) | |||
714 | return 0; /* success */ | 714 | return 0; /* success */ |
715 | } | 715 | } |
716 | 716 | ||
717 | static int __devinit hwicap_drv_probe(struct platform_device *pdev) | 717 | #ifdef CONFIG_OF |
718 | static int __devinit hwicap_of_probe(struct platform_device *op) | ||
718 | { | 719 | { |
719 | struct resource *res; | 720 | struct resource res; |
720 | const struct config_registers *regs; | 721 | const unsigned int *id; |
721 | const char *family; | 722 | const char *family; |
723 | int rc; | ||
724 | const struct hwicap_driver_config *config = op->dev.of_match->data; | ||
725 | const struct config_registers *regs; | ||
722 | 726 | ||
723 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 727 | |
724 | if (!res) | 728 | rc = of_address_to_resource(op->dev.of_node, 0, &res); |
725 | return -ENODEV; | 729 | if (rc) { |
730 | dev_err(&op->dev, "invalid address\n"); | ||
731 | return rc; | ||
732 | } | ||
733 | |||
734 | id = of_get_property(op->dev.of_node, "port-number", NULL); | ||
726 | 735 | ||
727 | /* It's most likely that we're using V4, if the family is not | 736 | /* It's most likely that we're using V4, if the family is not |
728 | specified */ | 737 | specified */ |
729 | regs = &v4_config_registers; | 738 | regs = &v4_config_registers; |
730 | family = pdev->dev.platform_data; | 739 | family = of_get_property(op->dev.of_node, "xlnx,family", NULL); |
731 | 740 | ||
732 | if (family) { | 741 | if (family) { |
733 | if (!strcmp(family, "virtex2p")) { | 742 | if (!strcmp(family, "virtex2p")) { |
@@ -738,54 +747,33 @@ static int __devinit hwicap_drv_probe(struct platform_device *pdev) | |||
738 | regs = &v5_config_registers; | 747 | regs = &v5_config_registers; |
739 | } | 748 | } |
740 | } | 749 | } |
741 | 750 | return hwicap_setup(&op->dev, id ? *id : -1, &res, config, | |
742 | return hwicap_setup(&pdev->dev, pdev->id, res, | 751 | regs); |
743 | &buffer_icap_config, regs); | ||
744 | } | 752 | } |
745 | 753 | #else | |
746 | static int __devexit hwicap_drv_remove(struct platform_device *pdev) | 754 | static inline int hwicap_of_probe(struct platform_device *op) |
747 | { | 755 | { |
748 | return hwicap_remove(&pdev->dev); | 756 | return -EINVAL; |
749 | } | 757 | } |
758 | #endif /* CONFIG_OF */ | ||
750 | 759 | ||
751 | static struct platform_driver hwicap_platform_driver = { | 760 | static int __devinit hwicap_drv_probe(struct platform_device *pdev) |
752 | .probe = hwicap_drv_probe, | ||
753 | .remove = hwicap_drv_remove, | ||
754 | .driver = { | ||
755 | .owner = THIS_MODULE, | ||
756 | .name = DRIVER_NAME, | ||
757 | }, | ||
758 | }; | ||
759 | |||
760 | /* --------------------------------------------------------------------- | ||
761 | * OF bus binding | ||
762 | */ | ||
763 | |||
764 | #if defined(CONFIG_OF) | ||
765 | static int __devinit | ||
766 | hwicap_of_probe(struct platform_device *op, const struct of_device_id *match) | ||
767 | { | 761 | { |
768 | struct resource res; | 762 | struct resource *res; |
769 | const unsigned int *id; | ||
770 | const char *family; | ||
771 | int rc; | ||
772 | const struct hwicap_driver_config *config = match->data; | ||
773 | const struct config_registers *regs; | 763 | const struct config_registers *regs; |
764 | const char *family; | ||
774 | 765 | ||
775 | dev_dbg(&op->dev, "hwicap_of_probe(%p, %p)\n", op, match); | 766 | if (pdev->dev.of_match) |
776 | 767 | return hwicap_of_probe(pdev); | |
777 | rc = of_address_to_resource(op->dev.of_node, 0, &res); | ||
778 | if (rc) { | ||
779 | dev_err(&op->dev, "invalid address\n"); | ||
780 | return rc; | ||
781 | } | ||
782 | 768 | ||
783 | id = of_get_property(op->dev.of_node, "port-number", NULL); | 769 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
770 | if (!res) | ||
771 | return -ENODEV; | ||
784 | 772 | ||
785 | /* It's most likely that we're using V4, if the family is not | 773 | /* It's most likely that we're using V4, if the family is not |
786 | specified */ | 774 | specified */ |
787 | regs = &v4_config_registers; | 775 | regs = &v4_config_registers; |
788 | family = of_get_property(op->dev.of_node, "xlnx,family", NULL); | 776 | family = pdev->dev.platform_data; |
789 | 777 | ||
790 | if (family) { | 778 | if (family) { |
791 | if (!strcmp(family, "virtex2p")) { | 779 | if (!strcmp(family, "virtex2p")) { |
@@ -796,50 +784,38 @@ hwicap_of_probe(struct platform_device *op, const struct of_device_id *match) | |||
796 | regs = &v5_config_registers; | 784 | regs = &v5_config_registers; |
797 | } | 785 | } |
798 | } | 786 | } |
799 | return hwicap_setup(&op->dev, id ? *id : -1, &res, config, | 787 | |
800 | regs); | 788 | return hwicap_setup(&pdev->dev, pdev->id, res, |
789 | &buffer_icap_config, regs); | ||
801 | } | 790 | } |
802 | 791 | ||
803 | static int __devexit hwicap_of_remove(struct platform_device *op) | 792 | static int __devexit hwicap_drv_remove(struct platform_device *pdev) |
804 | { | 793 | { |
805 | return hwicap_remove(&op->dev); | 794 | return hwicap_remove(&pdev->dev); |
806 | } | 795 | } |
807 | 796 | ||
808 | /* Match table for of_platform binding */ | 797 | #ifdef CONFIG_OF |
798 | /* Match table for device tree binding */ | ||
809 | static const struct of_device_id __devinitconst hwicap_of_match[] = { | 799 | static const struct of_device_id __devinitconst hwicap_of_match[] = { |
810 | { .compatible = "xlnx,opb-hwicap-1.00.b", .data = &buffer_icap_config}, | 800 | { .compatible = "xlnx,opb-hwicap-1.00.b", .data = &buffer_icap_config}, |
811 | { .compatible = "xlnx,xps-hwicap-1.00.a", .data = &fifo_icap_config}, | 801 | { .compatible = "xlnx,xps-hwicap-1.00.a", .data = &fifo_icap_config}, |
812 | {}, | 802 | {}, |
813 | }; | 803 | }; |
814 | MODULE_DEVICE_TABLE(of, hwicap_of_match); | 804 | MODULE_DEVICE_TABLE(of, hwicap_of_match); |
805 | #else | ||
806 | #define hwicap_of_match NULL | ||
807 | #endif | ||
815 | 808 | ||
816 | static struct of_platform_driver hwicap_of_driver = { | 809 | static struct platform_driver hwicap_platform_driver = { |
817 | .probe = hwicap_of_probe, | 810 | .probe = hwicap_drv_probe, |
818 | .remove = __devexit_p(hwicap_of_remove), | 811 | .remove = hwicap_drv_remove, |
819 | .driver = { | 812 | .driver = { |
820 | .name = DRIVER_NAME, | ||
821 | .owner = THIS_MODULE, | 813 | .owner = THIS_MODULE, |
814 | .name = DRIVER_NAME, | ||
822 | .of_match_table = hwicap_of_match, | 815 | .of_match_table = hwicap_of_match, |
823 | }, | 816 | }, |
824 | }; | 817 | }; |
825 | 818 | ||
826 | /* Registration helpers to keep the number of #ifdefs to a minimum */ | ||
827 | static inline int __init hwicap_of_register(void) | ||
828 | { | ||
829 | pr_debug("hwicap: calling of_register_platform_driver()\n"); | ||
830 | return of_register_platform_driver(&hwicap_of_driver); | ||
831 | } | ||
832 | |||
833 | static inline void __exit hwicap_of_unregister(void) | ||
834 | { | ||
835 | of_unregister_platform_driver(&hwicap_of_driver); | ||
836 | } | ||
837 | #else /* CONFIG_OF */ | ||
838 | /* CONFIG_OF not enabled; do nothing helpers */ | ||
839 | static inline int __init hwicap_of_register(void) { return 0; } | ||
840 | static inline void __exit hwicap_of_unregister(void) { } | ||
841 | #endif /* CONFIG_OF */ | ||
842 | |||
843 | static int __init hwicap_module_init(void) | 819 | static int __init hwicap_module_init(void) |
844 | { | 820 | { |
845 | dev_t devt; | 821 | dev_t devt; |
@@ -856,21 +832,12 @@ static int __init hwicap_module_init(void) | |||
856 | return retval; | 832 | return retval; |
857 | 833 | ||
858 | retval = platform_driver_register(&hwicap_platform_driver); | 834 | retval = platform_driver_register(&hwicap_platform_driver); |
859 | |||
860 | if (retval) | ||
861 | goto failed1; | ||
862 | |||
863 | retval = hwicap_of_register(); | ||
864 | |||
865 | if (retval) | 835 | if (retval) |
866 | goto failed2; | 836 | goto failed; |
867 | 837 | ||
868 | return retval; | 838 | return retval; |
869 | 839 | ||
870 | failed2: | 840 | failed: |
871 | platform_driver_unregister(&hwicap_platform_driver); | ||
872 | |||
873 | failed1: | ||
874 | unregister_chrdev_region(devt, HWICAP_DEVICES); | 841 | unregister_chrdev_region(devt, HWICAP_DEVICES); |
875 | 842 | ||
876 | return retval; | 843 | return retval; |
@@ -884,8 +851,6 @@ static void __exit hwicap_module_cleanup(void) | |||
884 | 851 | ||
885 | platform_driver_unregister(&hwicap_platform_driver); | 852 | platform_driver_unregister(&hwicap_platform_driver); |
886 | 853 | ||
887 | hwicap_of_unregister(); | ||
888 | |||
889 | unregister_chrdev_region(devt, HWICAP_DEVICES); | 854 | unregister_chrdev_region(devt, HWICAP_DEVICES); |
890 | } | 855 | } |
891 | 856 | ||