All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dirk Behme <dirk.behme@de.bosch.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] spi: mxc_spi: Fix pre and post divider calculation
Date: Fri, 3 May 2013 07:58:45 +0200	[thread overview]
Message-ID: <51835215.90602@de.bosch.com> (raw)
In-Reply-To: <5182B2AA.9040606@boundarydevices.com>

On 02.05.2013 20:38, Troy Kisky wrote:
> On 5/2/2013 3:59 AM, Dirk Behme wrote:
>> From: Dirk Behme <dirk.behme@gmail.com>
>>
>> Fix two issues with the calculation of pre_div and post_div:
>>
>> 1. pre_div: While the calculation of pre_div looks correct, to set the
>> CONREG[15-12] bits pre_div needs to be decremented by 1:
>>
>> The i.MX 6Dual/6Quad Applications Processor Reference Manual (IMX6DQRM
>> Rev. 0, 11/2012) states:
>>
>> CONREG[15-12]: PRE_DIVIDER
>> 0000 Divide by 1
>> 0001 Divide by 2
>> 0010 Divide by 3
>> ...
>> 1101 Divide by 14
>> 1110 Divide by 15
>> 1111 Divide by 16
>>
>> I.e. if we want to divide by 2, we have to write 1 to CONREG[15-12].
>>
>> 2. In case the post divider becomes necessary, pre_div will be set to 15. To
>> calculate the post divider, divide by 15, too. And not 16.
>>
>> Both issues above are tested using the following examples:
>>
>> clk_src = 60000000 (60MHz, default i.MX6 ECSPI clock)
>>
>> a) max_hz == 23000000 (23MHz, max i.MX6 ECSPI read clock)
>>
>> -> pre_div =  3 (divide by 3 => CONREG[15-12] == 2)
>> -> post_div = 0 (divide by 1 => CONREG[11- 8] == 0)
>>                  => 60MHz / 3 = 20MHz SPI clock
>>
>> b) max_hz == 2000000 (2MHz)
>>
>> -> pre_div =  15 (divide by 15 => CONREG[15-12] == 14)
>> -> post_div = 1  (divide by  2 => CONREG[11- 8] == 1)
>>                  => 60MHz / 30 = 2MHz SPI clock
>>
>> c) max_hz == 1000000 (1MHz)
>>
>> -> pre_div =  15 (divide by 15 => CONREG[15-12] == 14)
>> -> post_div = 2  (divide by  4 => CONREG[11- 8] == 2)
>>                  => 60MHz / 60 = 1MHz SPI clock
>>
>> d) max_hz == 500000 (500kHz)
>>
>> -> pre_div =  15 (divide by 15 => CONREG[15-12] == 14)
>> -> post_div = 3  (divide by  8 => CONREG[11- 8] == 3)
>>                  => 60MHz / 120 = 500kHz SPI clock
>>
>> Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
>> ---
>>    drivers/spi/mxc_spi.c | 6 +++---
>>    1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
>> index 5bed858..8630bbd 100644
>> --- a/drivers/spi/mxc_spi.c
>> +++ b/drivers/spi/mxc_spi.c
>> @@ -128,7 +128,7 @@ 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 = 0, post_div = 0, i, reg_ctrl, reg_config;
>> +	s32 pre_div = 1, post_div = 0, i, reg_ctrl, reg_config;
>>    	u32 ss_pol = 0, sclkpol = 0, sclkpha = 0;
>>    	struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
>>
>> @@ -153,7 +153,7 @@ static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
>>    	if (clk_src > max_hz) {
>>    		pre_div = DIV_ROUND_UP(clk_src, max_hz);
>>    		if (pre_div > 16) {
>> -			post_div = pre_div / 16;
>> +			post_div = pre_div / 15;
> I think this should not change

Hmm, why? You get wrong post_div dividers if you run with 'pre_div = 15' 
and '/16'. Hmm, reading your below comment do you want to say

"I agree that both lines

post_div = pre_div / 16;
pre_div = 15;

have to use the same value, but instead of using 15, use 16
"

?

>>    			pre_div = 15;
> and this should be = 16, because you now subtract 1 below

Do you want to say you propose

post_div = pre_div / 16;
pre_div = 16;

?

If so:

First, I agree that we have to use the same dividers in both lines.

But, second, this would mean that you use /16 as max pre_div. For the 
i.MX6 case where clk_src is 60MHz this would result in a pre-divided 
clock of 3.75Mhz (instead of 4MHz with /15).

So using /15 or /16 is just a decision of which end clocks most probably 
are needed.

If you want to be able to configure 4MHz, 2MHz, 1MHz, 500kHz etc then 
/15 is the better choice.

If you want to be able to configure 3.75Mhz, 1.875MHz, 937.5kHz, 
468.75kHz etc then /16 is the better choice.

I vote for /15 as done by my patch.

Best regards

Dirk

>>    		}
>>    		if (post_div != 0) {
>> @@ -174,7 +174,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);
>> +		MXC_CSPICTRL_PREDIV(pre_div - 1);
>>    	reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_POSTDIV(0x0F)) |
>>    		MXC_CSPICTRL_POSTDIV(post_div);
>>
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>


-- 
======================================================================
Dirk Behme                      Robert Bosch Car Multimedia GmbH
                                 CM-AI/PJ-CF32
Phone: +49 5121 49-3274         Dirk Behme
Fax:   +49 711 811 5053274      PO Box 77 77 77
mailto:dirk.behme at de.bosch.com  D-31132 Hildesheim - Germany

Bosch Group, Car Multimedia (CM)
              Automotive Navigation and Infotainment Systems (AI)
              ProJect - CoreFunctions (PJ-CF)

Robert Bosch Car Multimedia GmbH - Ein Unternehmen der Bosch Gruppe
Sitz: Hildesheim
Registergericht: Amtsgericht Hildesheim HRB 201334
Aufsichtsratsvorsitzender: Volkmar Denner
Gesch?ftsf?hrung: Uwe Thomas, Michael Bolle, Robby Drave, Egbert Hellwig
======================================================================

  reply	other threads:[~2013-05-03  5:58 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-02 10:59 [U-Boot] [PATCH] spi: mxc_spi: Fix pre and post divider calculation Dirk Behme
2013-05-02 18:38 ` Troy Kisky
2013-05-03  5:58   ` Dirk Behme [this message]
2013-05-03 20:47     ` Troy Kisky
2013-05-04 10:06       ` Dirk Behme
2013-05-06 18:26         ` Troy Kisky

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=51835215.90602@de.bosch.com \
    --to=dirk.behme@de.bosch.com \
    --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.