Skip to contentSkip to conversation

Enable MMC support for at91sam9x5ek board.

PATCH Superseded Josh Wu 2 participants 10 messages Sep 14, 2012 – Oct 17, 2012

Subsystems (3)
lore
Share & tools
lore

Josh Wu

author
#0 lore raw

v2 cover Enable MMC support for at91sam9x5ek board.

This patch series enable MCI0 solt in at91sam9x5ek board.

Josh Wu (3):
mmc: at91: add multi block read/write support.
ARM: at91sam9x5: enable MCI0 support for 9x5ek board.
mmc: at91: use max timeout value. It will avoid some situation that
timeout happened.

 arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c |   15 +++++++++++++++
 board/atmel/at91sam9x5ek/at91sam9x5ek.c          |   10 ++++++++++
 drivers/mmc/gen_atmel_mci.c                      |   15 +++++++++++++--
 include/atmel_mci.h                              |    7 ++++++-
 include/configs/at91sam9x5ek.h                   |   10 ++++++++++
 5 files changed, 54 insertions(+), 3 deletions(-)
Signature · 1 line
1.7.9.5
author
#1 lore raw

PATCH v2 1/3 mmc: at91: add multi block read/write support.

Since the at91sam9263, the mmc hardware support multi blocks read/write. So this driver enable it.

---
since v1:
use MMCI_BF macro and remove the redefinition for the BLKLEN according to Andreas' suggestion.

 drivers/mmc/gen_atmel_mci.c |   11 +++++++++++
 include/atmel_mci.h         |    7 ++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)
drivers/mmc/gen_atmel_mci.c +11 -0
index 4968c5e..9f06304 100644
@@ -87,6 +87,11 @@ static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)
 		 | MMCI_BF(BLKLEN, blklen)
 		 | MMCI_BIT(RDPROOF)
 		 | MMCI_BIT(WRPROOF)), &mci->mr);
+	/*
+	 * On some new platforms BLKLEN in mci->mr is ignored.
+	 * Should use the BLKLEN in the block register.
+	 */
+	writel(MMCI_BF(BLKLEN, blklen), &mci->blkr);
 	initialized = 1;
 }
 
@@ -183,6 +188,12 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 	/* Figure out the transfer arguments */
 	cmdr = mci_encode_cmd(cmd, data, &error_flags);
 
+	/* For multi blocks read/write, set the block register */
+	if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK)
+			|| (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK))
+		writel(data->blocks | MMCI_BF(BLKLEN, mmc->read_bl_len),
+			&mci->blkr);
+
 	/* Send the command */
 	writel(cmd->cmdarg, &mci->argr);
 	writel(cmdr, &mci->cmdr);
