Message ID | 1470404163-27427-1-git-send-email-chris.brandt@renesas.com (mailing list archive) |
---|---|
State | Accepted |
Commit | aeb8f8cb1537450e99f7d8f1a1d84d55b0fc6b26 |
Headers | show |
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
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 --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);
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(-)