diff mbox

[U-Boot,5/7] ARM: sunxi-mmc: Add mmc support for sun6i / A31

Message ID 1410182892-18647-6-git-send-email-wens@csie.org
State Superseded
Delegated to: Ian Campbell
Headers show

Commit Message

Chen-Yu Tsai Sept. 8, 2014, 1:28 p.m. UTC
From: Hans de Goede <hdegoede@redhat.com>

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
[wens@csie.org: use setbits_le32 for reset control, drop obsolete changes,
		squash "sunxi-mmc: sun6i has its fifo at a different address"]
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
---
 arch/arm/include/asm/arch-sunxi/mmc.h | 2 --
 drivers/mmc/sunxi_mmc.c               | 9 +++++++++
 2 files changed, 9 insertions(+), 2 deletions(-)

Comments

Ian Campbell Sept. 21, 2014, 6:44 p.m. UTC | #1
On Mon, 2014-09-08 at 21:28 +0800, Chen-Yu Tsai wrote:
> From: Hans de Goede <hdegoede@redhat.com>
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> [wens@csie.org: use setbits_le32 for reset control, drop obsolete changes,
> 		squash "sunxi-mmc: sun6i has its fifo at a different address"]
> Signed-off-by: Chen-Yu Tsai <wens@csie.org>

Adding CC to Pantelis (MMC custodian).

Pantelis, once you are happy with this I propose we take this via the
sunxi tree along with the rest of the series.

For my part I only have nitpicks:

> ---
>  arch/arm/include/asm/arch-sunxi/mmc.h | 2 --
>  drivers/mmc/sunxi_mmc.c               | 9 +++++++++
>  2 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h b/arch/arm/include/asm/arch-sunxi/mmc.h
> index 53196e3..bafde4b 100644
> --- a/arch/arm/include/asm/arch-sunxi/mmc.h
> +++ b/arch/arm/include/asm/arch-sunxi/mmc.h
> @@ -42,8 +42,6 @@ struct sunxi_mmc {
>  	u32 idie;		/* 0x8c internal DMA interrupt enable */
>  	u32 chda;		/* 0x90 */
>  	u32 cbda;		/* 0x94 */
> -	u32 res1[26];
> -	u32 fifo;		/* 0x100 FIFO access address */

This seems unrelated to the stated purpose of the commit, should
probably be a separate cleanup.

>  };
>  
>  #define SUNXI_MMC_CLK_POWERSAVE		(0x1 << 17)
> diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
> index d4e574f..b035bba 100644
> --- a/drivers/mmc/sunxi_mmc.c
> +++ b/drivers/mmc/sunxi_mmc.c
> @@ -57,7 +57,11 @@ static int mmc_resource_init(int sdc_no)
>  		printf("Wrong mmc number %d\n", sdc_no);
>  		return -1;
>  	}
> +#ifdef CONFIG_SUN6I
> +	mmchost->database = (unsigned int)mmchost->reg + 0x200;
> +#else
>  	mmchost->database = (unsigned int)mmchost->reg + 0x100;
> +#endif

Adding a #define to ./include/configs/sun?i.h would be preferred, I
think.

Ian.
Chen-Yu Tsai Sept. 22, 2014, 2:11 a.m. UTC | #2
On Mon, Sep 22, 2014 at 2:44 AM, Ian Campbell <ijc@hellion.org.uk> wrote:
> On Mon, 2014-09-08 at 21:28 +0800, Chen-Yu Tsai wrote:
>> From: Hans de Goede <hdegoede@redhat.com>
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> [wens@csie.org: use setbits_le32 for reset control, drop obsolete changes,
>>               squash "sunxi-mmc: sun6i has its fifo at a different address"]
>> Signed-off-by: Chen-Yu Tsai <wens@csie.org>
>
> Adding CC to Pantelis (MMC custodian).
>
> Pantelis, once you are happy with this I propose we take this via the
> sunxi tree along with the rest of the series.
>
> For my part I only have nitpicks:
>
>> ---
>>  arch/arm/include/asm/arch-sunxi/mmc.h | 2 --
>>  drivers/mmc/sunxi_mmc.c               | 9 +++++++++
>>  2 files changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h b/arch/arm/include/asm/arch-sunxi/mmc.h
>> index 53196e3..bafde4b 100644
>> --- a/arch/arm/include/asm/arch-sunxi/mmc.h
>> +++ b/arch/arm/include/asm/arch-sunxi/mmc.h
>> @@ -42,8 +42,6 @@ struct sunxi_mmc {
>>       u32 idie;               /* 0x8c internal DMA interrupt enable */
>>       u32 chda;               /* 0x90 */
>>       u32 cbda;               /* 0x94 */
>> -     u32 res1[26];
>> -     u32 fifo;               /* 0x100 FIFO access address */
>
> This seems unrelated to the stated purpose of the commit, should
> probably be a separate cleanup.

This was part of "sunxi-mmc: sun6i has its fifo at a different address",
but yeah, it definitely looks like a separate cleanup now. I'll split it
out.

>>  };
>>
>>  #define SUNXI_MMC_CLK_POWERSAVE              (0x1 << 17)
>> diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
>> index d4e574f..b035bba 100644
>> --- a/drivers/mmc/sunxi_mmc.c
>> +++ b/drivers/mmc/sunxi_mmc.c
>> @@ -57,7 +57,11 @@ static int mmc_resource_init(int sdc_no)
>>               printf("Wrong mmc number %d\n", sdc_no);
>>               return -1;
>>       }
>> +#ifdef CONFIG_SUN6I
>> +     mmchost->database = (unsigned int)mmchost->reg + 0x200;
>> +#else
>>       mmchost->database = (unsigned int)mmchost->reg + 0x100;
>> +#endif
>
> Adding a #define to ./include/configs/sun?i.h would be preferred, I
> think.