include/atmel_mci.h +6 -1
index 3dd5d67..c711881 100644
@@ -38,7 +38,7 @@ typedef struct atmel_mci {
 	u32	sdcr;	/* 0x0c */
 	u32	argr;	/* 0x10 */
 	u32	cmdr;	/* 0x14 */
-	u32	_18;	/* 0x18 */
+	u32	blkr;	/* 0x18 */
 	u32	_1c;	/* 0x1c */
 	u32	rspr;	/* 0x20 */
 	u32	rspr1;	/* 0x24 */
@@ -118,6 +118,11 @@ typedef struct atmel_mci {
 #define MMCI_TRTYP_OFFSET			19
 #define MMCI_TRTYP_SIZE				2
 
+/* Bitfields in BLKR */
+/* MMCI_BLKLEN_OFFSET/SIZE already defined in MR */
+#define MMCI_BCNT_OFFSET			0
+#define MMCI_BCNT_SIZE			16
+
 /* Bitfields in RSPRx */
 #define MMCI_RSP_OFFSET				0
 #define MMCI_RSP_SIZE				32
Signature · 1 line
1.7.9.5
#2 lore raw

PATCH v2 1/3 mmc: at91: add multi block read/write support.

Dear Josh Wu,

Quoted 6 lines · Josh Wu

Since the at91sam9263, the mmc hardware support multi blocks read/write. So this driver enable it.

---
since v1:
use MMCI_BF macro and remove the redefinition for the BLKLEN according to Andreas' suggestion.

applied to u-boot-atmel/master, thanks!

BTW: this also fixes avr32 multi block access, great work!

Best regards

Andreas Bie?mann

author
#3 lore raw

PATCH v2 2/3 ARM: at91sam9x5: enable MCI0 support for 9x5ek board.

In reply to Josh Wu

---
since v1:
move the clock initialization function.
remove useless #if macro block.

 arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c |   15 +++++++++++++++
 board/atmel/at91sam9x5ek/at91sam9x5ek.c          |   10 ++++++++++
 include/configs/at91sam9x5ek.h                   |   10 ++++++++++
 3 files changed, 35 insertions(+)
arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c +15 -0
index 6d77219..9348552 100644
@@ -118,6 +118,21 @@ void at91_serial2_hw_init(void)
 	writel(1 << ATMEL_ID_USART2, &pmc->pcer);
 }
 
+void at91_mci_hw_init(void)
+{
+	/* Initialize the MCI0 */
+	at91_set_a_periph(AT91_PIO_PORTA, 17, 1);	/* MCCK */
+	at91_set_a_periph(AT91_PIO_PORTA, 16, 1);	/* MCCDA */
+	at91_set_a_periph(AT91_PIO_PORTA, 15, 1);	/* MCDA0 */
+	at91_set_a_periph(AT91_PIO_PORTA, 18, 1);	/* MCDA1 */
+	at91_set_a_periph(AT91_PIO_PORTA, 19, 1);	/* MCDA2 */
+	at91_set_a_periph(AT91_PIO_PORTA, 20, 1);	/* MCDA3 */
+
+	/* Enable clock for MCI0 */
+	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+	writel(1 << ATMEL_ID_HSMCI0, &pmc->pcer);
+}
+
 #ifdef CONFIG_ATMEL_SPI
 void at91_spi0_hw_init(unsigned long cs_mask)
 {
board/atmel/at91sam9x5ek/at91sam9x5ek.c +10 -0
index 06028aa..edb0886 100644
@@ -31,6 +31,7 @@
 #include <asm/arch/clk.h>
 #include <lcd.h>
 #include <atmel_hlcdc.h>
+#include <atmel_mci.h>
 #ifdef CONFIG_MACB
 #include <net.h>
 #endif
@@ -258,6 +259,15 @@ void spi_cs_deactivate(struct spi_slave *slave)
 }
 #endif /* CONFIG_ATMEL_SPI */
 
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+int board_mmc_init(bd_t *bd)
+{
+	at91_mci_hw_init();
+
+	return atmel_mci_init((void *)ATMEL_BASE_HSMCI0);
+}
+#endif
+
 int board_early_init_f(void)
 {
 	at91_seriald_hw_init();
include/configs/at91sam9x5ek.h +10 -0
index 1ceb31a..9e1942d 100644
@@ -87,6 +87,7 @@
 #define CONFIG_CMD_DHCP
 #define CONFIG_CMD_NAND
 #define CONFIG_CMD_SF
+#define CONFIG_CMD_MMC
 
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS		1
@@ -136,6 +137,15 @@
 #define CONFIG_CMD_UBIFS
 #endif
 
+/* MMC */
+#ifdef CONFIG_CMD_MMC
+#define CONFIG_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_GENERIC_MMC
+#define CONFIG_GENERIC_ATMEL_MCI
+#define CONFIG_DOS_PARTITION
+#endif
+
 /* Ethernet */
 #define CONFIG_MACB
 #define CONFIG_RMII
Signature · 1 line
1.7.9.5
#4 lore raw

PATCH v2 2/3 ARM: at91sam9x5: enable MCI0 support for 9x5ek board.

Dear Josh Wu,

Quoted 10 lines · Josh Wu

---
since v1:
move the clock initialization function.
remove useless #if macro block.

 arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c |   15 +++++++++++++++
 board/atmel/at91sam9x5ek/at91sam9x5ek.c          |   10 ++++++++++
 include/configs/at91sam9x5ek.h                   |   10 ++++++++++
 3 files changed, 35 insertions(+)

applied to u-boot-atmel/master, thanks!

Best regards

Andreas Bie?mann

author
#5 lore raw

PATCH v2 3/3 mmc: at91: use max timeout value. It will avoid some situation that timeout happened.

In reply to Josh Wu

---
since v1:
seperate it as one patch from v1.

 drivers/mmc/gen_atmel_mci.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mmc/gen_atmel_mci.c +2 -2
index 9f06304..67b2dbe 100644
@@ -321,8 +321,8 @@ static int mci_init(struct mmc *mmc)
 	writel(MMCI_BIT(MCIEN), &mci->cr);	/* enable mci */
 	writel(MMCI_BF(SCDSEL, MCI_BUS), &mci->sdcr);	/* select port */
 
-	/* Initial Time-outs */
-	writel(0x5f, &mci->dtor);
+	/* This delay can be optimized, but stick with max value */
+	writel(0x7f, &mci->dtor);
 	/* Disable Interrupts */
 	writel(~0UL, &mci->idr);
 
Signature · 1 line
1.7.9.5
#6 lore raw

PATCH v2 3/3 mmc: at91: use max timeout value. It will avoid some situation that timeout happened.

Dear Josh Wu,

Quoted 7 lines · Josh Wu

---
since v1:
seperate it as one patch from v1.

 drivers/mmc/gen_atmel_mci.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

applied to u-boot-atmel/master, thanks!

Best regards

Andreas Bie?mann

author
#7 lore raw

v2 cover Enable MMC support for at91sam9x5ek board.

In reply to Josh Wu

Hi, Andreas

Any feedback of these patches?

Best Regards,
Josh Wu

Quoted 15 lines · Josh Wu

This patch series enable MCI0 solt in at91sam9x5ek board.

Josh Wu (3):
mmc: at91: add multi block read/write support.
ARM: at91sam9x5: enable MCI0 support for 9x5ek board.
mmc: at91: use max timeout value. It will avoid some situation that
timeout happened.

  arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c |   15 +++++++++++++++
  board/atmel/at91sam9x5ek/at91sam9x5ek.c          |   10 ++++++++++
  drivers/mmc/gen_atmel_mci.c                      |   15 +++++++++++++--
  include/atmel_mci.h                              |    7 ++++++-
  include/configs/at91sam9x5ek.h                   |   10 ++++++++++
  5 files changed, 54 insertions(+), 3 deletions(-)
#8 lore raw

v2 cover Enable MMC support for at91sam9x5ek board.

Hi Josh,

Quoted 3 lines · Josh Wu

Hi, Andreas

Any feedback of these patches?

short answer: no ;)

I think they could go into next (no obvious objections), but I would like to do some runtime tests on avr32 before. Beside that, if you do not insist on applying them ASAP to next I would like to wait until the release next Monday and apply the patches to u-boot-atmel/master then. Is that OK for you?

Best regards

Andreas Bie?mann

Quoted 21 lines

Best Regards,
Josh Wu

Quoted 15 lines · Josh Wu

This patch series enable MCI0 solt in at91sam9x5ek board.

Josh Wu (3):
mmc: at91: add multi block read/write support.
ARM: at91sam9x5: enable MCI0 support for 9x5ek board.
mmc: at91: use max timeout value. It will avoid some situation that
timeout happened.

  arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c |   15 +++++++++++++++
  board/atmel/at91sam9x5ek/at91sam9x5ek.c          |   10 ++++++++++
  drivers/mmc/gen_atmel_mci.c                      |   15 +++++++++++++--
  include/atmel_mci.h                              |    7 ++++++-
  include/configs/at91sam9x5ek.h                   |   10 ++++++++++
  5 files changed, 54 insertions(+), 3 deletions(-)
author
#9 lore raw

v2 cover Enable MMC support for at91sam9x5ek board.

Hi, Andreas

Quoted 5 lines · Andreas Bie?mann

Hi Josh,

Quoted 2 lines · Josh Wu

Hi, Andreas

Quoted 8 lines
Quoted 1 line

Any feedback of these patches?

short answer: no ;)

I think they could go into next (no obvious objections), but I would like to do some runtime tests on avr32 before. Beside that, if you do not insist on applying them ASAP to next I would like to wait until the release next Monday and apply the patches to u-boot-atmel/master then. Is that OK for you?

Yes, I'm fine with this. thank you.

Best Regards,
Josh Wu

Quoted 24 lines

Best regards

Andreas Bie?mann

Quoted 19 lines

Best Regards,
Josh Wu

Quoted 15 lines · Josh Wu

This patch series enable MCI0 solt in at91sam9x5ek board.

Josh Wu (3):
mmc: at91: add multi block read/write support.
ARM: at91sam9x5: enable MCI0 support for 9x5ek board.
mmc: at91: use max timeout value. It will avoid some situation that
timeout happened.

   arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c |   15 +++++++++++++++
   board/atmel/at91sam9x5ek/at91sam9x5ek.c          |   10 ++++++++++
   drivers/mmc/gen_atmel_mci.c                      |   15 +++++++++++++--
   include/atmel_mci.h                              |    7 ++++++-
   include/configs/at91sam9x5ek.h                   |   10 ++++++++++
   5 files changed, 54 insertions(+), 3 deletions(-)