Commit ff1b8ba0 authored by Ben Dooks's avatar Ben Dooks

ARM: Merge for-2635/gpio2

Merge branch 'for-2635/gpio2' into for-linus/samsung2
parents 5fcdb16b 32b6cb38
...@@ -6,6 +6,7 @@ config CPU_S3C2410 ...@@ -6,6 +6,7 @@ config CPU_S3C2410
bool bool
depends on ARCH_S3C2410 depends on ARCH_S3C2410
select CPU_ARM920T select CPU_ARM920T
select S3C_GPIO_PULL_UP
select S3C2410_CLOCK select S3C2410_CLOCK
select S3C2410_GPIO select S3C2410_GPIO
select CPU_LLSERIAL_S3C2410 select CPU_LLSERIAL_S3C2410
......
...@@ -33,14 +33,15 @@ static void h1940bt_enable(int on) ...@@ -33,14 +33,15 @@ static void h1940bt_enable(int on)
h1940_latch_control(0, H1940_LATCH_BLUETOOTH_POWER); h1940_latch_control(0, H1940_LATCH_BLUETOOTH_POWER);
/* Reset the chip */ /* Reset the chip */
mdelay(10); mdelay(10);
s3c2410_gpio_setpin(S3C2410_GPH(1), 1);
gpio_set_value(S3C2410_GPH(1), 1);
mdelay(10); mdelay(10);
s3c2410_gpio_setpin(S3C2410_GPH(1), 0); gpio_set_value(S3C2410_GPH(1), 0);
} }
else { else {
s3c2410_gpio_setpin(S3C2410_GPH(1), 1); gpio_set_value(S3C2410_GPH(1), 1);
mdelay(10); mdelay(10);
s3c2410_gpio_setpin(S3C2410_GPH(1), 0); gpio_set_value(S3C2410_GPH(1), 0);
mdelay(10); mdelay(10);
h1940_latch_control(H1940_LATCH_BLUETOOTH_POWER, 0); h1940_latch_control(H1940_LATCH_BLUETOOTH_POWER, 0);
} }
...@@ -61,15 +62,21 @@ static int __devinit h1940bt_probe(struct platform_device *pdev) ...@@ -61,15 +62,21 @@ static int __devinit h1940bt_probe(struct platform_device *pdev)
struct rfkill *rfk; struct rfkill *rfk;
int ret = 0; int ret = 0;
ret = gpio_request(S3C2410_GPH(1), dev_name(&pdev->dev));
if (ret) {
dev_err(&pdev->dev, "could not get GPH1\n");\
return ret;
}
/* Configures BT serial port GPIOs */ /* Configures BT serial port GPIOs */
s3c2410_gpio_cfgpin(S3C2410_GPH(0), S3C2410_GPH0_nCTS0); s3c_gpio_cfgpin(S3C2410_GPH(0), S3C2410_GPH0_nCTS0);
s3c2410_gpio_pullup(S3C2410_GPH(0), 1); s3c_gpio_cfgpull(S3C2410_GPH(0), S3C_GPIO_PULL_NONE);
s3c2410_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_pullup(S3C2410_GPH(1), 1); s3c_gpio_cfgpull(S3C2410_GPH(1), S3C_GPIO_PULL_NONE);
s3c2410_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPH2_TXD0); s3c_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPH2_TXD0);
s3c2410_gpio_pullup(S3C2410_GPH(2), 1); s3c_gpio_cfgpull(S3C2410_GPH(2), S3C_GPIO_PULL_NONE);
s3c2410_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0); s3c_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0);
s3c2410_gpio_pullup(S3C2410_GPH(3), 1); s3c_gpio_cfgpull(S3C2410_GPH(3), S3C_GPIO_PULL_NONE);
rfk = rfkill_alloc(DRV_NAME, &pdev->dev, RFKILL_TYPE_BLUETOOTH, rfk = rfkill_alloc(DRV_NAME, &pdev->dev, RFKILL_TYPE_BLUETOOTH,
...@@ -100,6 +107,7 @@ static int h1940bt_remove(struct platform_device *pdev) ...@@ -100,6 +107,7 @@ static int h1940bt_remove(struct platform_device *pdev)
struct rfkill *rfk = platform_get_drvdata(pdev); struct rfkill *rfk = platform_get_drvdata(pdev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
gpio_free(S3C2410_GPH(1));
if (rfk) { if (rfk) {
rfkill_unregister(rfk); rfkill_unregister(rfk);
......
...@@ -10,14 +10,28 @@ ...@@ -10,14 +10,28 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#ifndef __MACH_GPIO_FNS_H
#define __MACH_GPIO_FNS_H __FILE__
/* These functions are in the to-be-removed category and it is strongly /* These functions are in the to-be-removed category and it is strongly
* encouraged not to use these in new code. They will be marked deprecated * encouraged not to use these in new code. They will be marked deprecated
* very soon. * very soon.
* *
* Most of the functionality can be either replaced by the gpiocfg calls * Most of the functionality can be either replaced by the gpiocfg calls
* for the s3c platform or by the generic GPIOlib API. * for the s3c platform or by the generic GPIOlib API.
*
* As of 2.6.35-rc, these will be removed, with the few drivers using them
* either replaced or given a wrapper until the calls can be removed.
*/ */
#include <plat/gpio-cfg.h>
static inline void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int cfg)
{
/* 1:1 mapping between cfgpin and setcfg calls at the moment */
s3c_gpio_cfgpin(pin, cfg);
}
/* external functions for GPIO support /* external functions for GPIO support
* *
* These allow various different clients to access the same GPIO * These allow various different clients to access the same GPIO
...@@ -25,17 +39,6 @@ ...@@ -25,17 +39,6 @@
* GPIO register, then it is safe to ioremap/__raw_{read|write} to it. * GPIO register, then it is safe to ioremap/__raw_{read|write} to it.
*/ */
/* s3c2410_gpio_cfgpin
*
* set the configuration of the given pin to the value passed.
*
* eg:
* s3c2410_gpio_cfgpin(S3C2410_GPA(0), S3C2410_GPA0_ADDR0);
* s3c2410_gpio_cfgpin(S3C2410_GPE(8), S3C2410_GPE8_SDDAT1);
*/
extern void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);
extern unsigned int s3c2410_gpio_getcfg(unsigned int pin); extern unsigned int s3c2410_gpio_getcfg(unsigned int pin);
/* s3c2410_gpio_getirq /* s3c2410_gpio_getirq
...@@ -71,6 +74,14 @@ extern int s3c2400_gpio_getirq(unsigned int pin); ...@@ -71,6 +74,14 @@ extern int s3c2400_gpio_getirq(unsigned int pin);
extern int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, extern int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on,
unsigned int config); unsigned int config);
/* s3c2410_gpio_pullup
*
* This call should be replaced with s3c_gpio_setpull().
*
* As a note, there is currently no distinction between pull-up and pull-down
* in the s3c24xx series devices with only an on/off configuration.
*/
/* s3c2410_gpio_pullup /* s3c2410_gpio_pullup
* *
* configure the pull-up control on the given pin * configure the pull-up control on the given pin
...@@ -86,18 +97,8 @@ extern int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, ...@@ -86,18 +97,8 @@ extern int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on,
extern void s3c2410_gpio_pullup(unsigned int pin, unsigned int to); extern void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);
/* s3c2410_gpio_getpull
*
* Read the state of the pull-up on a given pin
*
* return:
* < 0 => error code
* 0 => enabled
* 1 => disabled
*/
extern int s3c2410_gpio_getpull(unsigned int pin);
extern void s3c2410_gpio_setpin(unsigned int pin, unsigned int to); extern void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
extern unsigned int s3c2410_gpio_getpin(unsigned int pin); extern unsigned int s3c2410_gpio_getpin(unsigned int pin);
#endif /* __MACH_GPIO_FNS_H */
...@@ -16,15 +16,28 @@ ...@@ -16,15 +16,28 @@
#define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) #define S3C2410_GPIONO(bank,offset) ((bank) + (offset))
#define S3C2410_GPIO_BANKA (32*0)
#define S3C2410_GPIO_BANKB (32*1)
#define S3C2410_GPIO_BANKC (32*2)
#define S3C2410_GPIO_BANKD (32*3)
#define S3C2410_GPIO_BANKE (32*4)
#define S3C2410_GPIO_BANKF (32*5)
#define S3C2410_GPIO_BANKG (32*6) #define S3C2410_GPIO_BANKG (32*6)
#define S3C2410_GPIO_BANKH (32*7) #define S3C2410_GPIO_BANKH (32*7)
/* GPIO sizes for various SoCs:
*
* 2442
* 2410 2412 2440 2443 2416
* ---- ---- ---- ---- ----
* A 23 22 25 16 25
* B 11 11 11 11 9
* C 16 15 16 16 16
* D 16 16 16 16 16
* E 16 16 16 16 16
* F 8 8 8 8 8
* G 16 16 16 16 8
* H 11 11 9 15 15
* J -- -- 13 16 --
* K -- -- -- -- 16
* L -- -- -- 15 7
* M -- -- -- 2 2
*/
/* GPIO bank sizes */ /* GPIO bank sizes */
#define S3C2410_GPIO_A_NR (32) #define S3C2410_GPIO_A_NR (32)
#define S3C2410_GPIO_B_NR (32) #define S3C2410_GPIO_B_NR (32)
...@@ -34,6 +47,10 @@ ...@@ -34,6 +47,10 @@
#define S3C2410_GPIO_F_NR (32) #define S3C2410_GPIO_F_NR (32)
#define S3C2410_GPIO_G_NR (32) #define S3C2410_GPIO_G_NR (32)
#define S3C2410_GPIO_H_NR (32) #define S3C2410_GPIO_H_NR (32)
#define S3C2410_GPIO_J_NR (32) /* technically 16. */
#define S3C2410_GPIO_K_NR (32) /* technically 16. */
#define S3C2410_GPIO_L_NR (32) /* technically 15. */
#define S3C2410_GPIO_M_NR (32) /* technically 2. */
#if CONFIG_S3C_GPIO_SPACE != 0 #if CONFIG_S3C_GPIO_SPACE != 0
#error CONFIG_S3C_GPIO_SPACE cannot be zero at the moment #error CONFIG_S3C_GPIO_SPACE cannot be zero at the moment
...@@ -53,6 +70,10 @@ enum s3c_gpio_number { ...@@ -53,6 +70,10 @@ enum s3c_gpio_number {
S3C2410_GPIO_F_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_E), S3C2410_GPIO_F_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_E),
S3C2410_GPIO_G_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_F), S3C2410_GPIO_G_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_F),
S3C2410_GPIO_H_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_G), S3C2410_GPIO_H_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_G),
S3C2410_GPIO_J_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_H),
S3C2410_GPIO_K_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_J),
S3C2410_GPIO_L_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_K),
S3C2410_GPIO_M_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_L),
}; };
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
...@@ -67,6 +88,10 @@ enum s3c_gpio_number { ...@@ -67,6 +88,10 @@ enum s3c_gpio_number {
#define S3C2410_GPF(_nr) (S3C2410_GPIO_F_START + (_nr)) #define S3C2410_GPF(_nr) (S3C2410_GPIO_F_START + (_nr))
#define S3C2410_GPG(_nr) (S3C2410_GPIO_G_START + (_nr)) #define S3C2410_GPG(_nr) (S3C2410_GPIO_G_START + (_nr))
#define S3C2410_GPH(_nr) (S3C2410_GPIO_H_START + (_nr)) #define S3C2410_GPH(_nr) (S3C2410_GPIO_H_START + (_nr))
#define S3C2410_GPJ(_nr) (S3C2410_GPIO_J_START + (_nr))
#define S3C2410_GPK(_nr) (S3C2410_GPIO_K_START + (_nr))
#define S3C2410_GPL(_nr) (S3C2410_GPIO_L_START + (_nr))
#define S3C2410_GPM(_nr) (S3C2410_GPIO_M_START + (_nr))
/* compatibility until drivers can be modified */ /* compatibility until drivers can be modified */
......
...@@ -23,11 +23,11 @@ static inline struct s3c_gpio_chip *s3c_gpiolib_getchip(unsigned int pin) ...@@ -23,11 +23,11 @@ static inline struct s3c_gpio_chip *s3c_gpiolib_getchip(unsigned int pin)
{ {
struct s3c_gpio_chip *chip; struct s3c_gpio_chip *chip;
if (pin > S3C2410_GPG(10)) if (pin > S3C_GPIO_END)
return NULL; return NULL;
chip = &s3c24xx_gpios[pin/32]; chip = &s3c24xx_gpios[pin/32];
return (S3C2410_GPIO_OFFSET(pin) < chip->chip.ngpio) ? chip : NULL; return ((pin - chip->chip.base) < chip->chip.ngpio) ? chip : NULL;
} }
#endif /* __ASM_ARCH_GPIO_CORE_H */ #endif /* __ASM_ARCH_GPIO_CORE_H */
...@@ -20,10 +20,18 @@ ...@@ -20,10 +20,18 @@
* devices that need GPIO. * devices that need GPIO.
*/ */
#ifdef CONFIG_CPU_S3C244X
#define ARCH_NR_GPIOS (32 * 9 + CONFIG_S3C24XX_GPIO_EXTRA)
#else
#define ARCH_NR_GPIOS (256 + CONFIG_S3C24XX_GPIO_EXTRA) #define ARCH_NR_GPIOS (256 + CONFIG_S3C24XX_GPIO_EXTRA)
#endif
#include <asm-generic/gpio.h> #include <asm-generic/gpio.h>
#include <mach/gpio-nrs.h> #include <mach/gpio-nrs.h>
#include <mach/gpio-fns.h> #include <mach/gpio-fns.h>
#ifdef CONFIG_CPU_S3C24XX
#define S3C_GPIO_END (S3C2410_GPIO_BANKJ + 32)
#else
#define S3C_GPIO_END (S3C2410_GPIO_BANKH + 32) #define S3C_GPIO_END (S3C2410_GPIO_BANKH + 32)
#endif
...@@ -17,29 +17,11 @@ ...@@ -17,29 +17,11 @@
#include <mach/gpio-nrs.h> #include <mach/gpio-nrs.h>
#ifdef CONFIG_CPU_S3C2400 #ifdef CONFIG_CPU_S3C2400
#define S3C24XX_GPIO_BASE(x) S3C2400_GPIO_BASE(x) #define S3C24XX_MISCCR S3C2400_MISCCR
#define S3C24XX_MISCCR S3C2400_MISCCR
#else #else
#define S3C24XX_GPIO_BASE(x) S3C2410_GPIO_BASE(x) #define S3C24XX_MISCCR S3C24XX_GPIOREG2(0x80)
#define S3C24XX_MISCCR S3C24XX_GPIOREG2(0x80)
#endif /* CONFIG_CPU_S3C2400 */ #endif /* CONFIG_CPU_S3C2400 */
/* S3C2400 doesn't have a 1:1 mapping to S3C2410 gpio base pins */
#define S3C2400_BANKNUM(pin) (((pin) & ~31) / 32)
#define S3C2400_BASEA2B(pin) ((((pin) & ~31) >> 2))
#define S3C2400_BASEC2H(pin) ((S3C2400_BANKNUM(pin) * 10) + \
(2 * (S3C2400_BANKNUM(pin)-2)))
#define S3C2400_GPIO_BASE(pin) (pin < S3C2410_GPIO_BANKC ? \
S3C2400_BASEA2B(pin)+S3C24XX_VA_GPIO : \
S3C2400_BASEC2H(pin)+S3C24XX_VA_GPIO)
#define S3C2410_GPIO_BASE(pin) ((((pin) & ~31) >> 1) + S3C24XX_VA_GPIO)
#define S3C2410_GPIO_OFFSET(pin) ((pin) & 31)
/* general configuration options */ /* general configuration options */
#define S3C2410_GPIO_LEAVE (0xFFFFFFFF) #define S3C2410_GPIO_LEAVE (0xFFFFFFFF)
...@@ -639,6 +621,23 @@ ...@@ -639,6 +621,23 @@
* for the 2412/2413 from the 2410/2440/2442 * for the 2412/2413 from the 2410/2440/2442
*/ */
/* S3C2443 and above */
#define S3C2440_GPJCON S3C2410_GPIOREG(0xD0)
#define S3C2440_GPJDAT S3C2410_GPIOREG(0xD4)
#define S3C2440_GPJUP S3C2410_GPIOREG(0xD8)
#define S3C2443_GPKCON S3C2410_GPIOREG(0xE0)
#define S3C2443_GPKDAT S3C2410_GPIOREG(0xE4)
#define S3C2443_GPKUP S3C2410_GPIOREG(0xE8)
#define S3C2443_GPLCON S3C2410_GPIOREG(0xF0)
#define S3C2443_GPLDAT S3C2410_GPIOREG(0xF4)
#define S3C2443_GPLUP S3C2410_GPIOREG(0xF8)
#define S3C2443_GPMCON S3C2410_GPIOREG(0x100)
#define S3C2443_GPMDAT S3C2410_GPIOREG(0x104)
#define S3C2443_GPMUP S3C2410_GPIOREG(0x108)
/* miscellaneous control */ /* miscellaneous control */
#define S3C2400_MISCCR S3C2410_GPIOREG(0x54) #define S3C2400_MISCCR S3C2410_GPIOREG(0x54)
#define S3C2410_MISCCR S3C2410_GPIOREG(0x80) #define S3C2410_MISCCR S3C2410_GPIOREG(0x80)
......
...@@ -22,85 +22,49 @@ ...@@ -22,85 +22,49 @@
* pull up works like all other ports. * pull up works like all other ports.
*/ */
#define S3C2440_GPIO_BANKJ (416)
#define S3C2440_GPJCON S3C2410_GPIOREG(0xd0)
#define S3C2440_GPJDAT S3C2410_GPIOREG(0xd4)
#define S3C2440_GPJUP S3C2410_GPIOREG(0xd8)
#define S3C2413_GPJCON S3C2410_GPIOREG(0x80) #define S3C2413_GPJCON S3C2410_GPIOREG(0x80)
#define S3C2413_GPJDAT S3C2410_GPIOREG(0x84) #define S3C2413_GPJDAT S3C2410_GPIOREG(0x84)
#define S3C2413_GPJUP S3C2410_GPIOREG(0x88) #define S3C2413_GPJUP S3C2410_GPIOREG(0x88)
#define S3C2413_GPJSLPCON S3C2410_GPIOREG(0x8C) #define S3C2413_GPJSLPCON S3C2410_GPIOREG(0x8C)
#define S3C2440_GPJ0 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 0)
#define S3C2440_GPJ0_INP (0x00 << 0)
#define S3C2440_GPJ0_OUTP (0x01 << 0) #define S3C2440_GPJ0_OUTP (0x01 << 0)
#define S3C2440_GPJ0_CAMDATA0 (0x02 << 0) #define S3C2440_GPJ0_CAMDATA0 (0x02 << 0)
#define S3C2440_GPJ1 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 1)
#define S3C2440_GPJ1_INP (0x00 << 2)
#define S3C2440_GPJ1_OUTP (0x01 << 2) #define S3C2440_GPJ1_OUTP (0x01 << 2)
#define S3C2440_GPJ1_CAMDATA1 (0x02 << 2) #define S3C2440_GPJ1_CAMDATA1 (0x02 << 2)
#define S3C2440_GPJ2 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 2)
#define S3C2440_GPJ2_INP (0x00 << 4)
#define S3C2440_GPJ2_OUTP (0x01 << 4) #define S3C2440_GPJ2_OUTP (0x01 << 4)
#define S3C2440_GPJ2_CAMDATA2 (0x02 << 4) #define S3C2440_GPJ2_CAMDATA2 (0x02 << 4)
#define S3C2440_GPJ3 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 3)
#define S3C2440_GPJ3_INP (0x00 << 6)
#define S3C2440_GPJ3_OUTP (0x01 << 6) #define S3C2440_GPJ3_OUTP (0x01 << 6)
#define S3C2440_GPJ3_CAMDATA3 (0x02 << 6) #define S3C2440_GPJ3_CAMDATA3 (0x02 << 6)
#define S3C2440_GPJ4 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 4)
#define S3C2440_GPJ4_INP (0x00 << 8)
#define S3C2440_GPJ4_OUTP (0x01 << 8) #define S3C2440_GPJ4_OUTP (0x01 << 8)
#define S3C2440_GPJ4_CAMDATA4 (0x02 << 8) #define S3C2440_GPJ4_CAMDATA4 (0x02 << 8)
#define S3C2440_GPJ5 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 5)
#define S3C2440_GPJ5_INP (0x00 << 10)
#define S3C2440_GPJ5_OUTP (0x01 << 10) #define S3C2440_GPJ5_OUTP (0x01 << 10)
#define S3C2440_GPJ5_CAMDATA5 (0x02 << 10) #define S3C2440_GPJ5_CAMDATA5 (0x02 << 10)
#define S3C2440_GPJ6 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 6)
#define S3C2440_GPJ6_INP (0x00 << 12)
#define S3C2440_GPJ6_OUTP (0x01 << 12) #define S3C2440_GPJ6_OUTP (0x01 << 12)
#define S3C2440_GPJ6_CAMDATA6 (0x02 << 12) #define S3C2440_GPJ6_CAMDATA6 (0x02 << 12)
#define S3C2440_GPJ7 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 7)
#define S3C2440_GPJ7_INP (0x00 << 14)
#define S3C2440_GPJ7_OUTP (0x01 << 14) #define S3C2440_GPJ7_OUTP (0x01 << 14)
#define S3C2440_GPJ7_CAMDATA7 (0x02 << 14) #define S3C2440_GPJ7_CAMDATA7 (0x02 << 14)
#define S3C2440_GPJ8 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 8)
#define S3C2440_GPJ8_INP (0x00 << 16)
#define S3C2440_GPJ8_OUTP (0x01 << 16) #define S3C2440_GPJ8_OUTP (0x01 << 16)
#define S3C2440_GPJ8_CAMPCLK (0x02 << 16) #define S3C2440_GPJ8_CAMPCLK (0x02 << 16)
#define S3C2440_GPJ9 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 9)
#define S3C2440_GPJ9_INP (0x00 << 18)
#define S3C2440_GPJ9_OUTP (0x01 << 18) #define S3C2440_GPJ9_OUTP (0x01 << 18)
#define S3C2440_GPJ9_CAMVSYNC (0x02 << 18) #define S3C2440_GPJ9_CAMVSYNC (0x02 << 18)
#define S3C2440_GPJ10 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 10)
#define S3C2440_GPJ10_INP (0x00 << 20)
#define S3C2440_GPJ10_OUTP (0x01 << 20) #define S3C2440_GPJ10_OUTP (0x01 << 20)
#define S3C2440_GPJ10_CAMHREF (0x02 << 20) #define S3C2440_GPJ10_CAMHREF (0x02 << 20)
#define S3C2440_GPJ11 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 11)
#define S3C2440_GPJ11_INP (0x00 << 22)
#define S3C2440_GPJ11_OUTP (0x01 << 22) #define S3C2440_GPJ11_OUTP (0x01 << 22)
#define S3C2440_GPJ11_CAMCLKOUT (0x02 << 22) #define S3C2440_GPJ11_CAMCLKOUT (0x02 << 22)
#define S3C2440_GPJ12 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 12)
#define S3C2440_GPJ12_INP (0x00 << 24)
#define S3C2440_GPJ12_OUTP (0x01 << 24) #define S3C2440_GPJ12_OUTP (0x01 << 24)
#define S3C2440_GPJ12_CAMRESET (0x02 << 24) #define S3C2440_GPJ12_CAMRESET (0x02 << 24)
#define S3C2443_GPJ13 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 13)
#define S3C2443_GPJ14 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 14)
#define S3C2443_GPJ15 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 15)
#endif /* __ASM_ARCH_REGS_GPIOJ_H */ #endif /* __ASM_ARCH_REGS_GPIOJ_H */
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
#include <plat/iic.h> #include <plat/iic.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/gpio-cfg.h>
#ifdef CONFIG_MTD_PARTITIONS #ifdef CONFIG_MTD_PARTITIONS
...@@ -225,8 +226,8 @@ static void amlm5900_init_pm(void) ...@@ -225,8 +226,8 @@ static void amlm5900_init_pm(void)
} else { } else {
enable_irq_wake(IRQ_EINT9); enable_irq_wake(IRQ_EINT9);
/* configure the suspend/resume status pin */ /* configure the suspend/resume status pin */
s3c2410_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_pullup(S3C2410_GPF(2), 0); s3c_gpio_setpull(S3C2410_GPF(2), S3C_GPIO_PULL_UP);
} }
} }
static void __init amlm5900_init(void) static void __init amlm5900_init(void)
......
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/cpu-freq.h> #include <plat/cpu-freq.h>
#include <plat/gpio-cfg.h>
#include <plat/audio-simtec.h> #include <plat/audio-simtec.h>
#include "usb-simtec.h" #include "usb-simtec.h"
...@@ -216,15 +217,13 @@ static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = { ...@@ -216,15 +217,13 @@ static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = {
static int bast_pm_suspend(struct sys_device *sd, pm_message_t state) static int bast_pm_suspend(struct sys_device *sd, pm_message_t state)
{ {
/* ensure that an nRESET is not generated on resume. */ /* ensure that an nRESET is not generated on resume. */
s3c2410_gpio_setpin(S3C2410_GPA(21), 1); gpio_direction_output(S3C2410_GPA(21), 1);
s3c2410_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPIO_OUTPUT);
return 0; return 0;
} }
static int bast_pm_resume(struct sys_device *sd) static int bast_pm_resume(struct sys_device *sd)
{ {
s3c2410_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT); s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
return 0; return 0;
} }
...@@ -658,6 +657,8 @@ static void __init bast_init(void) ...@@ -658,6 +657,8 @@ static void __init bast_init(void)
nor_simtec_init(); nor_simtec_init();
simtec_audio_add(NULL, true, &bast_audio); simtec_audio_add(NULL, true, &bast_audio);
WARN_ON(gpio_request(S3C2410_GPA(21), "bast nreset"));
s3c_cpufreq_setboard(&bast_cpufreq); s3c_cpufreq_setboard(&bast_cpufreq);
} }
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <plat/udc.h> #include <plat/udc.h>
#include <plat/iic.h> #include <plat/iic.h>
#include <plat/gpio-cfg.h>
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
...@@ -207,16 +208,16 @@ static int h1940_backlight_init(struct device *dev) ...@@ -207,16 +208,16 @@ static int h1940_backlight_init(struct device *dev)
{ {
gpio_request(S3C2410_GPB(0), "Backlight"); gpio_request(S3C2410_GPB(0), "Backlight");
s3c2410_gpio_setpin(S3C2410_GPB(0), 0); gpio_direction_output(S3C2410_GPB(0), 0);
s3c2410_gpio_pullup(S3C2410_GPB(0), 0); s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE);
s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0); s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0);
return 0; return 0;
} }
static void h1940_backlight_exit(struct device *dev) static void h1940_backlight_exit(struct device *dev)
{ {
s3c2410_gpio_cfgpin(S3C2410_GPB(0), 1/*S3C2410_GPB0_OUTP*/); gpio_direction_output(S3C2410_GPB(0), 1);
} }
static struct platform_pwm_backlight_data backlight_data = { static struct platform_pwm_backlight_data backlight_data = {
...@@ -245,18 +246,18 @@ static void h1940_lcd_power_set(struct plat_lcd_data *pd, ...@@ -245,18 +246,18 @@ static void h1940_lcd_power_set(struct plat_lcd_data *pd,
if (!power) { if (!power) {
/* set to 3ec */ /* set to 3ec */
s3c2410_gpio_setpin(S3C2410_GPC(0), 0); gpio_direction_output(S3C2410_GPC(0), 0);
/* wait for 3ac */ /* wait for 3ac */
do { do {
value = s3c2410_gpio_getpin(S3C2410_GPC(6)); value = gpio_get_value(S3C2410_GPC(6));
} while (value); } while (value);
/* set to 38c */ /* set to 38c */
s3c2410_gpio_setpin(S3C2410_GPC(5), 0); gpio_direction_output(S3C2410_GPC(5), 0);
} else { } else {
/* Set to 3ac */ /* Set to 3ac */
s3c2410_gpio_setpin(S3C2410_GPC(5), 1); gpio_direction_output(S3C2410_GPC(5), 1);
/* Set to 3ad */ /* Set to 3ad */
s3c2410_gpio_setpin(S3C2410_GPC(0), 1); gpio_direction_output(S3C2410_GPC(0), 1);
} }
} }
...@@ -333,6 +334,7 @@ static void __init h1940_init(void) ...@@ -333,6 +334,7 @@ static void __init h1940_init(void)
gpio_request(S3C2410_GPC(5), "LCD power"); gpio_request(S3C2410_GPC(5), "LCD power");
gpio_request(S3C2410_GPC(6), "LCD power"); gpio_request(S3C2410_GPC(6), "LCD power");
gpio_direction_input(S3C2410_GPC(6));
platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices)); platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices));
} }
......
...@@ -596,6 +596,9 @@ static void __init n30_init(void) ...@@ -596,6 +596,9 @@ static void __init n30_init(void)
platform_add_devices(n35_devices, ARRAY_SIZE(n35_devices)); platform_add_devices(n35_devices, ARRAY_SIZE(n35_devices));
} }
WARN_ON(gpio_request(S3C2410_GPB(3), "udc pup"));
gpio_direction_output(S3C2410_GPB(3), 0);
} }
MACHINE_START(N30, "Acer-N30") MACHINE_START(N30, "Acer-N30")
......
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#include <plat/iic.h> #include <plat/iic.h>
#include <plat/common-smdk.h> #include <plat/common-smdk.h>
#include <plat/gpio-cfg.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/pm.h> #include <plat/pm.h>
...@@ -219,10 +220,10 @@ static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int cs) ...@@ -219,10 +220,10 @@ static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int cs)
{ {
switch (cs) { switch (cs) {
case BITBANG_CS_ACTIVE: case BITBANG_CS_ACTIVE:
s3c2410_gpio_setpin(S3C2410_GPB(5), 0); gpio_set_value(S3C2410_GPB(5), 0);
break; break;
case BITBANG_CS_INACTIVE: case BITBANG_CS_INACTIVE:
s3c2410_gpio_setpin(S3C2410_GPB(5), 1); gpio_set_value(S3C2410_GPB(5), 1);
break; break;
} }
} }
...@@ -347,13 +348,14 @@ static void __init qt2410_machine_init(void) ...@@ -347,13 +348,14 @@ static void __init qt2410_machine_init(void)
} }
s3c24xx_fb_set_platdata(&qt2410_fb_info); s3c24xx_fb_set_platdata(&qt2410_fb_info);
s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPB(0), 1); s3c2410_gpio_setpin(S3C2410_GPB(0), 1);
s3c24xx_udc_set_platdata(&qt2410_udc_cfg); s3c24xx_udc_set_platdata(&qt2410_udc_cfg);
s3c_i2c0_set_platdata(NULL); s3c_i2c0_set_platdata(NULL);
s3c2410_gpio_cfgpin(S3C2410_GPB(5), S3C2410_GPIO_OUTPUT); WARN_ON(gpio_request(S3C2410_GPB(5), "spi cs"));
gpio_direction_output(S3C2410_GPB(5), 1);
platform_add_devices(qt2410_devices, ARRAY_SIZE(qt2410_devices)); platform_add_devices(qt2410_devices, ARRAY_SIZE(qt2410_devices));
s3c_pm_init(); s3c_pm_init();
......
...@@ -357,8 +357,7 @@ static struct clk *vr1000_clocks[] __initdata = { ...@@ -357,8 +357,7 @@ static struct clk *vr1000_clocks[] __initdata = {
static void vr1000_power_off(void) static void vr1000_power_off(void)
{ {
s3c2410_gpio_cfgpin(S3C2410_GPB(9), S3C2410_GPIO_OUTPUT); gpio_direction_output(S3C2410_GPB(9), 1);
s3c2410_gpio_setpin(S3C2410_GPB(9), 1);
} }
static void __init vr1000_map_io(void) static void __init vr1000_map_io(void)
...@@ -395,6 +394,8 @@ static void __init vr1000_init(void) ...@@ -395,6 +394,8 @@ static void __init vr1000_init(void)
nor_simtec_init(); nor_simtec_init();
simtec_audio_add(NULL, true, NULL); simtec_audio_add(NULL, true, NULL);
WARN_ON(gpio_request(S3C2410_GPB(9), "power off"));
} }
MACHINE_START(VR1000, "Thorcom-VR1000") MACHINE_START(VR1000, "Thorcom-VR1000")
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/gpio.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
...@@ -40,6 +41,10 @@ ...@@ -40,6 +41,10 @@
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/pll.h> #include <plat/pll.h>
#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
#include <plat/gpio-cfg-helpers.h>
/* Initial IO mappings */ /* Initial IO mappings */
static struct map_desc s3c2410_iodesc[] __initdata = { static struct map_desc s3c2410_iodesc[] __initdata = {
...@@ -65,6 +70,9 @@ void __init s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no) ...@@ -65,6 +70,9 @@ void __init s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no)
void __init s3c2410_map_io(void) void __init s3c2410_map_io(void)
{ {
s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc)); iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc));
} }
......
...@@ -16,41 +16,43 @@ ...@@ -16,41 +16,43 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/gpio.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/regs-gpio.h> #include <mach/regs-gpio.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <plat/gpio-core.h>
int s3c2412_gpio_set_sleepcfg(unsigned int pin, unsigned int state) int s3c2412_gpio_set_sleepcfg(unsigned int pin, unsigned int state)
{ {
void __iomem *base = S3C24XX_GPIO_BASE(pin); struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
unsigned long offs = S3C2410_GPIO_OFFSET(pin); unsigned long offs = pin - chip->chip.base;
unsigned long flags; unsigned long flags;
unsigned long slpcon; unsigned long slpcon;
offs *= 2; offs *= 2;
if (pin < S3C2410_GPIO_BANKB) if (pin < S3C2410_GPB(0))
return -EINVAL; return -EINVAL;
if (pin >= S3C2410_GPIO_BANKF && if (pin >= S3C2410_GPF(0) &&
pin <= S3C2410_GPIO_BANKG) pin <= S3C2410_GPG(16))
return -EINVAL; return -EINVAL;
if (pin > (S3C2410_GPIO_BANKH + 32)) if (pin > S3C2410_GPH(16))
return -EINVAL; return -EINVAL;
local_irq_save(flags); local_irq_save(flags);
slpcon = __raw_readl(base + 0x0C); slpcon = __raw_readl(chip->base + 0x0C);
slpcon &= ~(3 << offs); slpcon &= ~(3 << offs);
slpcon |= state << offs; slpcon |= state << offs;
__raw_writel(slpcon, base + 0x0C); __raw_writel(slpcon, chip->base + 0x0C);
local_irq_restore(flags); local_irq_restore(flags);
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include <linux/mtd/nand_ecc.h> #include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <plat/gpio-cfg.h>
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
...@@ -357,8 +358,7 @@ static void jive_lcm_reset(unsigned int set) ...@@ -357,8 +358,7 @@ static void jive_lcm_reset(unsigned int set)
{ {
printk(KERN_DEBUG "%s(%d)\n", __func__, set); printk(KERN_DEBUG "%s(%d)\n", __func__, set);
s3c2410_gpio_setpin(S3C2410_GPG(13), set); gpio_set_value(S3C2410_GPG(13), set);
s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPIO_OUTPUT);
} }
#undef LCD_UPPER_MARGIN #undef LCD_UPPER_MARGIN
...@@ -391,7 +391,7 @@ static struct ili9320_platdata jive_lcm_config = { ...@@ -391,7 +391,7 @@ static struct ili9320_platdata jive_lcm_config = {
static void jive_lcd_spi_chipselect(struct s3c2410_spigpio_info *spi, int cs) static void jive_lcd_spi_chipselect(struct s3c2410_spigpio_info *spi, int cs)
{ {
s3c2410_gpio_setpin(S3C2410_GPB(7), cs ? 0 : 1); gpio_set_value(S3C2410_GPB(7), cs ? 0 : 1);
} }
static struct s3c2410_spigpio_info jive_lcd_spi = { static struct s3c2410_spigpio_info jive_lcd_spi = {
...@@ -413,7 +413,7 @@ static struct platform_device jive_device_lcdspi = { ...@@ -413,7 +413,7 @@ static struct platform_device jive_device_lcdspi = {
static void jive_wm8750_chipselect(struct s3c2410_spigpio_info *spi, int cs) static void jive_wm8750_chipselect(struct s3c2410_spigpio_info *spi, int cs)
{ {
s3c2410_gpio_setpin(S3C2410_GPH(10), cs ? 0 : 1); gpio_set_value(S3C2410_GPH(10), cs ? 0 : 1);
} }
static struct s3c2410_spigpio_info jive_wm8750_spi = { static struct s3c2410_spigpio_info jive_wm8750_spi = {
...@@ -531,7 +531,7 @@ static void jive_power_off(void) ...@@ -531,7 +531,7 @@ static void jive_power_off(void)
printk(KERN_INFO "powering system down...\n"); printk(KERN_INFO "powering system down...\n");
s3c2410_gpio_setpin(S3C2410_GPC(5), 1); s3c2410_gpio_setpin(S3C2410_GPC(5), 1);
s3c2410_gpio_cfgpin(S3C2410_GPC(5), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPC(5), S3C2410_GPIO_OUTPUT);
} }
static void __init jive_machine_init(void) static void __init jive_machine_init(void)
...@@ -636,22 +636,22 @@ static void __init jive_machine_init(void) ...@@ -636,22 +636,22 @@ static void __init jive_machine_init(void)
/* initialise the spi */ /* initialise the spi */
s3c2410_gpio_setpin(S3C2410_GPG(13), 0); gpio_request(S3C2410_GPG(13), "lcm reset");
s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPIO_OUTPUT); gpio_direction_output(S3C2410_GPG(13), 0);
s3c2410_gpio_setpin(S3C2410_GPB(7), 1); gpio_request(S3C2410_GPB(7), "jive spi");
s3c2410_gpio_cfgpin(S3C2410_GPB(7), S3C2410_GPIO_OUTPUT); gpio_direction_output(S3C2410_GPB(7), 1);
s3c2410_gpio_setpin(S3C2410_GPB(6), 0); s3c2410_gpio_setpin(S3C2410_GPB(6), 0);
s3c2410_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPG(8), 1); s3c2410_gpio_setpin(S3C2410_GPG(8), 1);
s3c2410_gpio_cfgpin(S3C2410_GPG(8), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPG(8), S3C2410_GPIO_OUTPUT);
/* initialise the WM8750 spi */ /* initialise the WM8750 spi */
s3c2410_gpio_setpin(S3C2410_GPH(10), 1); gpio_request(S3C2410_GPH(10), "jive wm8750 spi");
s3c2410_gpio_cfgpin(S3C2410_GPH(10), S3C2410_GPIO_OUTPUT); gpio_direction_output(S3C2410_GPH(10), 1);
/* Turn off suspend on both USB ports, and switch the /* Turn off suspend on both USB ports, and switch the
* selectable USB port to USB device mode. */ * selectable USB port to USB device mode. */
......
...@@ -85,10 +85,10 @@ static void smdk2413_udc_pullup(enum s3c2410_udc_cmd_e cmd) ...@@ -85,10 +85,10 @@ static void smdk2413_udc_pullup(enum s3c2410_udc_cmd_e cmd)
switch (cmd) switch (cmd)
{ {
case S3C2410_UDC_P_ENABLE : case S3C2410_UDC_P_ENABLE :
s3c2410_gpio_setpin(S3C2410_GPF(2), 1); gpio_set_value(S3C2410_GPF(2), 1);
break; break;
case S3C2410_UDC_P_DISABLE : case S3C2410_UDC_P_DISABLE :
s3c2410_gpio_setpin(S3C2410_GPF(2), 0); gpio_set_value(S3C2410_GPF(2), 0);
break; break;
case S3C2410_UDC_P_RESET : case S3C2410_UDC_P_RESET :
break; break;
...@@ -134,8 +134,8 @@ static void __init smdk2413_machine_init(void) ...@@ -134,8 +134,8 @@ static void __init smdk2413_machine_init(void)
{ /* Turn off suspend on both USB ports, and switch the { /* Turn off suspend on both USB ports, and switch the
* selectable USB port to USB device mode. */ * selectable USB port to USB device mode. */
s3c2410_gpio_setpin(S3C2410_GPF(2), 0); WARN_ON(gpio_request(S3C2410_GPF(2), "udc pull"));
s3c2410_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT); gpio_direction_output(S3C2410_GPF(2), 0);
s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |
S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND0 |
......
...@@ -6,6 +6,7 @@ config CPU_S3C2440 ...@@ -6,6 +6,7 @@ config CPU_S3C2440
bool bool
depends on ARCH_S3C2410 depends on ARCH_S3C2410
select CPU_ARM920T select CPU_ARM920T
select S3C_GPIO_PULL_UP
select S3C2410_CLOCK select S3C2410_CLOCK
select S3C2410_PM if PM select S3C2410_PM if PM
select S3C2410_GPIO select S3C2410_GPIO
......
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
#include <linux/mtd/nand_ecc.h> #include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <plat/gpio-cfg.h>
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
...@@ -102,10 +103,10 @@ static void mini2440_udc_pullup(enum s3c2410_udc_cmd_e cmd) ...@@ -102,10 +103,10 @@ static void mini2440_udc_pullup(enum s3c2410_udc_cmd_e cmd)
switch (cmd) { switch (cmd) {
case S3C2410_UDC_P_ENABLE : case S3C2410_UDC_P_ENABLE :
s3c2410_gpio_setpin(S3C2410_GPC(5), 1); gpio_set_value(S3C2410_GPC(5), 1);
break; break;
case S3C2410_UDC_P_DISABLE : case S3C2410_UDC_P_DISABLE :
s3c2410_gpio_setpin(S3C2410_GPC(5), 0); gpio_set_value(S3C2410_GPC(5), 0);
break; break;
case S3C2410_UDC_P_RESET : case S3C2410_UDC_P_RESET :
break; break;
...@@ -632,25 +633,25 @@ static void __init mini2440_init(void) ...@@ -632,25 +633,25 @@ static void __init mini2440_init(void)
mini2440_parse_features(&features, mini2440_features_str); mini2440_parse_features(&features, mini2440_features_str);
/* turn LCD on */ /* turn LCD on */
s3c2410_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND); s3c_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND);
/* Turn the backlight early on */ /* Turn the backlight early on */
s3c2410_gpio_setpin(S3C2410_GPG(4), 1); WARN_ON(gpio_request(S3C2410_GPG(4), "backlight"));
s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT); gpio_direction_output(S3C2410_GPG(4), 1);
/* remove pullup on optional PWM backlight -- unused on 3.5 and 7"s */ /* remove pullup on optional PWM backlight -- unused on 3.5 and 7"s */
s3c2410_gpio_pullup(S3C2410_GPB(1), 0); s3c_gpio_setpull(S3C2410_GPB(1), S3C_GPIO_PULL_UP);
s3c2410_gpio_setpin(S3C2410_GPB(1), 0); s3c2410_gpio_setpin(S3C2410_GPB(1), 0);
s3c2410_gpio_cfgpin(S3C2410_GPB(1), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPB(1), S3C2410_GPIO_INPUT);
/* Make sure the D+ pullup pin is output */ /* Make sure the D+ pullup pin is output */
s3c2410_gpio_cfgpin(S3C2410_GPC(5), S3C2410_GPIO_OUTPUT); WARN_ON(gpio_request(S3C2410_GPC(5), "udc pup"));
gpio_direction_output(S3C2410_GPC(5), 0);
/* mark the key as input, without pullups (there is one on the board) */ /* mark the key as input, without pullups (there is one on the board) */
for (i = 0; i < ARRAY_SIZE(mini2440_buttons); i++) { for (i = 0; i < ARRAY_SIZE(mini2440_buttons); i++) {
s3c2410_gpio_pullup(mini2440_buttons[i].gpio, 0); s3c_gpio_setpull(mini2440_buttons[i].gpio, S3C_GPIO_PULL_UP);
s3c2410_gpio_cfgpin(mini2440_buttons[i].gpio, s3c_gpio_cfgpin(mini2440_buttons[i].gpio, S3C2410_GPIO_INPUT);
S3C2410_GPIO_INPUT);
} }
if (features.lcd_index != -1) { if (features.lcd_index != -1) {
int li; int li;
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <plat/regs-serial.h> #include <plat/regs-serial.h>
#include <plat/iic.h> #include <plat/iic.h>
#include <plat/gpio-cfg.h>
#include <plat/s3c2410.h> #include <plat/s3c2410.h>
#include <plat/s3c244x.h> #include <plat/s3c244x.h>
#include <plat/clock.h> #include <plat/clock.h>
...@@ -122,15 +123,15 @@ static void __init nexcoder_sensorboard_init(void) ...@@ -122,15 +123,15 @@ static void __init nexcoder_sensorboard_init(void)
{ {
// Initialize SCCB bus // Initialize SCCB bus
s3c2410_gpio_setpin(S3C2410_GPE(14), 1); // IICSCL s3c2410_gpio_setpin(S3C2410_GPE(14), 1); // IICSCL
s3c2410_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPE(15), 1); // IICSDA s3c2410_gpio_setpin(S3C2410_GPE(15), 1); // IICSDA
s3c2410_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPIO_OUTPUT);
// Power up the sensor board // Power up the sensor board
s3c2410_gpio_setpin(S3C2410_GPF(1), 1); s3c2410_gpio_setpin(S3C2410_GPF(1), 1);
s3c2410_gpio_cfgpin(S3C2410_GPF(1), S3C2410_GPIO_OUTPUT); // CAM_GPIO7 => nLDO_PWRDN s3c_gpio_cfgpin(S3C2410_GPF(1), S3C2410_GPIO_OUTPUT); // CAM_GPIO7 => nLDO_PWRDN
s3c2410_gpio_setpin(S3C2410_GPF(2), 0); s3c2410_gpio_setpin(S3C2410_GPF(2), 0);
s3c2410_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT); // CAM_GPIO6 => CAM_PWRDN s3c_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT); // CAM_GPIO6 => CAM_PWRDN
} }
static void __init nexcoder_map_io(void) static void __init nexcoder_map_io(void)
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include <linux/mtd/nand_ecc.h> #include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <plat/gpio-cfg.h>
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
...@@ -298,7 +299,7 @@ static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state) ...@@ -298,7 +299,7 @@ static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
/* ensure that an nRESET is not generated on resume. */ /* ensure that an nRESET is not generated on resume. */
s3c2410_gpio_setpin(S3C2410_GPA(21), 1); s3c2410_gpio_setpin(S3C2410_GPA(21), 1);
s3c2410_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPIO_OUTPUT);
return 0; return 0;
} }
...@@ -310,7 +311,7 @@ static int osiris_pm_resume(struct sys_device *sd) ...@@ -310,7 +311,7 @@ static int osiris_pm_resume(struct sys_device *sd)
__raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0); __raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);
s3c2410_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT); s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
return 0; return 0;
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/gpio.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -33,6 +34,10 @@ ...@@ -33,6 +34,10 @@
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/s3c244x.h> #include <plat/s3c244x.h>
#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
#include <plat/gpio-cfg-helpers.h>
static struct sys_device s3c2440_sysdev = { static struct sys_device s3c2440_sysdev = {
.cls = &s3c2440_sysclass, .cls = &s3c2440_sysclass,
}; };
...@@ -41,6 +46,9 @@ int __init s3c2440_init(void) ...@@ -41,6 +46,9 @@ int __init s3c2440_init(void)
{ {
printk("S3C2440: Initialising architecture\n"); printk("S3C2440: Initialising architecture\n");
s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
/* change irq for watchdog */ /* change irq for watchdog */
s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT; s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
static struct s3c_gpio_cfg gpio_4bit_cfg_noint = { static struct s3c_gpio_cfg gpio_4bit_cfg_noint = {
.set_config = s3c_gpio_setcfg_s3c64xx_4bit, .set_config = s3c_gpio_setcfg_s3c64xx_4bit,
.get_config = s3c_gpio_getcfg_s3c64xx_4bit,
.set_pull = s3c_gpio_setpull_updown, .set_pull = s3c_gpio_setpull_updown,
.get_pull = s3c_gpio_getpull_updown, .get_pull = s3c_gpio_getpull_updown,
}; };
...@@ -58,12 +59,14 @@ static struct s3c_gpio_cfg gpio_4bit_cfg_noint = { ...@@ -58,12 +59,14 @@ static struct s3c_gpio_cfg gpio_4bit_cfg_noint = {
static struct s3c_gpio_cfg gpio_4bit_cfg_eint0111 = { static struct s3c_gpio_cfg gpio_4bit_cfg_eint0111 = {
.cfg_eint = 7, .cfg_eint = 7,
.set_config = s3c_gpio_setcfg_s3c64xx_4bit, .set_config = s3c_gpio_setcfg_s3c64xx_4bit,
.get_config = s3c_gpio_getcfg_s3c64xx_4bit,
.set_pull = s3c_gpio_setpull_updown, .set_pull = s3c_gpio_setpull_updown,
.get_pull = s3c_gpio_getpull_updown, .get_pull = s3c_gpio_getpull_updown,
}; };
static struct s3c_gpio_cfg gpio_4bit_cfg_eint0011 = { static struct s3c_gpio_cfg gpio_4bit_cfg_eint0011 = {
.cfg_eint = 3, .cfg_eint = 3,
.get_config = s3c_gpio_getcfg_s3c64xx_4bit,
.set_config = s3c_gpio_setcfg_s3c64xx_4bit, .set_config = s3c_gpio_setcfg_s3c64xx_4bit,
.set_pull = s3c_gpio_setpull_updown, .set_pull = s3c_gpio_setpull_updown,
.get_pull = s3c_gpio_getpull_updown, .get_pull = s3c_gpio_getpull_updown,
...@@ -171,6 +174,7 @@ static struct s3c_gpio_chip gpio_4bit2[] = { ...@@ -171,6 +174,7 @@ static struct s3c_gpio_chip gpio_4bit2[] = {
static struct s3c_gpio_cfg gpio_2bit_cfg_noint = { static struct s3c_gpio_cfg gpio_2bit_cfg_noint = {
.set_config = s3c_gpio_setcfg_s3c24xx, .set_config = s3c_gpio_setcfg_s3c24xx,
.get_config = s3c_gpio_getcfg_s3c24xx,
.set_pull = s3c_gpio_setpull_updown, .set_pull = s3c_gpio_setpull_updown,
.get_pull = s3c_gpio_getpull_updown, .get_pull = s3c_gpio_getpull_updown,
}; };
...@@ -178,6 +182,7 @@ static struct s3c_gpio_cfg gpio_2bit_cfg_noint = { ...@@ -178,6 +182,7 @@ static struct s3c_gpio_cfg gpio_2bit_cfg_noint = {
static struct s3c_gpio_cfg gpio_2bit_cfg_eint10 = { static struct s3c_gpio_cfg gpio_2bit_cfg_eint10 = {
.cfg_eint = 2, .cfg_eint = 2,
.set_config = s3c_gpio_setcfg_s3c24xx, .set_config = s3c_gpio_setcfg_s3c24xx,
.get_config = s3c_gpio_getcfg_s3c24xx,
.set_pull = s3c_gpio_setpull_updown, .set_pull = s3c_gpio_setpull_updown,
.get_pull = s3c_gpio_getpull_updown, .get_pull = s3c_gpio_getpull_updown,
}; };
...@@ -185,6 +190,7 @@ static struct s3c_gpio_cfg gpio_2bit_cfg_eint10 = { ...@@ -185,6 +190,7 @@ static struct s3c_gpio_cfg gpio_2bit_cfg_eint10 = {
static struct s3c_gpio_cfg gpio_2bit_cfg_eint11 = { static struct s3c_gpio_cfg gpio_2bit_cfg_eint11 = {
.cfg_eint = 3, .cfg_eint = 3,
.set_config = s3c_gpio_setcfg_s3c24xx, .set_config = s3c_gpio_setcfg_s3c24xx,
.get_config = s3c_gpio_getcfg_s3c24xx,
.set_pull = s3c_gpio_setpull_updown, .set_pull = s3c_gpio_setpull_updown,
.get_pull = s3c_gpio_getpull_updown, .get_pull = s3c_gpio_getpull_updown,
}; };
......
...@@ -161,12 +161,15 @@ static struct s3c_gpio_cfg s5p6440_gpio_cfgs[] = { ...@@ -161,12 +161,15 @@ static struct s3c_gpio_cfg s5p6440_gpio_cfgs[] = {
}, { }, {
.cfg_eint = 0, .cfg_eint = 0,
.set_config = s3c_gpio_setcfg_s3c24xx, .set_config = s3c_gpio_setcfg_s3c24xx,
.get_config = s3c_gpio_getcfg_s3c24xx,
}, { }, {
.cfg_eint = 2, .cfg_eint = 2,
.set_config = s3c_gpio_setcfg_s3c24xx, .set_config = s3c_gpio_setcfg_s3c24xx,
.get_config = s3c_gpio_getcfg_s3c24xx,
}, { }, {
.cfg_eint = 3, .cfg_eint = 3,
.set_config = s3c_gpio_setcfg_s3c24xx, .set_config = s3c_gpio_setcfg_s3c24xx,
.get_config = s3c_gpio_getcfg_s3c24xx,
}, },
}; };
...@@ -279,6 +282,8 @@ void __init s5p6440_gpiolib_set_cfg(struct s3c_gpio_cfg *chipcfg, int nr_chips) ...@@ -279,6 +282,8 @@ void __init s5p6440_gpiolib_set_cfg(struct s3c_gpio_cfg *chipcfg, int nr_chips)
for (; nr_chips > 0; nr_chips--, chipcfg++) { for (; nr_chips > 0; nr_chips--, chipcfg++) {
if (!chipcfg->set_config) if (!chipcfg->set_config)
chipcfg->set_config = s3c_gpio_setcfg_s3c64xx_4bit; chipcfg->set_config = s3c_gpio_setcfg_s3c64xx_4bit;
if (!chipcfg->get_config)
chipcfg->get_config = s3c_gpio_getcfg_s3c64xx_4bit;
if (!chipcfg->set_pull) if (!chipcfg->set_pull)
chipcfg->set_pull = s3c_gpio_setpull_updown; chipcfg->set_pull = s3c_gpio_setpull_updown;
if (!chipcfg->get_pull) if (!chipcfg->get_pull)
......
...@@ -9,6 +9,7 @@ config PLAT_S3C24XX ...@@ -9,6 +9,7 @@ config PLAT_S3C24XX
select NO_IOPORT select NO_IOPORT
select ARCH_REQUIRE_GPIOLIB select ARCH_REQUIRE_GPIOLIB
select S3C_DEVICE_NAND select S3C_DEVICE_NAND
select S3C_GPIO_CFG_S3C24XX
help help
Base platform code for any Samsung S3C24XX device Base platform code for any Samsung S3C24XX device
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include <plat/nand.h> #include <plat/nand.h>
#include <plat/common-smdk.h> #include <plat/common-smdk.h>
#include <plat/gpio-cfg.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/pm.h> #include <plat/pm.h>
...@@ -185,10 +186,10 @@ void __init smdk_machine_init(void) ...@@ -185,10 +186,10 @@ void __init smdk_machine_init(void)
{ {
/* Configure the LEDs (even if we have no LED support)*/ /* Configure the LEDs (even if we have no LED support)*/
s3c2410_gpio_cfgpin(S3C2410_GPF(4), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPF(4), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPF(5), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPF(5), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPF(6), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPF(6), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPF(7), S3C2410_GPIO_OUTPUT); s3c_gpio_cfgpin(S3C2410_GPF(7), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPF(4), 1); s3c2410_gpio_setpin(S3C2410_GPF(4), 1);
s3c2410_gpio_setpin(S3C2410_GPF(5), 1); s3c2410_gpio_setpin(S3C2410_GPF(5), 1);
......
/* linux/arch/arm/plat-s3c24xx/gpio.c /* linux/arch/arm/plat-s3c24xx/gpio.c
* *
* Copyright (c) 2004-2005 Simtec Electronics * Copyright (c) 2004-2010 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk> * Ben Dooks <ben@simtec.co.uk>
* *
* S3C24XX GPIO support * S3C24XX GPIO support
...@@ -20,12 +20,12 @@ ...@@ -20,12 +20,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/gpio.h>
#include <linux/io.h> #include <linux/io.h>
#include <mach/hardware.h> #include <mach/hardware.h>
...@@ -34,133 +34,46 @@ ...@@ -34,133 +34,46 @@
#include <mach/regs-gpio.h> #include <mach/regs-gpio.h>
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function) #include <plat/gpio-core.h>
{
void __iomem *base = S3C24XX_GPIO_BASE(pin);
unsigned long mask;
unsigned long con;
unsigned long flags;
if (pin < S3C2410_GPIO_BANKB) { /* gpiolib wrappers until these are totally eliminated */
mask = 1 << S3C2410_GPIO_OFFSET(pin);
} else {
mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;
}
switch (function) {
case S3C2410_GPIO_LEAVE:
mask = 0;
function = 0;
break;
case S3C2410_GPIO_INPUT:
case S3C2410_GPIO_OUTPUT:
case S3C2410_GPIO_SFN2:
case S3C2410_GPIO_SFN3:
if (pin < S3C2410_GPIO_BANKB) {
function -= 1;
function &= 1;
function <<= S3C2410_GPIO_OFFSET(pin);
} else {
function &= 3;
function <<= S3C2410_GPIO_OFFSET(pin)*2;
}
}
/* modify the specified register wwith IRQs off */
local_irq_save(flags);
con = __raw_readl(base + 0x00);
con &= ~mask;
con |= function;
__raw_writel(con, base + 0x00);
local_irq_restore(flags);
}
EXPORT_SYMBOL(s3c2410_gpio_cfgpin);
unsigned int s3c2410_gpio_getcfg(unsigned int pin)
{
void __iomem *base = S3C24XX_GPIO_BASE(pin);
unsigned long val = __raw_readl(base);
if (pin < S3C2410_GPIO_BANKB) {
val >>= S3C2410_GPIO_OFFSET(pin);
val &= 1;
val += 1;
} else {
val >>= S3C2410_GPIO_OFFSET(pin)*2;
val &= 3;
}
return val | S3C2410_GPIO_INPUT;
}
EXPORT_SYMBOL(s3c2410_gpio_getcfg);
void s3c2410_gpio_pullup(unsigned int pin, unsigned int to) void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)
{ {
void __iomem *base = S3C24XX_GPIO_BASE(pin); int ret;
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
unsigned long flags;
unsigned long up;
if (pin < S3C2410_GPIO_BANKB) WARN_ON(to); /* should be none of these left */
return;
local_irq_save(flags); if (!to) {
/* if pull is enabled, try first with up, and if that
up = __raw_readl(base + 0x08); * fails, try using down */
up &= ~(1L << offs);
up |= to << offs;
__raw_writel(up, base + 0x08);
local_irq_restore(flags); ret = s3c_gpio_setpull(pin, S3C_GPIO_PULL_UP);
if (ret)
s3c_gpio_setpull(pin, S3C_GPIO_PULL_DOWN);
} else {
s3c_gpio_setpull(pin, S3C_GPIO_PULL_NONE);
}
} }
EXPORT_SYMBOL(s3c2410_gpio_pullup); EXPORT_SYMBOL(s3c2410_gpio_pullup);
int s3c2410_gpio_getpull(unsigned int pin)
{
void __iomem *base = S3C24XX_GPIO_BASE(pin);
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
if (pin < S3C2410_GPIO_BANKB)
return -EINVAL;
return (__raw_readl(base + 0x08) & (1L << offs)) ? 1 : 0;
}
EXPORT_SYMBOL(s3c2410_gpio_getpull);
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to) void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
{ {
void __iomem *base = S3C24XX_GPIO_BASE(pin); /* do this via gpiolib until all users removed */
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
unsigned long flags;
unsigned long dat;
local_irq_save(flags); gpio_request(pin, "temporary");
gpio_set_value(pin, to);
dat = __raw_readl(base + 0x04); gpio_free(pin);
dat &= ~(1 << offs);
dat |= to << offs;
__raw_writel(dat, base + 0x04);
local_irq_restore(flags);
} }
EXPORT_SYMBOL(s3c2410_gpio_setpin); EXPORT_SYMBOL(s3c2410_gpio_setpin);
unsigned int s3c2410_gpio_getpin(unsigned int pin) unsigned int s3c2410_gpio_getpin(unsigned int pin)
{ {
void __iomem *base = S3C24XX_GPIO_BASE(pin); struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
unsigned long offs = S3C2410_GPIO_OFFSET(pin); unsigned long offs = pin - chip->chip.base;
return __raw_readl(base + 0x04) & (1<< offs); return __raw_readl(chip->base + 0x04) & (1<< offs);
} }
EXPORT_SYMBOL(s3c2410_gpio_getpin); EXPORT_SYMBOL(s3c2410_gpio_getpin);
...@@ -181,22 +94,3 @@ unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change) ...@@ -181,22 +94,3 @@ unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change)
} }
EXPORT_SYMBOL(s3c2410_modify_misccr); EXPORT_SYMBOL(s3c2410_modify_misccr);
int s3c2410_gpio_getirq(unsigned int pin)
{
if (pin < S3C2410_GPF(0) || pin > S3C2410_GPG(15))
return -EINVAL; /* not valid interrupts */
if (pin < S3C2410_GPG(0) && pin > S3C2410_GPF(7))
return -EINVAL; /* not valid pin */
if (pin < S3C2410_GPF(4))
return (pin - S3C2410_GPF(0)) + IRQ_EINT0;
if (pin < S3C2410_GPG(0))
return (pin - S3C2410_GPF(4)) + IRQ_EINT4;
return (pin - S3C2410_GPG(0)) + IRQ_EINT8;
}
EXPORT_SYMBOL(s3c2410_gpio_getirq);
/* linux/arch/arm/plat-s3c24xx/gpiolib.c /* linux/arch/arm/plat-s3c24xx/gpiolib.c
* *
* Copyright (c) 2008 Simtec Electronics * Copyright (c) 2008-2010 Simtec Electronics
* http://armlinux.simtec.co.uk/ * http://armlinux.simtec.co.uk/
* Ben Dooks <ben@simtec.co.uk> * Ben Dooks <ben@simtec.co.uk>
* *
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <plat/gpio-core.h> #include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
#include <plat/gpio-cfg-helpers.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <plat/pm.h> #include <plat/pm.h>
...@@ -77,10 +79,21 @@ static int s3c24xx_gpiolib_bankg_toirq(struct gpio_chip *chip, unsigned offset) ...@@ -77,10 +79,21 @@ static int s3c24xx_gpiolib_bankg_toirq(struct gpio_chip *chip, unsigned offset)
return IRQ_EINT8 + offset; return IRQ_EINT8 + offset;
} }
static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka = {
.set_config = s3c_gpio_setcfg_s3c24xx_a,
.get_config = s3c_gpio_getcfg_s3c24xx_a,
};
struct s3c_gpio_cfg s3c24xx_gpiocfg_default = {
.set_config = s3c_gpio_setcfg_s3c24xx,
.get_config = s3c_gpio_getcfg_s3c24xx,
};
struct s3c_gpio_chip s3c24xx_gpios[] = { struct s3c_gpio_chip s3c24xx_gpios[] = {
[0] = { [0] = {
.base = S3C2410_GPACON, .base = S3C2410_GPACON,
.pm = __gpio_pm(&s3c_gpio_pm_1bit), .pm = __gpio_pm(&s3c_gpio_pm_1bit),
.config = &s3c24xx_gpiocfg_banka,
.chip = { .chip = {
.base = S3C2410_GPA(0), .base = S3C2410_GPA(0),
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -161,15 +174,58 @@ struct s3c_gpio_chip s3c24xx_gpios[] = { ...@@ -161,15 +174,58 @@ struct s3c_gpio_chip s3c24xx_gpios[] = {
.ngpio = 11, .ngpio = 11,
}, },
}, },
/* GPIOS for the S3C2443 and later devices. */
{
.base = S3C2440_GPJCON,
.pm = __gpio_pm(&s3c_gpio_pm_2bit),
.chip = {
.base = S3C2410_GPJ(0),
.owner = THIS_MODULE,
.label = "GPIOJ",
.ngpio = 16,
},
}, {
.base = S3C2443_GPKCON,
.pm = __gpio_pm(&s3c_gpio_pm_2bit),
.chip = {
.base = S3C2410_GPK(0),
.owner = THIS_MODULE,
.label = "GPIOK",
.ngpio = 16,
},
}, {
.base = S3C2443_GPLCON,
.pm = __gpio_pm(&s3c_gpio_pm_2bit),
.chip = {
.base = S3C2410_GPL(0),
.owner = THIS_MODULE,
.label = "GPIOL",
.ngpio = 15,
},
}, {
.base = S3C2443_GPMCON,
.pm = __gpio_pm(&s3c_gpio_pm_2bit),
.chip = {
.base = S3C2410_GPM(0),
.owner = THIS_MODULE,
.label = "GPIOM",
.ngpio = 2,
},
},
}; };
static __init int s3c24xx_gpiolib_init(void) static __init int s3c24xx_gpiolib_init(void)
{ {
struct s3c_gpio_chip *chip = s3c24xx_gpios; struct s3c_gpio_chip *chip = s3c24xx_gpios;
int gpn; int gpn;
for (gpn = 0; gpn < ARRAY_SIZE(s3c24xx_gpios); gpn++, chip++) for (gpn = 0; gpn < ARRAY_SIZE(s3c24xx_gpios); gpn++, chip++) {
if (!chip->config)
chip->config = &s3c24xx_gpiocfg_default;
s3c_gpiolib_add(chip); s3c_gpiolib_add(chip);
}
return 0; return 0;
} }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <plat/gpio-cfg.h>
#include <plat/pm.h> #include <plat/pm.h>
#define PFX "s3c24xx-pm: " #define PFX "s3c24xx-pm: "
...@@ -90,22 +91,22 @@ static void s3c_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs) ...@@ -90,22 +91,22 @@ static void s3c_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs)
{ {
unsigned long irqstate; unsigned long irqstate;
unsigned long pinstate; unsigned long pinstate;
int irq = s3c2410_gpio_getirq(pin); int irq = gpio_to_irq(pin);
if (irqoffs < 4) if (irqoffs < 4)
irqstate = s3c_irqwake_intmask & (1L<<irqoffs); irqstate = s3c_irqwake_intmask & (1L<<irqoffs);
else else
irqstate = s3c_irqwake_eintmask & (1L<<irqoffs); irqstate = s3c_irqwake_eintmask & (1L<<irqoffs);
pinstate = s3c2410_gpio_getcfg(pin); pinstate = s3c_gpio_getcfg(pin);
if (!irqstate) { if (!irqstate) {
if (pinstate == S3C2410_GPIO_IRQ) if (pinstate == S3C2410_GPIO_IRQ)
S3C_PMDBG("Leaving IRQ %d (pin %d) enabled\n", irq, pin); S3C_PMDBG("Leaving IRQ %d (pin %d) as is\n", irq, pin);
} else { } else {
if (pinstate == S3C2410_GPIO_IRQ) { if (pinstate == S3C2410_GPIO_IRQ) {
S3C_PMDBG("Disabling IRQ %d (pin %d)\n", irq, pin); S3C_PMDBG("Disabling IRQ %d (pin %d)\n", irq, pin);
s3c2410_gpio_cfgpin(pin, S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(pin, S3C2410_GPIO_INPUT);
} }
} }
} }
......
...@@ -15,12 +15,13 @@ ...@@ -15,12 +15,13 @@
struct platform_device; struct platform_device;
#include <plat/gpio-cfg.h>
#include <plat/iic.h> #include <plat/iic.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/regs-gpio.h> #include <mach/regs-gpio.h>
void s3c_i2c0_cfg_gpio(struct platform_device *dev) void s3c_i2c0_cfg_gpio(struct platform_device *dev)
{ {
s3c2410_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPE15_IICSDA); s3c_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPE15_IICSDA);
s3c2410_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPE14_IICSCL); s3c_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPE14_IICSCL);
} }
...@@ -21,16 +21,16 @@ void s3c24xx_spi_gpiocfg_bus0_gpe11_12_13(struct s3c2410_spi_info *spi, ...@@ -21,16 +21,16 @@ void s3c24xx_spi_gpiocfg_bus0_gpe11_12_13(struct s3c2410_spi_info *spi,
int enable) int enable)
{ {
if (enable) { if (enable) {
s3c2410_gpio_cfgpin(S3C2410_GPE(13), S3C2410_GPE13_SPICLK0); s3c_gpio_cfgpin(S3C2410_GPE(13), S3C2410_GPE13_SPICLK0);
s3c2410_gpio_cfgpin(S3C2410_GPE(12), S3C2410_GPE12_SPIMOSI0); s3c_gpio_cfgpin(S3C2410_GPE(12), S3C2410_GPE12_SPIMOSI0);
s3c2410_gpio_cfgpin(S3C2410_GPE(11), S3C2410_GPE11_SPIMISO0); s3c_gpio_cfgpin(S3C2410_GPE(11), S3C2410_GPE11_SPIMISO0);
s3c2410_gpio_pullup(S3C2410_GPE(11), 0); s3c2410_gpio_pullup(S3C2410_GPE(11), 0);
s3c2410_gpio_pullup(S3C2410_GPE(13), 0); s3c2410_gpio_pullup(S3C2410_GPE(13), 0);
} else { } else {
s3c2410_gpio_cfgpin(S3C2410_GPE(13), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPE(13), S3C2410_GPIO_INPUT);
s3c2410_gpio_cfgpin(S3C2410_GPE(11), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPE(11), S3C2410_GPIO_INPUT);
s3c2410_gpio_pullup(S3C2410_GPE(11), 1); s3c_gpio_cfgpull(S3C2410_GPE(11), S3C_GPIO_PULL_NONE);
s3c2410_gpio_pullup(S3C2410_GPE(12), 1); s3c_gpio_cfgpull(S3C2410_GPE(12), S3C_GPIO_PULL_NONE);
s3c2410_gpio_pullup(S3C2410_GPE(13), 1); s3c_gpio_cfgpull(S3C2410_GPE(13), S3C_GPIO_PULL_NONE);
} }
} }
...@@ -23,16 +23,16 @@ void s3c24xx_spi_gpiocfg_bus1_gpd8_9_10(struct s3c2410_spi_info *spi, ...@@ -23,16 +23,16 @@ void s3c24xx_spi_gpiocfg_bus1_gpd8_9_10(struct s3c2410_spi_info *spi,
printk(KERN_INFO "%s(%d)\n", __func__, enable); printk(KERN_INFO "%s(%d)\n", __func__, enable);
if (enable) { if (enable) {
s3c2410_gpio_cfgpin(S3C2410_GPD(10), S3C2440_GPD10_SPICLK1); s3c_gpio_cfgpin(S3C2410_GPD(10), S3C2440_GPD10_SPICLK1);
s3c2410_gpio_cfgpin(S3C2410_GPD(9), S3C2440_GPD9_SPIMOSI1); s3c_gpio_cfgpin(S3C2410_GPD(9), S3C2440_GPD9_SPIMOSI1);
s3c2410_gpio_cfgpin(S3C2410_GPD(8), S3C2440_GPD8_SPIMISO1); s3c_gpio_cfgpin(S3C2410_GPD(8), S3C2440_GPD8_SPIMISO1);
s3c2410_gpio_pullup(S3C2410_GPD(10), 0); s3c2410_gpio_pullup(S3C2410_GPD(10), 0);
s3c2410_gpio_pullup(S3C2410_GPD(9), 0); s3c2410_gpio_pullup(S3C2410_GPD(9), 0);
} else { } else {
s3c2410_gpio_cfgpin(S3C2410_GPD(8), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPD(8), S3C2410_GPIO_INPUT);
s3c2410_gpio_cfgpin(S3C2410_GPD(9), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPD(9), S3C2410_GPIO_INPUT);
s3c2410_gpio_pullup(S3C2410_GPD(10), 1); s3c_gpio_cfgpull(S3C2410_GPD(10), S3C_GPIO_PULL_NONE);
s3c2410_gpio_pullup(S3C2410_GPD(9), 1); s3c_gpio_cfgpull(S3C2410_GPD(9), S3C_GPIO_PULL_NONE);
s3c2410_gpio_pullup(S3C2410_GPD(8), 1); s3c_gpio_cfgpull(S3C2410_GPD(8), S3C_GPIO_PULL_NONE);
} }
} }
...@@ -21,16 +21,16 @@ void s3c24xx_spi_gpiocfg_bus1_gpg5_6_7(struct s3c2410_spi_info *spi, ...@@ -21,16 +21,16 @@ void s3c24xx_spi_gpiocfg_bus1_gpg5_6_7(struct s3c2410_spi_info *spi,
int enable) int enable)
{ {
if (enable) { if (enable) {
s3c2410_gpio_cfgpin(S3C2410_GPG(7), S3C2410_GPG7_SPICLK1); s3c_gpio_cfgpin(S3C2410_GPG(7), S3C2410_GPG7_SPICLK1);
s3c2410_gpio_cfgpin(S3C2410_GPG(6), S3C2410_GPG6_SPIMOSI1); s3c_gpio_cfgpin(S3C2410_GPG(6), S3C2410_GPG6_SPIMOSI1);
s3c2410_gpio_cfgpin(S3C2410_GPG(5), S3C2410_GPG5_SPIMISO1); s3c_gpio_cfgpin(S3C2410_GPG(5), S3C2410_GPG5_SPIMISO1);
s3c2410_gpio_pullup(S3C2410_GPG(5), 0); s3c2410_gpio_pullup(S3C2410_GPG(5), 0);
s3c2410_gpio_pullup(S3C2410_GPG(6), 0); s3c2410_gpio_pullup(S3C2410_GPG(6), 0);
} else { } else {
s3c2410_gpio_cfgpin(S3C2410_GPG(7), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPG(7), S3C2410_GPIO_INPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG(5), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPG(5), S3C2410_GPIO_INPUT);
s3c2410_gpio_pullup(S3C2410_GPG(5), 1); s3c_gpio_cfgpull(S3C2410_GPG(5), S3C_GPIO_PULL_NONE);
s3c2410_gpio_pullup(S3C2410_GPG(6), 1); s3c_gpio_cfgpull(S3C2410_GPG(6), S3C_GPIO_PULL_NONE);
s3c2410_gpio_pullup(S3C2410_GPG(7), 1); s3c_gpio_cfgpull(S3C2410_GPG(7), S3C_GPIO_PULL_NONE);
} }
} }
/* linux/arch/arm/plat-s3c/gpio-config.c /* linux/arch/arm/plat-s3c/gpio-config.c
* *
* Copyright 2008 Openmoko, Inc. * Copyright 2008 Openmoko, Inc.
* Copyright 2008 Simtec Electronics * Copyright 2008-2010 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk> * Ben Dooks <ben@simtec.co.uk>
* http://armlinux.simtec.co.uk/ * http://armlinux.simtec.co.uk/
* *
...@@ -33,14 +33,34 @@ int s3c_gpio_cfgpin(unsigned int pin, unsigned int config) ...@@ -33,14 +33,34 @@ int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
offset = pin - chip->chip.base; offset = pin - chip->chip.base;
local_irq_save(flags); s3c_gpio_lock(chip, flags);
ret = s3c_gpio_do_setcfg(chip, offset, config); ret = s3c_gpio_do_setcfg(chip, offset, config);
local_irq_restore(flags); s3c_gpio_unlock(chip, flags);
return ret; return ret;
} }
EXPORT_SYMBOL(s3c_gpio_cfgpin); EXPORT_SYMBOL(s3c_gpio_cfgpin);
unsigned s3c_gpio_getcfg(unsigned int pin)
{
struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
unsigned long flags;
unsigned ret = 0;
int offset;
if (chip) {
offset = pin - chip->chip.base;
s3c_gpio_lock(chip, flags);
ret = s3c_gpio_do_getcfg(chip, offset);
s3c_gpio_unlock(chip, flags);
}
return ret;
}
EXPORT_SYMBOL(s3c_gpio_getcfg);
int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull) int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
{ {
struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin); struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
...@@ -52,17 +72,17 @@ int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull) ...@@ -52,17 +72,17 @@ int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
offset = pin - chip->chip.base; offset = pin - chip->chip.base;
local_irq_save(flags); s3c_gpio_lock(chip, flags);
ret = s3c_gpio_do_setpull(chip, offset, pull); ret = s3c_gpio_do_setpull(chip, offset, pull);
local_irq_restore(flags); s3c_gpio_unlock(chip, flags);
return ret; return ret;
} }
EXPORT_SYMBOL(s3c_gpio_setpull); EXPORT_SYMBOL(s3c_gpio_setpull);
#ifdef CONFIG_S3C_GPIO_CFG_S3C24XX #ifdef CONFIG_S3C_GPIO_CFG_S3C24XX
int s3c_gpio_setcfg_s3c24xx_banka(struct s3c_gpio_chip *chip, int s3c_gpio_setcfg_s3c24xx_a(struct s3c_gpio_chip *chip,
unsigned int off, unsigned int cfg) unsigned int off, unsigned int cfg)
{ {
void __iomem *reg = chip->base; void __iomem *reg = chip->base;
unsigned int shift = off; unsigned int shift = off;
...@@ -87,6 +107,19 @@ int s3c_gpio_setcfg_s3c24xx_banka(struct s3c_gpio_chip *chip, ...@@ -87,6 +107,19 @@ int s3c_gpio_setcfg_s3c24xx_banka(struct s3c_gpio_chip *chip,
return 0; return 0;
} }
unsigned s3c_gpio_getcfg_s3c24xx_a(struct s3c_gpio_chip *chip,
unsigned int off)
{
u32 con;
con = __raw_readl(chip->base);
con >>= off;
con &= 1;
con++;
return S3C_GPIO_SFN(con);
}
int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip, int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip,
unsigned int off, unsigned int cfg) unsigned int off, unsigned int cfg)
{ {
...@@ -109,6 +142,19 @@ int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip, ...@@ -109,6 +142,19 @@ int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip,
return 0; return 0;
} }
unsigned int s3c_gpio_getcfg_s3c24xx(struct s3c_gpio_chip *chip,
unsigned int off)
{
u32 con;
con = __raw_readl(chip->base);
con >>= off * 2;
con &= 3;
/* this conversion works for IN and OUT as well as special mode */
return S3C_GPIO_SPECIAL(con);
}
#endif #endif
#ifdef CONFIG_S3C_GPIO_CFG_S3C64XX #ifdef CONFIG_S3C_GPIO_CFG_S3C64XX
...@@ -134,6 +180,25 @@ int s3c_gpio_setcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip, ...@@ -134,6 +180,25 @@ int s3c_gpio_setcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip,
return 0; return 0;
} }
unsigned s3c_gpio_getcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip,
unsigned int off)
{
void __iomem *reg = chip->base;
unsigned int shift = (off & 7) * 4;
u32 con;
if (off < 8 && chip->chip.ngpio > 8)
reg -= 4;
con = __raw_readl(reg);
con >>= shift;
con &= 0xf;
/* this conversion works for IN and OUT as well as special mode */
return S3C_GPIO_SPECIAL(con);
}
#endif /* CONFIG_S3C_GPIO_CFG_S3C64XX */ #endif /* CONFIG_S3C_GPIO_CFG_S3C64XX */
#ifdef CONFIG_S3C_GPIO_PULL_UPDOWN #ifdef CONFIG_S3C_GPIO_PULL_UPDOWN
...@@ -164,3 +229,35 @@ s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip, ...@@ -164,3 +229,35 @@ s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
return (__force s3c_gpio_pull_t)pup; return (__force s3c_gpio_pull_t)pup;
} }
#endif #endif
#ifdef CONFIG_S3C_GPIO_PULL_UP
int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
unsigned int off, s3c_gpio_pull_t pull)
{
void __iomem *reg = chip->base + 0x08;
u32 pup = __raw_readl(reg);
pup = __raw_readl(reg);
if (pup == S3C_GPIO_PULL_UP)
pup &= ~(1 << off);
else if (pup == S3C_GPIO_PULL_NONE)
pup |= (1 << off);
else
return -EINVAL;
__raw_writel(pup, reg);
return 0;
}
s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
unsigned int off)
{
void __iomem *reg = chip->base + 0x08;
u32 pup = __raw_readl(reg);
pup &= (1 << off);
return pup ? S3C_GPIO_PULL_NONE : S3C_GPIO_PULL_UP;
}
#endif /* CONFIG_S3C_GPIO_PULL_UP */
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/spinlock.h>
#include <plat/gpio-core.h> #include <plat/gpio-core.h>
...@@ -52,14 +53,14 @@ static int s3c_gpiolib_input(struct gpio_chip *chip, unsigned offset) ...@@ -52,14 +53,14 @@ static int s3c_gpiolib_input(struct gpio_chip *chip, unsigned offset)
unsigned long flags; unsigned long flags;
unsigned long con; unsigned long con;
local_irq_save(flags); s3c_gpio_lock(ourchip, flags);
con = __raw_readl(base + 0x00); con = __raw_readl(base + 0x00);
con &= ~(3 << (offset * 2)); con &= ~(3 << (offset * 2));
__raw_writel(con, base + 0x00); __raw_writel(con, base + 0x00);
local_irq_restore(flags); s3c_gpio_unlock(ourchip, flags);
return 0; return 0;
} }
...@@ -72,7 +73,7 @@ static int s3c_gpiolib_output(struct gpio_chip *chip, ...@@ -72,7 +73,7 @@ static int s3c_gpiolib_output(struct gpio_chip *chip,
unsigned long dat; unsigned long dat;
unsigned long con; unsigned long con;
local_irq_save(flags); s3c_gpio_lock(ourchip, flags);
dat = __raw_readl(base + 0x04); dat = __raw_readl(base + 0x04);
dat &= ~(1 << offset); dat &= ~(1 << offset);
...@@ -87,7 +88,7 @@ static int s3c_gpiolib_output(struct gpio_chip *chip, ...@@ -87,7 +88,7 @@ static int s3c_gpiolib_output(struct gpio_chip *chip,
__raw_writel(con, base + 0x00); __raw_writel(con, base + 0x00);
__raw_writel(dat, base + 0x04); __raw_writel(dat, base + 0x04);
local_irq_restore(flags); s3c_gpio_unlock(ourchip, flags);
return 0; return 0;
} }
...@@ -99,7 +100,7 @@ static void s3c_gpiolib_set(struct gpio_chip *chip, ...@@ -99,7 +100,7 @@ static void s3c_gpiolib_set(struct gpio_chip *chip,
unsigned long flags; unsigned long flags;
unsigned long dat; unsigned long dat;
local_irq_save(flags); s3c_gpio_lock(ourchip, flags);
dat = __raw_readl(base + 0x04); dat = __raw_readl(base + 0x04);
dat &= ~(1 << offset); dat &= ~(1 << offset);
...@@ -107,7 +108,7 @@ static void s3c_gpiolib_set(struct gpio_chip *chip, ...@@ -107,7 +108,7 @@ static void s3c_gpiolib_set(struct gpio_chip *chip,
dat |= 1 << offset; dat |= 1 << offset;
__raw_writel(dat, base + 0x04); __raw_writel(dat, base + 0x04);
local_irq_restore(flags); s3c_gpio_unlock(ourchip, flags);
} }
static int s3c_gpiolib_get(struct gpio_chip *chip, unsigned offset) static int s3c_gpiolib_get(struct gpio_chip *chip, unsigned offset)
...@@ -131,6 +132,8 @@ __init void s3c_gpiolib_add(struct s3c_gpio_chip *chip) ...@@ -131,6 +132,8 @@ __init void s3c_gpiolib_add(struct s3c_gpio_chip *chip)
BUG_ON(!gc->label); BUG_ON(!gc->label);
BUG_ON(!gc->ngpio); BUG_ON(!gc->ngpio);
spin_lock_init(&chip->lock);
if (!gc->direction_input) if (!gc->direction_input)
gc->direction_input = s3c_gpiolib_input; gc->direction_input = s3c_gpiolib_input;
if (!gc->direction_output) if (!gc->direction_output)
......
...@@ -30,6 +30,12 @@ static inline int s3c_gpio_do_setcfg(struct s3c_gpio_chip *chip, ...@@ -30,6 +30,12 @@ static inline int s3c_gpio_do_setcfg(struct s3c_gpio_chip *chip,
return (chip->config->set_config)(chip, off, config); return (chip->config->set_config)(chip, off, config);
} }
static inline unsigned s3c_gpio_do_getcfg(struct s3c_gpio_chip *chip,
unsigned int off)
{
return (chip->config->get_config)(chip, off);
}
static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip, static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip,
unsigned int off, s3c_gpio_pull_t pull) unsigned int off, s3c_gpio_pull_t pull)
{ {
...@@ -52,6 +58,18 @@ static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip, ...@@ -52,6 +58,18 @@ static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip,
extern int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip, extern int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip,
unsigned int off, unsigned int cfg); unsigned int off, unsigned int cfg);
/**
* s3c_gpio_getcfg_s3c24xx - S3C24XX style GPIO configuration read.
* @chip: The gpio chip that is being configured.
* @off: The offset for the GPIO being configured.
*
* The reverse of s3c_gpio_setcfg_s3c24xx(). Will return a value whicg
* could be directly passed back to s3c_gpio_setcfg_s3c24xx(), from the
* S3C_GPIO_SPECIAL() macro.
*/
unsigned int s3c_gpio_getcfg_s3c24xx(struct s3c_gpio_chip *chip,
unsigned int off);
/** /**
* s3c_gpio_setcfg_s3c24xx_a - S3C24XX style GPIO configuration (Bank A) * s3c_gpio_setcfg_s3c24xx_a - S3C24XX style GPIO configuration (Bank A)
* @chip: The gpio chip that is being configured. * @chip: The gpio chip that is being configured.
...@@ -65,6 +83,21 @@ extern int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip, ...@@ -65,6 +83,21 @@ extern int s3c_gpio_setcfg_s3c24xx(struct s3c_gpio_chip *chip,
extern int s3c_gpio_setcfg_s3c24xx_a(struct s3c_gpio_chip *chip, extern int s3c_gpio_setcfg_s3c24xx_a(struct s3c_gpio_chip *chip,
unsigned int off, unsigned int cfg); unsigned int off, unsigned int cfg);
/**
* s3c_gpio_getcfg_s3c24xx_a - S3C24XX style GPIO configuration read (Bank A)
* @chip: The gpio chip that is being configured.
* @off: The offset for the GPIO being configured.
*
* The reverse of s3c_gpio_setcfg_s3c24xx_a() turning an GPIO into a usable
* GPIO configuration value.
*
* @sa s3c_gpio_getcfg_s3c24xx
* @sa s3c_gpio_getcfg_s3c64xx_4bit
*/
extern unsigned s3c_gpio_getcfg_s3c24xx_a(struct s3c_gpio_chip *chip,
unsigned int off);
/** /**
* s3c_gpio_setcfg_s3c64xx_4bit - S3C64XX 4bit single register GPIO config. * s3c_gpio_setcfg_s3c64xx_4bit - S3C64XX 4bit single register GPIO config.
* @chip: The gpio chip that is being configured. * @chip: The gpio chip that is being configured.
...@@ -85,6 +118,20 @@ extern int s3c_gpio_setcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip, ...@@ -85,6 +118,20 @@ extern int s3c_gpio_setcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip,
unsigned int off, unsigned int cfg); unsigned int off, unsigned int cfg);
/**
* s3c_gpio_getcfg_s3c64xx_4bit - S3C64XX 4bit single register GPIO config read.
* @chip: The gpio chip that is being configured.
* @off: The offset for the GPIO being configured.
*
* The reverse of s3c_gpio_setcfg_s3c64xx_4bit(), turning a gpio configuration
* register setting into a value the software can use, such as could be passed
* to s3c_gpio_setcfg_s3c64xx_4bit().
*
* @sa s3c_gpio_getcfg_s3c24xx
*/
extern unsigned s3c_gpio_getcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip,
unsigned int off);
/* Pull-{up,down} resistor controls. /* Pull-{up,down} resistor controls.
* *
* S3C2410,S3C2440,S3C24A0 = Pull-UP, * S3C2410,S3C2440,S3C24A0 = Pull-UP,
...@@ -145,6 +192,17 @@ extern int s3c_gpio_setpull_updown(struct s3c_gpio_chip *chip, ...@@ -145,6 +192,17 @@ extern int s3c_gpio_setpull_updown(struct s3c_gpio_chip *chip,
extern s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip, extern s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
unsigned int off); unsigned int off);
/**
* s3c_gpio_getpull_1up() - Get configuration for choice of up or none
* @chip: The gpio chip that the GPIO pin belongs to
* @off: The offset to the pin to get the configuration of.
*
* This helper function reads the state of the pull-up resistor for the
* given GPIO in the same case as s3c_gpio_setpull_1up.
*/
extern s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
unsigned int off);
/** /**
* s3c_gpio_setpull_s3c2443() - Pull configuration for s3c2443. * s3c_gpio_setpull_s3c2443() - Pull configuration for s3c2443.
* @chip: The gpio chip that is being configured. * @chip: The gpio chip that is being configured.
......
...@@ -77,6 +77,17 @@ struct s3c_gpio_cfg { ...@@ -77,6 +77,17 @@ struct s3c_gpio_cfg {
*/ */
extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to); extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);
/**
* s3c_gpio_getcfg - Read the current function for a GPIO pin
* @pin: The pin to read the configuration value for.
*
* Read the configuration state of the given @pin, returning a value that
* could be passed back to s3c_gpio_cfgpin().
*
* @sa s3c_gpio_cfgpin
*/
extern unsigned s3c_gpio_getcfg(unsigned int pin);
/* Define values for the pull-{up,down} available for each gpio pin. /* Define values for the pull-{up,down} available for each gpio pin.
* *
* These values control the state of the weak pull-{up,down} resistors * These values control the state of the weak pull-{up,down} resistors
......
...@@ -44,16 +44,26 @@ struct s3c_gpio_cfg; ...@@ -44,16 +44,26 @@ struct s3c_gpio_cfg;
* @chip: The chip structure to be exported via gpiolib. * @chip: The chip structure to be exported via gpiolib.
* @base: The base pointer to the gpio configuration registers. * @base: The base pointer to the gpio configuration registers.
* @config: special function and pull-resistor control information. * @config: special function and pull-resistor control information.
* @lock: Lock for exclusive access to this gpio bank.
* @pm_save: Save information for suspend/resume support. * @pm_save: Save information for suspend/resume support.
* *
* This wrapper provides the necessary information for the Samsung * This wrapper provides the necessary information for the Samsung
* specific gpios being registered with gpiolib. * specific gpios being registered with gpiolib.
*
* The lock protects each gpio bank from multiple access of the shared
* configuration registers, or from reading of data whilst another thread
* is writing to the register set.
*
* Each chip has its own lock to avoid any contention between different
* CPU cores trying to get one lock for different GPIO banks, where each
* bank of GPIO has its own register space and configuration registers.
*/ */
struct s3c_gpio_chip { struct s3c_gpio_chip {
struct gpio_chip chip; struct gpio_chip chip;
struct s3c_gpio_cfg *config; struct s3c_gpio_cfg *config;
struct s3c_gpio_pm *pm; struct s3c_gpio_pm *pm;
void __iomem *base; void __iomem *base;
spinlock_t lock;
#ifdef CONFIG_PM #ifdef CONFIG_PM
u32 pm_save[4]; u32 pm_save[4];
#endif #endif
...@@ -108,6 +118,9 @@ extern void samsung_gpiolib_add_4bit2_chips(struct s3c_gpio_chip *chip, ...@@ -108,6 +118,9 @@ extern void samsung_gpiolib_add_4bit2_chips(struct s3c_gpio_chip *chip,
extern void samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip); extern void samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip);
extern void samsung_gpiolib_add_4bit2(struct s3c_gpio_chip *chip); extern void samsung_gpiolib_add_4bit2(struct s3c_gpio_chip *chip);
/* exported for core SoC support to change */
extern struct s3c_gpio_cfg s3c24xx_gpiocfg_default;
#ifdef CONFIG_S3C_GPIO_TRACK #ifdef CONFIG_S3C_GPIO_TRACK
extern struct s3c_gpio_chip *s3c_gpios[S3C_GPIO_END]; extern struct s3c_gpio_chip *s3c_gpios[S3C_GPIO_END];
...@@ -135,3 +148,7 @@ extern struct s3c_gpio_pm s3c_gpio_pm_4bit; ...@@ -135,3 +148,7 @@ extern struct s3c_gpio_pm s3c_gpio_pm_4bit;
#define __gpio_pm(x) NULL #define __gpio_pm(x) NULL
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
/* locking wrappers to deal with multiple access to the same gpio bank */
#define s3c_gpio_lock(_oc, _fl) spin_lock_irqsave(&(_oc)->lock, _fl)
#define s3c_gpio_unlock(_oc, _fl) spin_unlock_irqrestore(&(_oc)->lock, _fl)
...@@ -329,7 +329,7 @@ void s3c_pm_save_gpios(void) ...@@ -329,7 +329,7 @@ void s3c_pm_save_gpios(void)
struct s3c_gpio_chip *ourchip; struct s3c_gpio_chip *ourchip;
unsigned int gpio_nr; unsigned int gpio_nr;
for (gpio_nr = 0; gpio_nr < S3C_GPIO_END; gpio_nr++) { for (gpio_nr = 0; gpio_nr < S3C_GPIO_END;) {
ourchip = s3c_gpiolib_getchip(gpio_nr); ourchip = s3c_gpiolib_getchip(gpio_nr);
if (!ourchip) if (!ourchip)
continue; continue;
...@@ -367,7 +367,7 @@ void s3c_pm_restore_gpios(void) ...@@ -367,7 +367,7 @@ void s3c_pm_restore_gpios(void)
struct s3c_gpio_chip *ourchip; struct s3c_gpio_chip *ourchip;
unsigned int gpio_nr; unsigned int gpio_nr;
for (gpio_nr = 0; gpio_nr < S3C_GPIO_END; gpio_nr++) { for (gpio_nr = 0; gpio_nr < S3C_GPIO_END;) {
ourchip = s3c_gpiolib_getchip(gpio_nr); ourchip = s3c_gpiolib_getchip(gpio_nr);
if (!ourchip) if (!ourchip)
continue; continue;
......
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