Commit c93fc287 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus

* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus:
  MIPS: csrc-r4k: Fix declaration depending on the wrong CONFIG_ symbol.
  MIPS: csrc-r4k: Fix spelling mistake.
  MIPS: RB532: Provide functions for gpio configuration
  MIPS: IP22: Make indy_sc_ops variable static
  MIPS: RB532: GPIO register offsets are relative to GPIOBASE
  MIPS: Malta: Fix include paths in malta-amon.c
parents e3b4ae79 a24e849c
...@@ -84,5 +84,7 @@ extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned ...@@ -84,5 +84,7 @@ extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned
extern unsigned get_434_reg(unsigned reg_offs); extern unsigned get_434_reg(unsigned reg_offs);
extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask);
extern unsigned char get_latch_u5(void); extern unsigned char get_latch_u5(void);
extern void rb532_gpio_set_ilevel(int bit, unsigned gpio);
extern void rb532_gpio_set_istat(int bit, unsigned gpio);
#endif /* _RC32434_GPIO_H_ */ #endif /* _RC32434_GPIO_H_ */
...@@ -40,12 +40,14 @@ ...@@ -40,12 +40,14 @@
#define BTCS 0x010040 #define BTCS 0x010040
#define BTCOMPARE 0x010044 #define BTCOMPARE 0x010044
#define GPIOBASE 0x050000 #define GPIOBASE 0x050000
#define GPIOCFG 0x050004 /* Offsets relative to GPIOBASE */
#define GPIOD 0x050008 #define GPIOFUNC 0x00
#define GPIOILEVEL 0x05000C #define GPIOCFG 0x04
#define GPIOISTAT 0x050010 #define GPIOD 0x08
#define GPIONMIEN 0x050014 #define GPIOILEVEL 0x0C
#define IMASK6 0x038038 #define GPIOISTAT 0x10
#define GPIONMIEN 0x14
#define IMASK6 0x38
#define LO_WPX (1 << 0) #define LO_WPX (1 << 0)
#define LO_ALE (1 << 1) #define LO_ALE (1 << 1)
#define LO_CLE (1 << 2) #define LO_CLE (1 << 2)
......
...@@ -63,7 +63,7 @@ static inline int mips_clockevent_init(void) ...@@ -63,7 +63,7 @@ static inline int mips_clockevent_init(void)
/* /*
* Initialize the count register as a clocksource * Initialize the count register as a clocksource
*/ */
#ifdef CONFIG_CEVT_R4K #ifdef CONFIG_CSRC_R4K
extern int init_mips_clocksource(void); extern int init_mips_clocksource(void);
#else #else
static inline int init_mips_clocksource(void) static inline int init_mips_clocksource(void)
......
...@@ -27,7 +27,7 @@ int __init init_mips_clocksource(void) ...@@ -27,7 +27,7 @@ int __init init_mips_clocksource(void)
if (!cpu_has_counter || !mips_hpt_frequency) if (!cpu_has_counter || !mips_hpt_frequency)
return -ENXIO; return -ENXIO;
/* Calclate a somewhat reasonable rating value */ /* Calculate a somewhat reasonable rating value */
clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000;
clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); clocksource_set_clock(&clocksource_mips, mips_hpt_frequency);
......
...@@ -161,7 +161,7 @@ static inline int __init indy_sc_probe(void) ...@@ -161,7 +161,7 @@ static inline int __init indy_sc_probe(void)
/* XXX Check with wje if the Indy caches can differenciate between /* XXX Check with wje if the Indy caches can differenciate between
writeback + invalidate and just invalidate. */ writeback + invalidate and just invalidate. */
struct bcache_ops indy_sc_ops = { static struct bcache_ops indy_sc_ops = {
.bc_enable = indy_sc_enable, .bc_enable = indy_sc_enable,
.bc_disable = indy_sc_disable, .bc_disable = indy_sc_disable,
.bc_wback_inv = indy_sc_wback_invalidate, .bc_wback_inv = indy_sc_wback_invalidate,
......
...@@ -22,9 +22,9 @@ ...@@ -22,9 +22,9 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <asm-mips/addrspace.h> #include <asm/addrspace.h>
#include <asm-mips/mips-boards/launch.h> #include <asm/mips-boards/launch.h>
#include <asm-mips/mipsmtregs.h> #include <asm/mipsmtregs.h>
int amon_cpu_avail(int cpu) int amon_cpu_avail(int cpu)
{ {
......
...@@ -118,7 +118,7 @@ static struct platform_device cf_slot0 = { ...@@ -118,7 +118,7 @@ static struct platform_device cf_slot0 = {
/* Resources and device for NAND */ /* Resources and device for NAND */
static int rb532_dev_ready(struct mtd_info *mtd) static int rb532_dev_ready(struct mtd_info *mtd)
{ {
return readl(IDT434_REG_BASE + GPIOD) & GPIO_RDY; return gpio_get_value(GPIO_RDY);
} }
static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
......
...@@ -39,10 +39,6 @@ ...@@ -39,10 +39,6 @@
struct rb532_gpio_chip { struct rb532_gpio_chip {
struct gpio_chip chip; struct gpio_chip chip;
void __iomem *regbase; void __iomem *regbase;
void (*set_int_level)(struct gpio_chip *chip, unsigned offset, int value);
int (*get_int_level)(struct gpio_chip *chip, unsigned offset);
void (*set_int_status)(struct gpio_chip *chip, unsigned offset, int value);
int (*get_int_status)(struct gpio_chip *chip, unsigned offset);
}; };
struct mpmc_device dev3; struct mpmc_device dev3;
...@@ -111,15 +107,47 @@ unsigned char get_latch_u5(void) ...@@ -111,15 +107,47 @@ unsigned char get_latch_u5(void)
} }
EXPORT_SYMBOL(get_latch_u5); EXPORT_SYMBOL(get_latch_u5);
/* rb532_set_bit - sanely set a bit
*
* bitval: new value for the bit
* offset: bit index in the 4 byte address range
* ioaddr: 4 byte aligned address being altered
*/
static inline void rb532_set_bit(unsigned bitval,
unsigned offset, void __iomem *ioaddr)
{
unsigned long flags;
u32 val;
bitval = !!bitval; /* map parameter to {0,1} */
local_irq_save(flags);
val = readl(ioaddr);
val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */
val |= ( bitval << offset ); /* set bit if bitval == 1 */
writel(val, ioaddr);
local_irq_restore(flags);
}
/* rb532_get_bit - read a bit
*
* returns the boolean state of the bit, which may be > 1
*/
static inline int rb532_get_bit(unsigned offset, void __iomem *ioaddr)
{
return (readl(ioaddr) & (1 << offset));
}
/* /*
* Return GPIO level */ * Return GPIO level */
static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset)
{ {
u32 mask = 1 << offset;
struct rb532_gpio_chip *gpch; struct rb532_gpio_chip *gpch;
gpch = container_of(chip, struct rb532_gpio_chip, chip); gpch = container_of(chip, struct rb532_gpio_chip, chip);
return readl(gpch->regbase + GPIOD) & mask; return rb532_get_bit(offset, gpch->regbase + GPIOD);
} }
/* /*
...@@ -128,23 +156,10 @@ static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) ...@@ -128,23 +156,10 @@ static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset)
static void rb532_gpio_set(struct gpio_chip *chip, static void rb532_gpio_set(struct gpio_chip *chip,
unsigned offset, int value) unsigned offset, int value)
{ {
unsigned long flags;
u32 mask = 1 << offset;
u32 tmp;
struct rb532_gpio_chip *gpch; struct rb532_gpio_chip *gpch;
void __iomem *gpvr;
gpch = container_of(chip, struct rb532_gpio_chip, chip); gpch = container_of(chip, struct rb532_gpio_chip, chip);
gpvr = gpch->regbase + GPIOD; rb532_set_bit(value, offset, gpch->regbase + GPIOD);
local_irq_save(flags);
tmp = readl(gpvr);
if (value)
tmp |= mask;
else
tmp &= ~mask;
writel(tmp, gpvr);
local_irq_restore(flags);
} }
/* /*
...@@ -152,21 +167,14 @@ static void rb532_gpio_set(struct gpio_chip *chip, ...@@ -152,21 +167,14 @@ static void rb532_gpio_set(struct gpio_chip *chip,
*/ */
static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
{ {
unsigned long flags;
u32 mask = 1 << offset;
u32 value;
struct rb532_gpio_chip *gpch; struct rb532_gpio_chip *gpch;
void __iomem *gpdr;
gpch = container_of(chip, struct rb532_gpio_chip, chip); gpch = container_of(chip, struct rb532_gpio_chip, chip);
gpdr = gpch->regbase + GPIOCFG;
local_irq_save(flags); if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
value = readl(gpdr); return 1; /* alternate function, GPIOCFG is ignored */
value &= ~mask;
writel(value, gpdr);
local_irq_restore(flags);
rb532_set_bit(0, offset, gpch->regbase + GPIOCFG);
return 0; return 0;
} }
...@@ -176,117 +184,60 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) ...@@ -176,117 +184,60 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
static int rb532_gpio_direction_output(struct gpio_chip *chip, static int rb532_gpio_direction_output(struct gpio_chip *chip,
unsigned offset, int value) unsigned offset, int value)
{ {
unsigned long flags;
u32 mask = 1 << offset;
u32 tmp;
struct rb532_gpio_chip *gpch; struct rb532_gpio_chip *gpch;
void __iomem *gpdr;
gpch = container_of(chip, struct rb532_gpio_chip, chip); gpch = container_of(chip, struct rb532_gpio_chip, chip);
writel(mask, gpch->regbase + GPIOD);
gpdr = gpch->regbase + GPIOCFG;
local_irq_save(flags); if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
tmp = readl(gpdr); return 1; /* alternate function, GPIOCFG is ignored */
tmp |= mask;
writel(tmp, gpdr);
local_irq_restore(flags);
/* set the initial output value */
rb532_set_bit(value, offset, gpch->regbase + GPIOD);
rb532_set_bit(1, offset, gpch->regbase + GPIOCFG);
return 0; return 0;
} }
/* static struct rb532_gpio_chip rb532_gpio_chip[] = {
* Set the GPIO interrupt level [0] = {
*/ .chip = {
static void rb532_gpio_set_int_level(struct gpio_chip *chip, .label = "gpio0",
unsigned offset, int value) .direction_input = rb532_gpio_direction_input,
{ .direction_output = rb532_gpio_direction_output,
unsigned long flags; .get = rb532_gpio_get,
u32 mask = 1 << offset; .set = rb532_gpio_set,
u32 tmp; .base = 0,
struct rb532_gpio_chip *gpch; .ngpio = 32,
void __iomem *gpil; },
},
gpch = container_of(chip, struct rb532_gpio_chip, chip); };
gpil = gpch->regbase + GPIOILEVEL;
local_irq_save(flags);
tmp = readl(gpil);
if (value)
tmp |= mask;
else
tmp &= ~mask;
writel(tmp, gpil);
local_irq_restore(flags);
}
/* /*
* Get the GPIO interrupt level * Set GPIO interrupt level
*/ */
static int rb532_gpio_get_int_level(struct gpio_chip *chip, unsigned offset) void rb532_gpio_set_ilevel(int bit, unsigned gpio)
{ {
u32 mask = 1 << offset; rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOILEVEL);
struct rb532_gpio_chip *gpch;
gpch = container_of(chip, struct rb532_gpio_chip, chip);
return readl(gpch->regbase + GPIOILEVEL) & mask;
} }
EXPORT_SYMBOL(rb532_gpio_set_ilevel);
/* /*
* Set the GPIO interrupt status * Set GPIO interrupt status
*/ */
static void rb532_gpio_set_int_status(struct gpio_chip *chip, void rb532_gpio_set_istat(int bit, unsigned gpio)
unsigned offset, int value)
{ {
unsigned long flags; rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOISTAT);
u32 mask = 1 << offset;
u32 tmp;
struct rb532_gpio_chip *gpch;
void __iomem *gpis;
gpch = container_of(chip, struct rb532_gpio_chip, chip);
gpis = gpch->regbase + GPIOISTAT;
local_irq_save(flags);
tmp = readl(gpis);
if (value)
tmp |= mask;
else
tmp &= ~mask;
writel(tmp, gpis);
local_irq_restore(flags);
} }
EXPORT_SYMBOL(rb532_gpio_set_istat);
/* /*
* Get the GPIO interrupt status * Configure GPIO alternate function
*/ */
static int rb532_gpio_get_int_status(struct gpio_chip *chip, unsigned offset) static void rb532_gpio_set_func(int bit, unsigned gpio)
{ {
u32 mask = 1 << offset; rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC);
struct rb532_gpio_chip *gpch;
gpch = container_of(chip, struct rb532_gpio_chip, chip);
return readl(gpch->regbase + GPIOISTAT) & mask;
} }
static struct rb532_gpio_chip rb532_gpio_chip[] = {
[0] = {
.chip = {
.label = "gpio0",
.direction_input = rb532_gpio_direction_input,
.direction_output = rb532_gpio_direction_output,
.get = rb532_gpio_get,
.set = rb532_gpio_set,
.base = 0,
.ngpio = 32,
},
.get_int_level = rb532_gpio_get_int_level,
.set_int_level = rb532_gpio_set_int_level,
.get_int_status = rb532_gpio_get_int_status,
.set_int_status = rb532_gpio_set_int_status,
},
};
int __init rb532_gpio_init(void) int __init rb532_gpio_init(void)
{ {
struct resource *r; struct resource *r;
...@@ -310,9 +261,11 @@ int __init rb532_gpio_init(void) ...@@ -310,9 +261,11 @@ int __init rb532_gpio_init(void)
return -ENXIO; return -ENXIO;
} }
/* Set the interrupt status and level for the CF pin */ /* configure CF_GPIO_NUM as CFRDY IRQ source */
rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1); rb532_gpio_set_func(0, CF_GPIO_NUM);
rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0); rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM);
rb532_gpio_set_ilevel(1, CF_GPIO_NUM);
rb532_gpio_set_istat(0, CF_GPIO_NUM);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment