2005-04-16 15:20:36 -07:00
/*
2007-02-28 15:33:10 +01:00
* linux / drivers / mmc / core / core . h
2005-04-16 15:20:36 -07:00
*
* Copyright ( C ) 2003 Russell King , All Rights Reserved .
2006-12-24 22:46:55 +01:00
* Copyright 2007 Pierre Ossman
2005-04-16 15:20:36 -07:00
*
* 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 .
*/
2006-12-24 22:46:55 +01:00
# ifndef _MMC_CORE_CORE_H
# define _MMC_CORE_CORE_H
2005-08-19 09:41:24 +01:00
2006-12-24 22:46:55 +01:00
# include <linux/delay.h>
# define MMC_CMD_RETRIES 3
2006-12-31 00:11:32 +01:00
struct mmc_bus_ops {
2009-09-22 16:44:34 -07:00
int ( * awake ) ( struct mmc_host * ) ;
int ( * sleep ) ( struct mmc_host * ) ;
2006-12-31 00:11:32 +01:00
void ( * remove ) ( struct mmc_host * ) ;
void ( * detect ) ( struct mmc_host * ) ;
2007-05-01 16:00:02 +02:00
void ( * suspend ) ( struct mmc_host * ) ;
void ( * resume ) ( struct mmc_host * ) ;
2009-09-22 16:44:33 -07:00
void ( * power_save ) ( struct mmc_host * ) ;
void ( * power_restore ) ( struct mmc_host * ) ;
2006-12-31 00:11:32 +01:00
} ;
void mmc_attach_bus ( struct mmc_host * host , const struct mmc_bus_ops * ops ) ;
void mmc_detach_bus ( struct mmc_host * host ) ;
2006-12-24 22:46:55 +01:00
void mmc_set_chip_select ( struct mmc_host * host , int mode ) ;
2006-12-31 00:11:32 +01:00
void mmc_set_clock ( struct mmc_host * host , unsigned int hz ) ;
void mmc_set_bus_mode ( struct mmc_host * host , unsigned int mode ) ;
void mmc_set_bus_width ( struct mmc_host * host , unsigned int width ) ;
u32 mmc_select_voltage ( struct mmc_host * host , u32 ocr ) ;
void mmc_set_timing ( struct mmc_host * host , unsigned int timing ) ;
2006-12-24 22:46:55 +01:00
static inline void mmc_delay ( unsigned int ms )
{
if ( ms < 1000 / HZ ) {
cond_resched ( ) ;
mdelay ( ms ) ;
} else {
msleep ( ms ) ;
}
}
2006-10-04 02:15:41 -07:00
2007-05-19 14:06:24 +02:00
void mmc_rescan ( struct work_struct * work ) ;
void mmc_start_host ( struct mmc_host * host ) ;
void mmc_stop_host ( struct mmc_host * host ) ;
2008-04-13 21:15:50 +03:00
int mmc_attach_mmc ( struct mmc_host * host , u32 ocr ) ;
int mmc_attach_sd ( struct mmc_host * host , u32 ocr ) ;
int mmc_attach_sdio ( struct mmc_host * host , u32 ocr ) ;
MMC core learns about SPI
Teach the MMC/SD/SDIO core about using SPI mode.
- Use mmc_host_is_spi() so enumeration works through SPI signaling
and protocols, not just the native versions.
- Provide the SPI response type flags with each request issued,
including requests from the new lock/unlock code.
- Understand that cmd->resp[0] and mmc_get_status() results for SPI
return different values than for "native" MMC/SD protocol; this
affects resetting, checking card lock status, and some others.
- Understand that some commands act a bit differently ... notably:
* OP_COND command doesn't return the OCR
* APP_CMD status doesn't have an R1_APP_CMD analogue
Those changes required some new and updated primitives:
- Provide utilities to access two SPI-only requests, and one
request that wasn't previously needed:
* mmc_spi_read_ocr() ... SPI only
* mmc_spi_set_crc() ... SPI only (override by module parm)
* mmc_send_cid() ... for use without broadcast mode
- Updated internal routines:
* Previous mmc_send_csd() modified into mmc_send_cxd_native();
it uses native "R2" responses, which include 16 bytes of data.
* Previous mmc_send_ext_csd() becomes new mmc_send_cxd_data()
helper for command-and-data access
* Bugfix to that mmc_send_cxd_data() code: dma-to-stack is
unsafe/nonportable, so kmalloc a bounce buffer instead.
- Modified mmc_send_ext_csd() now uses mmc_send_cxd_data() helper
- Modified mmc_send_csd(), and new mmc_spi_send_cid(), routines use
those helper routines based on whether they're native or SPI
The newest categories of cards supported by the MMC stack aren't expected
to work yet with SPI: MMC or SD cards with over 4GB data, and SDIO.
All those cards support SPI mode, so eventually they should work too.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
2007-08-08 09:11:32 -07:00
extern int use_spi_crc ;
2008-07-24 14:18:57 +02:00
/* Debugfs information for hosts and cards */
void mmc_add_host_debugfs ( struct mmc_host * host ) ;
void mmc_remove_host_debugfs ( struct mmc_host * host ) ;
2008-07-24 14:18:58 +02:00
void mmc_add_card_debugfs ( struct mmc_card * card ) ;
void mmc_remove_card_debugfs ( struct mmc_card * card ) ;
2005-04-16 15:20:36 -07:00
# endif
2006-12-24 22:46:55 +01:00