提交 c1a5a43c 编写于 作者: L Linus Walleij

Merge tag 'for_3.19/samsung-pinctrl' of...

Merge tag 'for_3.19/samsung-pinctrl' of git://git.kernel.org/pub/scm/linux/kernel/git/tfiga/samsung-pinctrl into devel

Samsung pinctrl patches for v3.19

1) pinctrl-samsung data structure clean-up

8100cf47 pinctrl: samsung: Separate per-bank init and runtime data
1bf00d7a pinctrl: samsung: Constify samsung_pin_ctrl struct
94ce944b pinctrl: samsung: Constify samsung_pin_bank_type struct
e06deff9 pinctrl: samsung: Drop unused label field in samsung_pin_ctrl struct
87993273 pinctrl: samsung: Make samsung_pinctrl_get_soc_data use ERR_PTR()

2) pinctrl-samsung Exynos7 support

50cea0cf pinctrl: exynos: Add initial driver data for Exynos7
14c255d3 pinctrl: exynos: Add irq_chip instance for Exynos7 wakeup interrupts
6f5e41bd pinctrl: exynos: Consolidate irq domain callbacks
0d3d30db pinctrl: exynos: Generalize the eint16_31 demux code

3) pinctrl-samsung Exynos4415 support

2891ba29 pinctrl: exynos: Add support for Exynos4415
...@@ -18,6 +18,7 @@ Required Properties: ...@@ -18,6 +18,7 @@ Required Properties:
- "samsung,exynos5250-pinctrl": for Exynos5250 compatible pin-controller. - "samsung,exynos5250-pinctrl": for Exynos5250 compatible pin-controller.
- "samsung,exynos5260-pinctrl": for Exynos5260 compatible pin-controller. - "samsung,exynos5260-pinctrl": for Exynos5260 compatible pin-controller.
- "samsung,exynos5420-pinctrl": for Exynos5420 compatible pin-controller. - "samsung,exynos5420-pinctrl": for Exynos5420 compatible pin-controller.
- "samsung,exynos7-pinctrl": for Exynos7 compatible pin-controller.
- reg: Base address of the pin controller hardware module and length of - reg: Base address of the pin controller hardware module and length of
the address space it occupies. the address space it occupies.
...@@ -136,6 +137,8 @@ B. External Wakeup Interrupts: For supporting external wakeup interrupts, a ...@@ -136,6 +137,8 @@ B. External Wakeup Interrupts: For supporting external wakeup interrupts, a
found on Samsung S3C64xx SoCs, found on Samsung S3C64xx SoCs,
- samsung,exynos4210-wakeup-eint: represents wakeup interrupt controller - samsung,exynos4210-wakeup-eint: represents wakeup interrupt controller
found on Samsung Exynos4210 and S5PC110/S5PV210 SoCs. found on Samsung Exynos4210 and S5PC110/S5PV210 SoCs.
- samsung,exynos7-wakeup-eint: represents wakeup interrupt controller
found on Samsung Exynos7 SoC.
- interrupt-parent: phandle of the interrupt parent to which the external - interrupt-parent: phandle of the interrupt parent to which the external
wakeup interrupts are forwarded to. wakeup interrupts are forwarded to.
- interrupts: interrupt used by multiplexed wakeup interrupts. - interrupts: interrupt used by multiplexed wakeup interrupts.
......
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
#define EXYNOS_WKUP_ECON_OFFSET 0xE00 #define EXYNOS_WKUP_ECON_OFFSET 0xE00
#define EXYNOS_WKUP_EMASK_OFFSET 0xF00 #define EXYNOS_WKUP_EMASK_OFFSET 0xF00
#define EXYNOS_WKUP_EPEND_OFFSET 0xF40 #define EXYNOS_WKUP_EPEND_OFFSET 0xF40
#define EXYNOS7_WKUP_ECON_OFFSET 0x700
#define EXYNOS7_WKUP_EMASK_OFFSET 0x900
#define EXYNOS7_WKUP_EPEND_OFFSET 0xA00
#define EXYNOS_SVC_OFFSET 0xB08 #define EXYNOS_SVC_OFFSET 0xB08
#define EXYNOS_EINT_FUNC 0xF #define EXYNOS_EINT_FUNC 0xF
......
...@@ -44,12 +44,12 @@ ...@@ -44,12 +44,12 @@
#define EINT_EDGE_BOTH 6 #define EINT_EDGE_BOTH 6
#define EINT_MASK 0xf #define EINT_MASK 0xf
static struct samsung_pin_bank_type bank_type_1bit = { static const struct samsung_pin_bank_type bank_type_1bit = {
.fld_width = { 1, 1, }, .fld_width = { 1, 1, },
.reg_offset = { 0x00, 0x04, }, .reg_offset = { 0x00, 0x04, },
}; };
static struct samsung_pin_bank_type bank_type_2bit = { static const struct samsung_pin_bank_type bank_type_2bit = {
.fld_width = { 2, 1, 2, }, .fld_width = { 2, 1, 2, },
.reg_offset = { 0x00, 0x04, 0x08, }, .reg_offset = { 0x00, 0x04, 0x08, },
}; };
...@@ -143,7 +143,7 @@ static void s3c24xx_eint_set_handler(unsigned int irq, unsigned int type) ...@@ -143,7 +143,7 @@ static void s3c24xx_eint_set_handler(unsigned int irq, unsigned int type)
static void s3c24xx_eint_set_function(struct samsung_pinctrl_drv_data *d, static void s3c24xx_eint_set_function(struct samsung_pinctrl_drv_data *d,
struct samsung_pin_bank *bank, int pin) struct samsung_pin_bank *bank, int pin)
{ {
struct samsung_pin_bank_type *bank_type = bank->type; const struct samsung_pin_bank_type *bank_type = bank->type;
unsigned long flags; unsigned long flags;
void __iomem *reg; void __iomem *reg;
u8 shift; u8 shift;
...@@ -518,8 +518,8 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) ...@@ -518,8 +518,8 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d)
irq_set_handler_data(irq, eint_data); irq_set_handler_data(irq, eint_data);
} }
bank = d->ctrl->pin_banks; bank = d->pin_banks;
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) { for (i = 0; i < d->nr_banks; ++i, ++bank) {
struct s3c24xx_eint_domain_data *ddata; struct s3c24xx_eint_domain_data *ddata;
unsigned int mask; unsigned int mask;
unsigned int irq; unsigned int irq;
...@@ -561,7 +561,7 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) ...@@ -561,7 +561,7 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d)
return 0; return 0;
} }
static struct samsung_pin_bank s3c2412_pin_banks[] = { static const struct samsung_pin_bank_data s3c2412_pin_banks[] __initconst = {
PIN_BANK_A(23, 0x000, "gpa"), PIN_BANK_A(23, 0x000, "gpa"),
PIN_BANK_2BIT(11, 0x010, "gpb"), PIN_BANK_2BIT(11, 0x010, "gpb"),
PIN_BANK_2BIT(16, 0x020, "gpc"), PIN_BANK_2BIT(16, 0x020, "gpc"),
...@@ -573,16 +573,15 @@ static struct samsung_pin_bank s3c2412_pin_banks[] = { ...@@ -573,16 +573,15 @@ static struct samsung_pin_bank s3c2412_pin_banks[] = {
PIN_BANK_2BIT(13, 0x080, "gpj"), PIN_BANK_2BIT(13, 0x080, "gpj"),
}; };
struct samsung_pin_ctrl s3c2412_pin_ctrl[] = { const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = {
{ {
.pin_banks = s3c2412_pin_banks, .pin_banks = s3c2412_pin_banks,
.nr_banks = ARRAY_SIZE(s3c2412_pin_banks), .nr_banks = ARRAY_SIZE(s3c2412_pin_banks),
.eint_wkup_init = s3c24xx_eint_init, .eint_wkup_init = s3c24xx_eint_init,
.label = "S3C2412-GPIO",
}, },
}; };
static struct samsung_pin_bank s3c2416_pin_banks[] = { static const struct samsung_pin_bank_data s3c2416_pin_banks[] __initconst = {
PIN_BANK_A(27, 0x000, "gpa"), PIN_BANK_A(27, 0x000, "gpa"),
PIN_BANK_2BIT(11, 0x010, "gpb"), PIN_BANK_2BIT(11, 0x010, "gpb"),
PIN_BANK_2BIT(16, 0x020, "gpc"), PIN_BANK_2BIT(16, 0x020, "gpc"),
...@@ -596,16 +595,15 @@ static struct samsung_pin_bank s3c2416_pin_banks[] = { ...@@ -596,16 +595,15 @@ static struct samsung_pin_bank s3c2416_pin_banks[] = {
PIN_BANK_2BIT(2, 0x100, "gpm"), PIN_BANK_2BIT(2, 0x100, "gpm"),
}; };
struct samsung_pin_ctrl s3c2416_pin_ctrl[] = { const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = {
{ {
.pin_banks = s3c2416_pin_banks, .pin_banks = s3c2416_pin_banks,
.nr_banks = ARRAY_SIZE(s3c2416_pin_banks), .nr_banks = ARRAY_SIZE(s3c2416_pin_banks),
.eint_wkup_init = s3c24xx_eint_init, .eint_wkup_init = s3c24xx_eint_init,
.label = "S3C2416-GPIO",
}, },
}; };
static struct samsung_pin_bank s3c2440_pin_banks[] = { static const struct samsung_pin_bank_data s3c2440_pin_banks[] __initconst = {
PIN_BANK_A(25, 0x000, "gpa"), PIN_BANK_A(25, 0x000, "gpa"),
PIN_BANK_2BIT(11, 0x010, "gpb"), PIN_BANK_2BIT(11, 0x010, "gpb"),
PIN_BANK_2BIT(16, 0x020, "gpc"), PIN_BANK_2BIT(16, 0x020, "gpc"),
...@@ -617,16 +615,15 @@ static struct samsung_pin_bank s3c2440_pin_banks[] = { ...@@ -617,16 +615,15 @@ static struct samsung_pin_bank s3c2440_pin_banks[] = {
PIN_BANK_2BIT(13, 0x0d0, "gpj"), PIN_BANK_2BIT(13, 0x0d0, "gpj"),
}; };
struct samsung_pin_ctrl s3c2440_pin_ctrl[] = { const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = {
{ {
.pin_banks = s3c2440_pin_banks, .pin_banks = s3c2440_pin_banks,
.nr_banks = ARRAY_SIZE(s3c2440_pin_banks), .nr_banks = ARRAY_SIZE(s3c2440_pin_banks),
.eint_wkup_init = s3c24xx_eint_init, .eint_wkup_init = s3c24xx_eint_init,
.label = "S3C2440-GPIO",
}, },
}; };
static struct samsung_pin_bank s3c2450_pin_banks[] = { static const struct samsung_pin_bank_data s3c2450_pin_banks[] __initconst = {
PIN_BANK_A(28, 0x000, "gpa"), PIN_BANK_A(28, 0x000, "gpa"),
PIN_BANK_2BIT(11, 0x010, "gpb"), PIN_BANK_2BIT(11, 0x010, "gpb"),
PIN_BANK_2BIT(16, 0x020, "gpc"), PIN_BANK_2BIT(16, 0x020, "gpc"),
...@@ -641,11 +638,10 @@ static struct samsung_pin_bank s3c2450_pin_banks[] = { ...@@ -641,11 +638,10 @@ static struct samsung_pin_bank s3c2450_pin_banks[] = {
PIN_BANK_2BIT(2, 0x100, "gpm"), PIN_BANK_2BIT(2, 0x100, "gpm"),
}; };
struct samsung_pin_ctrl s3c2450_pin_ctrl[] = { const struct samsung_pin_ctrl s3c2450_pin_ctrl[] __initconst = {
{ {
.pin_banks = s3c2450_pin_banks, .pin_banks = s3c2450_pin_banks,
.nr_banks = ARRAY_SIZE(s3c2450_pin_banks), .nr_banks = ARRAY_SIZE(s3c2450_pin_banks),
.eint_wkup_init = s3c24xx_eint_init, .eint_wkup_init = s3c24xx_eint_init,
.label = "S3C2450-GPIO",
}, },
}; };
...@@ -68,32 +68,32 @@ ...@@ -68,32 +68,32 @@
#define EINT_CON_MASK 0xF #define EINT_CON_MASK 0xF
#define EINT_CON_LEN 4 #define EINT_CON_LEN 4
static struct samsung_pin_bank_type bank_type_4bit_off = { static const struct samsung_pin_bank_type bank_type_4bit_off = {
.fld_width = { 4, 1, 2, 0, 2, 2, }, .fld_width = { 4, 1, 2, 0, 2, 2, },
.reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, }, .reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, },
}; };
static struct samsung_pin_bank_type bank_type_4bit_alive = { static const struct samsung_pin_bank_type bank_type_4bit_alive = {
.fld_width = { 4, 1, 2, }, .fld_width = { 4, 1, 2, },
.reg_offset = { 0x00, 0x04, 0x08, }, .reg_offset = { 0x00, 0x04, 0x08, },
}; };
static struct samsung_pin_bank_type bank_type_4bit2_off = { static const struct samsung_pin_bank_type bank_type_4bit2_off = {
.fld_width = { 4, 1, 2, 0, 2, 2, }, .fld_width = { 4, 1, 2, 0, 2, 2, },
.reg_offset = { 0x00, 0x08, 0x0c, 0, 0x10, 0x14, }, .reg_offset = { 0x00, 0x08, 0x0c, 0, 0x10, 0x14, },
}; };
static struct samsung_pin_bank_type bank_type_4bit2_alive = { static const struct samsung_pin_bank_type bank_type_4bit2_alive = {
.fld_width = { 4, 1, 2, }, .fld_width = { 4, 1, 2, },
.reg_offset = { 0x00, 0x08, 0x0c, }, .reg_offset = { 0x00, 0x08, 0x0c, },
}; };
static struct samsung_pin_bank_type bank_type_2bit_off = { static const struct samsung_pin_bank_type bank_type_2bit_off = {
.fld_width = { 2, 1, 2, 0, 2, 2, }, .fld_width = { 2, 1, 2, 0, 2, 2, },
.reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, }, .reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, },
}; };
static struct samsung_pin_bank_type bank_type_2bit_alive = { static const struct samsung_pin_bank_type bank_type_2bit_alive = {
.fld_width = { 2, 1, 2, }, .fld_width = { 2, 1, 2, },
.reg_offset = { 0x00, 0x04, 0x08, }, .reg_offset = { 0x00, 0x04, 0x08, },
}; };
...@@ -272,7 +272,7 @@ static void s3c64xx_irq_set_handler(unsigned int irq, unsigned int type) ...@@ -272,7 +272,7 @@ static void s3c64xx_irq_set_handler(unsigned int irq, unsigned int type)
static void s3c64xx_irq_set_function(struct samsung_pinctrl_drv_data *d, static void s3c64xx_irq_set_function(struct samsung_pinctrl_drv_data *d,
struct samsung_pin_bank *bank, int pin) struct samsung_pin_bank *bank, int pin)
{ {
struct samsung_pin_bank_type *bank_type = bank->type; const struct samsung_pin_bank_type *bank_type = bank->type;
unsigned long flags; unsigned long flags;
void __iomem *reg; void __iomem *reg;
u8 shift; u8 shift;
...@@ -468,8 +468,8 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d) ...@@ -468,8 +468,8 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
} }
nr_domains = 0; nr_domains = 0;
bank = d->ctrl->pin_banks; bank = d->pin_banks;
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) { for (i = 0; i < d->nr_banks; ++i, ++bank) {
unsigned int nr_eints; unsigned int nr_eints;
unsigned int mask; unsigned int mask;
...@@ -497,9 +497,9 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d) ...@@ -497,9 +497,9 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
} }
data->drvdata = d; data->drvdata = d;
bank = d->ctrl->pin_banks; bank = d->pin_banks;
nr_domains = 0; nr_domains = 0;
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) { for (i = 0; i < d->nr_banks; ++i, ++bank) {
if (bank->eint_type != EINT_TYPE_GPIO) if (bank->eint_type != EINT_TYPE_GPIO)
continue; continue;
...@@ -735,8 +735,8 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) ...@@ -735,8 +735,8 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d)
irq_set_handler_data(irq, data); irq_set_handler_data(irq, data);
} }
bank = d->ctrl->pin_banks; bank = d->pin_banks;
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) { for (i = 0; i < d->nr_banks; ++i, ++bank) {
struct s3c64xx_eint0_domain_data *ddata; struct s3c64xx_eint0_domain_data *ddata;
unsigned int nr_eints; unsigned int nr_eints;
unsigned int mask; unsigned int mask;
...@@ -780,7 +780,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) ...@@ -780,7 +780,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d)
} }
/* pin banks of s3c64xx pin-controller 0 */ /* pin banks of s3c64xx pin-controller 0 */
static struct samsung_pin_bank s3c64xx_pin_banks0[] = { static const struct samsung_pin_bank_data s3c64xx_pin_banks0[] __initconst = {
PIN_BANK_4BIT_EINTG(8, 0x000, "gpa", 0), PIN_BANK_4BIT_EINTG(8, 0x000, "gpa", 0),
PIN_BANK_4BIT_EINTG(7, 0x020, "gpb", 8), PIN_BANK_4BIT_EINTG(7, 0x020, "gpb", 8),
PIN_BANK_4BIT_EINTG(8, 0x040, "gpc", 16), PIN_BANK_4BIT_EINTG(8, 0x040, "gpc", 16),
...@@ -804,13 +804,12 @@ static struct samsung_pin_bank s3c64xx_pin_banks0[] = { ...@@ -804,13 +804,12 @@ static struct samsung_pin_bank s3c64xx_pin_banks0[] = {
* Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes * Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes
* one gpio/pin-mux/pinconfig controller. * one gpio/pin-mux/pinconfig controller.
*/ */
struct samsung_pin_ctrl s3c64xx_pin_ctrl[] = { const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = {
{ {
/* pin-controller instance 1 data */ /* pin-controller instance 1 data */
.pin_banks = s3c64xx_pin_banks0, .pin_banks = s3c64xx_pin_banks0,
.nr_banks = ARRAY_SIZE(s3c64xx_pin_banks0), .nr_banks = ARRAY_SIZE(s3c64xx_pin_banks0),
.eint_gpio_init = s3c64xx_eint_gpio_init, .eint_gpio_init = s3c64xx_eint_gpio_init,
.eint_wkup_init = s3c64xx_eint_eint0_init, .eint_wkup_init = s3c64xx_eint_eint0_init,
.label = "S3C64xx-GPIO",
}, },
}; };
...@@ -349,7 +349,7 @@ static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata, ...@@ -349,7 +349,7 @@ static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata,
{ {
struct samsung_pin_bank *b; struct samsung_pin_bank *b;
b = drvdata->ctrl->pin_banks; b = drvdata->pin_banks;
while ((pin >= b->pin_base) && while ((pin >= b->pin_base) &&
((b->pin_base + b->nr_pins - 1) < pin)) ((b->pin_base + b->nr_pins - 1) < pin))
...@@ -366,7 +366,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector, ...@@ -366,7 +366,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
unsigned group, bool enable) unsigned group, bool enable)
{ {
struct samsung_pinctrl_drv_data *drvdata; struct samsung_pinctrl_drv_data *drvdata;
struct samsung_pin_bank_type *type; const struct samsung_pin_bank_type *type;
struct samsung_pin_bank *bank; struct samsung_pin_bank *bank;
void __iomem *reg; void __iomem *reg;
u32 mask, shift, data, pin_offset; u32 mask, shift, data, pin_offset;
...@@ -378,7 +378,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector, ...@@ -378,7 +378,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
func = &drvdata->pmx_functions[selector]; func = &drvdata->pmx_functions[selector];
grp = &drvdata->pin_groups[group]; grp = &drvdata->pin_groups[group];
pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->ctrl->base, pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->pin_base,
&reg, &pin_offset, &bank); &reg, &pin_offset, &bank);
type = bank->type; type = bank->type;
mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1; mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
...@@ -422,7 +422,7 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin, ...@@ -422,7 +422,7 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
unsigned long *config, bool set) unsigned long *config, bool set)
{ {
struct samsung_pinctrl_drv_data *drvdata; struct samsung_pinctrl_drv_data *drvdata;
struct samsung_pin_bank_type *type; const struct samsung_pin_bank_type *type;
struct samsung_pin_bank *bank; struct samsung_pin_bank *bank;
void __iomem *reg_base; void __iomem *reg_base;
enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config); enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config);
...@@ -431,7 +431,7 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin, ...@@ -431,7 +431,7 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
unsigned long flags; unsigned long flags;
drvdata = pinctrl_dev_get_drvdata(pctldev); drvdata = pinctrl_dev_get_drvdata(pctldev);
pin_to_reg_bank(drvdata, pin - drvdata->ctrl->base, &reg_base, pin_to_reg_bank(drvdata, pin - drvdata->pin_base, &reg_base,
&pin_offset, &bank); &pin_offset, &bank);
type = bank->type; type = bank->type;
...@@ -528,7 +528,7 @@ static const struct pinconf_ops samsung_pinconf_ops = { ...@@ -528,7 +528,7 @@ static const struct pinconf_ops samsung_pinconf_ops = {
static void samsung_gpio_set(struct gpio_chip *gc, unsigned offset, int value) static void samsung_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
{ {
struct samsung_pin_bank *bank = gc_to_pin_bank(gc); struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
struct samsung_pin_bank_type *type = bank->type; const struct samsung_pin_bank_type *type = bank->type;
unsigned long flags; unsigned long flags;
void __iomem *reg; void __iomem *reg;
u32 data; u32 data;
...@@ -552,7 +552,7 @@ static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset) ...@@ -552,7 +552,7 @@ static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset)
void __iomem *reg; void __iomem *reg;
u32 data; u32 data;
struct samsung_pin_bank *bank = gc_to_pin_bank(gc); struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
struct samsung_pin_bank_type *type = bank->type; const struct samsung_pin_bank_type *type = bank->type;
reg = bank->drvdata->virt_base + bank->pctl_offset; reg = bank->drvdata->virt_base + bank->pctl_offset;
...@@ -569,7 +569,7 @@ static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset) ...@@ -569,7 +569,7 @@ static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset)
static int samsung_gpio_set_direction(struct gpio_chip *gc, static int samsung_gpio_set_direction(struct gpio_chip *gc,
unsigned offset, bool input) unsigned offset, bool input)
{ {
struct samsung_pin_bank_type *type; const struct samsung_pin_bank_type *type;
struct samsung_pin_bank *bank; struct samsung_pin_bank *bank;
struct samsung_pinctrl_drv_data *drvdata; struct samsung_pinctrl_drv_data *drvdata;
void __iomem *reg; void __iomem *reg;
...@@ -834,32 +834,32 @@ static int samsung_pinctrl_register(struct platform_device *pdev, ...@@ -834,32 +834,32 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
ctrldesc->confops = &samsung_pinconf_ops; ctrldesc->confops = &samsung_pinconf_ops;
pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) * pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
drvdata->ctrl->nr_pins, GFP_KERNEL); drvdata->nr_pins, GFP_KERNEL);
if (!pindesc) { if (!pindesc) {
dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n"); dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
return -ENOMEM; return -ENOMEM;
} }
ctrldesc->pins = pindesc; ctrldesc->pins = pindesc;
ctrldesc->npins = drvdata->ctrl->nr_pins; ctrldesc->npins = drvdata->nr_pins;
/* dynamically populate the pin number and pin name for pindesc */ /* dynamically populate the pin number and pin name for pindesc */
for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++) for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
pdesc->number = pin + drvdata->ctrl->base; pdesc->number = pin + drvdata->pin_base;
/* /*
* allocate space for storing the dynamically generated names for all * allocate space for storing the dynamically generated names for all
* the pins which belong to this pin-controller. * the pins which belong to this pin-controller.
*/ */
pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH * pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
drvdata->ctrl->nr_pins, GFP_KERNEL); drvdata->nr_pins, GFP_KERNEL);
if (!pin_names) { if (!pin_names) {
dev_err(&pdev->dev, "mem alloc for pin names failed\n"); dev_err(&pdev->dev, "mem alloc for pin names failed\n");
return -ENOMEM; return -ENOMEM;
} }
/* for each pin, the name of the pin is pin-bank name + pin number */ /* for each pin, the name of the pin is pin-bank name + pin number */
for (bank = 0; bank < drvdata->ctrl->nr_banks; bank++) { for (bank = 0; bank < drvdata->nr_banks; bank++) {
pin_bank = &drvdata->ctrl->pin_banks[bank]; pin_bank = &drvdata->pin_banks[bank];
for (pin = 0; pin < pin_bank->nr_pins; pin++) { for (pin = 0; pin < pin_bank->nr_pins; pin++) {
sprintf(pin_names, "%s-%d", pin_bank->name, pin); sprintf(pin_names, "%s-%d", pin_bank->name, pin);
pdesc = pindesc + pin_bank->pin_base + pin; pdesc = pindesc + pin_bank->pin_base + pin;
...@@ -878,11 +878,11 @@ static int samsung_pinctrl_register(struct platform_device *pdev, ...@@ -878,11 +878,11 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
return -EINVAL; return -EINVAL;
} }
for (bank = 0; bank < drvdata->ctrl->nr_banks; ++bank) { for (bank = 0; bank < drvdata->nr_banks; ++bank) {
pin_bank = &drvdata->ctrl->pin_banks[bank]; pin_bank = &drvdata->pin_banks[bank];
pin_bank->grange.name = pin_bank->name; pin_bank->grange.name = pin_bank->name;
pin_bank->grange.id = bank; pin_bank->grange.id = bank;
pin_bank->grange.pin_base = drvdata->ctrl->base pin_bank->grange.pin_base = drvdata->pin_base
+ pin_bank->pin_base; + pin_bank->pin_base;
pin_bank->grange.base = pin_bank->gpio_chip.base; pin_bank->grange.base = pin_bank->gpio_chip.base;
pin_bank->grange.npins = pin_bank->gpio_chip.ngpio; pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
...@@ -918,17 +918,16 @@ static const struct gpio_chip samsung_gpiolib_chip = { ...@@ -918,17 +918,16 @@ static const struct gpio_chip samsung_gpiolib_chip = {
static int samsung_gpiolib_register(struct platform_device *pdev, static int samsung_gpiolib_register(struct platform_device *pdev,
struct samsung_pinctrl_drv_data *drvdata) struct samsung_pinctrl_drv_data *drvdata)
{ {
struct samsung_pin_ctrl *ctrl = drvdata->ctrl; struct samsung_pin_bank *bank = drvdata->pin_banks;
struct samsung_pin_bank *bank = ctrl->pin_banks;
struct gpio_chip *gc; struct gpio_chip *gc;
int ret; int ret;
int i; int i;
for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { for (i = 0; i < drvdata->nr_banks; ++i, ++bank) {
bank->gpio_chip = samsung_gpiolib_chip; bank->gpio_chip = samsung_gpiolib_chip;
gc = &bank->gpio_chip; gc = &bank->gpio_chip;
gc->base = ctrl->base + bank->pin_base; gc->base = drvdata->pin_base + bank->pin_base;
gc->ngpio = bank->nr_pins; gc->ngpio = bank->nr_pins;
gc->dev = &pdev->dev; gc->dev = &pdev->dev;
gc->of_node = bank->of_node; gc->of_node = bank->of_node;
...@@ -954,51 +953,70 @@ static int samsung_gpiolib_register(struct platform_device *pdev, ...@@ -954,51 +953,70 @@ static int samsung_gpiolib_register(struct platform_device *pdev,
static int samsung_gpiolib_unregister(struct platform_device *pdev, static int samsung_gpiolib_unregister(struct platform_device *pdev,
struct samsung_pinctrl_drv_data *drvdata) struct samsung_pinctrl_drv_data *drvdata)
{ {
struct samsung_pin_ctrl *ctrl = drvdata->ctrl; struct samsung_pin_bank *bank = drvdata->pin_banks;
struct samsung_pin_bank *bank = ctrl->pin_banks;
int i; int i;
for (i = 0; i < ctrl->nr_banks; ++i, ++bank) for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
gpiochip_remove(&bank->gpio_chip); gpiochip_remove(&bank->gpio_chip);
return 0; return 0;
} }
static const struct of_device_id samsung_pinctrl_dt_match[]; static const struct of_device_id samsung_pinctrl_dt_match[];
/* retrieve the soc specific data */ /* retrieve the soc specific data */
static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data( static const struct samsung_pin_ctrl *
struct samsung_pinctrl_drv_data *d, samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
struct platform_device *pdev) struct platform_device *pdev)
{ {
int id; int id;
const struct of_device_id *match; const struct of_device_id *match;
struct device_node *node = pdev->dev.of_node; struct device_node *node = pdev->dev.of_node;
struct device_node *np; struct device_node *np;
struct samsung_pin_ctrl *ctrl; const struct samsung_pin_bank_data *bdata;
const struct samsung_pin_ctrl *ctrl;
struct samsung_pin_bank *bank; struct samsung_pin_bank *bank;
int i; int i;
id = of_alias_get_id(node, "pinctrl"); id = of_alias_get_id(node, "pinctrl");
if (id < 0) { if (id < 0) {
dev_err(&pdev->dev, "failed to get alias id\n"); dev_err(&pdev->dev, "failed to get alias id\n");
return NULL; return ERR_PTR(-ENOENT);
} }
match = of_match_node(samsung_pinctrl_dt_match, node); match = of_match_node(samsung_pinctrl_dt_match, node);
ctrl = (struct samsung_pin_ctrl *)match->data + id; ctrl = (struct samsung_pin_ctrl *)match->data + id;
bank = ctrl->pin_banks; d->suspend = ctrl->suspend;
for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { d->resume = ctrl->resume;
d->nr_banks = ctrl->nr_banks;
d->pin_banks = devm_kcalloc(&pdev->dev, d->nr_banks,
sizeof(*d->pin_banks), GFP_KERNEL);
if (!d->pin_banks)
return ERR_PTR(-ENOMEM);
bank = d->pin_banks;
bdata = ctrl->pin_banks;
for (i = 0; i < ctrl->nr_banks; ++i, ++bdata, ++bank) {
bank->type = bdata->type;
bank->pctl_offset = bdata->pctl_offset;
bank->nr_pins = bdata->nr_pins;
bank->eint_func = bdata->eint_func;
bank->eint_type = bdata->eint_type;
bank->eint_mask = bdata->eint_mask;
bank->eint_offset = bdata->eint_offset;
bank->name = bdata->name;
spin_lock_init(&bank->slock); spin_lock_init(&bank->slock);
bank->drvdata = d; bank->drvdata = d;
bank->pin_base = ctrl->nr_pins; bank->pin_base = d->nr_pins;
ctrl->nr_pins += bank->nr_pins; d->nr_pins += bank->nr_pins;
} }
for_each_child_of_node(node, np) { for_each_child_of_node(node, np) {
if (!of_find_property(np, "gpio-controller", NULL)) if (!of_find_property(np, "gpio-controller", NULL))
continue; continue;
bank = ctrl->pin_banks; bank = d->pin_banks;
for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { for (i = 0; i < d->nr_banks; ++i, ++bank) {
if (!strcmp(bank->name, np->name)) { if (!strcmp(bank->name, np->name)) {
bank->of_node = np; bank->of_node = np;
break; break;
...@@ -1006,8 +1024,8 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data( ...@@ -1006,8 +1024,8 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
} }
} }
ctrl->base = pin_base; d->pin_base = pin_base;
pin_base += ctrl->nr_pins; pin_base += d->nr_pins;
return ctrl; return ctrl;
} }
...@@ -1015,8 +1033,8 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data( ...@@ -1015,8 +1033,8 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
static int samsung_pinctrl_probe(struct platform_device *pdev) static int samsung_pinctrl_probe(struct platform_device *pdev)
{ {
struct samsung_pinctrl_drv_data *drvdata; struct samsung_pinctrl_drv_data *drvdata;
const struct samsung_pin_ctrl *ctrl;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct samsung_pin_ctrl *ctrl;
struct resource *res; struct resource *res;
int ret; int ret;
...@@ -1033,11 +1051,10 @@ static int samsung_pinctrl_probe(struct platform_device *pdev) ...@@ -1033,11 +1051,10 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
} }
ctrl = samsung_pinctrl_get_soc_data(drvdata, pdev); ctrl = samsung_pinctrl_get_soc_data(drvdata, pdev);
if (!ctrl) { if (IS_ERR(ctrl)) {
dev_err(&pdev->dev, "driver data not available\n"); dev_err(&pdev->dev, "driver data not available\n");
return -EINVAL; return PTR_ERR(ctrl);
} }
drvdata->ctrl = ctrl;
drvdata->dev = dev; drvdata->dev = dev;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
...@@ -1082,16 +1099,14 @@ static int samsung_pinctrl_probe(struct platform_device *pdev) ...@@ -1082,16 +1099,14 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
static void samsung_pinctrl_suspend_dev( static void samsung_pinctrl_suspend_dev(
struct samsung_pinctrl_drv_data *drvdata) struct samsung_pinctrl_drv_data *drvdata)
{ {
struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
void __iomem *virt_base = drvdata->virt_base; void __iomem *virt_base = drvdata->virt_base;
int i; int i;
for (i = 0; i < ctrl->nr_banks; i++) { for (i = 0; i < drvdata->nr_banks; i++) {
struct samsung_pin_bank *bank = &ctrl->pin_banks[i]; struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
void __iomem *reg = virt_base + bank->pctl_offset; void __iomem *reg = virt_base + bank->pctl_offset;
const u8 *offs = bank->type->reg_offset;
u8 *offs = bank->type->reg_offset; const u8 *widths = bank->type->fld_width;
u8 *widths = bank->type->fld_width;
enum pincfg_type type; enum pincfg_type type;
/* Registers without a powerdown config aren't lost */ /* Registers without a powerdown config aren't lost */
...@@ -1116,8 +1131,8 @@ static void samsung_pinctrl_suspend_dev( ...@@ -1116,8 +1131,8 @@ static void samsung_pinctrl_suspend_dev(
} }
} }
if (ctrl->suspend) if (drvdata->suspend)
ctrl->suspend(drvdata); drvdata->suspend(drvdata);
} }
/** /**
...@@ -1130,19 +1145,17 @@ static void samsung_pinctrl_suspend_dev( ...@@ -1130,19 +1145,17 @@ static void samsung_pinctrl_suspend_dev(
*/ */
static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata) static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata)
{ {
struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
void __iomem *virt_base = drvdata->virt_base; void __iomem *virt_base = drvdata->virt_base;
int i; int i;
if (ctrl->resume) if (drvdata->resume)
ctrl->resume(drvdata); drvdata->resume(drvdata);
for (i = 0; i < ctrl->nr_banks; i++) { for (i = 0; i < drvdata->nr_banks; i++) {
struct samsung_pin_bank *bank = &ctrl->pin_banks[i]; struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
void __iomem *reg = virt_base + bank->pctl_offset; void __iomem *reg = virt_base + bank->pctl_offset;
const u8 *offs = bank->type->reg_offset;
u8 *offs = bank->type->reg_offset; const u8 *widths = bank->type->fld_width;
u8 *widths = bank->type->fld_width;
enum pincfg_type type; enum pincfg_type type;
/* Registers without a powerdown config aren't lost */ /* Registers without a powerdown config aren't lost */
...@@ -1218,6 +1231,8 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = { ...@@ -1218,6 +1231,8 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = {
.data = (void *)exynos4210_pin_ctrl }, .data = (void *)exynos4210_pin_ctrl },
{ .compatible = "samsung,exynos4x12-pinctrl", { .compatible = "samsung,exynos4x12-pinctrl",
.data = (void *)exynos4x12_pin_ctrl }, .data = (void *)exynos4x12_pin_ctrl },
{ .compatible = "samsung,exynos4415-pinctrl",
.data = (void *)exynos4415_pin_ctrl },
{ .compatible = "samsung,exynos5250-pinctrl", { .compatible = "samsung,exynos5250-pinctrl",
.data = (void *)exynos5250_pin_ctrl }, .data = (void *)exynos5250_pin_ctrl },
{ .compatible = "samsung,exynos5260-pinctrl", { .compatible = "samsung,exynos5260-pinctrl",
...@@ -1226,6 +1241,8 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = { ...@@ -1226,6 +1241,8 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = {
.data = (void *)exynos5420_pin_ctrl }, .data = (void *)exynos5420_pin_ctrl },
{ .compatible = "samsung,s5pv210-pinctrl", { .compatible = "samsung,s5pv210-pinctrl",
.data = (void *)s5pv210_pin_ctrl }, .data = (void *)s5pv210_pin_ctrl },
{ .compatible = "samsung,exynos7-pinctrl",
.data = (void *)exynos7_pin_ctrl },
#endif #endif
#ifdef CONFIG_PINCTRL_S3C64XX #ifdef CONFIG_PINCTRL_S3C64XX
{ .compatible = "samsung,s3c64xx-pinctrl", { .compatible = "samsung,s3c64xx-pinctrl",
......
...@@ -112,40 +112,67 @@ struct samsung_pin_bank_type { ...@@ -112,40 +112,67 @@ struct samsung_pin_bank_type {
u8 reg_offset[PINCFG_TYPE_NUM]; u8 reg_offset[PINCFG_TYPE_NUM];
}; };
/**
* struct samsung_pin_bank_data: represent a controller pin-bank (init data).
* @type: type of the bank (register offsets and bitfield widths)
* @pctl_offset: starting offset of the pin-bank registers.
* @nr_pins: number of pins included in this bank.
* @eint_func: function to set in CON register to configure pin as EINT.
* @eint_type: type of the external interrupt supported by the bank.
* @eint_mask: bit mask of pins which support EINT function.
* @eint_offset: SoC-specific EINT register or interrupt offset of bank.
* @name: name to be prefixed for each pin in this pin bank.
*/
struct samsung_pin_bank_data {
const struct samsung_pin_bank_type *type;
u32 pctl_offset;
u8 nr_pins;
u8 eint_func;
enum eint_type eint_type;
u32 eint_mask;
u32 eint_offset;
const char *name;
};
/** /**
* struct samsung_pin_bank: represent a controller pin-bank. * struct samsung_pin_bank: represent a controller pin-bank.
* @type: type of the bank (register offsets and bitfield widths) * @type: type of the bank (register offsets and bitfield widths)
* @pctl_offset: starting offset of the pin-bank registers. * @pctl_offset: starting offset of the pin-bank registers.
* @pin_base: starting pin number of the bank.
* @nr_pins: number of pins included in this bank. * @nr_pins: number of pins included in this bank.
* @eint_func: function to set in CON register to configure pin as EINT. * @eint_func: function to set in CON register to configure pin as EINT.
* @eint_type: type of the external interrupt supported by the bank. * @eint_type: type of the external interrupt supported by the bank.
* @eint_mask: bit mask of pins which support EINT function. * @eint_mask: bit mask of pins which support EINT function.
* @eint_offset: SoC-specific EINT register or interrupt offset of bank.
* @name: name to be prefixed for each pin in this pin bank. * @name: name to be prefixed for each pin in this pin bank.
* @pin_base: starting pin number of the bank.
* @soc_priv: per-bank private data for SoC-specific code.
* @of_node: OF node of the bank. * @of_node: OF node of the bank.
* @drvdata: link to controller driver data * @drvdata: link to controller driver data
* @irq_domain: IRQ domain of the bank. * @irq_domain: IRQ domain of the bank.
* @gpio_chip: GPIO chip of the bank. * @gpio_chip: GPIO chip of the bank.
* @grange: linux gpio pin range supported by this bank. * @grange: linux gpio pin range supported by this bank.
* @irq_chip: link to irq chip for external gpio and wakeup interrupts.
* @slock: spinlock protecting bank registers * @slock: spinlock protecting bank registers
* @pm_save: saved register values during suspend * @pm_save: saved register values during suspend
*/ */
struct samsung_pin_bank { struct samsung_pin_bank {
struct samsung_pin_bank_type *type; const struct samsung_pin_bank_type *type;
u32 pctl_offset; u32 pctl_offset;
u32 pin_base;
u8 nr_pins; u8 nr_pins;
u8 eint_func; u8 eint_func;
enum eint_type eint_type; enum eint_type eint_type;
u32 eint_mask; u32 eint_mask;
u32 eint_offset; u32 eint_offset;
char *name; const char *name;
u32 pin_base;
void *soc_priv; void *soc_priv;
struct device_node *of_node; struct device_node *of_node;
struct samsung_pinctrl_drv_data *drvdata; struct samsung_pinctrl_drv_data *drvdata;
struct irq_domain *irq_domain; struct irq_domain *irq_domain;
struct gpio_chip gpio_chip; struct gpio_chip gpio_chip;
struct pinctrl_gpio_range grange; struct pinctrl_gpio_range grange;
struct exynos_irq_chip *irq_chip;
spinlock_t slock; spinlock_t slock;
u32 pm_save[PINCFG_TYPE_NUM + 1]; /* +1 to handle double CON registers*/ u32 pm_save[PINCFG_TYPE_NUM + 1]; /* +1 to handle double CON registers*/
...@@ -155,27 +182,19 @@ struct samsung_pin_bank { ...@@ -155,27 +182,19 @@ struct samsung_pin_bank {
* struct samsung_pin_ctrl: represent a pin controller. * struct samsung_pin_ctrl: represent a pin controller.
* @pin_banks: list of pin banks included in this controller. * @pin_banks: list of pin banks included in this controller.
* @nr_banks: number of pin banks. * @nr_banks: number of pin banks.
* @base: starting system wide pin number.
* @nr_pins: number of pins supported by the controller.
* @eint_gpio_init: platform specific callback to setup the external gpio * @eint_gpio_init: platform specific callback to setup the external gpio
* interrupts for the controller. * interrupts for the controller.
* @eint_wkup_init: platform specific callback to setup the external wakeup * @eint_wkup_init: platform specific callback to setup the external wakeup
* interrupts for the controller. * interrupts for the controller.
* @label: for debug information.
*/ */
struct samsung_pin_ctrl { struct samsung_pin_ctrl {
struct samsung_pin_bank *pin_banks; const struct samsung_pin_bank_data *pin_banks;
u32 nr_banks; u32 nr_banks;
u32 base;
u32 nr_pins;
int (*eint_gpio_init)(struct samsung_pinctrl_drv_data *); int (*eint_gpio_init)(struct samsung_pinctrl_drv_data *);
int (*eint_wkup_init)(struct samsung_pinctrl_drv_data *); int (*eint_wkup_init)(struct samsung_pinctrl_drv_data *);
void (*suspend)(struct samsung_pinctrl_drv_data *); void (*suspend)(struct samsung_pinctrl_drv_data *);
void (*resume)(struct samsung_pinctrl_drv_data *); void (*resume)(struct samsung_pinctrl_drv_data *);
char *label;
}; };
/** /**
...@@ -191,6 +210,8 @@ struct samsung_pin_ctrl { ...@@ -191,6 +210,8 @@ struct samsung_pin_ctrl {
* @nr_groups: number of such pin groups. * @nr_groups: number of such pin groups.
* @pmx_functions: list of pin functions available to the driver. * @pmx_functions: list of pin functions available to the driver.
* @nr_function: number of such pin functions. * @nr_function: number of such pin functions.
* @pin_base: starting system wide pin number.
* @nr_pins: number of pins supported by the controller.
*/ */
struct samsung_pinctrl_drv_data { struct samsung_pinctrl_drv_data {
struct list_head node; struct list_head node;
...@@ -198,7 +219,6 @@ struct samsung_pinctrl_drv_data { ...@@ -198,7 +219,6 @@ struct samsung_pinctrl_drv_data {
struct device *dev; struct device *dev;
int irq; int irq;
struct samsung_pin_ctrl *ctrl;
struct pinctrl_desc pctl; struct pinctrl_desc pctl;
struct pinctrl_dev *pctl_dev; struct pinctrl_dev *pctl_dev;
...@@ -206,6 +226,14 @@ struct samsung_pinctrl_drv_data { ...@@ -206,6 +226,14 @@ struct samsung_pinctrl_drv_data {
unsigned int nr_groups; unsigned int nr_groups;
const struct samsung_pmx_func *pmx_functions; const struct samsung_pmx_func *pmx_functions;
unsigned int nr_functions; unsigned int nr_functions;
struct samsung_pin_bank *pin_banks;
u32 nr_banks;
unsigned int pin_base;
unsigned int nr_pins;
void (*suspend)(struct samsung_pinctrl_drv_data *);
void (*resume)(struct samsung_pinctrl_drv_data *);
}; };
/** /**
...@@ -236,17 +264,19 @@ struct samsung_pmx_func { ...@@ -236,17 +264,19 @@ struct samsung_pmx_func {
}; };
/* list of all exported SoC specific data */ /* list of all exported SoC specific data */
extern struct samsung_pin_ctrl exynos3250_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos3250_pin_ctrl[];
extern struct samsung_pin_ctrl exynos4210_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos4210_pin_ctrl[];
extern struct samsung_pin_ctrl exynos4x12_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos4x12_pin_ctrl[];
extern struct samsung_pin_ctrl exynos5250_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos4415_pin_ctrl[];
extern struct samsung_pin_ctrl exynos5260_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos5250_pin_ctrl[];
extern struct samsung_pin_ctrl exynos5420_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos5260_pin_ctrl[];
extern struct samsung_pin_ctrl s3c64xx_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos5420_pin_ctrl[];
extern struct samsung_pin_ctrl s3c2412_pin_ctrl[]; extern const struct samsung_pin_ctrl exynos7_pin_ctrl[];
extern struct samsung_pin_ctrl s3c2416_pin_ctrl[]; extern const struct samsung_pin_ctrl s3c64xx_pin_ctrl[];
extern struct samsung_pin_ctrl s3c2440_pin_ctrl[]; extern const struct samsung_pin_ctrl s3c2412_pin_ctrl[];
extern struct samsung_pin_ctrl s3c2450_pin_ctrl[]; extern const struct samsung_pin_ctrl s3c2416_pin_ctrl[];
extern struct samsung_pin_ctrl s5pv210_pin_ctrl[]; extern const struct samsung_pin_ctrl s3c2440_pin_ctrl[];
extern const struct samsung_pin_ctrl s3c2450_pin_ctrl[];
extern const struct samsung_pin_ctrl s5pv210_pin_ctrl[];
#endif /* __PINCTRL_SAMSUNG_H */ #endif /* __PINCTRL_SAMSUNG_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册