forked from mirrors/linux
		
	 2c5d427690
			
		
	
	
		2c5d427690
		
	
	
	
	
		
			
			Rather than only deselecting the SD card via a CMD7, before we cut power to it at system suspend, at runtime suspend or at shutdown, let's add support for a graceful power off sequence via enabling the SD Power Off Notification feature. Note that, the Power Off Notification feature was added in the SD spec v4.x, which is several years ago. However, it's still a bit unclear how often the SD card vendors decides to implement support for it. To validate these changes a Sandisk Extreme PRO A2 64GB has been used, which seems to work nicely. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Avri Altman <avri.altman@wdc.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com> Link: https://lore.kernel.org/r/20210504161222.101536-12-ulf.hansson@linaro.org
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0-or-later */
 | |
| /*
 | |
|  *  include/linux/mmc/sd.h
 | |
|  *
 | |
|  *  Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved.
 | |
|  */
 | |
| 
 | |
| #ifndef LINUX_MMC_SD_H
 | |
| #define LINUX_MMC_SD_H
 | |
| 
 | |
| /* SD commands                           type  argument     response */
 | |
|   /* class 0 */
 | |
| /* This is basically the same command as for MMC with some quirks. */
 | |
| #define SD_SEND_RELATIVE_ADDR     3   /* bcr                     R6  */
 | |
| #define SD_SEND_IF_COND           8   /* bcr  [11:0] See below   R7  */
 | |
| #define SD_SWITCH_VOLTAGE         11  /* ac                      R1  */
 | |
| 
 | |
|   /* class 10 */
 | |
| #define SD_SWITCH                 6   /* adtc [31:0] See below   R1  */
 | |
| 
 | |
|   /* class 5 */
 | |
| #define SD_ERASE_WR_BLK_START    32   /* ac   [31:0] data addr   R1  */
 | |
| #define SD_ERASE_WR_BLK_END      33   /* ac   [31:0] data addr   R1  */
 | |
| 
 | |
|   /* Application commands */
 | |
| #define SD_APP_SET_BUS_WIDTH      6   /* ac   [1:0] bus width    R1  */
 | |
| #define SD_APP_SD_STATUS         13   /* adtc                    R1  */
 | |
| #define SD_APP_SEND_NUM_WR_BLKS  22   /* adtc                    R1  */
 | |
| #define SD_APP_OP_COND           41   /* bcr  [31:0] OCR         R3  */
 | |
| #define SD_APP_SEND_SCR          51   /* adtc                    R1  */
 | |
| 
 | |
|   /* class 11 */
 | |
| #define SD_READ_EXTR_SINGLE      48   /* adtc [31:0]             R1  */
 | |
| #define SD_WRITE_EXTR_SINGLE     49   /* adtc [31:0]             R1  */
 | |
| 
 | |
| /* OCR bit definitions */
 | |
| #define SD_OCR_S18R		(1 << 24)    /* 1.8V switching request */
 | |
| #define SD_ROCR_S18A		SD_OCR_S18R  /* 1.8V switching accepted by card */
 | |
| #define SD_OCR_XPC		(1 << 28)    /* SDXC power control */
 | |
| #define SD_OCR_CCS		(1 << 30)    /* Card Capacity Status */
 | |
| 
 | |
| /*
 | |
|  * SD_SWITCH argument format:
 | |
|  *
 | |
|  *      [31] Check (0) or switch (1)
 | |
|  *      [30:24] Reserved (0)
 | |
|  *      [23:20] Function group 6
 | |
|  *      [19:16] Function group 5
 | |
|  *      [15:12] Function group 4
 | |
|  *      [11:8] Function group 3
 | |
|  *      [7:4] Function group 2
 | |
|  *      [3:0] Function group 1
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * SD_SEND_IF_COND argument format:
 | |
|  *
 | |
|  *	[31:12] Reserved (0)
 | |
|  *	[11:8] Host Voltage Supply Flags
 | |
|  *	[7:0] Check Pattern (0xAA)
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * SCR field definitions
 | |
|  */
 | |
| 
 | |
| #define SCR_SPEC_VER_0		0	/* Implements system specification 1.0 - 1.01 */
 | |
| #define SCR_SPEC_VER_1		1	/* Implements system specification 1.10 */
 | |
| #define SCR_SPEC_VER_2		2	/* Implements system specification 2.00-3.0X */
 | |
| 
 | |
| /*
 | |
|  * SD bus widths
 | |
|  */
 | |
| #define SD_BUS_WIDTH_1		0
 | |
| #define SD_BUS_WIDTH_4		2
 | |
| 
 | |
| /*
 | |
|  * SD_SWITCH mode
 | |
|  */
 | |
| #define SD_SWITCH_CHECK		0
 | |
| #define SD_SWITCH_SET		1
 | |
| 
 | |
| /*
 | |
|  * SD_SWITCH function groups
 | |
|  */
 | |
| #define SD_SWITCH_GRP_ACCESS	0
 | |
| 
 | |
| /*
 | |
|  * SD_SWITCH access modes
 | |
|  */
 | |
| #define SD_SWITCH_ACCESS_DEF	0
 | |
| #define SD_SWITCH_ACCESS_HS	1
 | |
| 
 | |
| /*
 | |
|  * Erase/discard
 | |
|  */
 | |
| #define SD_ERASE_ARG			0x00000000
 | |
| #define SD_DISCARD_ARG			0x00000001
 | |
| 
 | |
| #endif /* LINUX_MMC_SD_H */
 |