[PATCH 1/2 v3] spi: s3c64xx: use "cs-gpios" from spi node instead of "cs-gpio"
Naveen Krishna Ch
naveenkrishna.ch at gmail.com
Wed Jun 11 04:38:00 PDT 2014
Hello Javier,
On 11 June 2014 16:43, Javier Martinez Canillas
<javier.martinez at collabora.co.uk> wrote:
> Hello Naveen,
>
> Thanks a lot for your patches and sorry that I didn't review your prior two
> versions but I didn't have the time yesterday.
>
> On 06/11/2014 08:31 AM, Naveen Krishna Chatradhi wrote:
>> Currently, spi-s3c64xx.c needs "cs-gpio" chip select GPIO to be
>> defined under "controller-data" node under each slave node.
>>
>
> I think that the commit message is not clear enough about the intentions behind
> your patch.
>
> It's not only that spi-s3c64xx needs a cs-gpio chip to be defined under
> controller-data dev node while all other SPI drivers expects cs-gpios at the top
> level, but more important that currently s3c64xx driver expects to have both
> cs-gpio (singular) at the top level *and* cs-gpio in controller data which
> doesn't make too much sense.
>
>> &spi_x {
>> cs-gpios <>;
>> ...
>
> As I said, currently it expects cs-gpio (singular) not cs-gpios (plural) as your
> example. It's important to have a correct commit message so future code
> archaeologists can have a proper picture of the situation if needed.
Will add some explanation in the example, for it to be clear.
>
>> slave_node {
>>
>> controller-data {
>> cs-gpio = <>;
>> ...
>> };
>> ...
>> };
>> ...
>> };
>>
>> Where as, SPI core and many other drivers uses "cs-gpios" for
>> from device tree node.
>>
>> Hence, make changes in spi-s3c64xx.c driver to make use of
>> "cs-gpios" from SPI node(parent) instead of "cs-gpio" defined in
>> slaves "controller-data"(child) node.
>>
>
> So, the problem is not that the binding is not consistent with other SPI drivers
> (that would have been bad but acceptable IMHO) but that it is completely broken.
> And since we have to fix it which means breaking the ABI anyways, it is better
> to make it consistent with other drivers and SPI core.
Will take this point for the while rewriting the commit messages
>
>> Also updates the Device tree Documentation.
>>
>
> While I agree with others that a binding that has been broken for a year is a
> binding that appears to not be used a lot, we should be more vocal about this
> and why breaking backward compatibility is the right approach in this case.
>
> So, in the (theoretical?) case that users find that their platform stopped to
> work with their current FDT, it will be easy for them to figure out what commit
> break it, what was the motivation to break the ABI and what changes are needed
> on their DTS to make it work again.
>
> Adding the sha1 of the culprit commit (3146bee spi: s3c64xx: Added provision for
> dedicated cs pin) that puts us in this situation will also be useful. Since the
> date of that commit is part of the rationale behind this change. (e.g: nobody
> cared about this binding and so can be changed).
Will take this point for the while rewriting the commit messages
>
>> Signed-off-by: Naveen Krishna Chatradhi <ch.naveen at samsung.com>
>> Acked-by: Rob Herring <robh at kernel.org>
>> Cc: Javier Martinez Canillas <javier.martinez at collabora.co.uk>
>> Cc: Doug Anderson <dianders at chromium.org>
>> Cc: Tomasz Figa <t.figa at samsung.com>
>> ---
>> Changes since v2:
>> 1. updated the gpios usage in Documentation
>> 2. use the spi->cs_gpio in the driver, instead of parsing the node again.
>> 3. Corrected error check of the of.node and during gpio_free
>>
>> .../devicetree/bindings/spi/spi-samsung.txt | 8 +++-----
>> drivers/spi/spi-s3c64xx.c | 18 ++++++------------
>> 2 files changed, 9 insertions(+), 17 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/spi/spi-samsung.txt b/Documentation/devicetree/bindings/spi/spi-samsung.txt
>> index 86aa061..2d29dac 100644
>> --- a/Documentation/devicetree/bindings/spi/spi-samsung.txt
>> +++ b/Documentation/devicetree/bindings/spi/spi-samsung.txt
>> @@ -42,15 +42,13 @@ Optional Board Specific Properties:
>> - num-cs: Specifies the number of chip select lines supported. If
>> not specified, the default number of chip select lines is set to 1.
>>
>> +- cs-gpios: should specify GPIOs used for chipselects (see spi-bus.txt)
>> +
>> SPI Controller specific data in SPI slave nodes:
>>
>> - The spi slave nodes should provide the following information which is required
>> by the spi controller.
>>
>> - - cs-gpio: A gpio specifier that specifies the gpio line used as
>> - the slave select line by the spi controller. The format of the gpio
>> - specifier depends on the gpio controller.
>> -
>> - samsung,spi-feedback-delay: The sampling phase shift to be applied on the
>> miso line (to account for any lag in the miso line). The following are the
>> valid values.
>> @@ -85,6 +83,7 @@ Example:
>> #size-cells = <0>;
>> pinctrl-names = "default";
>> pinctrl-0 = <&spi0_bus>;
>> + cs-gpios = <&gpa2 5 0>;
>>
>> w25q80bw at 0 {
>> #address-cells = <1>;
>> @@ -94,7 +93,6 @@ Example:
>> spi-max-frequency = <10000>;
>>
>> controller-data {
>> - cs-gpio = <&gpa2 5 1 0 3>;
>> samsung,spi-feedback-delay = <0>;
>> };
>>
>> diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
>> index 75a5696..842b148 100644
>> --- a/drivers/spi/spi-s3c64xx.c
>> +++ b/drivers/spi/spi-s3c64xx.c
>> @@ -772,24 +772,19 @@ static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(
>>
>> cs = kzalloc(sizeof(*cs), GFP_KERNEL);
>> if (!cs) {
>> - of_node_put(data_np);
>
> Why are you removing this?
>
> You are not removing the call to of_get_child_by_name(slave_np,
> "controller-data") so on failure data_np reference counter still needs to be
> decremented.
>
>> return ERR_PTR(-ENOMEM);
>> }
>>
>> - /* The CS line is asserted/deasserted by the gpio pin */
>> - if (sdd->cs_gpio)
>> - cs->line = of_get_named_gpio(data_np, "cs-gpio", 0);
>> -
>> - if (!gpio_is_valid(cs->line)) {
>> + if (!gpio_is_valid(spi->cs_gpio)) {
>> dev_err(&spi->dev, "chip select gpio is not specified or invalid\n");
>> - kfree(cs);
>> - of_node_put(data_np);
>
> Again, it's wrong to remove this of_node_put(data_np) call.
Actually, i wanted to move down the of_get_child_by_name() to before
of_property_read_u32() call.
>
>> return ERR_PTR(-EINVAL);
>> }
>> + cs->line = spi->cs_gpio;
>>
>
> I wonder why are you keeping cs->line? AFAICT it's only used in
> s3c64xx_spi_setup() to request the GPIO and since you get the struct spi_device
> pointer as a parameter then you can just use spi->s_gpio instead.
I'm trying not to touch the non-DT part of the code.
struct s3c64xx_spi_csinfo *cs = spi->controller_data;
This will update the cs->line and cs->fb_delay in case of non-DT.
>
>> of_property_read_u32(data_np, "samsung,spi-feedback-delay", &fb_delay);
>> cs->fb_delay = fb_delay;
>> of_node_put(data_np);
>> +
>
> Usually is better to not mix style and functionality changes in the same patch
> since it makes harder to review.
>
>> return cs;
>> }
>>
>> @@ -828,8 +823,6 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
>> cs->line, err);
>> goto err_gpio_req;
>> }
>> -
>> - spi->cs_gpio = cs->line;
>> }
>>
>> spi_set_ctldata(spi, cs);
>> @@ -884,7 +877,8 @@ setup_exit:
>> /* setup() returns with device de-selected */
>> writel(S3C64XX_SPI_SLAVE_SIG_INACT, sdd->regs + S3C64XX_SPI_SLAVE_SEL);
>>
>> - gpio_free(cs->line);
>> + if (cs->line)
>> + gpio_free(cs->line);
>
> Same here, we can just get rid of cs->line and use gpio_free(spi->cs_gpio) instead.
This is to keep the non-DT part untouched.
>
>> spi_set_ctldata(spi, NULL);
>>
>> err_gpio_req:
>> @@ -1077,7 +1071,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
>> sdd->sfr_start = mem_res->start;
>> sdd->cs_gpio = true;
>> if (pdev->dev.of_node) {
>> - if (!of_find_property(pdev->dev.of_node, "cs-gpio", NULL))
>> + if (!of_find_property(pdev->dev.of_node, "cs-gpios", NULL))
>> sdd->cs_gpio = false;
>
> I think we can get rid of sdd->cs_gpio as well. You can always use
> gpio_is_valid(spi->cs_gpio) or if (master->cs_gpios) to figure out if the SPI
> device has a cs-gpios array associated.
This is to keep the non-DT part untouched
>
>>
>> ret = of_alias_get_id(pdev->dev.of_node, "spi");
>>
>
> Best regards,
> Javier
Will re-spin after waiting for a couple of more comments.
Thanks for your review.
--
Shine bright,
(: Nav :)
More information about the linux-arm-kernel
mailing list