From ee307877dceeff857a093684297f14404ddfd551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= Date: Mon, 30 Sep 2019 11:49:54 +0200 Subject: [PATCH 061/464] mtd: spi-nor: Add regulator support Signed-off-by: Ondrej Jirman --- drivers/mtd/spi-nor/core.c | 37 +++++++++++++++++++++++++++++++------ include/linux/mtd/spi-nor.h | 3 +++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index 5f29fac8669a..e01328f7b050 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -3622,6 +3622,22 @@ static int spi_nor_probe(struct spi_mem *spimem) if (!nor) return -ENOMEM; + nor->reg_vdd = devm_regulator_get(&spi->dev, "vdd"); + if (IS_ERR(nor->reg_vdd)) { + ret = PTR_ERR(nor->reg_vdd); + if (ret != -EPROBE_DEFER) + dev_err(&spi->dev, "unable to get regulator: %d\n", ret); + return ret; + } + + ret = regulator_enable(nor->reg_vdd); + if (ret) { + dev_err(&spi->dev, "unable to enable regulator: %d\n", ret); + return ret; + } + + msleep(5); + nor->spimem = spimem; nor->dev = &spi->dev; spi_nor_set_flash_node(nor, spi->dev.of_node); @@ -3649,7 +3665,7 @@ static int spi_nor_probe(struct spi_mem *spimem) ret = spi_nor_scan(nor, flash_name, &hwcaps); if (ret) - return ret; + goto err_reg_disable; spi_nor_debugfs_register(nor); @@ -3664,20 +3680,28 @@ static int spi_nor_probe(struct spi_mem *spimem) nor->bouncebuf = devm_kmalloc(nor->dev, nor->bouncebuf_size, GFP_KERNEL); - if (!nor->bouncebuf) - return -ENOMEM; + if (!nor->bouncebuf) { + ret = -ENOMEM; + goto err_reg_disable; + } } ret = spi_nor_create_read_dirmap(nor); if (ret) - return ret; + goto err_reg_disable; ret = spi_nor_create_write_dirmap(nor); if (ret) - return ret; + goto err_reg_disable; - return mtd_device_register(&nor->mtd, data ? data->parts : NULL, + ret = mtd_device_register(&nor->mtd, data ? data->parts : NULL, data ? data->nr_parts : 0); + if (!ret) + return 0; + +err_reg_disable: + regulator_disable(nor->reg_vdd); + return ret; } static int spi_nor_remove(struct spi_mem *spimem) @@ -3685,6 +3709,7 @@ static int spi_nor_remove(struct spi_mem *spimem) struct spi_nor *nor = spi_mem_get_drvdata(spimem); spi_nor_restore(nor); + regulator_disable(nor->reg_vdd); /* Clean up MTD stuff. */ return mtd_device_unregister(&nor->mtd); diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h index cdcfe0fd2e7d..401072dadb00 100644 --- a/include/linux/mtd/spi-nor.h +++ b/include/linux/mtd/spi-nor.h @@ -9,6 +9,7 @@ #include #include #include +#include /* * Note on opcode nomenclature: some opcodes have a format like @@ -419,6 +420,8 @@ struct spi_nor { struct spi_mem_dirmap_desc *wdesc; } dirmap; + struct regulator* reg_vdd; + void *priv; }; -- 2.34.1