diff options
Diffstat (limited to 'include/linux/mmc')
| -rw-r--r-- | include/linux/mmc/card.h | 33 | ||||
| -rw-r--r-- | include/linux/mmc/cd-gpio.h | 19 | ||||
| -rw-r--r-- | include/linux/mmc/core.h | 2 | ||||
| -rw-r--r-- | include/linux/mmc/dw_mmc.h | 7 | ||||
| -rw-r--r-- | include/linux/mmc/host.h | 47 | ||||
| -rw-r--r-- | include/linux/mmc/mmc.h | 72 | ||||
| -rw-r--r-- | include/linux/mmc/sdhci-pci-data.h | 18 | ||||
| -rw-r--r-- | include/linux/mmc/sdhci.h | 3 | ||||
| -rw-r--r-- | include/linux/mmc/sdio.h | 27 | 
9 files changed, 217 insertions, 11 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 415f2db414e..19a41d1737a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -71,6 +71,8 @@ struct mmc_ext_csd {  	bool			hpi_en;			/* HPI enablebit */  	bool			hpi;			/* HPI support bit */  	unsigned int		hpi_cmd;		/* cmd used as HPI */ +	unsigned int		boot_ro_lock;		/* ro lock support */ +	bool			boot_ro_lockable;  	u8			raw_partition_support;	/* 160 */  	u8			raw_erased_mem_count;	/* 181 */  	u8			raw_ext_csd_structure;	/* 194 */ @@ -110,6 +112,7 @@ struct sd_ssr {  struct sd_switch_caps {  	unsigned int		hs_max_dtr;  	unsigned int		uhs_max_dtr; +#define HIGH_SPEED_MAX_DTR	50000000  #define UHS_SDR104_MAX_DTR	208000000  #define UHS_SDR50_MAX_DTR	100000000  #define UHS_DDR50_MAX_DTR	50000000 @@ -117,11 +120,13 @@ struct sd_switch_caps {  #define UHS_SDR12_MAX_DTR	25000000  	unsigned int		sd3_bus_mode;  #define UHS_SDR12_BUS_SPEED	0 +#define HIGH_SPEED_BUS_SPEED	1  #define UHS_SDR25_BUS_SPEED	1  #define UHS_SDR50_BUS_SPEED	2  #define UHS_SDR104_BUS_SPEED	3  #define UHS_DDR50_BUS_SPEED	4 +#define SD_MODE_HIGH_SPEED	(1 << HIGH_SPEED_BUS_SPEED)  #define SD_MODE_UHS_SDR12	(1 << UHS_SDR12_BUS_SPEED)  #define SD_MODE_UHS_SDR25	(1 << UHS_SDR25_BUS_SPEED)  #define SD_MODE_UHS_SDR50	(1 << UHS_SDR50_BUS_SPEED) @@ -184,6 +189,10 @@ struct mmc_part {  	unsigned int	part_cfg;	/* partition type */  	char	name[MAX_MMC_PART_NAME_LEN];  	bool	force_ro;	/* to make boot parts RO by default */ +	unsigned int	area_type; +#define MMC_BLK_DATA_AREA_MAIN	(1<<0) +#define MMC_BLK_DATA_AREA_BOOT	(1<<1) +#define MMC_BLK_DATA_AREA_GP	(1<<2)  };  /* @@ -206,6 +215,9 @@ struct mmc_card {  #define MMC_STATE_HIGHSPEED_DDR (1<<4)		/* card is in high speed mode */  #define MMC_STATE_ULTRAHIGHSPEED (1<<5)		/* card is in ultra high speed mode */  #define MMC_CARD_SDXC		(1<<6)		/* card is SDXC */ +#define MMC_CARD_REMOVED	(1<<7)		/* card has been removed */ +#define MMC_STATE_HIGHSPEED_200	(1<<8)		/* card is in HS200 mode */ +#define MMC_STATE_SLEEP		(1<<9)		/* card is in sleep state */  	unsigned int		quirks; 	/* card quirks */  #define MMC_QUIRK_LENIENT_FN0	(1<<0)		/* allow SDIO FN0 writes outside of the VS CCCR range */  #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1)	/* use func->cur_blksize */ @@ -218,6 +230,7 @@ struct mmc_card {  #define MMC_QUIRK_INAND_CMD38	(1<<6)		/* iNAND devices have broken CMD38 */  #define MMC_QUIRK_BLK_NO_CMD23	(1<<7)		/* Avoid CMD23 for regular multiblock */  #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8)	/* Avoid sending 512 bytes in */ +#define MMC_QUIRK_LONG_READ_TIME (1<<9)		/* Data read time > CSD says */  						/* byte mode */  	unsigned int    poweroff_notify_state;	/* eMMC4.5 notify feature */  #define MMC_NO_POWER_NOTIFICATION	0 @@ -260,12 +273,14 @@ struct mmc_card {   * This function fill contents in mmc_part.   */  static inline void mmc_part_add(struct mmc_card *card, unsigned int size, -			unsigned int part_cfg, char *name, int idx, bool ro) +			unsigned int part_cfg, char *name, int idx, bool ro, +			int area_type)  {  	card->part[card->nr_parts].size = size;  	card->part[card->nr_parts].part_cfg = part_cfg;  	sprintf(card->part[card->nr_parts].name, name, idx);  	card->part[card->nr_parts].force_ro = ro; +	card->part[card->nr_parts].area_type = area_type;  	card->nr_parts++;  } @@ -361,19 +376,28 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)  #define mmc_card_present(c)	((c)->state & MMC_STATE_PRESENT)  #define mmc_card_readonly(c)	((c)->state & MMC_STATE_READONLY)  #define mmc_card_highspeed(c)	((c)->state & MMC_STATE_HIGHSPEED) +#define mmc_card_hs200(c)	((c)->state & MMC_STATE_HIGHSPEED_200)  #define mmc_card_blockaddr(c)	((c)->state & MMC_STATE_BLOCKADDR)  #define mmc_card_ddr_mode(c)	((c)->state & MMC_STATE_HIGHSPEED_DDR) -#define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) +#define mmc_card_uhs(c)		((c)->state & MMC_STATE_ULTRAHIGHSPEED) +#define mmc_sd_card_uhs(c)	((c)->state & MMC_STATE_ULTRAHIGHSPEED)  #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) +#define mmc_card_removed(c)	((c) && ((c)->state & MMC_CARD_REMOVED)) +#define mmc_card_is_sleep(c)	((c)->state & MMC_STATE_SLEEP)  #define mmc_card_set_present(c)	((c)->state |= MMC_STATE_PRESENT)  #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)  #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) +#define mmc_card_set_hs200(c)	((c)->state |= MMC_STATE_HIGHSPEED_200)  #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)  #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) +#define mmc_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED)  #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED)  #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) +#define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) +#define mmc_card_set_sleep(c)	((c)->state |= MMC_STATE_SLEEP) +#define mmc_card_clr_sleep(c)	((c)->state &= ~MMC_STATE_SLEEP)  /*   * Quirk add/remove for MMC products.   */ @@ -433,6 +457,11 @@ static inline int mmc_card_broken_byte_mode_512(const struct mmc_card *c)  	return c->quirks & MMC_QUIRK_BROKEN_BYTE_MODE_512;  } +static inline int mmc_card_long_read_time(const struct mmc_card *c) +{ +	return c->quirks & MMC_QUIRK_LONG_READ_TIME; +} +  #define mmc_card_name(c)	((c)->cid.prod_name)  #define mmc_card_id(c)		(dev_name(&(c)->dev)) diff --git a/include/linux/mmc/cd-gpio.h b/include/linux/mmc/cd-gpio.h new file mode 100644 index 00000000000..a8e46978331 --- /dev/null +++ b/include/linux/mmc/cd-gpio.h @@ -0,0 +1,19 @@ +/* + * Generic GPIO card-detect helper header + * + * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef MMC_CD_GPIO_H +#define MMC_CD_GPIO_H + +struct mmc_host; +int mmc_cd_gpio_request(struct mmc_host *host, unsigned int gpio, +			unsigned int irq, unsigned long flags); +void mmc_cd_gpio_free(struct mmc_host *host); + +#endif diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 174a844a5dd..87a976cc565 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h @@ -180,6 +180,8 @@ extern int mmc_try_claim_host(struct mmc_host *host);  extern int mmc_flush_cache(struct mmc_card *); +extern int mmc_detect_card_removed(struct mmc_host *host); +  /**   *	mmc_claim_host - exclusively claim a host   *	@host: mmc host to claim diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 6dc9b80568a..aae5d1f1bb3 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -14,6 +14,8 @@  #ifndef LINUX_MMC_DW_MMC_H  #define LINUX_MMC_DW_MMC_H +#include <linux/scatterlist.h> +  #define MAX_MCI_SLOTS	2  enum dw_mci_state { @@ -40,7 +42,7 @@ struct mmc_data;   * @lock: Spinlock protecting the queue and associated data.   * @regs: Pointer to MMIO registers.   * @sg: Scatterlist entry currently being processed by PIO code, if any. - * @pio_offset: Offset into the current scatterlist entry. + * @sg_miter: PIO mapping scatterlist iterator.   * @cur_slot: The slot which is currently using the controller.   * @mrq: The request currently being processed on @cur_slot,   *	or NULL if the controller is idle. @@ -115,7 +117,7 @@ struct dw_mci {  	void __iomem		*regs;  	struct scatterlist	*sg; -	unsigned int		pio_offset; +	struct sg_mapping_iter	sg_miter;  	struct dw_mci_slot	*cur_slot;  	struct mmc_request	*mrq; @@ -214,6 +216,7 @@ struct dw_mci_board {  	unsigned int bus_hz; /* Bus speed */  	unsigned int caps;	/* Capabilities */ +	unsigned int caps2;	/* More capabilities */  	/*  	 * Override fifo depth. If 0, autodetect it from the FIFOTH register,  	 * but note that this may not be reliable after a bootloader has used diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index a3ac9c48e5d..ee2b0363c04 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -56,10 +56,13 @@ struct mmc_ios {  #define MMC_TIMING_UHS_SDR50	3  #define MMC_TIMING_UHS_SDR104	4  #define MMC_TIMING_UHS_DDR50	5 +#define MMC_TIMING_MMC_HS200	6  #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) */ @@ -148,7 +151,9 @@ struct mmc_host_ops {  	void	(*init_card)(struct mmc_host *host, struct mmc_card *card);  	int	(*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios); -	int	(*execute_tuning)(struct mmc_host *host); + +	/* 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	(*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);  	void	(*hw_reset)(struct mmc_host *host); @@ -167,6 +172,11 @@ struct mmc_async_req {  	int (*err_check) (struct mmc_card *, struct mmc_async_req *);  }; +struct mmc_hotplug { +	unsigned int irq; +	void *handler_priv; +}; +  struct mmc_host {  	struct device		*parent;  	struct device		class_dev; @@ -242,6 +252,12 @@ struct mmc_host {  #define MMC_CAP2_CACHE_CTRL	(1 << 1)	/* Allow cache control */  #define MMC_CAP2_POWEROFF_NOTIFY (1 << 2)	/* Notify poweroff supported */  #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) +#define MMC_CAP2_BROKEN_VOLTAGE	(1 << 7)	/* Use the broken voltage */  	mmc_pm_flag_t		pm_caps;	/* supported pm features */  	unsigned int        power_notify_type; @@ -253,10 +269,12 @@ struct mmc_host {  	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 */ @@ -297,6 +315,8 @@ struct mmc_host {  	int			claim_cnt;	/* "claim" nesting count */  	struct delayed_work	detect; +	int			detect_change;	/* card detect flag */ +	struct mmc_hotplug	hotplug;  	const struct mmc_bus_ops *bus_ops;	/* current bus driver */  	unsigned int		bus_refs;	/* reference counter */ @@ -323,6 +343,8 @@ struct mmc_host {  	struct fault_attr	fail_mmc_request;  #endif +	unsigned int		actual_clock;	/* Actual HC clock rate */ +  	unsigned long		private[0] ____cacheline_aligned;  }; @@ -396,7 +418,7 @@ static inline void mmc_set_disable_delay(struct mmc_host *host,  }  /* Module parameter */ -extern int mmc_assume_removable; +extern bool mmc_assume_removable;  static inline int mmc_card_is_removable(struct mmc_host *host)  { @@ -423,4 +445,23 @@ static inline int mmc_boot_partition_access(struct mmc_host *host)  	return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);  } +#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 */ diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 0e7135697d1..fb9f6e116e1 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -51,6 +51,7 @@  #define MMC_READ_SINGLE_BLOCK    17   /* adtc [31:0] data addr   R1  */  #define MMC_READ_MULTIPLE_BLOCK  18   /* adtc [31:0] data addr   R1  */  #define MMC_SEND_TUNING_BLOCK    19   /* adtc                    R1  */ +#define MMC_SEND_TUNING_BLOCK_HS200	21	/* adtc R1  */    /* class 3 */  #define MMC_WRITE_DAT_UNTIL_STOP 20   /* adtc [31:0] data addr   R1  */ @@ -280,6 +281,7 @@ struct _mmc_csd {  #define EXT_CSD_RST_N_FUNCTION		162	/* R/W */  #define EXT_CSD_SANITIZE_START		165     /* W */  #define EXT_CSD_WR_REL_PARAM		166	/* RO */ +#define EXT_CSD_BOOT_WP			173	/* R/W */  #define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */  #define EXT_CSD_PART_CONFIG		179	/* R/W */  #define EXT_CSD_ERASED_MEM_CONT		181	/* RO */ @@ -321,6 +323,11 @@ struct _mmc_csd {  #define EXT_CSD_WR_REL_PARAM_EN		(1<<2) +#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS	(0x40) +#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS	(0x10) +#define EXT_CSD_BOOT_WP_B_PERM_WP_EN	(0x04) +#define EXT_CSD_BOOT_WP_B_PWR_WP_EN	(0x01) +  #define EXT_CSD_PART_CONFIG_ACC_MASK	(0x7)  #define EXT_CSD_PART_CONFIG_ACC_BOOT0	(0x1)  #define EXT_CSD_PART_CONFIG_ACC_GP0	(0x4) @@ -333,13 +340,76 @@ struct _mmc_csd {  #define EXT_CSD_CARD_TYPE_26	(1<<0)	/* Card can run at 26MHz */  #define EXT_CSD_CARD_TYPE_52	(1<<1)	/* Card can run at 52MHz */ -#define EXT_CSD_CARD_TYPE_MASK	0xF	/* Mask out reserved bits */ +#define EXT_CSD_CARD_TYPE_MASK	0x3F	/* Mask out reserved bits */  #define EXT_CSD_CARD_TYPE_DDR_1_8V  (1<<2)   /* Card can run at 52MHz */  					     /* DDR mode @1.8V or 3V I/O */  #define EXT_CSD_CARD_TYPE_DDR_1_2V  (1<<3)   /* Card can run at 52MHz */  					     /* DDR mode @1.2V I/O */  #define EXT_CSD_CARD_TYPE_DDR_52       (EXT_CSD_CARD_TYPE_DDR_1_8V  \  					| EXT_CSD_CARD_TYPE_DDR_1_2V) +#define EXT_CSD_CARD_TYPE_SDR_1_8V	(1<<4)	/* Card can run at 200MHz */ +#define EXT_CSD_CARD_TYPE_SDR_1_2V	(1<<5)	/* Card can run at 200MHz */ +						/* SDR mode @1.2V I/O */ + +#define EXT_CSD_CARD_TYPE_SDR_200	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +					 EXT_CSD_CARD_TYPE_SDR_1_2V) + +#define EXT_CSD_CARD_TYPE_SDR_ALL	(EXT_CSD_CARD_TYPE_SDR_200 | \ +					 EXT_CSD_CARD_TYPE_52 | \ +					 EXT_CSD_CARD_TYPE_26) + +#define	EXT_CSD_CARD_TYPE_SDR_1_2V_ALL	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +					 EXT_CSD_CARD_TYPE_52 | \ +					 EXT_CSD_CARD_TYPE_26) + +#define	EXT_CSD_CARD_TYPE_SDR_1_8V_ALL	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +					 EXT_CSD_CARD_TYPE_52 | \ +					 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_DDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52	(EXT_CSD_CARD_TYPE_SDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_DDR_52 | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52	(EXT_CSD_CARD_TYPE_SDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_DDR_52 | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V	(EXT_CSD_CARD_TYPE_SDR_200 | \ +						 EXT_CSD_CARD_TYPE_DDR_1_8V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V	(EXT_CSD_CARD_TYPE_SDR_200 | \ +						 EXT_CSD_CARD_TYPE_DDR_1_2V | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26) + +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52	(EXT_CSD_CARD_TYPE_SDR_200 | \ +						 EXT_CSD_CARD_TYPE_DDR_52 | \ +						 EXT_CSD_CARD_TYPE_52 | \ +						 EXT_CSD_CARD_TYPE_26)  #define EXT_CSD_BUS_WIDTH_1	0	/* Card is in 1 bit mode */  #define EXT_CSD_BUS_WIDTH_4	1	/* Card is in 4 bit mode */ diff --git a/include/linux/mmc/sdhci-pci-data.h b/include/linux/mmc/sdhci-pci-data.h new file mode 100644 index 00000000000..8959604a13d --- /dev/null +++ b/include/linux/mmc/sdhci-pci-data.h @@ -0,0 +1,18 @@ +#ifndef LINUX_MMC_SDHCI_PCI_DATA_H +#define LINUX_MMC_SDHCI_PCI_DATA_H + +struct pci_dev; + +struct sdhci_pci_data { +	struct pci_dev	*pdev; +	int		slotno; +	int		rst_n_gpio; /* Set to -EINVAL if unused */ +	int		cd_gpio;    /* Set to -EINVAL if unused */ +	int		(*setup)(struct sdhci_pci_data *data); +	void		(*cleanup)(struct sdhci_pci_data *data); +}; + +extern struct sdhci_pci_data *(*sdhci_pci_get_data)(struct pci_dev *pdev, +				int slotno); + +#endif diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index e4b69353678..c750f85177d 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -90,8 +90,6 @@ struct sdhci_host {  	unsigned int quirks2;	/* More deviations from spec. */ -#define SDHCI_QUIRK2_OWN_CARD_DETECTION			(1<<0) -  	int irq;		/* Device IRQ */  	void __iomem *ioaddr;	/* Mapped address */ @@ -121,6 +119,7 @@ struct sdhci_host {  #define SDHCI_AUTO_CMD23	(1<<7)	/* Auto CMD23 support */  #define SDHCI_PV_ENABLED	(1<<8)	/* Preset value enabled */  #define SDHCI_SDIO_IRQ_ENABLED	(1<<9)	/* SDIO irq enabled */ +#define SDHCI_HS200_NEEDS_TUNING (1<<10)	/* HS200 needs tuning */  	unsigned int version;	/* SDHCI spec. version */ diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index e0b1123497b..c9fe66c58f8 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h @@ -38,6 +38,7 @@   *      [8:0] Byte/block count   */ +#define R4_18V_PRESENT (1<<24)  #define R4_MEMORY_PRESENT (1 << 27)  /* @@ -85,6 +86,7 @@  #define  SDIO_SD_REV_1_01	0	/* SD Physical Spec Version 1.01 */  #define  SDIO_SD_REV_1_10	1	/* SD Physical Spec Version 1.10 */  #define  SDIO_SD_REV_2_00	2	/* SD Physical Spec Version 2.00 */ +#define  SDIO_SD_REV_3_00	3	/* SD Physical Spev Version 3.00 */  #define SDIO_CCCR_IOEx		0x02  #define SDIO_CCCR_IORx		0x03 @@ -134,8 +136,31 @@  #define SDIO_CCCR_SPEED		0x13  #define  SDIO_SPEED_SHS		0x01	/* Supports High-Speed mode */ -#define  SDIO_SPEED_EHS		0x02	/* Enable High-Speed mode */ +#define  SDIO_SPEED_BSS_SHIFT	1 +#define  SDIO_SPEED_BSS_MASK	(7<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR12	(0<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR25	(1<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR50	(2<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_SDR104	(3<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_DDR50	(4<<SDIO_SPEED_BSS_SHIFT) +#define  SDIO_SPEED_EHS		SDIO_SPEED_SDR25	/* Enable High-Speed */ +#define SDIO_CCCR_UHS		0x14 +#define  SDIO_UHS_SDR50		0x01 +#define  SDIO_UHS_SDR104	0x02 +#define  SDIO_UHS_DDR50		0x04 + +#define SDIO_CCCR_DRIVE_STRENGTH 0x15 +#define  SDIO_SDTx_MASK		0x07 +#define  SDIO_DRIVE_SDTA	(1<<0) +#define  SDIO_DRIVE_SDTC	(1<<1) +#define  SDIO_DRIVE_SDTD	(1<<2) +#define  SDIO_DRIVE_DTSx_MASK	0x03 +#define  SDIO_DRIVE_DTSx_SHIFT	4 +#define  SDIO_DTSx_SET_TYPE_B	(0 << SDIO_DRIVE_DTSx_SHIFT) +#define  SDIO_DTSx_SET_TYPE_A	(1 << SDIO_DRIVE_DTSx_SHIFT) +#define  SDIO_DTSx_SET_TYPE_C	(2 << SDIO_DRIVE_DTSx_SHIFT) +#define  SDIO_DTSx_SET_TYPE_D	(3 << SDIO_DRIVE_DTSx_SHIFT)  /*   * Function Basic Registers (FBR)   */  |