[PATCH 1/1] atmel/mci: fix slot_b support
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Fri Jan 13 10:55:24 EST 2012
in commit commit f60f6c58e
atmel_mci: check for device id we use to address the right slot
the driver use the dev_id to detect the slot which is wrong on 9263 as we have
2 devices with 2 slots
use slot_b paramter to specify the slot as done in linux
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
Cc: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
arch/arm/boards/at91sam9260ek/init.c | 3 +-
arch/arm/boards/dss11/init.c | 3 +-
arch/arm/mach-at91/at91sam9260_devices.c | 24 ++++++------
arch/arm/mach-at91/at91sam9263_devices.c | 61 +++++++++++++++++++++---------
arch/arm/mach-at91/at91sam9g45_devices.c | 1 +
arch/arm/mach-at91/include/mach/board.h | 1 +
drivers/mci/atmel_mci.c | 4 +-
7 files changed, 64 insertions(+), 33 deletions(-)
diff --git a/arch/arm/boards/at91sam9260ek/init.c b/arch/arm/boards/at91sam9260ek/init.c
index 4bff35e..03abc0e 100644
--- a/arch/arm/boards/at91sam9260ek/init.c
+++ b/arch/arm/boards/at91sam9260ek/init.c
@@ -172,6 +172,7 @@ static void at91sam9260ek_phy_reset(void)
#if defined(CONFIG_MCI_ATMEL)
static struct atmel_mci_platform_data __initdata ek_mci_data = {
.bus_width = 4,
+ .slot_b = 1,
};
static void ek_usb_add_device_mci(void)
@@ -179,7 +180,7 @@ static void ek_usb_add_device_mci(void)
if (machine_is_at91sam9g20ek())
ek_mci_data.detect_pin = AT91_PIN_PC9;
- at91_add_device_mci(1, &ek_mci_data);
+ at91_add_device_mci(0, &ek_mci_data);
}
#else
static void ek_usb_add_device_mci(void) {}
diff --git a/arch/arm/boards/dss11/init.c b/arch/arm/boards/dss11/init.c
index 96c4eef..722c0f6 100644
--- a/arch/arm/boards/dss11/init.c
+++ b/arch/arm/boards/dss11/init.c
@@ -110,6 +110,7 @@ static void dss11_phy_reset(void)
}
static struct atmel_mci_platform_data dss11_mci_data = {
+ .slot_b = 1,
.bus_width = 4,
.host_caps = MMC_MODE_HS,
};
@@ -131,7 +132,7 @@ static int dss11_devices_init(void)
dss11_add_device_nand();
dss11_phy_reset();
at91_add_device_eth(&macb_pdata);
- at91_add_device_mci(1, &dss11_mci_data);
+ at91_add_device_mci(0, &dss11_mci_data);
at91_add_device_usbh_ohci(&dss11_usbh_data);
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index c8871f8..3ddd0cf 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -356,18 +356,7 @@ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data)
at91_set_A_periph(AT91_PIN_PA8, 0);
- if (mmc_id == 0) {
- /* CMD */
- at91_set_A_periph(AT91_PIN_PA7, 1);
-
- /* DAT0, maybe DAT1..DAT3 */
- at91_set_A_periph(AT91_PIN_PA6, 1);
- if (data->bus_width == 4) {
- at91_set_A_periph(AT91_PIN_PA9, 1);
- at91_set_A_periph(AT91_PIN_PA10, 1);
- at91_set_A_periph(AT91_PIN_PA11, 1);
- }
- } else if (mmc_id == 1) {
+ if (data->slot_b) {
/* CMD */
at91_set_B_periph(AT91_PIN_PA1, 1);
@@ -378,6 +367,17 @@ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data)
at91_set_B_periph(AT91_PIN_PA4, 1);
at91_set_B_periph(AT91_PIN_PA5, 1);
}
+ } else {
+ /* CMD */
+ at91_set_A_periph(AT91_PIN_PA7, 1);
+
+ /* DAT0, maybe DAT1..DAT3 */
+ at91_set_A_periph(AT91_PIN_PA6, 1);
+ if (data->bus_width == 4) {
+ at91_set_A_periph(AT91_PIN_PA9, 1);
+ at91_set_A_periph(AT91_PIN_PA10, 1);
+ at91_set_A_periph(AT91_PIN_PA11, 1);
+ }
}
dev = add_generic_device("atmel_mci", mmc_id, NULL, AT91SAM9260_BASE_MCI, SZ_16K,
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
index 1811c12..fc7dc14 100644
--- a/arch/arm/mach-at91/at91sam9263_devices.c
+++ b/arch/arm/mach-at91/at91sam9263_devices.c
@@ -310,33 +310,58 @@ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data)
if (mmc_id == 0) { /* MCI0 */
start = AT91SAM9263_BASE_MCI0;
+
/* CLK */
at91_set_A_periph(AT91_PIN_PA12, 0);
- /* CMD */
- at91_set_A_periph(AT91_PIN_PA1, 1);
+ if (data->slot_b) {
+ /* CMD */
+ at91_set_A_periph(AT91_PIN_PA16, 1);
+
+ /* DAT0, maybe DAT1..DAT3 */
+ at91_set_A_periph(AT91_PIN_PA17, 1);
+ if (data->bus_width == 4) {
+ at91_set_A_periph(AT91_PIN_PA18, 1);
+ at91_set_A_periph(AT91_PIN_PA19, 1);
+ at91_set_A_periph(AT91_PIN_PA20, 1);
+ }
+ } else {
+ /* CMD */
+ at91_set_A_periph(AT91_PIN_PA1, 1);
- /* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */
- at91_set_A_periph(AT91_PIN_PA0, 1);
- if (data->bus_width == 4) {
- at91_set_A_periph(AT91_PIN_PA3, 1);
- at91_set_A_periph(AT91_PIN_PA4, 1);
- at91_set_A_periph(AT91_PIN_PA5, 1);
+ /* DAT0, maybe DAT1..DAT3 */
+ at91_set_A_periph(AT91_PIN_PA0, 1);
+ if (data->bus_width == 4) {
+ at91_set_A_periph(AT91_PIN_PA3, 1);
+ at91_set_A_periph(AT91_PIN_PA4, 1);
+ at91_set_A_periph(AT91_PIN_PA5, 1);
+ }
}
} else { /* MCI1 */
start = AT91SAM9263_BASE_MCI1;
- /* CLK */
- at91_set_A_periph(AT91_PIN_PA6, 0);
- /* CMD */
- at91_set_A_periph(AT91_PIN_PA7, 1);
+ if (data->slot_b) {
+ /* CMD */
+ at91_set_A_periph(AT91_PIN_PA21, 1);
+
+ /* DAT0, maybe DAT1..DAT3 */
+ at91_set_A_periph(AT91_PIN_PA22, 1);
+ if (data->bus_width == 4) {
+ at91_set_A_periph(AT91_PIN_PA23, 1);
+ at91_set_A_periph(AT91_PIN_PA24, 1);
+ at91_set_A_periph(AT91_PIN_PA25, 1);
+ }
+ } else {
+ /* CMD */
+ at91_set_A_periph(AT91_PIN_PA7, 1);
- /* DAT0, maybe DAT1..DAT3 */
- at91_set_A_periph(AT91_PIN_PA8, 1);
- if (data->bus_width == 4) {
- at91_set_A_periph(AT91_PIN_PA9, 1);
- at91_set_A_periph(AT91_PIN_PA10, 1);
- at91_set_A_periph(AT91_PIN_PA11, 1);
+ /* DAT0, maybe DAT1..DAT3 */
+ at91_set_A_periph(AT91_PIN_PA8, 1);
+ if (data->bus_width == 4) {
+ at91_set_A_periph(AT91_PIN_PA9, 1);
+ at91_set_A_periph(AT91_PIN_PA10, 1);
+ at91_set_A_periph(AT91_PIN_PA11, 1);
+ }
}
}
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index 9a24022..bb252bd 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -264,6 +264,7 @@ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data)
}
}
} else { /* MCI1 */
+ data->slot_b = 1;
start = AT91SAM9G45_BASE_MCI1;
/* CLK */
at91_set_A_periph(AT91_PIN_PA31, 0);
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h
index 738af87..755ddc8 100644
--- a/arch/arm/mach-at91/include/mach/board.h
+++ b/arch/arm/mach-at91/include/mach/board.h
@@ -87,6 +87,7 @@ void at91_register_uart(unsigned id, unsigned pins);
/* Multimedia Card Interface */
struct atmel_mci_platform_data {
+ unsigned slot_b;
unsigned bus_width;
unsigned host_caps; /* MCI_MODE_* from mci.h */
unsigned detect_pin;
diff --git a/drivers/mci/atmel_mci.c b/drivers/mci/atmel_mci.c
index 15668fc..3c37747 100644
--- a/drivers/mci/atmel_mci.c
+++ b/drivers/mci/atmel_mci.c
@@ -36,6 +36,7 @@ struct atmel_mci_host {
u32 datasize;
struct mci_cmd *cmd;
struct mci_data *data;
+ unsigned slot_b;
};
#define to_mci_host(mci) container_of(mci, struct atmel_mci_host, mci)
@@ -370,7 +371,7 @@ static void mci_set_ios(struct mci_host *mci, struct device_d *mci_dev,
break;
}
atmel_mci_writel(host, AT91_MCI_SDCR, atmel_mci_readl(host, AT91_MCI_SDCR)
- | host->hw_dev->id);
+ | host->slot_b);
if (clock) {
atmel_set_clk_rate(host, clock);
@@ -459,6 +460,7 @@ static int mci_probe(struct device_d *hw_dev)
host->mci.host_caps |= MMC_MODE_4BIT;
if (pd->bus_width == 8)
host->mci.host_caps |= MMC_MODE_8BIT;
+ host->slot_b = pd->slot_b;
host->base = dev_request_mem_region(hw_dev, 0);
host->hw_dev = hw_dev;
--
1.7.7
More information about the barebox
mailing list