mtd: nand: gpmi: unify clock handling
authorStefan Agner <stefan@agner.ch>
Sat, 22 Apr 2017 01:23:34 +0000 (18:23 -0700)
committerBoris Brezillon <boris.brezillon@free-electrons.com>
Thu, 1 Jun 2017 08:09:25 +0000 (10:09 +0200)
Add device specific list of clocks required, and handle all clocks
in a single for loop. This avoids further code duplication when
adding i.MX 7 support.

Signed-off-by: Stefan Agner <stefan@agner.ch>
Reviewed-by: Marek Vasut <marek.vasut@gmail.com>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
drivers/mtd/nand/gpmi-nand/gpmi-nand.c
drivers/mtd/nand/gpmi-nand/gpmi-nand.h

index d52139635b67c658a0608f044a67dcd019ae1ff5..c8bbf5da2ab8b4e1dffde2478105d07fff5578fc 100644 (file)
@@ -82,6 +82,10 @@ static int gpmi_ooblayout_free(struct mtd_info *mtd, int section,
        return 0;
 }
 
+static const char * const gpmi_clks_for_mx2x[] = {
+       "gpmi_io",
+};
+
 static const struct mtd_ooblayout_ops gpmi_ooblayout_ops = {
        .ecc = gpmi_ooblayout_ecc,
        .free = gpmi_ooblayout_free,
@@ -91,24 +95,36 @@ static const struct gpmi_devdata gpmi_devdata_imx23 = {
        .type = IS_MX23,
        .bch_max_ecc_strength = 20,
        .max_chain_delay = 16,
+       .clks = gpmi_clks_for_mx2x,
+       .clks_count = ARRAY_SIZE(gpmi_clks_for_mx2x),
 };
 
 static const struct gpmi_devdata gpmi_devdata_imx28 = {
        .type = IS_MX28,
        .bch_max_ecc_strength = 20,
        .max_chain_delay = 16,
+       .clks = gpmi_clks_for_mx2x,
+       .clks_count = ARRAY_SIZE(gpmi_clks_for_mx2x),
+};
+
+static const char * const gpmi_clks_for_mx6[] = {
+       "gpmi_io", "gpmi_apb", "gpmi_bch", "gpmi_bch_apb", "per1_bch",
 };
 
 static const struct gpmi_devdata gpmi_devdata_imx6q = {
        .type = IS_MX6Q,
        .bch_max_ecc_strength = 40,
        .max_chain_delay = 12,
+       .clks = gpmi_clks_for_mx6,
+       .clks_count = ARRAY_SIZE(gpmi_clks_for_mx6),
 };
 
 static const struct gpmi_devdata gpmi_devdata_imx6sx = {
        .type = IS_MX6SX,
        .bch_max_ecc_strength = 62,
        .max_chain_delay = 12,
+       .clks = gpmi_clks_for_mx6,
+       .clks_count = ARRAY_SIZE(gpmi_clks_for_mx6),
 };
 
 static irqreturn_t bch_irq(int irq, void *cookie)
@@ -599,35 +615,14 @@ acquire_err:
        return -EINVAL;
 }
 
-static char *extra_clks_for_mx6q[GPMI_CLK_MAX] = {
-       "gpmi_apb", "gpmi_bch", "gpmi_bch_apb", "per1_bch",
-};
-
 static int gpmi_get_clks(struct gpmi_nand_data *this)
 {
        struct resources *r = &this->resources;
-       char **extra_clks = NULL;
        struct clk *clk;
        int err, i;
 
-       /* The main clock is stored in the first. */
-       r->clock[0] = devm_clk_get(this->dev, "gpmi_io");
-       if (IS_ERR(r->clock[0])) {
-               err = PTR_ERR(r->clock[0]);
-               goto err_clock;
-       }
-
-       /* Get extra clocks */
-       if (GPMI_IS_MX6(this))
-               extra_clks = extra_clks_for_mx6q;
-       if (!extra_clks)
-               return 0;
-
-       for (i = 1; i < GPMI_CLK_MAX; i++) {
-               if (extra_clks[i - 1] == NULL)
-                       break;
-
-               clk = devm_clk_get(this->dev, extra_clks[i - 1]);
+       for (i = 0; i < this->devdata->clks_count; i++) {
+               clk = devm_clk_get(this->dev, this->devdata->clks[i]);
                if (IS_ERR(clk)) {
                        err = PTR_ERR(clk);
                        goto err_clock;
index 4e49a1f5fa27aec70d5d7a01a7cf7766fc65f199..8879c4eff25e19cffc4790b21d8cce543f6c2fcb 100644 (file)
@@ -130,6 +130,8 @@ struct gpmi_devdata {
        enum gpmi_type type;
        int bch_max_ecc_strength;
        int max_chain_delay; /* See the async EDO mode */
+       const char * const *clks;
+       const int clks_count;
 };
 
 struct gpmi_nand_data {