<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>i.MX Processors中的主题 Cannot write SAI register from Linux Kernel Module (IMX6ULZ)</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/Cannot-write-SAI-register-from-Linux-Kernel-Module-IMX6ULZ/m-p/1230278#M169432</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;We try to write a register (SAI2 Transmit Control Register (I2S2_TCSR)) from a linux kernel module, but for some reason after trying to read the value again, it reads 0. Here is a snippet of the imx6ull.dtsi :&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;sai2: sai@0202c000 {
                                        compatible = "fsl,imx6ul-sai",
                                                     "fsl,imx6sx-sai";
                                        reg = &amp;lt;0x0202c000 0x4000&amp;gt;;
                                        interrupts = &amp;lt;GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH&amp;gt;;
                                        clocks = &amp;lt;&amp;amp;clks IMX6UL_CLK_SAI2_IPG&amp;gt;,
                                                 &amp;lt;&amp;amp;clks IMX6UL_CLK_DUMMY&amp;gt;,
                                                 &amp;lt;&amp;amp;clks IMX6UL_CLK_SAI2&amp;gt;,
                                                 &amp;lt;&amp;amp;clks 0&amp;gt;, &amp;lt;&amp;amp;clks 0&amp;gt;;
                                        clock-names = "bus", "mclk0", "mclk1", "mclk2", "mclk3";
                                        dma-names = "rx", "tx";
                                        dmas = &amp;lt;&amp;amp;sdma 37 24 0&amp;gt;, &amp;lt;&amp;amp;sdma 38 24 0&amp;gt;;
                                        status = "disabled";
                                };&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;And here is the dts we're adding :&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;&amp;amp;sai2 {
    compatible = "fsl,clock32khz_imx6ulzb2";
    status = "okay";
};&lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;Eventually, here is a part of the module :&lt;/P&gt;&lt;LI-CODE lang="c"&gt;#define I2S2_TCSR_ADDR 0x0202C000
#define I2S2_TCSR_VALUE 0xD0000000

#define SAI2_MEM_REGION_SIZE 0x200

static void *pVirtAddr_I2S2_TCSR;

static int clock32khz_probe(struct platform_device *pdev)
{   int value;
        pVirtAddr_I2S2_TCSR=0;

        //SAI2 request mem region
       if(!request_mem_region(I2S2_TCSR_ADDR,SAI2_MEM_REGION_SIZE,"clock32KHz : sai2"))
        {       printk(KERN_ERR "Failed to request mem region I2S2_TCSR_ADDR\n");
                ret=-EBUSY;
                goto ErrSAI2req;
        }

        //I2S2_TCSR
        pVirtAddr_I2S2_TCSR=devm_ioremap_nocache(&amp;amp;pdev-&amp;gt;dev,I2S2_TCSR_ADDR,1);
        if(!pVirtAddr_I2S2_TCSR)
        {       printk(KERN_ERR "Failed to remap I/O memory I2S2_TCSR_ADDR\n");
                ret=-ENXIO;
                goto ErrI2S2_TCSR;
        }
        value=*(int *)(pVirtAddr_I2S2_TCSR);
        printk(KERN_INFO "I2S2_TCSR=%X\n",value);
        *(int *)(pVirtAddr_I2S2_TCSR)=I2S2_TCSR_VALUE;

        //TEST
        value=*(int *)(pVirtAddr_I2S2_TCSR);
        printk(KERN_INFO "I2S2_TCSR test1=%X\n",value);
        devm_iounmap(&amp;amp;pdev-&amp;gt;dev,pVirtAddr_I2S2_TCSR);
        pVirtAddr_I2S2_TCSR=devm_ioremap_nocache(&amp;amp;pdev-&amp;gt;dev,I2S2_TCSR_ADDR,1);
        if(!pVirtAddr_I2S2_TCSR)
        {       printk(KERN_ERR "Failed to remap I/O memory I2S2_TCSR_ADDR\n");
                ret=-ENXIO;
                goto ErrI2S2_TCSR;
        }
        value=*(int *)(pVirtAddr_I2S2_TCSR);
        printk(KERN_INFO "I2S2_TCSR test2=%X\n",value);
        //TEST END

//No error
    return 0;
}
static const struct of_device_id of_clock32khz_match[] = {
        { .compatible = "fsl,clock32khz_imx6ulzb2", },
        {},
};
MODULE_DEVICE_TABLE(of, of_clock32khz_match);

static struct platform_driver clock32khz_device_driver = {
        .probe          = clock32khz_probe,
        .remove         = clock32khz_remove,
        .driver         = {
                .name   = "clock32khz_imx6ulzb2",
                .of_match_table = of_clock32khz_match,
        }
};
module_platform_driver(clock32khz_device_driver);&lt;/LI-CODE&gt;&lt;P&gt;It seems that everything is working when the module is inserted, but the printk's output is :&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;EM&gt;I2S2_TCSR test1=D0000000&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;I2S2_TCSR test2=0&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help would be much appreciated.&lt;/P&gt;&lt;P&gt;Guillaume&lt;/P&gt;</description>
    <pubDate>Fri, 12 Feb 2021 10:15:41 GMT</pubDate>
    <dc:creator>GLavigne</dc:creator>
    <dc:date>2021-02-12T10:15:41Z</dc:date>
    <item>
      <title>Cannot write SAI register from Linux Kernel Module (IMX6ULZ)</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Cannot-write-SAI-register-from-Linux-Kernel-Module-IMX6ULZ/m-p/1230278#M169432</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;We try to write a register (SAI2 Transmit Control Register (I2S2_TCSR)) from a linux kernel module, but for some reason after trying to read the value again, it reads 0. Here is a snippet of the imx6ull.dtsi :&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;sai2: sai@0202c000 {
                                        compatible = "fsl,imx6ul-sai",
                                                     "fsl,imx6sx-sai";
                                        reg = &amp;lt;0x0202c000 0x4000&amp;gt;;
                                        interrupts = &amp;lt;GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH&amp;gt;;
                                        clocks = &amp;lt;&amp;amp;clks IMX6UL_CLK_SAI2_IPG&amp;gt;,
                                                 &amp;lt;&amp;amp;clks IMX6UL_CLK_DUMMY&amp;gt;,
                                                 &amp;lt;&amp;amp;clks IMX6UL_CLK_SAI2&amp;gt;,
                                                 &amp;lt;&amp;amp;clks 0&amp;gt;, &amp;lt;&amp;amp;clks 0&amp;gt;;
                                        clock-names = "bus", "mclk0", "mclk1", "mclk2", "mclk3";
                                        dma-names = "rx", "tx";
                                        dmas = &amp;lt;&amp;amp;sdma 37 24 0&amp;gt;, &amp;lt;&amp;amp;sdma 38 24 0&amp;gt;;
                                        status = "disabled";
                                };&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;And here is the dts we're adding :&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;&amp;amp;sai2 {
    compatible = "fsl,clock32khz_imx6ulzb2";
    status = "okay";
};&lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;Eventually, here is a part of the module :&lt;/P&gt;&lt;LI-CODE lang="c"&gt;#define I2S2_TCSR_ADDR 0x0202C000
#define I2S2_TCSR_VALUE 0xD0000000

#define SAI2_MEM_REGION_SIZE 0x200

static void *pVirtAddr_I2S2_TCSR;

