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