Re: [PATCH 2/4] ARM: OMAP2+: gpmc-nand: fix error unwinding

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux