Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
a9ea2ed4
Commit
a9ea2ed4
authored
Mar 03, 2014
by
Linus Walleij
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'pinctrl-mvebu' into devel
parents
67871413
cdfe3175
Changes
18
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
1480 additions
and
291 deletions
+1480
-291
Documentation/devicetree/bindings/arm/marvell,dove.txt
Documentation/devicetree/bindings/arm/marvell,dove.txt
+22
-0
Documentation/devicetree/bindings/pinctrl/marvell,armada-370-pinctrl.txt
...evicetree/bindings/pinctrl/marvell,armada-370-pinctrl.txt
+1
-0
Documentation/devicetree/bindings/pinctrl/marvell,armada-375-pinctrl.txt
...evicetree/bindings/pinctrl/marvell,armada-375-pinctrl.txt
+82
-0
Documentation/devicetree/bindings/pinctrl/marvell,armada-38x-pinctrl.txt
...evicetree/bindings/pinctrl/marvell,armada-38x-pinctrl.txt
+80
-0
Documentation/devicetree/bindings/pinctrl/marvell,armada-xp-pinctrl.txt
...devicetree/bindings/pinctrl/marvell,armada-xp-pinctrl.txt
+1
-0
Documentation/devicetree/bindings/pinctrl/marvell,dove-pinctrl.txt
...tion/devicetree/bindings/pinctrl/marvell,dove-pinctrl.txt
+1
-0
Documentation/devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt
.../devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt
+1
-0
Documentation/devicetree/bindings/pinctrl/marvell,mvebu-pinctrl.txt
...ion/devicetree/bindings/pinctrl/marvell,mvebu-pinctrl.txt
+1
-1
drivers/pinctrl/mvebu/Kconfig
drivers/pinctrl/mvebu/Kconfig
+9
-0
drivers/pinctrl/mvebu/Makefile
drivers/pinctrl/mvebu/Makefile
+2
-0
drivers/pinctrl/mvebu/pinctrl-armada-370.c
drivers/pinctrl/mvebu/pinctrl-armada-370.c
+19
-1
drivers/pinctrl/mvebu/pinctrl-armada-375.c
drivers/pinctrl/mvebu/pinctrl-armada-375.c
+459
-0
drivers/pinctrl/mvebu/pinctrl-armada-38x.c
drivers/pinctrl/mvebu/pinctrl-armada-38x.c
+462
-0
drivers/pinctrl/mvebu/pinctrl-armada-xp.c
drivers/pinctrl/mvebu/pinctrl-armada-xp.c
+21
-3
drivers/pinctrl/mvebu/pinctrl-dove.c
drivers/pinctrl/mvebu/pinctrl-dove.c
+224
-179
drivers/pinctrl/mvebu/pinctrl-kirkwood.c
drivers/pinctrl/mvebu/pinctrl-kirkwood.c
+22
-3
drivers/pinctrl/mvebu/pinctrl-mvebu.c
drivers/pinctrl/mvebu/pinctrl-mvebu.c
+38
-84
drivers/pinctrl/mvebu/pinctrl-mvebu.h
drivers/pinctrl/mvebu/pinctrl-mvebu.h
+35
-20
No files found.
Documentation/devicetree/bindings/arm/marvell,dove.txt
0 → 100644
View file @
a9ea2ed4
Marvell Dove Platforms Device Tree Bindings
-----------------------------------------------
Boards with a Marvell Dove SoC shall have the following properties:
Required root node property:
- compatible: must contain "marvell,dove";
* Global Configuration registers
Global Configuration registers of Dove SoC are shared by a syscon node.
Required properties:
- compatible: must contain "marvell,dove-global-config" and "syscon".
- reg: base address and size of the Global Configuration registers.
Example:
gconf: global-config@e802c {
compatible = "marvell,dove-global-config", "syscon";
reg = <0xe802c 0x14>;
};
Documentation/devicetree/bindings/pinctrl/marvell,armada-370-pinctrl.txt
View file @
a9ea2ed4
...
...
@@ -5,6 +5,7 @@ part and usage.
Required properties:
- compatible: "marvell,88f6710-pinctrl"
- reg: register specifier of MPP registers
Available mpp pins/groups and functions:
Note: brackets (x) are not part of the mpp name for marvell,function and given
...
...
Documentation/devicetree/bindings/pinctrl/marvell,armada-375-pinctrl.txt
0 → 100644
View file @
a9ea2ed4
* Marvell Armada 375 SoC pinctrl driver for mpp
Please refer to marvell,mvebu-pinctrl.txt in this directory for common binding
part and usage.
Required properties:
- compatible: "marvell,88f6720-pinctrl"
- reg: register specifier of MPP registers
Available mpp pins/groups and functions:
Note: brackets (x) are not part of the mpp name for marvell,function and given
only for more detailed description in this document.
name pins functions
================================================================================
mpp0 0 gpio, dev(ad2), spi0(cs1), spi1(cs1)
mpp1 1 gpio, dev(ad3), spi0(mosi), spi1(mosi)
mpp2 2 gpio, dev(ad4), ptp(eventreq), led(c0), audio(sdi)
mpp3 3 gpio, dev(ad5), ptp(triggen), led(p3), audio(mclk)
mpp4 4 gpio, dev(ad6), spi0(miso), spi1(miso)
mpp5 5 gpio, dev(ad7), spi0(cs2), spi1(cs2)
mpp6 6 gpio, dev(ad0), led(p1), audio(rclk)
mpp7 7 gpio, dev(ad1), ptp(clk), led(p2), audio(extclk)
mpp8 8 gpio, dev (bootcs), spi0(cs0), spi1(cs0)
mpp9 9 gpio, nf(wen), spi0(sck), spi1(sck)
mpp10 10 gpio, nf(ren), dram(vttctrl), led(c1)
mpp11 11 gpio, dev(a0), led(c2), audio(sdo)
mpp12 12 gpio, dev(a1), audio(bclk)
mpp13 13 gpio, dev(readyn), pcie0(rstoutn), pcie1(rstoutn)
mpp14 14 gpio, i2c0(sda), uart1(txd)
mpp15 15 gpio, i2c0(sck), uart1(rxd)
mpp16 16 gpio, uart0(txd)
mpp17 17 gpio, uart0(rxd)
mpp18 18 gpio, tdm(intn)
mpp19 19 gpio, tdm(rstn)
mpp20 20 gpio, tdm(pclk)
mpp21 21 gpio, tdm(fsync)
mpp22 22 gpio, tdm(drx)
mpp23 23 gpio, tdm(dtx)
mpp24 24 gpio, led(p0), ge1(rxd0), sd(cmd), uart0(rts)
mpp25 25 gpio, led(p2), ge1(rxd1), sd(d0), uart0(cts)
mpp26 26 gpio, pcie0(clkreq), ge1(rxd2), sd(d2), uart1(rts)
mpp27 27 gpio, pcie1(clkreq), ge1(rxd3), sd(d1), uart1(cts)
mpp28 28 gpio, led(p3), ge1(txctl), sd(clk)
mpp29 29 gpio, pcie1(clkreq), ge1(rxclk), sd(d3)
mpp30 30 gpio, ge1(txd0), spi1(cs0)
mpp31 31 gpio, ge1(txd1), spi1(mosi)
mpp32 32 gpio, ge1(txd2), spi1(sck), ptp(triggen)
mpp33 33 gpio, ge1(txd3), spi1(miso)
mpp34 34 gpio, ge1(txclkout), spi1(sck)
mpp35 35 gpio, ge1(rxctl), spi1(cs1), spi0(cs2)
mpp36 36 gpio, pcie0(clkreq)
mpp37 37 gpio, pcie0(clkreq), tdm(intn), ge(mdc)
mpp38 38 gpio, pcie1(clkreq), ge(mdio)
mpp39 39 gpio, ref(clkout)
mpp40 40 gpio, uart1(txd)
mpp41 41 gpio, uart1(rxd)
mpp42 42 gpio, spi1(cs2), led(c0)
mpp43 43 gpio, sata0(prsnt), dram(vttctrl)
mpp44 44 gpio, sata0(prsnt)
mpp45 45 gpio, spi0(cs2), pcie0(rstoutn)
mpp46 46 gpio, led(p0), ge0(txd0), ge1(txd0)
mpp47 47 gpio, led(p1), ge0(txd1), ge1(txd1)
mpp48 48 gpio, led(p2), ge0(txd2), ge1(txd2)
mpp49 49 gpio, led(p3), ge0(txd3), ge1(txd3)
mpp50 50 gpio, led(c0), ge0(rxd0), ge1(rxd0)
mpp51 51 gpio, led(c1), ge0(rxd1), ge1(rxd1)
mpp52 52 gpio, led(c2), ge0(rxd2), ge1(rxd2)
mpp53 53 gpio, pcie1(rstoutn), ge0(rxd3), ge1(rxd3)
mpp54 54 gpio, pcie0(rstoutn), ge0(rxctl), ge1(rxctl)
mpp55 55 gpio, ge0(rxclk), ge1(rxclk)
mpp56 56 gpio, ge0(txclkout), ge1(txclkout)
mpp57 57 gpio, ge0(txctl), ge1(txctl)
mpp58 58 gpio, led(c0)
mpp59 59 gpio, led(c1)
mpp60 60 gpio, uart1(txd), led(c2)
mpp61 61 gpio, i2c1(sda), uart1(rxd), spi1(cs2), led(p0)
mpp62 62 gpio, i2c1(sck), led(p1)
mpp63 63 gpio, ptp(triggen), led(p2)
mpp64 64 gpio, dram(vttctrl), led(p3)
mpp65 65 gpio, sata1(prsnt)
mpp66 66 gpio, ptp(eventreq), spi1(cs3)
Documentation/devicetree/bindings/pinctrl/marvell,armada-38x-pinctrl.txt
0 → 100644
View file @
a9ea2ed4
* Marvell Armada 380/385 SoC pinctrl driver for mpp
Please refer to marvell,mvebu-pinctrl.txt in this directory for common binding
part and usage.
Required properties:
- compatible: "marvell,88f6810-pinctrl", "marvell,88f6820-pinctrl" or
"marvell,88f6828-pinctrl" depending on the specific variant of the
SoC being used.
- reg: register specifier of MPP registers
Available mpp pins/groups and functions:
Note: brackets (x) are not part of the mpp name for marvell,function and given
only for more detailed description in this document.
name pins functions
================================================================================
mpp0 0 gpio, ua0(rxd)
mpp1 1 gpio, ua0(txd)
mpp2 2 gpio, i2c0(sck)
mpp3 3 gpio, i2c0(sda)
mpp4 4 gpio, ge(mdc), ua1(txd), ua0(rts)
mpp5 5 gpio, ge(mdio), ua1(rxd), ua0(cts)
mpp6 6 gpio, ge0(txclkout), ge0(crs), dev(cs3)
mpp7 7 gpio, ge0(txd0), dev(ad9)
mpp8 8 gpio, ge0(txd1), dev(ad10)
mpp9 9 gpio, ge0(txd2), dev(ad11)
mpp10 10 gpio, ge0(txd3), dev(ad12)
mpp11 11 gpio, ge0(txctl), dev(ad13)
mpp12 12 gpio, ge0(rxd0), pcie0(rstout), pcie1(rstout) [1], spi0(cs1), dev(ad14)
mpp13 13 gpio, ge0(rxd1), pcie0(clkreq), pcie1(clkreq) [1], spi0(cs2), dev(ad15)
mpp14 14 gpio, ge0(rxd2), ptp(clk), m(vtt_ctrl), spi0(cs3), dev(wen1)
mpp15 15 gpio, ge0(rxd3), ge(mdc slave), pcie0(rstout), spi0(mosi), pcie1(rstout) [1]
mpp16 16 gpio, ge0(rxctl), ge(mdio slave), m(decc_err), spi0(miso), pcie0(clkreq)
mpp17 17 gpio, ge0(rxclk), ptp(clk), ua1(rxd), spi0(sck), sata1(prsnt)
mpp18 18 gpio, ge0(rxerr), ptp(trig_gen), ua1(txd), spi0(cs0), pcie1(rstout) [1]
mpp19 19 gpio, ge0(col), ptp(event_req), pcie0(clkreq), sata1(prsnt), ua0(cts)
mpp20 20 gpio, ge0(txclk), ptp(clk), pcie1(rstout) [1], sata0(prsnt), ua0(rts)
mpp21 21 gpio, spi0(cs1), ge1(rxd0), sata0(prsnt), sd0(cmd), dev(bootcs)
mpp22 22 gpio, spi0(mosi), dev(ad0)
mpp23 23 gpio, spi0(sck), dev(ad2)
mpp24 24 gpio, spi0(miso), ua0(cts), ua1(rxd), sd0(d4), dev(ready)
mpp25 25 gpio, spi0(cs0), ua0(rts), ua1(txd), sd0(d5), dev(cs0)
mpp26 26 gpio, spi0(cs2), i2c1(sck), sd0(d6), dev(cs1)
mpp27 27 gpio, spi0(cs3), ge1(txclkout), i2c1(sda), sd0(d7), dev(cs2)
mpp28 28 gpio, ge1(txd0), sd0(clk), dev(ad5)
mpp29 29 gpio, ge1(txd1), dev(ale0)
mpp30 30 gpio, ge1(txd2), dev(oen)
mpp31 31 gpio, ge1(txd3), dev(ale1)
mpp32 32 gpio, ge1(txctl), dev(wen0)
mpp33 33 gpio, m(decc_err), dev(ad3)
mpp34 34 gpio, dev(ad1)
mpp35 35 gpio, ref(clk_out1), dev(a1)
mpp36 36 gpio, ptp(trig_gen), dev(a0)
mpp37 37 gpio, ptp(clk), ge1(rxclk), sd0(d3), dev(ad8)
mpp38 38 gpio, ptp(event_req), ge1(rxd1), ref(clk_out0), sd0(d0), dev(ad4)
mpp39 39 gpio, i2c1(sck), ge1(rxd2), ua0(cts), sd0(d1), dev(a2)
mpp40 40 gpio, i2c1(sda), ge1(rxd3), ua0(rts), sd0(d2), dev(ad6)
mpp41 41 gpio, ua1(rxd), ge1(rxctl), ua0(cts), spi1(cs3), dev(burst/last)
mpp42 42 gpio, ua1(txd), ua0(rts), dev(ad7)
mpp43 43 gpio, pcie0(clkreq), m(vtt_ctrl), m(decc_err), pcie0(rstout), dev(clkout)
mpp44 44 gpio, sata0(prsnt), sata1(prsnt), sata2(prsnt) [2], sata3(prsnt) [3], pcie0(rstout)
mpp45 45 gpio, ref(clk_out0), pcie0(rstout), pcie1(rstout) [1], pcie2(rstout), pcie3(rstout)
mpp46 46 gpio, ref(clk_out1), pcie0(rstout), pcie1(rstout) [1], pcie2(rstout), pcie3(rstout)
mpp47 47 gpio, sata0(prsnt), sata1(prsnt), sata2(prsnt) [2], spi1(cs2), sata3(prsnt) [2]
mpp48 48 gpio, sata0(prsnt), m(vtt_ctrl), tdm2c(pclk), audio(mclk), sd0(d4)
mpp49 49 gpio, sata2(prsnt) [2], sata3(prsnt) [2], tdm2c(fsync), audio(lrclk), sd0(d5)
mpp50 50 gpio, pcie0(rstout), pcie1(rstout) [1], tdm2c(drx), audio(extclk), sd0(cmd)
mpp51 51 gpio, tdm2c(dtx), audio(sdo), m(decc_err)
mpp52 52 gpio, pcie0(rstout), pcie1(rstout) [1], tdm2c(intn), audio(sdi), sd0(d6)
mpp53 53 gpio, sata1(prsnt), sata0(prsnt), tdm2c(rstn), audio(bclk), sd0(d7)
mpp54 54 gpio, sata0(prsnt), sata1(prsnt), pcie0(rstout), pcie1(rstout) [1], sd0(d3)
mpp55 55 gpio, ua1(cts), ge(mdio), pcie1(clkreq) [1], spi1(cs1), sd0(d0)
mpp56 56 gpio, ua1(rts), ge(mdc), m(decc_err), spi1(mosi)
mpp57 57 gpio, spi1(sck), sd0(clk)
mpp58 58 gpio, pcie1(clkreq) [1], i2c1(sck), pcie2(clkreq), spi1(miso), sd0(d1)
mpp59 59 gpio, pcie0(rstout), i2c1(sda), pcie1(rstout) [1], spi1(cs0), sd0(d2)
[1]: only available on 88F6820 and 88F6828
[2]: only available on 88F6828
Documentation/devicetree/bindings/pinctrl/marvell,armada-xp-pinctrl.txt
View file @
a9ea2ed4
...
...
@@ -6,6 +6,7 @@ part and usage.
Required properties:
- compatible: "marvell,mv78230-pinctrl", "marvell,mv78260-pinctrl",
"marvell,mv78460-pinctrl"
- reg: register specifier of MPP registers
This driver supports all Armada XP variants, i.e. mv78230, mv78260, and mv78460.
...
...
Documentation/devicetree/bindings/pinctrl/marvell,dove-pinctrl.txt
View file @
a9ea2ed4
...
...
@@ -6,6 +6,7 @@ part and usage.
Required properties:
- compatible: "marvell,dove-pinctrl"
- clocks: (optional) phandle of pdma clock
- reg: register specifiers of MPP, MPP4, and PMU MPP registers
Available mpp pins/groups and functions:
Note: brackets (x) are not part of the mpp name for marvell,function and given
...
...
Documentation/devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt
View file @
a9ea2ed4
...
...
@@ -8,6 +8,7 @@ Required properties:
"marvell,88f6190-pinctrl", "marvell,88f6192-pinctrl",
"marvell,88f6281-pinctrl", "marvell,88f6282-pinctrl"
"marvell,98dx4122-pinctrl"
- reg: register specifier of MPP registers
This driver supports all kirkwood variants, i.e. 88f6180, 88f619x, and 88f628x.
It also support the 88f6281-based variant in the 98dx412x Bobcat SoCs.
...
...
Documentation/devicetree/bindings/pinctrl/marvell,mvebu-pinctrl.txt
View file @
a9ea2ed4
...
...
@@ -37,7 +37,7 @@ uart1: serial@12100 {
pinctrl: pinctrl@d0200 {
compatible = "marvell,dove-pinctrl";
reg = <0xd0200 0x
20
>;
reg = <0xd0200 0x
14>, <0xd0440 0x04>, <0xd802c 0x08
>;
pmx_uart1_sw: pmx-uart1-sw {
marvell,pins = "mpp_uart1";
...
...
drivers/pinctrl/mvebu/Kconfig
View file @
a9ea2ed4
...
...
@@ -8,6 +8,7 @@ config PINCTRL_MVEBU
config PINCTRL_DOVE
bool
select PINCTRL_MVEBU
select MFD_SYSCON
config PINCTRL_KIRKWOOD
bool
...
...
@@ -17,6 +18,14 @@ config PINCTRL_ARMADA_370
bool
select PINCTRL_MVEBU
config PINCTRL_ARMADA_375
bool
select PINCTRL_MVEBU
config PINCTRL_ARMADA_38X
bool
select PINCTRL_MVEBU
config PINCTRL_ARMADA_XP
bool
select PINCTRL_MVEBU
...
...
drivers/pinctrl/mvebu/Makefile
View file @
a9ea2ed4
...
...
@@ -2,4 +2,6 @@ obj-$(CONFIG_PINCTRL_MVEBU) += pinctrl-mvebu.o
obj-$(CONFIG_PINCTRL_DOVE)
+=
pinctrl-dove.o
obj-$(CONFIG_PINCTRL_KIRKWOOD)
+=
pinctrl-kirkwood.o
obj-$(CONFIG_PINCTRL_ARMADA_370)
+=
pinctrl-armada-370.o
obj-$(CONFIG_PINCTRL_ARMADA_375)
+=
pinctrl-armada-375.o
obj-$(CONFIG_PINCTRL_ARMADA_38X)
+=
pinctrl-armada-38x.o
obj-$(CONFIG_PINCTRL_ARMADA_XP)
+=
pinctrl-armada-xp.o
drivers/pinctrl/mvebu/pinctrl-armada-370.c
View file @
a9ea2ed4
...
...
@@ -23,6 +23,18 @@
#include "pinctrl-mvebu.h"
static
void
__iomem
*
mpp_base
;
static
int
armada_370_mpp_ctrl_get
(
unsigned
pid
,
unsigned
long
*
config
)
{
return
default_mpp_ctrl_get
(
mpp_base
,
pid
,
config
);
}
static
int
armada_370_mpp_ctrl_set
(
unsigned
pid
,
unsigned
long
config
)
{
return
default_mpp_ctrl_set
(
mpp_base
,
pid
,
config
);
}
static
struct
mvebu_mpp_mode
mv88f6710_mpp_modes
[]
=
{
MPP_MODE
(
0
,
MPP_FUNCTION
(
0x0
,
"gpio"
,
NULL
),
...
...
@@ -373,7 +385,7 @@ static struct of_device_id armada_370_pinctrl_of_match[] = {
};
static
struct
mvebu_mpp_ctrl
mv88f6710_mpp_controls
[]
=
{
MPP_
REG_CTRL
(
0
,
65
),
MPP_
FUNC_CTRL
(
0
,
65
,
NULL
,
armada_370_mpp_ctrl
),
};
static
struct
pinctrl_gpio_range
mv88f6710_mpp_gpio_ranges
[]
=
{
...
...
@@ -385,6 +397,12 @@ static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = {
static
int
armada_370_pinctrl_probe
(
struct
platform_device
*
pdev
)
{
struct
mvebu_pinctrl_soc_info
*
soc
=
&
armada_370_pinctrl_info
;
struct
resource
*
res
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
mpp_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
mpp_base
))
return
PTR_ERR
(
mpp_base
);
soc
->
variant
=
0
;
/* no variants for Armada 370 */
soc
->
controls
=
mv88f6710_mpp_controls
;
...
...
drivers/pinctrl/mvebu/pinctrl-armada-375.c
0 → 100644
View file @
a9ea2ed4
This diff is collapsed.
Click to expand it.
drivers/pinctrl/mvebu/pinctrl-armada-38x.c
0 → 100644
View file @
a9ea2ed4
This diff is collapsed.
Click to expand it.
drivers/pinctrl/mvebu/pinctrl-armada-xp.c
View file @
a9ea2ed4
...
...
@@ -33,6 +33,18 @@
#include "pinctrl-mvebu.h"
static
void
__iomem
*
mpp_base
;
static
int
armada_xp_mpp_ctrl_get
(
unsigned
pid
,
unsigned
long
*
config
)
{
return
default_mpp_ctrl_get
(
mpp_base
,
pid
,
config
);
}
static
int
armada_xp_mpp_ctrl_set
(
unsigned
pid
,
unsigned
long
config
)
{
return
default_mpp_ctrl_set
(
mpp_base
,
pid
,
config
);
}
enum
armada_xp_variant
{
V_MV78230
=
BIT
(
0
),
V_MV78260
=
BIT
(
1
),
...
...
@@ -366,7 +378,7 @@ static struct of_device_id armada_xp_pinctrl_of_match[] = {
};
static
struct
mvebu_mpp_ctrl
mv78230_mpp_controls
[]
=
{
MPP_
REG_CTRL
(
0
,
48
),
MPP_
FUNC_CTRL
(
0
,
48
,
NULL
,
armada_xp_mpp_ctrl
),
};
static
struct
pinctrl_gpio_range
mv78230_mpp_gpio_ranges
[]
=
{
...
...
@@ -375,7 +387,7 @@ static struct pinctrl_gpio_range mv78230_mpp_gpio_ranges[] = {
};
static
struct
mvebu_mpp_ctrl
mv78260_mpp_controls
[]
=
{
MPP_
REG_CTRL
(
0
,
66
),
MPP_
FUNC_CTRL
(
0
,
66
,
NULL
,
armada_xp_mpp_ctrl
),
};
static
struct
pinctrl_gpio_range
mv78260_mpp_gpio_ranges
[]
=
{
...
...
@@ -385,7 +397,7 @@ static struct pinctrl_gpio_range mv78260_mpp_gpio_ranges[] = {
};
static
struct
mvebu_mpp_ctrl
mv78460_mpp_controls
[]
=
{
MPP_
REG_CTRL
(
0
,
66
),
MPP_
FUNC_CTRL
(
0
,
66
,
NULL
,
armada_xp_mpp_ctrl
),
};
static
struct
pinctrl_gpio_range
mv78460_mpp_gpio_ranges
[]
=
{
...
...
@@ -399,10 +411,16 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev)
struct
mvebu_pinctrl_soc_info
*
soc
=
&
armada_xp_pinctrl_info
;
const
struct
of_device_id
*
match
=
of_match_device
(
armada_xp_pinctrl_of_match
,
&
pdev
->
dev
);
struct
resource
*
res
;
if
(
!
match
)
return
-
ENODEV
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
mpp_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
mpp_base
))
return
PTR_ERR
(
mpp_base
);
soc
->
variant
=
(
unsigned
)
match
->
data
&
0xff
;
switch
(
soc
->
variant
)
{
...
...
drivers/pinctrl/mvebu/pinctrl-dove.c
View file @
a9ea2ed4
This diff is collapsed.
Click to expand it.
drivers/pinctrl/mvebu/pinctrl-kirkwood.c
View file @
a9ea2ed4
...
...
@@ -21,6 +21,18 @@
#include "pinctrl-mvebu.h"
static
void
__iomem
*
mpp_base
;
static
int
kirkwood_mpp_ctrl_get
(
unsigned
pid
,
unsigned
long
*
config
)
{
return
default_mpp_ctrl_get
(
mpp_base
,
pid
,
config
);
}
static
int
kirkwood_mpp_ctrl_set
(
unsigned
pid
,
unsigned
long
config
)
{
return
default_mpp_ctrl_set
(
mpp_base
,
pid
,
config
);
}
#define V(f6180, f6190, f6192, f6281, f6282, dx4122) \
((f6180 << 0) | (f6190 << 1) | (f6192 << 2) | \
(f6281 << 3) | (f6282 << 4) | (dx4122 << 5))
...
...
@@ -359,7 +371,7 @@ static struct mvebu_mpp_mode mv88f6xxx_mpp_modes[] = {
};
static
struct
mvebu_mpp_ctrl
mv88f6180_mpp_controls
[]
=
{
MPP_
REG_CTRL
(
0
,
29
),
MPP_
FUNC_CTRL
(
0
,
29
,
NULL
,
kirkwood_mpp_ctrl
),
};
static
struct
pinctrl_gpio_range
mv88f6180_gpio_ranges
[]
=
{
...
...
@@ -367,7 +379,7 @@ static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = {
};
static
struct
mvebu_mpp_ctrl
mv88f619x_mpp_controls
[]
=
{
MPP_
REG_CTRL
(
0
,
35
),
MPP_
FUNC_CTRL
(
0
,
35
,
NULL
,
kirkwood_mpp_ctrl
),
};
static
struct
pinctrl_gpio_range
mv88f619x_gpio_ranges
[]
=
{
...
...
@@ -376,7 +388,7 @@ static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = {
};
static
struct
mvebu_mpp_ctrl
mv88f628x_mpp_controls
[]
=
{
MPP_
REG_CTRL
(
0
,
49
),
MPP_
FUNC_CTRL
(
0
,
49
,
NULL
,
kirkwood_mpp_ctrl
),
};
static
struct
pinctrl_gpio_range
mv88f628x_gpio_ranges
[]
=
{
...
...
@@ -456,9 +468,16 @@ static struct of_device_id kirkwood_pinctrl_of_match[] = {
static
int
kirkwood_pinctrl_probe
(
struct
platform_device
*
pdev
)
{
struct
resource
*
res
;
const
struct
of_device_id
*
match
=
of_match_device
(
kirkwood_pinctrl_of_match
,
&
pdev
->
dev
);
pdev
->
dev
.
platform_data
=
(
void
*
)
match
->
data
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
mpp_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
mpp_base
))
return
PTR_ERR
(
mpp_base
);
return
mvebu_pinctrl_probe
(
pdev
);
}
...
...
drivers/pinctrl/mvebu/pinctrl-mvebu.c
View file @
a9ea2ed4
...
...
@@ -50,7 +50,6 @@ struct mvebu_pinctrl {
struct
device
*
dev
;
struct
pinctrl_dev
*
pctldev
;
struct
pinctrl_desc
desc
;
void
__iomem
*
base
;
struct
mvebu_pinctrl_group
*
groups
;
unsigned
num_groups
;
struct
mvebu_pinctrl_function
*
functions
;
...
...
@@ -138,43 +137,6 @@ static struct mvebu_pinctrl_function *mvebu_pinctrl_find_function_by_name(
return
NULL
;
}
/*
* Common mpp pin configuration registers on MVEBU are
* registers of eight 4-bit values for each mpp setting.
* Register offset and bit mask are calculated accordingly below.
*/
static
int
mvebu_common_mpp_get
(
struct
mvebu_pinctrl
*
pctl
,
struct
mvebu_pinctrl_group
*
grp
,
unsigned
long
*
config
)
{
unsigned
pin
=
grp
->
gid
;
unsigned
off
=
(
pin
/
MPPS_PER_REG
)
*
MPP_BITS
;
unsigned
shift
=
(
pin
%
MPPS_PER_REG
)
*
MPP_BITS
;
*
config
=
readl
(
pctl
->
base
+
off
);
*
config
>>=
shift
;
*
config
&=
MPP_MASK
;
return
0
;
}
static
int
mvebu_common_mpp_set
(
struct
mvebu_pinctrl
*
pctl
,
struct
mvebu_pinctrl_group
*
grp
,
unsigned
long
config
)
{
unsigned
pin
=
grp
->
gid
;
unsigned
off
=
(
pin
/
MPPS_PER_REG
)
*
MPP_BITS
;
unsigned
shift
=
(
pin
%
MPPS_PER_REG
)
*
MPP_BITS
;
unsigned
long
reg
;
reg
=
readl
(
pctl
->
base
+
off
);
reg
&=
~
(
MPP_MASK
<<
shift
);
reg
|=
(
config
<<
shift
);
writel
(
reg
,
pctl
->
base
+
off
);
return
0
;
}
static
int
mvebu_pinconf_group_get
(
struct
pinctrl_dev
*
pctldev
,
unsigned
gid
,
unsigned
long
*
config
)
{
...
...
@@ -184,10 +146,7 @@ static int mvebu_pinconf_group_get(struct pinctrl_dev *pctldev,
if
(
!
grp
->
ctrl
)
return
-
EINVAL
;
if
(
grp
->
ctrl
->
mpp_get
)
return
grp
->
ctrl
->
mpp_get
(
grp
->
ctrl
,
config
);
return
mvebu_common_mpp_get
(
pctl
,
grp
,
config
);
return
grp
->
ctrl
->
mpp_get
(
grp
->
pins
[
0
],
config
);
}
static
int
mvebu_pinconf_group_set
(
struct
pinctrl_dev
*
pctldev
,
...
...
@@ -202,11 +161,7 @@ static int mvebu_pinconf_group_set(struct pinctrl_dev *pctldev,
return
-
EINVAL
;
for
(
i
=
0
;
i
<
num_configs
;
i
++
)
{
if
(
grp
->
ctrl
->
mpp_set
)
ret
=
grp
->
ctrl
->
mpp_set
(
grp
->
ctrl
,
configs
[
i
]);
else
ret
=
mvebu_common_mpp_set
(
pctl
,
grp
,
configs
[
i
]);
ret
=
grp
->
ctrl
->
mpp_set
(
grp
->
pins
[
0
],
configs
[
i
]);
if
(
ret
)
return
ret
;
}
/* for each config */
...
...
@@ -347,7 +302,7 @@ static int mvebu_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
return
-
EINVAL
;
if
(
grp
->
ctrl
->
mpp_gpio_req
)
return
grp
->
ctrl
->
mpp_gpio_req
(
grp
->
ctrl
,
offset
);
return
grp
->
ctrl
->
mpp_gpio_req
(
offset
);
setting
=
mvebu_pinctrl_find_gpio_setting
(
pctl
,
grp
);
if
(
!
setting
)
...
...
@@ -370,7 +325,7 @@ static int mvebu_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
return
-
EINVAL
;
if
(
grp
->
ctrl
->
mpp_gpio_dir
)
return
grp
->
ctrl
->
mpp_gpio_dir
(
grp
->
ctrl
,
offset
,
input
);
return
grp
->
ctrl
->
mpp_gpio_dir
(
offset
,
input
);
setting
=
mvebu_pinctrl_find_gpio_setting
(
pctl
,
grp
);
if
(
!
setting
)
...
...
@@ -593,11 +548,12 @@ static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
int
mvebu_pinctrl_probe
(
struct
platform_device
*
pdev
)
{
struct
mvebu_pinctrl_soc_info
*
soc
=
dev_get_platdata
(
&
pdev
->
dev
);
struct
resource
*
res
;
struct
mvebu_pinctrl
*
pctl
;
void
__iomem
*
base
;
struct
pinctrl_pin_desc
*
pdesc
;
unsigned
gid
,
n
,
k
;
unsigned
size
,
noname
=
0
;
char
*
noname_buf
;
void
*
p
;
int
ret
;
if
(
!
soc
||
!
soc
->
controls
||
!
soc
->
modes
)
{
...
...
@@ -605,11 +561,6 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
return
-
EINVAL
;
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
base
))
return
PTR_ERR
(
base
);
pctl
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
mvebu_pinctrl
),
GFP_KERNEL
);
if
(
!
pctl
)
{
...
...
@@ -623,7 +574,6 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
pctl
->
desc
.
pmxops
=
&
mvebu_pinmux_ops
;
pctl
->
desc
.
confops
=
&
mvebu_pinconf_ops
;
pctl
->
variant
=
soc
->
variant
;
pctl
->
base
=
base
;
pctl
->
dev
=
&
pdev
->
dev
;
platform_set_drvdata
(
pdev
,
pctl
);
...
...
@@ -633,33 +583,23 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
pctl
->
desc
.
npins
=
0
;
for
(
n
=
0
;
n
<
soc
->
ncontrols
;
n
++
)
{
struct
mvebu_mpp_ctrl
*
ctrl
=
&
soc
->
controls
[
n
];
char
*
names
;
pctl
->
desc
.
npins
+=
ctrl
->
npins
;
/* initial
control pins
*/
/* initial
ize control's pins[] array
*/
for
(
k
=
0
;
k
<
ctrl
->
npins
;
k
++
)
ctrl
->
pins
[
k
]
=
ctrl
->
pid
+
k
;
/* special soc specific control */
if
(
ctrl
->
mpp_get
||
ctrl
->
mpp_set
)
{
if
(
!
ctrl
->
name
||
!
ctrl
->
mpp_get
||
!
ctrl
->
mpp_set
)
{
dev_err
(
&
pdev
->
dev
,
"wrong soc control info
\n
"
);
return
-
EINVAL
;
}
/*
* We allow to pass controls with NULL name that we treat
* as a range of one-pin groups with generic mvebu register
* controls.
*/
if
(
!
ctrl
->
name
)
{
pctl
->
num_groups
+=
ctrl
->
npins
;
noname
+=
ctrl
->
npins
;
}
else
{
pctl
->
num_groups
+=
1
;
continue
;
}
/* generic mvebu register control */
names
=
devm_kzalloc
(
&
pdev
->
dev
,
ctrl
->
npins
*
8
,
GFP_KERNEL
);
if
(
!
names
)
{
dev_err
(
&
pdev
->
dev
,
"failed to alloc mpp names
\n
"
);
return
-
ENOMEM
;
}
for
(
k
=
0
;
k
<
ctrl
->
npins
;
k
++
)
sprintf
(
names
+
8
*
k
,
"mpp%d"
,
ctrl
->
pid
+
k
);
ctrl
->
name
=
names
;
pctl
->
num_groups
+=
ctrl
->
npins
;
}
pdesc
=
devm_kzalloc
(
&
pdev
->
dev
,
pctl
->
desc
.
npins
*
...
...
@@ -673,12 +613,17 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
pdesc
[
n
].
number
=
n
;
pctl
->
desc
.
pins
=
pdesc
;
pctl
->
groups
=
devm_kzalloc
(
&
pdev
->
dev
,
pctl
->
num_groups
*
sizeof
(
struct
mvebu_pinctrl_group
),
GFP_KERNEL
);
if
(
!
pctl
->
groups
)
{
dev_err
(
&
pdev
->
dev
,
"failed to alloc pinctrl groups
\n
"
);
/*
* allocate groups and name buffers for unnamed groups.
*/
size
=
pctl
->
num_groups
*
sizeof
(
*
pctl
->
groups
)
+
noname
*
8
;
p
=
devm_kzalloc
(
&
pdev
->
dev
,
size
,
GFP_KERNEL
);
if
(
!
p
)
{
dev_err
(
&
pdev
->
dev
,
"failed to alloc group data
\n
"
);
return
-
ENOMEM
;
}
pctl
->
groups
=
p
;
noname_buf
=
p
+
pctl
->
num_groups
*
sizeof
(
*
pctl
->
groups
);
/* assign mpp controls to groups */
gid
=
0
;
...
...
@@ -690,17 +635,26 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
pctl
->
groups
[
gid
].
pins
=
ctrl
->
pins
;
pctl
->
groups
[
gid
].
npins
=
ctrl
->
npins
;
/* generic mvebu register control maps to a number of groups */
if
(
!
ctrl
->
mpp_get
&&
!
ctrl
->
mpp_set
)
{
/*
* We treat unnamed controls as a range of one-pin groups
* with generic mvebu register controls. Use one group for
* each in this range and assign a default group name.
*/
if
(
!
ctrl
->
name
)
{
pctl
->
groups
[
gid
].
name
=
noname_buf
;
pctl
->
groups
[
gid
].
npins
=
1
;
sprintf
(
noname_buf
,
"mpp%d"
,
ctrl
->
pid
+
0
);
noname_buf
+=
8
;
for
(
k
=
1
;
k
<
ctrl
->
npins
;
k
++
)
{
gid
++
;
pctl
->
groups
[
gid
].
gid
=
gid
;
pctl
->
groups
[
gid
].
ctrl
=
ctrl
;
pctl
->
groups
[
gid
].
name
=
&
ctrl
->
name
[
8
*
k
]
;
pctl
->
groups
[
gid
].
name
=
noname_buf
;
pctl
->
groups
[
gid
].
pins
=
&
ctrl
->
pins
[
k
];
pctl
->
groups
[
gid
].
npins
=
1
;
sprintf
(
noname_buf
,
"mpp%d"
,
ctrl
->
pid
+
k
);
noname_buf
+=
8
;
}
}
gid
++
;
...
...
drivers/pinctrl/mvebu/pinctrl-mvebu.h
View file @
a9ea2ed4
...
...
@@ -28,20 +28,19 @@
* between two or more different settings, e.g. assign mpp pin 13 to
* uart1 or sata.
*
* If optional mpp_get/_set functions are set these are used to get/set
* a specific mode. Otherwise it is assumed that the mpp control is based
* on 4-bit groups in subsequent registers. The optional mpp_gpio_req/_dir
* functions can be used to allow pin settings with varying gpio pins.
* The mpp_get/_set functions are mandatory and are used to get/set a
* specific mode. The optional mpp_gpio_req/_dir functions can be used
* to allow pin settings with varying gpio pins.
*/
struct
mvebu_mpp_ctrl
{
const
char
*
name
;
u8
pid
;
u8
npins
;
unsigned
*
pins
;
int
(
*
mpp_get
)(
struct
mvebu_mpp_ctrl
*
ctrl
,
unsigned
long
*
config
);
int
(
*
mpp_set
)(
struct
mvebu_mpp_ctrl
*
ctrl
,
unsigned
long
config
);
int
(
*
mpp_gpio_req
)(
struct
mvebu_mpp_ctrl
*
ctrl
,
u8
pid
);
int
(
*
mpp_gpio_dir
)(
struct
mvebu_mpp_ctrl
*
ctrl
,
u8
pid
,
bool
input
);
int
(
*
mpp_get
)(
unsigned
pid
,
unsigned
long
*
config
);
int
(
*
mpp_set
)(
unsigned
pid
,
unsigned
long
config
);
int
(
*
mpp_gpio_req
)(
unsigned
pid
);
int
(
*
mpp_gpio_dir
)(
unsigned
pid
,
bool
input
);
};
/**
...
...
@@ -114,18 +113,6 @@ struct mvebu_pinctrl_soc_info {
int
ngpioranges
;
};
#define MPP_REG_CTRL(_idl, _idh) \
{ \
.name = NULL, \
.pid = _idl, \
.npins = _idh - _idl + 1, \
.pins = (unsigned[_idh - _idl + 1]) { }, \
.mpp_get = NULL, \
.mpp_set = NULL, \
.mpp_gpio_req = NULL, \
.mpp_gpio_dir = NULL, \
}
#define MPP_FUNC_CTRL(_idl, _idh, _name, _func) \
{ \
.name = _name, \
...
...
@@ -186,6 +173,34 @@ struct mvebu_pinctrl_soc_info {
.npins = _npins, \
}
#define MVEBU_MPPS_PER_REG 8
#define MVEBU_MPP_BITS 4
#define MVEBU_MPP_MASK 0xf
static
inline
int
default_mpp_ctrl_get
(
void
__iomem
*
base
,
unsigned
int
pid
,
unsigned
long
*
config
)
{
unsigned
off
=
(
pid
/
MVEBU_MPPS_PER_REG
)
*
MVEBU_MPP_BITS
;
unsigned
shift
=
(
pid
%
MVEBU_MPPS_PER_REG
)
*
MVEBU_MPP_BITS
;
*
config
=
(
readl
(
base
+
off
)
>>
shift
)
&
MVEBU_MPP_MASK
;
return
0
;
}
static
inline
int
default_mpp_ctrl_set
(
void
__iomem
*
base
,
unsigned
int
pid
,
unsigned
long
config
)
{
unsigned
off
=
(
pid
/
MVEBU_MPPS_PER_REG
)
*
MVEBU_MPP_BITS
;
unsigned
shift
=
(
pid
%
MVEBU_MPPS_PER_REG
)
*
MVEBU_MPP_BITS
;
unsigned
long
reg
;
reg
=
readl
(
base
+
off
)
&
~
(
MVEBU_MPP_MASK
<<
shift
);
writel
(
reg
|
(
config
<<
shift
),
base
+
off
);
return
0
;
}
int
mvebu_pinctrl_probe
(
struct
platform_device
*
pdev
);
int
mvebu_pinctrl_remove
(
struct
platform_device
*
pdev
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment