static struct jz_nand_platform_data qi_lb60_nand_pdata = {
        .ident_callback = qi_lb60_nand_ident,
-       .busy_gpio = 94,
        .banks = { 1 },
 };
 
+static struct gpiod_lookup_table qi_lb60_nand_gpio_table = {
+       .dev_id = "jz4740-nand.0",
+       .table = {
+               GPIO_LOOKUP("Bank C", 30, "busy", 0),
+               { },
+       },
+};
+
+
 /* Keyboard*/
 
 #define KEY_QI_QI      KEY_F13
        jz4740_mmc_device.dev.platform_data = &qi_lb60_mmc_pdata;
 
        gpiod_add_lookup_table(&qi_lb60_audio_gpio_table);
+       gpiod_add_lookup_table(&qi_lb60_nand_gpio_table);
 
        jz4740_serial_device_register();
 
 
 
        int selected_bank;
 
-       struct jz_nand_platform_data *pdata;
+       struct gpio_desc *busy_gpio;
        bool is_reading;
 };
 
 static int jz_nand_dev_ready(struct mtd_info *mtd)
 {
        struct jz_nand *nand = mtd_to_jz_nand(mtd);
-       return gpio_get_value_cansleep(nand->pdata->busy_gpio);
+       return gpiod_get_value_cansleep(nand->busy_gpio);
 }
 
 static void jz_nand_hwctl(struct mtd_info *mtd, int mode)
        if (ret)
                goto err_free;
 
-       if (pdata && gpio_is_valid(pdata->busy_gpio)) {
-               ret = gpio_request(pdata->busy_gpio, "NAND busy pin");
-               if (ret) {
-                       dev_err(&pdev->dev,
-                               "Failed to request busy gpio %d: %d\n",
-                               pdata->busy_gpio, ret);
-                       goto err_iounmap_mmio;
-               }
+       nand->busy_gpio = devm_gpiod_get_optional(&pdev->dev, "busy", GPIOD_IN);
+       if (IS_ERR(nand->busy_gpio)) {
+               ret = PTR_ERR(nand->busy_gpio);
+               dev_err(&pdev->dev, "Failed to request busy gpio %d\n",
+                   ret);
+               goto err_iounmap_mmio;
        }
 
        mtd             = &nand->mtd;
        chip->cmd_ctrl = jz_nand_cmd_ctrl;
        chip->select_chip = jz_nand_select_chip;
 
-       if (pdata && gpio_is_valid(pdata->busy_gpio))
+       if (nand->busy_gpio)
                chip->dev_ready = jz_nand_dev_ready;
 
-       nand->pdata = pdata;
        platform_set_drvdata(pdev, nand);
 
        /* We are going to autodetect NAND chips in the banks specified in the
        }
        if (chipnr == 0) {
                dev_err(&pdev->dev, "No NAND chips found\n");
-               goto err_gpio_busy;
+               goto err_iounmap_mmio;
        }
 
        if (pdata && pdata->ident_callback) {
                                         nand->bank_base[bank - 1]);
        }
        writel(0, nand->base + JZ_REG_NAND_CTRL);
-err_gpio_busy:
-       if (pdata && gpio_is_valid(pdata->busy_gpio))
-               gpio_free(pdata->busy_gpio);
 err_iounmap_mmio:
        jz_nand_iounmap_resource(nand->mem, nand->base);
 err_free:
 static int jz_nand_remove(struct platform_device *pdev)
 {
        struct jz_nand *nand = platform_get_drvdata(pdev);
-       struct jz_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
        size_t i;
 
        nand_release(&nand->mtd);
                        gpio_free(JZ_GPIO_MEM_CS0 + bank - 1);
                }
        }
-       if (pdata && gpio_is_valid(pdata->busy_gpio))
-               gpio_free(pdata->busy_gpio);
 
        jz_nand_iounmap_resource(nand->mem, nand->base);