spi: s3c64xx: fix broken "cs_gpios" usage in the driver
Subsystems (4)
PATCH v4 1/3 spi: s3c64xx: fix broken "cs_gpios" usage in the driver
Since, (3146bee spi: s3c64xx: Added provision for dedicated cs pin)
spi-s3c64xx.c driver expects
1. chip select gpios from "cs-gpio"(singular) under the "controller-data" node of the client/slave device of the SPI.
2. "cs-gpio"(singular) entry to be present in the SPI device node.
Eg of current broken usage:
&spi_1 {
cs-gpio <>; /* this entry is checked during probe */
...
slave_node {
controller-data {
cs-gpio <&gpioa2 5 0>;
/* This field is parsed during .setup() */
}
};
};The following dts files which were using this driver. But, din't have the "cs-gpio" entry under SPI node.
-- arch/arm/boot/dts/exynos4210-smdkv310.dts
-- arch/arm/boot/dts/exynos4412-trats2.dts
-- arch/arm/boot/dts/exynos5250-smdk5250.dts
Also, the SPI core and many drivers moved on to using "cs-gpios" from SPI node and removed the gpio handling code from drivers (including spi-s3c64xx.c).
Hence, spi-s3c64xx.c is broken since "Jun 21 11:26:12 2013" and considering the time with no compliants about the breakage.
We are assuming it is safe to remove the "cs-gpio"(singular) usage from device tree binding of spi-samsung.txt and makes appropriate changes in the driver to use "cs-gpios"(plural) from SPI device node.
--- .../devicetree/bindings/spi/spi-samsung.txt | 8 ++-- drivers/spi/spi-s3c64xx.c | 41 ++++++++------------ 2 files changed, 20 insertions(+), 29 deletions(-)
Documentation/devicetree/bindings/spi/spi-samsung.txt +3 -5
@@ -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>; };
drivers/spi/spi-s3c64xx.c +17 -24
92 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH v4 2/3 spi: s3c64xx: for DT platofrms always get the chipselect info from DT node
Use controller_data structure only for the Non Device tree platforms. For Device tree platforms, always derive the chipselect info from DT node.
--- drivers/spi/spi-s3c64xx.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/spi/spi-s3c64xx.c +6 -5
@@ -795,14 +795,15 @@ static int s3c64xx_spi_setup(struct spi_device *spi)int err; sdd =spi_master_get_devdata (spi->master); -if (!cs && spi->dev.of_node) { +if (spi->dev.of_node) { cs =s3c64xx_get_slave_ctrldata (spi); spi->controller_data = cs; - } - -/* For the non-DT platforms derive chip selects from controller data */ -if (!spi->dev.of_node) + }else { +/* For the non-DT platforms derive chip +* selects from controller data +*/ spi->cs_gpio = cs->line; + }if (IS_ERR_OR_NULL (cs)) {dev_err (&spi->dev,"No CS for SPI(%d)\n" , spi->chip_select);
Signature · 1 line
1.7.9.5
PATCH v4 2/3 spi: s3c64xx: for DT platofrms always get the chipselect info from DT node
Hello Naveen,
Quoted 28 lines · Naveen Krishna Chatradhi
Use
controller_datastructure only for the Non Device tree platforms. For Device tree platforms, always derive the chipselect info from DT node.Signed-off-by Naveen Krishna Chatradhi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>--- drivers/spi/spi-s3c64xx.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)drivers/spi/spi-s3c64xx.c +1
-4@@ -795,14 +795,15 @@ static int s3c64xx_spi_setup(struct spi_device *spi)int err; sdd =spi_master_get_devdata (spi->master); -if (!cs && spi->dev.of_node) { +if (spi->dev.of_node) { cs =s3c64xx_get_slave_ctrldata (spi); spi->controller_data = cs; - } - -/* For the non-DT platforms derive chip selects from controller data */
drivers/spi/spi-s3c64xx.c static int s3c64xx_spi_setup(struct spi_device *spi) · line 809
Quoted 10 lines
drivers/spi/spi-s3c64xx.c +5
-1-if (!spi->dev.of_node) + }else { +/* For the non-DT platforms derive chip +* selects from controller data +*/ spi->cs_gpio = cs->line; + }if (IS_ERR_OR_NULL (cs)) {dev_err (&spi->dev,"No CS for SPI(%d)\n" , spi->chip_select);
Personally I wouldn't have this change as a separate patch since it's too related to what you changed in Patch 1. But it's just a nitpick.
Best regards,
Javier
PATCH v4 2/3 spi: s3c64xx: for DT platofrms always get the chipselect info from DT node
Hello Javier,
Quoted 38 lines · Javier Martinez Canillas
Hello Naveen,
Quoted 35 lines · Naveen Krishna Chatradhi
Use
controller_datastructure only for the Non Device tree platforms. For Device tree platforms, always derive the chipselect info from DT node.Signed-off-by Naveen Krishna Chatradhi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>--- drivers/spi/spi-s3c64xx.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)drivers/spi/spi-s3c64xx.c +6
-5@@ -795,14 +795,15 @@ static int s3c64xx_spi_setup(struct spi_device *spi)int err; sdd =spi_master_get_devdata (spi->master); -if (!cs && spi->dev.of_node) { +if (spi->dev.of_node) { cs =s3c64xx_get_slave_ctrldata (spi); spi->controller_data = cs; - } - -/* For the non-DT platforms derive chip selects from controller data */ -if (!spi->dev.of_node) + }else { +/* For the non-DT platforms derive chip +* selects from controller data +*/ spi->cs_gpio = cs->line; + }
Quoted 6 lines
drivers/spi/spi-s3c64xx.c static int s3c64xx_spi_setup(struct spi_device *spi) · line 809
Quoted 3 lines
drivers/spi/spi-s3c64xx.c +0
-0if (IS_ERR_OR_NULL (cs)) {dev_err (&spi->dev,"No CS for SPI(%d)\n" , spi->chip_select);Personally I wouldn't have this change as a separate patch since it's too related to what you changed in Patch 1. But it's just a nitpick.
Patch 1/3 seems to be crowded with multiple changes. Thought, this would keep the changes cleaner.
Quoted 2 lines
Reviewed-by Javier Martinez Canillas <[email protected]>
Thanks
Quoted 3 lines
Best regards,
Javier
Signature · 2 lines
Shine bright, (: Nav :)
PATCH v4 2/3 spi: s3c64xx: for DT platofrms always get the chipselect info from DT node
In reply to Naveen Krishna ChatradhiNaveen,
Quoted 11 lines · Naveen Krishna Chatradhi
Use
controller_datastructure only for the Non Device tree platforms. For Device tree platforms, always derive the chipselect info from DT node.Signed-off-by Naveen Krishna Chatradhi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>--- drivers/spi/spi-s3c64xx.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
I'm not planning to do an in-depth review of this patch since it seems that others are on top of it, but I've tested it. With it (and some patches that haven't been sent up yet) I can talk to the EC on exynos5420-pit (which uses device tree for specifying the cs-gpios)
PATCH v4 3/3 ARM: DTS: fix the chip select gpios definition in the SPI nodes
In reply to Naveen Krishna ChatradhiThis patch replaces the "cs-gpio" from "controller-data" node as was specified in the old binding and use the standard "cs-gpios" property expected by the SPI core as is defined in the new binding.
Respective changes are preposed to spi-s3c64xx.c driver. @ http://www.spinics.net/lists/linux-samsung-soc/msg32282.html
--- arch/arm/boot/dts/exynos4210-smdkv310.dts | 2 +- arch/arm/boot/dts/exynos4412-trats2.dts | 2 +- arch/arm/boot/dts/exynos5250-smdk5250.dts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
arch/arm/boot/dts/exynos4210-smdkv310.dts +1 -1
@@ -169,6 +169,7 @@ spi_2: spi at 13940000 { status = "okay"; + cs-gpios = <&gpc1 2 0>; w25x80 at 0 { #address-cells = <1>;
@@ -178,7 +179,6 @@ spi-max-frequency = <1000000>; controller-data { - cs-gpio = <&gpc1 2 0>; samsung,spi-feedback-delay = <0>; };
arch/arm/boot/dts/exynos4412-trats2.dts +1 -1
@@ -512,6 +512,7 @@ spi_1: spi at 13930000 { pinctrl-names = "default"; pinctrl-0 = <&spi1_bus>; + cs-gpios = <&gpb 5 0>; status = "okay"; s5c73m3_spi: s5c73m3 {
@@ -519,7 +520,6 @@ spi-max-frequency = <50000000>; reg = <0>; controller-data { - cs-gpio = <&gpb 5 0>; samsung,spi-feedback-delay = <2>; }; };
arch/arm/boot/dts/exynos5250-smdk5250.dts +1 -1
@@ -316,6 +316,7 @@ }; spi_1: spi at 12d30000 { + cs-gpios = <&gpa2 5 0>; status = "okay"; w25q80bw at 0 {
@@ -326,7 +327,6 @@ spi-max-frequency = <1000000>; controller-data { - cs-gpio = <&gpa2 5 0>; samsung,spi-feedback-delay = <0>; };
Signature · 1 line
1.7.9.5
PATCH v4 3/3 ARM: DTS: fix the chip select gpios definition in the SPI nodes
Hello Naveen,
Quoted 73 lines · Naveen Krishna Chatradhi
This patch replaces the "cs-gpio" from "controller-data" node as was specified in the old binding and use the standard "cs-gpios" property expected by the SPI core as is defined in the new binding.
Respective changes are preposed to
spi-s3c64xx.cdriver. @ http://www.spinics.net/lists/linux-samsung-soc/msg32282.htmlSigned-off-by Naveen Krishna Chatradhi <[email protected]>Acked-by Rob Herring <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>--- arch/arm/boot/dts/exynos4210-smdkv310.dts | 2 +- arch/arm/boot/dts/exynos4412-trats2.dts | 2 +- arch/arm/boot/dts/exynos5250-smdk5250.dts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)arch/arm/boot/dts/exynos4210-smdkv310.dts +1
-1@@ -169,6 +169,7 @@ spi_2: spi at 13940000 { status = "okay"; + cs-gpios = <&gpc1 2 0>; w25x80 at 0 { #address-cells = <1>;@@ -178,7 +179,6 @@ spi-max-frequency = <1000000>; controller-data { - cs-gpio = <&gpc1 2 0>; samsung,spi-feedback-delay = <0>; };arch/arm/boot/dts/exynos4412-trats2.dts +1
-1@@ -512,6 +512,7 @@ spi_1: spi at 13930000 { pinctrl-names = "default"; pinctrl-0 = <&spi1_bus>; + cs-gpios = <&gpb 5 0>; status = "okay"; s5c73m3_spi: s5c73m3 {@@ -519,7 +520,6 @@ spi-max-frequency = <50000000>; reg = <0>; controller-data { - cs-gpio = <&gpb 5 0>; samsung,spi-feedback-delay = <2>; }; };arch/arm/boot/dts/exynos5250-smdk5250.dts +1
-0@@ -316,6 +316,7 @@ }; spi_1: spi at 12d30000 { + cs-gpios = <&gpa2 5 0>; status = "okay"; w25q80bw at 0 {
arch/arm/boot/dts/exynos5250-smdk5250.dts line 332
Quoted 7 lines
arch/arm/boot/dts/exynos5250-smdk5250.dts +0
-1@@ -326,7 +327,6 @@ spi-max-frequency = <1000000>; controller-data { - cs-gpio = <&gpa2 5 0>; samsung,spi-feedback-delay = <0>; };
Looks good to me.
Best regards,
Javier
PATCH v4 3/3 ARM: DTS: fix the chip select gpios definition in the SPI nodes
In reply to Naveen Krishna ChatradhiHi,
Quoted 13 lines · Naveen Krishna Chatradhi
This patch replaces the "cs-gpio" from "controller-data" node as was specified in the old binding and use the standard "cs-gpios" property expected by the SPI core as is defined in the new binding.
Respective changes are preposed to
spi-s3c64xx.cdriver. @ http://www.spinics.net/lists/linux-samsung-soc/msg32282.htmlSigned-off-by Naveen Krishna Chatradhi <[email protected]>Acked-by Rob Herring <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>
Quoted 5 lines
--- arch/arm/boot/dts/exynos4210-smdkv310.dts | 2 +- arch/arm/boot/dts/exynos4412-trats2.dts | 2 +- arch/arm/boot/dts/exynos5250-smdk5250.dts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
This looks fine, though I will note that you're not very consistent with the ordering of "cs-gpios" and "status".
PATCH v4 1/3 spi: s3c64xx: fix broken "cs_gpios" usage in the driver
In reply to Naveen Krishna ChatradhiHello Naveen,
Quoted 38 lines · Naveen Krishna Chatradhi
Since, (3146bee spi: s3c64xx: Added provision for dedicated cs pin)
spi-s3c64xx.cdriver expects
1. chip select gpios from "cs-gpio"(singular) under the "controller-data" node of the client/slave device of the SPI.2. "cs-gpio"(singular) entry to be present in the SPI device node.
Eg of current broken usage:
&spi_1 { cs-gpio <>; /* this entry is checked during probe */ ... slave_node { controller-data { cs-gpio <&gpioa2 5 0>; /* This field is parsed during .setup() */ } }; };The following dts files which were using this driver. But, din't have the "cs-gpio" entry under SPI node.
--arch/arm/boot/dts/exynos4210-smdkv310.dts
--arch/arm/boot/dts/exynos4412-trats2.dts
--arch/arm/boot/dts/exynos5250-smdk5250.dtsAlso, the SPI core and many drivers moved on to using "cs-gpios" from SPI node and removed the gpio handling code from drivers (including
spi-s3c64xx.c).Hence,
spi-s3c64xx.cis broken since "Jun 21 11:26:12 2013" and considering the time with no compliants about the breakage.We are assuming it is safe to remove the "cs-gpio"(singular) usage from device tree binding of spi-samsung.txt and makes appropriate changes in the driver to use "cs-gpios"(plural) from SPI device node.
Quoted 6 lines
Signed-off-by Naveen Krishna Chatradhi <[email protected]>Acked-by Rob Herring <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>---
Usually when you send a new version of a series is good to keep a history of the patch-set so reviewers don't have to look at the previous threads in order to see what changed from version to version.
Anything that is between "---" and the actual diff is not part of a commit and tools like git am omits that part so that's were you usually describe the history.
Quoted 136 lines
.../devicetree/bindings/spi/spi-samsung.txt | 8 ++-- drivers/spi/spi-s3c64xx.c | 41 ++++++++------------ 2 files changed, 20 insertions(+), 29 deletions(-)Documentation/devicetree/bindings/spi/spi-samsung.txt +3
-5@@ -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>; };drivers/spi/spi-s3c64xx.c +17
-20@@ -197,7 +197,6 @@ struct s3c64xx_spi_driver_data {struct s3c64xx_spi_dma_data tx_dma;struct s3c64xx_spi_port_config *port_conf;unsigned int port_id; -bool cs_gpio; };static void flush_fifo (struct s3c64xx_spi_driver_data *sdd)@@ -776,17 +775,6 @@ static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(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)) { -dev_err (&spi->dev,"chip select gpio is not specified or invalid\n" ); -kfree (cs); -of_node_put (data_np); -return ERR_PTR (-EINVAL ); - } -of_property_read_u32 (data_np,"samsung,spi-feedback-delay" , &fb_delay); cs->fb_delay = fb_delay;of_node_put (data_np);@@ -812,6 +800,10 @@ static int s3c64xx_spi_setup(struct spi_device *spi) spi->controller_data = cs; } +/* For the non-DT platforms derive chip selects from controller data */ +if (!spi->dev.of_node) + spi->cs_gpio = cs->line; +if (IS_ERR_OR_NULL (cs)) {dev_err (&spi->dev,"No CS for SPI(%d)\n" , spi->chip_select);return -ENODEV ;@@ -819,17 +811,19 @@ static int s3c64xx_spi_setup(struct spi_device *spi)if (!spi_get_ctldata (spi)) {/* Request gpio only if cs line is asserted by gpio pins */ -if (sdd->cs_gpio) { - err =gpio_request_one (cs->line,GPIOF_OUT_INIT_HIGH , -dev_name (&spi->dev)); +if (gpio_is_valid (spi->cs_gpio)) { + err =gpio_request_one (spi->cs_gpio, +GPIOF_OUT_INIT_HIGH , +dev_name (&spi->dev));if (err) {dev_err (&spi->dev,"Failed to get /CS gpio [%d]: %d\n" , - cs->line, err); + spi->cs_gpio, err); goto err_gpio_req; } - - spi->cs_gpio = cs->line; + }else { +dev_err (&spi->dev,"chip select gpio is invalid\n" ); +return -EINVAL ; }spi_set_ctldata (spi, cs);@@ -884,7 +878,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 (gpio_is_valid (spi->cs_gpio)) +gpio_free (spi->cs_gpio);spi_set_ctldata (spi,NULL ); err_gpio_req:@@ -900,10 +895,12 @@ static void s3c64xx_spi_cleanup(struct spi_device *spi)struct s3c64xx_spi_driver_data *sdd; sdd =spi_master_get_devdata (spi->master); -if (spi->cs_gpio) { +if (gpio_is_valid (spi->cs_gpio)) {gpio_free (spi->cs_gpio);if (spi->dev.of_node)kfree (cs); +else + spi->cs_gpio = -ENOENT ; }spi_set_ctldata (spi,NULL ); }@@ -1075,11 +1072,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev) sdd->cntrlr_info = sci;
drivers/spi/spi-s3c64xx.c static int s3c64xx_spi_probe(struct platform_device *pdev) · line 1078
Quoted 10 lines
drivers/spi/spi-s3c64xx.c +0
-4sdd->pdev = 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 )) - sdd->cs_gpio = false; - ret =of_alias_get_id (pdev->dev.of_node,"spi" );if (ret <0 ) { dev_err(&pdev->dev, "failed to get alias id, errno %d\n",
Your changes look good to me now.
Best regards,
Javier
PATCH v4 1/3 spi: s3c64xx: fix broken "cs_gpios" usage in the driver
Hello Javier,
Quoted 48 lines · Javier Martinez Canillas
Hello Naveen,
Quoted 38 lines · Naveen Krishna Chatradhi
Since, (3146bee spi: s3c64xx: Added provision for dedicated cs pin)
spi-s3c64xx.cdriver expects
1. chip select gpios from "cs-gpio"(singular) under the "controller-data" node of the client/slave device of the SPI.2. "cs-gpio"(singular) entry to be present in the SPI device node.
Eg of current broken usage:
&spi_1 { cs-gpio <>; /* this entry is checked during probe */ ... slave_node { controller-data { cs-gpio <&gpioa2 5 0>; /* This field is parsed during .setup() */ } }; };The following dts files which were using this driver. But, din't have the "cs-gpio" entry under SPI node.
--arch/arm/boot/dts/exynos4210-smdkv310.dts
--arch/arm/boot/dts/exynos4412-trats2.dts
--arch/arm/boot/dts/exynos5250-smdk5250.dtsAlso, the SPI core and many drivers moved on to using "cs-gpios" from SPI node and removed the gpio handling code from drivers (including
spi-s3c64xx.c).Hence,
spi-s3c64xx.cis broken since "Jun 21 11:26:12 2013" and considering the time with no compliants about the breakage.We are assuming it is safe to remove the "cs-gpio"(singular) usage from device tree binding of spi-samsung.txt and makes appropriate changes in the driver to use "cs-gpios"(plural) from SPI device node.
Quoted 6 lines
Signed-off-by Naveen Krishna Chatradhi <[email protected]>Acked-by Rob Herring <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>---
Quoted 3 lines
Usually when you send a new version of a series is good to keep a history of the patch-set so reviewers don't have to look at the previous threads in order to see what changed from version to version.
Yes, I usually keep track of all the changes in my previous CLs. But, I missed it in this version my bad.
Quoted 3 lines
Anything that is between "---" and the actual diff is not part of a commit and tools like git am omits that part so that's were you usually describe the history.
I've used it in my earlier patches.
Anyway, Thanks for the detailed information.
Quoted 150 lines
Quoted 137 lines
.../devicetree/bindings/spi/spi-samsung.txt | 8 ++-- drivers/spi/spi-s3c64xx.c | 41 ++++++++------------ 2 files changed, 20 insertions(+), 29 deletions(-)Documentation/devicetree/bindings/spi/spi-samsung.txt +3
-5@@ -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>; };drivers/spi/spi-s3c64xx.c +17
-20@@ -197,7 +197,6 @@ struct s3c64xx_spi_driver_data {struct s3c64xx_spi_dma_data tx_dma;struct s3c64xx_spi_port_config *port_conf;unsigned int port_id; -bool cs_gpio; };static void flush_fifo (struct s3c64xx_spi_driver_data *sdd)@@ -776,17 +775,6 @@ static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(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)) { -dev_err (&spi->dev,"chip select gpio is not specified or invalid\n" ); -kfree (cs); -of_node_put (data_np); -return ERR_PTR (-EINVAL ); - } -of_property_read_u32 (data_np,"samsung,spi-feedback-delay" , &fb_delay); cs->fb_delay = fb_delay;of_node_put (data_np);@@ -812,6 +800,10 @@ static int s3c64xx_spi_setup(struct spi_device *spi) spi->controller_data = cs; } +/* For the non-DT platforms derive chip selects from controller data */ +if (!spi->dev.of_node) + spi->cs_gpio = cs->line; +if (IS_ERR_OR_NULL (cs)) {dev_err (&spi->dev,"No CS for SPI(%d)\n" , spi->chip_select);return -ENODEV ;@@ -819,17 +811,19 @@ static int s3c64xx_spi_setup(struct spi_device *spi)if (!spi_get_ctldata (spi)) {/* Request gpio only if cs line is asserted by gpio pins */ -if (sdd->cs_gpio) { - err =gpio_request_one (cs->line,GPIOF_OUT_INIT_HIGH , -dev_name (&spi->dev)); +if (gpio_is_valid (spi->cs_gpio)) { + err =gpio_request_one (spi->cs_gpio, +GPIOF_OUT_INIT_HIGH , +dev_name (&spi->dev));if (err) {dev_err (&spi->dev,"Failed to get /CS gpio [%d]: %d\n" , - cs->line, err); + spi->cs_gpio, err); goto err_gpio_req; } - - spi->cs_gpio = cs->line; + }else { +dev_err (&spi->dev,"chip select gpio is invalid\n" ); +return -EINVAL ; }spi_set_ctldata (spi, cs);@@ -884,7 +878,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 (gpio_is_valid (spi->cs_gpio)) +gpio_free (spi->cs_gpio);spi_set_ctldata (spi,NULL ); err_gpio_req:@@ -900,10 +895,12 @@ static void s3c64xx_spi_cleanup(struct spi_device *spi)struct s3c64xx_spi_driver_data *sdd; sdd =spi_master_get_devdata (spi->master); -if (spi->cs_gpio) { +if (gpio_is_valid (spi->cs_gpio)) {gpio_free (spi->cs_gpio);if (spi->dev.of_node)kfree (cs); +else + spi->cs_gpio = -ENOENT ; }spi_set_ctldata (spi,NULL ); }@@ -1075,11 +1072,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev) sdd->cntrlr_info = sci;drivers/spi/spi-s3c64xx.c static int s3c64xx_spi_probe(struct platform_device *pdev) · line 1078
Quoted 10 lines
drivers/spi/spi-s3c64xx.c +0
-4sdd->pdev = 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 )) - sdd->cs_gpio = false; - ret =of_alias_get_id (pdev->dev.of_node,"spi" );if (ret <0 ) { dev_err(&pdev->dev, "failed to get alias id, errno %d\n",Your changes look good to me now.
Quoted 1 line
Reviewed-by Javier Martinez Canillas <[email protected]>
Thanks for your review.
Quoted 3 lines
Best regards,
Javier
Signature · 2 lines
Shine bright, (: Nav :)
PATCH v4 1/3 spi: s3c64xx: fix broken "cs_gpios" usage in the driver
In reply to Naveen Krishna ChatradhiNaveen,
Quoted 43 lines · Naveen Krishna Chatradhi
Since, (3146bee spi: s3c64xx: Added provision for dedicated cs pin)
spi-s3c64xx.cdriver expects
1. chip select gpios from "cs-gpio"(singular) under the "controller-data" node of the client/slave device of the SPI.2. "cs-gpio"(singular) entry to be present in the SPI device node.
Eg of current broken usage:
&spi_1 { cs-gpio <>; /* this entry is checked during probe */ ... slave_node { controller-data { cs-gpio <&gpioa2 5 0>; /* This field is parsed during .setup() */ } }; };The following dts files which were using this driver. But, din't have the "cs-gpio" entry under SPI node.
--arch/arm/boot/dts/exynos4210-smdkv310.dts
--arch/arm/boot/dts/exynos4412-trats2.dts
--arch/arm/boot/dts/exynos5250-smdk5250.dtsAlso, the SPI core and many drivers moved on to using "cs-gpios" from SPI node and removed the gpio handling code from drivers (including
spi-s3c64xx.c).Hence,
spi-s3c64xx.cis broken since "Jun 21 11:26:12 2013" and considering the time with no compliants about the breakage.We are assuming it is safe to remove the "cs-gpio"(singular) usage from device tree binding of spi-samsung.txt and makes appropriate changes in the driver to use "cs-gpios"(plural) from SPI device node.
Signed-off-by Naveen Krishna Chatradhi <[email protected]>Acked-by Rob Herring <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Doug Anderson <[email protected]>Cc Tomasz Figa <[email protected]>
Quoted 4 lines
--- .../devicetree/bindings/spi/spi-samsung.txt | 8 ++-- drivers/spi/spi-s3c64xx.c | 41 ++++++++------------ 2 files changed, 20 insertions(+), 29 deletions(-)
I'm not planning to do an in-depth review of this patch since it seems that others are on top of it, but I've tested it. With it (and some patches that haven't been sent up yet) I can talk to the EC on exynos5420-pit.