Commit 2d280f758b2044151cb77fdd9c59d1903bbb6a19

Authored by Harald Welte
Committed by Linus Torvalds
1 parent 3a32456909

viafb: make viafb a first-class citizen using pci_driver

Signed-off-by: Harald Welte <HaraldWelte@viatech.com>
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: Scott Fang <ScottFang@viatech.com.cn>
Cc: Joseph Chan <JosephChan@via.com.tw>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 3 changed files with 56 additions and 116 deletions Side-by-side Diff

drivers/video/via/hw.c
... ... @@ -21,22 +21,6 @@
21 21  
22 22 #include "global.h"
23 23  
24   -static const struct pci_device_id_info pciidlist[] = {
25   - {PCI_VIA_VENDOR_ID, UNICHROME_CLE266_DID, UNICHROME_CLE266},
26   - {PCI_VIA_VENDOR_ID, UNICHROME_PM800_DID, UNICHROME_PM800},
27   - {PCI_VIA_VENDOR_ID, UNICHROME_K400_DID, UNICHROME_K400},
28   - {PCI_VIA_VENDOR_ID, UNICHROME_K800_DID, UNICHROME_K800},
29   - {PCI_VIA_VENDOR_ID, UNICHROME_CN700_DID, UNICHROME_CN700},
30   - {PCI_VIA_VENDOR_ID, UNICHROME_P4M890_DID, UNICHROME_P4M890},
31   - {PCI_VIA_VENDOR_ID, UNICHROME_K8M890_DID, UNICHROME_K8M890},
32   - {PCI_VIA_VENDOR_ID, UNICHROME_CX700_DID, UNICHROME_CX700},
33   - {PCI_VIA_VENDOR_ID, UNICHROME_P4M900_DID, UNICHROME_P4M900},
34   - {PCI_VIA_VENDOR_ID, UNICHROME_CN750_DID, UNICHROME_CN750},
35   - {PCI_VIA_VENDOR_ID, UNICHROME_VX800_DID, UNICHROME_VX800},
36   - {PCI_VIA_VENDOR_ID, UNICHROME_VX855_DID, UNICHROME_VX855},
37   - {0, 0, 0}
38   -};
39   -
40 24 static struct pll_map pll_value[] = {
41 25 {CLK_25_175M, CLE266_PLL_25_175M, K800_PLL_25_175M,
42 26 CX700_25_175M, VX855_25_175M},
... ... @@ -542,7 +526,8 @@
542 526 static void set_lcd_output_path(int set_iga, int output_interface);
543 527 static int search_mode_setting(int ModeInfoIndex);
544 528 static void load_fix_bit_crtc_reg(void);
545   -static void init_gfx_chip_info(void);
  529 +static void init_gfx_chip_info(struct pci_dev *pdev,
  530 + const struct pci_device_id *pdi);
546 531 static void init_tmds_chip_info(void);
547 532 static void init_lvds_chip_info(void);
548 533 static void device_screen_off(void);
... ... @@ -552,7 +537,6 @@
552 537 static void device_on(void);
553 538 static void enable_second_display_channel(void);
554 539 static void disable_second_display_channel(void);
555   -static int get_fb_size_from_pci(void);
556 540  
557 541 void viafb_write_reg(u8 index, u16 io_port, u8 data)
558 542 {
559 543  
... ... @@ -1937,9 +1921,10 @@
1937 1921  
1938 1922 }
1939 1923  
1940   -void viafb_init_chip_info(void)
  1924 +void viafb_init_chip_info(struct pci_dev *pdev,
  1925 + const struct pci_device_id *pdi)
1941 1926 {
1942   - init_gfx_chip_info();
  1927 + init_gfx_chip_info(pdev, pdi);
1943 1928 init_tmds_chip_info();
1944 1929 init_lvds_chip_info();
1945 1930  
1946 1931  
1947 1932  
1948 1933  
... ... @@ -2012,25 +1997,13 @@
2012 1997 }
2013 1998 }
2014 1999  
2015   -static void init_gfx_chip_info(void)
  2000 +static void init_gfx_chip_info(struct pci_dev *pdev,
  2001 + const struct pci_device_id *pdi)
