forked from mirrors/linux
		
	ARM: 7158/1: add new MFP implement for NUC900
This patch is to add new MFP implement in mfp.c,since nuc900 mmc driver needs this function support. Signed-off-by: Wan ZongShun <mcuos.com@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									a6dc54460e
								
							
						
					
					
						commit
						798681bf21
					
				
					 3 changed files with 45 additions and 8 deletions
				
			
		| 
						 | 
					@ -19,6 +19,7 @@
 | 
				
			||||||
extern void mfp_set_groupf(struct device *dev);
 | 
					extern void mfp_set_groupf(struct device *dev);
 | 
				
			||||||
extern void mfp_set_groupc(struct device *dev);
 | 
					extern void mfp_set_groupc(struct device *dev);
 | 
				
			||||||
extern void mfp_set_groupi(struct device *dev);
 | 
					extern void mfp_set_groupi(struct device *dev);
 | 
				
			||||||
extern void mfp_set_groupg(struct device *dev);
 | 
					extern void mfp_set_groupg(struct device *dev, const char *subname);
 | 
				
			||||||
 | 
					extern void mfp_set_groupd(struct device *dev, const char *subname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __ASM_ARCH_MFP_H */
 | 
					#endif /* __ASM_ARCH_MFP_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
#ifndef __ASM_ARCH_SPI_H
 | 
					#ifndef __ASM_ARCH_SPI_H
 | 
				
			||||||
#define __ASM_ARCH_SPI_H
 | 
					#define __ASM_ARCH_SPI_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void mfp_set_groupg(struct device *dev);
 | 
					extern void mfp_set_groupg(struct device *dev, const char *subname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct nuc900_spi_info {
 | 
					struct nuc900_spi_info {
 | 
				
			||||||
	unsigned int num_cs;
 | 
						unsigned int num_cs;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,10 +26,8 @@
 | 
				
			||||||
#define REG_MFSEL	(W90X900_VA_GCR + 0xC)
 | 
					#define REG_MFSEL	(W90X900_VA_GCR + 0xC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define GPSELF		(0x01 << 1)
 | 
					#define GPSELF		(0x01 << 1)
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GPSELC		(0x03 << 2)
 | 
					#define GPSELC		(0x03 << 2)
 | 
				
			||||||
#define ENKPI		(0x02 << 2)
 | 
					#define GPSELD		(0x0f << 4)
 | 
				
			||||||
#define ENNAND		(0x01 << 2)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define GPSELEI0	(0x01 << 26)
 | 
					#define GPSELEI0	(0x01 << 26)
 | 
				
			||||||
#define GPSELEI1	(0x01 << 27)
 | 
					#define GPSELEI1	(0x01 << 27)
 | 
				
			||||||
| 
						 | 
					@ -37,11 +35,16 @@
 | 
				
			||||||
#define GPIOG0TO1	(0x03 << 14)
 | 
					#define GPIOG0TO1	(0x03 << 14)
 | 
				
			||||||
#define GPIOG2TO3	(0x03 << 16)
 | 
					#define GPIOG2TO3	(0x03 << 16)
 | 
				
			||||||
#define GPIOG22TO23	(0x03 << 22)
 | 
					#define GPIOG22TO23	(0x03 << 22)
 | 
				
			||||||
 | 
					#define GPIOG18TO20	(0x07 << 18)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ENSPI		(0x0a << 14)
 | 
					#define ENSPI		(0x0a << 14)
 | 
				
			||||||
#define ENI2C0		(0x01 << 14)
 | 
					#define ENI2C0		(0x01 << 14)
 | 
				
			||||||
#define ENI2C1		(0x01 << 16)
 | 
					#define ENI2C1		(0x01 << 16)
 | 
				
			||||||
#define ENAC97		(0x02 << 22)
 | 
					#define ENAC97		(0x02 << 22)
 | 
				
			||||||
 | 
					#define ENSD1		(0x02 << 18)
 | 
				
			||||||
 | 
					#define ENSD0		(0x0a << 4)
 | 
				
			||||||
 | 
					#define ENKPI		(0x02 << 2)
 | 
				
			||||||
 | 
					#define ENNAND		(0x01 << 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DEFINE_MUTEX(mfp_mutex);
 | 
					static DEFINE_MUTEX(mfp_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,16 +130,19 @@ void mfp_set_groupi(struct device *dev)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(mfp_set_groupi);
 | 
					EXPORT_SYMBOL(mfp_set_groupi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mfp_set_groupg(struct device *dev)
 | 
					void mfp_set_groupg(struct device *dev, const char *subname)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long mfpen;
 | 
						unsigned long mfpen;
 | 
				
			||||||
	const char *dev_id;
 | 
						const char *dev_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(!dev);
 | 
						BUG_ON((!dev) && (!subname));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&mfp_mutex);
 | 
						mutex_lock(&mfp_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev_id = dev_name(dev);
 | 
						if (subname != NULL)
 | 
				
			||||||
 | 
							dev_id = subname;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							dev_id = dev_name(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mfpen = __raw_readl(REG_MFSEL);
 | 
						mfpen = __raw_readl(REG_MFSEL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -152,6 +158,9 @@ void mfp_set_groupg(struct device *dev)
 | 
				
			||||||
	} else if (strcmp(dev_id, "nuc900-audio") == 0) {
 | 
						} else if (strcmp(dev_id, "nuc900-audio") == 0) {
 | 
				
			||||||
		mfpen &= ~(GPIOG22TO23);
 | 
							mfpen &= ~(GPIOG22TO23);
 | 
				
			||||||
		mfpen |= ENAC97;/*enable AC97*/
 | 
							mfpen |= ENAC97;/*enable AC97*/
 | 
				
			||||||
 | 
						} else if (strcmp(dev_id, "nuc900-mmc-port1") == 0) {
 | 
				
			||||||
 | 
							mfpen &= ~(GPIOG18TO20);
 | 
				
			||||||
 | 
							mfpen |= (ENSD1 | 0x01);/*enable sd1*/
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
 | 
							mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -162,3 +171,30 @@ void mfp_set_groupg(struct device *dev)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(mfp_set_groupg);
 | 
					EXPORT_SYMBOL(mfp_set_groupg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mfp_set_groupd(struct device *dev, const char *subname)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long mfpen;
 | 
				
			||||||
 | 
						const char *dev_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						BUG_ON((!dev) && (!subname));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutex_lock(&mfp_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (subname != NULL)
 | 
				
			||||||
 | 
							dev_id = subname;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							dev_id = dev_name(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mfpen = __raw_readl(REG_MFSEL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (strcmp(dev_id, "nuc900-mmc-port0") == 0) {
 | 
				
			||||||
 | 
							mfpen &= ~GPSELD;/*enable sd0*/
 | 
				
			||||||
 | 
							mfpen |= ENSD0;
 | 
				
			||||||
 | 
						} else
 | 
				
			||||||
 | 
							mfpen &= (~GPSELD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						__raw_writel(mfpen, REG_MFSEL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutex_unlock(&mfp_mutex);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(mfp_set_groupd);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue