summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2017-01-13 06:03:30 -0500
committerLinus Walleij <linus.walleij@linaro.org>2017-01-18 03:56:35 -0500
commitad9ec4ecee6889321ae1752ce8793524a8cdfa7a (patch)
tree3db527cd0ad1da68a344ee2404c9715f48f3e25a /drivers/pinctrl
parent44aa9d0604f578cdd839d2f5295a9d920fb54999 (diff)
pinctrl: mvebu: switch drivers to generic simple mmio
Move the mvebu pinctrl drivers over to the generic simple mmio implementation, saving a substantial number of lines of code in the process. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-armada-370.c24
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-armada-375.c24
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-armada-38x.c24
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-armada-39x.c24
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-armada-xp.c31
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-dove.c52
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-kirkwood.c28
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-mvebu.h24
8 files changed, 45 insertions, 186 deletions
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-370.c b/drivers/pinctrl/mvebu/pinctrl-armada-370.c
index 4dc083ffd561..c2de4f8ee488 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-370.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-370.c
@@ -23,20 +23,6 @@
23 23
24#include "pinctrl-mvebu.h" 24#include "pinctrl-mvebu.h"
25 25
26static void __iomem *mpp_base;
27
28static int armada_370_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
29 unsigned pid, unsigned long *config)
30{
31 return default_mpp_ctrl_get(mpp_base, pid, config);
32}
33
34static int armada_370_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
35 unsigned pid, unsigned long config)
36{
37 return default_mpp_ctrl_set(mpp_base, pid, config);
38}
39
40static struct mvebu_mpp_mode mv88f6710_mpp_modes[] = { 26static struct mvebu_mpp_mode mv88f6710_mpp_modes[] = {
41 MPP_MODE(0, 27 MPP_MODE(0,
42 MPP_FUNCTION(0x0, "gpio", NULL), 28 MPP_FUNCTION(0x0, "gpio", NULL),
@@ -387,7 +373,7 @@ static const struct of_device_id armada_370_pinctrl_of_match[] = {
387}; 373};
388 374
389static const struct mvebu_mpp_ctrl mv88f6710_mpp_controls[] = { 375static const struct mvebu_mpp_ctrl mv88f6710_mpp_controls[] = {
390 MPP_FUNC_CTRL(0, 65, NULL, armada_370_mpp_ctrl), 376 MPP_FUNC_CTRL(0, 65, NULL, mvebu_mmio_mpp_ctrl),
391}; 377};
392 378
393static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = { 379static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = {
@@ -399,12 +385,6 @@ static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = {
399static int armada_370_pinctrl_probe(struct platform_device *pdev) 385static int armada_370_pinctrl_probe(struct platform_device *pdev)
400{ 386{
401 struct mvebu_pinctrl_soc_info *soc = &armada_370_pinctrl_info; 387 struct mvebu_pinctrl_soc_info *soc = &armada_370_pinctrl_info;
402 struct resource *res;
403
404 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
405 mpp_base = devm_ioremap_resource(&pdev->dev, res);
406 if (IS_ERR(mpp_base))
407 return PTR_ERR(mpp_base);
408 388
409 soc->variant = 0; /* no variants for Armada 370 */ 389 soc->variant = 0; /* no variants for Armada 370 */
410 soc->controls = mv88f6710_mpp_controls; 390 soc->controls = mv88f6710_mpp_controls;
@@ -416,7 +396,7 @@ static int armada_370_pinctrl_probe(struct platform_device *pdev)
416 396
417 pdev->dev.platform_data = soc; 397 pdev->dev.platform_data = soc;
418 398
419 return mvebu_pinctrl_probe(pdev); 399 return mvebu_pinctrl_simple_mmio_probe(pdev);
420} 400}
421 401
422static struct platform_driver armada_370_pinctrl_driver = { 402static struct platform_driver armada_370_pinctrl_driver = {
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-375.c b/drivers/pinctrl/mvebu/pinctrl-armada-375.c
index c6168102bd17..30cbf23b0b03 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-375.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-375.c
@@ -23,20 +23,6 @@
23 23
24#include "pinctrl-mvebu.h" 24#include "pinctrl-mvebu.h"
25 25
26static void __iomem *mpp_base;
27
28static int armada_375_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
29 unsigned pid, unsigned long *config)
30{
31 return default_mpp_ctrl_get(mpp_base, pid, config);
32}
33
34static int armada_375_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
35 unsigned pid, unsigned long config)
36{
37 return default_mpp_ctrl_set(mpp_base, pid, config);
38}
39
40static struct mvebu_mpp_mode mv88f6720_mpp_modes[] = { 26static struct mvebu_mpp_mode mv88f6720_mpp_modes[] = {
41 MPP_MODE(0, 27 MPP_MODE(0,
42 MPP_FUNCTION(0x0, "gpio", NULL), 28 MPP_FUNCTION(0x0, "gpio", NULL),
@@ -405,7 +391,7 @@ static const struct of_device_id armada_375_pinctrl_of_match[] = {
405}; 391};
406 392
407static const struct mvebu_mpp_ctrl mv88f6720_mpp_controls[] = { 393static const struct mvebu_mpp_ctrl mv88f6720_mpp_controls[] = {
408 MPP_FUNC_CTRL(0, 69, NULL, armada_375_mpp_ctrl), 394 MPP_FUNC_CTRL(0, 69, NULL, mvebu_mmio_mpp_ctrl),
409}; 395};
410 396
411static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = { 397static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = {
@@ -417,12 +403,6 @@ static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = {
417static int armada_375_pinctrl_probe(struct platform_device *pdev) 403static int armada_375_pinctrl_probe(struct platform_device *pdev)
418{ 404{
419 struct mvebu_pinctrl_soc_info *soc = &armada_375_pinctrl_info; 405 struct mvebu_pinctrl_soc_info *soc = &armada_375_pinctrl_info;
420 struct resource *res;
421
422 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
423 mpp_base = devm_ioremap_resource(&pdev->dev, res);
424 if (IS_ERR(mpp_base))
425 return PTR_ERR(mpp_base);
426 406
427 soc->variant = 0; /* no variants for Armada 375 */ 407 soc->variant = 0; /* no variants for Armada 375 */
428 soc->controls = mv88f6720_mpp_controls; 408 soc->controls = mv88f6720_mpp_controls;
@@ -434,7 +414,7 @@ static int armada_375_pinctrl_probe(struct platform_device *pdev)
434 414
435 pdev->dev.platform_data = soc; 415 pdev->dev.platform_data = soc;
436 416
437 return mvebu_pinctrl_probe(pdev); 417 return mvebu_pinctrl_simple_mmio_probe(pdev);
438} 418}
439 419
440static struct platform_driver armada_375_pinctrl_driver = { 420static struct platform_driver armada_375_pinctrl_driver = {
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-38x.c b/drivers/pinctrl/mvebu/pinctrl-armada-38x.c
index 98aee37effef..e66ed239522e 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-38x.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-38x.c
@@ -22,20 +22,6 @@
22 22
23#include "pinctrl-mvebu.h" 23#include "pinctrl-mvebu.h"
24 24
25static void __iomem *mpp_base;
26
27static int armada_38x_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
28 unsigned pid, unsigned long *config)
29{
30 return default_mpp_ctrl_get(mpp_base, pid, config);
31}
32
33static int armada_38x_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
34 unsigned pid, unsigned long config)
35{
36 return default_mpp_ctrl_set(mpp_base, pid, config);
37}
38
39enum { 25enum {
40 V_88F6810 = BIT(0), 26 V_88F6810 = BIT(0),
41 V_88F6820 = BIT(1), 27 V_88F6820 = BIT(1),
@@ -412,7 +398,7 @@ static const struct of_device_id armada_38x_pinctrl_of_match[] = {
412}; 398};
413 399
414static const struct mvebu_mpp_ctrl armada_38x_mpp_controls[] = { 400static const struct mvebu_mpp_ctrl armada_38x_mpp_controls[] = {
415 MPP_FUNC_CTRL(0, 59, NULL, armada_38x_mpp_ctrl), 401 MPP_FUNC_CTRL(0, 59, NULL, mvebu_mmio_mpp_ctrl),
416}; 402};
417 403
418static struct pinctrl_gpio_range armada_38x_mpp_gpio_ranges[] = { 404static struct pinctrl_gpio_range armada_38x_mpp_gpio_ranges[] = {
@@ -425,16 +411,10 @@ static int armada_38x_pinctrl_probe(struct platform_device *pdev)
425 struct mvebu_pinctrl_soc_info *soc = &armada_38x_pinctrl_info; 411 struct mvebu_pinctrl_soc_info *soc = &armada_38x_pinctrl_info;
426 const struct of_device_id *match = 412 const struct of_device_id *match =
427 of_match_device(armada_38x_pinctrl_of_match, &pdev->dev); 413 of_match_device(armada_38x_pinctrl_of_match, &pdev->dev);
428 struct resource *res;
429 414
430 if (!match) 415 if (!match)
431 return -ENODEV; 416 return -ENODEV;
432 417
433 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
434 mpp_base = devm_ioremap_resource(&pdev->dev, res);
435 if (IS_ERR(mpp_base))
436 return PTR_ERR(mpp_base);
437
438 soc->variant = (unsigned) match->data & 0xff; 418 soc->variant = (unsigned) match->data & 0xff;
439 soc->controls = armada_38x_mpp_controls; 419 soc->controls = armada_38x_mpp_controls;
440 soc->ncontrols = ARRAY_SIZE(armada_38x_mpp_controls); 420 soc->ncontrols = ARRAY_SIZE(armada_38x_mpp_controls);
@@ -445,7 +425,7 @@ static int armada_38x_pinctrl_probe(struct platform_device *pdev)
445 425
446 pdev->dev.platform_data = soc; 426 pdev->dev.platform_data = soc;
447 427
448 return mvebu_pinctrl_probe(pdev); 428 return mvebu_pinctrl_simple_mmio_probe(pdev);
449} 429}
450 430
451static struct platform_driver armada_38x_pinctrl_driver = { 431static struct platform_driver armada_38x_pinctrl_driver = {
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-39x.c b/drivers/pinctrl/mvebu/pinctrl-armada-39x.c
index 4b1ba4424e0a..697c8774a4da 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-39x.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-39x.c
@@ -22,20 +22,6 @@
22 22
23#include "pinctrl-mvebu.h" 23#include "pinctrl-mvebu.h"
24 24
25static void __iomem *mpp_base;
26
27static int armada_39x_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
28 unsigned pid, unsigned long *config)
29{
30 return default_mpp_ctrl_get(mpp_base, pid, config);
31}
32
33static int armada_39x_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
34 unsigned pid, unsigned long config)
35{
36 return default_mpp_ctrl_set(mpp_base, pid, config);
37}
38
39enum { 25enum {
40 V_88F6920 = BIT(0), 26 V_88F6920 = BIT(0),
41 V_88F6925 = BIT(1), 27 V_88F6925 = BIT(1),
@@ -394,7 +380,7 @@ static const struct of_device_id armada_39x_pinctrl_of_match[] = {
394}; 380};
395 381
396static const struct mvebu_mpp_ctrl armada_39x_mpp_controls[] = { 382static const struct mvebu_mpp_ctrl armada_39x_mpp_controls[] = {
397 MPP_FUNC_CTRL(0, 59, NULL, armada_39x_mpp_ctrl), 383 MPP_FUNC_CTRL(0, 59, NULL, mvebu_mmio_mpp_ctrl),
398}; 384};
399 385
400static struct pinctrl_gpio_range armada_39x_mpp_gpio_ranges[] = { 386static struct pinctrl_gpio_range armada_39x_mpp_gpio_ranges[] = {
@@ -407,16 +393,10 @@ static int armada_39x_pinctrl_probe(struct platform_device *pdev)
407 struct mvebu_pinctrl_soc_info *soc = &armada_39x_pinctrl_info; 393 struct mvebu_pinctrl_soc_info *soc = &armada_39x_pinctrl_info;
408 const struct of_device_id *match = 394 const struct of_device_id *match =
409 of_match_device(armada_39x_pinctrl_of_match, &pdev->dev); 395 of_match_device(armada_39x_pinctrl_of_match, &pdev->dev);
410 struct resource *res;
411 396
412 if (!match) 397 if (!match)
413 return -ENODEV; 398 return -ENODEV;
414 399
415 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
416 mpp_base = devm_ioremap_resource(&pdev->dev, res);
417 if (IS_ERR(mpp_base))
418 return PTR_ERR(mpp_base);
419
420 soc->variant = (unsigned) match->data & 0xff; 400 soc->variant = (unsigned) match->data & 0xff;
421 soc->controls = armada_39x_mpp_controls; 401 soc->controls = armada_39x_mpp_controls;
422 soc->ncontrols = ARRAY_SIZE(armada_39x_mpp_controls); 402 soc->ncontrols = ARRAY_SIZE(armada_39x_mpp_controls);
@@ -427,7 +407,7 @@ static int armada_39x_pinctrl_probe(struct platform_device *pdev)
427 407
428 pdev->dev.platform_data = soc; 408 pdev->dev.platform_data = soc;
429 409
430 return mvebu_pinctrl_probe(pdev); 410 return mvebu_pinctrl_simple_mmio_probe(pdev);
431} 411}
432 412
433static struct platform_driver armada_39x_pinctrl_driver = { 413static struct platform_driver armada_39x_pinctrl_driver = {
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c
index a777925e0f34..63e1bd506983 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c
@@ -30,21 +30,8 @@
30 30
31#include "pinctrl-mvebu.h" 31#include "pinctrl-mvebu.h"
32 32
33static void __iomem *mpp_base;
34static u32 *mpp_saved_regs; 33static u32 *mpp_saved_regs;
35 34
36static int armada_xp_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
37 unsigned pid, unsigned long *config)
38{
39 return default_mpp_ctrl_get(mpp_base, pid, config);
40}
41
42static int armada_xp_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
43 unsigned pid, unsigned long config)
44{
45 return default_mpp_ctrl_set(mpp_base, pid, config);
46}
47
48enum armada_xp_variant { 35enum armada_xp_variant {
49 V_MV78230 = BIT(0), 36 V_MV78230 = BIT(0),
50 V_MV78260 = BIT(1), 37 V_MV78260 = BIT(1),
@@ -381,7 +368,7 @@ static const struct of_device_id armada_xp_pinctrl_of_match[] = {
381}; 368};
382 369
383static const struct mvebu_mpp_ctrl mv78230_mpp_controls[] = { 370static const struct mvebu_mpp_ctrl mv78230_mpp_controls[] = {
384 MPP_FUNC_CTRL(0, 48, NULL, armada_xp_mpp_ctrl), 371 MPP_FUNC_CTRL(0, 48, NULL, mvebu_mmio_mpp_ctrl),
385}; 372};
386 373
387static struct pinctrl_gpio_range mv78230_mpp_gpio_ranges[] = { 374static struct pinctrl_gpio_range mv78230_mpp_gpio_ranges[] = {
@@ -390,7 +377,7 @@ static struct pinctrl_gpio_range mv78230_mpp_gpio_ranges[] = {
390}; 377};
391 378
392static const struct mvebu_mpp_ctrl mv78260_mpp_controls[] = { 379static const struct mvebu_mpp_ctrl mv78260_mpp_controls[] = {
393 MPP_FUNC_CTRL(0, 66, NULL, armada_xp_mpp_ctrl), 380 MPP_FUNC_CTRL(0, 66, NULL, mvebu_mmio_mpp_ctrl),
394}; 381};
395 382
396static struct pinctrl_gpio_range mv78260_mpp_gpio_ranges[] = { 383static struct pinctrl_gpio_range mv78260_mpp_gpio_ranges[] = {
@@ -400,7 +387,7 @@ static struct pinctrl_gpio_range mv78260_mpp_gpio_ranges[] = {
400}; 387};
401 388
402static const struct mvebu_mpp_ctrl mv78460_mpp_controls[] = { 389static const struct mvebu_mpp_ctrl mv78460_mpp_controls[] = {
403 MPP_FUNC_CTRL(0, 66, NULL, armada_xp_mpp_ctrl), 390 MPP_FUNC_CTRL(0, 66, NULL, mvebu_mmio_mpp_ctrl),
404}; 391};
405 392
406static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = { 393static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = {
@@ -419,7 +406,7 @@ static int armada_xp_pinctrl_suspend(struct platform_device *pdev,
419 nregs = DIV_ROUND_UP(soc->nmodes, MVEBU_MPPS_PER_REG); 406 nregs = DIV_ROUND_UP(soc->nmodes, MVEBU_MPPS_PER_REG);
420 407
421 for (i = 0; i < nregs; i++) 408 for (i = 0; i < nregs; i++)
422 mpp_saved_regs[i] = readl(mpp_base + i * 4); 409 mpp_saved_regs[i] = readl(soc->control_data[0].base + i * 4);
423 410
424 return 0; 411 return 0;
425} 412}
@@ -433,7 +420,7 @@ static int armada_xp_pinctrl_resume(struct platform_device *pdev)
433 nregs = DIV_ROUND_UP(soc->nmodes, MVEBU_MPPS_PER_REG); 420 nregs = DIV_ROUND_UP(soc->nmodes, MVEBU_MPPS_PER_REG);
434 421
435 for (i = 0; i < nregs; i++) 422 for (i = 0; i < nregs; i++)
436 writel(mpp_saved_regs[i], mpp_base + i * 4); 423 writel(mpp_saved_regs[i], soc->control_data[0].base + i * 4);
437 424
438 return 0; 425 return 0;
439} 426}
@@ -443,17 +430,11 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev)
443 struct mvebu_pinctrl_soc_info *soc = &armada_xp_pinctrl_info; 430 struct mvebu_pinctrl_soc_info *soc = &armada_xp_pinctrl_info;
444 const struct of_device_id *match = 431 const struct of_device_id *match =
445 of_match_device(armada_xp_pinctrl_of_match, &pdev->dev); 432 of_match_device(armada_xp_pinctrl_of_match, &pdev->dev);
446 struct resource *res;
447 int nregs; 433 int nregs;
448 434
449 if (!match) 435 if (!match)
450 return -ENODEV; 436 return -ENODEV;
451 437
452 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
453 mpp_base = devm_ioremap_resource(&pdev->dev, res);
454 if (IS_ERR(mpp_base))
455 return PTR_ERR(mpp_base);
456
457 soc->variant = (unsigned) match->data & 0xff; 438 soc->variant = (unsigned) match->data & 0xff;
458 439
459 switch (soc->variant) { 440 switch (soc->variant) {
@@ -501,7 +482,7 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev)
501 482
502 pdev->dev.platform_data = soc; 483 pdev->dev.platform_data = soc;
503 484
504 return mvebu_pinctrl_probe(pdev); 485 return mvebu_pinctrl_simple_mmio_probe(pdev);
505} 486}
506 487
507static struct platform_driver armada_xp_pinctrl_driver = { 488static struct platform_driver armada_xp_pinctrl_driver = {
diff --git a/drivers/pinctrl/mvebu/pinctrl-dove.c b/drivers/pinctrl/mvebu/pinctrl-dove.c
index fb0b42c24405..89ae93c49f2f 100644
--- a/drivers/pinctrl/mvebu/pinctrl-dove.c
+++ b/drivers/pinctrl/mvebu/pinctrl-dove.c
@@ -61,33 +61,20 @@
61 61
62#define CONFIG_PMU BIT(4) 62#define CONFIG_PMU BIT(4)
63 63
64static void __iomem *mpp_base;
65static void __iomem *mpp4_base; 64static void __iomem *mpp4_base;
66static void __iomem *pmu_base; 65static void __iomem *pmu_base;
67static struct regmap *gconfmap; 66static struct regmap *gconfmap;
68 67
69static int dove_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
70 unsigned long *config)
71{
72 return default_mpp_ctrl_get(mpp_base, pid, config);
73}
74
75static int dove_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
76 unsigned long config)
77{
78 return default_mpp_ctrl_set(mpp_base, pid, config);
79}
80
81static int dove_pmu_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data, 68static int dove_pmu_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
82 unsigned pid, unsigned long *config) 69 unsigned pid, unsigned long *config)
83{ 70{
84 unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; 71 unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
85 unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; 72 unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
86 unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL); 73 unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
87 unsigned long func; 74 unsigned long func;
88 75
89 if ((pmu & BIT(pid)) == 0) 76 if ((pmu & BIT(pid)) == 0)
90 return default_mpp_ctrl_get(mpp_base, pid, config); 77 return mvebu_mmio_mpp_ctrl_get(data, pid, config);
91 78
92 func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off); 79 func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off);
93 *config = (func >> shift) & MVEBU_MPP_MASK; 80 *config = (func >> shift) & MVEBU_MPP_MASK;
@@ -101,15 +88,15 @@ static int dove_pmu_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
101{ 88{
102 unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; 89 unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
103 unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; 90 unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
104 unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL); 91 unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
105 unsigned long func; 92 unsigned long func;
106 93
107 if ((config & CONFIG_PMU) == 0) { 94 if ((config & CONFIG_PMU) == 0) {
108 writel(pmu & ~BIT(pid), mpp_base + PMU_MPP_GENERAL_CTRL); 95 writel(pmu & ~BIT(pid), data->base + PMU_MPP_GENERAL_CTRL);
109 return default_mpp_ctrl_set(mpp_base, pid, config); 96 return mvebu_mmio_mpp_ctrl_set(data, pid, config);
110 } 97 }
111 98
112 writel(pmu | BIT(pid), mpp_base + PMU_MPP_GENERAL_CTRL); 99 writel(pmu | BIT(pid), data->base + PMU_MPP_GENERAL_CTRL);
113 func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off); 100 func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off);
114 func &= ~(MVEBU_MPP_MASK << shift); 101 func &= ~(MVEBU_MPP_MASK << shift);
115 func |= (config & MVEBU_MPP_MASK) << shift; 102 func |= (config & MVEBU_MPP_MASK) << shift;
@@ -207,7 +194,7 @@ static int dove_nand_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
207static int dove_audio0_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid, 194static int dove_audio0_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
208 unsigned long *config) 195 unsigned long *config)
209{ 196{
210 unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL); 197 unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
211 198
212 *config = ((pmu & AU0_AC97_SEL) != 0); 199 *config = ((pmu & AU0_AC97_SEL) != 0);
213 200
@@ -217,12 +204,12 @@ static int dove_audio0_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
217static int dove_audio0_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid, 204static int dove_audio0_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
218 unsigned long config) 205 unsigned long config)
219{ 206{
220 unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL); 207 unsigned long pmu = readl(data->base + PMU_MPP_GENERAL_CTRL);
221 208
222 pmu &= ~AU0_AC97_SEL; 209 pmu &= ~AU0_AC97_SEL;
223 if (config) 210 if (config)
224 pmu |= AU0_AC97_SEL; 211 pmu |= AU0_AC97_SEL;
225 writel(pmu, mpp_base + PMU_MPP_GENERAL_CTRL); 212 writel(pmu, data->base + PMU_MPP_GENERAL_CTRL);
226 213
227 return 0; 214 return 0;
228} 215}
@@ -372,7 +359,7 @@ static int dove_twsi_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
372 359
373static const struct mvebu_mpp_ctrl dove_mpp_controls[] = { 360static const struct mvebu_mpp_ctrl dove_mpp_controls[] = {
374 MPP_FUNC_CTRL(0, 15, NULL, dove_pmu_mpp_ctrl), 361 MPP_FUNC_CTRL(0, 15, NULL, dove_pmu_mpp_ctrl),
375 MPP_FUNC_CTRL(16, 23, NULL, dove_mpp_ctrl), 362 MPP_FUNC_CTRL(16, 23, NULL, mvebu_mmio_mpp_ctrl),
376 MPP_FUNC_CTRL(24, 39, "mpp_camera", dove_mpp4_ctrl), 363 MPP_FUNC_CTRL(24, 39, "mpp_camera", dove_mpp4_ctrl),
377 MPP_FUNC_CTRL(40, 45, "mpp_sdio0", dove_mpp4_ctrl), 364 MPP_FUNC_CTRL(40, 45, "mpp_sdio0", dove_mpp4_ctrl),
378 MPP_FUNC_CTRL(46, 51, "mpp_sdio1", dove_mpp4_ctrl), 365 MPP_FUNC_CTRL(46, 51, "mpp_sdio1", dove_mpp4_ctrl),
@@ -785,6 +772,10 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
785 struct resource fb_res; 772 struct resource fb_res;
786 const struct of_device_id *match = 773 const struct of_device_id *match =
787 of_match_device(dove_pinctrl_of_match, &pdev->dev); 774 of_match_device(dove_pinctrl_of_match, &pdev->dev);
775 struct mvebu_mpp_ctrl_data *mpp_data;
776 void __iomem *base;
777 int i;
778
788 pdev->dev.platform_data = (void *)match->data; 779 pdev->dev.platform_data = (void *)match->data;
789 780
790 /* 781 /*
@@ -799,9 +790,18 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
799 clk_prepare_enable(clk); 790 clk_prepare_enable(clk);
800 791
801 mpp_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 792 mpp_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
802 mpp_base = devm_ioremap_resource(&pdev->dev, mpp_res); 793 base = devm_ioremap_resource(&pdev->dev, mpp_res);
803 if (IS_ERR(mpp_base)) 794 if (IS_ERR(base))
804 return PTR_ERR(mpp_base); 795 return PTR_ERR(base);
796
797 mpp_data = devm_kcalloc(&pdev->dev, dove_pinctrl_info.ncontrols,
798 sizeof(*mpp_data), GFP_KERNEL);
799 if (!mpp_data)
800 return -ENOMEM;
801
802 dove_pinctrl_info.control_data = mpp_data;
803 for (i = 0; i < ARRAY_SIZE(dove_mpp_controls); i++)
804 mpp_data[i].base = base;
805 805
806 /* prepare fallback resource */ 806 /* prepare fallback resource */
807 memcpy(&fb_res, mpp_res, sizeof(struct resource)); 807 memcpy(&fb_res, mpp_res, sizeof(struct resource));
diff --git a/drivers/pinctrl/mvebu/pinctrl-kirkwood.c b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c
index 89101f36f5d0..dad38d6dc646 100644
--- a/drivers/pinctrl/mvebu/pinctrl-kirkwood.c
+++ b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c
@@ -21,20 +21,6 @@
21 21
22#include "pinctrl-mvebu.h" 22#include "pinctrl-mvebu.h"
23 23
24static void __iomem *mpp_base;
25
26static int kirkwood_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
27 unsigned pid, unsigned long *config)
28{
29 return default_mpp_ctrl_get(mpp_base, pid, config);
30}
31
32static int kirkwood_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
33 unsigned pid, unsigned long config)
34{
35 return default_mpp_ctrl_set(mpp_base, pid, config);
36}
37
38#define V(f6180, f6190, f6192, f6281, f6282, dx4122) \ 24#define V(f6180, f6190, f6192, f6281, f6282, dx4122) \
39 ((f6180 << 0) | (f6190 << 1) | (f6192 << 2) | \ 25 ((f6180 << 0) | (f6190 << 1) | (f6192 << 2) | \
40 (f6281 << 3) | (f6282 << 4) | (dx4122 << 5)) 26 (f6281 << 3) | (f6282 << 4) | (dx4122 << 5))
@@ -373,7 +359,7 @@ static struct mvebu_mpp_mode mv88f6xxx_mpp_modes[] = {
373}; 359};
374 360
375static const struct mvebu_mpp_ctrl mv88f6180_mpp_controls[] = { 361static const struct mvebu_mpp_ctrl mv88f6180_mpp_controls[] = {
376 MPP_FUNC_CTRL(0, 44, NULL, kirkwood_mpp_ctrl), 362 MPP_FUNC_CTRL(0, 44, NULL, mvebu_mmio_mpp_ctrl),
377}; 363};
378 364
379static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = { 365static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = {
@@ -382,7 +368,7 @@ static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = {
382}; 368};
383 369
384static const struct mvebu_mpp_ctrl mv88f619x_mpp_controls[] = { 370static const struct mvebu_mpp_ctrl mv88f619x_mpp_controls[] = {
385 MPP_FUNC_CTRL(0, 35, NULL, kirkwood_mpp_ctrl), 371 MPP_FUNC_CTRL(0, 35, NULL, mvebu_mmio_mpp_ctrl),
386}; 372};
387 373
388static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = { 374static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = {
@@ -391,7 +377,7 @@ static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = {
391}; 377};
392 378
393static const struct mvebu_mpp_ctrl mv88f628x_mpp_controls[] = { 379static const struct mvebu_mpp_ctrl mv88f628x_mpp_controls[] = {
394 MPP_FUNC_CTRL(0, 49, NULL, kirkwood_mpp_ctrl), 380 MPP_FUNC_CTRL(0, 49, NULL, mvebu_mmio_mpp_ctrl),
395}; 381};
396 382
397static struct pinctrl_gpio_range mv88f628x_gpio_ranges[] = { 383static struct pinctrl_gpio_range mv88f628x_gpio_ranges[] = {
@@ -474,14 +460,10 @@ static int kirkwood_pinctrl_probe(struct platform_device *pdev)
474 struct resource *res; 460 struct resource *res;
475 const struct of_device_id *match = 461 const struct of_device_id *match =
476 of_match_device(kirkwood_pinctrl_of_match, &pdev->dev); 462 of_match_device(kirkwood_pinctrl_of_match, &pdev->dev);
477 pdev->dev.platform_data = (void *)match->data;
478 463
479 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 464 pdev->dev.platform_data = (void *)match->data;
480 mpp_base = devm_ioremap_resource(&pdev->dev, res);
481 if (IS_ERR(mpp_base))
482 return PTR_ERR(mpp_base);
483 465
484 return mvebu_pinctrl_probe(pdev); 466 return mvebu_pinctrl_simple_mmio_probe(pdev);
485} 467}
486 468
487static struct platform_driver kirkwood_pinctrl_driver = { 469static struct platform_driver kirkwood_pinctrl_driver = {
diff --git a/drivers/pinctrl/mvebu/pinctrl-mvebu.h b/drivers/pinctrl/mvebu/pinctrl-mvebu.h
index c055581cf887..a9304cdc23e2 100644
--- a/drivers/pinctrl/mvebu/pinctrl-mvebu.h
+++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.h
@@ -190,30 +190,6 @@ struct mvebu_pinctrl_soc_info {
190#define MVEBU_MPP_BITS 4 190#define MVEBU_MPP_BITS 4
191#define MVEBU_MPP_MASK 0xf 191#define MVEBU_MPP_MASK 0xf
192 192
193static inline int default_mpp_ctrl_get(void __iomem *base, unsigned int pid,
194 unsigned long *config)
195{
196 unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
197 unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
198
199 *config = (readl(base + off) >> shift) & MVEBU_MPP_MASK;
200
201 return 0;
202}
203
204static inline int default_mpp_ctrl_set(void __iomem *base, unsigned int pid,
205 unsigned long config)
206{
207 unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
208 unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
209 unsigned long reg;
210
211 reg = readl(base + off) & ~(MVEBU_MPP_MASK << shift);
212 writel(reg | (config << shift), base + off);
213
214 return 0;
215}
216
217int mvebu_mmio_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid, 193int mvebu_mmio_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid,
218 unsigned long *config); 194 unsigned long *config);
219int mvebu_mmio_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid, 195int mvebu_mmio_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,