static int clock32khz_probe(struct platform_device *pdev)
{   int value;
        pVirtAddr_I2S2_TCSR=0;

        //SAI2 request mem region
       if(!request_mem_region(I2S2_TCSR_ADDR,SAI2_MEM_REGION_SIZE,"clock32KHz : sai2"))
        {       printk(KERN_ERR "Failed to request mem region I2S2_TCSR_ADDR\n");
                ret=-EBUSY;
                goto ErrSAI2req;
        }

        //I2S2_TCSR
        pVirtAddr_I2S2_TCSR=devm_ioremap_nocache(&amp;amp;pdev-&amp;gt;dev,I2S2_TCSR_ADDR,1);
        if(!pVirtAddr_I2S2_TCSR)
        {       printk(KERN_ERR "Failed to remap I/O memory I2S2_TCSR_ADDR\n");
                ret=-ENXIO;
                goto ErrI2S2_TCSR;
        }
        value=*(int *)(pVirtAddr_I2S2_TCSR);
        printk(KERN_INFO "I2S2_TCSR=%X\n",value);
        *(int *)(pVirtAddr_I2S2_TCSR)=I2S2_TCSR_VALUE;

        //TEST
        value=*(int *)(pVirtAddr_I2S2_TCSR);
        printk(KERN_INFO "I2S2_TCSR test1=%X\n",value);
        devm_iounmap(&amp;amp;pdev-&amp;gt;dev,pVirtAddr_I2S2_TCSR);
        pVirtAddr_I2S2_TCSR=devm_ioremap_nocache(&amp;amp;pdev-&amp;gt;dev,I2S2_TCSR_ADDR,1);
        if(!pVirtAddr_I2S2_TCSR)
        {       printk(KERN_ERR "Failed to remap I/O memory I2S2_TCSR_ADDR\n");
                ret=-ENXIO;
                goto ErrI2S2_TCSR;
        }
        value=*(int *)(pVirtAddr_I2S2_TCSR);
        printk(KERN_INFO "I2S2_TCSR test2=%X\n",value);
        //TEST END

//No error
    return 0;
}
static const struct of_device_id of_clock32khz_match[] = {
        { .compatible = "fsl,clock32khz_imx6ulzb2", },
        {},
};
MODULE_DEVICE_TABLE(of, of_clock32khz_match);

static struct platform_driver clock32khz_device_driver = {
        .probe          = clock32khz_probe,
        .remove         = clock32khz_remove,
        .driver         = {
                .name   = "clock32khz_imx6ulzb2",
                .of_match_table = of_clock32khz_match,
        }
};
module_platform_driver(clock32khz_device_driver);&lt;/LI-CODE&gt;&lt;P&gt;It seems that everything is working when the module is inserted, but the printk's output is :&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;EM&gt;I2S2_TCSR test1=D0000000&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;I2S2_TCSR test2=0&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help would be much appreciated.&lt;/P&gt;&lt;P&gt;Guillaume&lt;/P&gt;</description>
      <pubDate>Fri, 12 Feb 2021 10:15:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Cannot-write-SAI-register-from-Linux-Kernel-Module-IMX6ULZ/m-p/1230278#M169432</guid>
      <dc:creator>GLavigne</dc:creator>
      <dc:date>2021-02-12T10:15:41Z</dc:date>
    </item>
    <item>
      <title>Re: Cannot write SAI register from Linux Kernel Module (IMX6ULZ)</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Cannot-write-SAI-register-from-Linux-Kernel-Module-IMX6ULZ/m-p/1230309#M169439</link>
      <description>&lt;P&gt;Hi Guillaume&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;what bsp used in the case, one can try to test on EVK board with Demo Image&lt;/P&gt;
&lt;P&gt;&lt;A style="box-sizing: border-box; background-color: transparent; color: #215bd6; text-decoration: none; cursor: pointer;" href="https://www.nxp.com/webapp/Download?colCode=L5.4.70_2.3.0_MX6UL7D&amp;amp;appType=license" target="_blank"&gt;​i.MX 6UltraLite, i.MX 6ULL, i.MX 7Dual Boards​&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.nxp.com/design/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-applications-processors:IMXLINUX?tab=In-Depth_Tab" target="_blank"&gt;https://www.nxp.com/design/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-applications-processors:IMXLINUX?tab=In-Depth_Tab&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Use memtool for read/write operations&lt;/P&gt;
&lt;P&gt;&lt;A href="https://source.codeaurora.org/external/imx/imx-test/tree/test/memtool?h=imx_5.4.70_2.3.0" target="_blank"&gt;https://source.codeaurora.org/external/imx/imx-test/tree/test/memtool?h=imx_5.4.70_2.3.0&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;/P&gt;</description>
      <pubDate>Fri, 12 Feb 2021 11:28:56 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Cannot-write-SAI-register-from-Linux-Kernel-Module-IMX6ULZ/m-p/1230309#M169439</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2021-02-12T11:28:56Z</dc:date>
    </item>
  </channel>
</rss>

