This option is usually just for embedded systems which use
a MMC/SD card for rootfs. Most people should say N here.
-config MMC_EMBEDDED_SDIO
- boolean "MMC embedded SDIO device support (EXPERIMENTAL)"
- depends on EXPERIMENTAL
- help
- If you say Y here, support will be added for embedded SDIO
- devices which do not contain the necessary enumeration
- support in hardware to be properly detected.
-
config MMC_PARANOID_SD_INIT
bool "Enable paranoid SD card initialization (EXPERIMENTAL)"
- depends on EXPERIMENTAL
help
If you say Y here, the MMC layer will be extra paranoid
about re-trying SD init requests. This can be a useful
work-around for buggy controllers and hardware. Enable
if you are experiencing issues with SD detection.
+
#endif
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
-void mmc_set_embedded_sdio_data(struct mmc_host *host,
- struct sdio_cis *cis,
- struct sdio_cccr *cccr,
- struct sdio_embedded_func *funcs,
- int num_funcs)
-{
- host->embedded_sdio_data.cis = cis;
- host->embedded_sdio_data.cccr = cccr;
- host->embedded_sdio_data.funcs = funcs;
- host->embedded_sdio_data.num_funcs = num_funcs;
-}
-
-EXPORT_SYMBOL(mmc_set_embedded_sdio_data);
-#endif
-
static int __init mmc_init(void)
{
int ret;
#include "sdio_ops.h"
#include "sdio_cis.h"
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
-#include <linux/mmc/sdio_ids.h>
-#endif
-
static int sdio_read_fbr(struct sdio_func *func)
{
int ret;
goto remove;
}
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- if (host->embedded_sdio_data.cccr)
- memcpy(&card->cccr, host->embedded_sdio_data.cccr, sizeof(struct sdio_cccr));
- else {
-#endif
- /*
- * Read the common registers.
- */
- err = sdio_read_cccr(card);
- if (err)
- goto remove;
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- }
-#endif
+ /*
+ * Read the common registers.
+ */
+ err = sdio_read_cccr(card);
+ if (err)
+ goto remove;
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- if (host->embedded_sdio_data.cis)
- memcpy(&card->cis, host->embedded_sdio_data.cis, sizeof(struct sdio_cis));
- else {
-#endif
- /*
- * Read the common CIS tuples.
- */
- err = sdio_read_common_cis(card);
- if (err)
- goto remove;
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- }
-#endif
+ /*
+ * Read the common CIS tuples.
+ */
+ err = sdio_read_common_cis(card);
+ if (err)
+ goto remove;
if (oldcard) {
int same = (card->cis.vendor == oldcard->cis.vendor &&
*/
card->sdio_funcs = funcs = (ocr & 0x70000000) >> 28;
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- if (host->embedded_sdio_data.funcs)
- card->sdio_funcs = funcs = host->embedded_sdio_data.num_funcs;
-#endif
-
/*
* If needed, disconnect card detection pull-up resistor.
*/
* Initialize (but don't add) all present functions.
*/
for (i = 0;i < funcs;i++) {
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- if (host->embedded_sdio_data.funcs) {
- struct sdio_func *tmp;
-
- tmp = sdio_alloc_func(host->card);
- if (IS_ERR(tmp))
- goto remove;
- tmp->num = (i + 1);
- card->sdio_func[i] = tmp;
- tmp->class = host->embedded_sdio_data.funcs[i].f_class;
- tmp->max_blksize = host->embedded_sdio_data.funcs[i].f_maxblksize;
- tmp->vendor = card->cis.vendor;
- tmp->device = card->cis.device;
- } else {
-#endif
- err = sdio_init_func(host->card, i + 1);
- if (err)
- goto remove;
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- }
-#endif
+ err = sdio_init_func(host->card, i + 1);
+ if (err)
+ goto remove;
}
mmc_release_host(host);
#include "sdio_cis.h"
#include "sdio_bus.h"
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
-#include <linux/mmc/host.h>
-#endif
-
/* show configuration fields */
#define sdio_config_attr(field, format_string) \
static ssize_t \
{
struct sdio_func *func = dev_to_sdio_func(dev);
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- /*
- * If this device is embedded then we never allocated
- * cis tables for this func
- */
- if (!func->card->host->embedded_sdio_data.funcs)
-#endif
- sdio_free_func_cis(func);
+ sdio_free_func_cis(func);
if (func->info)
kfree(func->info);
#define AMBA_MMCI_H
#include <linux/mmc/host.h>
-#include <linux/mmc/card.h>
-#include <linux/mmc/sdio_func.h>
-
-struct embedded_sdio_data {
- struct sdio_cis cis;
- struct sdio_cccr cccr;
- struct sdio_embedded_func *funcs;
- int num_funcs;
-};
struct mmci_platform_data {
unsigned int ocr_mask; /* available voltages */
int gpio_cd;
unsigned long capabilities;
unsigned int status_irq;
- struct embedded_sdio_data *embedded_sdio;
int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id);
};
struct dentry *debugfs_root;
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
- struct {
- struct sdio_cis *cis;
- struct sdio_cccr *cccr;
- struct sdio_embedded_func *funcs;
- int num_funcs;
- } embedded_sdio_data;
-#endif
-
unsigned long private[0] ____cacheline_aligned;
};
extern void mmc_remove_host(struct mmc_host *);
extern void mmc_free_host(struct mmc_host *);
-#ifdef CONFIG_MMC_EMBEDDED_SDIO
-extern void mmc_set_embedded_sdio_data(struct mmc_host *host,
- struct sdio_cis *cis,
- struct sdio_cccr *cccr,
- struct sdio_embedded_func *funcs,
- int num_funcs);
-#endif
-
static inline void *mmc_priv(struct mmc_host *host)
{
return (void *)host->private;
typedef void (sdio_irq_handler_t)(struct sdio_func *);
-/*
- * Structure used to hold embedded SDIO device data from platform layer
- */
-struct sdio_embedded_func {
- uint8_t f_class;
- uint32_t f_maxblksize;
-};
-
/*
* SDIO function CIS tuple (unknown to the core)
*/