2016 2002 {
2017   - struct pci_dev *pdev = NULL;
2018   - u32 i;
2019 2003 u8 tmp;
2020 2004  
2021   - /* Indentify GFX Chip Name */
2022   - for (i = 0; pciidlist[i].vendor != 0; i++) {
2023   - pdev = pci_get_device(pciidlist[i].vendor,
2024   - pciidlist[i].device, 0);
2025   - if (pdev)
2026   - break;
2027   - }
  2005 + viaparinfo->chip_info->gfx_chip_name = pdi->driver_data;
2028 2006  
2029   - if (!pciidlist[i].vendor)
2030   - return ;
2031   -
2032   - viaparinfo->chip_info->gfx_chip_name = pciidlist[i].chip_index;
2033   -
2034 2007 /* Check revision of CLE266 Chip */
2035 2008 if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
2036 2009 /* CR4F only define in CLE266.CX chip */
... ... @@ -2060,8 +2033,6 @@
2060 2033 CX700_REVISION_700;
2061 2034 }
2062 2035 }
2063   -
2064   - pci_dev_put(pdev);
2065 2036 }
2066 2037  
2067 2038 static void init_tmds_chip_info(void)
... ... @@ -2554,37 +2525,6 @@
2554 2525 viafb_write_reg_mask(CR36, VIACR, 0x0, BIT5 + BIT4);
2555 2526 }
2556 2527  
2557   -void viafb_get_mmio_info(unsigned long *mmio_base, u32 *mmio_len)
2558   -{
2559   - struct pci_dev *pdev = NULL;
2560   - u32 vendor, device;
2561   - u32 i;
2562   -
2563   - for (i = 0; pciidlist[i].vendor != 0; i++)
2564   - if (viaparinfo->chip_info->gfx_chip_name ==
2565   - pciidlist[i].chip_index)
2566   - break;
2567   -
2568   - if (!pciidlist[i].vendor)
2569   - return ;
2570   -
2571   - vendor = pciidlist[i].vendor;
2572   - device = pciidlist[i].device;
2573   -
2574   - pdev = pci_get_device(vendor, device, NULL);
2575   -
2576   - if (!pdev) {
2577   - *mmio_base = 0;
2578   - *mmio_len = 0;
2579   - return ;
2580   - }
2581   -
2582   - *mmio_base = pci_resource_start(pdev, 1);
2583   - *mmio_len = pci_resource_len(pdev, 1);
2584   -
2585   - pci_dev_put(pdev);
2586   -}
2587   -
2588 2528 static void enable_second_display_channel(void)
2589 2529 {
2590 2530 /* to enable second display channel. */
... ... @@ -2601,44 +2541,7 @@
2601 2541 viafb_write_reg_mask(CR6A, VIACR, BIT6, BIT6);
2602 2542 }
2603 2543  
2604   -void viafb_get_fb_info(unsigned int *fb_base, unsigned int *fb_len)
2605   -{
2606   - struct pci_dev *pdev = NULL;
2607   - u32 vendor, device;
2608   - u32 i;
2609   -
2610   - for (i = 0; pciidlist[i].vendor != 0; i++)
2611   - if (viaparinfo->chip_info->gfx_chip_name ==
2612   - pciidlist[i].chip_index)
2613   - break;
2614   -
2615   - if (!pciidlist[i].vendor)
2616   - return ;
2617   -
2618   - vendor = pciidlist[i].vendor;
2619   - device = pciidlist[i].device;
2620   -
2621   - pdev = pci_get_device(vendor, device, NULL);
2622   -
2623   - if (!pdev) {
2624   - *fb_base = viafb_read_reg(VIASR, SR30) << 24;
2625   - *fb_len = viafb_get_memsize();
2626   - DEBUG_MSG(KERN_INFO "Get FB info from SR30!\n");
2627   - DEBUG_MSG(KERN_INFO "fb_base = %08x\n", *fb_base);
2628   - DEBUG_MSG(KERN_INFO "fb_len = %08x\n", *fb_len);
2629   - return ;
2630   - }
2631   -
2632   - *fb_base = (unsigned int)pci_resource_start(pdev, 0);
2633   - *fb_len = get_fb_size_from_pci();
2634   - DEBUG_MSG(KERN_INFO "Get FB info from PCI system!\n");
2635   - DEBUG_MSG(KERN_INFO "fb_base = %08x\n", *fb_base);
2636   - DEBUG_MSG(KERN_INFO "fb_len = %08x\n", *fb_len);
2637   -
2638   - pci_dev_put(pdev);
2639   -}
2640   -
2641   -static int get_fb_size_from_pci(void)
  2544 +int viafb_get_fb_size_from_pci(void)
2642 2545 {
2643 2546 unsigned long configid, deviceid, FBSize = 0;
2644 2547 int VideoMemSize;
drivers/video/via/hw.h
... ... @@ -901,14 +901,15 @@
901 901 int viafb_setmode(int vmode_index, int hor_res, int ver_res,
902 902 int video_bpp, int vmode_index1, int hor_res1,
903 903 int ver_res1, int video_bpp1);
904   -void viafb_init_chip_info(void);
  904 +void viafb_init_chip_info(struct pci_dev *pdev,
  905 + const struct pci_device_id *pdi);
905 906 void viafb_init_dac(int set_iga);
906 907 int viafb_get_pixclock(int hres, int vres, int vmode_refresh);
907 908 int viafb_get_refresh(int hres, int vres, u32 float_refresh);
908 909 void viafb_update_device_setting(int hres, int vres, int bpp,
909 910 int vmode_refresh, int flag);
910   -void viafb_get_mmio_info(unsigned long *mmio_base, u32 *mmio_len);
911 911  
  912 +int viafb_get_fb_size_from_pci(void);
912 913 void viafb_set_iga_path(void);
913 914 void viafb_set_primary_address(u32 addr);
914 915 void viafb_set_secondary_address(u32 addr);
drivers/video/via/viafbdev.c
... ... @@ -1842,7 +1842,8 @@
1842 1842 *yres = 480;
1843 1843 }
1844 1844  
1845   -static int __devinit via_pci_probe(void)
  1845 +static int __devinit via_pci_probe(struct pci_dev *pdev,
  1846 + const struct pci_device_id *ent)
1846 1847 {
1847 1848 u32 default_xres, default_yres;
1848 1849 int vmode_index;
... ... @@ -1885,8 +1886,9 @@
1885 1886 /* Set up I2C bus stuff */
1886 1887 viafb_create_i2c_bus(viaparinfo);
1887 1888  
1888   - viafb_init_chip_info();
1889   - viafb_get_fb_info(&viaparinfo->fbmem, &viaparinfo->memsize);
  1889 + viafb_init_chip_info(pdev, ent);
  1890 + viaparinfo->fbmem = pci_resource_start(pdev, 0);
  1891 + viaparinfo->memsize = viafb_get_fb_size_from_pci();
1890 1892 viaparinfo->fbmem_free = viaparinfo->memsize;
1891 1893 viaparinfo->fbmem_used = 0;
1892 1894 viafbinfo->screen_base = ioremap_nocache(viaparinfo->fbmem,
... ... @@ -1896,8 +1898,8 @@
1896 1898 return -ENOMEM;
1897 1899 }
1898 1900  
1899   - viafb_get_mmio_info(&viafbinfo->fix.mmio_start,
1900   - &viafbinfo->fix.mmio_len);
  1901 + viafbinfo->fix.mmio_start = pci_resource_start(pdev, 1);
  1902 + viafbinfo->fix.mmio_len = pci_resource_len(pdev, 1);
1901 1903 viafbinfo->node = 0;
1902 1904 viafbinfo->fbops = &viafb_ops;
1903 1905 viafbinfo->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
... ... @@ -2065,7 +2067,7 @@
2065 2067 return 0;
2066 2068 }
2067 2069  
2068   -static void __devexit via_pci_remove(void)
  2070 +static void __devexit via_pci_remove(struct pci_dev *pdev)
2069 2071 {
2070 2072 DEBUG_MSG(KERN_INFO "via_pci_remove!\n");
2071 2073 fb_dealloc_cmap(&viafbinfo->cmap);
... ... @@ -2157,6 +2159,40 @@
2157 2159 }
2158 2160 #endif
2159 2161  
  2162 +static struct pci_device_id viafb_pci_table[] __devinitdata = {
  2163 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CLE266_DID),
  2164 + .driver_data = UNICHROME_CLE266 },
  2165 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_PM800_DID),
  2166 + .driver_data = UNICHROME_PM800 },
  2167 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K400_DID),
  2168 + .driver_data = UNICHROME_K400 },
  2169 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K800_DID),
  2170 + .driver_data = UNICHROME_K800 },
  2171 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_P4M890_DID),
  2172 + .driver_data = UNICHROME_CN700 },
  2173 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K8M890_DID),
  2174 + .driver_data = UNICHROME_K8M890 },
  2175 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CX700_DID),
  2176 + .driver_data = UNICHROME_CX700 },
  2177 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_P4M900_DID),
  2178 + .driver_data = UNICHROME_P4M900 },
  2179 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CN750_DID),
  2180 + .driver_data = UNICHROME_CN750 },
  2181 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_VX800_DID),
  2182 + .driver_data = UNICHROME_VX800 },
  2183 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_VX855_DID),
  2184 + .driver_data = UNICHROME_VX855 },
  2185 + { }
  2186 +};
  2187 +MODULE_DEVICE_TABLE(pci, viafb_pci_table);
  2188 +
  2189 +static struct pci_driver viafb_driver = {
  2190 + .name = "viafb",
  2191 + .id_table = viafb_pci_table,
  2192 + .probe = via_pci_probe,
  2193 + .remove = __devexit_p(via_pci_remove),
  2194 +};
  2195 +
2160 2196 static int __init viafb_init(void)
2161 2197 {
2162 2198 #ifndef MODULE
2163 2199  
... ... @@ -2168,13 +2204,13 @@
2168 2204 printk(KERN_INFO
2169 2205 "VIA Graphics Intergration Chipset framebuffer %d.%d initializing\n",
2170 2206 VERSION_MAJOR, VERSION_MINOR);
2171   - return via_pci_probe();
  2207 + return pci_register_driver(&viafb_driver);
2172 2208 }
2173 2209  
2174 2210 static void __exit viafb_exit(void)
2175 2211 {
2176 2212 DEBUG_MSG(KERN_INFO "viafb_exit!\n");
2177   - via_pci_remove();
  2213 + pci_unregister_driver(&viafb_driver);
2178 2214 }
2179 2215  
2180 2216 static struct fb_ops viafb_ops = {