Sounds reasonable. I wonder what else (in other drivers) we should
move over there.

ChenYu
Chen-Yu Tsai Sept. 23, 2014, 11:50 a.m. UTC | #3
On Mon, Sep 22, 2014 at 10:11 AM, Chen-Yu Tsai <wens@csie.org> wrote:
> On Mon, Sep 22, 2014 at 2:44 AM, Ian Campbell <ijc@hellion.org.uk> wrote:
>> On Mon, 2014-09-08 at 21:28 +0800, Chen-Yu Tsai wrote:
>>> From: Hans de Goede <hdegoede@redhat.com>
>>>
>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>> [wens@csie.org: use setbits_le32 for reset control, drop obsolete changes,
>>>               squash "sunxi-mmc: sun6i has its fifo at a different address"]
>>> Signed-off-by: Chen-Yu Tsai <wens@csie.org>
>>
>> Adding CC to Pantelis (MMC custodian).
>>
>> Pantelis, once you are happy with this I propose we take this via the
>> sunxi tree along with the rest of the series.
>>
>> For my part I only have nitpicks:
>>
>>> ---
>>>  arch/arm/include/asm/arch-sunxi/mmc.h | 2 --
>>>  drivers/mmc/sunxi_mmc.c               | 9 +++++++++
>>>  2 files changed, 9 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h b/arch/arm/include/asm/arch-sunxi/mmc.h
>>> index 53196e3..bafde4b 100644
>>> --- a/arch/arm/include/asm/arch-sunxi/mmc.h
>>> +++ b/arch/arm/include/asm/arch-sunxi/mmc.h
>>> @@ -42,8 +42,6 @@ struct sunxi_mmc {
>>>       u32 idie;               /* 0x8c internal DMA interrupt enable */
>>>       u32 chda;               /* 0x90 */
>>>       u32 cbda;               /* 0x94 */
>>> -     u32 res1[26];
>>> -     u32 fifo;               /* 0x100 FIFO access address */
>>
>> This seems unrelated to the stated purpose of the commit, should
>> probably be a separate cleanup.
>
> This was part of "sunxi-mmc: sun6i has its fifo at a different address",
> but yeah, it definitely looks like a separate cleanup now. I'll split it
> out.
>
>>>  };
>>>
>>>  #define SUNXI_MMC_CLK_POWERSAVE              (0x1 << 17)
>>> diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
>>> index d4e574f..b035bba 100644
>>> --- a/drivers/mmc/sunxi_mmc.c
>>> +++ b/drivers/mmc/sunxi_mmc.c
>>> @@ -57,7 +57,11 @@ static int mmc_resource_init(int sdc_no)
>>>               printf("Wrong mmc number %d\n", sdc_no);
>>>               return -1;
>>>       }
>>> +#ifdef CONFIG_SUN6I
>>> +     mmchost->database = (unsigned int)mmchost->reg + 0x200;
>>> +#else
>>>       mmchost->database = (unsigned int)mmchost->reg + 0x100;
>>> +#endif
>>
>> Adding a #define to ./include/configs/sun?i.h would be preferred, I
>> think.
>
> Sounds reasonable. I wonder what else (in other drivers) we should
> move over there.

Ian, include/configs/sun?i.h and sunxi-common.h only have config
related #defines. Are we sure this is the place for something
like register offsets?

For reference, drivers/i2c/mvtwsi.c has sunxi specific register
offsets wrapped in a #define in the file itself.


Cheers
ChenYu
Ian Campbell Sept. 23, 2014, 11:54 a.m. UTC | #4
On Tue, 2014-09-23 at 19:50 +0800, Chen-Yu Tsai wrote:
> Ian, include/configs/sun?i.h and sunxi-common.h only have config
> related #defines. Are we sure this is the place for something
> like register offsets?

I guess not ;-)

> For reference, drivers/i2c/mvtwsi.c has sunxi specific register
> offsets wrapped in a #define in the file itself.

How about either ./arch/arm/include/asm/arch-sunxi/mmc.h or near the top
of this C file (i.e. outside the code itself)?

