diff options
-rw-r--r-- | drivers/video/skeletonfb.c | 195 |
1 files changed, 142 insertions, 53 deletions
diff --git a/drivers/video/skeletonfb.c b/drivers/video/skeletonfb.c index bb96cb65fdaa..9fda5b5d64dd 100644 --- a/drivers/video/skeletonfb.c +++ b/drivers/video/skeletonfb.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/delay.h> | 51 | #include <linux/delay.h> |
52 | #include <linux/fb.h> | 52 | #include <linux/fb.h> |
53 | #include <linux/init.h> | 53 | #include <linux/init.h> |
54 | #include <linux/pci.h> | ||
54 | 55 | ||
55 | /* | 56 | /* |
56 | * This is just simple sample code. | 57 | * This is just simple sample code. |
@@ -60,6 +61,11 @@ | |||
60 | */ | 61 | */ |
61 | 62 | ||
62 | /* | 63 | /* |
64 | * Driver data | ||
65 | */ | ||
66 | static char *mode_option __devinitdata; | ||
67 | |||
68 | /* | ||
63 | * If your driver supports multiple boards, you should make the | 69 | * If your driver supports multiple boards, you should make the |
64 | * below data types arrays, or allocate them dynamically (using kmalloc()). | 70 | * below data types arrays, or allocate them dynamically (using kmalloc()). |
65 | */ | 71 | */ |
@@ -278,7 +284,7 @@ static int xxxfb_set_par(struct fb_info *info) | |||
278 | */ | 284 | */ |
279 | static int xxxfb_setcolreg(unsigned regno, unsigned red, unsigned green, | 285 | static int xxxfb_setcolreg(unsigned regno, unsigned red, unsigned green, |
280 | unsigned blue, unsigned transp, | 286 | unsigned blue, unsigned transp, |
281 | const struct fb_info *info) | 287 | struct fb_info *info) |
282 | { | 288 | { |
283 | if (regno >= 256) /* no. of hw registers */ | 289 | if (regno >= 256) /* no. of hw registers */ |
284 | return -EINVAL; | 290 | return -EINVAL; |
@@ -416,7 +422,7 @@ static int xxxfb_setcolreg(unsigned regno, unsigned red, unsigned green, | |||
416 | * Returns negative errno on error, or zero on success. | 422 | * Returns negative errno on error, or zero on success. |
417 | */ | 423 | */ |
418 | static int xxxfb_pan_display(struct fb_var_screeninfo *var, | 424 | static int xxxfb_pan_display(struct fb_var_screeninfo *var, |
419 | const struct fb_info *info) | 425 | struct fb_info *info) |
420 | { | 426 | { |
421 | /* | 427 | /* |
422 | * If your hardware does not support panning, _do_ _not_ implement this | 428 | * If your hardware does not support panning, _do_ _not_ implement this |
@@ -454,7 +460,7 @@ static int xxxfb_pan_display(struct fb_var_screeninfo *var, | |||
454 | * Return !0 for any modes that are unimplemented. | 460 | * Return !0 for any modes that are unimplemented. |
455 | * | 461 | * |
456 | */ | 462 | */ |
457 | static int xxxfb_blank(int blank_mode, const struct fb_info *info) | 463 | static int xxxfb_blank(int blank_mode, struct fb_info *info) |
458 | { | 464 | { |
459 | /* ... */ | 465 | /* ... */ |
460 | return 0; | 466 | return 0; |
@@ -483,7 +489,7 @@ static int xxxfb_blank(int blank_mode, const struct fb_info *info) | |||
483 | * depending on the rastering operation with the value of color which | 489 | * depending on the rastering operation with the value of color which |
484 | * is in the current color depth format. | 490 | * is in the current color depth format. |
485 | */ | 491 | */ |
486 | void xxfb_fillrect(struct fb_info *p, const struct fb_fillrect *region) | 492 | void xxxfb_fillrect(struct fb_info *p, const struct fb_fillrect *region) |
487 | { | 493 | { |
488 | /* Meaning of struct fb_fillrect | 494 | /* Meaning of struct fb_fillrect |
489 | * | 495 | * |
@@ -647,21 +653,50 @@ void xxxfb_poll(struct fb_info *info, poll_table *wait) | |||
647 | * If the driver has implemented its own hardware-based drawing function, | 653 | * If the driver has implemented its own hardware-based drawing function, |
648 | * implementing this function is highly recommended. | 654 | * implementing this function is highly recommended. |
649 | */ | 655 | */ |
650 | void xxxfb_sync(struct fb_info *info) | 656 | int xxxfb_sync(struct fb_info *info) |
651 | { | 657 | { |
658 | return 0; | ||
652 | } | 659 | } |
653 | 660 | ||
654 | /* | 661 | /* |
662 | * Frame buffer operations | ||
663 | */ | ||
664 | |||
665 | static struct fb_ops xxxfb_ops = { | ||
666 | .owner = THIS_MODULE, | ||
667 | .fb_open = xxxfb_open, | ||
668 | .fb_read = xxxfb_read, | ||
669 | .fb_write = xxxfb_write, | ||
670 | .fb_release = xxxfb_release, | ||
671 | .fb_check_var = xxxfb_check_var, | ||
672 | .fb_set_par = xxxfb_set_par, | ||
673 | .fb_setcolreg = xxxfb_setcolreg, | ||
674 | .fb_blank = xxxfb_blank, | ||
675 | .fb_pan_display = xxxfb_pan_display, | ||
676 | .fb_fillrect = xxxfb_fillrect, /* Needed !!! */ | ||
677 | .fb_copyarea = xxxfb_copyarea, /* Needed !!! */ | ||
678 | .fb_imageblit = xxxfb_imageblit, /* Needed !!! */ | ||
679 | .fb_cursor = xxxfb_cursor, /* Optional !!! */ | ||
680 | .fb_rotate = xxxfb_rotate, | ||
681 | .fb_poll = xxxfb_poll, | ||
682 | .fb_sync = xxxfb_sync, | ||
683 | .fb_ioctl = xxxfb_ioctl, | ||
684 | .fb_mmap = xxxfb_mmap, | ||
685 | }; | ||
686 | |||
687 | /* ------------------------------------------------------------------------- */ | ||
688 | |||
689 | /* | ||
655 | * Initialization | 690 | * Initialization |
656 | */ | 691 | */ |
657 | 692 | ||
658 | /* static int __init xxfb_probe (struct device *device) -- for platform devs */ | 693 | /* static int __init xxfb_probe (struct device *device) -- for platform devs */ |
659 | static int __init xxxfb_probe(struct pci_dev *dev, | 694 | static int __devinit xxxfb_probe(struct pci_dev *dev, |
660 | const_struct pci_device_id *ent) | 695 | const_struct pci_device_id *ent) |
661 | { | 696 | { |
662 | struct fb_info *info; | 697 | struct fb_info *info; |
663 | struct xxx_par *par; | 698 | struct xxx_par *par; |
664 | struct device = &dev->dev; /* for pci drivers */ | 699 | struct device* device = &dev->dev; /* for pci drivers */ |
665 | int cmap_len, retval; | 700 | int cmap_len, retval; |
666 | 701 | ||
667 | /* | 702 | /* |
@@ -760,7 +795,7 @@ static int __init xxxfb_probe(struct pci_dev *dev, | |||
760 | * | 795 | * |
761 | * NOTE: This field is currently unused. | 796 | * NOTE: This field is currently unused. |
762 | */ | 797 | */ |
763 | info->pixmap.scan_align = 32 | 798 | info->pixmap.scan_align = 32; |
764 | /***************************** End optional stage ***************************/ | 799 | /***************************** End optional stage ***************************/ |
765 | 800 | ||
766 | /* | 801 | /* |
@@ -770,13 +805,13 @@ static int __init xxxfb_probe(struct pci_dev *dev, | |||
770 | if (!mode_option) | 805 | if (!mode_option) |
771 | mode_option = "640x480@60"; | 806 | mode_option = "640x480@60"; |
772 | 807 | ||
773 | retval = fb_find_mode(info->var, info, mode_option, NULL, 0, NULL, 8); | 808 | retval = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, 8); |
774 | 809 | ||
775 | if (!retval || retval == 4) | 810 | if (!retval || retval == 4) |
776 | return -EINVAL; | 811 | return -EINVAL; |
777 | 812 | ||
778 | /* This has to been done !!! */ | 813 | /* This has to been done !!! */ |
779 | fb_alloc_cmap(info->cmap, cmap_len, 0); | 814 | fb_alloc_cmap(&info->cmap, cmap_len, 0); |
780 | 815 | ||
781 | /* | 816 | /* |
782 | * The following is done in the case of having hardware with a static | 817 | * The following is done in the case of having hardware with a static |
@@ -811,15 +846,15 @@ static int __init xxxfb_probe(struct pci_dev *dev, | |||
811 | /* | 846 | /* |
812 | * Cleanup | 847 | * Cleanup |
813 | */ | 848 | */ |
814 | /* static void __exit xxxfb_remove(struct device *device) */ | 849 | /* static void __devexit xxxfb_remove(struct device *device) */ |
815 | static void __exit xxxfb_remove(struct pci_dev *dev) | 850 | static void __devexit xxxfb_remove(struct pci_dev *dev) |
816 | { | 851 | { |
817 | struct fb_info *info = pci_get_drv_data(dev); | 852 | struct fb_info *info = pci_get_drvdata(dev); |
818 | /* or dev_get_drv_data(device); */ | 853 | /* or dev_get_drvdata(device); */ |
819 | 854 | ||
820 | if (info) { | 855 | if (info) { |
821 | unregister_framebuffer(info); | 856 | unregister_framebuffer(info); |
822 | fb_dealloc_cmap(&info.cmap); | 857 | fb_dealloc_cmap(&info->cmap); |
823 | /* ... */ | 858 | /* ... */ |
824 | framebuffer_release(info); | 859 | framebuffer_release(info); |
825 | } | 860 | } |
@@ -827,18 +862,61 @@ static void __exit xxxfb_remove(struct pci_dev *dev) | |||
827 | return 0; | 862 | return 0; |
828 | } | 863 | } |
829 | 864 | ||
830 | #if CONFIG_PCI | 865 | #ifdef CONFIG_PCI |
866 | #ifdef CONFIG_PM | ||
867 | /** | ||
868 | * xxxfb_suspend - Optional but recommended function. Suspend the device. | ||
869 | * @dev: PCI device | ||
870 | * @msg: the suspend event code. | ||
871 | * | ||
872 | * See Documentation/power/devices.txt for more information | ||
873 | */ | ||
874 | static int xxxfb_suspend(struct pci_dev *dev, pm_message_t msg) | ||
875 | { | ||
876 | struct fb_info *info = pci_get_drvdata(dev); | ||
877 | struct xxxfb_par *par = info->par; | ||
878 | |||
879 | /* suspend here */ | ||
880 | return 0; | ||
881 | } | ||
882 | |||
883 | /** | ||
884 | * xxxfb_resume - Optional but recommended function. Resume the device. | ||
885 | * @dev: PCI device | ||
886 | * | ||
887 | * See Documentation/power/devices.txt for more information | ||
888 | */ | ||
889 | static int xxxfb_resume(struct pci_dev *dev) | ||
890 | { | ||
891 | struct fb_info *info = pci_get_drvdata(dev); | ||
892 | struct xxxfb_par *par = info->par; | ||
893 | |||
894 | /* resume here */ | ||
895 | return 0; | ||
896 | } | ||
897 | #else | ||
898 | #define xxxfb_suspend NULL | ||
899 | #define xxxfb_resume NULL | ||
900 | #endif /* CONFIG_PM */ | ||
901 | |||
902 | static struct pci_device_id xxxfb_id_table[] = { | ||
903 | { PCI_VENDOR_ID_XXX, PCI_DEVICE_ID_XXX, | ||
904 | PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16, | ||
905 | ADDR, 0 }, | ||
906 | { 0, } | ||
907 | }; | ||
908 | |||
831 | /* For PCI drivers */ | 909 | /* For PCI drivers */ |
832 | static struct pci_driver xxxfb_driver = { | 910 | static struct pci_driver xxxfb_driver = { |
833 | .name = "xxxfb", | 911 | .name = "xxxfb", |
834 | .id_table = xxxfb_devices, | 912 | .id_table = xxxfb_id_table, |
835 | .probe = xxxfb_probe, | 913 | .probe = xxxfb_probe, |
836 | .remove = __devexit_p(xxxfb_remove), | 914 | .remove = __devexit_p(xxxfb_remove), |
837 | .suspend = xxxfb_suspend, /* optional */ | 915 | .suspend = xxxfb_suspend, /* optional but recommended */ |
838 | .resume = xxxfb_resume, /* optional */ | 916 | .resume = xxxfb_resume, /* optional but recommended */ |
839 | }; | 917 | }; |
840 | 918 | ||
841 | static int __init xxxfb_init(void) | 919 | int __init xxxfb_init(void) |
842 | { | 920 | { |
843 | /* | 921 | /* |
844 | * For kernel boot options (in 'video=xxxfb:<options>' format) | 922 | * For kernel boot options (in 'video=xxxfb:<options>' format) |
@@ -858,16 +936,53 @@ static void __exit xxxfb_exit(void) | |||
858 | { | 936 | { |
859 | pci_unregister_driver(&xxxfb_driver); | 937 | pci_unregister_driver(&xxxfb_driver); |
860 | } | 938 | } |
861 | #else | 939 | #else /* non PCI, platform drivers */ |
862 | #include <linux/platform_device.h> | 940 | #include <linux/platform_device.h> |
863 | /* for platform devices */ | 941 | /* for platform devices */ |
942 | |||
943 | #ifdef CONFIG_PM | ||
944 | /** | ||
945 | * xxxfb_suspend - Optional but recommended function. Suspend the device. | ||
946 | * @dev: platform device | ||
947 | * @msg: the suspend event code. | ||
948 | * | ||
949 | * See Documentation/power/devices.txt for more information | ||
950 | */ | ||
951 | static int xxxfb_suspend(struct platform_device *dev, pm_message_t msg) | ||
952 | { | ||
953 | struct fb_info *info = platform_get_drvdata(dev); | ||
954 | struct xxxfb_par *par = info->par; | ||
955 | |||
956 | /* suspend here */ | ||
957 | return 0; | ||
958 | } | ||
959 | |||
960 | /** | ||
961 | * xxxfb_resume - Optional but recommended function. Resume the device. | ||
962 | * @dev: PCI device | ||
963 | * | ||
964 | * See Documentation/power/devices.txt for more information | ||
965 | */ | ||
966 | static int xxxfb_suspend(struct platform_dev *dev) | ||
967 | { | ||
968 | struct fb_info *info = platform_get_drvdata(dev); | ||
969 | struct xxxfb_par *par = info->par; | ||
970 | |||
971 | /* resume here */ | ||
972 | return 0; | ||
973 | } | ||
974 | #else | ||
975 | #define xxxfb_suspend NULL | ||
976 | #define xxxfb_resume NULL | ||
977 | #endif /* CONFIG_PM */ | ||
978 | |||
864 | static struct device_driver xxxfb_driver = { | 979 | static struct device_driver xxxfb_driver = { |
865 | .name = "xxxfb", | 980 | .name = "xxxfb", |
866 | .bus = &platform_bus_type, | 981 | .bus = &platform_bus_type, |
867 | .probe = xxxfb_probe, | 982 | .probe = xxxfb_probe, |
868 | .remove = xxxfb_remove, | 983 | .remove = xxxfb_remove, |
869 | .suspend = xxxfb_suspend, /* optional */ | 984 | .suspend = xxxfb_suspend, /* optional but recommended */ |
870 | .resume = xxxfb_resume, /* optional */ | 985 | .resume = xxxfb_resume, /* optional but recommended */ |
871 | }; | 986 | }; |
872 | 987 | ||
873 | static struct platform_device xxxfb_device = { | 988 | static struct platform_device xxxfb_device = { |
@@ -903,8 +1018,9 @@ static void __exit xxxfb_exit(void) | |||
903 | platform_device_unregister(&xxxfb_device); | 1018 | platform_device_unregister(&xxxfb_device); |
904 | driver_unregister(&xxxfb_driver); | 1019 | driver_unregister(&xxxfb_driver); |
905 | } | 1020 | } |
906 | #endif | 1021 | #endif /* CONFIG_PCI */ |
907 | 1022 | ||
1023 | #ifdef MODULE | ||
908 | /* | 1024 | /* |
909 | * Setup | 1025 | * Setup |
910 | */ | 1026 | */ |
@@ -917,34 +1033,7 @@ int __init xxxfb_setup(char *options) | |||
917 | { | 1033 | { |
918 | /* Parse user speficied options (`video=xxxfb:') */ | 1034 | /* Parse user speficied options (`video=xxxfb:') */ |
919 | } | 1035 | } |
920 | 1036 | #endif /* MODULE *? | |
921 | /* ------------------------------------------------------------------------- */ | ||
922 | |||
923 | /* | ||
924 | * Frame buffer operations | ||
925 | */ | ||
926 | |||
927 | static struct fb_ops xxxfb_ops = { | ||
928 | .owner = THIS_MODULE, | ||
929 | .fb_open = xxxfb_open, | ||
930 | .fb_read = xxxfb_read, | ||
931 | .fb_write = xxxfb_write, | ||
932 | .fb_release = xxxfb_release, | ||
933 | .fb_check_var = xxxfb_check_var, | ||
934 | .fb_set_par = xxxfb_set_par, | ||
935 | .fb_setcolreg = xxxfb_setcolreg, | ||
936 | .fb_blank = xxxfb_blank, | ||
937 | .fb_pan_display = xxxfb_pan_display, | ||
938 | .fb_fillrect = xxxfb_fillrect, /* Needed !!! */ | ||
939 | .fb_copyarea = xxxfb_copyarea, /* Needed !!! */ | ||
940 | .fb_imageblit = xxxfb_imageblit, /* Needed !!! */ | ||
941 | .fb_cursor = xxxfb_cursor, /* Optional !!! */ | ||
942 | .fb_rotate = xxxfb_rotate, | ||
943 | .fb_poll = xxxfb_poll, | ||
944 | .fb_sync = xxxfb_sync, | ||
945 | .fb_ioctl = xxxfb_ioctl, | ||
946 | .fb_mmap = xxxfb_mmap, | ||
947 | }; | ||
948 | 1037 | ||
949 | /* ------------------------------------------------------------------------- */ | 1038 | /* ------------------------------------------------------------------------- */ |
950 | 1039 | ||
@@ -954,6 +1043,6 @@ static struct fb_ops xxxfb_ops = { | |||
954 | */ | 1043 | */ |
955 | 1044 | ||
956 | module_init(xxxfb_init); | 1045 | module_init(xxxfb_init); |
957 | module_exit(xxxfb_cleanup); | 1046 | module_exit(xxxfb_remove); |
958 | 1047 | ||
959 | MODULE_LICENSE("GPL"); | 1048 | MODULE_LICENSE("GPL"); |