mtd: rawnand: sunxi: Remove support for GPIO-based Ready/Busy polling
authorBoris Brezillon <boris.brezillon@bootlin.com>
Tue, 27 Mar 2018 07:06:14 +0000 (09:06 +0200)
committerBoris Brezillon <boris.brezillon@bootlin.com>
Sun, 29 Apr 2018 06:56:41 +0000 (08:56 +0200)
None of the existing platforms connect the R/B pin to a GPIO (they all
use one of the dedicated R/B pin).
Anyway, if we ever get short of native R/B pins, it's probably better
to fallback to STATUS reg polling than trying to poll a GPIO.

Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Documentation/devicetree/bindings/mtd/sunxi-nand.txt
drivers/mtd/nand/raw/sunxi_nand.c

index 0734f03bf3d311d051a88dde9102a210206690e4..dcd5a5d80dc0ad535298f58d492607507752c02b 100644 (file)
@@ -22,8 +22,6 @@ Optional properties:
 - reset : phandle + reset specifier pair
 - reset-names : must contain "ahb"
 - allwinner,rb : shall contain the native Ready/Busy ids.
- or
-- rb-gpios : shall contain the gpios used as R/B pins.
 - nand-ecc-mode : one of the supported ECC modes ("hw", "soft", "soft_bch" or
                  "none")
 
index aad42812a353fe79e8bcf14faf367254179b1cb9..d831a141a196cbaa43632edcf06224d9b0780842 100644 (file)
 
 #define NFC_MAX_CS             7
 
-/*
- * Ready/Busy detection type: describes the Ready/Busy detection modes
- *
- * @RB_NONE:   no external detection available, rely on STATUS command
- *             and software timeouts
- * @RB_NATIVE: use sunxi NAND controller Ready/Busy support. The Ready/Busy
- *             pin of the NAND flash chip must be connected to one of the
- *             native NAND R/B pins (those which can be muxed to the NAND
- *             Controller)
- * @RB_GPIO:   use a simple GPIO to handle Ready/Busy status. The Ready/Busy
- *             pin of the NAND flash chip must be connected to a GPIO capable
- *             pin.
- */
-enum sunxi_nand_rb_type {
-       RB_NONE,
-       RB_NATIVE,
-       RB_GPIO,
-};
-
-/*
- * Ready/Busy structure: stores information related to Ready/Busy detection
- *
- * @type:      the Ready/Busy detection mode
- * @info:      information related to the R/B detection mode. Either a gpio
- *             id or a native R/B id (those supported by the NAND controller).
- */
-struct sunxi_nand_rb {
-       enum sunxi_nand_rb_type type;
-       union {
-               int gpio;
-               int nativeid;
-       } info;
-};
-
 /*
  * Chip Select structure: stores information related to NAND Chip Select
  *
  * @cs:                the NAND CS id used to communicate with a NAND Chip
- * @rb:                the Ready/Busy description
+ * @rb:                the Ready/Busy pin ID. -1 means no R/B pin connected to the
+ *             NFC
  */
 struct sunxi_nand_chip_sel {
        u8 cs;
-       struct sunxi_nand_rb rb;
+       s8 rb;
 };
 
 /*
@@ -440,30 +407,19 @@ static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
        struct nand_chip *nand = mtd_to_nand(mtd);
        struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
        struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
-       struct sunxi_nand_rb *rb;
-       int ret;
+       u32 mask;
 
        if (sunxi_nand->selected < 0)
                return 0;
 
-       rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
-
-       switch (rb->type) {
-       case RB_NATIVE:
-               ret = !!(readl(nfc->regs + NFC_REG_ST) &
-                        NFC_RB_STATE(rb->info.nativeid));
-               break;
-       case RB_GPIO:
-               ret = gpio_get_value(rb->info.gpio);
-               break;
-       case RB_NONE:
-       default:
-               ret = 0;
+       if (sunxi_nand->sels[sunxi_nand->selected].rb < 0) {
                dev_err(nfc->dev, "cannot check R/B NAND status!\n");
-               break;
+               return 0;
        }
 
-       return ret;
+       mask = NFC_RB_STATE(sunxi_nand->sels[sunxi_nand->selected].rb);
+
+       return !!(readl(nfc->regs + NFC_REG_ST) & mask);
 }
 
 static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
@@ -488,12 +444,11 @@ static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
 
                ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
                       NFC_PAGE_SHIFT(nand->page_shift);
-               if (sel->rb.type == RB_NONE) {
+               if (sel->rb < 0) {
                        nand->dev_ready = NULL;
                } else {
                        nand->dev_ready = sunxi_nfc_dev_ready;
-                       if (sel->rb.type == RB_NATIVE)
-                               ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
+                       ctl |= NFC_RB_SEL(sel->rb);
                }
 
                writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
@@ -1946,26 +1901,10 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc,
                chip->sels[i].cs = tmp;
 
                if (!of_property_read_u32_index(np, "allwinner,rb", i, &tmp) &&
-                   tmp < 2) {
-                       chip->sels[i].rb.type = RB_NATIVE;
-                       chip->sels[i].rb.info.nativeid = tmp;
-               } else {
-                       ret = of_get_named_gpio(np, "rb-gpios", i);
-                       if (ret >= 0) {
-                               tmp = ret;
-                               chip->sels[i].rb.type = RB_GPIO;
-                               chip->sels[i].rb.info.gpio = tmp;
-                               ret = devm_gpio_request(dev, tmp, "nand-rb");
-                               if (ret)
-                                       return ret;
-
-                               ret = gpio_direction_input(tmp);
-                               if (ret)
-                                       return ret;
-                       } else {
-                               chip->sels[i].rb.type = RB_NONE;
-                       }
-               }
+                   tmp < 2)
+                       chip->sels[i].rb = tmp;
+               else
+                       chip->sels[i].rb = -1;
        }
 
        nand = &chip->nand;