mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-24 05:04:00 +08:00
ARM: S3C24XX: Fix mess with gpio {set,get}_pull callbacks
Currently the {set,get}_pull callbacks of the s3c24xx_gpiocfg_default structure are initalized via s3c_gpio_{get,set}pull_1up. This results in a linker error when only CONFIG_CPU_S3C2442 is selected: arch/arm/plat-s3c24xx/built-in.o:(.data+0x13f4): undefined reference to `s3c_gpio_getpull_1up' arch/arm/plat-s3c24xx/built-in.o:(.data+0x13f8): undefined reference to `s3c_gpio_setpull_1up' The s3c2442 has pulldowns instead of pullups compared to the s3c2440. The method of controlling them is the same though. So this patch modifies the existing s3c_gpio_{get,set}pull_1up helper functions to take an additional parameter deciding whether the pin has a pullup or pulldown. The s3c_gpio_{get,set}pull_1{down,up} functions then wrap that functions passing either S3C_GPIO_PULL_UP or S3C_GPIO_PULL_DOWN. Furthermore this patch sets up the s3c24xx_gpiocfg_default.{get,set}_pull fields in the s3c244{0,2}_map_io function to the new pulldown helper functions. Based on patch from "Lars-Peter Clausen" <lars@metafoo.de> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
parent
2e18edf75d
commit
812c4e40c2
@ -18,6 +18,7 @@ config CPU_S3C2440
|
|||||||
config CPU_S3C2442
|
config CPU_S3C2442
|
||||||
bool
|
bool
|
||||||
select CPU_ARM920T
|
select CPU_ARM920T
|
||||||
|
select S3C_GPIO_PULL_DOWN
|
||||||
select S3C2410_CLOCK
|
select S3C2410_CLOCK
|
||||||
select S3C2410_GPIO
|
select S3C2410_GPIO
|
||||||
select S3C2410_PM if PM
|
select S3C2410_PM if PM
|
||||||
|
@ -46,9 +46,6 @@ 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;
|
||||||
@ -58,3 +55,11 @@ int __init s3c2440_init(void)
|
|||||||
|
|
||||||
return sysdev_register(&s3c2440_sysdev);
|
return sysdev_register(&s3c2440_sysdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init s3c2440_map_io(void)
|
||||||
|
{
|
||||||
|
s3c244x_map_io();
|
||||||
|
|
||||||
|
s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
|
||||||
|
s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
|
||||||
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
@ -43,6 +44,11 @@
|
|||||||
|
|
||||||
#include <plat/clock.h>
|
#include <plat/clock.h>
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
|
#include <plat/s3c244x.h>
|
||||||
|
|
||||||
|
#include <plat/gpio-core.h>
|
||||||
|
#include <plat/gpio-cfg.h>
|
||||||
|
#include <plat/gpio-cfg-helpers.h>
|
||||||
|
|
||||||
/* S3C2442 extended clock support */
|
/* S3C2442 extended clock support */
|
||||||
|
|
||||||
@ -163,3 +169,11 @@ int __init s3c2442_init(void)
|
|||||||
|
|
||||||
return sysdev_register(&s3c2442_sysdev);
|
return sysdev_register(&s3c2442_sysdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init s3c2442_map_io(void)
|
||||||
|
{
|
||||||
|
s3c244x_map_io();
|
||||||
|
|
||||||
|
s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1down;
|
||||||
|
s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1down;
|
||||||
|
}
|
||||||
|
@ -88,7 +88,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||||||
{
|
{
|
||||||
.idcode = 0x32440000,
|
.idcode = 0x32440000,
|
||||||
.idmask = 0xffffffff,
|
.idmask = 0xffffffff,
|
||||||
.map_io = s3c244x_map_io,
|
.map_io = s3c2440_map_io,
|
||||||
.init_clocks = s3c244x_init_clocks,
|
.init_clocks = s3c244x_init_clocks,
|
||||||
.init_uarts = s3c244x_init_uarts,
|
.init_uarts = s3c244x_init_uarts,
|
||||||
.init = s3c2440_init,
|
.init = s3c2440_init,
|
||||||
@ -97,7 +97,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||||||
{
|
{
|
||||||
.idcode = 0x32440001,
|
.idcode = 0x32440001,
|
||||||
.idmask = 0xffffffff,
|
.idmask = 0xffffffff,
|
||||||
.map_io = s3c244x_map_io,
|
.map_io = s3c2440_map_io,
|
||||||
.init_clocks = s3c244x_init_clocks,
|
.init_clocks = s3c244x_init_clocks,
|
||||||
.init_uarts = s3c244x_init_uarts,
|
.init_uarts = s3c244x_init_uarts,
|
||||||
.init = s3c2440_init,
|
.init = s3c2440_init,
|
||||||
@ -106,7 +106,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||||||
{
|
{
|
||||||
.idcode = 0x32440aaa,
|
.idcode = 0x32440aaa,
|
||||||
.idmask = 0xffffffff,
|
.idmask = 0xffffffff,
|
||||||
.map_io = s3c244x_map_io,
|
.map_io = s3c2442_map_io,
|
||||||
.init_clocks = s3c244x_init_clocks,
|
.init_clocks = s3c244x_init_clocks,
|
||||||
.init_uarts = s3c244x_init_uarts,
|
.init_uarts = s3c244x_init_uarts,
|
||||||
.init = s3c2442_init,
|
.init = s3c2442_init,
|
||||||
@ -115,7 +115,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||||||
{
|
{
|
||||||
.idcode = 0x32440aab,
|
.idcode = 0x32440aab,
|
||||||
.idmask = 0xffffffff,
|
.idmask = 0xffffffff,
|
||||||
.map_io = s3c244x_map_io,
|
.map_io = s3c2442_map_io,
|
||||||
.init_clocks = s3c244x_init_clocks,
|
.init_clocks = s3c244x_init_clocks,
|
||||||
.init_uarts = s3c244x_init_uarts,
|
.init_uarts = s3c244x_init_uarts,
|
||||||
.init = s3c2442_init,
|
.init = s3c2442_init,
|
||||||
|
@ -82,8 +82,6 @@ static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka = {
|
|||||||
struct s3c_gpio_cfg s3c24xx_gpiocfg_default = {
|
struct s3c_gpio_cfg s3c24xx_gpiocfg_default = {
|
||||||
.set_config = s3c_gpio_setcfg_s3c24xx,
|
.set_config = s3c_gpio_setcfg_s3c24xx,
|
||||||
.get_config = s3c_gpio_getcfg_s3c24xx,
|
.get_config = s3c_gpio_getcfg_s3c24xx,
|
||||||
.set_pull = s3c_gpio_setpull_1up,
|
|
||||||
.get_pull = s3c_gpio_getpull_1up,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct s3c_gpio_chip s3c24xx_gpios[] = {
|
struct s3c_gpio_chip s3c24xx_gpios[] = {
|
||||||
|
@ -21,17 +21,22 @@ extern void s3c244x_init_clocks(int xtal);
|
|||||||
#else
|
#else
|
||||||
#define s3c244x_init_clocks NULL
|
#define s3c244x_init_clocks NULL
|
||||||
#define s3c244x_init_uarts NULL
|
#define s3c244x_init_uarts NULL
|
||||||
#define s3c244x_map_io NULL
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_S3C2440
|
#ifdef CONFIG_CPU_S3C2440
|
||||||
extern int s3c2440_init(void);
|
extern int s3c2440_init(void);
|
||||||
|
|
||||||
|
extern void s3c2440_map_io(void);
|
||||||
#else
|
#else
|
||||||
#define s3c2440_init NULL
|
#define s3c2440_init NULL
|
||||||
|
#define s3c2440_map_io NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_S3C2442
|
#ifdef CONFIG_CPU_S3C2442
|
||||||
extern int s3c2442_init(void);
|
extern int s3c2442_init(void);
|
||||||
|
|
||||||
|
extern void s3c2442_map_io(void);
|
||||||
#else
|
#else
|
||||||
#define s3c2442_init NULL
|
#define s3c2442_init NULL
|
||||||
|
#define s3c2442_map_io NULL
|
||||||
#endif
|
#endif
|
||||||
|
@ -280,18 +280,17 @@ s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_S3C_GPIO_PULL_UP
|
#if defined(CONFIG_S3C_GPIO_PULL_UP) || defined(CONFIG_S3C_GPIO_PULL_DOWN)
|
||||||
int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
|
static int s3c_gpio_setpull_1(struct s3c_gpio_chip *chip,
|
||||||
unsigned int off, s3c_gpio_pull_t pull)
|
unsigned int off, s3c_gpio_pull_t pull,
|
||||||
|
s3c_gpio_pull_t updown)
|
||||||
{
|
{
|
||||||
void __iomem *reg = chip->base + 0x08;
|
void __iomem *reg = chip->base + 0x08;
|
||||||
u32 pup = __raw_readl(reg);
|
u32 pup = __raw_readl(reg);
|
||||||
|
|
||||||
pup = __raw_readl(reg);
|
if (pull == updown)
|
||||||
|
|
||||||
if (pup == S3C_GPIO_PULL_UP)
|
|
||||||
pup &= ~(1 << off);
|
pup &= ~(1 << off);
|
||||||
else if (pup == S3C_GPIO_PULL_NONE)
|
else if (pull == S3C_GPIO_PULL_NONE)
|
||||||
pup |= (1 << off);
|
pup |= (1 << off);
|
||||||
else
|
else
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -300,17 +299,45 @@ int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
|
static s3c_gpio_pull_t s3c_gpio_getpull_1(struct s3c_gpio_chip *chip,
|
||||||
unsigned int off)
|
unsigned int off, s3c_gpio_pull_t updown)
|
||||||
{
|
{
|
||||||
void __iomem *reg = chip->base + 0x08;
|
void __iomem *reg = chip->base + 0x08;
|
||||||
u32 pup = __raw_readl(reg);
|
u32 pup = __raw_readl(reg);
|
||||||
|
|
||||||
pup &= (1 << off);
|
pup &= (1 << off);
|
||||||
return pup ? S3C_GPIO_PULL_NONE : S3C_GPIO_PULL_UP;
|
return pup ? S3C_GPIO_PULL_NONE : updown;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_S3C_GPIO_PULL_UP || CONFIG_S3C_GPIO_PULL_DOWN */
|
||||||
|
|
||||||
|
#ifdef CONFIG_S3C_GPIO_PULL_UP
|
||||||
|
s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
|
||||||
|
unsigned int off)
|
||||||
|
{
|
||||||
|
return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
|
||||||
|
unsigned int off, s3c_gpio_pull_t pull)
|
||||||
|
{
|
||||||
|
return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_UP);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_S3C_GPIO_PULL_UP */
|
#endif /* CONFIG_S3C_GPIO_PULL_UP */
|
||||||
|
|
||||||
|
#ifdef CONFIG_S3C_GPIO_PULL_DOWN
|
||||||
|
s3c_gpio_pull_t s3c_gpio_getpull_1down(struct s3c_gpio_chip *chip,
|
||||||
|
unsigned int off)
|
||||||
|
{
|
||||||
|
return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_DOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
int s3c_gpio_setpull_1down(struct s3c_gpio_chip *chip,
|
||||||
|
unsigned int off, s3c_gpio_pull_t pull)
|
||||||
|
{
|
||||||
|
return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_DOWN);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_S3C_GPIO_PULL_DOWN */
|
||||||
|
|
||||||
#ifdef CONFIG_S5P_GPIO_DRVSTR
|
#ifdef CONFIG_S5P_GPIO_DRVSTR
|
||||||
s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
|
s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
|
||||||
{
|
{
|
||||||
|
@ -209,6 +209,17 @@ extern s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
|
|||||||
extern s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
|
extern s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
|
||||||
unsigned int off);
|
unsigned int off);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* s3c_gpio_getpull_1down() - Get configuration for choice of down 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-down resistor for the
|
||||||
|
* given GPIO in the same case as s3c_gpio_setpull_1down.
|
||||||
|
*/
|
||||||
|
extern s3c_gpio_pull_t s3c_gpio_getpull_1down(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.
|
||||||
|
Loading…
Reference in New Issue
Block a user