diff mbox

spi: rspi: Increase accuracy of bit rate for RZ

Message ID 1470404163-27427-1-git-send-email-chris.brandt@renesas.com (mailing list archive)
State Accepted
Commit aeb8f8cb1537450e99f7d8f1a1d84d55b0fc6b26
Headers show

Commit Message

Chris Brandt Aug. 5, 2016, 1:36 p.m. UTC
When you leave the clock divider at 0, 130kHz is the lowest you can go.
Also, by adjusting the clock divider you can get more accurate resolutions
for clock speeds lower than 16MHz. This patch uses the clock divider as
part of the bit rate setup.

Signed-off-by: Chris Brandt <chris.brandt@renesas.com>
---
 drivers/spi/spi-rspi.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Geert Uytterhoeven Aug. 29, 2016, 3:43 p.m. UTC | #1
Hi Chris,

On Fri, Aug 5, 2016 at 3:36 PM, Chris Brandt <chris.brandt@renesas.com> wrote:
> When you leave the clock divider at 0, 130kHz is the lowest you can go.
> Also, by adjusting the clock divider you can get more accurate resolutions
> for clock speeds lower than 16MHz. This patch uses the clock divider as
> part of the bit rate setup.
>
> Signed-off-by: Chris Brandt <chris.brandt@renesas.com>
> ---
>  drivers/spi/spi-rspi.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
> index 8188433..a816f07 100644
> --- a/drivers/spi/spi-rspi.c
> +++ b/drivers/spi/spi-rspi.c
> @@ -295,14 +295,24 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size)
>  static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size)
>  {
>         int spbr;
> +       int div = 0;
> +       unsigned long clksrc;
>
>         /* Sets output mode, MOSI signal, and (optionally) loopback */
>         rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR);
>
> +       clksrc = clk_get_rate(rspi->clk);
> +       while (div < 3) {
> +               if (rspi->max_speed_hz >= clksrc/4) /* 4=(CLK/2)/2 */
> +                       break;
> +               div++;
> +               clksrc /= 2;
> +       }
> +
>         /* Sets transfer bit rate */
> -       spbr = DIV_ROUND_UP(clk_get_rate(rspi->clk),
> -                           2 * rspi->max_speed_hz) - 1;
> +       spbr = DIV_ROUND_UP(clksrc, 2 * rspi->max_speed_hz) - 1;
>         rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR);
> +       rspi->spcmd |= div << 2;
>
>         /* Disable dummy transmission, set byte access */
>         rspi_write8(rspi, SPDCR_SPLBYTE, RSPI_SPDCR);

I believe this applies not only to RZ, but to all other supported RSPI variants?
Hence I think it should be made common.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chris Brandt Aug. 29, 2016, 4:21 p.m. UTC | #2
SGkgR2VlcnQsDQoNCk9uIE1vbiwgQXVnIDI5LCAyMDE2LCBHZWVydCBVeXR0ZXJob2V2ZW4gd3Jv
dGU6DQo+IEkgYmVsaWV2ZSB0aGlzIGFwcGxpZXMgbm90IG9ubHkgdG8gUlosIGJ1dCB0byBhbGwg
b3RoZXIgc3VwcG9ydGVkIFJTUEkgdmFyaWFudHM/DQo+IEhlbmNlIEkgdGhpbmsgaXQgc2hvdWxk
IGJlIG1hZGUgY29tbW9uLg0KDQpJIHdvdWxkIHRoaW5rIGl0IHdvdWxkIGJlIHRoZSBzYW1lIGZv
ciBhbGwgdGhlIG90aGVyIHBhcnRzIHdpdGggUlNQSS4NCg0KQ3VycmVudGx5IHRoZXJlIGFyZSAz
IHNlcGFyYXRlIGNvbmZpZyBmdW5jdGlvbnM6DQogLSByc3BpX3NldF9jb25maWdfcmVnaXN0ZXIN
CiAtIHJzcGlfcnpfc2V0X2NvbmZpZ19yZWdpc3Rlcg0KIC0gcXNwaV9zZXRfY29uZmlnX3JlZ2lz
dGVyDQoNCkJ5ICJjb21tb24iLCBkbyB5b3UgbWVhbjoNCkEpIGFkZCB0aGUgc2FtZSBjb2RlIHRv
IGVhY2ggb2YgdGhlIG90aGVyIDIgZnVuY3Rpb25zPw0KICAgICAoaWUsIGNvbW1vbiBmdW5jdGlv
bmFsaXR5IGZvciBhbGwgZGV2aWNlKQ0KDQpCKSBtYWtlIHNvbWUgbmV3IGZ1bmN0aW9uL21hY3Jv
IHRoYXQgYWxsIGNvbmZpZyBmdW5jdGlvbnMgY2FsbD8NCiAgICAgKGllLCBzYW1lIGNvZGUgZm9y
IHNldHRpbmcgdGhlIHJlZ2lzdGVyIGJpdHMpDQoNCg0KTm90ZTogSSBvbmx5IHJlYWxseSBoYXZl
IGEgUlovQSBwbGF0Zm9ybSwgc28gSSBjYW4ndCByZWFsbHkgdGVzdCBpdCBvbiBhbnkgb3RoZXIg
ZGV2aWNlcyAob3RoZXIgdGhhbiBqdXN0IGxvb2tpbmcgaW4gdGhlIGhhcmR3YXJlIG1hbnVhbHMp
DQoNCkNocmlzDQoNCg0K
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
index 8188433..a816f07 100644
--- a/drivers/spi/spi-rspi.c
+++ b/drivers/spi/spi-rspi.c
@@ -295,14 +295,24 @@  static int rspi_set_config_register(struct rspi_data *rspi, int access_size)
 static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size)
 {
 	int spbr;
+	int div = 0;
+	unsigned long clksrc;
 
 	/* Sets output mode, MOSI signal, and (optionally) loopback */
 	rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR);
 
+	clksrc = clk_get_rate(rspi->clk);
+	while (div < 3) {
+		if (rspi->max_speed_hz >= clksrc/4) /* 4=(CLK/2)/2 */
+			break;
+		div++;
+		clksrc /= 2;
+	}
+
 	/* Sets transfer bit rate */
-	spbr = DIV_ROUND_UP(clk_get_rate(rspi->clk),
-			    2 * rspi->max_speed_hz) - 1;
+	spbr = DIV_ROUND_UP(clksrc, 2 * rspi->max_speed_hz) - 1;
 	rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR);
+	rspi->spcmd |= div << 2;
 
 	/* Disable dummy transmission, set byte access */
 	rspi_write8(rspi, SPDCR_SPLBYTE, RSPI_SPDCR);