Hi Ladislav, On 19/02/17 13:34, Ladislav Michl wrote: > On Sun, Feb 19, 2017 at 09:54:05AM +0100, Ladislav Michl wrote: >> Hi Roger, >> >> On Tue, Feb 14, 2017 at 12:02:19PM +0200, Roger Quadros wrote: >>> Hi, >>> >>> On 11/02/17 15:02, Ladislav Michl wrote: >>>> Do not call platform_device_put if platform_device_alloc >>>> failed to allocate. >>>> >>> >>> It doesn't matter if platform_device_put is called if >>> platform_device_alloc fails as it checks for NULL pdev internally. >>> >>> Did you face any issues without this patch? >> >> No, it just makes things to look more likely an error unwinding pattern >> which is IMHO easier to read. I'm not pushing to include this patch as >> I made it while looking for differences between probing NAND and OneNAND. > > Actually said patch should be dropped as it is way better to remove this > code alltogether :-) > > Tony what about following patch? I'm OK with it if nobody is using it now. I think you should split the patch into 3 patches: mach-omap2, memory/ and mtd/nand. cheers, -roger > > -- >8 -- > From: Ladislav Michl <ladis@xxxxxxxxxxxxxx> > Subject: [PATCH] ARM: OMAP2+: Remove legacy gpmc-nand.c > > This code is no longer used and can be removed as we > are using device tree. > > Signed-off-by: Ladislav Michl <ladis@xxxxxxxxxxxxxx> > --- > arch/arm/mach-omap2/Makefile | 3 - > arch/arm/mach-omap2/gpmc-nand.c | 154 --------------------------- > drivers/memory/omap-gpmc.c | 1 - > drivers/mtd/nand/omap2.c | 40 ++----- > include/linux/platform_data/mtd-nand-omap2.h | 19 ---- > 5 files changed, 10 insertions(+), 207 deletions(-) > > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile > index 093458b62c8d..c89757abb0ae 100644 > --- a/arch/arm/mach-omap2/Makefile > +++ b/arch/arm/mach-omap2/Makefile > @@ -241,6 +241,3 @@ obj-$(CONFIG_MACH_OMAP2_TUSB6010) += usb-tusb6010.o > > onenand-$(CONFIG_MTD_ONENAND_OMAP2) := gpmc-onenand.o > obj-y += $(onenand-m) $(onenand-y) > - > -nand-$(CONFIG_MTD_NAND_OMAP2) := gpmc-nand.o > -obj-y += $(nand-m) $(nand-y) > diff --git a/arch/arm/mach-omap2/gpmc-nand.c b/arch/arm/mach-omap2/gpmc-nand.c > deleted file mode 100644 > index f6ac027f3c3b..000000000000 > --- a/arch/arm/mach-omap2/gpmc-nand.c > +++ /dev/null > @@ -1,154 +0,0 @@ > -/* > - * gpmc-nand.c > - * > - * Copyright (C) 2009 Texas Instruments > - * Vimal Singh <vimalsingh@xxxxxx> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 as > - * published by the Free Software Foundation. > - */ > - > -#include <linux/kernel.h> > -#include <linux/platform_device.h> > -#include <linux/io.h> > -#include <linux/omap-gpmc.h> > -#include <linux/mtd/nand.h> > -#include <linux/platform_data/mtd-nand-omap2.h> > - > -#include <asm/mach/flash.h> > - > -#include "soc.h" > - > -/* minimum size for IO mapping */ > -#define NAND_IO_SIZE 4 > - > -static bool gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt) > -{ > - /* platforms which support all ECC schemes */ > - if (soc_is_am33xx() || soc_is_am43xx() || cpu_is_omap44xx() || > - soc_is_omap54xx() || soc_is_dra7xx()) > - return 1; > - > - if (ecc_opt == OMAP_ECC_BCH4_CODE_HW_DETECTION_SW || > - ecc_opt == OMAP_ECC_BCH8_CODE_HW_DETECTION_SW) { > - if (cpu_is_omap24xx()) > - return 0; > - else if (cpu_is_omap3630() && (GET_OMAP_REVISION() == 0)) > - return 0; > - else > - return 1; > - } > - > - /* OMAP3xxx do not have ELM engine, so cannot support ECC schemes > - * which require H/W based ECC error detection */ > - if ((cpu_is_omap34xx() || cpu_is_omap3630()) && > - ((ecc_opt == OMAP_ECC_BCH4_CODE_HW) || > - (ecc_opt == OMAP_ECC_BCH8_CODE_HW))) > - return 0; > - > - /* legacy platforms support only HAM1 (1-bit Hamming) ECC scheme */ > - if (ecc_opt == OMAP_ECC_HAM1_CODE_HW || > - ecc_opt == OMAP_ECC_HAM1_CODE_SW) > - return 1; > - else > - return 0; > -} > - > -/* This function will go away once the device-tree convertion is complete */ > -static void gpmc_set_legacy(struct omap_nand_platform_data *gpmc_nand_data, > - struct gpmc_settings *s) > -{ > - /* Enable RD PIN Monitoring Reg */ > - if (gpmc_nand_data->dev_ready) { > - s->wait_on_read = true; > - s->wait_on_write = true; > - } > - > - if (gpmc_nand_data->devsize == NAND_BUSWIDTH_16) > - s->device_width = GPMC_DEVWIDTH_16BIT; > - else > - s->device_width = GPMC_DEVWIDTH_8BIT; > -} > - > -int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data, > - struct gpmc_timings *gpmc_t) > -{ > - int err = 0; > - struct gpmc_settings s; > - struct platform_device *pdev; > - struct resource gpmc_nand_res[] = { > - { .flags = IORESOURCE_MEM, }, > - { .flags = IORESOURCE_IRQ, }, > - { .flags = IORESOURCE_IRQ, }, > - }; > - > - BUG_ON(gpmc_nand_data->cs >= GPMC_CS_NUM); > - > - err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE, > - (unsigned long *)&gpmc_nand_res[0].start); > - if (err < 0) { > - pr_err("omap2-gpmc: Cannot request GPMC CS %d, error %d\n", > - gpmc_nand_data->cs, err); > - return err; > - } > - gpmc_nand_res[0].end = gpmc_nand_res[0].start + NAND_IO_SIZE - 1; > - gpmc_nand_res[1].start = gpmc_get_client_irq(GPMC_IRQ_FIFOEVENTENABLE); > - gpmc_nand_res[2].start = gpmc_get_client_irq(GPMC_IRQ_COUNT_EVENT); > - > - memset(&s, 0, sizeof(struct gpmc_settings)); > - gpmc_set_legacy(gpmc_nand_data, &s); > - > - s.device_nand = true; > - > - if (gpmc_t) { > - err = gpmc_cs_set_timings(gpmc_nand_data->cs, gpmc_t, &s); > - if (err < 0) { > - pr_err("omap2-gpmc: Unable to set gpmc timings: %d\n", > - err); > - return err; > - } > - } > - > - err = gpmc_cs_program_settings(gpmc_nand_data->cs, &s); > - if (err < 0) > - goto out_free_cs; > - > - err = gpmc_configure(GPMC_CONFIG_WP, 0); > - if (err < 0) > - goto out_free_cs; > - > - if (!gpmc_hwecc_bch_capable(gpmc_nand_data->ecc_opt)) { > - pr_err("omap2-nand: Unsupported NAND ECC scheme selected\n"); > - err = -EINVAL; > - goto out_free_cs; > - } > - > - > - pdev = platform_device_alloc("omap2-nand", gpmc_nand_data->cs); > - if (pdev) { > - err = platform_device_add_resources(pdev, gpmc_nand_res, > - ARRAY_SIZE(gpmc_nand_res)); > - if (!err) > - pdev->dev.platform_data = gpmc_nand_data; > - } else { > - err = -ENOMEM; > - } > - if (err) > - goto out_free_pdev; > - > - err = platform_device_add(pdev); > - if (err) { > - dev_err(&pdev->dev, "Unable to register NAND device\n"); > - goto out_free_pdev; > - } > - > - return 0; > - > -out_free_pdev: > - platform_device_put(pdev); > -out_free_cs: > - gpmc_cs_free(gpmc_nand_data->cs); > - > - return err; > -} > diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c > index 725fceb2146a..5920c7eb3c01 100644 > --- a/drivers/memory/omap-gpmc.c > +++ b/drivers/memory/omap-gpmc.c > @@ -1079,7 +1079,6 @@ void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs) > { > int i; > > - reg->gpmc_status = NULL; /* deprecated */ > reg->gpmc_nand_command = gpmc_base + GPMC_CS0_OFFSET + > GPMC_CS_NAND_COMMAND + GPMC_CS_SIZE * cs; > reg->gpmc_nand_address = gpmc_base + GPMC_CS0_OFFSET + > diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c > index 2a52101120d4..7161f96e3c7d 100644 > --- a/drivers/mtd/nand/omap2.c > +++ b/drivers/mtd/nand/omap2.c > @@ -1588,8 +1588,7 @@ static bool is_elm_present(struct omap_nand_info *info, > return true; > } > > -static bool omap2_nand_ecc_check(struct omap_nand_info *info, > - struct omap_nand_platform_data *pdata) > +static bool omap2_nand_ecc_check(struct omap_nand_info *info) > { > bool ecc_needs_bch, ecc_needs_omap_bch, ecc_needs_elm; > > @@ -1804,7 +1803,6 @@ static const struct mtd_ooblayout_ops omap_sw_ooblayout_ops = { > static int omap_nand_probe(struct platform_device *pdev) > { > struct omap_nand_info *info; > - struct omap_nand_platform_data *pdata = NULL; > struct mtd_info *mtd; > struct nand_chip *nand_chip; > int err; > @@ -1814,6 +1812,9 @@ static int omap_nand_probe(struct platform_device *pdev) > int min_oobbytes = BADBLOCK_MARKER_LENGTH; > int oobbytes_per_step; > > + if (!dev->of_node) > + return -EINVAL; > + > info = devm_kzalloc(&pdev->dev, sizeof(struct omap_nand_info), > GFP_KERNEL); > if (!info) > @@ -1821,29 +1822,9 @@ static int omap_nand_probe(struct platform_device *pdev) > > info->pdev = pdev; > > - if (dev->of_node) { > - if (omap_get_dt_info(dev, info)) > - return -EINVAL; > - } else { > - pdata = dev_get_platdata(&pdev->dev); > - if (!pdata) { > - dev_err(&pdev->dev, "platform data missing\n"); > - return -EINVAL; > - } > - > - info->gpmc_cs = pdata->cs; > - info->reg = pdata->reg; > - info->ecc_opt = pdata->ecc_opt; > - if (pdata->dev_ready) > - dev_info(&pdev->dev, "pdata->dev_ready is deprecated\n"); > - > - info->xfer_type = pdata->xfer_type; > - info->devsize = pdata->devsize; > - info->elm_of_node = pdata->elm_of_node; > - info->flash_bbt = pdata->flash_bbt; > - } > + if (omap_get_dt_info(dev, info)) > + return -EINVAL; > > - platform_set_drvdata(pdev, info); > info->ops = gpmc_omap_get_nand_ops(&info->reg, info->gpmc_cs); > if (!info->ops) { > dev_err(&pdev->dev, "Failed to get GPMC->NAND interface\n"); > @@ -1993,7 +1974,7 @@ static int omap_nand_probe(struct platform_device *pdev) > goto return_error; > } > > - if (!omap2_nand_ecc_check(info, pdata)) { > + if (!omap2_nand_ecc_check(info)) { > err = -EINVAL; > goto return_error; > } > @@ -2158,10 +2139,9 @@ static int omap_nand_probe(struct platform_device *pdev) > if (err) > goto return_error; > > - if (dev->of_node) > - mtd_device_register(mtd, NULL, 0); > - else > - mtd_device_register(mtd, pdata->parts, pdata->nr_parts); > + err = mtd_device_register(mtd, NULL, 0); > + if (err) > + goto return_error; > > platform_set_drvdata(pdev, mtd); > > diff --git a/include/linux/platform_data/mtd-nand-omap2.h b/include/linux/platform_data/mtd-nand-omap2.h > index 17d57a18bac5..619df2431e75 100644 > --- a/include/linux/platform_data/mtd-nand-omap2.h > +++ b/include/linux/platform_data/mtd-nand-omap2.h > @@ -63,24 +63,5 @@ struct gpmc_nand_regs { > void __iomem *gpmc_bch_result4[GPMC_BCH_NUM_REMAINDER]; > void __iomem *gpmc_bch_result5[GPMC_BCH_NUM_REMAINDER]; > void __iomem *gpmc_bch_result6[GPMC_BCH_NUM_REMAINDER]; > - /* Deprecated. Do not use */ > - void __iomem *gpmc_status; > -}; > - > -struct omap_nand_platform_data { > - int cs; > - struct mtd_partition *parts; > - int nr_parts; > - bool flash_bbt; > - enum nand_io xfer_type; > - int devsize; > - enum omap_ecc ecc_opt; > - > - struct device_node *elm_of_node; > - > - /* deprecated */ > - struct gpmc_nand_regs reg; > - struct device_node *of_node; > - bool dev_ready; > }; > #endif > -- cheers, -roger -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html