aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorHaavard Skinnemoen <haavard.skinnemoen@atmel.com>2008-09-17 14:53:55 -0400
committerHaavard Skinnemoen <haavard.skinnemoen@atmel.com>2008-10-05 14:39:21 -0400
commit965ebf33ea5afb6386f5b57cc71e6572253746b3 (patch)
treea4ee6bdce1a3a9c133c36a5463d12baa089591d9 /arch
parent6b918657b7431e4c5c953b8222ae2f4fc1b2576a (diff)
atmel-mci: support multiple mmc slots
The Atmel MCI controller can drive multiple cards through separate sets of pins, but only one at a time. This patch adds support for multiplexing access to the controller so that multiple card slots can be used as if they were hooked up to separate mmc controllers. The atmel-mci driver registers each slot as a separate mmc_host. Both access the same common controller state, but they also have some state on their own for card detection/write protect handling, and separate shadows of the MR and SDCR registers. When one of the slots receives a request from the mmc core, the common controller state is checked. If it's idle, the request is submitted immediately. If not, the request is added to a queue. When a request is done, the queue is checked and if there is a queued request, it is submitted before the completion callback is called. This patch also includes a few cleanups and fixes, including a locking overhaul. I had to change the locking extensively in any case, so I might as well try to get it right. The driver no longer takes any irq-safe locks, which may or may not improve the overall system performance. This patch also adds a bit of documentation of the internal data structures. Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/avr32/include/asm/atmel-mci.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/avr32/include/asm/atmel-mci.h b/arch/avr32/include/asm/atmel-mci.h
index d38c64ca41e8..5d5ae1295cfd 100644
--- a/arch/avr32/include/asm/atmel-mci.h
+++ b/arch/avr32/include/asm/atmel-mci.h
@@ -1,6 +1,8 @@
1#ifndef __ASM_AVR32_ATMEL_MCI_H 1#ifndef __ASM_AVR32_ATMEL_MCI_H
2#define __ASM_AVR32_ATMEL_MCI_H 2#define __ASM_AVR32_ATMEL_MCI_H
3 3
4#define ATMEL_MCI_MAX_NR_SLOTS 2
5
4/** 6/**
5 * struct mci_slot_pdata - board-specific per-slot configuration 7 * struct mci_slot_pdata - board-specific per-slot configuration
6 * @bus_width: Number of data lines wired up the slot 8 * @bus_width: Number of data lines wired up the slot
@@ -11,6 +13,10 @@
11 * set to 0. The other fields are ignored in this case. 13 * set to 0. The other fields are ignored in this case.
12 * 14 *
13 * Any pins that aren't available should be set to a negative value. 15 * Any pins that aren't available should be set to a negative value.
16 *
17 * Note that support for multiple slots is experimental -- some cards
18 * might get upset if we don't get the clock management exactly right.
19 * But in most cases, it should work just fine.
14 */ 20 */
15struct mci_slot_pdata { 21struct mci_slot_pdata {
16 unsigned int bus_width; 22 unsigned int bus_width;
@@ -23,7 +29,7 @@ struct mci_slot_pdata {
23 * @slot: Per-slot configuration data. 29 * @slot: Per-slot configuration data.
24 */ 30 */
25struct mci_platform_data { 31struct mci_platform_data {
26 struct mci_slot_pdata slot[2]; 32 struct mci_slot_pdata slot[ATMEL_MCI_MAX_NR_SLOTS];
27}; 33};
28 34
29#endif /* __ASM_AVR32_ATMEL_MCI_H */ 35#endif /* __ASM_AVR32_ATMEL_MCI_H */