From: Stefano Babic <sbabic@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2] spi: mxc_spi: Update pre and post divider algorithm
Date: Wed, 12 Jun 2013 17:42:10 +0200 [thread overview]
Message-ID: <51B896D2.7000503@denx.de> (raw)
In-Reply-To: <51B8071A.6050107@de.bosch.com>
Hi Dirk,
On 12/06/2013 07:28, Dirk Behme wrote:
> On 11.05.2013 07:25, Dirk Behme wrote:
>> The spi clock divisor is of the form x * (2**y), or x << y, where x is
>> 1 to 16, and y is 0 to 15. Note the similarity with floating point
>> numbers.
>> Convert the desired divisor to the smallest number which is >= desired
>> divisor,
>> and can be represented in this form. The previous algorithm chose a
>> divisor
>> which could be almost twice as large as needed.
>>
>> Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
>> Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
>
> While we are talking about a first -rc now, could we get these two patches
>
> http://patchwork.ozlabs.org/patch/242709/
>
> http://patchwork.ozlabs.org/patch/243113/
Sorry to come late with these two patches - after a first glance when
you post then, I put the patches at the bottom of my queue and I never
checked again.
I will work them before end of the week.
Best regards,
Stefano Babic
>
> applied?
>
> Thanks
>
> Dirk
>
>> ---
>>
>> Notes:
>>
>> - Changes in v2: Make the alogrithm simpler by removing the -1 as
>> proposed
>> by Troy. Make the pre_div and post_div u32.
>>
>> - This replaces v1 of this patch and depends on the previous sent patch
>> http://patchwork.ozlabs.org/patch/242709/
>>
>> drivers/spi/mxc_spi.c | 30 ++++++++++++------------------
>> 1 file changed, 12 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
>> index 3e903b3..e87b899 100644
>> --- a/drivers/spi/mxc_spi.c
>> +++ b/drivers/spi/mxc_spi.c
>> @@ -128,8 +128,8 @@ static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs,
>> unsigned int cs,
>> unsigned int max_hz, unsigned int mode)
>> {
>> u32 clk_src = mxc_get_clock(MXC_CSPI_CLK);
>> - s32 pre_div = 1, post_div = 0, i, reg_ctrl, reg_config;
>> - u32 ss_pol = 0, sclkpol = 0, sclkpha = 0;
>> + s32 reg_ctrl, reg_config;
>> + u32 ss_pol = 0, sclkpol = 0, sclkpha = 0, pre_div = 0, post_div = 0;
>> struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
>>
>> if (max_hz == 0) {
>> @@ -147,26 +147,20 @@ static s32 spi_cfg_mxc(struct mxc_spi_slave
>> *mxcs, unsigned int cs,
>> reg_ctrl |= MXC_CSPICTRL_EN;
>> reg_write(®s->ctrl, reg_ctrl);
>>
>> - /*
>> - * The following computation is taken directly from Freescale's
>> code.
>> - */
>> if (clk_src > max_hz) {
>> - pre_div = DIV_ROUND_UP(clk_src, max_hz);
>> - if (pre_div > 16) {
>> - post_div = pre_div / 16;
>> - pre_div = 16;
>> - }
>> - if (post_div != 0) {
>> - for (i = 0; i < 16; i++) {
>> - if ((1 << i) >= post_div)
>> - break;
>> - }
>> - if (i == 16) {
>> + pre_div = (clk_src - 1) / max_hz;
>> + /* fls(1) = 1, fls(0x80000000) = 32, fls(16) = 5 */
>> + post_div = fls(pre_div);
>> + if (post_div > 4) {
>> + post_div -= 4;
>> + if (post_div >= 16) {
>> printf("Error: no divider for the freq: %d\n",
>> max_hz);
>> return -1;
>> }
>> - post_div = i;
>> + pre_div >>= post_div;
>> + } else {
>> + post_div = 0;
>> }
>> }
>>
>> @@ -174,7 +168,7 @@ static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs,
>> unsigned int cs,
>> reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_SELCHAN(3)) |
>> MXC_CSPICTRL_SELCHAN(cs);
>> reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_PREDIV(0x0F)) |
>> - MXC_CSPICTRL_PREDIV(pre_div - 1);
>> + MXC_CSPICTRL_PREDIV(pre_div);
>> reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_POSTDIV(0x0F)) |
>> MXC_CSPICTRL_POSTDIV(post_div);
>>
>>
>
>
>
--
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
next prev parent reply other threads:[~2013-06-12 15:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-11 5:25 [U-Boot] [PATCH v2] spi: mxc_spi: Update pre and post divider algorithm Dirk Behme
2013-06-12 5:28 ` Dirk Behme
2013-06-12 15:42 ` Stefano Babic [this message]
2013-06-12 15:47 ` Jagan Teki
2013-06-12 16:00 ` Stefano Babic
2013-06-12 16:13 ` Jagan Teki
2013-06-26 14:24 ` Stefano Babic
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=51B896D2.7000503@denx.de \
--to=sbabic@denx.de \
--cc=u-boot@lists.denx.de \
/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.