1.to support eMMC.
[firefly-linux-kernel-4.4.55.git] / include / linux / mmc / host.h
index 4df54d991241b272c6cfea781c99284ee7040cd1..59f8afd0b8ce2024e93d966881a94e6623a6a469 100755 (executable)
 #define LINUX_MMC_HOST_H
 
 #include <linux/leds.h>
+#include <linux/mutex.h>
 #include <linux/sched.h>
+#include <linux/device.h>
+#include <linux/fault-inject.h>
 #include <linux/wakelock.h>
 
 #include <linux/mmc/core.h>
@@ -51,18 +54,18 @@ struct mmc_ios {
 #define MMC_TIMING_LEGACY      0
 #define MMC_TIMING_MMC_HS      1
 #define MMC_TIMING_SD_HS       2
-#define MMC_TIMING_UHS_SDR12   MMC_TIMING_LEGACY
-#define MMC_TIMING_UHS_SDR25   MMC_TIMING_SD_HS
-#define MMC_TIMING_UHS_SDR50   3
-#define MMC_TIMING_UHS_SDR104  4
-#define MMC_TIMING_UHS_DDR50   5
+#define MMC_TIMING_UHS_SDR12   3
+#define MMC_TIMING_UHS_SDR25   4
+#define MMC_TIMING_UHS_SDR50   5
+#define MMC_TIMING_UHS_SDR104  6
+#define MMC_TIMING_UHS_DDR50   7
 #define MMC_TIMING_MMC_HS200   8
 
-       unsigned char   ddr;                    /* dual data rate used */
-
 #define MMC_SDR_MODE           0
 #define MMC_1_2V_DDR_MODE      1
 #define MMC_1_8V_DDR_MODE      2
+#define MMC_1_2V_SDR_MODE      3
+#define MMC_1_8V_SDR_MODE      4
 
        unsigned char   signal_voltage;         /* signalling voltage (1.8V or 3.3V) */
 
@@ -80,38 +83,18 @@ struct mmc_ios {
 
 struct mmc_host_ops {
        /*
-        * Hosts that support power saving can use the 'enable' and 'disable'
-        * methods to exit and enter power saving states. 'enable' is called
-        * when the host is claimed and 'disable' is called (or scheduled with
-        * a delay) when the host is released. The 'disable' is scheduled if
-        * the disable delay set by 'mmc_set_disable_delay()' is non-zero,
-        * otherwise 'disable' is called immediately. 'disable' may be
-        * scheduled repeatedly, to permit ever greater power saving at the
-        * expense of ever greater latency to re-enable. Rescheduling is
-        * determined by the return value of the 'disable' method. A positive
-        * value gives the delay in milliseconds.
-        *
-        * In the case where a host function (like set_ios) may be called
-        * with or without the host claimed, enabling and disabling can be
-        * done directly and will nest correctly. Call 'mmc_host_enable()' and
-        * 'mmc_host_lazy_disable()' for this purpose, but note that these
-        * functions must be paired.
-        *
-        * Alternatively, 'mmc_host_enable()' may be paired with
-        * 'mmc_host_disable()' which calls 'disable' immediately.  In this
-        * case the 'disable' method will be called with 'lazy' set to 0.
-        * This is mainly useful for error paths.
-        *
-        * Because lazy disable may be called from a work queue, the 'disable'
-        * method must claim the host when 'lazy' != 0, which will work
-        * correctly because recursion is detected and handled.
+        * 'enable' is called when the host is claimed and 'disable' is called
+        * when the host is released. 'enable' and 'disable' are deprecated.
         */
        int (*enable)(struct mmc_host *host);
-       int (*disable)(struct mmc_host *host, int lazy);
+       int (*disable)(struct mmc_host *host);
        /*
         * It is optional for the host to implement pre_req and post_req in
         * order to support double buffering of requests (prepare one
         * request while another request is active).
+        * pre_req() must always be followed by a post_req().
+        * To undo a call made to pre_req(), call post_req() with
+        * a nonzero err condition.
         */
        void    (*post_req)(struct mmc_host *host, struct mmc_request *req,
                            int err);
@@ -146,15 +129,17 @@ struct mmc_host_ops {
 
        /* optional callback for HC quirks */
        void    (*init_card)(struct mmc_host *host, struct mmc_card *card);
+
+       int     (*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios);
+
        /* Check if the card is pulling dat[0:3] low */
        int     (*card_busy)(struct mmc_host *host);
 
-    int        (*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);
-    
-       int     (*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios);
        /* The tuning command opcode value is different for SD and eMMC cards */
-       int     (*execute_tuning)(struct mmc_host *host,u32 opcode);
-       void    (*enable_preset_value)(struct mmc_host *host, bool enable);
+       int     (*execute_tuning)(struct mmc_host *host, u32 opcode);
+       int     (*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);
+       void    (*hw_reset)(struct mmc_host *host);
+       void    (*card_event)(struct mmc_host *host);
 };
 
 struct mmc_card;
@@ -170,7 +155,46 @@ struct mmc_async_req {
        int (*err_check) (struct mmc_card *, struct mmc_async_req *);
 };
 
-#define HOST_IS_EMMC(host)     (host->unused)
+/**
+ * struct mmc_slot - MMC slot functions
+ *
+ * @cd_irq:            MMC/SD-card slot hotplug detection IRQ or -EINVAL
+ * @lock:              protect the @handler_priv pointer
+ * @handler_priv:      MMC/SD-card slot context
+ *
+ * Some MMC/SD host controllers implement slot-functions like card and
+ * write-protect detection natively. However, a large number of controllers
+ * leave these functions to the CPU. This struct provides a hook to attach
+ * such slot-function drivers.
+ */
+struct mmc_slot {
+       int cd_irq;
+       struct mutex lock;
+       void *handler_priv;
+};
+
+/**
+ * mmc_context_info - synchronization details for mmc context
+ * @is_done_rcv                wake up reason was done request
+ * @is_new_req         wake up reason was new request
+ * @is_waiting_last_req        mmc context waiting for single running request
+ * @wait               wait queue
+ * @lock               lock to protect data fields
+ */
+struct mmc_context_info {
+       bool                    is_done_rcv;
+       bool                    is_new_req;
+       bool                    is_waiting_last_req;
+       wait_queue_head_t       wait;
+       spinlock_t              lock;
+};
+
+struct regulator;
+
+struct mmc_supply {
+       struct regulator *vmmc;         /* Card power supply */
+       struct regulator *vqmmc;        /* Optional Vccq supply */
+};
 
 struct mmc_host {
        struct device           *parent;
@@ -185,6 +209,9 @@ struct mmc_host {
        u32                     ocr_avail_sd;   /* SD-specific OCR */
        u32                     ocr_avail_mmc;  /* MMC-specific OCR */
        struct notifier_block   pm_notify;
+       u32                     max_current_330;
+       u32                     max_current_300;
+       u32                     max_current_180;
 
 #define MMC_VDD_165_195                0x00000080      /* VDD voltage 1.65 - 1.95 */
 #define MMC_VDD_20_21          0x00000100      /* VDD voltage 2.0 ~ 2.1 */
@@ -204,7 +231,7 @@ struct mmc_host {
 #define MMC_VDD_34_35          0x00400000      /* VDD voltage 3.4 ~ 3.5 */
 #define MMC_VDD_35_36          0x00800000      /* VDD voltage 3.5 ~ 3.6 */
 
-       unsigned long           caps;           /* Host capabilities */
+       u32                     caps;           /* Host capabilities */
 
 #define MMC_CAP_4_BIT_DATA     (1 << 0)        /* Can the host do 4 bit transfers */
 #define MMC_CAP_MMC_HIGHSPEED  (1 << 1)        /* Can do MMC high-speed timing */
@@ -213,7 +240,7 @@ struct mmc_host {
 #define MMC_CAP_SPI            (1 << 4)        /* Talks only SPI protocols */
 #define MMC_CAP_NEEDS_POLL     (1 << 5)        /* Needs polling for card-detection */
 #define MMC_CAP_8_BIT_DATA     (1 << 6)        /* Can the host do 8 bit transfers */
-#define MMC_CAP_DISABLE                (1 << 7)        /* Can the host be disabled */
+#define MMC_CAP_AGGRESSIVE_PM  (1 << 7)        /* Suspend (e)MMC/SD at idle  */
 #define MMC_CAP_NONREMOVABLE   (1 << 8)        /* Nonremovable e.g. eMMC */
 #define MMC_CAP_WAIT_WHILE_BUSY        (1 << 9)        /* Waits while card is busy */
 #define MMC_CAP_ERASE          (1 << 10)       /* Allow erase/trim commands */
@@ -228,50 +255,52 @@ struct mmc_host {
 #define MMC_CAP_UHS_SDR50      (1 << 17)       /* Host supports UHS SDR50 mode */
 #define MMC_CAP_UHS_SDR104     (1 << 18)       /* Host supports UHS SDR104 mode */
 #define MMC_CAP_UHS_DDR50      (1 << 19)       /* Host supports UHS DDR50 mode */
-#define MMC_CAP_SET_XPC_330    (1 << 20)       /* Host supports >150mA current at 3.3V */
-#define MMC_CAP_SET_XPC_300    (1 << 21)       /* Host supports >150mA current at 3.0V */
-#define MMC_CAP_SET_XPC_180    (1 << 22)       /* Host supports >150mA current at 1.8V */
+#define MMC_CAP_RUNTIME_RESUME (1 << 20)       /* Resume at runtime_resume. */
 #define MMC_CAP_DRIVER_TYPE_A  (1 << 23)       /* Host supports Driver Type A */
 #define MMC_CAP_DRIVER_TYPE_C  (1 << 24)       /* Host supports Driver Type C */
 #define MMC_CAP_DRIVER_TYPE_D  (1 << 25)       /* Host supports Driver Type D */
-#define MMC_CAP_MAX_CURRENT_200        (1 << 26)       /* Host max current limit is 200mA */
-#define MMC_CAP_MAX_CURRENT_400        (1 << 27)       /* Host max current limit is 400mA */
-#define MMC_CAP_MAX_CURRENT_600        (1 << 28)       /* Host max current limit is 600mA */
-#define MMC_CAP_MAX_CURRENT_800        (1 << 29)       /* Host max current limit is 800mA */
 #define MMC_CAP_CMD23          (1 << 30)       /* CMD23 supported. */
 #define MMC_CAP_HW_RESET       (1 << 31)       /* Hardware reset */
-    
-        u32         caps2;      /* More host capabilities */
+
+       u32                     caps2;          /* More host capabilities */
+
 #define MMC_CAP2_BOOTPART_NOACC        (1 << 0)        /* Boot partition no access */
 #define MMC_CAP2_CACHE_CTRL    (1 << 1)        /* Allow cache control */
-#define MMC_CAP2_POWEROFF_NOTIFY (1 << 2)      /* Notify poweroff supported */
+#define MMC_CAP2_FULL_PWR_CYCLE        (1 << 2)        /* Can do full power cycle */
 #define MMC_CAP2_NO_MULTI_READ (1 << 3)        /* Multiblock reads don't work */
 #define MMC_CAP2_NO_SLEEP_CMD  (1 << 4)        /* Don't allow sleep command */
 #define MMC_CAP2_HS200_1_8V_SDR        (1 << 5)        /* can support */
 #define MMC_CAP2_HS200_1_2V_SDR        (1 << 6)        /* can support */
 #define MMC_CAP2_HS200         (MMC_CAP2_HS200_1_8V_SDR | \
-                     MMC_CAP2_HS200_1_2V_SDR)
+                                MMC_CAP2_HS200_1_2V_SDR)
 #define MMC_CAP2_BROKEN_VOLTAGE        (1 << 7)        /* Use the broken voltage */
-#define MMC_CAP2_DETECT_ON_ERR (1 << 8)        /* On I/O err check card removal */
 #define MMC_CAP2_HC_ERASE_SZ   (1 << 9)        /* High-capacity erase size */
 #define MMC_CAP2_CD_ACTIVE_HIGH        (1 << 10)       /* Card-detect signal active high */
 #define MMC_CAP2_RO_ACTIVE_HIGH        (1 << 11)       /* Write-protect signal active high */
 #define MMC_CAP2_PACKED_RD     (1 << 12)       /* Allow packed read */
 #define MMC_CAP2_PACKED_WR     (1 << 13)       /* Allow packed write */
 #define MMC_CAP2_PACKED_CMD    (MMC_CAP2_PACKED_RD | \
-                     MMC_CAP2_PACKED_WR)
+                                MMC_CAP2_PACKED_WR)
 #define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14)  /* Don't power up before scan */
+#define MMC_CAP2_SANITIZE      (1 << 15)               /* Support Sanitize */
 
        mmc_pm_flag_t           pm_caps;        /* supported pm features */
+       
+    u32        cardtype_restrict;      /*restrict the SDMMC controller to support card type;1--SD card; 2--sdio; 4--eMMC */
+#define RESTRICT_CARD_TYPE_SD  (1 << 0)        /*noted by XBW, Rockchip Co.Ld*/
+#define RESTRICT_CARD_TYPE_SDIO        (1 << 1)        
+#define RESTRICT_CARD_TYPE_EMMC        (1 << 2)        
 
 #ifdef CONFIG_MMC_CLKGATE
        int                     clk_requests;   /* internal reference counter */
        unsigned int            clk_delay;      /* number of MCI clk hold cycles */
        bool                    clk_gated;      /* clock gated */
-       struct work_struct      clk_gate_work; /* delayed clock gate */
+       struct delayed_work     clk_gate_work; /* delayed clock gate */
        unsigned int            clk_old;        /* old clock value cache */
        spinlock_t              clk_lock;       /* lock for clk fields */
        struct mutex            clk_gate_mutex; /* mutex for clock gating */
+       struct device_attribute clkgate_delay_attr;
+       unsigned long           clkgate_delay;
 #endif
 
        /* host specific block data */
@@ -287,7 +316,6 @@ struct mmc_host {
        spinlock_t              lock;           /* lock for claim and bus ops */
 
        struct mmc_ios          ios;            /* current io bus settings */
-       u32                     ocr;            /* the current OCR setting */
 
        /* group bitfields together to minimize padding */
        unsigned int            use_spi_crc:1;
@@ -297,13 +325,8 @@ struct mmc_host {
        unsigned int            removed:1;      /* host is being removed */
 #endif
 
-       /* Only used with MMC_CAP_DISABLE */
-       int                     enabled;        /* host is enabled */
        int                     rescan_disable; /* disable card detection */
-       int                     nesting_cnt;    /* "enable" nesting count */
-       int                     en_dis_recurs;  /* detect recursion */
-       unsigned int            disable_delay;  /* disable delay in msecs */
-       struct delayed_work     disable;        /* disabling work */
+       int                     rescan_entered; /* used with nonremovable devices */
 
        struct mmc_card         *card;          /* device attached to this host */
 
@@ -313,16 +336,15 @@ struct mmc_host {
 
        struct delayed_work     detect;
        struct wake_lock        detect_wake_lock;
+       int                     detect_change;  /* card detect flag */
+       struct mmc_slot         slot;
 
        const struct mmc_bus_ops *bus_ops;      /* current bus driver */
        unsigned int            bus_refs;       /* reference counter */
-
-#if defined(CONFIG_SDMMC_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
-       unsigned int            re_initialized_flags; //in order to begin the rescan ;  added by xbw@2011-04-07
-       unsigned int            doneflag; //added by xbw at 2011-08-27
-       int                     (*sdmmc_host_hw_init)(void *data);
-#endif
-
+    
+    unsigned int        re_initialized_flags; //in order to begin the rescan ;  added by xbw@2011-04-07
+    unsigned int        doneflag; //added by xbw at 2011-08-27
+    int         (*sdmmc_host_hw_init)(void *data);
        unsigned int            bus_resume_flags;
 #define MMC_BUSRESUME_MANUAL_RESUME    (1 << 0)
 #define MMC_BUSRESUME_NEEDS_RESUME     (1 << 1)
@@ -334,16 +356,26 @@ struct mmc_host {
 
        mmc_pm_flag_t           pm_flags;       /* requested pm features */
 
-#ifdef CONFIG_LEDS_TRIGGERS
        struct led_trigger      *led;           /* activity led */
-#endif
 
 #ifdef CONFIG_REGULATOR
        bool                    regulator_enabled; /* regulator state */
 #endif
+       struct mmc_supply       supply;
 
        struct dentry           *debugfs_root;
 
+       struct mmc_async_req    *areq;          /* active async req */
+       struct mmc_context_info context_info;   /* async synchronization info */
+
+#ifdef CONFIG_FAIL_MMC_REQUEST
+       struct fault_attr       fail_mmc_request;
+#endif
+
+       unsigned int            actual_clock;   /* Actual HC clock rate */
+
+       unsigned int            slotno; /* used for sdio acpi binding */
+
 #ifdef CONFIG_MMC_EMBEDDED_SDIO
        struct {
                struct sdio_cis                 *cis;
@@ -352,15 +384,15 @@ struct mmc_host {
                int                             num_funcs;
        } embedded_sdio_data;
 #endif
-       struct mmc_async_req    *areq;          /* active async req */
 
        unsigned long           private[0] ____cacheline_aligned;
 };
 
-extern struct mmc_host *mmc_alloc_host(int extra, struct device *);
-extern int mmc_add_host(struct mmc_host *);
-extern void mmc_remove_host(struct mmc_host *);
-extern void mmc_free_host(struct mmc_host *);
+struct mmc_host *mmc_alloc_host(int extra, struct device *);
+int mmc_add_host(struct mmc_host *);
+void mmc_remove_host(struct mmc_host *);
+void mmc_free_host(struct mmc_host *);
+int mmc_of_parse(struct mmc_host *host);
 
 #ifdef CONFIG_MMC_EMBEDDED_SDIO
 extern void mmc_set_embedded_sdio_data(struct mmc_host *host,
@@ -393,14 +425,13 @@ static inline void mmc_set_bus_resume_policy(struct mmc_host *host, int manual)
 
 extern int mmc_resume_bus(struct mmc_host *host);
 
-extern int mmc_suspend_host(struct mmc_host *);
-extern int mmc_resume_host(struct mmc_host *);
+int mmc_power_save_host(struct mmc_host *host);
+int mmc_power_restore_host(struct mmc_host *host);
 
-extern int mmc_power_save_host(struct mmc_host *host);
-extern int mmc_power_restore_host(struct mmc_host *host);
+void mmc_detect_change(struct mmc_host *, unsigned long delay);
+void mmc_request_done(struct mmc_host *, struct mmc_request *);
 
-extern void mmc_detect_change(struct mmc_host *, unsigned long delay);
-extern void mmc_request_done(struct mmc_host *, struct mmc_request *);
+int mmc_cache_ctrl(struct mmc_host *, u8);
 
 static inline void mmc_signal_sdio_irq(struct mmc_host *host)
 {
@@ -409,13 +440,12 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host)
        wake_up_process(host->sdio_irq_thread);
 }
 
-struct regulator;
-
 #ifdef CONFIG_REGULATOR
 int mmc_regulator_get_ocrmask(struct regulator *supply);
 int mmc_regulator_set_ocr(struct mmc_host *mmc,
                        struct regulator *supply,
                        unsigned short vdd_bit);
+int mmc_regulator_get_supply(struct mmc_host *mmc);
 #else
 static inline int mmc_regulator_get_ocrmask(struct regulator *supply)
 {
@@ -428,25 +458,17 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc,
 {
        return 0;
 }
-#endif
-
-int mmc_card_awake(struct mmc_host *host);
-int mmc_card_sleep(struct mmc_host *host);
-int mmc_card_can_sleep(struct mmc_host *host);
-
-int mmc_host_enable(struct mmc_host *host);
-int mmc_host_disable(struct mmc_host *host);
-int mmc_host_lazy_disable(struct mmc_host *host);
-int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
 
-static inline void mmc_set_disable_delay(struct mmc_host *host,
-                                        unsigned int disable_delay)
+static inline int mmc_regulator_get_supply(struct mmc_host *mmc)
 {
-       host->disable_delay = disable_delay;
+       return 0;
 }
+#endif
+
+int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
 
 /* Module parameter */
-extern int mmc_assume_removable;
+extern bool mmc_assume_removable;
 
 static inline int mmc_card_is_removable(struct mmc_host *host)
 {
@@ -468,6 +490,11 @@ static inline int mmc_host_cmd23(struct mmc_host *host)
        return host->caps & MMC_CAP_CMD23;
 }
 
+static inline int mmc_boot_partition_access(struct mmc_host *host)
+{
+       return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);
+}
+
 static inline int mmc_host_uhs(struct mmc_host *host)
 {
        return host->caps &
@@ -476,5 +503,28 @@ static inline int mmc_host_uhs(struct mmc_host *host)
                 MMC_CAP_UHS_DDR50);
 }
 
-#endif
+static inline int mmc_host_packed_wr(struct mmc_host *host)
+{
+       return host->caps2 & MMC_CAP2_PACKED_WR;
+}
+
+#ifdef CONFIG_MMC_CLKGATE
+void mmc_host_clk_hold(struct mmc_host *host);
+void mmc_host_clk_release(struct mmc_host *host);
+unsigned int mmc_host_clk_rate(struct mmc_host *host);
 
+#else
+static inline void mmc_host_clk_hold(struct mmc_host *host)
+{
+}
+
+static inline void mmc_host_clk_release(struct mmc_host *host)
+{
+}
+
+static inline unsigned int mmc_host_clk_rate(struct mmc_host *host)
+{
+       return host->ios.clock;
+}
+#endif
+#endif /* LINUX_MMC_HOST_H */