forked from mirrors/linux
		
	sdio: add CD disable support
Add support to disconnect the pull-up resistor on CD/DAT[3] (pin 1) of the card. This may be desired on certain setups of boards, controllers and embedded sdio devices which do not need the card's pull-up. As a result, card detection is disabled and power is saved. [akpm@linux-foundation.org: simplify sdio_disable_cd() a bit] Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com> Acked-by: Matt Fleming <matt@console-pimps.org> Cc: Ian Molton <ian@mnementh.co.uk> Cc: "Roberto A. Foglietta" <roberto.foglietta@gmail.com> Cc: Philip Langdale <philipl@overt.org> Cc: Pierre Ossman <pierre@ossman.eu> Cc: David Vrabel <david.vrabel@csr.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									653f41b52d
								
							
						
					
					
						commit
						006ebd5de1
					
				
					 2 changed files with 32 additions and 1 deletions
				
			
		| 
						 | 
					@ -164,6 +164,29 @@ static int sdio_enable_wide(struct mmc_card *card)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * If desired, disconnect the pull-up resistor on CD/DAT[3] (pin 1)
 | 
				
			||||||
 | 
					 * of the card. This may be required on certain setups of boards,
 | 
				
			||||||
 | 
					 * controllers and embedded sdio device which do not need the card's
 | 
				
			||||||
 | 
					 * pull-up. As a result, card detection is disabled and power is saved.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static int sdio_disable_cd(struct mmc_card *card)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
						u8 ctrl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!card->cccr.disable_cd)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl);
 | 
				
			||||||
 | 
						if (ret)
 | 
				
			||||||
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctrl |= SDIO_BUS_CD_DISABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Test if the card supports high-speed mode and, if so, switch to it.
 | 
					 * Test if the card supports high-speed mode and, if so, switch to it.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -384,6 +407,13 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		goto remove;
 | 
							goto remove;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * If needed, disconnect card detection pull-up resistor.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						err = sdio_disable_cd(card);
 | 
				
			||||||
 | 
						if (err)
 | 
				
			||||||
 | 
							goto remove;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Initialize (but don't add) all present functions.
 | 
						 * Initialize (but don't add) all present functions.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,8 @@ struct sdio_cccr {
 | 
				
			||||||
				low_speed:1,
 | 
									low_speed:1,
 | 
				
			||||||
				wide_bus:1,
 | 
									wide_bus:1,
 | 
				
			||||||
				high_power:1,
 | 
									high_power:1,
 | 
				
			||||||
				high_speed:1;
 | 
									high_speed:1,
 | 
				
			||||||
 | 
									disable_cd:1;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sdio_cis {
 | 
					struct sdio_cis {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue