<?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のトピックRe: IMX6UL-EVK  U-Boot/Linux QSPI boot</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575678#M87958</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The issue exists in Linux kernels 4.6 and 4.6.3 from &lt;A href="https://community.nxp.com/www.kernel.org" target="test_blank"&gt;www.kernel.org&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;Everything works with Linux 4.1.15 from&amp;nbsp; &lt;A href="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/log/?h=imx_4.1.15_1.0.0_ga" title="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/log/?h=imx_4.1.15_1.0.0_ga"&gt;http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/log/?h=imx_4.1.15_1.0.0_ga&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 27 Jun 2016 19:26:07 GMT</pubDate>
    <dc:creator>vitaliyavramenk</dc:creator>
    <dc:date>2016-06-27T19:26:07Z</dc:date>
    <item>
      <title>IMX6UL-EVK  U-Boot/Linux QSPI boot</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575677#M87957</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I could face strange Linux behaviour when&amp;nbsp; U-boot&amp;nbsp; comes&amp;nbsp; from QSPI flash chip.&lt;/P&gt;&lt;P&gt;Linux kernel and ROOTFS are both on USB flash drive.&lt;/P&gt;&lt;P&gt;When&amp;nbsp; the board starts U-Boot&amp;nbsp; from micro-SD Linux boots fine from USB flash drive&amp;nbsp; and can recognize QSPI flash chip&lt;/P&gt;&lt;P&gt;I can see the following line in Linux log&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt; [ 1.261435] fsl-quadspi 21e0000.qspi: n25q256a (32768 Kbytes) &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When&amp;nbsp; the board starts U-Boot&amp;nbsp; from QSPI flash chip Linux boots fine from USB flash drive but can NOT recognize QSPI Flash chip&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;[&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.251058] fsl-quadspi 21e0000.qspi: unrecognized JEDEC id bytes: ff, ff, ff&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;[&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.258431] fsl-quadspi 21e0000.qspi: Freescale QuadSPI probe failed&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;[&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.265431] fsl-quadspi: probe of 21e0000.qspi failed with error -2&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;U-boot was downloaded to QSPI flash chip using mfgtool2-yocto-mx-evk-qspi-nor-n25q256a.vbs &lt;/P&gt;&lt;P&gt;Any help would be appreciated&lt;/P&gt;&lt;P&gt;Thanks in advance &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 26 Jun 2016 20:24:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575677#M87957</guid>
      <dc:creator>vitaliyavramenk</dc:creator>
      <dc:date>2016-06-26T20:24:30Z</dc:date>
    </item>
    <item>
      <title>Re: IMX6UL-EVK  U-Boot/Linux QSPI boot</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575678#M87958</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The issue exists in Linux kernels 4.6 and 4.6.3 from &lt;A href="https://community.nxp.com/www.kernel.org" target="test_blank"&gt;www.kernel.org&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;Everything works with Linux 4.1.15 from&amp;nbsp; &lt;A href="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/log/?h=imx_4.1.15_1.0.0_ga" title="http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/log/?h=imx_4.1.15_1.0.0_ga"&gt;http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/log/?h=imx_4.1.15_1.0.0_ga&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 27 Jun 2016 19:26:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575678#M87958</guid>
      <dc:creator>vitaliyavramenk</dc:creator>
      <dc:date>2016-06-27T19:26:07Z</dc:date>
    </item>
    <item>
      <title>Re: IMX6UL-EVK  U-Boot/Linux QSPI boot</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575679#M87959</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Vitaly&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;kernels 4.6 and 4.6.3 are not officially supported, please look at i.MX6 product&lt;/P&gt;&lt;P&gt;page for current supported versions:&lt;/P&gt;&lt;P&gt;&lt;A href="http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/i.mx-applications-processors/i.mx-6-processors/i.mx6qp/i.mx-6-series-software-and-development-tool-resources:IMX6_SW" title="http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/i.mx-applications-processors/i.mx-6-processors/i.mx6qp/i.mx-6-series-software-and-development-tool-resources:IMX6_SW"&gt;i.MX 6 Series Software and Development Tool|NXP&lt;/A&gt; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;please post that on &lt;A href="https://community.nxp.com/www.kernel.org" target="test_blank"&gt;www.kernel.org&lt;/A&gt; mail list.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;/P&gt;&lt;P&gt;igor&lt;/P&gt;&lt;P&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;/P&gt;&lt;P&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 29 Jun 2016 08:07:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575679#M87959</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2016-06-29T08:07:45Z</dc:date>
    </item>
    <item>
      <title>Re: IMX6UL-EVK  U-Boot/Linux QSPI boot</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575680#M87960</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Igor,&lt;/P&gt;&lt;P&gt;OK,&amp;nbsp; it is clear now.&lt;/P&gt;&lt;P&gt;By the way, I could see one minor issue even with&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #51626f; font-family: arial, helvetica, 'helvetica neue', verdana, sans-serif;"&gt;Linux 4.1.15 from&amp;nbsp; &lt;/SPAN&gt;&lt;A class="jive-link-external-small" data-content-finding="Community" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fgit.freescale.com%2Fgit%2Fcgit.cgi%2Fimx%2Flinux-2.6-imx.git%2Flog%2F%3Fh%3Dimx_4.1.15_1.0.0_ga" rel="nofollow" style="font-family: arial, helvetica, 'helvetica neue', verdana, sans-serif; color: #017bba; text-decoration: underline;" target="_blank"&gt;http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/log/?h=imx_4.1.15_1.0.0_ga&lt;/A&gt;&lt;/P&gt;&lt;P&gt;At Power ON&amp;nbsp; "eth1' interface always starts without problems.&lt;/P&gt;&lt;P&gt;But If I execute a 'reboot' command&amp;nbsp; then 'eth1' periodically does not start.&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #51626f; font-family: arial, helvetica, 'helvetica neue', verdana, sans-serif;"&gt;'ifconfig -a' shows&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;eth1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Ethernet&amp;nbsp; HWaddr 00:04:9F:04:20:01&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BROADCAST MULTICAST&amp;nbsp; MTU:1500&amp;nbsp; Metric:1&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TX packets:0 errors:0 dropped:0 overruns:0 carrier:0&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collisions:0 txqueuelen:1000&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX bytes:0 (0.0 B)&amp;nbsp; TX bytes:0 (0.0 B)&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;With &lt;SPAN style="color: #51626f; font-family: arial, helvetica, 'helvetica neue', verdana, sans-serif;"&gt;kernels 4.6 and 4.6.3 I have not seen that issue.&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 29 Jun 2016 08:24:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575680#M87960</guid>
      <dc:creator>vitaliyavramenk</dc:creator>
      <dc:date>2016-06-29T08:24:27Z</dc:date>
    </item>
    <item>
      <title>Re: IMX6UL-EVK  U-Boot/Linux QSPI boot</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575681#M87961</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Vitaly&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;if you think that official bsp has some issue, then it is&lt;/P&gt;&lt;P&gt;necessary to create new community thread and provide&lt;/P&gt;&lt;P&gt;detailed steps how this could be reproduced on nxp reference board&lt;/P&gt;&lt;P&gt;with demo image from i.MX6 product page :&lt;/P&gt;&lt;P&gt;&lt;A class="jive-link-external-small" data-content-finding="Community" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.nxp.com%2Fproducts%2Fmicrocontrollers-and-processors%2Farm-processors%2Fi.mx-applications-processors%2Fi.mx-6-processors%2Fi.mx6qp%2Fi.mx-6-series-software-and-development-tool-resources%3AIMX6_SW" rel="nofollow" target="_blank"&gt;i.MX 6 Series Software and Development Tool|NXP&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note, supported functionality is given in documentation provided with&lt;/P&gt;&lt;P&gt;BSP package: Release Notes, Linux Manual, e.t.c.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;/P&gt;&lt;P&gt;igor&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 29 Jun 2016 10:10:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575681#M87961</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2016-06-29T10:10:04Z</dc:date>
    </item>
    <item>
      <title>Re: IMX6UL-EVK  U-Boot/Linux QSPI boot</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575682#M87962</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Vitaliy,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When you are booting from QSPI, the SPL and U-Boot will setup the QSPI controller in DDR mode which currently is not supported by the kernel.&lt;/P&gt;&lt;P&gt;The kernel can therefor not identify the chip (just reading ff:ff:ff in the JEDEC ID bytes).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This patch add DDR-support for QSPI to Linux 4.8.&lt;/P&gt;&lt;P&gt;However, this is for&amp;nbsp;&lt;SPAN&gt;n25q512ax3, you need to add the&amp;nbsp;&lt;SPAN&gt;SPI_NOR_DDR_QUAD_READ flag to your chip (n25q256a). In other words, you&amp;nbsp;need to do the corresponding change for your chip:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;- { "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;+ { "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SPI_NOR_DDR_QUAD_READ | &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;Cheers,&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;Marcus Folkesson&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;--------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;From 01c70b110b9b956fbebab94aeb5c2d151c67cd57 Mon Sep 17 00:00:00 2001&lt;BR /&gt;&lt;SPAN&gt;From: Marcus Folkesson &amp;lt;&lt;/SPAN&gt;&lt;A class="jive-link-email-small" href="mailto:marcus.folkesson@gmail.com"&gt;marcus.folkesson@gmail.com&lt;/A&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;Date: Thu, 29 Sep 2016 17:34:02 +0200&lt;BR /&gt;Subject: [PATCH] spi-nor: fsl-quadspi: add support for DDR&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Signed-off-by: Marcus Folkesson &amp;lt;&lt;/SPAN&gt;&lt;A class="jive-link-email-small" href="mailto:marcus.folkesson@gmail.com"&gt;marcus.folkesson@gmail.com&lt;/A&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;---&lt;BR /&gt; drivers/mtd/spi-nor/fsl-quadspi.c | 166 ++++++++++++++++++++++++++++++++++----&lt;BR /&gt; drivers/mtd/spi-nor/spi-nor.c | 69 +++++++++++++++-&lt;BR /&gt; include/linux/mtd/spi-nor.h | 4 +&lt;BR /&gt; 3 files changed, 219 insertions(+), 20 deletions(-)&lt;/P&gt;&lt;P&gt;diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c&lt;BR /&gt;index 5c82e4e..92c2926 100644&lt;BR /&gt;--- a/drivers/mtd/spi-nor/fsl-quadspi.c&lt;BR /&gt;+++ b/drivers/mtd/spi-nor/fsl-quadspi.c&lt;BR /&gt;@@ -34,6 +34,8 @@&lt;BR /&gt; #define QUADSPI_QUIRK_SWAP_ENDIAN (1 &amp;lt;&amp;lt; 0)&lt;BR /&gt; /* Controller needs 4x internal clock */&lt;BR /&gt; #define QUADSPI_QUIRK_4X_INT_CLK (1 &amp;lt;&amp;lt; 1)&lt;BR /&gt;+/* Controller needs DDR delay */&lt;BR /&gt;+#define QUADSPI_QUIRK_DDR_DELAY (1 &amp;lt;&amp;lt; 2)&lt;BR /&gt; /*&lt;BR /&gt; * TKT253890, Controller needs driver to fill txfifo till 16 byte to&lt;BR /&gt; * trigger data transfer even though extern data will not transferred.&lt;BR /&gt;@@ -44,6 +46,9 @@&lt;BR /&gt; &lt;BR /&gt; /* The registers */&lt;BR /&gt; #define QUADSPI_MCR 0x00&lt;BR /&gt;+#define MX6SX_QUADSPI_MCR_TX_DDR_DELAY_EN_SHIFT 29&lt;BR /&gt;+#define MX6SX_QUADSPI_MCR_TX_DDR_DELAY_EN_MASK \&lt;BR /&gt;+ (1 &amp;lt;&amp;lt; MX6SX_QUADSPI_MCR_TX_DDR_DELAY_EN_SHIFT)&lt;BR /&gt; #define QUADSPI_MCR_RESERVED_SHIFT 16&lt;BR /&gt; #define QUADSPI_MCR_RESERVED_MASK (0xF &amp;lt;&amp;lt; QUADSPI_MCR_RESERVED_SHIFT)&lt;BR /&gt; #define QUADSPI_MCR_MDIS_SHIFT 14&lt;BR /&gt;@@ -61,6 +66,11 @@&lt;BR /&gt; #define QUADSPI_MCR_SWRSTSD_SHIFT 0&lt;BR /&gt; #define QUADSPI_MCR_SWRSTSD_MASK (1 &amp;lt;&amp;lt; QUADSPI_MCR_SWRSTSD_SHIFT)&lt;BR /&gt; &lt;BR /&gt;+#define QUADSPI_FLSHCR 0x0c&lt;BR /&gt;+#define QUADSPI_FLSHCR_TDH_SHIFT 16&lt;BR /&gt;+#define QUADSPI_FLSHCR_TDH_MASK (3 &amp;lt;&amp;lt; QUADSPI_FLSHCR_TDH_SHIFT)&lt;BR /&gt;+#define QUADSPI_FLSHCR_TDH_DDR_EN (1 &amp;lt;&amp;lt; QUADSPI_FLSHCR_TDH_SHIFT)&lt;BR /&gt;+&lt;BR /&gt; #define QUADSPI_IPCR 0x08&lt;BR /&gt; #define QUADSPI_IPCR_SEQID_SHIFT 24&lt;BR /&gt; #define QUADSPI_IPCR_SEQID_MASK (0xF &amp;lt;&amp;lt; QUADSPI_IPCR_SEQID_SHIFT)&lt;BR /&gt;@@ -166,6 +176,8 @@&lt;BR /&gt; #define LUT_FSL_WRITE_DDR 15&lt;BR /&gt; #define LUT_DATA_LEARN 16&lt;BR /&gt; &lt;BR /&gt;+&lt;BR /&gt;+&lt;BR /&gt; /*&lt;BR /&gt; * The PAD definitions for LUT register.&lt;BR /&gt; *&lt;BR /&gt;@@ -205,6 +217,8 @@&lt;BR /&gt; #define SEQID_RDCR 9&lt;BR /&gt; #define SEQID_EN4B 10&lt;BR /&gt; #define SEQID_BRWR 11&lt;BR /&gt;+#define SEQID_RD_EVCR 12&lt;BR /&gt;+#define SEQID_WD_EVCR 13&lt;BR /&gt; &lt;BR /&gt; #define QUADSPI_MIN_IOMAP SZ_4M&lt;BR /&gt; &lt;BR /&gt;@@ -238,6 +252,7 @@ static struct fsl_qspi_devtype_data imx6sx_data = {&lt;BR /&gt; .txfifo = 512,&lt;BR /&gt; .ahb_buf_size = 1024,&lt;BR /&gt; .driver_data = QUADSPI_QUIRK_4X_INT_CLK&lt;BR /&gt;+ | QUADSPI_QUIRK_DDR_DELAY&lt;BR /&gt; | QUADSPI_QUIRK_TKT245618,&lt;BR /&gt; };&lt;BR /&gt; &lt;BR /&gt;@@ -285,6 +300,7 @@ struct fsl_qspi {&lt;BR /&gt; unsigned int chip_base_addr; /* We may support two chips. */&lt;BR /&gt; bool has_second_chip;&lt;BR /&gt; bool big_endian;&lt;BR /&gt;+ u32 ddr_smp;&lt;BR /&gt; struct mutex lock;&lt;BR /&gt; struct pm_qos_request pm_qos_req;&lt;BR /&gt; };&lt;BR /&gt;@@ -294,6 +310,11 @@ static inline int needs_swap_endian(struct fsl_qspi *q)&lt;BR /&gt; return q-&amp;gt;devtype_data-&amp;gt;driver_data &amp;amp; QUADSPI_QUIRK_SWAP_ENDIAN;&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt;+static inline int needs_ddr_delay(struct fsl_qspi *q)&lt;BR /&gt;+{&lt;BR /&gt;+ return q-&amp;gt;devtype_data-&amp;gt;driver_data &amp;amp; QUADSPI_QUIRK_DDR_DELAY;&lt;BR /&gt;+}&lt;BR /&gt;+&lt;BR /&gt; static inline int needs_4x_clock(struct fsl_qspi *q)&lt;BR /&gt; {&lt;BR /&gt; return q-&amp;gt;devtype_data-&amp;gt;driver_data &amp;amp; QUADSPI_QUIRK_4X_INT_CLK;&lt;BR /&gt;@@ -372,8 +393,11 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q)&lt;BR /&gt; {&lt;BR /&gt; void __iomem *base = q-&amp;gt;iobase;&lt;BR /&gt; int rxfifo = q-&amp;gt;devtype_data-&amp;gt;rxfifo;&lt;BR /&gt;+ struct spi_nor *nor = &amp;amp;q-&amp;gt;nor[0];&lt;BR /&gt;+ u8 addrlen = (nor-&amp;gt;addr_width == 3) ? ADDR24BIT : ADDR32BIT;&lt;BR /&gt; u32 lut_base;&lt;BR /&gt;- u8 cmd, addrlen, dummy;&lt;BR /&gt;+ u8 cmd, dummy;&lt;BR /&gt;+ u8 op, dm;&lt;BR /&gt; int i;&lt;BR /&gt; &lt;BR /&gt; fsl_qspi_unlock_lut(q);&lt;BR /&gt;@@ -384,22 +408,51 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q)&lt;BR /&gt; &lt;BR /&gt; /* Quad Read */&lt;BR /&gt; lut_base = SEQID_QUAD_READ * 4;&lt;BR /&gt;-&lt;BR /&gt;- if (q-&amp;gt;nor_size &amp;lt;= SZ_16M) {&lt;BR /&gt;- cmd = SPINOR_OP_READ_1_1_4;&lt;BR /&gt;- addrlen = ADDR24BIT;&lt;BR /&gt;- dummy = 8;&lt;BR /&gt;- } else {&lt;BR /&gt;- /* use the 4-byte address */&lt;BR /&gt;- cmd = SPINOR_OP_READ_1_1_4;&lt;BR /&gt;- addrlen = ADDR32BIT;&lt;BR /&gt;- dummy = 8;&lt;BR /&gt;+ op = nor-&amp;gt;read_opcode;&lt;BR /&gt;+ dm = nor-&amp;gt;read_dummy;&lt;BR /&gt;+ if (nor-&amp;gt;flash_read == SPI_NOR_QUAD) {&lt;BR /&gt;+ if (op == SPINOR_OP_READ_1_1_4 || op == SPINOR_OP_READ4_1_1_4) {&lt;BR /&gt;+ /* read mode : 1-1-4 */&lt;BR /&gt;+ qspi_writel(q ,LUT0(CMD, PAD1, op) | LUT1(ADDR, PAD1, addrlen),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base));&lt;BR /&gt;+&lt;BR /&gt;+ qspi_writel(q ,LUT0(DUMMY, PAD1, dm) | LUT1(FSL_READ, PAD4, rxfifo),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base + 1));&lt;BR /&gt;+ } else {&lt;BR /&gt;+ dev_err(nor-&amp;gt;dev, "Unsupported opcode : 0x%.2x\n", op);&lt;BR /&gt;+ }&lt;BR /&gt;+ } else if (nor-&amp;gt;flash_read == SPI_NOR_DDR_QUAD) {&lt;BR /&gt;+ if (op == SPINOR_OP_READ_1_4_4_D ||&lt;BR /&gt;+ op == SPINOR_OP_READ4_1_4_4_D) {&lt;BR /&gt;+ /* read mode : 1-4-4, such as Spansion s25fl128s. */&lt;BR /&gt;+ qspi_writel(q ,LUT0(CMD, PAD1, op)&lt;BR /&gt;+ | LUT1(ADDR_DDR, PAD4, addrlen),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base));&lt;BR /&gt;+&lt;BR /&gt;+ qspi_writel(q ,LUT0(MODE_DDR, PAD4, 0xff)&lt;BR /&gt;+ | LUT1(DUMMY, PAD1, dm),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base + 1));&lt;BR /&gt;+&lt;BR /&gt;+ qspi_writel(q ,LUT0(FSL_READ_DDR, PAD4, rxfifo)&lt;BR /&gt;+ | LUT1(JMP_ON_CS, PAD1, 0),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base + 2));&lt;BR /&gt;+ } else if (op == SPINOR_OP_READ_1_1_4_D) {&lt;BR /&gt;+ /* read mode : 1-1-4, such as Micron N25Q256A. */&lt;BR /&gt;+ qspi_writel(q ,LUT0(CMD, PAD1, op)&lt;BR /&gt;+ | LUT1(ADDR_DDR, PAD1, addrlen),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base));&lt;BR /&gt;+&lt;BR /&gt;+ qspi_writel(q ,LUT0(DUMMY, PAD1, dm)&lt;BR /&gt;+ | LUT1(FSL_READ_DDR, PAD4, rxfifo),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base + 1));&lt;BR /&gt;+&lt;BR /&gt;+ qspi_writel(q ,LUT0(JMP_ON_CS, PAD1, 0),&lt;BR /&gt;+ base + QUADSPI_LUT(lut_base + 2));&lt;BR /&gt;+ } else {&lt;BR /&gt;+ dev_err(nor-&amp;gt;dev, "Unsupported opcode : 0x%.2x\n", op);&lt;BR /&gt;+ }&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt;- qspi_writel(q, LUT0(CMD, PAD1, cmd) | LUT1(ADDR, PAD1, addrlen),&lt;BR /&gt;- base + QUADSPI_LUT(lut_base));&lt;BR /&gt;- qspi_writel(q, LUT0(DUMMY, PAD1, dummy) | LUT1(FSL_READ, PAD4, rxfifo),&lt;BR /&gt;- base + QUADSPI_LUT(lut_base + 1));&lt;BR /&gt; &lt;BR /&gt; /* Write enable */&lt;BR /&gt; lut_base = SEQID_WREN * 4;&lt;BR /&gt;@@ -476,6 +529,13 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q)&lt;BR /&gt; qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_BRWR),&lt;BR /&gt; base + QUADSPI_LUT(lut_base));&lt;BR /&gt; &lt;BR /&gt;+ /* Read EVCR register */&lt;BR /&gt;+ lut_base = SEQID_RD_EVCR * 4;&lt;BR /&gt;+ qspi_writel(q ,LUT0(CMD, PAD1, SPINOR_OP_RD_EVCR), base + QUADSPI_LUT(lut_base));&lt;BR /&gt;+&lt;BR /&gt;+ /* Write EVCR register */&lt;BR /&gt;+ lut_base = SEQID_WD_EVCR * 4;&lt;BR /&gt;+ qspi_writel(q ,LUT0(CMD, PAD1, SPINOR_OP_WD_EVCR), base + QUADSPI_LUT(lut_base));&lt;BR /&gt; fsl_qspi_lock_lut(q);&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt;@@ -483,6 +543,10 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q)&lt;BR /&gt; static int fsl_qspi_get_seqid(struct fsl_qspi *q, u8 cmd)&lt;BR /&gt; {&lt;BR /&gt; switch (cmd) {&lt;BR /&gt;+ case SPINOR_OP_READ_1_1_4_D:&lt;BR /&gt;+ case SPINOR_OP_READ_1_4_4_D:&lt;BR /&gt;+ case SPINOR_OP_READ4_1_4_4_D:&lt;BR /&gt;+ case SPINOR_OP_READ4_1_1_4:&lt;BR /&gt; case SPINOR_OP_READ_1_1_4:&lt;BR /&gt; return SEQID_QUAD_READ;&lt;BR /&gt; case SPINOR_OP_WREN:&lt;BR /&gt;@@ -491,6 +555,7 @@ static int fsl_qspi_get_seqid(struct fsl_qspi *q, u8 cmd)&lt;BR /&gt; return SEQID_WRDI;&lt;BR /&gt; case SPINOR_OP_RDSR:&lt;BR /&gt; return SEQID_RDSR;&lt;BR /&gt;+ case SPINOR_OP_BE_4K:&lt;BR /&gt; case SPINOR_OP_SE:&lt;BR /&gt; return SEQID_SE;&lt;BR /&gt; case SPINOR_OP_CHIP_ERASE:&lt;BR /&gt;@@ -507,6 +572,10 @@ static int fsl_qspi_get_seqid(struct fsl_qspi *q, u8 cmd)&lt;BR /&gt; return SEQID_EN4B;&lt;BR /&gt; case SPINOR_OP_BRWR:&lt;BR /&gt; return SEQID_BRWR;&lt;BR /&gt;+ case SPINOR_OP_RD_EVCR:&lt;BR /&gt;+ return SEQID_RD_EVCR;&lt;BR /&gt;+ case SPINOR_OP_WD_EVCR:&lt;BR /&gt;+ return SEQID_WD_EVCR;&lt;BR /&gt; default:&lt;BR /&gt; if (cmd == q-&amp;gt;nor[0].erase_opcode)&lt;BR /&gt; return SEQID_SE;&lt;BR /&gt;@@ -681,6 +750,9 @@ static void fsl_qspi_init_abh_read(struct fsl_qspi *q)&lt;BR /&gt; {&lt;BR /&gt; void __iomem *base = q-&amp;gt;iobase;&lt;BR /&gt; int seqid;&lt;BR /&gt;+ u32 reg;&lt;BR /&gt;+ u32 reg2;&lt;BR /&gt;+ struct spi_nor *nor = &amp;amp;q-&amp;gt;nor[0];&lt;BR /&gt; &lt;BR /&gt; /* AHB configuration for access buffer 0/1/2 .*/&lt;BR /&gt; qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF0CR);&lt;BR /&gt;@@ -704,8 +776,38 @@ static void fsl_qspi_init_abh_read(struct fsl_qspi *q)&lt;BR /&gt; seqid = fsl_qspi_get_seqid(q, q-&amp;gt;nor[0].read_opcode);&lt;BR /&gt; qspi_writel(q, seqid &amp;lt;&amp;lt; QUADSPI_BFGENCR_SEQID_SHIFT,&lt;BR /&gt; q-&amp;gt;iobase + QUADSPI_BFGENCR);&lt;BR /&gt;-}&lt;BR /&gt; &lt;BR /&gt;+ /* enable the DDR quad read */&lt;BR /&gt;+ if (nor-&amp;gt;flash_read == SPI_NOR_DDR_QUAD) {&lt;BR /&gt;+ reg = qspi_readl(q ,q-&amp;gt;iobase + QUADSPI_MCR);&lt;BR /&gt;+&lt;BR /&gt;+ /* Firstly, disable the module */&lt;BR /&gt;+ qspi_writel(q ,reg | QUADSPI_MCR_MDIS_MASK, q-&amp;gt;iobase + QUADSPI_MCR);&lt;BR /&gt;+&lt;BR /&gt;+ /* Set the Sampling Register for DDR */&lt;BR /&gt;+ reg2 = qspi_readl(q ,q-&amp;gt;iobase + QUADSPI_SMPR);&lt;BR /&gt;+ reg2 &amp;amp;= ~QUADSPI_SMPR_DDRSMP_MASK;&lt;BR /&gt;+ reg2 |= ((q-&amp;gt;ddr_smp &amp;lt;&amp;lt; QUADSPI_SMPR_DDRSMP_SHIFT) &amp;amp;&lt;BR /&gt;+ QUADSPI_SMPR_DDRSMP_MASK);&lt;BR /&gt;+ qspi_writel(q ,reg2, q-&amp;gt;iobase + QUADSPI_SMPR);&lt;BR /&gt;+&lt;BR /&gt;+ /* Enable the module again (enable the DDR too) */&lt;BR /&gt;+ reg |= QUADSPI_MCR_DDR_EN_MASK;&lt;BR /&gt;+ if (needs_ddr_delay(q) &amp;amp;&amp;amp;&lt;BR /&gt;+ (q-&amp;gt;devtype_data-&amp;gt;devtype == FSL_QUADSPI_IMX6SX))&lt;BR /&gt;+ reg |= MX6SX_QUADSPI_MCR_TX_DDR_DELAY_EN_MASK;&lt;BR /&gt;+&lt;BR /&gt;+ qspi_writel(q ,reg, q-&amp;gt;iobase + QUADSPI_MCR);&lt;BR /&gt;+&lt;BR /&gt;+ if ((q-&amp;gt;devtype_data-&amp;gt;devtype == FSL_QUADSPI_IMX6UL) ||&lt;BR /&gt;+ (q-&amp;gt;devtype_data-&amp;gt;devtype == FSL_QUADSPI_IMX7D)) {&lt;BR /&gt;+ reg = qspi_readl(q ,q-&amp;gt;iobase + QUADSPI_FLSHCR);&lt;BR /&gt;+ reg &amp;amp;= ~QUADSPI_FLSHCR_TDH_MASK;&lt;BR /&gt;+ reg |= QUADSPI_FLSHCR_TDH_DDR_EN;&lt;BR /&gt;+ qspi_writel(q ,reg, q-&amp;gt;iobase + QUADSPI_FLSHCR);&lt;BR /&gt;+ }&lt;BR /&gt;+ }&lt;BR /&gt;+}&lt;BR /&gt; /* This function was used to prepare and enable QSPI clock */&lt;BR /&gt; static int fsl_qspi_clk_prep_enable(struct fsl_qspi *q)&lt;BR /&gt; {&lt;BR /&gt;@@ -757,6 +859,14 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q)&lt;BR /&gt; if (ret)&lt;BR /&gt; return ret;&lt;BR /&gt; &lt;BR /&gt;+ if ((q-&amp;gt;devtype_data-&amp;gt;devtype == FSL_QUADSPI_IMX6UL) ||&lt;BR /&gt;+ (q-&amp;gt;devtype_data-&amp;gt;devtype == FSL_QUADSPI_IMX7D)) {&lt;BR /&gt;+ /* clear the DDR_EN bit for 6UL and 7D */&lt;BR /&gt;+ reg = qspi_readl(q ,base + QUADSPI_MCR);&lt;BR /&gt;+ qspi_writel(q ,~(QUADSPI_MCR_DDR_EN_MASK) &amp;amp; reg, base + QUADSPI_MCR);&lt;BR /&gt;+ udelay(1);&lt;BR /&gt;+ }&lt;BR /&gt;+&lt;BR /&gt; /* Reset the module */&lt;BR /&gt; qspi_writel(q, QUADSPI_MCR_SWRSTSD_MASK | QUADSPI_MCR_SWRSTHD_MASK,&lt;BR /&gt; base + QUADSPI_MCR);&lt;BR /&gt;@@ -979,7 +1089,9 @@ static int fsl_qspi_probe(struct platform_device *pdev)&lt;BR /&gt; struct resource *res;&lt;BR /&gt; struct spi_nor *nor;&lt;BR /&gt; struct mtd_info *mtd;&lt;BR /&gt;+ enum read_mode mode = SPI_NOR_QUAD;&lt;BR /&gt; int ret, i = 0;&lt;BR /&gt;+ u32 dummy = 0;&lt;BR /&gt; &lt;BR /&gt; q = devm_kzalloc(dev, sizeof(*q), GFP_KERNEL);&lt;BR /&gt; if (!q)&lt;BR /&gt;@@ -1021,6 +1133,12 @@ static int fsl_qspi_probe(struct platform_device *pdev)&lt;BR /&gt; if (IS_ERR(q-&amp;gt;clk))&lt;BR /&gt; return PTR_ERR(q-&amp;gt;clk);&lt;BR /&gt; &lt;BR /&gt;+ /* find ddrsmp value */&lt;BR /&gt;+ ret = of_property_read_u32(dev-&amp;gt;of_node, "ddrsmp",&lt;BR /&gt;+ &amp;amp;q-&amp;gt;ddr_smp);&lt;BR /&gt;+ if (ret)&lt;BR /&gt;+ q-&amp;gt;ddr_smp = 0;&lt;BR /&gt;+&lt;BR /&gt; ret = fsl_qspi_clk_prep_enable(q);&lt;BR /&gt; if (ret) {&lt;BR /&gt; dev_err(dev, "can not enable the clock\n");&lt;BR /&gt;@@ -1052,6 +1170,10 @@ static int fsl_qspi_probe(struct platform_device *pdev)&lt;BR /&gt; &lt;BR /&gt; /* iterate the subnodes. */&lt;BR /&gt; for_each_available_child_of_node(dev-&amp;gt;of_node, np) {&lt;BR /&gt;+ enum read_mode mode = SPI_NOR_QUAD;&lt;BR /&gt;+ char modalias[40];&lt;BR /&gt;+ u32 dummy = 0;&lt;BR /&gt;+&lt;BR /&gt; /* skip the holes */&lt;BR /&gt; if (!q-&amp;gt;has_second_chip)&lt;BR /&gt; i *= 2;&lt;BR /&gt;@@ -1073,15 +1195,25 @@ static int fsl_qspi_probe(struct platform_device *pdev)&lt;BR /&gt; nor-&amp;gt;prepare = fsl_qspi_prep;&lt;BR /&gt; nor-&amp;gt;unprepare = fsl_qspi_unprep;&lt;BR /&gt; &lt;BR /&gt;+ ret = of_modalias_node(np, modalias, sizeof(modalias));&lt;BR /&gt;+ if (ret &amp;lt; 0)&lt;BR /&gt;+ goto mutex_failed;&lt;BR /&gt;+&lt;BR /&gt; ret = of_property_read_u32(np, "spi-max-frequency",&lt;BR /&gt; &amp;amp;q-&amp;gt;clk_rate);&lt;BR /&gt; if (ret &amp;lt; 0)&lt;BR /&gt; goto mutex_failed;&lt;BR /&gt; &lt;BR /&gt;+ /* Can we enable the DDR Quad Read? */&lt;BR /&gt;+ ret = of_property_read_u32(np, "spi-nor,ddr-quad-read-dummy",&lt;BR /&gt;+ &amp;amp;dummy);&lt;BR /&gt;+ if (!ret &amp;amp;&amp;amp; dummy &amp;gt; 0)&lt;BR /&gt;+ mode = SPI_NOR_DDR_QUAD;&lt;BR /&gt;+&lt;BR /&gt; /* set the chip address for READID */&lt;BR /&gt; fsl_qspi_set_base_addr(q, nor);&lt;BR /&gt; &lt;BR /&gt;- ret = spi_nor_scan(nor, NULL, SPI_NOR_QUAD);&lt;BR /&gt;+ ret = spi_nor_scan(nor, NULL, mode);&lt;BR /&gt; if (ret)&lt;BR /&gt; goto mutex_failed;&lt;BR /&gt; &lt;BR /&gt;diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c&lt;BR /&gt;index d0fc165..ebb85c4 100644&lt;BR /&gt;--- a/drivers/mtd/spi-nor/spi-nor.c&lt;BR /&gt;+++ b/drivers/mtd/spi-nor/spi-nor.c&lt;BR /&gt;@@ -75,6 +75,7 @@ struct flash_info {&lt;BR /&gt; * bit. Must be used with&lt;BR /&gt; * SPI_NOR_HAS_LOCK.&lt;BR /&gt; */&lt;BR /&gt;+#define SPI_NOR_DDR_QUAD_READ 0x100 /* Flash supports DDR Quad Read */&lt;BR /&gt; };&lt;BR /&gt; &lt;BR /&gt; #define JEDEC_MFR(info) ((info)-&amp;gt;id[0])&lt;BR /&gt;@@ -146,6 +147,17 @@ static int read_cr(struct spi_nor *nor)&lt;BR /&gt; static inline int spi_nor_read_dummy_cycles(struct spi_nor *nor)&lt;BR /&gt; {&lt;BR /&gt; switch (nor-&amp;gt;flash_read) {&lt;BR /&gt;+ case SPI_NOR_DDR_QUAD:&lt;BR /&gt;+ /*&lt;BR /&gt;+ * The m25p80.c can not support the DDR quad read.&lt;BR /&gt;+ * We set the dummy cycles to 8 by default. The SPI NOR&lt;BR /&gt;+ * controller driver can set it in its child DT node.&lt;BR /&gt;+ * We parse it out here.&lt;BR /&gt;+ */&lt;BR /&gt;+ /* XXX: Since no reference to an of node is in struct spi_nor&lt;BR /&gt;+ * anymore, we simply return what spi-nor,ddr-quad-read-dummy&lt;BR /&gt;+ * was suppost to be */&lt;BR /&gt;+ return 6;&lt;BR /&gt; case SPI_NOR_FAST:&lt;BR /&gt; case SPI_NOR_DUAL:&lt;BR /&gt; case SPI_NOR_QUAD:&lt;BR /&gt;@@ -885,7 +897,7 @@ static const struct flash_info spi_nor_ids[] = {&lt;BR /&gt; { "n25q128a13", INFO(0x20ba18, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_QUAD_READ) },&lt;BR /&gt; { "n25q256a", INFO(0x20ba19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ) },&lt;BR /&gt; { "n25q512a", INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },&lt;BR /&gt;- { "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },&lt;BR /&gt;+ { "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SPI_NOR_DDR_QUAD_READ | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },&lt;BR /&gt; { "n25q00", INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },&lt;BR /&gt; { "n25q00a", INFO(0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },&lt;BR /&gt; &lt;BR /&gt;@@ -1264,6 +1276,34 @@ static int spansion_quad_enable(struct spi_nor *nor)&lt;BR /&gt; &lt;BR /&gt; return 0;&lt;BR /&gt; }&lt;BR /&gt;+static int set_ddr_quad_mode(struct spi_nor *nor, struct flash_info *info)&lt;BR /&gt;+{&lt;BR /&gt;+ int status;&lt;BR /&gt;+&lt;BR /&gt;+ switch (JEDEC_MFR(info)) {&lt;BR /&gt;+ case CFI_MFR_AMD: /* Spansion, actually */&lt;BR /&gt;+ status = spansion_quad_enable(nor);&lt;BR /&gt;+ if (status) {&lt;BR /&gt;+ dev_err(nor-&amp;gt;dev,&lt;BR /&gt;+ "Spansion DDR quad-read not enabled\n");&lt;BR /&gt;+ return status;&lt;BR /&gt;+ }&lt;BR /&gt;+ return status;&lt;BR /&gt;+ case CFI_MFR_MACRONIX:&lt;BR /&gt;+ status = macronix_quad_enable(nor);&lt;BR /&gt;+ if (status) {&lt;BR /&gt;+ dev_err(nor-&amp;gt;dev,&lt;BR /&gt;+ "Macronix DDR quad-read not enabled\n");&lt;BR /&gt;+ return status;&lt;BR /&gt;+ }&lt;BR /&gt;+ return status;&lt;BR /&gt;+ case CFI_MFR_ST: /* Micron, actually */&lt;BR /&gt;+ /* DTR quad read works with the Extended SPI protocol. */&lt;BR /&gt;+ return 0;&lt;BR /&gt;+ default:&lt;BR /&gt;+ return -EINVAL;&lt;BR /&gt;+ }&lt;BR /&gt;+}&lt;BR /&gt; &lt;BR /&gt; static int set_quad_mode(struct spi_nor *nor, const struct flash_info *info)&lt;BR /&gt; {&lt;BR /&gt;@@ -1433,8 +1473,16 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)&lt;BR /&gt; if (info-&amp;gt;flags &amp;amp; SPI_NOR_NO_FR)&lt;BR /&gt; nor-&amp;gt;flash_read = SPI_NOR_NORMAL;&lt;BR /&gt; &lt;BR /&gt;- /* Quad/Dual-read mode takes precedence over fast/normal */&lt;BR /&gt;- if (mode == SPI_NOR_QUAD &amp;amp;&amp;amp; info-&amp;gt;flags &amp;amp; SPI_NOR_QUAD_READ) {&lt;BR /&gt;+ /* DDR Quad/Quad/Dual-read mode takes precedence over fast/normal */&lt;BR /&gt;+ if (mode == SPI_NOR_DDR_QUAD &amp;amp;&amp;amp; info-&amp;gt;flags &amp;amp; SPI_NOR_DDR_QUAD_READ) {&lt;BR /&gt;+ ret = set_ddr_quad_mode(nor, info);&lt;BR /&gt;+ if (ret) {&lt;BR /&gt;+ dev_err(dev, "DDR quad mode not supported\n");&lt;BR /&gt;+ return ret;&lt;BR /&gt;+ }&lt;BR /&gt;+ nor-&amp;gt;flash_read = SPI_NOR_DDR_QUAD;&lt;BR /&gt;+ dev_err(dev, "mode == SPI_NOR_DDR_QUAD\n");&lt;BR /&gt;+ } else if (mode == SPI_NOR_QUAD &amp;amp;&amp;amp; info-&amp;gt;flags &amp;amp; SPI_NOR_QUAD_READ) {&lt;BR /&gt; ret = set_quad_mode(nor, info);&lt;BR /&gt; if (ret) {&lt;BR /&gt; dev_err(dev, "quad mode not supported\n");&lt;BR /&gt;@@ -1447,6 +1495,18 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)&lt;BR /&gt; &lt;BR /&gt; /* Default commands */&lt;BR /&gt; switch (nor-&amp;gt;flash_read) {&lt;BR /&gt;+ case SPI_NOR_DDR_QUAD:&lt;BR /&gt;+ if (JEDEC_MFR(info) == CFI_MFR_AMD) { /* Spansion */&lt;BR /&gt;+ nor-&amp;gt;read_opcode = SPINOR_OP_READ_1_4_4_D;&lt;BR /&gt;+ } else if (JEDEC_MFR(info) == CFI_MFR_ST) {&lt;BR /&gt;+ nor-&amp;gt;read_opcode = SPINOR_OP_READ_1_1_4_D;&lt;BR /&gt;+ } else if (JEDEC_MFR(info) == CFI_MFR_MACRONIX) {&lt;BR /&gt;+ nor-&amp;gt;read_opcode = SPINOR_OP_READ_1_4_4_D;&lt;BR /&gt;+ } else {&lt;BR /&gt;+ dev_err(dev, "DDR Quad Read is not supported.\n");&lt;BR /&gt;+ return -EINVAL;&lt;BR /&gt;+ }&lt;BR /&gt;+ break;&lt;BR /&gt; case SPI_NOR_QUAD:&lt;BR /&gt; nor-&amp;gt;read_opcode = SPINOR_OP_READ_1_1_4;&lt;BR /&gt; break;&lt;BR /&gt;@@ -1474,6 +1534,9 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)&lt;BR /&gt; if (JEDEC_MFR(info) == SNOR_MFR_SPANSION) {&lt;BR /&gt; /* Dedicated 4-byte command set */&lt;BR /&gt; switch (nor-&amp;gt;flash_read) {&lt;BR /&gt;+ case SPI_NOR_DDR_QUAD:&lt;BR /&gt;+ nor-&amp;gt;read_opcode = SPINOR_OP_READ4_1_4_4_D;&lt;BR /&gt;+ break;&lt;BR /&gt; case SPI_NOR_QUAD:&lt;BR /&gt; nor-&amp;gt;read_opcode = SPINOR_OP_READ4_1_1_4;&lt;BR /&gt; break;&lt;BR /&gt;diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h&lt;BR /&gt;index c425c7b..e55d6bd 100644&lt;BR /&gt;--- a/include/linux/mtd/spi-nor.h&lt;BR /&gt;+++ b/include/linux/mtd/spi-nor.h&lt;BR /&gt;@@ -45,6 +45,8 @@&lt;BR /&gt; #define SPINOR_OP_READ_FAST 0x0b /* Read data bytes (high frequency) */&lt;BR /&gt; #define SPINOR_OP_READ_1_1_2 0x3b /* Read data bytes (Dual SPI) */&lt;BR /&gt; #define SPINOR_OP_READ_1_1_4 0x6b /* Read data bytes (Quad SPI) */&lt;BR /&gt;+#define SPINOR_OP_READ_1_1_4_D 0x6d /* Read data bytes (DDR Quad SPI) */&lt;BR /&gt;+#define SPINOR_OP_READ_1_4_4_D 0xed /* Read data bytes (DDR Quad SPI) */&lt;BR /&gt; #define SPINOR_OP_PP 0x02 /* Page program (up to 256 bytes) */&lt;BR /&gt; #define SPINOR_OP_BE_4K 0x20 /* Erase 4KiB block */&lt;BR /&gt; #define SPINOR_OP_BE_4K_PMC 0xd7 /* Erase 4KiB block on PMC chips */&lt;BR /&gt;@@ -60,6 +62,7 @@&lt;BR /&gt; #define SPINOR_OP_READ4_FAST 0x0c /* Read data bytes (high frequency) */&lt;BR /&gt; #define SPINOR_OP_READ4_1_1_2 0x3c /* Read data bytes (Dual SPI) */&lt;BR /&gt; #define SPINOR_OP_READ4_1_1_4 0x6c /* Read data bytes (Quad SPI) */&lt;BR /&gt;+#define SPINOR_OP_READ4_1_4_4_D 0xee /* Read data bytes (DDR Quad SPI) */&lt;BR /&gt; #define SPINOR_OP_PP_4B 0x12 /* Page program (up to 256 bytes) */&lt;BR /&gt; #define SPINOR_OP_SE_4B 0xdc /* Sector erase (usually 64KiB) */&lt;BR /&gt; &lt;BR /&gt;@@ -105,6 +108,7 @@ enum read_mode {&lt;BR /&gt; SPI_NOR_FAST,&lt;BR /&gt; SPI_NOR_DUAL,&lt;BR /&gt; SPI_NOR_QUAD,&lt;BR /&gt;+ SPI_NOR_DDR_QUAD,&lt;BR /&gt; };&lt;BR /&gt; &lt;BR /&gt; #define SPI_NOR_MAX_CMD_SIZE 8&lt;BR /&gt;-- &lt;BR /&gt;2.8.0&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Oct 2016 11:34:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6UL-EVK-U-Boot-Linux-QSPI-boot/m-p/575682#M87962</guid>
      <dc:creator>marcusfolkesson</dc:creator>
      <dc:date>2016-10-19T11:34:29Z</dc:date>
    </item>
  </channel>
</rss>

