mtd: nand: Wait for PAGEPROG to finish in drivers setting NAND_ECC_CUSTOM_PAGE_ACCESS
[oweals/u-boot.git] / drivers / mtd / nand / denali_dt.c
index 0a6155c748c493f80e677289f2434bb8182bdf35..805c066b40569574346341e71876748da07ea4cf 100644 (file)
@@ -6,21 +6,45 @@
  */
 
 #include <common.h>
+#include <clk.h>
 #include <dm.h>
 #include <linux/io.h>
 #include <linux/ioport.h>
 
 #include "denali.h"
 
+struct denali_dt_data {
+       unsigned int revision;
+       unsigned int caps;
+};
+
+static const struct denali_dt_data denali_socfpga_data = {
+       .caps = DENALI_CAP_HW_ECC_FIXUP,
+};
+
+static const struct denali_dt_data denali_uniphier_v5a_data = {
+       .caps = DENALI_CAP_HW_ECC_FIXUP |
+               DENALI_CAP_DMA_64BIT,
+};
+
+static const struct denali_dt_data denali_uniphier_v5b_data = {
+       .revision = 0x0501,
+       .caps = DENALI_CAP_HW_ECC_FIXUP |
+               DENALI_CAP_DMA_64BIT,
+};
+
 static const struct udevice_id denali_nand_dt_ids[] = {
        {
                .compatible = "altr,socfpga-denali-nand",
+               .data = (unsigned long)&denali_socfpga_data,
        },
        {
                .compatible = "socionext,uniphier-denali-nand-v5a",
+               .data = (unsigned long)&denali_uniphier_v5a_data,
        },
        {
                .compatible = "socionext,uniphier-denali-nand-v5b",
+               .data = (unsigned long)&denali_uniphier_v5b_data,
        },
        { /* sentinel */ }
 };
@@ -28,9 +52,17 @@ static const struct udevice_id denali_nand_dt_ids[] = {
 static int denali_dt_probe(struct udevice *dev)
 {
        struct denali_nand_info *denali = dev_get_priv(dev);
+       const struct denali_dt_data *data;
+       struct clk clk;
        struct resource res;
        int ret;
 
+       data = (void *)dev_get_driver_data(dev);
+       if (data) {
+               denali->revision = data->revision;
+               denali->caps = data->caps;
+       }
+
        ret = dev_read_resource_byname(dev, "denali_reg", &res);
        if (ret)
                return ret;
@@ -43,6 +75,16 @@ static int denali_dt_probe(struct udevice *dev)
 
        denali->flash_mem = devm_ioremap(dev, res.start, resource_size(&res));
 
+       ret = clk_get_by_index(dev, 0, &clk);
+       if (ret)
+               return ret;
+
+       ret = clk_enable(&clk);
+       if (ret)
+               return ret;
+
+       denali->clk_x_rate = clk_get_rate(&clk);
+
        return denali_init(denali);
 }