Skip to content

Commit

Permalink
ARM: 7158/1: add new MFP implement for NUC900
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
wanzongshun authored and Russell King committed Nov 12, 2011
1 parent a6dc544 commit 798681b
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 8 deletions.
3 changes: 2 additions & 1 deletion arch/arm/mach-w90x900/include/mach/mfp.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
extern void mfp_set_groupf(struct device *dev);
extern void mfp_set_groupc(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 */
2 changes: 1 addition & 1 deletion arch/arm/mach-w90x900/include/mach/nuc900_spi.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#ifndef __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 {
unsigned int num_cs;
Expand Down
48 changes: 42 additions & 6 deletions arch/arm/mach-w90x900/mfp.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,25 @@
#define REG_MFSEL (W90X900_VA_GCR + 0xC)

#define GPSELF (0x01 << 1)

#define GPSELC (0x03 << 2)
#define ENKPI (0x02 << 2)
#define ENNAND (0x01 << 2)
#define GPSELD (0x0f << 4)

#define GPSELEI0 (0x01 << 26)
#define GPSELEI1 (0x01 << 27)

#define GPIOG0TO1 (0x03 << 14)
#define GPIOG2TO3 (0x03 << 16)
#define GPIOG22TO23 (0x03 << 22)
#define GPIOG18TO20 (0x07 << 18)

#define ENSPI (0x0a << 14)
#define ENI2C0 (0x01 << 14)
#define ENI2C1 (0x01 << 16)
#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);

Expand Down Expand Up @@ -127,16 +130,19 @@ void mfp_set_groupi(struct device *dev)
}
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;
const char *dev_id;

BUG_ON(!dev);
BUG_ON((!dev) && (!subname));

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);

Expand All @@ -152,6 +158,9 @@ void mfp_set_groupg(struct device *dev)
} else if (strcmp(dev_id, "nuc900-audio") == 0) {
mfpen &= ~(GPIOG22TO23);
mfpen |= ENAC97;/*enable AC97*/
} else if (strcmp(dev_id, "nuc900-mmc-port1") == 0) {
mfpen &= ~(GPIOG18TO20);
mfpen |= (ENSD1 | 0x01);/*enable sd1*/
} else {
mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
}
Expand All @@ -162,3 +171,30 @@ void mfp_set_groupg(struct device *dev)
}
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);

0 comments on commit 798681b

Please sign in to comment.