Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[sfrench/cifs-2.6.git] / drivers / memory / atmel-ebi.c
index 597282e35c6914b9ded22231c849ef8072296a97..b907865d4664db167a4931edb3479cf11069de70 100644 (file)
@@ -51,6 +51,7 @@ struct atmel_ebi {
        struct  {
                struct regmap *regmap;
                struct clk *clk;
+               const struct atmel_hsmc_reg_layout *layout;
        } smc;
 
        struct device *dev;
@@ -72,7 +73,7 @@ struct atmel_smc_timing_xlate {
        { .name = nm, .converter = atmel_smc_cs_conf_set_pulse, .shift = pos}
 
 #define ATMEL_SMC_CYCLE_XLATE(nm, pos) \
-       { .name = nm, .converter = atmel_smc_cs_conf_set_setup, .shift = pos}
+       { .name = nm, .converter = atmel_smc_cs_conf_set_cycle, .shift = pos}
 
 static void at91sam9_ebi_get_config(struct atmel_ebi_dev *ebid,
                                    struct atmel_ebi_dev_config *conf)
@@ -84,8 +85,8 @@ static void at91sam9_ebi_get_config(struct atmel_ebi_dev *ebid,
 static void sama5_ebi_get_config(struct atmel_ebi_dev *ebid,
                                 struct atmel_ebi_dev_config *conf)
 {
-       atmel_hsmc_cs_conf_get(ebid->ebi->smc.regmap, conf->cs,
-                              &conf->smcconf);
+       atmel_hsmc_cs_conf_get(ebid->ebi->smc.regmap, ebid->ebi->smc.layout,
+                              conf->cs, &conf->smcconf);
 }
 
 static const struct atmel_smc_timing_xlate timings_xlate_table[] = {
@@ -120,12 +121,14 @@ static int atmel_ebi_xslate_smc_timings(struct atmel_ebi_dev *ebid,
        if (!ret) {
                required = true;
                ncycles = DIV_ROUND_UP(val, clk_period_ns);
-               if (ncycles > ATMEL_SMC_MODE_TDF_MAX ||
-                   ncycles < ATMEL_SMC_MODE_TDF_MIN) {
+               if (ncycles > ATMEL_SMC_MODE_TDF_MAX) {
                        ret = -EINVAL;
                        goto out;
                }
 
+               if (ncycles < ATMEL_SMC_MODE_TDF_MIN)
+                       ncycles = ATMEL_SMC_MODE_TDF_MIN;
+
                smcconf->mode |= ATMEL_SMC_MODE_TDF(ncycles);
        }
 
@@ -263,7 +266,7 @@ static int atmel_ebi_xslate_smc_config(struct atmel_ebi_dev *ebid,
        }
 
        ret = atmel_ebi_xslate_smc_timings(ebid, np, &conf->smcconf);
-       if (ret)
+       if (ret < 0)
                return -EINVAL;
 
        if ((ret > 0 && !required) || (!ret && required)) {
@@ -285,8 +288,8 @@ static void at91sam9_ebi_apply_config(struct atmel_ebi_dev *ebid,
 static void sama5_ebi_apply_config(struct atmel_ebi_dev *ebid,
                                   struct atmel_ebi_dev_config *conf)
 {
-       atmel_hsmc_cs_conf_apply(ebid->ebi->smc.regmap, conf->cs,
-                                &conf->smcconf);
+       atmel_hsmc_cs_conf_apply(ebid->ebi->smc.regmap, ebid->ebi->smc.layout,
+                                conf->cs, &conf->smcconf);
 }
 
 static int atmel_ebi_dev_setup(struct atmel_ebi *ebi, struct device_node *np,
@@ -524,6 +527,10 @@ static int atmel_ebi_probe(struct platform_device *pdev)
        if (IS_ERR(ebi->smc.regmap))
                return PTR_ERR(ebi->smc.regmap);
 
+       ebi->smc.layout = atmel_hsmc_get_reg_layout(smc_np);
+       if (IS_ERR(ebi->smc.layout))
+               return PTR_ERR(ebi->smc.layout);
+
        ebi->smc.clk = of_clk_get(smc_np, 0);
        if (IS_ERR(ebi->smc.clk)) {
                if (PTR_ERR(ebi->smc.clk) != -ENOENT)