Ian.
Chen-Yu Tsai Sept. 23, 2014, 12:07 p.m. UTC | #5
On Tue, Sep 23, 2014 at 7:54 PM, Ian Campbell <ijc@hellion.org.uk> wrote:
> On Tue, 2014-09-23 at 19:50 +0800, Chen-Yu Tsai wrote:
>> Ian, include/configs/sun?i.h and sunxi-common.h only have config
>> related #defines. Are we sure this is the place for something
>> like register offsets?
>
> I guess not ;-)
>
>> For reference, drivers/i2c/mvtwsi.c has sunxi specific register
>> offsets wrapped in a #define in the file itself.
>
> How about either ./arch/arm/include/asm/arch-sunxi/mmc.h or near the top
> of this C file (i.e. outside the code itself)?

Adding it to the register definitions in ./arch/arm/include/asm/arch-sunxi/mmc.h
seems like a good choice. The last bit of struct sunxi_mmc would be like:

        u32 idie;               /* 0x8c internal DMA interrupt enable */
        u32 chda;               /* 0x90 */
        u32 cbda;               /* 0x94 */
#if defined(CONFIG_SUN6I)
        u32 res1[126];
#else
        u32 res1[26];
#endif
        u32 fifo;               /* 0x100 (0x200 on sun6i) FIFO access address */
 };

And have

    mmchost->database = &mmchost->reg->fifo;

Or just get rid of ->database and use ->reg->fifo directly.
The latter seems better.


ChenYu
Ian Campbell Sept. 23, 2014, 12:42 p.m. UTC | #6
On Tue, 2014-09-23 at 20:07 +0800, Chen-Yu Tsai wrote:
> On Tue, Sep 23, 2014 at 7:54 PM, Ian Campbell <ijc@hellion.org.uk> wrote:
> > On Tue, 2014-09-23 at 19:50 +0800, Chen-Yu Tsai wrote:
> >> Ian, include/configs/sun?i.h and sunxi-common.h only have config
> >> related #defines. Are we sure this is the place for something
> >> like register offsets?
> >
> > I guess not ;-)
> >
> >> For reference, drivers/i2c/mvtwsi.c has sunxi specific register
> >> offsets wrapped in a #define in the file itself.
> >
> > How about either ./arch/arm/include/asm/arch-sunxi/mmc.h or near the top
> > of this C file (i.e. outside the code itself)?
> 
> Adding it to the register definitions in ./arch/arm/include/asm/arch-sunxi/mmc.h
> seems like a good choice. The last bit of struct sunxi_mmc would be like:
> 
>         u32 idie;               /* 0x8c internal DMA interrupt enable */
>         u32 chda;               /* 0x90 */
>         u32 cbda;               /* 0x94 */
> #if defined(CONFIG_SUN6I)
>         u32 res1[126];
> #else
>         u32 res1[26];
> #endif
>         u32 fifo;               /* 0x100 (0x200 on sun6i) FIFO access address */
>  };
> 
> And have
> 
>     mmchost->database = &mmchost->reg->fifo;
> 
> Or just get rid of ->database and use ->reg->fifo directly.
> The latter seems better.

Yep, sounds good.

You could also consider just
#if defined(CONFIG_SUN6I)
         u32 res2[100];
#endif
after the existing res1.
diff mbox

Patch

diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h b/arch/arm/include/asm/arch-sunxi/mmc.h
index 53196e3..bafde4b 100644
--- a/arch/arm/include/asm/arch-sunxi/mmc.h
+++ b/arch/arm/include/asm/arch-sunxi/mmc.h
@@ -42,8 +42,6 @@  struct sunxi_mmc {
 	u32 idie;		/* 0x8c internal DMA interrupt enable */
 	u32 chda;		/* 0x90 */
 	u32 cbda;		/* 0x94 */
-	u32 res1[26];
-	u32 fifo;		/* 0x100 FIFO access address */
 };
 
 #define SUNXI_MMC_CLK_POWERSAVE		(0x1 << 17)
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
index d4e574f..b035bba 100644
--- a/drivers/mmc/sunxi_mmc.c
+++ b/drivers/mmc/sunxi_mmc.c
@@ -57,7 +57,11 @@  static int mmc_resource_init(int sdc_no)
 		printf("Wrong mmc number %d\n", sdc_no);
 		return -1;
 	}
+#ifdef CONFIG_SUN6I
+	mmchost->database = (unsigned int)mmchost->reg + 0x200;
+#else
 	mmchost->database = (unsigned int)mmchost->reg + 0x100;
+#endif
 	mmchost->mmc_no = sdc_no;
 
 	return 0;
@@ -75,6 +79,11 @@  static int mmc_clk_io_on(int sdc_no)
 	/* config ahb clock */
 	setbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_MMC(sdc_no));
 
+#if defined(CONFIG_SUN6I)
+	/* unassert reset */
+	setbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_RESET_OFFSET_MMC(sdc_no));
+#endif
+
 	/* config mod clock */
 	pll_clk = clock_get_pll6();
 	/* should be close to 100 MHz but no more, so round up */