diff options
author | Tomasz Figa <t.figa@samsung.com> | 2012-10-11 04:11:09 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2012-10-15 03:10:11 -0400 |
commit | 40ba6227aeb3712b0cea0c4f9c3e355cf801f4c4 (patch) | |
tree | 1c253f6caa545c065c0bfc3c31cbdcf128501016 /drivers | |
parent | 62f14c0ef5d1bbd640b42a59f8f084f764a067c4 (diff) |
pinctrl: samsung: Assing pin numbers dynamically
This patch modifies the pinctrl-samsung driver to assign numbers to pins
dynamically instead of static enumerations.
Thanks to this change the amount of code requried to support a SoC can
be greatly reduced and the code made more readable.
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Reviewed-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Thomas Abraham <thomas.abraham@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pinctrl/pinctrl-exynos.c | 83 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-exynos.h | 11 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-samsung.c | 22 |
3 files changed, 62 insertions, 54 deletions
diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c index 21362f48d370..0ea2164bf6d9 100644 --- a/drivers/pinctrl/pinctrl-exynos.c +++ b/drivers/pinctrl/pinctrl-exynos.c | |||
@@ -484,51 +484,51 @@ static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) | |||
484 | 484 | ||
485 | /* pin banks of exynos4210 pin-controller 0 */ | 485 | /* pin banks of exynos4210 pin-controller 0 */ |
486 | static struct samsung_pin_bank exynos4210_pin_banks0[] = { | 486 | static struct samsung_pin_bank exynos4210_pin_banks0[] = { |
487 | EXYNOS_PIN_BANK_EINTG(0x000, EXYNOS4210_GPIO_A0, "gpa0"), | 487 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0"), |
488 | EXYNOS_PIN_BANK_EINTG(0x020, EXYNOS4210_GPIO_A1, "gpa1"), | 488 | EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1"), |
489 | EXYNOS_PIN_BANK_EINTG(0x040, EXYNOS4210_GPIO_B, "gpb"), | 489 | EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb"), |
490 | EXYNOS_PIN_BANK_EINTG(0x060, EXYNOS4210_GPIO_C0, "gpc0"), | 490 | EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0"), |
491 | EXYNOS_PIN_BANK_EINTG(0x080, EXYNOS4210_GPIO_C1, "gpc1"), | 491 | EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1"), |
492 | EXYNOS_PIN_BANK_EINTG(0x0A0, EXYNOS4210_GPIO_D0, "gpd0"), | 492 | EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0"), |
493 | EXYNOS_PIN_BANK_EINTG(0x0C0, EXYNOS4210_GPIO_D1, "gpd1"), | 493 | EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1"), |
494 | EXYNOS_PIN_BANK_EINTG(0x0E0, EXYNOS4210_GPIO_E0, "gpe0"), | 494 | EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0"), |
495 | EXYNOS_PIN_BANK_EINTG(0x100, EXYNOS4210_GPIO_E1, "gpe1"), | 495 | EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1"), |
496 | EXYNOS_PIN_BANK_EINTG(0x120, EXYNOS4210_GPIO_E2, "gpe2"), | 496 | EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2"), |
497 | EXYNOS_PIN_BANK_EINTG(0x140, EXYNOS4210_GPIO_E3, "gpe3"), | 497 | EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3"), |
498 | EXYNOS_PIN_BANK_EINTG(0x160, EXYNOS4210_GPIO_E4, "gpe4"), | 498 | EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4"), |
499 | EXYNOS_PIN_BANK_EINTG(0x180, EXYNOS4210_GPIO_F0, "gpf0"), | 499 | EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0"), |
500 | EXYNOS_PIN_BANK_EINTG(0x1A0, EXYNOS4210_GPIO_F1, "gpf1"), | 500 | EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1"), |
501 | EXYNOS_PIN_BANK_EINTG(0x1C0, EXYNOS4210_GPIO_F2, "gpf2"), | 501 | EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2"), |
502 | EXYNOS_PIN_BANK_EINTG(0x1E0, EXYNOS4210_GPIO_F3, "gpf3"), | 502 | EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3"), |
503 | }; | 503 | }; |
504 | 504 | ||
505 | /* pin banks of exynos4210 pin-controller 1 */ | 505 | /* pin banks of exynos4210 pin-controller 1 */ |
506 | static struct samsung_pin_bank exynos4210_pin_banks1[] = { | 506 | static struct samsung_pin_bank exynos4210_pin_banks1[] = { |
507 | EXYNOS_PIN_BANK_EINTG(0x000, EXYNOS4210_GPIO_J0, "gpj0"), | 507 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0"), |
508 | EXYNOS_PIN_BANK_EINTG(0x020, EXYNOS4210_GPIO_J1, "gpj1"), | 508 | EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1"), |
509 | EXYNOS_PIN_BANK_EINTG(0x040, EXYNOS4210_GPIO_K0, "gpk0"), | 509 | EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0"), |
510 | EXYNOS_PIN_BANK_EINTG(0x060, EXYNOS4210_GPIO_K1, "gpk1"), | 510 | EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1"), |
511 | EXYNOS_PIN_BANK_EINTG(0x080, EXYNOS4210_GPIO_K2, "gpk2"), | 511 | EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2"), |
512 | EXYNOS_PIN_BANK_EINTG(0x0A0, EXYNOS4210_GPIO_K3, "gpk3"), | 512 | EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3"), |
513 | EXYNOS_PIN_BANK_EINTG(0x0C0, EXYNOS4210_GPIO_L0, "gpl0"), | 513 | EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0"), |
514 | EXYNOS_PIN_BANK_EINTG(0x0E0, EXYNOS4210_GPIO_L1, "gpl1"), | 514 | EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1"), |
515 | EXYNOS_PIN_BANK_EINTG(0x100, EXYNOS4210_GPIO_L2, "gpl2"), | 515 | EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2"), |
516 | EXYNOS_PIN_BANK_EINTN(0x120, EXYNOS4210_GPIO_Y0, "gpy0"), | 516 | EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"), |
517 | EXYNOS_PIN_BANK_EINTN(0x140, EXYNOS4210_GPIO_Y1, "gpy1"), | 517 | EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"), |
518 | EXYNOS_PIN_BANK_EINTN(0x160, EXYNOS4210_GPIO_Y2, "gpy2"), | 518 | EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"), |
519 | EXYNOS_PIN_BANK_EINTN(0x180, EXYNOS4210_GPIO_Y3, "gpy3"), | 519 | EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"), |
520 | EXYNOS_PIN_BANK_EINTN(0x1A0, EXYNOS4210_GPIO_Y4, "gpy4"), | 520 | EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"), |
521 | EXYNOS_PIN_BANK_EINTN(0x1C0, EXYNOS4210_GPIO_Y5, "gpy5"), | 521 | EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"), |
522 | EXYNOS_PIN_BANK_EINTN(0x1E0, EXYNOS4210_GPIO_Y6, "gpy6"), | 522 | EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"), |
523 | EXYNOS_PIN_BANK_EINTN(0xC00, EXYNOS4210_GPIO_X0, "gpx0"), | 523 | EXYNOS_PIN_BANK_EINTN(8, 0xC00, "gpx0"), |
524 | EXYNOS_PIN_BANK_EINTN(0xC20, EXYNOS4210_GPIO_X1, "gpx1"), | 524 | EXYNOS_PIN_BANK_EINTN(8, 0xC20, "gpx1"), |
525 | EXYNOS_PIN_BANK_EINTN(0xC40, EXYNOS4210_GPIO_X2, "gpx2"), | 525 | EXYNOS_PIN_BANK_EINTN(8, 0xC40, "gpx2"), |
526 | EXYNOS_PIN_BANK_EINTN(0xC60, EXYNOS4210_GPIO_X3, "gpx3"), | 526 | EXYNOS_PIN_BANK_EINTN(8, 0xC60, "gpx3"), |
527 | }; | 527 | }; |
528 | 528 | ||
529 | /* pin banks of exynos4210 pin-controller 2 */ | 529 | /* pin banks of exynos4210 pin-controller 2 */ |
530 | static struct samsung_pin_bank exynos4210_pin_banks2[] = { | 530 | static struct samsung_pin_bank exynos4210_pin_banks2[] = { |
531 | EXYNOS_PIN_BANK_EINTN(0x000, EXYNOS4210_GPIO_Z, "gpz"), | 531 | EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"), |
532 | }; | 532 | }; |
533 | 533 | ||
534 | /* | 534 | /* |
@@ -540,9 +540,6 @@ struct samsung_pin_ctrl exynos4210_pin_ctrl[] = { | |||
540 | /* pin-controller instance 0 data */ | 540 | /* pin-controller instance 0 data */ |
541 | .pin_banks = exynos4210_pin_banks0, | 541 | .pin_banks = exynos4210_pin_banks0, |
542 | .nr_banks = ARRAY_SIZE(exynos4210_pin_banks0), | 542 | .nr_banks = ARRAY_SIZE(exynos4210_pin_banks0), |
543 | .base = EXYNOS4210_GPIO_A0_START, | ||
544 | .nr_pins = EXYNOS4210_GPIOA_NR_PINS, | ||
545 | .nr_gint = EXYNOS4210_GPIOA_NR_GINT, | ||
546 | .geint_con = EXYNOS_GPIO_ECON_OFFSET, | 543 | .geint_con = EXYNOS_GPIO_ECON_OFFSET, |
547 | .geint_mask = EXYNOS_GPIO_EMASK_OFFSET, | 544 | .geint_mask = EXYNOS_GPIO_EMASK_OFFSET, |
548 | .geint_pend = EXYNOS_GPIO_EPEND_OFFSET, | 545 | .geint_pend = EXYNOS_GPIO_EPEND_OFFSET, |
@@ -553,9 +550,6 @@ struct samsung_pin_ctrl exynos4210_pin_ctrl[] = { | |||
553 | /* pin-controller instance 1 data */ | 550 | /* pin-controller instance 1 data */ |
554 | .pin_banks = exynos4210_pin_banks1, | 551 | .pin_banks = exynos4210_pin_banks1, |
555 | .nr_banks = ARRAY_SIZE(exynos4210_pin_banks1), | 552 | .nr_banks = ARRAY_SIZE(exynos4210_pin_banks1), |
556 | .base = EXYNOS4210_GPIOA_NR_PINS, | ||
557 | .nr_pins = EXYNOS4210_GPIOB_NR_PINS, | ||
558 | .nr_gint = EXYNOS4210_GPIOB_NR_GINT, | ||
559 | .nr_wint = 32, | 553 | .nr_wint = 32, |
560 | .geint_con = EXYNOS_GPIO_ECON_OFFSET, | 554 | .geint_con = EXYNOS_GPIO_ECON_OFFSET, |
561 | .geint_mask = EXYNOS_GPIO_EMASK_OFFSET, | 555 | .geint_mask = EXYNOS_GPIO_EMASK_OFFSET, |
@@ -571,9 +565,6 @@ struct samsung_pin_ctrl exynos4210_pin_ctrl[] = { | |||
571 | /* pin-controller instance 2 data */ | 565 | /* pin-controller instance 2 data */ |
572 | .pin_banks = exynos4210_pin_banks2, | 566 | .pin_banks = exynos4210_pin_banks2, |
573 | .nr_banks = ARRAY_SIZE(exynos4210_pin_banks2), | 567 | .nr_banks = ARRAY_SIZE(exynos4210_pin_banks2), |
574 | .base = EXYNOS4210_GPIOA_NR_PINS + | ||
575 | EXYNOS4210_GPIOB_NR_PINS, | ||
576 | .nr_pins = EXYNOS4210_GPIOC_NR_PINS, | ||
577 | .label = "exynos4210-gpio-ctrl2", | 568 | .label = "exynos4210-gpio-ctrl2", |
578 | }, | 569 | }, |
579 | }; | 570 | }; |
diff --git a/drivers/pinctrl/pinctrl-exynos.h b/drivers/pinctrl/pinctrl-exynos.h index 31d0a06174e4..178846739e80 100644 --- a/drivers/pinctrl/pinctrl-exynos.h +++ b/drivers/pinctrl/pinctrl-exynos.h | |||
@@ -165,11 +165,10 @@ enum exynos4210_gpio_xc_start { | |||
165 | #define EXYNOS_EINT_MAX_PER_BANK 8 | 165 | #define EXYNOS_EINT_MAX_PER_BANK 8 |
166 | #define EXYNOS_EINT_NR_WKUP_EINT | 166 | #define EXYNOS_EINT_NR_WKUP_EINT |
167 | 167 | ||
168 | #define EXYNOS_PIN_BANK_EINTN(reg, __gpio, id) \ | 168 | #define EXYNOS_PIN_BANK_EINTN(pins, reg, id) \ |
169 | { \ | 169 | { \ |
170 | .pctl_offset = reg, \ | 170 | .pctl_offset = reg, \ |
171 | .pin_base = (__gpio##_START), \ | 171 | .nr_pins = pins, \ |
172 | .nr_pins = (__gpio##_NR), \ | ||
173 | .func_width = 4, \ | 172 | .func_width = 4, \ |
174 | .pud_width = 2, \ | 173 | .pud_width = 2, \ |
175 | .drv_width = 2, \ | 174 | .drv_width = 2, \ |
@@ -179,18 +178,16 @@ enum exynos4210_gpio_xc_start { | |||
179 | .name = id \ | 178 | .name = id \ |
180 | } | 179 | } |
181 | 180 | ||
182 | #define EXYNOS_PIN_BANK_EINTG(reg, __gpio, id) \ | 181 | #define EXYNOS_PIN_BANK_EINTG(pins, reg, id) \ |
183 | { \ | 182 | { \ |
184 | .pctl_offset = reg, \ | 183 | .pctl_offset = reg, \ |
185 | .pin_base = (__gpio##_START), \ | 184 | .nr_pins = pins, \ |
186 | .nr_pins = (__gpio##_NR), \ | ||
187 | .func_width = 4, \ | 185 | .func_width = 4, \ |
188 | .pud_width = 2, \ | 186 | .pud_width = 2, \ |
189 | .drv_width = 2, \ | 187 | .drv_width = 2, \ |
190 | .conpdn_width = 2, \ | 188 | .conpdn_width = 2, \ |
191 | .pudpdn_width = 2, \ | 189 | .pudpdn_width = 2, \ |
192 | .eint_type = EINT_TYPE_GPIO, \ | 190 | .eint_type = EINT_TYPE_GPIO, \ |
193 | .irq_base = (__gpio##_IRQ), \ | ||
194 | .name = id \ | 191 | .name = id \ |
195 | } | 192 | } |
196 | 193 | ||
diff --git a/drivers/pinctrl/pinctrl-samsung.c b/drivers/pinctrl/pinctrl-samsung.c index aa42d54e89c6..f219bb6779ef 100644 --- a/drivers/pinctrl/pinctrl-samsung.c +++ b/drivers/pinctrl/pinctrl-samsung.c | |||
@@ -46,6 +46,8 @@ struct pin_config { | |||
46 | { "samsung,pin-pud-pdn", PINCFG_TYPE_PUD_PDN }, | 46 | { "samsung,pin-pud-pdn", PINCFG_TYPE_PUD_PDN }, |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static unsigned int pin_base = 0; | ||
50 | |||
49 | /* check if the selector is a valid pin group selector */ | 51 | /* check if the selector is a valid pin group selector */ |
50 | static int samsung_get_group_count(struct pinctrl_dev *pctldev) | 52 | static int samsung_get_group_count(struct pinctrl_dev *pctldev) |
51 | { | 53 | { |
@@ -792,6 +794,9 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data( | |||
792 | int id; | 794 | int id; |
793 | const struct of_device_id *match; | 795 | const struct of_device_id *match; |
794 | const struct device_node *node = pdev->dev.of_node; | 796 | const struct device_node *node = pdev->dev.of_node; |
797 | struct samsung_pin_ctrl *ctrl; | ||
798 | struct samsung_pin_bank *bank; | ||
799 | int i; | ||
795 | 800 | ||
796 | id = of_alias_get_id(pdev->dev.of_node, "pinctrl"); | 801 | id = of_alias_get_id(pdev->dev.of_node, "pinctrl"); |
797 | if (id < 0) { | 802 | if (id < 0) { |
@@ -799,7 +804,22 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data( | |||
799 | return NULL; | 804 | return NULL; |
800 | } | 805 | } |
801 | match = of_match_node(samsung_pinctrl_dt_match, node); | 806 | match = of_match_node(samsung_pinctrl_dt_match, node); |
802 | return (struct samsung_pin_ctrl *)match->data + id; | 807 | ctrl = (struct samsung_pin_ctrl *)match->data + id; |
808 | |||
809 | bank = ctrl->pin_banks; | ||
810 | for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { | ||
811 | bank->pin_base = ctrl->nr_pins; | ||
812 | ctrl->nr_pins += bank->nr_pins; | ||
813 | if (bank->eint_type == EINT_TYPE_GPIO) { | ||
814 | bank->irq_base = ctrl->nr_gint; | ||
815 | ctrl->nr_gint += bank->nr_pins; | ||
816 | } | ||
817 | } | ||
818 | |||
819 | ctrl->base = pin_base; | ||
820 | pin_base += ctrl->nr_pins; | ||
821 | |||
822 | return ctrl; | ||
803 | } | 823 | } |
804 | 824 | ||
805 | static int __devinit samsung_pinctrl_probe(struct platform_device *pdev) | 825 | static int __devinit samsung_pinctrl_probe(struct platform_device *pdev) |