linux/arch/arm/plat-omap/include/plat/mmc.h
<<
>>
Prefs
   1/*
   2 * MMC definitions for OMAP2
   3 *
   4 * Copyright (C) 2006 Nokia Corporation
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#ifndef __OMAP2_MMC_H
  12#define __OMAP2_MMC_H
  13
  14#include <linux/types.h>
  15#include <linux/device.h>
  16#include <linux/mmc/host.h>
  17
  18#include <plat/board.h>
  19
  20#define OMAP15XX_NR_MMC         1
  21#define OMAP16XX_NR_MMC         2
  22#define OMAP1_MMC_SIZE          0x080
  23#define OMAP1_MMC1_BASE         0xfffb7800
  24#define OMAP1_MMC2_BASE         0xfffb7c00      /* omap16xx only */
  25
  26#define OMAP24XX_NR_MMC         2
  27#define OMAP2420_MMC_SIZE       OMAP1_MMC_SIZE
  28#define OMAP2_MMC1_BASE         0x4809c000
  29
  30#define OMAP4_MMC_REG_OFFSET    0x100
  31
  32#define OMAP_MMC_MAX_SLOTS      2
  33
  34/*
  35 * struct omap_mmc_dev_attr.flags possibilities
  36 *
  37 * OMAP_HSMMC_SUPPORTS_DUAL_VOLT: Some HSMMC controller instances can
  38 *    operate with either 1.8Vdc or 3.0Vdc card voltages; this flag
  39 *    should be set if this is the case.  See for example Section 22.5.3
  40 *    "MMC/SD/SDIO1 Bus Voltage Selection" of the OMAP34xx Multimedia
  41 *    Device Silicon Revision 3.1.x Revision ZR (July 2011) (SWPU223R).
  42 *
  43 * OMAP_HSMMC_BROKEN_MULTIBLOCK_READ: Multiple-block read transfers
  44 *    don't work correctly on some MMC controller instances on some
  45 *    OMAP3 SoCs; this flag should be set if this is the case.  See
  46 *    for example Advisory 2.1.1.128 "MMC: Multiple Block Read
  47 *    Operation Issue" in _OMAP3530/3525/3515/3503 Silicon Errata_
  48 *    Revision F (October 2010) (SPRZ278F).
  49 */
  50#define OMAP_HSMMC_SUPPORTS_DUAL_VOLT           BIT(0)
  51#define OMAP_HSMMC_BROKEN_MULTIBLOCK_READ       BIT(1)
  52
  53struct omap_mmc_dev_attr {
  54        u8 flags;
  55};
  56
  57struct omap_mmc_platform_data {
  58        /* back-link to device */
  59        struct device *dev;
  60
  61        /* number of slots per controller */
  62        unsigned nr_slots:2;
  63
  64        /* set if your board has components or wiring that limits the
  65         * maximum frequency on the MMC bus */
  66        unsigned int max_freq;
  67
  68        /* switch the bus to a new slot */
  69        int (*switch_slot)(struct device *dev, int slot);
  70        /* initialize board-specific MMC functionality, can be NULL if
  71         * not supported */
  72        int (*init)(struct device *dev);
  73        void (*cleanup)(struct device *dev);
  74        void (*shutdown)(struct device *dev);
  75
  76        /* To handle board related suspend/resume functionality for MMC */
  77        int (*suspend)(struct device *dev, int slot);
  78        int (*resume)(struct device *dev, int slot);
  79
  80        /* Return context loss count due to PM states changing */
  81        int (*get_context_loss_count)(struct device *dev);
  82
  83        u64 dma_mask;
  84
  85        /* Integrating attributes from the omap_hwmod layer */
  86        u8 controller_flags;
  87
  88        /* Register offset deviation */
  89        u16 reg_offset;
  90
  91        struct omap_mmc_slot_data {
  92
  93                /*
  94                 * 4/8 wires and any additional host capabilities
  95                 * need to OR'd all capabilities (ref. linux/mmc/host.h)
  96                 */
  97                u8  wires;      /* Used for the MMC driver on omap1 and 2420 */
  98                u32 caps;       /* Used for the MMC driver on 2430 and later */
  99                u32 pm_caps;    /* PM capabilities of the mmc */
 100
 101                /*
 102                 * nomux means "standard" muxing is wrong on this board, and
 103                 * that board-specific code handled it before common init logic.
 104                 */
 105                unsigned nomux:1;
 106
 107                /* switch pin can be for card detect (default) or card cover */
 108                unsigned cover:1;
 109
 110                /* use the internal clock */
 111                unsigned internal_clock:1;
 112
 113                /* nonremovable e.g. eMMC */
 114                unsigned nonremovable:1;
 115
 116                /* Try to sleep or power off when possible */
 117                unsigned power_saving:1;
 118
 119                /* If using power_saving and the MMC power is not to go off */
 120                unsigned no_off:1;
 121
 122                /* eMMC does not handle power off when not in sleep state */
 123                unsigned no_regulator_off_init:1;
 124
 125                /* Regulator off remapped to sleep */
 126                unsigned vcc_aux_disable_is_sleep:1;
 127
 128                /* we can put the features above into this variable */
 129#define HSMMC_HAS_PBIAS         (1 << 0)
 130#define HSMMC_HAS_UPDATED_RESET (1 << 1)
 131                unsigned features;
 132
 133                int switch_pin;                 /* gpio (card detect) */
 134                int gpio_wp;                    /* gpio (write protect) */
 135
 136                int (*set_bus_mode)(struct device *dev, int slot, int bus_mode);
 137                int (*set_power)(struct device *dev, int slot,
 138                                 int power_on, int vdd);
 139                int (*get_ro)(struct device *dev, int slot);
 140                int (*set_sleep)(struct device *dev, int slot, int sleep,
 141                                 int vdd, int cardsleep);
 142                void (*remux)(struct device *dev, int slot, int power_on);
 143                /* Call back before enabling / disabling regulators */
 144                void (*before_set_reg)(struct device *dev, int slot,
 145                                       int power_on, int vdd);
 146                /* Call back after enabling / disabling regulators */
 147                void (*after_set_reg)(struct device *dev, int slot,
 148                                      int power_on, int vdd);
 149                /* if we have special card, init it using this callback */
 150                void (*init_card)(struct mmc_card *card);
 151
 152                /* return MMC cover switch state, can be NULL if not supported.
 153                 *
 154                 * possible return values:
 155                 *   0 - closed
 156                 *   1 - open
 157                 */
 158                int (*get_cover_state)(struct device *dev, int slot);
 159
 160                const char *name;
 161                u32 ocr_mask;
 162
 163                /* Card detection IRQs */
 164                int card_detect_irq;
 165                int (*card_detect)(struct device *dev, int slot);
 166
 167                unsigned int ban_openended:1;
 168
 169        } slots[OMAP_MMC_MAX_SLOTS];
 170};
 171
 172/* called from board-specific card detection service routine */
 173extern void omap_mmc_notify_cover_event(struct device *dev, int slot,
 174                                        int is_closed);
 175
 176#if     defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
 177        defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
 178void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
 179                                int nr_controllers);
 180void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data);
 181int omap_mmc_add(const char *name, int id, unsigned long base,
 182                                unsigned long size, unsigned int irq,
 183                                struct omap_mmc_platform_data *data);
 184#else
 185static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
 186                                int nr_controllers)
 187{
 188}
 189static inline void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data)
 190{
 191}
 192static inline int omap_mmc_add(const char *name, int id, unsigned long base,
 193                                unsigned long size, unsigned int irq,
 194                                struct omap_mmc_platform_data *data)
 195{
 196        return 0;
 197}
 198
 199#endif
 200#endif
 201