diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2017-01-13 06:03:30 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2017-01-18 03:56:35 -0500 |
commit | ad9ec4ecee6889321ae1752ce8793524a8cdfa7a (patch) | |
tree | 3db527cd0ad1da68a344ee2404c9715f48f3e25a /drivers/pinctrl | |
parent | 44aa9d0604f578cdd839d2f5295a9d920fb54999 (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.c | 24 | ||||
-rw-r--r-- | drivers/pinctrl/mvebu/pinctrl-armada-375.c | 24 | ||||
-rw-r--r-- | drivers/pinctrl/mvebu/pinctrl-armada-38x.c | 24 | ||||
-rw-r--r-- | drivers/pinctrl/mvebu/pinctrl-armada-39x.c | 24 | ||||
-rw-r--r-- | drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 31 | ||||
-rw-r--r-- | drivers/pinctrl/mvebu/pinctrl-dove.c | 52 | ||||
-rw-r--r-- | drivers/pinctrl/mvebu/pinctrl-kirkwood.c | 28 | ||||
-rw-r--r-- | drivers/pinctrl/mvebu/pinctrl-mvebu.h | 24 |
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 | ||
26 | static void __iomem *mpp_base; | ||
27 | |||
28 | static 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 | |||
34 | static 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 | |||
40 | static struct mvebu_mpp_mode mv88f6710_mpp_modes[] = { | 26 | static 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 | ||
389 | static const struct mvebu_mpp_ctrl mv88f6710_mpp_controls[] = { | 375 | static 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 | ||
393 | static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = { | 379 | static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = { |
@@ -399,12 +385,6 @@ static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = { | |||
399 | static int armada_370_pinctrl_probe(struct platform_device *pdev) | 385 | static 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 | ||
422 | static struct platform_driver armada_370_pinctrl_driver = { | 402 | static 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 | ||
26 | static void __iomem *mpp_base; | ||
27 | |||
28 | static 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 | |||
34 | static 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 | |||
40 | static struct mvebu_mpp_mode mv88f6720_mpp_modes[] = { | 26 | static 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 | ||
407 | static const struct mvebu_mpp_ctrl mv88f6720_mpp_controls[] = { | 393 | static 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 | ||
411 | static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = { | 397 | static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = { |
@@ -417,12 +403,6 @@ static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = { | |||
417 | static int armada_375_pinctrl_probe(struct platform_device *pdev) | 403 | static 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 | ||
440 | static struct platform_driver armada_375_pinctrl_driver = { | 420 | static 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 | ||
25 | static void __iomem *mpp_base; | ||
26 | |||
27 | static 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 | |||
33 | static 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 | |||
39 | enum { | 25 | enum { |
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 | ||
414 | static const struct mvebu_mpp_ctrl armada_38x_mpp_controls[] = { | 400 | static 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 | ||
418 | static struct pinctrl_gpio_range armada_38x_mpp_gpio_ranges[] = { | 404 | static 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 | ||
451 | static struct platform_driver armada_38x_pinctrl_driver = { | 431 | static 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 | ||
25 | static void __iomem *mpp_base; | ||
26 | |||
27 | static 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 | |||
33 | static 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 | |||
39 | enum { | 25 | enum { |
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 | ||
396 | static const struct mvebu_mpp_ctrl armada_39x_mpp_controls[] = { | 382 | static 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 | ||
400 | static struct pinctrl_gpio_range armada_39x_mpp_gpio_ranges[] = { | 386 | static 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 | ||
433 | static struct platform_driver armada_39x_pinctrl_driver = { | 413 | static 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 | ||
33 | static void __iomem *mpp_base; | ||
34 | static u32 *mpp_saved_regs; | 33 | static u32 *mpp_saved_regs; |
35 | 34 | ||
36 | static 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 | |||
42 | static 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 | |||
48 | enum armada_xp_variant { | 35 | enum 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 | ||
383 | static const struct mvebu_mpp_ctrl mv78230_mpp_controls[] = { | 370 | static 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 | ||
387 | static struct pinctrl_gpio_range mv78230_mpp_gpio_ranges[] = { | 374 | static 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 | ||
392 | static const struct mvebu_mpp_ctrl mv78260_mpp_controls[] = { | 379 | static 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 | ||
396 | static struct pinctrl_gpio_range mv78260_mpp_gpio_ranges[] = { | 383 | static 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 | ||
402 | static const struct mvebu_mpp_ctrl mv78460_mpp_controls[] = { | 389 | static 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 | ||
406 | static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = { | 393 | static 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 | ||
507 | static struct platform_driver armada_xp_pinctrl_driver = { | 488 | static 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 | ||
64 | static void __iomem *mpp_base; | ||
65 | static void __iomem *mpp4_base; | 64 | static void __iomem *mpp4_base; |
66 | static void __iomem *pmu_base; | 65 | static void __iomem *pmu_base; |
67 | static struct regmap *gconfmap; | 66 | static struct regmap *gconfmap; |
68 | 67 | ||
69 | static 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 | |||
75 | static 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 | |||
81 | static int dove_pmu_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data, | 68 | static 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, | |||
207 | static int dove_audio0_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid, | 194 | static 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, | |||
217 | static int dove_audio0_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid, | 204 | static 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 | ||
373 | static const struct mvebu_mpp_ctrl dove_mpp_controls[] = { | 360 | static 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 | ||
24 | static void __iomem *mpp_base; | ||
25 | |||
26 | static 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 | |||
32 | static 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 | ||
375 | static const struct mvebu_mpp_ctrl mv88f6180_mpp_controls[] = { | 361 | static 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 | ||
379 | static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = { | 365 | static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = { |
@@ -382,7 +368,7 @@ static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = { | |||
382 | }; | 368 | }; |
383 | 369 | ||
384 | static const struct mvebu_mpp_ctrl mv88f619x_mpp_controls[] = { | 370 | static 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 | ||
388 | static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = { | 374 | static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = { |
@@ -391,7 +377,7 @@ static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = { | |||
391 | }; | 377 | }; |
392 | 378 | ||
393 | static const struct mvebu_mpp_ctrl mv88f628x_mpp_controls[] = { | 379 | static 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 | ||
397 | static struct pinctrl_gpio_range mv88f628x_gpio_ranges[] = { | 383 | static 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 | ||
487 | static struct platform_driver kirkwood_pinctrl_driver = { | 469 | static 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 | ||
193 | static 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 | |||
204 | static 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 | |||
217 | int mvebu_mmio_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid, | 193 | int mvebu_mmio_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data, unsigned pid, |
218 | unsigned long *config); | 194 | unsigned long *config); |
219 | int mvebu_mmio_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid, | 195 | int mvebu_mmio_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid, |