All of lore.kernel.org
 help / color / mirror / Atom feed
From: Piotr Sroka <piotrs@cadence.com>
To: Dmitry Osipenko <digetx@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>,
	Boris Brezillon <bbrezillon@kernel.org>,
	Marcel Ziswiler <marcel.ziswiler@toradex.com>,
	Richard Weinberger <richard@nod.at>,
	linux-kernel@vger.kernel.org, Stefan Agner <stefan@agner.ch>,
	Marek Vasut <marek.vasut@gmail.com>,
	Paul Burton <paul.burton@mips.com>,
	Geert Uytterhoeven <geert@linux-m68k.org>,
	Miquel Raynal <miquel.raynal@bootlin.com>,
	linux-mtd@lists.infradead.org,
	Brian Norris <computersforpeace@gmail.com>,
	David Woodhouse <dwmw2@infradead.org>
Subject: Re: [v3 1/2] mtd: nand: Add Cadence NAND controller driver
Date: Tue, 25 Jun 2019 14:02:33 +0100	[thread overview]
Message-ID: <20190625130231.GA31865@global.cadence.com> (raw)
In-Reply-To: <dd96bd1b-e944-e95d-31c9-6dd1d0b5720f@gmail.com>

Hi Dmitry

The 06/16/2019 16:42, Dmitry Osipenko wrote:
>EXTERNAL MAIL
>
>
>14.06.2019 18:09, Piotr Sroka пишет:
>
>Commit description is mandatory.
>
>> Signed-off-by: Piotr Sroka <piotrs@cadence.com>
>> ---
>
>[snip]
>
>> +
>> +/* Cadnence NAND flash controller capabilities get from driver data. */
>> +struct cadence_nand_dt_devdata {
>> +	/* Skew value of the output signals of the NAND Flash interface. */
>> +	u32 if_skew;
>> +	/* It informs if aging feature in the DLL PHY supported. */
>> +	u8 phy_dll_aging;
>> +	/*
>> +	 * It informs if per bit deskew for read and write path in
>> +	 * the PHY is supported.
>> +	 */
>> +	u8 phy_per_bit_deskew;
>> +	/* It informs if slave DMA interface is connected to DMA engine. */
>> +	u8 has_dma;
>
>There is no needed to dedicate 8 bits to a variable if you only care about a single
>bit. You may write this as:
>
>bool has_dma : 1;
I modified it locally but it looks that checkpatch does not like such
notation
"WARNING: Avoid using bool as bitfield.  Prefer bool bitfields as
unsigned int or u<8|16|32>"
So maybe I will leave it as is.

>[snip]
>
>> +static struct
>> +cdns_nand_chip *to_cdns_nand_chip(struct nand_chip *chip)
>> +{
>> +	return container_of(chip, struct cdns_nand_chip, chip);
>> +}
>> +
>> +static struct
>> +cdns_nand_ctrl *to_cdns_nand_ctrl(struct nand_controller *controller)
>> +{
>> +	return container_of(controller, struct cdns_nand_ctrl, controller);
>> +}
>
>It's better to inline explicitly such cases because they won't get inlined with some
>kernel configurations, like enabled ftracing for example.
>
>> +static bool
>> +cadence_nand_dma_buf_ok(struct cdns_nand_ctrl *cdns_ctrl, const void *buf,
>> +			u32 buf_len)
>> +{
>> +	u8 data_dma_width = cdns_ctrl->caps2.data_dma_width;
>> +
>> +	return buf && virt_addr_valid(buf) &&
>> +		likely(IS_ALIGNED((uintptr_t)buf, data_dma_width)) &&
>> +		likely(IS_ALIGNED(buf_len, data_dma_width));
>> +}
>> +
>> +static int cadence_nand_wait_for_value(struct cdns_nand_ctrl *cdns_ctrl,
>> +				       u32 reg_offset, u32 timeout_us,
>> +				       u32 mask, bool is_clear)
>> +{
>> +	u32 val;
>> +	int ret = 0;
>> +
>> +	ret = readl_poll_timeout(cdns_ctrl->reg + reg_offset,
>> +				 val, !(val & mask) == is_clear,
>> +				 10, timeout_us);
>
>Apparently you don't care about having memory barrier here, hence
>readl_relaxed_poll_timeout().
ok I will update it.
>
>> +	if (ret < 0) {
>> +		dev_err(cdns_ctrl->dev,
>> +			"Timeout while waiting for reg %x with mask %x is clear %d\n",
>> +			reg_offset, mask, is_clear);
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>> +static int cadence_nand_set_ecc_enable(struct cdns_nand_ctrl *cdns_ctrl,
>> +				       bool enable)
>> +{
>> +	u32 reg;
>> +
>> +	if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS,
>> +					1000000,
>> +					CTRL_STATUS_CTRL_BUSY, true))
>> +		return -ETIMEDOUT;
>> +
>> +	reg = readl(cdns_ctrl->reg + ECC_CONFIG_0);
>> +
>> +	if (enable)
>> +		reg |= ECC_CONFIG_0_ECC_EN;
>> +	else
>> +		reg &= ~ECC_CONFIG_0_ECC_EN;
>> +
>> +	writel(reg, cdns_ctrl->reg + ECC_CONFIG_0);
>
>And here.. looks like there is no need for the memory barries, hence use the relaxed
>versions of readl/writel. Same for the rest of the patch.
>
ok
>> +	return 0;
>> +}
>> +
>> +static void cadence_nand_set_ecc_strength(struct cdns_nand_ctrl *cdns_ctrl,
>> +					  u8 corr_str_idx)
>> +{
>> +	u32 reg;
>> +
>> +	if (cdns_ctrl->curr_corr_str_idx == corr_str_idx)
>> +		return;
>> +
>> +	reg = readl(cdns_ctrl->reg + ECC_CONFIG_0);
>> +	reg &= ~ECC_CONFIG_0_CORR_STR;
>> +	reg |= FIELD_PREP(ECC_CONFIG_0_CORR_STR, corr_str_idx);
>> +	writel(reg, cdns_ctrl->reg + ECC_CONFIG_0);
>> +
>> +	cdns_ctrl->curr_corr_str_idx = corr_str_idx;
>> +}
>> +
>> +static u8 cadence_nand_get_ecc_strength_idx(struct cdns_nand_ctrl *cdns_ctrl,
>> +					    u8 strength)
>> +{
>> +	u8 i, corr_str_idx = 0;
>> +
>> +	for (i = 0; i < BCH_MAX_NUM_CORR_CAPS; i++) {
>> +		if (cdns_ctrl->ecc_strengths[i] == strength) {
>> +			corr_str_idx = i;
>> +			break;
>> +		}
>> +	}
>
>Is it a error case when i == BCH_MAX_NUM_CORR_CAPS?
Yes it is an error but it could appear only if ECC capability registers
have wrong values. I will handle that error anyway.

>> +	return corr_str_idx;
>> +}
>> +
>> +static int cadence_nand_set_skip_marker_val(struct cdns_nand_ctrl *cdns_ctrl,
>> +					    u16 marker_value)
>> +{
>> +	u32 reg = 0;
>> +
>> +	if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS,
>> +					1000000,
>> +					CTRL_STATUS_CTRL_BUSY, true))
>> +		return -ETIMEDOUT;
>> +
>> +	reg = readl(cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +	reg &= ~SKIP_BYTES_MARKER_VALUE;
>> +	reg |= FIELD_PREP(SKIP_BYTES_MARKER_VALUE,
>> +		    marker_value);
>> +
>> +	writel(reg, cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +
>> +	return 0;
>> +}
>> +
>> +static int cadence_nand_set_skip_bytes_conf(struct cdns_nand_ctrl *cdns_ctrl,
>> +					    u8 num_of_bytes,
>> +					    u32 offset_value,
>> +					    int enable)
>> +{
>> +	u32 reg = 0;
>> +	u32 skip_bytes_offset = 0;
>
>Please don't initialize variables if not necessary. You could also write this in a
>single line.
>
>	u32 skip_bytes_offset, reg;
>
>Same for the rest of the patch.
>
Ok to I will change it.
>> +	if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS,
>> +					1000000,
>> +					CTRL_STATUS_CTRL_BUSY, true))
>> +		return -ETIMEDOUT;
>> +
>> +	if (!enable) {
>> +		num_of_bytes = 0;
>> +		offset_value = 0;
>> +	}
>> +
>> +	reg = readl(cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +	reg &= ~SKIP_BYTES_NUM_OF_BYTES;
>> +	reg |= FIELD_PREP(SKIP_BYTES_NUM_OF_BYTES,
>> +		    num_of_bytes);
>> +	skip_bytes_offset = FIELD_PREP(SKIP_BYTES_OFFSET_VALUE,
>> +				       offset_value);
>> +
>> +	writel(reg, cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +	writel(skip_bytes_offset, cdns_ctrl->reg + SKIP_BYTES_OFFSET);
>> +
>> +	return 0;
>> +}
>> +
>> +/* Fucntions enables/disables hardware detection of erased data */
>
>s/Fucntions/Function/, please use spellchecker. I'd also recommend to start all
>single-line comments with a lower case (and without a dot in the end) because it is a
>more common style in the kernel and is a bit easier for the eyes.
Ok  I will do it. 
>
>[snip]
  
Thanks
Piotr Sroka

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

WARNING: multiple messages have this Message-ID (diff)
From: Piotr Sroka <piotrs@cadence.com>
To: Dmitry Osipenko <digetx@gmail.com>
Cc: <linux-kernel@vger.kernel.org>,
	Boris Brezillon <bbrezillon@kernel.org>,
	Miquel Raynal <miquel.raynal@bootlin.com>,
	Richard Weinberger <richard@nod.at>,
	David Woodhouse <dwmw2@infradead.org>,
	Brian Norris <computersforpeace@gmail.com>,
	Marek Vasut <marek.vasut@gmail.com>,
	"Paul Burton" <paul.burton@mips.com>,
	Geert Uytterhoeven <geert@linux-m68k.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Marcel Ziswiler <marcel.ziswiler@toradex.com>,
	Stefan Agner <stefan@agner.ch>, <linux-mtd@lists.infradead.org>
Subject: Re: [v3 1/2] mtd: nand: Add Cadence NAND controller driver
Date: Tue, 25 Jun 2019 14:02:33 +0100	[thread overview]
Message-ID: <20190625130231.GA31865@global.cadence.com> (raw)
In-Reply-To: <dd96bd1b-e944-e95d-31c9-6dd1d0b5720f@gmail.com>

Hi Dmitry

The 06/16/2019 16:42, Dmitry Osipenko wrote:
>EXTERNAL MAIL
>
>
>14.06.2019 18:09, Piotr Sroka пишет:
>
>Commit description is mandatory.
>
>> Signed-off-by: Piotr Sroka <piotrs@cadence.com>
>> ---
>
>[snip]
>
>> +
>> +/* Cadnence NAND flash controller capabilities get from driver data. */
>> +struct cadence_nand_dt_devdata {
>> +	/* Skew value of the output signals of the NAND Flash interface. */
>> +	u32 if_skew;
>> +	/* It informs if aging feature in the DLL PHY supported. */
>> +	u8 phy_dll_aging;
>> +	/*
>> +	 * It informs if per bit deskew for read and write path in
>> +	 * the PHY is supported.
>> +	 */
>> +	u8 phy_per_bit_deskew;
>> +	/* It informs if slave DMA interface is connected to DMA engine. */
>> +	u8 has_dma;
>
>There is no needed to dedicate 8 bits to a variable if you only care about a single
>bit. You may write this as:
>
>bool has_dma : 1;
I modified it locally but it looks that checkpatch does not like such
notation
"WARNING: Avoid using bool as bitfield.  Prefer bool bitfields as
unsigned int or u<8|16|32>"
So maybe I will leave it as is.

>[snip]
>
>> +static struct
>> +cdns_nand_chip *to_cdns_nand_chip(struct nand_chip *chip)
>> +{
>> +	return container_of(chip, struct cdns_nand_chip, chip);
>> +}
>> +
>> +static struct
>> +cdns_nand_ctrl *to_cdns_nand_ctrl(struct nand_controller *controller)
>> +{
>> +	return container_of(controller, struct cdns_nand_ctrl, controller);
>> +}
>
>It's better to inline explicitly such cases because they won't get inlined with some
>kernel configurations, like enabled ftracing for example.
>
>> +static bool
>> +cadence_nand_dma_buf_ok(struct cdns_nand_ctrl *cdns_ctrl, const void *buf,
>> +			u32 buf_len)
>> +{
>> +	u8 data_dma_width = cdns_ctrl->caps2.data_dma_width;
>> +
>> +	return buf && virt_addr_valid(buf) &&
>> +		likely(IS_ALIGNED((uintptr_t)buf, data_dma_width)) &&
>> +		likely(IS_ALIGNED(buf_len, data_dma_width));
>> +}
>> +
>> +static int cadence_nand_wait_for_value(struct cdns_nand_ctrl *cdns_ctrl,
>> +				       u32 reg_offset, u32 timeout_us,
>> +				       u32 mask, bool is_clear)
>> +{
>> +	u32 val;
>> +	int ret = 0;
>> +
>> +	ret = readl_poll_timeout(cdns_ctrl->reg + reg_offset,
>> +				 val, !(val & mask) == is_clear,
>> +				 10, timeout_us);
>
>Apparently you don't care about having memory barrier here, hence
>readl_relaxed_poll_timeout().
ok I will update it.
>
>> +	if (ret < 0) {
>> +		dev_err(cdns_ctrl->dev,
>> +			"Timeout while waiting for reg %x with mask %x is clear %d\n",
>> +			reg_offset, mask, is_clear);
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>> +static int cadence_nand_set_ecc_enable(struct cdns_nand_ctrl *cdns_ctrl,
>> +				       bool enable)
>> +{
>> +	u32 reg;
>> +
>> +	if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS,
>> +					1000000,
>> +					CTRL_STATUS_CTRL_BUSY, true))
>> +		return -ETIMEDOUT;
>> +
>> +	reg = readl(cdns_ctrl->reg + ECC_CONFIG_0);
>> +
>> +	if (enable)
>> +		reg |= ECC_CONFIG_0_ECC_EN;
>> +	else
>> +		reg &= ~ECC_CONFIG_0_ECC_EN;
>> +
>> +	writel(reg, cdns_ctrl->reg + ECC_CONFIG_0);
>
>And here.. looks like there is no need for the memory barries, hence use the relaxed
>versions of readl/writel. Same for the rest of the patch.
>
ok
>> +	return 0;
>> +}
>> +
>> +static void cadence_nand_set_ecc_strength(struct cdns_nand_ctrl *cdns_ctrl,
>> +					  u8 corr_str_idx)
>> +{
>> +	u32 reg;
>> +
>> +	if (cdns_ctrl->curr_corr_str_idx == corr_str_idx)
>> +		return;
>> +
>> +	reg = readl(cdns_ctrl->reg + ECC_CONFIG_0);
>> +	reg &= ~ECC_CONFIG_0_CORR_STR;
>> +	reg |= FIELD_PREP(ECC_CONFIG_0_CORR_STR, corr_str_idx);
>> +	writel(reg, cdns_ctrl->reg + ECC_CONFIG_0);
>> +
>> +	cdns_ctrl->curr_corr_str_idx = corr_str_idx;
>> +}
>> +
>> +static u8 cadence_nand_get_ecc_strength_idx(struct cdns_nand_ctrl *cdns_ctrl,
>> +					    u8 strength)
>> +{
>> +	u8 i, corr_str_idx = 0;
>> +
>> +	for (i = 0; i < BCH_MAX_NUM_CORR_CAPS; i++) {
>> +		if (cdns_ctrl->ecc_strengths[i] == strength) {
>> +			corr_str_idx = i;
>> +			break;
>> +		}
>> +	}
>
>Is it a error case when i == BCH_MAX_NUM_CORR_CAPS?
Yes it is an error but it could appear only if ECC capability registers
have wrong values. I will handle that error anyway.

>> +	return corr_str_idx;
>> +}
>> +
>> +static int cadence_nand_set_skip_marker_val(struct cdns_nand_ctrl *cdns_ctrl,
>> +					    u16 marker_value)
>> +{
>> +	u32 reg = 0;
>> +
>> +	if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS,
>> +					1000000,
>> +					CTRL_STATUS_CTRL_BUSY, true))
>> +		return -ETIMEDOUT;
>> +
>> +	reg = readl(cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +	reg &= ~SKIP_BYTES_MARKER_VALUE;
>> +	reg |= FIELD_PREP(SKIP_BYTES_MARKER_VALUE,
>> +		    marker_value);
>> +
>> +	writel(reg, cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +
>> +	return 0;
>> +}
>> +
>> +static int cadence_nand_set_skip_bytes_conf(struct cdns_nand_ctrl *cdns_ctrl,
>> +					    u8 num_of_bytes,
>> +					    u32 offset_value,
>> +					    int enable)
>> +{
>> +	u32 reg = 0;
>> +	u32 skip_bytes_offset = 0;
>
>Please don't initialize variables if not necessary. You could also write this in a
>single line.
>
>	u32 skip_bytes_offset, reg;
>
>Same for the rest of the patch.
>
Ok to I will change it.
>> +	if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS,
>> +					1000000,
>> +					CTRL_STATUS_CTRL_BUSY, true))
>> +		return -ETIMEDOUT;
>> +
>> +	if (!enable) {
>> +		num_of_bytes = 0;
>> +		offset_value = 0;
>> +	}
>> +
>> +	reg = readl(cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +	reg &= ~SKIP_BYTES_NUM_OF_BYTES;
>> +	reg |= FIELD_PREP(SKIP_BYTES_NUM_OF_BYTES,
>> +		    num_of_bytes);
>> +	skip_bytes_offset = FIELD_PREP(SKIP_BYTES_OFFSET_VALUE,
>> +				       offset_value);
>> +
>> +	writel(reg, cdns_ctrl->reg + SKIP_BYTES_CONF);
>> +	writel(skip_bytes_offset, cdns_ctrl->reg + SKIP_BYTES_OFFSET);
>> +
>> +	return 0;
>> +}
>> +
>> +/* Fucntions enables/disables hardware detection of erased data */
>
>s/Fucntions/Function/, please use spellchecker. I'd also recommend to start all
>single-line comments with a lower case (and without a dot in the end) because it is a
>more common style in the kernel and is a bit easier for the eyes.
Ok  I will do it. 
>
>[snip]
  
Thanks
Piotr Sroka

  reply	other threads:[~2019-06-25 13:03 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-14 15:06 [v3 0/2] mtd: nand: Add Cadence NAND controller driver Piotr Sroka
2019-06-14 15:06 ` Piotr Sroka
2019-06-14 15:09 ` [v3 1/2] " Piotr Sroka
2019-06-14 15:09   ` Piotr Sroka
2019-06-14 15:13   ` [v3 2/2] dt-bindings: " Piotr Sroka
2019-06-14 15:13     ` Piotr Sroka
2019-06-14 15:13     ` Piotr Sroka
2019-07-09 14:48     ` Rob Herring
2019-07-09 14:48       ` Rob Herring
2019-07-17 10:58       ` Piotr Sroka
2019-07-17 10:58         ` Piotr Sroka
2019-06-16 13:42   ` [v3 1/2] mtd: " Dmitry Osipenko
2019-06-16 13:42     ` Dmitry Osipenko
2019-06-25 13:02     ` Piotr Sroka [this message]
2019-06-25 13:02       ` Piotr Sroka
2019-06-25 14:45       ` Dmitry Osipenko
2019-06-25 14:45         ` Dmitry Osipenko
2019-06-25 15:23         ` Geert Uytterhoeven
2019-06-25 15:23           ` Geert Uytterhoeven

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190625130231.GA31865@global.cadence.com \
    --to=piotrs@cadence.com \
    --cc=arnd@arndb.de \
    --cc=bbrezillon@kernel.org \
    --cc=computersforpeace@gmail.com \
    --cc=digetx@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=geert@linux-m68k.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=marcel.ziswiler@toradex.com \
    --cc=marek.vasut@gmail.com \
    --cc=miquel.raynal@bootlin.com \
    --cc=paul.burton@mips.com \
    --cc=richard@nod.at \
    --cc=stefan@agner.ch \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.