diff options
author | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2008-09-17 14:53:55 -0400 |
---|---|---|
committer | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2008-10-05 14:39:21 -0400 |
commit | 965ebf33ea5afb6386f5b57cc71e6572253746b3 (patch) | |
tree | a4ee6bdce1a3a9c133c36a5463d12baa089591d9 /arch/avr32/include | |
parent | 6b918657b7431e4c5c953b8222ae2f4fc1b2576a (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/avr32/include')
-rw-r--r-- | arch/avr32/include/asm/atmel-mci.h | 8 |
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 | */ |
15 | struct mci_slot_pdata { | 21 | struct 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 | */ |
25 | struct mci_platform_data { | 31 | struct 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 */ |