CINXE.COM

LKML: "Jiri Slaby": [PATCH 1/4] media-video: Pci probing for stradis driver

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>LKML: "Jiri Slaby": [PATCH 1/4] media-video: Pci probing for stradis driver</title><link href="/css/message.css" rel="stylesheet" type="text/css" /><link href="/css/wrap.css" rel="alternate stylesheet" type="text/css" title="wrap" /><link href="/css/nowrap.css" rel="stylesheet" type="text/css" title="nowrap" /><link href="/favicon.ico" rel="shortcut icon" /><script src="/js/simple-calendar.js" type="text/javascript"></script><script src="/js/styleswitcher.js" type="text/javascript"></script><link rel="alternate" type="application/rss+xml" title="lkml.org : last 100 messages" href="/rss.php" /><link rel="alternate" type="application/rss+xml" title="lkml.org : last messages by &quot;Jiri Slaby&quot;" href="/groupie.php?aid=29650" /><!--Matomo--><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//m.lkml.org/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!--End Matomo Code--></head><body onload="es.jasper.simpleCalendar.init();" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="180" align="center"><a href="/"><img style="border:0;width:135px;height:32px" src="/images/toprowlk.gif" alt="lkml.org" /></a></td><td width="32">聽</td><td class="nb"><div><a class="nb" href="/lkml"> [lkml]</a> 聽 <a class="nb" href="/lkml/2005"> [2005]</a> 聽 <a class="nb" href="/lkml/2005/12"> [Dec]</a> 聽 <a class="nb" href="/lkml/2005/12/31"> [31]</a> 聽 <a class="nb" href="/lkml/last100"> [last100]</a> 聽 <a href="/rss.php"><img src="/images/rss-or.gif" border="0" alt="RSS Feed" /></a></div><div>Views: <a href="#" class="nowrap" onclick="setActiveStyleSheet('wrap');return false;">[wrap]</a><a href="#" class="wrap" onclick="setActiveStyleSheet('nowrap');return false;">[no wrap]</a> 聽 <a class="nb" href="/lkml/mheaders/2005/12/31/141" onclick="this.href='/lkml/headers'+'/2005/12/31/141';">[headers]</a>聽 <a href="/lkml/bounce/2005/12/31/141">[forward]</a>聽 </div></td><td width="32">聽</td></tr><tr><td valign="top"><div class="es-jasper-simpleCalendar" baseurl="/lkml/"></div><div class="threadlist">Messages in this thread</div><ul class="threadlist"><li class="root"><a href="/lkml/2005/12/31/144">First message in thread</a></li><li><a href="/lkml/2005/12/31/144">"Jiri Slaby"</a><ul><li class="origin"><a href="/lkml/2005/12/31/147">"Jiri Slaby"</a><ul><li><a href="/lkml/2005/12/31/147">"Jiri Slaby"</a></li></ul></li><li><a href="/lkml/2005/12/31/143">"Jiri Slaby"</a></li><li><a href="/lkml/2005/12/31/145">"Jiri Slaby"</a></li><li><a href="/lkml/2005/12/31/146">"Jiri Slaby"</a></li><li><a href="/lkml/2005/12/31/151">"Jiri Slaby"</a></li><li><a href="/lkml/2005/12/31/152">"Jiri Slaby"</a></li></ul></li></ul><div class="threadlist">Patch in this message</div><ul class="threadlist"><li><a href="/lkml/diff/2005/12/31/141/1">Get diff 1</a></li></ul></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerl.gif" width="32" height="32" alt="/" /></td><td class="c" rowspan="2" valign="top" style="padding-top: 1em"><table><tr><td><table><tr><td class="lp">From</td><td class="rp" itemprop="author">"Jiri Slaby" &lt;&gt;</td></tr><tr><td class="lp">Date</td><td class="rp" itemprop="datePublished">Sat, 31 Dec 2005 23:26:59 +0100</td></tr><tr><td class="lp">Subject</td><td class="rp" itemprop="name">[PATCH 1/4] media-video: Pci probing for stradis driver</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody">Pci probing for stradis driver<br /><br />Pci probing functions added, some functions were rewrited.<br />Use PCI_DEVICE macro.<br />dev_* used for printing when pci_dev available.<br /><br />Signed-off-by: Jiri Slaby &lt;jirislaby&#64;gmail.com&gt;<br /><br />---<br />commit 820bd12326966a092c066d4e91bd9d94029c207c<br />tree 0fc43d38166de3c1b0adac8becac1350e1c09bfa<br />parent bfa07669d3c622d43a425742d46d95ee80cb02a9<br />author &lt;ku&#64;bellona.(none)&gt; Sat, 31 Dec 2005 21:35:57 +0100<br />committer &lt;ku&#64;bellona.(none)&gt; Sat, 31 Dec 2005 21:35:57 +0100<br /><br /> drivers/media/video/saa7146.h | 1 <br /> drivers/media/video/stradis.c | 201 +++++++++++++++++++++++------------------<br /> 2 files changed, 115 insertions(+), 87 deletions(-)<br /><br />diff --git a/drivers/media/video/saa7146.h b/drivers/media/video/saa7146.h<br />--- a/drivers/media/video/saa7146.h<br />+++ b/drivers/media/video/saa7146.h<br />&#64;&#64; -73,7 +73,6 &#64;&#64; struct saa7146<br /> unsigned int nr;<br /> unsigned long irq; /* IRQ used by SAA7146 card */<br /> unsigned short id;<br />- struct pci_dev *dev;<br /> unsigned char revision;<br /> unsigned char boardcfg[64]; /* 64 bytes of config from eeprom */<br /> unsigned long saa7146_adr; /* bus address of IO mem from PCI BIOS */<br />diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c<br />--- a/drivers/media/video/stradis.c<br />+++ b/drivers/media/video/stradis.c<br />&#64;&#64; -1991,12 +1991,10 &#64;&#64; static struct video_device saa_template <br /> .minor = -1,<br /> };<br /> <br />-static int configure_saa7146(struct pci_dev *dev, int num)<br />+static int __devinit configure_saa7146(struct pci_dev *pdev, int num)<br /> {<br /> int result;<br />- struct saa7146 *saa;<br />-<br />- saa = &amp;saa7146s[num];<br />+ struct saa7146 *saa = &amp;saa7146s[num];<br /> <br /> saa-&gt;endmarkhead = saa-&gt;endmarktail = 0;<br /> saa-&gt;win.x = saa-&gt;win.y = 0;<br />&#64;&#64; -2013,7 +2011,6 &#64;&#64; static int configure_saa7146(struct pci_<br /> saa-&gt;picture.contrast = 38768;<br /> saa-&gt;picture.colour = 32768;<br /> saa-&gt;cap = 0;<br />- saa-&gt;dev = dev;<br /> saa-&gt;nr = num;<br /> saa-&gt;playmode = VID_PLAY_NORMAL;<br /> memset(saa-&gt;boardcfg, 0, 64); /* clear board config area */<br />&#64;&#64; -2033,14 +2030,14 &#64;&#64; static int configure_saa7146(struct pci_<br /> init_waitqueue_head(&amp;saa-&gt;vidq);<br /> spin_lock_init(&amp;saa-&gt;lock);<br /> <br />- if (pci_enable_device(dev))<br />+ if (pci_enable_device(pdev))<br /> return -EIO;<br /> <br />- saa-&gt;id = dev-&gt;device;<br />- saa-&gt;irq = dev-&gt;irq;<br />+ saa-&gt;id = pdev-&gt;device;<br />+ saa-&gt;irq = pdev-&gt;irq;<br /> saa-&gt;video_dev.minor = -1;<br />- saa-&gt;saa7146_adr = pci_resource_start(dev, 0);<br />- pci_read_config_byte(dev, PCI_CLASS_REVISION, &amp;saa-&gt;revision);<br />+ saa-&gt;saa7146_adr = pci_resource_start(pdev, 0);<br />+ pci_read_config_byte(pdev, PCI_CLASS_REVISION, &amp;saa-&gt;revision);<br /> <br /> saa-&gt;saa7146_mem = ioremap(saa-&gt;saa7146_adr, 0x200);<br /> if (!saa-&gt;saa7146_mem)<br />&#64;&#64; -2051,16 +2048,15 &#64;&#64; static int configure_saa7146(struct pci_<br /> result = request_irq(saa-&gt;irq, saa7146_irq,<br /> SA_SHIRQ | SA_INTERRUPT, "stradis", (void *) saa);<br /> if (result == -EINVAL)<br />- printk(KERN_ERR "stradis%d: Bad irq number or handler\n",<br />- num);<br />+ dev_err(&amp;pdev-&gt;dev, "%d: Bad irq number or handler\n", num);<br /> if (result == -EBUSY)<br />- printk(KERN_ERR "stradis%d: IRQ %ld busy, change your PnP"<br />- " config in BIOS\n", num, saa-&gt;irq);<br />+ dev_err(&amp;pdev-&gt;dev, "%d: IRQ %ld busy, change your PnP config "<br />+ "in BIOS\n", num, saa-&gt;irq);<br /> if (result &lt; 0) {<br /> iounmap(saa-&gt;saa7146_mem);<br /> return result;<br /> }<br />- pci_set_master(dev);<br />+ pci_set_master(pdev);<br /> if (video_register_device(&amp;saa-&gt;video_dev, VFL_TYPE_GRABBER, video_nr) &lt; 0) {<br /> iounmap(saa-&gt;saa7146_mem);<br /> return -1;<br />&#64;&#64; -2068,10 +2064,11 &#64;&#64; static int configure_saa7146(struct pci_<br /> return 0;<br /> }<br /> <br />-static int init_saa7146(int i)<br />+static int __devinit init_saa7146(int i, struct device *dev)<br /> {<br /> struct saa7146 *saa = &amp;saa7146s[i];<br /> <br />+ memset(saa, 0, sizeof(*saa));<br /> saa-&gt;user = 0;<br /> /* reset the saa7146 */<br /> saawrite(0xffff0000, SAA7146_MC1);<br />&#64;&#64; -2104,7 +2101,7 &#64;&#64; static int init_saa7146(int i)<br /> <br /> /* allocate 32k dma buffer + 4k for page table */<br /> if ((saa-&gt;dmadebi = kmalloc(32768 + 4096, GFP_KERNEL)) == NULL) {<br />- printk(KERN_ERR "stradis%d: debi kmalloc failed\n", i);<br />+ dev_err(dev, "%d: debi kmalloc failed\n", i);<br /> return -1;<br /> }<br /> #if 0<br />&#64;&#64; -2117,19 +2114,19 &#64;&#64; static int init_saa7146(int i)<br /> saa-&gt;audtail = saa-&gt;vidtail = saa-&gt;osdtail = 0;<br /> if (saa-&gt;vidbuf == NULL)<br /> if ((saa-&gt;vidbuf = vmalloc(524288)) == NULL) {<br />- printk(KERN_ERR "stradis%d: malloc failed\n", saa-&gt;nr);<br />+ dev_err(dev, "%d: malloc failed\n", saa-&gt;nr);<br /> return -ENOMEM;<br /> }<br /> if (saa-&gt;audbuf == NULL)<br /> if ((saa-&gt;audbuf = vmalloc(65536)) == NULL) {<br />- printk(KERN_ERR "stradis%d: malloc failed\n", saa-&gt;nr);<br />+ dev_err(dev, "%d: malloc failed\n", saa-&gt;nr);<br /> vfree(saa-&gt;vidbuf);<br /> saa-&gt;vidbuf = NULL;<br /> return -ENOMEM;<br /> }<br /> if (saa-&gt;osdbuf == NULL)<br /> if ((saa-&gt;osdbuf = vmalloc(131072)) == NULL) {<br />- printk(KERN_ERR "stradis%d: malloc failed\n", saa-&gt;nr);<br />+ dev_err(dev, "%d: malloc failed\n", saa-&gt;nr);<br /> vfree(saa-&gt;vidbuf);<br /> vfree(saa-&gt;audbuf);<br /> saa-&gt;vidbuf = saa-&gt;audbuf = NULL;<br />&#64;&#64; -2137,7 +2134,7 &#64;&#64; static int init_saa7146(int i)<br /> }<br /> /* allocate 81920 byte buffer for clipping */<br /> if ((saa-&gt;dmavid2 = kmalloc(VIDEO_CLIPMAP_SIZE, GFP_KERNEL)) == NULL) {<br />- printk(KERN_ERR "stradis%d: clip kmalloc failed\n", saa-&gt;nr);<br />+ dev_err(dev, "%d: clip kmalloc failed\n", saa-&gt;nr);<br /> vfree(saa-&gt;vidbuf);<br /> vfree(saa-&gt;audbuf);<br /> vfree(saa-&gt;osdbuf);<br />&#64;&#64; -2159,89 +2156,121 &#64;&#64; static int init_saa7146(int i)<br /> return 0;<br /> }<br /> <br />-static void release_saa(void)<br />+static void stradis_release_saa(struct pci_dev *pdev)<br /> {<br /> u8 command;<br />- int i;<br />- struct saa7146 *saa;<br />+ int i = (int)pci_get_drvdata(pdev);<br />+ struct saa7146 *saa = &amp;saa7146s[i];<br /> <br />- for (i = 0; i &lt; saa_num; i++) {<br />- saa = &amp;saa7146s[i];<br />+ /* turn off all capturing, DMA and IRQs */<br />+ saawrite(0xffff0000, SAA7146_MC1); /* reset chip */<br />+ saawrite(0, SAA7146_MC2);<br />+ saawrite(0, SAA7146_IER);<br />+ saawrite(0xffffffffUL, SAA7146_ISR);<br />+<br />+ /* disable PCI bus-mastering */<br />+ pci_read_config_byte(pdev, PCI_COMMAND, &amp;command);<br />+ command &amp;= ~PCI_COMMAND_MASTER;<br />+ pci_write_config_byte(pdev, PCI_COMMAND, command);<br />+<br />+ /* unmap and free memory */<br />+ saa-&gt;audhead = saa-&gt;audtail = saa-&gt;osdhead = 0;<br />+ saa-&gt;vidhead = saa-&gt;vidtail = saa-&gt;osdtail = 0;<br />+ vfree(saa-&gt;vidbuf);<br />+ vfree(saa-&gt;audbuf);<br />+ vfree(saa-&gt;osdbuf);<br />+ kfree(saa-&gt;dmavid2);<br />+ saa-&gt;audbuf = saa-&gt;vidbuf = saa-&gt;osdbuf = NULL;<br />+ saa-&gt;dmavid2 = NULL;<br />+ kfree(saa-&gt;dmadebi);<br />+ kfree(saa-&gt;dmavid1);<br />+ kfree(saa-&gt;dmavid3);<br />+ kfree(saa-&gt;dmaa1in);<br />+ kfree(saa-&gt;dmaa1out);<br />+ kfree(saa-&gt;dmaa2in);<br />+ kfree(saa-&gt;dmaa2out);<br />+ kfree(saa-&gt;dmaRPS1);<br />+ kfree(saa-&gt;dmaRPS2);<br />+ free_irq(saa-&gt;irq, saa);<br />+ if (saa-&gt;saa7146_mem)<br />+ iounmap(saa-&gt;saa7146_mem);<br />+ if (saa-&gt;video_dev.minor != -1)<br />+ video_unregister_device(&amp;saa-&gt;video_dev);<br />+}<br /> <br />- /* turn off all capturing, DMA and IRQs */<br />- saawrite(0xffff0000, SAA7146_MC1); /* reset chip */<br />- saawrite(0, SAA7146_MC2);<br />- saawrite(0, SAA7146_IER);<br />- saawrite(0xffffffffUL, SAA7146_ISR);<br />-<br />- /* disable PCI bus-mastering */<br />- pci_read_config_byte(saa-&gt;dev, PCI_COMMAND, &amp;command);<br />- command &amp;= ~PCI_COMMAND_MASTER;<br />- pci_write_config_byte(saa-&gt;dev, PCI_COMMAND, command);<br />-<br />- /* unmap and free memory */<br />- saa-&gt;audhead = saa-&gt;audtail = saa-&gt;osdhead = 0;<br />- saa-&gt;vidhead = saa-&gt;vidtail = saa-&gt;osdtail = 0;<br />- vfree(saa-&gt;vidbuf);<br />- vfree(saa-&gt;audbuf);<br />- vfree(saa-&gt;osdbuf);<br />- kfree(saa-&gt;dmavid2);<br />- saa-&gt;audbuf = saa-&gt;vidbuf = saa-&gt;osdbuf = NULL;<br />- saa-&gt;dmavid2 = NULL;<br />- kfree(saa-&gt;dmadebi);<br />- kfree(saa-&gt;dmavid1);<br />- kfree(saa-&gt;dmavid3);<br />- kfree(saa-&gt;dmaa1in);<br />- kfree(saa-&gt;dmaa1out);<br />- kfree(saa-&gt;dmaa2in);<br />- kfree(saa-&gt;dmaa2out);<br />- kfree(saa-&gt;dmaRPS1);<br />- kfree(saa-&gt;dmaRPS2);<br />- free_irq(saa-&gt;irq, saa);<br />- if (saa-&gt;saa7146_mem)<br />- iounmap(saa-&gt;saa7146_mem);<br />- if (saa-&gt;video_dev.minor != -1)<br />- video_unregister_device(&amp;saa-&gt;video_dev);<br />+static int __devinit stradis_probe(struct pci_dev *pdev,<br />+ const struct pci_device_id *ent)<br />+{<br />+ int retval = -EINVAL;<br />+<br />+ if (saa_num &gt;= SAA7146_MAX)<br />+ goto err;<br />+<br />+ if (!pdev-&gt;subsystem_vendor)<br />+ dev_info(&amp;pdev-&gt;dev, "%d: rev1 decoder\n", saa_num);<br />+ else<br />+ dev_info(&amp;pdev-&gt;dev, "%d: SDM2xx found\n", saa_num); <br />+<br />+ pci_set_drvdata(pdev, (void *)saa_num);<br />+<br />+ retval = configure_saa7146(pdev, saa_num);<br />+ if (retval) {<br />+ dev_err(&amp;pdev-&gt;dev, "%d: error in configuring\n", saa_num);<br />+ goto err;<br />+ }<br />+<br />+ if (init_saa7146(saa_num, &amp;pdev-&gt;dev) &lt; 0) {<br />+ dev_err(&amp;pdev-&gt;dev, "%d: error in initialization\n", saa_num);<br />+ retval = -EIO;<br />+ goto errrel;<br /> }<br />+<br />+ saa_num++;<br />+<br />+ return 0;<br />+errrel:<br />+ stradis_release_saa(pdev);<br />+err:<br />+ return retval;<br />+}<br />+<br />+static void __devexit stradis_remove(struct pci_dev *pdev)<br />+{<br />+ stradis_release_saa(pdev);<br /> }<br /> <br />+static struct pci_device_id stradis_pci_tbl[] = {<br />+ { PCI_DEVICE(PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146) },<br />+ { 0 }<br />+};<br />+MODULE_DEVICE_TABLE(pci, stradis_pci_tbl);<br />+<br />+static struct pci_driver stradis_driver = {<br />+ .name = "stradis",<br />+ .id_table = stradis_pci_tbl,<br />+ .probe = stradis_probe,<br />+ .remove = __devexit_p(stradis_remove)<br />+};<br /> <br />-static int __init stradis_init (void)<br />+int __init stradis_init(void)<br /> {<br />- struct pci_dev *dev = NULL;<br />- int result = 0, i;<br />+ int retval;<br /> <br /> saa_num = 0;<br />+ <br />+ retval = pci_register_driver(&amp;stradis_driver);<br />+ if (retval)<br />+ printk(KERN_ERR "stradis: Unable to register pci driver.\n");<br /> <br />- while ((dev = pci_find_device(PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146, dev))) {<br />- if (!dev-&gt;subsystem_vendor)<br />- printk(KERN_INFO "stradis%d: rev1 decoder\n", saa_num);<br />- else<br />- printk(KERN_INFO "stradis%d: SDM2xx found\n", saa_num); <br />- result = configure_saa7146(dev, saa_num++);<br />- if (result)<br />- return result;<br />- }<br />- if (saa_num)<br />- printk(KERN_INFO "stradis: %d card(s) found.\n", saa_num);<br />- else<br />- return -EINVAL;<br />- for (i = 0; i &lt; saa_num; i++)<br />- if (init_saa7146(i) &lt; 0) {<br />- release_saa();<br />- return -EIO;<br />- }<br />- return 0;<br />+ return retval;<br /> }<br /> <br /> <br />-static void __exit stradis_exit (void)<br />+void __exit stradis_exit(void)<br /> {<br />- release_saa();<br />+ pci_unregister_driver(&amp;stradis_driver);<br /> printk(KERN_INFO "stradis: module cleanup complete\n");<br /> }<br /> <br />-<br /> module_init(stradis_init);<br /> module_exit(stradis_exit);<br />-<br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo&#64;vger.kernel.org<br />More majordomo info at <a href="http://vger.kernel.org/majordomo-info.html">http://vger.kernel.org/majordomo-info.html</a><br />Please read the FAQ at <a href="http://www.tux.org/lkml/">http://www.tux.org/lkml/</a><br /></pre></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerr.gif" width="32" height="32" alt="\" /></td></tr><tr><td align="right" valign="bottom"> 聽 </td></tr><tr><td align="right" valign="bottom">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerl.gif" width="32" height="32" alt="\" /></td><td class="c">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerr.gif" width="32" height="32" alt="/" /></td></tr><tr><td align="right" valign="top" colspan="2"> 聽 </td><td class="lm">Last update: 2005-12-31 23:30 聽聽 [from the cache]<br />漏2003-2020 <a href="http://blog.jasper.es/"><span itemprop="editor">Jasper Spaans</span></a>|hosted at <a href="https://www.digitalocean.com/?refcode=9a8e99d24cf9">Digital Ocean</a> and my Meterkast|<a href="http://blog.jasper.es/categories.html#lkml-ref">Read the blog</a></td><td>聽</td></tr></table><script language="javascript" src="/js/styleswitcher.js" type="text/javascript"></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10