<div dir="ltr"><div>is this Finally Working or you are facing some issues ?<br><br></div>Regards<br>Sanjeev Sharma<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jun 13, 2014 at 6:43 PM, Josh Cartwright <span dir="ltr">&lt;<a href="mailto:joshc@eso.teric.us" target="_blank">joshc@eso.teric.us</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">On Thu, Jun 12, 2014 at 04:39:25PM +0300, amit mehta wrote:<br>
&gt; We are working on a school project in which we are trying to develop a<br>
&gt; audio mixer on Zedboard (Development board from Digilent). We have<br>
&gt; developed the IP and have integrated it with the overall hardware<br>
&gt; using Programmable logic. This board has ARM core. We have a Digilent<br>
&gt; pre-configured Linux source which we cross-compiled for ARM board,<br>
&gt; device tree blob and bootloader for Zync(BOOT.BIN). The system boots<br>
&gt; fine with Linux, but now to expose the recently added hardware<br>
&gt; implementation of audio mixer, we are trying to develop the driver<br>
&gt; using the platform driver API.  Currently, In our reconfigurable<br>
&gt; hardware, we have 2 channels and a mixer and we want to access those<br>
&gt; individually as some file nodes under /proc FS. The sample code is<br>
&gt; shown below:<br>
&gt;<br>
</div>[..]<br>
<br>
It wasn&#39;t clear what your problem was, or if you were just asking for<br>
advice, but I will add one comment that will hopefully save you some<br>
debugging time:<br>
<br>
&gt; #include &lt;linux/kernel.h&gt;<br>
&gt; #include &lt;linux/module.h&gt;<br>
&gt; #include &lt;asm/uaccess.h&gt;              /*Needed for copy_from_user */<br>
&gt; #include &lt;asm/io.h&gt;                   /*Needed for IO Read/Write Functions */<br>
&gt; #include &lt;linux/proc_fs.h&gt;            /*Needed for Proc File System Functions */<br>
&gt; #include &lt;linux/seq_file.h&gt;           /*Needed for Sequence File Operations */<br>
&gt; #include &lt;linux/platform_device.h&gt;    /*Needed for Platform Driver Functions */<br>
&gt;<br>
&gt; /* Define Driver Name */<br>
&gt; #define DRIVER_NAME &quot;myiir&quot;<br>
&gt;<br>
&gt; unsigned long *base_addr;     /* Vitual Base Address */<br>
&gt; struct resource *res;         /* Device Resource Structure */<br>
&gt; unsigned long remap_size;     /* Device Memory Size */<br>
<br>
The way this driver is written, you will actually be probed three times,<br>
once per node in the device tree.  The drivers&#39; use of global state here<br>
is going to bite you.<br>
<br>
[..]<br>
&gt; static int __devinit myiir_probe(struct platform_device *pdev)<br>
&gt; {<br>
&gt;       struct proc_dir_entry *myiir_proc_entry[3];<br>
&gt;       int ret = 0;<br>
&gt;<br>
&gt;       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);<br>
&gt;       if (!res) {<br>
&gt;               dev_err(&amp;pdev-&gt;dev, &quot;No memory resource\n&quot;);<br>
&gt;               return -ENODEV;<br>
<div class="">&gt;       }<br>
&gt;       remap_size = res-&gt;end - res-&gt;start + 1;<br>
&gt;<br>
</div>&gt;       if (!request_mem_region(res-&gt;start, remap_size, pdev-&gt;name)) {<br>
&gt;               dev_err(&amp;pdev-&gt;dev, &quot;Cannot request IO\n&quot;);<br>
&gt;               return -ENXIO;<br>
<div class="">&gt;       }<br>
&gt;<br>
&gt;       base_addr = ioremap(res-&gt;start, remap_size);<br>
</div>&gt;       if (base_addr == NULL) {<br>
&gt;               dev_err(&amp;pdev-&gt;dev, &quot;Couldn&#39;t ioremap memory at 0x%08lx\n&quot;,<br>
&gt;               (unsigned long)res-&gt;start);<br>
&gt;               ret = -ENOMEM;<br>
&gt;               goto err_release_region;<br>
&gt;       }<br>
[..]<br>
<div class="">&gt; static const struct of_device_id myiir_of_match[] __devinitconst = {<br>
&gt;       {.compatible = &quot;dglnt,myiir-audio-ch0&quot;},<br>
&gt;       {.compatible = &quot;dglnt,myiir-audio-ch1&quot;},<br>
&gt;       {.compatible = &quot;dglnt,myiir-audio-mix0&quot;},<br>
&gt;       {},<br>
&gt; };<br>
<br>
</div>Are these really separate IP blocks entirely, or just multiple instances<br>
of the same IP block (perhaps with different parameters used during<br>
synthesis)?  If the latter, then they should really share a compatible<br>
string that reflects the name/version of the IP block; handling which<br>
block is which channel should be done at a higher level.<br>
<br>
Good luck,<br>
<br>
  Josh<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</div></div></blockquote></div><br></div>