2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* linux/include/linux/mmc/card.h
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* Card driver specific definitions.
|
|
|
|
*/
|
|
|
|
#ifndef LINUX_MMC_CARD_H
|
|
|
|
#define LINUX_MMC_CARD_H
|
|
|
|
|
2007-02-28 22:33:10 +08:00
|
|
|
#include <linux/mmc/core.h>
|
2011-04-12 06:02:15 +08:00
|
|
|
#include <linux/mod_devicetable.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
struct mmc_cid {
|
|
|
|
unsigned int manfid;
|
|
|
|
char prod_name[8];
|
|
|
|
unsigned int serial;
|
|
|
|
unsigned short oemid;
|
|
|
|
unsigned short year;
|
|
|
|
unsigned char hwrev;
|
|
|
|
unsigned char fwrev;
|
|
|
|
unsigned char month;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mmc_csd {
|
2010-08-11 09:01:36 +08:00
|
|
|
unsigned char structure;
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned char mmca_vsn;
|
|
|
|
unsigned short cmdclass;
|
|
|
|
unsigned short tacc_clks;
|
|
|
|
unsigned int tacc_ns;
|
2006-05-03 00:24:59 +08:00
|
|
|
unsigned int r2w_factor;
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned int max_dtr;
|
mmc: add erase, secure erase, trim and secure trim operations
SD/MMC cards tend to support an erase operation. In addition, eMMC v4.4
cards can support secure erase, trim and secure trim operations that are
all variants of the basic erase command.
SD/MMC device attributes "erase_size" and "preferred_erase_size" have been
added.
"erase_size" is the minimum size, in bytes, of an erase operation. For
MMC, "erase_size" is the erase group size reported by the card. Note that
"erase_size" does not apply to trim or secure trim operations where the
minimum size is always one 512 byte sector. For SD, "erase_size" is 512
if the card is block-addressed, 0 otherwise.
SD/MMC cards can erase an arbitrarily large area up to and
including the whole card. When erasing a large area it may
be desirable to do it in smaller chunks for three reasons:
1. A single erase command will make all other I/O on the card
wait. This is not a problem if the whole card is being erased, but
erasing one partition will make I/O for another partition on the
same card wait for the duration of the erase - which could be a
several minutes.
2. To be able to inform the user of erase progress.
3. The erase timeout becomes too large to be very useful.
Because the erase timeout contains a margin which is multiplied by
the size of the erase area, the value can end up being several
minutes for large areas.
"erase_size" is not the most efficient unit to erase (especially for SD
where it is just one sector), hence "preferred_erase_size" provides a good
chunk size for erasing large areas.
For MMC, "preferred_erase_size" is the high-capacity erase size if a card
specifies one, otherwise it is based on the capacity of the card.
For SD, "preferred_erase_size" is the allocation unit size specified by
the card.
"preferred_erase_size" is in bytes.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Jens Axboe <axboe@kernel.dk>
Cc: Kyungmin Park <kmpark@infradead.org>
Cc: Madhusudhan Chikkature <madhu.cr@ti.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ben Gardiner <bengardiner@nanometrics.ca>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-12 05:17:46 +08:00
|
|
|
unsigned int erase_size; /* In sectors */
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned int read_blkbits;
|
2006-01-04 06:38:44 +08:00
|
|
|
unsigned int write_blkbits;
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned int capacity;
|
2006-01-04 06:38:44 +08:00
|
|
|
unsigned int read_partial:1,
|
|
|
|
read_misalign:1,
|
2006-01-04 20:40:39 +08:00
|
|
|
write_partial:1,
|
2006-01-04 06:38:44 +08:00
|
|
|
write_misalign:1;
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2006-10-21 18:35:02 +08:00
|
|
|
struct mmc_ext_csd {
|
2009-09-23 07:44:34 +08:00
|
|
|
u8 rev;
|
mmc: add erase, secure erase, trim and secure trim operations
SD/MMC cards tend to support an erase operation. In addition, eMMC v4.4
cards can support secure erase, trim and secure trim operations that are
all variants of the basic erase command.
SD/MMC device attributes "erase_size" and "preferred_erase_size" have been
added.
"erase_size" is the minimum size, in bytes, of an erase operation. For
MMC, "erase_size" is the erase group size reported by the card. Note that
"erase_size" does not apply to trim or secure trim operations where the
minimum size is always one 512 byte sector. For SD, "erase_size" is 512
if the card is block-addressed, 0 otherwise.
SD/MMC cards can erase an arbitrarily large area up to and
including the whole card. When erasing a large area it may
be desirable to do it in smaller chunks for three reasons:
1. A single erase command will make all other I/O on the card
wait. This is not a problem if the whole card is being erased, but
erasing one partition will make I/O for another partition on the
same card wait for the duration of the erase - which could be a
several minutes.
2. To be able to inform the user of erase progress.
3. The erase timeout becomes too large to be very useful.
Because the erase timeout contains a margin which is multiplied by
the size of the erase area, the value can end up being several
minutes for large areas.
"erase_size" is not the most efficient unit to erase (especially for SD
where it is just one sector), hence "preferred_erase_size" provides a good
chunk size for erasing large areas.
For MMC, "preferred_erase_size" is the high-capacity erase size if a card
specifies one, otherwise it is based on the capacity of the card.
For SD, "preferred_erase_size" is the allocation unit size specified by
the card.
"preferred_erase_size" is in bytes.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Jens Axboe <axboe@kernel.dk>
Cc: Kyungmin Park <kmpark@infradead.org>
Cc: Madhusudhan Chikkature <madhu.cr@ti.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ben Gardiner <bengardiner@nanometrics.ca>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-12 05:17:46 +08:00
|
|
|
u8 erase_group_def;
|
|
|
|
u8 sec_feature_support;
|
2011-04-01 07:40:00 +08:00
|
|
|
u8 rel_sectors;
|
|
|
|
u8 rel_param;
|
2011-04-12 07:10:25 +08:00
|
|
|
u8 part_config;
|
|
|
|
unsigned int part_time; /* Units: ms */
|
2009-09-23 07:44:34 +08:00
|
|
|
unsigned int sa_timeout; /* Units: 100ns */
|
2006-10-21 18:35:02 +08:00
|
|
|
unsigned int hs_max_dtr;
|
2007-02-18 05:15:27 +08:00
|
|
|
unsigned int sectors;
|
2010-10-01 05:37:23 +08:00
|
|
|
unsigned int card_type;
|
mmc: add erase, secure erase, trim and secure trim operations
SD/MMC cards tend to support an erase operation. In addition, eMMC v4.4
cards can support secure erase, trim and secure trim operations that are
all variants of the basic erase command.
SD/MMC device attributes "erase_size" and "preferred_erase_size" have been
added.
"erase_size" is the minimum size, in bytes, of an erase operation. For
MMC, "erase_size" is the erase group size reported by the card. Note that
"erase_size" does not apply to trim or secure trim operations where the
minimum size is always one 512 byte sector. For SD, "erase_size" is 512
if the card is block-addressed, 0 otherwise.
SD/MMC cards can erase an arbitrarily large area up to and
including the whole card. When erasing a large area it may
be desirable to do it in smaller chunks for three reasons:
1. A single erase command will make all other I/O on the card
wait. This is not a problem if the whole card is being erased, but
erasing one partition will make I/O for another partition on the
same card wait for the duration of the erase - which could be a
several minutes.
2. To be able to inform the user of erase progress.
3. The erase timeout becomes too large to be very useful.
Because the erase timeout contains a margin which is multiplied by
the size of the erase area, the value can end up being several
minutes for large areas.
"erase_size" is not the most efficient unit to erase (especially for SD
where it is just one sector), hence "preferred_erase_size" provides a good
chunk size for erasing large areas.
For MMC, "preferred_erase_size" is the high-capacity erase size if a card
specifies one, otherwise it is based on the capacity of the card.
For SD, "preferred_erase_size" is the allocation unit size specified by
the card.
"preferred_erase_size" is in bytes.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Jens Axboe <axboe@kernel.dk>
Cc: Kyungmin Park <kmpark@infradead.org>
Cc: Madhusudhan Chikkature <madhu.cr@ti.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ben Gardiner <bengardiner@nanometrics.ca>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-12 05:17:46 +08:00
|
|
|
unsigned int hc_erase_size; /* In sectors */
|
|
|
|
unsigned int hc_erase_timeout; /* In milliseconds */
|
|
|
|
unsigned int sec_trim_mult; /* Secure trim multiplier */
|
|
|
|
unsigned int sec_erase_mult; /* Secure erase multiplier */
|
|
|
|
unsigned int trim_timeout; /* In milliseconds */
|
2011-01-22 04:09:41 +08:00
|
|
|
bool enhanced_area_en; /* enable bit */
|
|
|
|
unsigned long long enhanced_area_offset; /* Units: Byte */
|
|
|
|
unsigned int enhanced_area_size; /* Units: KB */
|
2011-04-12 07:10:25 +08:00
|
|
|
unsigned int boot_size; /* in bytes */
|
2006-10-21 18:35:02 +08:00
|
|
|
};
|
|
|
|
|
2005-09-07 06:18:53 +08:00
|
|
|
struct sd_scr {
|
|
|
|
unsigned char sda_vsn;
|
2011-05-05 14:48:58 +08:00
|
|
|
unsigned char sda_spec3;
|
2005-09-07 06:18:53 +08:00
|
|
|
unsigned char bus_widths;
|
|
|
|
#define SD_SCR_BUS_WIDTH_1 (1<<0)
|
|
|
|
#define SD_SCR_BUS_WIDTH_4 (1<<2)
|
|
|
|
};
|
|
|
|
|
mmc: add erase, secure erase, trim and secure trim operations
SD/MMC cards tend to support an erase operation. In addition, eMMC v4.4
cards can support secure erase, trim and secure trim operations that are
all variants of the basic erase command.
SD/MMC device attributes "erase_size" and "preferred_erase_size" have been
added.
"erase_size" is the minimum size, in bytes, of an erase operation. For
MMC, "erase_size" is the erase group size reported by the card. Note that
"erase_size" does not apply to trim or secure trim operations where the
minimum size is always one 512 byte sector. For SD, "erase_size" is 512
if the card is block-addressed, 0 otherwise.
SD/MMC cards can erase an arbitrarily large area up to and
including the whole card. When erasing a large area it may
be desirable to do it in smaller chunks for three reasons:
1. A single erase command will make all other I/O on the card
wait. This is not a problem if the whole card is being erased, but
erasing one partition will make I/O for another partition on the
same card wait for the duration of the erase - which could be a
several minutes.
2. To be able to inform the user of erase progress.
3. The erase timeout becomes too large to be very useful.
Because the erase timeout contains a margin which is multiplied by
the size of the erase area, the value can end up being several
minutes for large areas.
"erase_size" is not the most efficient unit to erase (especially for SD
where it is just one sector), hence "preferred_erase_size" provides a good
chunk size for erasing large areas.
For MMC, "preferred_erase_size" is the high-capacity erase size if a card
specifies one, otherwise it is based on the capacity of the card.
For SD, "preferred_erase_size" is the allocation unit size specified by
the card.
"preferred_erase_size" is in bytes.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Jens Axboe <axboe@kernel.dk>
Cc: Kyungmin Park <kmpark@infradead.org>
Cc: Madhusudhan Chikkature <madhu.cr@ti.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ben Gardiner <bengardiner@nanometrics.ca>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-12 05:17:46 +08:00
|
|
|
struct sd_ssr {
|
|
|
|
unsigned int au; /* In sectors */
|
|
|
|
unsigned int erase_timeout; /* In milliseconds */
|
|
|
|
unsigned int erase_offset; /* In milliseconds */
|
|
|
|
};
|
|
|
|
|
2006-11-09 06:03:10 +08:00
|
|
|
struct sd_switch_caps {
|
|
|
|
unsigned int hs_max_dtr;
|
2011-05-05 14:49:01 +08:00
|
|
|
unsigned int uhs_max_dtr;
|
|
|
|
#define UHS_SDR104_MAX_DTR 208000000
|
|
|
|
#define UHS_SDR50_MAX_DTR 100000000
|
|
|
|
#define UHS_DDR50_MAX_DTR 50000000
|
|
|
|
#define UHS_SDR25_MAX_DTR UHS_DDR50_MAX_DTR
|
|
|
|
#define UHS_SDR12_MAX_DTR 25000000
|
2011-05-05 14:48:58 +08:00
|
|
|
unsigned int sd3_bus_mode;
|
2011-05-05 14:49:01 +08:00
|
|
|
#define UHS_SDR12_BUS_SPEED 0
|
|
|
|
#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_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)
|
|
|
|
#define SD_MODE_UHS_SDR104 (1 << UHS_SDR104_BUS_SPEED)
|
|
|
|
#define SD_MODE_UHS_DDR50 (1 << UHS_DDR50_BUS_SPEED)
|
2011-05-05 14:48:58 +08:00
|
|
|
unsigned int sd3_drv_type;
|
2011-05-05 14:48:59 +08:00
|
|
|
#define SD_DRIVER_TYPE_B 0x01
|
|
|
|
#define SD_DRIVER_TYPE_A 0x02
|
|
|
|
#define SD_DRIVER_TYPE_C 0x04
|
|
|
|
#define SD_DRIVER_TYPE_D 0x08
|
2011-05-05 14:48:58 +08:00
|
|
|
unsigned int sd3_curr_limit;
|
2006-11-09 06:03:10 +08:00
|
|
|
};
|
|
|
|
|
2007-06-12 02:25:43 +08:00
|
|
|
struct sdio_cccr {
|
|
|
|
unsigned int sdio_vsn;
|
|
|
|
unsigned int sd_vsn;
|
|
|
|
unsigned int multi_block:1,
|
|
|
|
low_speed:1,
|
|
|
|
wide_bus:1,
|
|
|
|
high_power:1,
|
2009-09-23 07:45:07 +08:00
|
|
|
high_speed:1,
|
|
|
|
disable_cd:1;
|
2007-06-12 02:25:43 +08:00
|
|
|
};
|
|
|
|
|
2007-07-30 21:15:30 +08:00
|
|
|
struct sdio_cis {
|
|
|
|
unsigned short vendor;
|
|
|
|
unsigned short device;
|
|
|
|
unsigned short blksize;
|
|
|
|
unsigned int max_dtr;
|
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct mmc_host;
|
2007-05-26 19:48:18 +08:00
|
|
|
struct sdio_func;
|
2007-07-30 21:15:30 +08:00
|
|
|
struct sdio_func_tuple;
|
2007-05-26 19:48:18 +08:00
|
|
|
|
|
|
|
#define SDIO_MAX_FUNCS 7
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* MMC device
|
|
|
|
*/
|
|
|
|
struct mmc_card {
|
|
|
|
struct mmc_host *host; /* the host this device belongs to */
|
|
|
|
struct device dev; /* the device */
|
|
|
|
unsigned int rca; /* relative card address of device */
|
2006-12-26 22:25:58 +08:00
|
|
|
unsigned int type; /* card type */
|
|
|
|
#define MMC_TYPE_MMC 0 /* MMC card */
|
|
|
|
#define MMC_TYPE_SD 1 /* SD card */
|
2007-05-22 02:23:20 +08:00
|
|
|
#define MMC_TYPE_SDIO 2 /* SDIO card */
|
2010-08-11 09:01:40 +08:00
|
|
|
#define MMC_TYPE_SD_COMBO 3 /* SD combo (IO+mem) card */
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned int state; /* (our) card state */
|
|
|
|
#define MMC_STATE_PRESENT (1<<0) /* present in sysfs */
|
2007-05-01 22:11:57 +08:00
|
|
|
#define MMC_STATE_READONLY (1<<1) /* card is read-only */
|
|
|
|
#define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */
|
|
|
|
#define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */
|
2010-10-01 05:37:23 +08:00
|
|
|
#define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */
|
2009-09-23 07:45:18 +08:00
|
|
|
unsigned int quirks; /* card quirks */
|
|
|
|
#define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */
|
2010-03-06 05:43:25 +08:00
|
|
|
#define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */
|
|
|
|
/* for byte mode */
|
2010-08-11 09:01:50 +08:00
|
|
|
#define MMC_QUIRK_NONSTD_SDIO (1<<2) /* non-standard SDIO card attached */
|
|
|
|
/* (missing CIA registers) */
|
2011-02-07 02:03:47 +08:00
|
|
|
#define MMC_QUIRK_BROKEN_CLK_GATING (1<<3) /* clock gating the sdio bus will make card fail */
|
2011-04-05 22:50:14 +08:00
|
|
|
#define MMC_QUIRK_NONSTD_FUNC_IF (1<<4) /* SDIO card has nonstd function interfaces */
|
2011-04-05 23:02:25 +08:00
|
|
|
#define MMC_QUIRK_DISABLE_CD (1<<5) /* disconnect CD/DAT[3] resistor */
|
2011-04-13 04:06:53 +08:00
|
|
|
#define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */
|
2007-05-26 19:48:18 +08:00
|
|
|
|
mmc: add erase, secure erase, trim and secure trim operations
SD/MMC cards tend to support an erase operation. In addition, eMMC v4.4
cards can support secure erase, trim and secure trim operations that are
all variants of the basic erase command.
SD/MMC device attributes "erase_size" and "preferred_erase_size" have been
added.
"erase_size" is the minimum size, in bytes, of an erase operation. For
MMC, "erase_size" is the erase group size reported by the card. Note that
"erase_size" does not apply to trim or secure trim operations where the
minimum size is always one 512 byte sector. For SD, "erase_size" is 512
if the card is block-addressed, 0 otherwise.
SD/MMC cards can erase an arbitrarily large area up to and
including the whole card. When erasing a large area it may
be desirable to do it in smaller chunks for three reasons:
1. A single erase command will make all other I/O on the card
wait. This is not a problem if the whole card is being erased, but
erasing one partition will make I/O for another partition on the
same card wait for the duration of the erase - which could be a
several minutes.
2. To be able to inform the user of erase progress.
3. The erase timeout becomes too large to be very useful.
Because the erase timeout contains a margin which is multiplied by
the size of the erase area, the value can end up being several
minutes for large areas.
"erase_size" is not the most efficient unit to erase (especially for SD
where it is just one sector), hence "preferred_erase_size" provides a good
chunk size for erasing large areas.
For MMC, "preferred_erase_size" is the high-capacity erase size if a card
specifies one, otherwise it is based on the capacity of the card.
For SD, "preferred_erase_size" is the allocation unit size specified by
the card.
"preferred_erase_size" is in bytes.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Jens Axboe <axboe@kernel.dk>
Cc: Kyungmin Park <kmpark@infradead.org>
Cc: Madhusudhan Chikkature <madhu.cr@ti.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ben Gardiner <bengardiner@nanometrics.ca>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-12 05:17:46 +08:00
|
|
|
unsigned int erase_size; /* erase size in sectors */
|
|
|
|
unsigned int erase_shift; /* if erase unit is power 2 */
|
|
|
|
unsigned int pref_erase; /* in sectors */
|
|
|
|
u8 erased_byte; /* value of erased bytes */
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
u32 raw_cid[4]; /* raw card CID */
|
|
|
|
u32 raw_csd[4]; /* raw card CSD */
|
2005-09-07 06:18:53 +08:00
|
|
|
u32 raw_scr[2]; /* raw card SCR */
|
2005-04-17 06:20:36 +08:00
|
|
|
struct mmc_cid cid; /* card identification */
|
|
|
|
struct mmc_csd csd; /* card specific */
|
2006-10-21 18:35:02 +08:00
|
|
|
struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */
|
2005-09-07 06:18:53 +08:00
|
|
|
struct sd_scr scr; /* extra SD information */
|
mmc: add erase, secure erase, trim and secure trim operations
SD/MMC cards tend to support an erase operation. In addition, eMMC v4.4
cards can support secure erase, trim and secure trim operations that are
all variants of the basic erase command.
SD/MMC device attributes "erase_size" and "preferred_erase_size" have been
added.
"erase_size" is the minimum size, in bytes, of an erase operation. For
MMC, "erase_size" is the erase group size reported by the card. Note that
"erase_size" does not apply to trim or secure trim operations where the
minimum size is always one 512 byte sector. For SD, "erase_size" is 512
if the card is block-addressed, 0 otherwise.
SD/MMC cards can erase an arbitrarily large area up to and
including the whole card. When erasing a large area it may
be desirable to do it in smaller chunks for three reasons:
1. A single erase command will make all other I/O on the card
wait. This is not a problem if the whole card is being erased, but
erasing one partition will make I/O for another partition on the
same card wait for the duration of the erase - which could be a
several minutes.
2. To be able to inform the user of erase progress.
3. The erase timeout becomes too large to be very useful.
Because the erase timeout contains a margin which is multiplied by
the size of the erase area, the value can end up being several
minutes for large areas.
"erase_size" is not the most efficient unit to erase (especially for SD
where it is just one sector), hence "preferred_erase_size" provides a good
chunk size for erasing large areas.
For MMC, "preferred_erase_size" is the high-capacity erase size if a card
specifies one, otherwise it is based on the capacity of the card.
For SD, "preferred_erase_size" is the allocation unit size specified by
the card.
"preferred_erase_size" is in bytes.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Acked-by: Jens Axboe <axboe@kernel.dk>
Cc: Kyungmin Park <kmpark@infradead.org>
Cc: Madhusudhan Chikkature <madhu.cr@ti.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ben Gardiner <bengardiner@nanometrics.ca>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-12 05:17:46 +08:00
|
|
|
struct sd_ssr ssr; /* yet more SD information */
|
2006-11-09 06:03:10 +08:00
|
|
|
struct sd_switch_caps sw_caps; /* switch (CMD6) caps */
|
2007-05-26 19:48:18 +08:00
|
|
|
|
|
|
|
unsigned int sdio_funcs; /* number of SDIO functions */
|
2007-06-12 02:25:43 +08:00
|
|
|
struct sdio_cccr cccr; /* common card info */
|
2007-07-30 21:15:30 +08:00
|
|
|
struct sdio_cis cis; /* common tuple info */
|
2007-05-26 19:48:18 +08:00
|
|
|
struct sdio_func *sdio_func[SDIO_MAX_FUNCS]; /* SDIO functions (devices) */
|
2007-09-20 00:42:16 +08:00
|
|
|
unsigned num_info; /* number of info strings */
|
|
|
|
const char **info; /* info strings */
|
2007-07-30 21:15:30 +08:00
|
|
|
struct sdio_func_tuple *tuples; /* unknown common tuples */
|
2008-07-24 20:18:58 +08:00
|
|
|
|
2011-05-05 14:49:01 +08:00
|
|
|
unsigned int sd_bus_speed; /* Bus Speed Mode set for the card */
|
|
|
|
|
2008-07-24 20:18:58 +08:00
|
|
|
struct dentry *debugfs_root;
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2011-04-12 06:02:15 +08:00
|
|
|
/*
|
|
|
|
* The world is not perfect and supplies us with broken mmc/sdio devices.
|
|
|
|
* For at least some of these bugs we need a work-around.
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct mmc_fixup {
|
|
|
|
/* CID-specific fields. */
|
|
|
|
const char *name;
|
|
|
|
|
|
|
|
/* Valid revision range */
|
|
|
|
u64 rev_start, rev_end;
|
|
|
|
|
|
|
|
unsigned int manfid;
|
|
|
|
unsigned short oemid;
|
|
|
|
|
|
|
|
/* SDIO-specfic fields. You can use SDIO_ANY_ID here of course */
|
|
|
|
u16 cis_vendor, cis_device;
|
|
|
|
|
|
|
|
void (*vendor_fixup)(struct mmc_card *card, int data);
|
|
|
|
int data;
|
|
|
|
};
|
|
|
|
|
2011-04-13 00:59:09 +08:00
|
|
|
#define CID_MANFID_ANY (-1u)
|
2011-04-12 06:02:15 +08:00
|
|
|
#define CID_OEMID_ANY ((unsigned short) -1)
|
|
|
|
#define CID_NAME_ANY (NULL)
|
|
|
|
|
|
|
|
#define END_FIXUP { 0 }
|
|
|
|
|
|
|
|
#define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end, \
|
|
|
|
_cis_vendor, _cis_device, \
|
|
|
|
_fixup, _data) \
|
|
|
|
{ \
|
|
|
|
.name = (_name), \
|
|
|
|
.manfid = (_manfid), \
|
|
|
|
.oemid = (_oemid), \
|
|
|
|
.rev_start = (_rev_start), \
|
|
|
|
.rev_end = (_rev_end), \
|
|
|
|
.cis_vendor = (_cis_vendor), \
|
|
|
|
.cis_device = (_cis_device), \
|
|
|
|
.vendor_fixup = (_fixup), \
|
|
|
|
.data = (_data), \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end, \
|
|
|
|
_fixup, _data) \
|
|
|
|
_FIXUP_EXT(_name, _manfid, \
|
|
|
|
_oemid, _rev_start, _rev_end, \
|
|
|
|
SDIO_ANY_ID, SDIO_ANY_ID, \
|
|
|
|
_fixup, _data) \
|
|
|
|
|
|
|
|
#define MMC_FIXUP(_name, _manfid, _oemid, _fixup, _data) \
|
|
|
|
MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data)
|
|
|
|
|
|
|
|
#define SDIO_FIXUP(_vendor, _device, _fixup, _data) \
|
|
|
|
_FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, \
|
|
|
|
CID_OEMID_ANY, 0, -1ull, \
|
|
|
|
_vendor, _device, \
|
|
|
|
_fixup, _data) \
|
|
|
|
|
|
|
|
#define cid_rev(hwrev, fwrev, year, month) \
|
|
|
|
(((u64) hwrev) << 40 | \
|
|
|
|
((u64) fwrev) << 32 | \
|
|
|
|
((u64) year) << 16 | \
|
|
|
|
((u64) month))
|
|
|
|
|
|
|
|
#define cid_rev_card(card) \
|
|
|
|
cid_rev(card->cid.hwrev, \
|
|
|
|
card->cid.fwrev, \
|
|
|
|
card->cid.year, \
|
|
|
|
card->cid.month)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This hook just adds a quirk unconditionally.
|
|
|
|
*/
|
|
|
|
static inline void __maybe_unused add_quirk(struct mmc_card *card, int data)
|
|
|
|
{
|
|
|
|
card->quirks |= data;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This hook just removes a quirk unconditionally.
|
|
|
|
*/
|
|
|
|
static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)
|
|
|
|
{
|
|
|
|
card->quirks &= ~data;
|
|
|
|
}
|
2011-02-07 02:03:46 +08:00
|
|
|
|
2006-12-26 22:25:58 +08:00
|
|
|
#define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC)
|
|
|
|
#define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD)
|
2007-05-22 02:23:20 +08:00
|
|
|
#define mmc_card_sdio(c) ((c)->type == MMC_TYPE_SDIO)
|
2006-12-26 22:25:58 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT)
|
2005-09-07 06:18:52 +08:00
|
|
|
#define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY)
|
2006-10-21 18:35:02 +08:00
|
|
|
#define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED)
|
2007-01-04 22:57:32 +08:00
|
|
|
#define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR)
|
2010-10-01 05:37:23 +08:00
|
|
|
#define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
|
2005-09-07 06:18:52 +08:00
|
|
|
#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
|
2006-10-21 18:35:02 +08:00
|
|
|
#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
|
2007-01-04 22:57:32 +08:00
|
|
|
#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
|
2010-10-01 05:37:23 +08:00
|
|
|
#define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-09-23 07:45:18 +08:00
|
|
|
static inline int mmc_card_lenient_fn0(const struct mmc_card *c)
|
|
|
|
{
|
|
|
|
return c->quirks & MMC_QUIRK_LENIENT_FN0;
|
|
|
|
}
|
|
|
|
|
2010-03-06 05:43:25 +08:00
|
|
|
static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c)
|
|
|
|
{
|
|
|
|
return c->quirks & MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
|
|
|
|
}
|
|
|
|
|
2011-04-05 23:02:25 +08:00
|
|
|
static inline int mmc_card_disable_cd(const struct mmc_card *c)
|
|
|
|
{
|
|
|
|
return c->quirks & MMC_QUIRK_DISABLE_CD;
|
|
|
|
}
|
|
|
|
|
2011-04-05 22:50:14 +08:00
|
|
|
static inline int mmc_card_nonstd_func_interface(const struct mmc_card *c)
|
|
|
|
{
|
|
|
|
return c->quirks & MMC_QUIRK_NONSTD_FUNC_IF;
|
|
|
|
}
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#define mmc_card_name(c) ((c)->cid.prod_name)
|
2008-11-09 04:37:46 +08:00
|
|
|
#define mmc_card_id(c) (dev_name(&(c)->dev))
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2010-09-18 08:32:25 +08:00
|
|
|
#define mmc_dev_to_card(d) container_of(d, struct mmc_card, dev)
|
2010-08-20 15:46:46 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#define mmc_list_to_card(l) container_of(l, struct mmc_card, node)
|
|
|
|
#define mmc_get_drvdata(c) dev_get_drvdata(&(c)->dev)
|
|
|
|
#define mmc_set_drvdata(c,d) dev_set_drvdata(&(c)->dev, d)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* MMC device driver (e.g., Flash card, I/O card...)
|
|
|
|
*/
|
|
|
|
struct mmc_driver {
|
|
|
|
struct device_driver drv;
|
|
|
|
int (*probe)(struct mmc_card *);
|
|
|
|
void (*remove)(struct mmc_card *);
|
|
|
|
int (*suspend)(struct mmc_card *, pm_message_t);
|
|
|
|
int (*resume)(struct mmc_card *);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern int mmc_register_driver(struct mmc_driver *);
|
|
|
|
extern void mmc_unregister_driver(struct mmc_driver *);
|
|
|
|
|
2011-04-12 06:02:15 +08:00
|
|
|
extern void mmc_fixup_device(struct mmc_card *card,
|
|
|
|
const struct mmc_fixup *table);
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif
|