From: Rob Herring <robh@kernel.org>
To: linux-aspeed@lists.ozlabs.org
Subject: [PATCH linux v2 2/3] spi: aspeed: Handle custom decoding ranges
Date: Mon, 17 Oct 2022 13:57:30 -0500 [thread overview]
Message-ID: <20221017185730.GB2264550-robh@kernel.org> (raw)
In-Reply-To: <20221017091624.130227-3-clg@kaod.org>
On Mon, Oct 17, 2022 at 11:16:23AM +0200, C?dric Le Goater wrote:
> The "ranges" property predefines settings for the decoding ranges of
> each CS. If found in the DT, the driver applies the settings at probe
> time. The default behavior is to set the decoding range of each CS
> using the flash device size when the spi slave is setup.
>
> Cc: Naresh Solanki <naresh.solanki@9elements.com>
> Cc: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
> Signed-off-by: C?dric Le Goater <clg@kaod.org>
> ---
> drivers/spi/spi-aspeed-smc.c | 65 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 64 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/spi/spi-aspeed-smc.c b/drivers/spi/spi-aspeed-smc.c
> index b90571396a60..75e1d08bbd00 100644
> --- a/drivers/spi/spi-aspeed-smc.c
> +++ b/drivers/spi/spi-aspeed-smc.c
> @@ -96,6 +96,7 @@ struct aspeed_spi {
> u32 ahb_base_phy;
> u32 ahb_window_size;
> struct device *dev;
> + bool fixed_windows;
>
> struct clk *clk;
> u32 clk_freq;
> @@ -382,6 +383,7 @@ static const char *aspeed_spi_get_name(struct spi_mem *mem)
>
> struct aspeed_spi_window {
> u32 cs;
> + u32 reg;
> u32 offset;
> u32 size;
> };
> @@ -396,6 +398,7 @@ static void aspeed_spi_get_windows(struct aspeed_spi *aspi,
> for (cs = 0; cs < aspi->data->max_cs; cs++) {
> reg_val = readl(aspi->regs + CE0_SEGMENT_ADDR_REG + cs * 4);
> windows[cs].cs = cs;
> + windows[cs].reg = reg_val;
> windows[cs].size = data->segment_end(aspi, reg_val) -
> data->segment_start(aspi, reg_val);
> windows[cs].offset = data->segment_start(aspi, reg_val) - aspi->ahb_base_phy;
> @@ -572,7 +575,8 @@ static int aspeed_spi_dirmap_create(struct spi_mem_dirmap_desc *desc)
> if (op->data.dir != SPI_MEM_DATA_IN)
> return -EOPNOTSUPP;
>
> - aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
> + if (!aspi->fixed_windows)
> + aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
>
> if (desc->info.length > chip->ahb_window_size)
> dev_warn(aspi->dev, "CE%d window (%dMB) too small for mapping",
> @@ -712,6 +716,61 @@ static void aspeed_spi_enable(struct aspeed_spi *aspi, bool enable)
> aspeed_spi_chip_enable(aspi, cs, enable);
> }
>
> +static int aspeed_spi_chip_read_ranges(struct device_node *node, struct aspeed_spi *aspi)
> +{
> + const char *range_prop = "ranges";
> + struct property *prop;
> + struct aspeed_spi_window ranges[ASPEED_SPI_MAX_NUM_CS];
> + int prop_size;
> + int count;
> + int ret;
> + int i;
> +
> + prop = of_find_property(node, range_prop, &prop_size);
> + if (!prop)
> + return 0;
Parsing common properties yourself is generally a bad sign.
> +
> + count = prop_size / sizeof(*ranges);
> + if (count > aspi->data->max_cs) {
> + dev_err(aspi->dev, "invalid '%s' property %d\n", range_prop, count);
> + return -EINVAL;
> + }
> +
> + if (count < aspi->data->max_cs)
> + dev_dbg(aspi->dev, "'%s' property does not cover all CE\n",
> + range_prop);
> +
> + ret = of_property_read_u32_array(node, range_prop, (u32 *)ranges, count * 4);
You've just gotten it horribly wrong because you ignored #size-cells and
#address-cells.
Rob
WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robh@kernel.org>
To: "Cédric Le Goater" <clg@kaod.org>
Cc: linux-spi@vger.kernel.org, Mark Brown <broonie@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
devicetree@vger.kernel.org, linux-aspeed@lists.ozlabs.org,
openbmc@lists.ozlabs.org, Joel Stanley <joel@jms.id.au>,
Andrew Jeffery <andrew@aj.id.au>,
Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org,
Naresh Solanki <naresh.solanki@9elements.com>
Subject: Re: [PATCH linux v2 2/3] spi: aspeed: Handle custom decoding ranges
Date: Mon, 17 Oct 2022 13:57:30 -0500 [thread overview]
Message-ID: <20221017185730.GB2264550-robh@kernel.org> (raw)
In-Reply-To: <20221017091624.130227-3-clg@kaod.org>
On Mon, Oct 17, 2022 at 11:16:23AM +0200, Cédric Le Goater wrote:
> The "ranges" property predefines settings for the decoding ranges of
> each CS. If found in the DT, the driver applies the settings at probe
> time. The default behavior is to set the decoding range of each CS
> using the flash device size when the spi slave is setup.
>
> Cc: Naresh Solanki <naresh.solanki@9elements.com>
> Cc: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
> drivers/spi/spi-aspeed-smc.c | 65 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 64 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/spi/spi-aspeed-smc.c b/drivers/spi/spi-aspeed-smc.c
> index b90571396a60..75e1d08bbd00 100644
> --- a/drivers/spi/spi-aspeed-smc.c
> +++ b/drivers/spi/spi-aspeed-smc.c
> @@ -96,6 +96,7 @@ struct aspeed_spi {
> u32 ahb_base_phy;
> u32 ahb_window_size;
> struct device *dev;
> + bool fixed_windows;
>
> struct clk *clk;
> u32 clk_freq;
> @@ -382,6 +383,7 @@ static const char *aspeed_spi_get_name(struct spi_mem *mem)
>
> struct aspeed_spi_window {
> u32 cs;
> + u32 reg;
> u32 offset;
> u32 size;
> };
> @@ -396,6 +398,7 @@ static void aspeed_spi_get_windows(struct aspeed_spi *aspi,
> for (cs = 0; cs < aspi->data->max_cs; cs++) {
> reg_val = readl(aspi->regs + CE0_SEGMENT_ADDR_REG + cs * 4);
> windows[cs].cs = cs;
> + windows[cs].reg = reg_val;
> windows[cs].size = data->segment_end(aspi, reg_val) -
> data->segment_start(aspi, reg_val);
> windows[cs].offset = data->segment_start(aspi, reg_val) - aspi->ahb_base_phy;
> @@ -572,7 +575,8 @@ static int aspeed_spi_dirmap_create(struct spi_mem_dirmap_desc *desc)
> if (op->data.dir != SPI_MEM_DATA_IN)
> return -EOPNOTSUPP;
>
> - aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
> + if (!aspi->fixed_windows)
> + aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
>
> if (desc->info.length > chip->ahb_window_size)
> dev_warn(aspi->dev, "CE%d window (%dMB) too small for mapping",
> @@ -712,6 +716,61 @@ static void aspeed_spi_enable(struct aspeed_spi *aspi, bool enable)
> aspeed_spi_chip_enable(aspi, cs, enable);
> }
>
> +static int aspeed_spi_chip_read_ranges(struct device_node *node, struct aspeed_spi *aspi)
> +{
> + const char *range_prop = "ranges";
> + struct property *prop;
> + struct aspeed_spi_window ranges[ASPEED_SPI_MAX_NUM_CS];
> + int prop_size;
> + int count;
> + int ret;
> + int i;
> +
> + prop = of_find_property(node, range_prop, &prop_size);
> + if (!prop)
> + return 0;
Parsing common properties yourself is generally a bad sign.
> +
> + count = prop_size / sizeof(*ranges);
> + if (count > aspi->data->max_cs) {
> + dev_err(aspi->dev, "invalid '%s' property %d\n", range_prop, count);
> + return -EINVAL;
> + }
> +
> + if (count < aspi->data->max_cs)
> + dev_dbg(aspi->dev, "'%s' property does not cover all CE\n",
> + range_prop);
> +
> + ret = of_property_read_u32_array(node, range_prop, (u32 *)ranges, count * 4);
You've just gotten it horribly wrong because you ignored #size-cells and
#address-cells.
Rob
WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robh@kernel.org>
To: "Cédric Le Goater" <clg@kaod.org>
Cc: devicetree@vger.kernel.org, linux-aspeed@lists.ozlabs.org,
Andrew Jeffery <andrew@aj.id.au>,
openbmc@lists.ozlabs.org, linux-kernel@vger.kernel.org,
linux-spi@vger.kernel.org, Mark Brown <broonie@kernel.org>,
Joel Stanley <joel@jms.id.au>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Naresh Solanki <naresh.solanki@9elements.com>,
Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH linux v2 2/3] spi: aspeed: Handle custom decoding ranges
Date: Mon, 17 Oct 2022 13:57:30 -0500 [thread overview]
Message-ID: <20221017185730.GB2264550-robh@kernel.org> (raw)
In-Reply-To: <20221017091624.130227-3-clg@kaod.org>
On Mon, Oct 17, 2022 at 11:16:23AM +0200, Cédric Le Goater wrote:
> The "ranges" property predefines settings for the decoding ranges of
> each CS. If found in the DT, the driver applies the settings at probe
> time. The default behavior is to set the decoding range of each CS
> using the flash device size when the spi slave is setup.
>
> Cc: Naresh Solanki <naresh.solanki@9elements.com>
> Cc: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
> drivers/spi/spi-aspeed-smc.c | 65 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 64 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/spi/spi-aspeed-smc.c b/drivers/spi/spi-aspeed-smc.c
> index b90571396a60..75e1d08bbd00 100644
> --- a/drivers/spi/spi-aspeed-smc.c
> +++ b/drivers/spi/spi-aspeed-smc.c
> @@ -96,6 +96,7 @@ struct aspeed_spi {
> u32 ahb_base_phy;
> u32 ahb_window_size;
> struct device *dev;
> + bool fixed_windows;
>
> struct clk *clk;
> u32 clk_freq;
> @@ -382,6 +383,7 @@ static const char *aspeed_spi_get_name(struct spi_mem *mem)
>
> struct aspeed_spi_window {
> u32 cs;
> + u32 reg;
> u32 offset;
> u32 size;
> };
> @@ -396,6 +398,7 @@ static void aspeed_spi_get_windows(struct aspeed_spi *aspi,
> for (cs = 0; cs < aspi->data->max_cs; cs++) {
> reg_val = readl(aspi->regs + CE0_SEGMENT_ADDR_REG + cs * 4);
> windows[cs].cs = cs;
> + windows[cs].reg = reg_val;
> windows[cs].size = data->segment_end(aspi, reg_val) -
> data->segment_start(aspi, reg_val);
> windows[cs].offset = data->segment_start(aspi, reg_val) - aspi->ahb_base_phy;
> @@ -572,7 +575,8 @@ static int aspeed_spi_dirmap_create(struct spi_mem_dirmap_desc *desc)
> if (op->data.dir != SPI_MEM_DATA_IN)
> return -EOPNOTSUPP;
>
> - aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
> + if (!aspi->fixed_windows)
> + aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
>
> if (desc->info.length > chip->ahb_window_size)
> dev_warn(aspi->dev, "CE%d window (%dMB) too small for mapping",
> @@ -712,6 +716,61 @@ static void aspeed_spi_enable(struct aspeed_spi *aspi, bool enable)
> aspeed_spi_chip_enable(aspi, cs, enable);
> }
>
> +static int aspeed_spi_chip_read_ranges(struct device_node *node, struct aspeed_spi *aspi)
> +{
> + const char *range_prop = "ranges";
> + struct property *prop;
> + struct aspeed_spi_window ranges[ASPEED_SPI_MAX_NUM_CS];
> + int prop_size;
> + int count;
> + int ret;
> + int i;
> +
> + prop = of_find_property(node, range_prop, &prop_size);
> + if (!prop)
> + return 0;
Parsing common properties yourself is generally a bad sign.
> +
> + count = prop_size / sizeof(*ranges);
> + if (count > aspi->data->max_cs) {
> + dev_err(aspi->dev, "invalid '%s' property %d\n", range_prop, count);
> + return -EINVAL;
> + }
> +
> + if (count < aspi->data->max_cs)
> + dev_dbg(aspi->dev, "'%s' property does not cover all CE\n",
> + range_prop);
> +
> + ret = of_property_read_u32_array(node, range_prop, (u32 *)ranges, count * 4);
You've just gotten it horribly wrong because you ignored #size-cells and
#address-cells.
Rob
WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robh@kernel.org>
To: "Cédric Le Goater" <clg@kaod.org>
Cc: linux-spi@vger.kernel.org, Mark Brown <broonie@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
devicetree@vger.kernel.org, linux-aspeed@lists.ozlabs.org,
openbmc@lists.ozlabs.org, Joel Stanley <joel@jms.id.au>,
Andrew Jeffery <andrew@aj.id.au>,
Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org,
Naresh Solanki <naresh.solanki@9elements.com>
Subject: Re: [PATCH linux v2 2/3] spi: aspeed: Handle custom decoding ranges
Date: Mon, 17 Oct 2022 13:57:30 -0500 [thread overview]
Message-ID: <20221017185730.GB2264550-robh@kernel.org> (raw)
In-Reply-To: <20221017091624.130227-3-clg@kaod.org>
On Mon, Oct 17, 2022 at 11:16:23AM +0200, Cédric Le Goater wrote:
> The "ranges" property predefines settings for the decoding ranges of
> each CS. If found in the DT, the driver applies the settings at probe
> time. The default behavior is to set the decoding range of each CS
> using the flash device size when the spi slave is setup.
>
> Cc: Naresh Solanki <naresh.solanki@9elements.com>
> Cc: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
> drivers/spi/spi-aspeed-smc.c | 65 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 64 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/spi/spi-aspeed-smc.c b/drivers/spi/spi-aspeed-smc.c
> index b90571396a60..75e1d08bbd00 100644
> --- a/drivers/spi/spi-aspeed-smc.c
> +++ b/drivers/spi/spi-aspeed-smc.c
> @@ -96,6 +96,7 @@ struct aspeed_spi {
> u32 ahb_base_phy;
> u32 ahb_window_size;
> struct device *dev;
> + bool fixed_windows;
>
> struct clk *clk;
> u32 clk_freq;
> @@ -382,6 +383,7 @@ static const char *aspeed_spi_get_name(struct spi_mem *mem)
>
> struct aspeed_spi_window {
> u32 cs;
> + u32 reg;
> u32 offset;
> u32 size;
> };
> @@ -396,6 +398,7 @@ static void aspeed_spi_get_windows(struct aspeed_spi *aspi,
> for (cs = 0; cs < aspi->data->max_cs; cs++) {
> reg_val = readl(aspi->regs + CE0_SEGMENT_ADDR_REG + cs * 4);
> windows[cs].cs = cs;
> + windows[cs].reg = reg_val;
> windows[cs].size = data->segment_end(aspi, reg_val) -
> data->segment_start(aspi, reg_val);
> windows[cs].offset = data->segment_start(aspi, reg_val) - aspi->ahb_base_phy;
> @@ -572,7 +575,8 @@ static int aspeed_spi_dirmap_create(struct spi_mem_dirmap_desc *desc)
> if (op->data.dir != SPI_MEM_DATA_IN)
> return -EOPNOTSUPP;
>
> - aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
> + if (!aspi->fixed_windows)
> + aspeed_spi_chip_adjust_window(chip, desc->info.offset, desc->info.length);
>
> if (desc->info.length > chip->ahb_window_size)
> dev_warn(aspi->dev, "CE%d window (%dMB) too small for mapping",
> @@ -712,6 +716,61 @@ static void aspeed_spi_enable(struct aspeed_spi *aspi, bool enable)
> aspeed_spi_chip_enable(aspi, cs, enable);
> }
>
> +static int aspeed_spi_chip_read_ranges(struct device_node *node, struct aspeed_spi *aspi)
> +{
> + const char *range_prop = "ranges";
> + struct property *prop;
> + struct aspeed_spi_window ranges[ASPEED_SPI_MAX_NUM_CS];
> + int prop_size;
> + int count;
> + int ret;
> + int i;
> +
> + prop = of_find_property(node, range_prop, &prop_size);
> + if (!prop)
> + return 0;
Parsing common properties yourself is generally a bad sign.
> +
> + count = prop_size / sizeof(*ranges);
> + if (count > aspi->data->max_cs) {
> + dev_err(aspi->dev, "invalid '%s' property %d\n", range_prop, count);
> + return -EINVAL;
> + }
> +
> + if (count < aspi->data->max_cs)
> + dev_dbg(aspi->dev, "'%s' property does not cover all CE\n",
> + range_prop);
> +
> + ret = of_property_read_u32_array(node, range_prop, (u32 *)ranges, count * 4);
You've just gotten it horribly wrong because you ignored #size-cells and
#address-cells.
Rob
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-10-17 18:57 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-17 9:16 [PATCH linux v2 0/3] spi: aspeed: Add a "ranges" property Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` [PATCH linux v2 1/3] spi: dt-bindings: aspeed: Add a ranges property Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 18:51 ` Rob Herring
2022-10-17 18:51 ` Rob Herring
2022-10-17 18:51 ` Rob Herring
2022-10-17 18:51 ` Rob Herring
2022-10-17 9:16 ` [PATCH linux v2 2/3] spi: aspeed: Handle custom decoding ranges Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 18:57 ` Rob Herring [this message]
2022-10-17 18:57 ` Rob Herring
2022-10-17 18:57 ` Rob Herring
2022-10-17 18:57 ` Rob Herring
2022-10-17 9:16 ` [PATCH linux v2 3/3] spi: aspeed: Introduce a "ranges" debugfs file Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
2022-10-17 9:16 ` Cédric Le Goater
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=20221017185730.GB2264550-robh@kernel.org \
--to=robh@kernel.org \
--cc=linux-aspeed@lists.ozlabs.org \
/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.