V4L/DVB (3344c): Pci probing for stradis driver


- Pci probing functions added, some functions were rewritten.

- Use PCI_DEVICE macro.

- dev_ used for printing when pci_dev available.

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

authored by Jiri Slaby and committed by Mauro Carvalho Chehab 9ae82293 d4437d3f

+116 -88
-1
drivers/media/video/saa7146.h
··· 73 73 unsigned int nr; 74 74 unsigned long irq; /* IRQ used by SAA7146 card */ 75 75 unsigned short id; 76 - struct pci_dev *dev; 77 76 unsigned char revision; 78 77 unsigned char boardcfg[64]; /* 64 bytes of config from eeprom */ 79 78 unsigned long saa7146_adr; /* bus address of IO mem from PCI BIOS */
+116 -87
drivers/media/video/stradis.c
··· 1991 1991 .minor = -1, 1992 1992 }; 1993 1993 1994 - static int configure_saa7146(struct pci_dev *dev, int num) 1994 + static int __devinit configure_saa7146(struct pci_dev *pdev, int num) 1995 1995 { 1996 1996 int result; 1997 - struct saa7146 *saa; 1998 - 1999 - saa = &saa7146s[num]; 1997 + struct saa7146 *saa = &saa7146s[num]; 2000 1998 2001 1999 saa->endmarkhead = saa->endmarktail = 0; 2002 2000 saa->win.x = saa->win.y = 0; ··· 2011 2013 saa->picture.contrast = 38768; 2012 2014 saa->picture.colour = 32768; 2013 2015 saa->cap = 0; 2014 - saa->dev = dev; 2015 2016 saa->nr = num; 2016 2017 saa->playmode = VID_PLAY_NORMAL; 2017 2018 memset(saa->boardcfg, 0, 64); /* clear board config area */ ··· 2030 2033 init_waitqueue_head(&saa->vidq); 2031 2034 spin_lock_init(&saa->lock); 2032 2035 2033 - if (pci_enable_device(dev)) 2036 + if (pci_enable_device(pdev)) 2034 2037 return -EIO; 2035 2038 2036 - saa->id = dev->device; 2037 - saa->irq = dev->irq; 2039 + saa->id = pdev->device; 2040 + saa->irq = pdev->irq; 2038 2041 saa->video_dev.minor = -1; 2039 - saa->saa7146_adr = pci_resource_start(dev, 0); 2040 - pci_read_config_byte(dev, PCI_CLASS_REVISION, &saa->revision); 2042 + saa->saa7146_adr = pci_resource_start(pdev, 0); 2043 + pci_read_config_byte(pdev, PCI_CLASS_REVISION, &saa->revision); 2041 2044 2042 2045 saa->saa7146_mem = ioremap(saa->saa7146_adr, 0x200); 2043 2046 if (!saa->saa7146_mem) ··· 2048 2051 result = request_irq(saa->irq, saa7146_irq, 2049 2052 SA_SHIRQ | SA_INTERRUPT, "stradis", (void *) saa); 2050 2053 if (result == -EINVAL) 2051 - printk(KERN_ERR "stradis%d: Bad irq number or handler\n", 2052 - num); 2054 + dev_err(&pdev->dev, "%d: Bad irq number or handler\n", num); 2053 2055 if (result == -EBUSY) 2054 - printk(KERN_ERR "stradis%d: IRQ %ld busy, change your PnP" 2055 - " config in BIOS\n", num, saa->irq); 2056 + dev_err(&pdev->dev, "%d: IRQ %ld busy, change your PnP config " 2057 + "in BIOS\n", num, saa->irq); 2056 2058 if (result < 0) { 2057 2059 iounmap(saa->saa7146_mem); 2058 2060 return result; 2059 2061 } 2060 - pci_set_master(dev); 2062 + pci_set_master(pdev); 2061 2063 if (video_register_device(&saa->video_dev, VFL_TYPE_GRABBER, video_nr) < 0) { 2062 2064 iounmap(saa->saa7146_mem); 2063 2065 return -1; ··· 2064 2068 return 0; 2065 2069 } 2066 2070 2067 - static int init_saa7146(int i) 2071 + static int __devinit init_saa7146(int i, struct device *dev) 2068 2072 { 2069 2073 struct saa7146 *saa = &saa7146s[i]; 2070 2074 2075 + memset(saa, 0, sizeof(*saa)); 2071 2076 saa->user = 0; 2072 2077 /* reset the saa7146 */ 2073 2078 saawrite(0xffff0000, SAA7146_MC1); ··· 2101 2104 2102 2105 /* allocate 32k dma buffer + 4k for page table */ 2103 2106 if ((saa->dmadebi = kmalloc(32768 + 4096, GFP_KERNEL)) == NULL) { 2104 - printk(KERN_ERR "stradis%d: debi kmalloc failed\n", i); 2107 + dev_err(dev, "%d: debi kmalloc failed\n", i); 2105 2108 return -1; 2106 2109 } 2107 2110 #if 0 ··· 2114 2117 saa->audtail = saa->vidtail = saa->osdtail = 0; 2115 2118 if (saa->vidbuf == NULL) 2116 2119 if ((saa->vidbuf = vmalloc(524288)) == NULL) { 2117 - printk(KERN_ERR "stradis%d: malloc failed\n", saa->nr); 2120 + dev_err(dev, "%d: malloc failed\n", saa->nr); 2118 2121 return -ENOMEM; 2119 2122 } 2120 2123 if (saa->audbuf == NULL) 2121 2124 if ((saa->audbuf = vmalloc(65536)) == NULL) { 2122 - printk(KERN_ERR "stradis%d: malloc failed\n", saa->nr); 2125 + dev_err(dev, "%d: malloc failed\n", saa->nr); 2123 2126 vfree(saa->vidbuf); 2124 2127 saa->vidbuf = NULL; 2125 2128 return -ENOMEM; 2126 2129 } 2127 2130 if (saa->osdbuf == NULL) 2128 2131 if ((saa->osdbuf = vmalloc(131072)) == NULL) { 2129 - printk(KERN_ERR "stradis%d: malloc failed\n", saa->nr); 2132 + dev_err(dev, "%d: malloc failed\n", saa->nr); 2130 2133 vfree(saa->vidbuf); 2131 2134 vfree(saa->audbuf); 2132 2135 saa->vidbuf = saa->audbuf = NULL; ··· 2134 2137 } 2135 2138 /* allocate 81920 byte buffer for clipping */ 2136 2139 if ((saa->dmavid2 = kmalloc(VIDEO_CLIPMAP_SIZE, GFP_KERNEL)) == NULL) { 2137 - printk(KERN_ERR "stradis%d: clip kmalloc failed\n", saa->nr); 2140 + dev_err(dev, "%d: clip kmalloc failed\n", saa->nr); 2138 2141 vfree(saa->vidbuf); 2139 2142 vfree(saa->audbuf); 2140 2143 vfree(saa->osdbuf); ··· 2156 2159 return 0; 2157 2160 } 2158 2161 2159 - static void release_saa(void) 2162 + static void stradis_release_saa(struct pci_dev *pdev) 2160 2163 { 2161 2164 u8 command; 2162 - int i; 2163 - struct saa7146 *saa; 2165 + int i = (int)pci_get_drvdata(pdev); 2166 + struct saa7146 *saa = &saa7146s[i]; 2164 2167 2165 - for (i = 0; i < saa_num; i++) { 2166 - saa = &saa7146s[i]; 2168 + /* turn off all capturing, DMA and IRQs */ 2169 + saawrite(0xffff0000, SAA7146_MC1); /* reset chip */ 2170 + saawrite(0, SAA7146_MC2); 2171 + saawrite(0, SAA7146_IER); 2172 + saawrite(0xffffffffUL, SAA7146_ISR); 2167 2173 2168 - /* turn off all capturing, DMA and IRQs */ 2169 - saawrite(0xffff0000, SAA7146_MC1); /* reset chip */ 2170 - saawrite(0, SAA7146_MC2); 2171 - saawrite(0, SAA7146_IER); 2172 - saawrite(0xffffffffUL, SAA7146_ISR); 2174 + /* disable PCI bus-mastering */ 2175 + pci_read_config_byte(pdev, PCI_COMMAND, &command); 2176 + command &= ~PCI_COMMAND_MASTER; 2177 + pci_write_config_byte(pdev, PCI_COMMAND, command); 2173 2178 2174 - /* disable PCI bus-mastering */ 2175 - pci_read_config_byte(saa->dev, PCI_COMMAND, &command); 2176 - command &= ~PCI_COMMAND_MASTER; 2177 - pci_write_config_byte(saa->dev, PCI_COMMAND, command); 2178 - 2179 - /* unmap and free memory */ 2180 - saa->audhead = saa->audtail = saa->osdhead = 0; 2181 - saa->vidhead = saa->vidtail = saa->osdtail = 0; 2182 - vfree(saa->vidbuf); 2183 - vfree(saa->audbuf); 2184 - vfree(saa->osdbuf); 2185 - kfree(saa->dmavid2); 2186 - saa->audbuf = saa->vidbuf = saa->osdbuf = NULL; 2187 - saa->dmavid2 = NULL; 2188 - kfree(saa->dmadebi); 2189 - kfree(saa->dmavid1); 2190 - kfree(saa->dmavid3); 2191 - kfree(saa->dmaa1in); 2192 - kfree(saa->dmaa1out); 2193 - kfree(saa->dmaa2in); 2194 - kfree(saa->dmaa2out); 2195 - kfree(saa->dmaRPS1); 2196 - kfree(saa->dmaRPS2); 2197 - free_irq(saa->irq, saa); 2198 - if (saa->saa7146_mem) 2199 - iounmap(saa->saa7146_mem); 2200 - if (saa->video_dev.minor != -1) 2201 - video_unregister_device(&saa->video_dev); 2202 - } 2179 + /* unmap and free memory */ 2180 + saa->audhead = saa->audtail = saa->osdhead = 0; 2181 + saa->vidhead = saa->vidtail = saa->osdtail = 0; 2182 + vfree(saa->vidbuf); 2183 + vfree(saa->audbuf); 2184 + vfree(saa->osdbuf); 2185 + kfree(saa->dmavid2); 2186 + saa->audbuf = saa->vidbuf = saa->osdbuf = NULL; 2187 + saa->dmavid2 = NULL; 2188 + kfree(saa->dmadebi); 2189 + kfree(saa->dmavid1); 2190 + kfree(saa->dmavid3); 2191 + kfree(saa->dmaa1in); 2192 + kfree(saa->dmaa1out); 2193 + kfree(saa->dmaa2in); 2194 + kfree(saa->dmaa2out); 2195 + kfree(saa->dmaRPS1); 2196 + kfree(saa->dmaRPS2); 2197 + free_irq(saa->irq, saa); 2198 + if (saa->saa7146_mem) 2199 + iounmap(saa->saa7146_mem); 2200 + if (saa->video_dev.minor != -1) 2201 + video_unregister_device(&saa->video_dev); 2203 2202 } 2204 2203 2205 - 2206 - static int __init stradis_init (void) 2204 + static int __devinit stradis_probe(struct pci_dev *pdev, 2205 + const struct pci_device_id *ent) 2207 2206 { 2208 - struct pci_dev *dev = NULL; 2209 - int result = 0, i; 2207 + int retval = -EINVAL; 2208 + 2209 + if (saa_num >= SAA7146_MAX) 2210 + goto err; 2211 + 2212 + if (!pdev->subsystem_vendor) 2213 + dev_info(&pdev->dev, "%d: rev1 decoder\n", saa_num); 2214 + else 2215 + dev_info(&pdev->dev, "%d: SDM2xx found\n", saa_num); 2216 + 2217 + pci_set_drvdata(pdev, (void *)saa_num); 2218 + 2219 + retval = configure_saa7146(pdev, saa_num); 2220 + if (retval) { 2221 + dev_err(&pdev->dev, "%d: error in configuring\n", saa_num); 2222 + goto err; 2223 + } 2224 + 2225 + if (init_saa7146(saa_num, &pdev->dev) < 0) { 2226 + dev_err(&pdev->dev, "%d: error in initialization\n", saa_num); 2227 + retval = -EIO; 2228 + goto errrel; 2229 + } 2230 + 2231 + saa_num++; 2232 + 2233 + return 0; 2234 + errrel: 2235 + stradis_release_saa(pdev); 2236 + err: 2237 + return retval; 2238 + } 2239 + 2240 + static void __devexit stradis_remove(struct pci_dev *pdev) 2241 + { 2242 + stradis_release_saa(pdev); 2243 + } 2244 + 2245 + static struct pci_device_id stradis_pci_tbl[] = { 2246 + { PCI_DEVICE(PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146) }, 2247 + { 0 } 2248 + }; 2249 + MODULE_DEVICE_TABLE(pci, stradis_pci_tbl); 2250 + 2251 + static struct pci_driver stradis_driver = { 2252 + .name = "stradis", 2253 + .id_table = stradis_pci_tbl, 2254 + .probe = stradis_probe, 2255 + .remove = __devexit_p(stradis_remove) 2256 + }; 2257 + 2258 + int __init stradis_init(void) 2259 + { 2260 + int retval; 2210 2261 2211 2262 saa_num = 0; 2212 2263 2213 - while ((dev = pci_find_device(PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146, dev))) { 2214 - if (!dev->subsystem_vendor) 2215 - printk(KERN_INFO "stradis%d: rev1 decoder\n", saa_num); 2216 - else 2217 - printk(KERN_INFO "stradis%d: SDM2xx found\n", saa_num); 2218 - result = configure_saa7146(dev, saa_num++); 2219 - if (result) 2220 - return result; 2221 - } 2222 - if (saa_num) 2223 - printk(KERN_INFO "stradis: %d card(s) found.\n", saa_num); 2224 - else 2225 - return -EINVAL; 2226 - for (i = 0; i < saa_num; i++) 2227 - if (init_saa7146(i) < 0) { 2228 - release_saa(); 2229 - return -EIO; 2230 - } 2231 - return 0; 2264 + retval = pci_register_driver(&stradis_driver); 2265 + if (retval) 2266 + printk(KERN_ERR "stradis: Unable to register pci driver.\n"); 2267 + 2268 + return retval; 2232 2269 } 2233 2270 2234 2271 2235 - static void __exit stradis_exit (void) 2272 + void __exit stradis_exit(void) 2236 2273 { 2237 - release_saa(); 2274 + pci_unregister_driver(&stradis_driver); 2238 2275 printk(KERN_INFO "stradis: module cleanup complete\n"); 2239 2276 } 2240 2277 2241 - 2242 2278 module_init(stradis_init); 2243 2279 module_exit(stradis_exit); 2244 -