atmel-mci: support multiple mmc slots
authorHaavard Skinnemoen <haavard.skinnemoen@atmel.com>
Wed, 17 Sep 2008 18:53:55 +0000 (20:53 +0200)
committerHaavard Skinnemoen <haavard.skinnemoen@atmel.com>
Sun, 5 Oct 2008 18:39:21 +0000 (20:39 +0200)
commit965ebf33ea5afb6386f5b57cc71e6572253746b3
treea4ee6bdce1a3a9c133c36a5463d12baa089591d9
parent6b918657b7431e4c5c953b8222ae2f4fc1b2576a
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>
arch/avr32/include/asm/atmel-mci.h
drivers/mmc/host/atmel-mci.c