card.h 3.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/*
 *  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

#include <linux/mmc/mmc.h>

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 {
	unsigned char		mmca_vsn;
	unsigned short		cmdclass;
	unsigned short		tacc_clks;
	unsigned int		tacc_ns;
31
	unsigned int		r2w_factor;
L
Linus Torvalds 已提交
32 33
	unsigned int		max_dtr;
	unsigned int		read_blkbits;
34
	unsigned int		write_blkbits;
L
Linus Torvalds 已提交
35
	unsigned int		capacity;
36 37
	unsigned int		read_partial:1,
				read_misalign:1,
R
Russell King 已提交
38
				write_partial:1,
39
				write_misalign:1;
L
Linus Torvalds 已提交
40 41
};

42 43 44 45
struct mmc_ext_csd {
	unsigned int		hs_max_dtr;
};

P
Pierre Ossman 已提交
46 47 48 49 50 51 52
struct sd_scr {
	unsigned char		sda_vsn;
	unsigned char		bus_widths;
#define SD_SCR_BUS_WIDTH_1	(1<<0)
#define SD_SCR_BUS_WIDTH_4	(1<<2)
};

53 54 55 56
struct sd_switch_caps {
	unsigned int		hs_max_dtr;
};

L
Linus Torvalds 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70
struct mmc_host;

/*
 * MMC device
 */
struct mmc_card {
	struct list_head	node;		/* node in hosts devices list */
	struct mmc_host		*host;		/* the host this device belongs to */
	struct device		dev;		/* the device */
	unsigned int		rca;		/* relative card address of device */
	unsigned int		state;		/* (our) card state */
#define MMC_STATE_PRESENT	(1<<0)		/* present in sysfs */
#define MMC_STATE_DEAD		(1<<1)		/* device no longer in stack */
#define MMC_STATE_BAD		(1<<2)		/* unrecognised device */
P
Pierre Ossman 已提交
71
#define MMC_STATE_SDCARD	(1<<3)		/* is an SD card */
P
Pierre Ossman 已提交
72
#define MMC_STATE_READONLY	(1<<4)		/* card is read-only */
73
#define MMC_STATE_HIGHSPEED	(1<<5)		/* card is in high speed mode */
74
#define MMC_STATE_BLOCKADDR	(1<<6)		/* card uses block-addressing */
L
Linus Torvalds 已提交
75 76
	u32			raw_cid[4];	/* raw card CID */
	u32			raw_csd[4];	/* raw card CSD */
P
Pierre Ossman 已提交
77
	u32			raw_scr[2];	/* raw card SCR */
L
Linus Torvalds 已提交
78 79
	struct mmc_cid		cid;		/* card identification */
	struct mmc_csd		csd;		/* card specific */
80
	struct mmc_ext_csd	ext_csd;	/* mmc v4 extended card specific */
P
Pierre Ossman 已提交
81
	struct sd_scr		scr;		/* extra SD information */
82
	struct sd_switch_caps	sw_caps;	/* switch (CMD6) caps */
L
Linus Torvalds 已提交
83 84 85 86 87
};

#define mmc_card_present(c)	((c)->state & MMC_STATE_PRESENT)
#define mmc_card_dead(c)	((c)->state & MMC_STATE_DEAD)
#define mmc_card_bad(c)		((c)->state & MMC_STATE_BAD)
P
Pierre Ossman 已提交
88
#define mmc_card_sd(c)		((c)->state & MMC_STATE_SDCARD)
P
Pierre Ossman 已提交
89
#define mmc_card_readonly(c)	((c)->state & MMC_STATE_READONLY)
90
#define mmc_card_highspeed(c)	((c)->state & MMC_STATE_HIGHSPEED)
91
#define mmc_card_blockaddr(c)	((c)->state & MMC_STATE_BLOCKADDR)
L
Linus Torvalds 已提交
92 93 94 95

#define mmc_card_set_present(c)	((c)->state |= MMC_STATE_PRESENT)
#define mmc_card_set_dead(c)	((c)->state |= MMC_STATE_DEAD)
#define mmc_card_set_bad(c)	((c)->state |= MMC_STATE_BAD)
P
Pierre Ossman 已提交
96
#define mmc_card_set_sd(c)	((c)->state |= MMC_STATE_SDCARD)
P
Pierre Ossman 已提交
97
#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
98
#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
99
#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
L
Linus Torvalds 已提交
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129

#define mmc_card_name(c)	((c)->cid.prod_name)
#define mmc_card_id(c)		((c)->dev.bus_id)

#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 *);

static inline int mmc_card_claim_host(struct mmc_card *card)
{
	return __mmc_claim_host(card->host, card);
}

#define mmc_card_release_host(c)	mmc_release_host((c)->host)

#endif