1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *  linux/include/linux/mmc/card.h
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or modify
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it under the terms of the GNU General Public License version 2 as
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * published by the Free Software Foundation.
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *  Card driver specific definitions.
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef LINUX_MMC_CARD_H
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LINUX_MMC_CARD_H
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/mmc/mmc.h>
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mmc_cid {
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		manfid;
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char			prod_name[8];
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		serial;
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short		oemid;
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short		year;
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		hwrev;
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		fwrev;
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		month;
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mmc_csd {
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		mmca_vsn;
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short		cmdclass;
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short		tacc_clks;
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		tacc_ns;
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		r2w_factor;
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		max_dtr;
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		read_blkbits;
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		write_blkbits;
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		capacity;
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		read_partial:1,
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				read_misalign:1,
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				write_partial:1,
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				write_misalign:1;
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct sd_scr {
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		sda_vsn;
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		bus_widths;
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SD_SCR_BUS_WIDTH_1	(1<<0)
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SD_SCR_BUS_WIDTH_4	(1<<2)
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mmc_host;
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MMC device
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mmc_card {
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head	node;		/* node in hosts devices list */
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct mmc_host		*host;		/* the host this device belongs to */
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct device		dev;		/* the device */
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		rca;		/* relative card address of device */
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		state;		/* (our) card state */
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MMC_STATE_PRESENT	(1<<0)		/* present in sysfs */
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MMC_STATE_DEAD		(1<<1)		/* device no longer in stack */
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MMC_STATE_BAD		(1<<2)		/* unrecognised device */
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MMC_STATE_SDCARD	(1<<3)		/* is an SD card */
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MMC_STATE_READONLY	(1<<4)		/* card is read-only */
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32			raw_cid[4];	/* raw card CID */
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32			raw_csd[4];	/* raw card CSD */
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32			raw_scr[2];	/* raw card SCR */
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct mmc_cid		cid;		/* card identification */
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct mmc_csd		csd;		/* card specific */
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct sd_scr		scr;		/* extra SD information */
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_present(c)	((c)->state & MMC_STATE_PRESENT)
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_dead(c)	((c)->state & MMC_STATE_DEAD)
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_bad(c)		((c)->state & MMC_STATE_BAD)
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_sd(c)		((c)->state & MMC_STATE_SDCARD)
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_readonly(c)	((c)->state & MMC_STATE_READONLY)
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_set_present(c)	((c)->state |= MMC_STATE_PRESENT)
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_set_dead(c)	((c)->state |= MMC_STATE_DEAD)
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_set_bad(c)	((c)->state |= MMC_STATE_BAD)
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_set_sd(c)	((c)->state |= MMC_STATE_SDCARD)
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_name(c)	((c)->cid.prod_name)
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_id(c)		((c)->dev.bus_id)
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_list_to_card(l)	container_of(l, struct mmc_card, node)
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_get_drvdata(c)	dev_get_drvdata(&(c)->dev)
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_set_drvdata(c,d)	dev_set_drvdata(&(c)->dev, d)
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MMC device driver (e.g., Flash card, I/O card...)
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mmc_driver {
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct device_driver drv;
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*probe)(struct mmc_card *);
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*remove)(struct mmc_card *);
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*suspend)(struct mmc_card *, pm_message_t);
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*resume)(struct mmc_card *);
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int mmc_register_driver(struct mmc_driver *);
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void mmc_unregister_driver(struct mmc_driver *);
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int mmc_card_claim_host(struct mmc_card *card)
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return __mmc_claim_host(card->host, card);
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define mmc_card_release_host(c)	mmc_release_host((c)->host)
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
114