diff options
126 files changed, 7065 insertions, 1058 deletions
diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.txt b/Documentation/devicetree/bindings/arm/atmel-at91.txt index d187e9f7cf1c..1196290082d1 100644 --- a/Documentation/devicetree/bindings/arm/atmel-at91.txt +++ b/Documentation/devicetree/bindings/arm/atmel-at91.txt | |||
@@ -7,6 +7,12 @@ PIT Timer required properties: | |||
7 | - interrupts: Should contain interrupt for the PIT which is the IRQ line | 7 | - interrupts: Should contain interrupt for the PIT which is the IRQ line |
8 | shared across all System Controller members. | 8 | shared across all System Controller members. |
9 | 9 | ||
10 | System Timer (ST) required properties: | ||
11 | - compatible: Should be "atmel,at91rm9200-st" | ||
12 | - reg: Should contain registers location and length | ||
13 | - interrupts: Should contain interrupt for the ST which is the IRQ line | ||
14 | shared across all System Controller members. | ||
15 | |||
10 | TC/TCLIB Timer required properties: | 16 | TC/TCLIB Timer required properties: |
11 | - compatible: Should be "atmel,<chip>-tcb". | 17 | - compatible: Should be "atmel,<chip>-tcb". |
12 | <chip> can be "at91rm9200" or "at91sam9x5" | 18 | <chip> can be "at91rm9200" or "at91sam9x5" |
diff --git a/Documentation/devicetree/bindings/gpio/gpio.txt b/Documentation/devicetree/bindings/gpio/gpio.txt index 4e16ba4feab0..a33628759d36 100644 --- a/Documentation/devicetree/bindings/gpio/gpio.txt +++ b/Documentation/devicetree/bindings/gpio/gpio.txt | |||
@@ -75,4 +75,40 @@ Example of two SOC GPIO banks defined as gpio-controller nodes: | |||
75 | gpio-controller; | 75 | gpio-controller; |
76 | }; | 76 | }; |
77 | 77 | ||
78 | 2.1) gpio-controller and pinctrl subsystem | ||
79 | ------------------------------------------ | ||
78 | 80 | ||
81 | gpio-controller on a SOC might be tightly coupled with the pinctrl | ||
82 | subsystem, in the sense that the pins can be used by other functions | ||
83 | together with optional gpio feature. | ||
84 | |||
85 | While the pin allocation is totally managed by the pin ctrl subsystem, | ||
86 | gpio (under gpiolib) is still maintained by gpio drivers. It may happen | ||
87 | that different pin ranges in a SoC is managed by different gpio drivers. | ||
88 | |||
89 | This makes it logical to let gpio drivers announce their pin ranges to | ||
90 | the pin ctrl subsystem and call 'pinctrl_request_gpio' in order to | ||
91 | request the corresponding pin before any gpio usage. | ||
92 | |||
93 | For this, the gpio controller can use a pinctrl phandle and pins to | ||
94 | announce the pinrange to the pin ctrl subsystem. For example, | ||
95 | |||
96 | qe_pio_e: gpio-controller@1460 { | ||
97 | #gpio-cells = <2>; | ||
98 | compatible = "fsl,qe-pario-bank-e", "fsl,qe-pario-bank"; | ||
99 | reg = <0x1460 0x18>; | ||
100 | gpio-controller; | ||
101 | gpio-ranges = <&pinctrl1 20 10>, <&pinctrl2 50 20>; | ||
102 | |||
103 | } | ||
104 | |||
105 | where, | ||
106 | &pinctrl1 and &pinctrl2 is the phandle to the pinctrl DT node. | ||
107 | |||
108 | Next values specify the base pin and number of pins for the range | ||
109 | handled by 'qe_pio_e' gpio. In the given example from base pin 20 to | ||
110 | pin 29 under pinctrl1 and pin 50 to pin 69 under pinctrl2 is handled | ||
111 | by this gpio controller. | ||
112 | |||
113 | The pinctrl node must have "#gpio-range-cells" property to show number of | ||
114 | arguments to pass with phandle from gpio controllers node. | ||
diff --git a/Documentation/devicetree/bindings/gpio/gpio_atmel.txt b/Documentation/devicetree/bindings/gpio/gpio_atmel.txt index 66efc804806a..85f8c0d084fa 100644 --- a/Documentation/devicetree/bindings/gpio/gpio_atmel.txt +++ b/Documentation/devicetree/bindings/gpio/gpio_atmel.txt | |||
@@ -9,6 +9,10 @@ Required properties: | |||
9 | unused). | 9 | unused). |
10 | - gpio-controller: Marks the device node as a GPIO controller. | 10 | - gpio-controller: Marks the device node as a GPIO controller. |
11 | 11 | ||
12 | optional properties: | ||
13 | - #gpio-lines: Number of gpio if absent 32. | ||
14 | |||
15 | |||
12 | Example: | 16 | Example: |
13 | pioA: gpio@fffff200 { | 17 | pioA: gpio@fffff200 { |
14 | compatible = "atmel,at91rm9200-gpio"; | 18 | compatible = "atmel,at91rm9200-gpio"; |
@@ -16,5 +20,6 @@ Example: | |||
16 | interrupts = <2 4>; | 20 | interrupts = <2 4>; |
17 | #gpio-cells = <2>; | 21 | #gpio-cells = <2>; |
18 | gpio-controller; | 22 | gpio-controller; |
23 | #gpio-lines = <19>; | ||
19 | }; | 24 | }; |
20 | 25 | ||
diff --git a/Documentation/devicetree/bindings/pinctrl/atmel,at91-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/atmel,at91-pinctrl.txt new file mode 100644 index 000000000000..3a268127b054 --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/atmel,at91-pinctrl.txt | |||
@@ -0,0 +1,141 @@ | |||
1 | * Atmel AT91 Pinmux Controller | ||
2 | |||
3 | The AT91 Pinmux Controler, enables the IC | ||
4 | to share one PAD to several functional blocks. The sharing is done by | ||
5 | multiplexing the PAD input/output signals. For each PAD there are up to | ||
6 | 8 muxing options (called periph modes). Since different modules require | ||
7 | different PAD settings (like pull up, keeper, etc) the contoller controls | ||
8 | also the PAD settings parameters. | ||
9 | |||
10 | Please refer to pinctrl-bindings.txt in this directory for details of the | ||
11 | common pinctrl bindings used by client devices, including the meaning of the | ||
12 | phrase "pin configuration node". | ||
13 | |||
14 | Atmel AT91 pin configuration node is a node of a group of pins which can be | ||
15 | used for a specific device or function. This node represents both mux and config | ||
16 | of the pins in that group. The 'pins' selects the function mode(also named pin | ||
17 | mode) this pin can work on and the 'config' configures various pad settings | ||
18 | such as pull-up, multi drive, etc. | ||
19 | |||
20 | Required properties for iomux controller: | ||
21 | - compatible: "atmel,at91rm9200-pinctrl" | ||
22 | - atmel,mux-mask: array of mask (periph per bank) to describe if a pin can be | ||
23 | configured in this periph mode. All the periph and bank need to be describe. | ||
24 | |||
25 | How to create such array: | ||
26 | |||
27 | Each column will represent the possible peripheral of the pinctrl | ||
28 | Each line will represent a pio bank | ||
29 | |||
30 | Take an example on the 9260 | ||
31 | Peripheral: 2 ( A and B) | ||
32 | Bank: 3 (A, B and C) | ||
33 | => | ||
34 | |||
35 | /* A B */ | ||
36 | 0xffffffff 0xffc00c3b /* pioA */ | ||
37 | 0xffffffff 0x7fff3ccf /* pioB */ | ||
38 | 0xffffffff 0x007fffff /* pioC */ | ||
39 | |||
40 | For each peripheral/bank we will descibe in a u32 if a pin can can be | ||
41 | configured in it by putting 1 to the pin bit (1 << pin) | ||
42 | |||
43 | Let's take the pioA on peripheral B | ||
44 | From the datasheet Table 10-2. | ||
45 | Peripheral B | ||
46 | PA0 MCDB0 | ||
47 | PA1 MCCDB | ||
48 | PA2 | ||
49 | PA3 MCDB3 | ||
50 | PA4 MCDB2 | ||
51 | PA5 MCDB1 | ||
52 | PA6 | ||
53 | PA7 | ||
54 | PA8 | ||
55 | PA9 | ||
56 | PA10 ETX2 | ||
57 | PA11 ETX3 | ||
58 | PA12 | ||
59 | PA13 | ||
60 | PA14 | ||
61 | PA15 | ||
62 | PA16 | ||
63 | PA17 | ||
64 | PA18 | ||
65 | PA19 | ||
66 | PA20 | ||
67 | PA21 | ||
68 | PA22 ETXER | ||
69 | PA23 ETX2 | ||
70 | PA24 ETX3 | ||
71 | PA25 ERX2 | ||
72 | PA26 ERX3 | ||
73 | PA27 ERXCK | ||
74 | PA28 ECRS | ||
75 | PA29 ECOL | ||
76 | PA30 RXD4 | ||
77 | PA31 TXD4 | ||
78 | |||
79 | => 0xffc00c3b | ||
80 | |||
81 | Required properties for pin configuration node: | ||
82 | - atmel,pins: 4 integers array, represents a group of pins mux and config | ||
83 | setting. The format is atmel,pins = <PIN_BANK PIN_BANK_NUM PERIPH CONFIG>. | ||
84 | The PERIPH 0 means gpio. | ||
85 | |||
86 | Bits used for CONFIG: | ||
87 | PULL_UP (1 << 0): indicate this pin need a pull up. | ||
88 | MULTIDRIVE (1 << 1): indicate this pin need to be configured as multidrive. | ||
89 | DEGLITCH (1 << 2): indicate this pin need deglitch. | ||
90 | PULL_DOWN (1 << 3): indicate this pin need a pull down. | ||
91 | DIS_SCHMIT (1 << 4): indicate this pin need to disable schmit trigger. | ||
92 | DEBOUNCE (1 << 16): indicate this pin need debounce. | ||
93 | DEBOUNCE_VAL (0x3fff << 17): debounce val. | ||
94 | |||
95 | NOTE: | ||
96 | Some requirements for using atmel,at91rm9200-pinctrl binding: | ||
97 | 1. We have pin function node defined under at91 controller node to represent | ||
98 | what pinmux functions this SoC supports. | ||
99 | 2. The driver can use the function node's name and pin configuration node's | ||
100 | name describe the pin function and group hierarchy. | ||
101 | For example, Linux at91 pinctrl driver takes the function node's name | ||
102 | as the function name and pin configuration node's name as group name to | ||
103 | create the map table. | ||
104 | 3. Each pin configuration node should have a phandle, devices can set pins | ||
105 | configurations by referring to the phandle of that pin configuration node. | ||
106 | 4. The gpio controller must be describe in the pinctrl simple-bus. | ||
107 | |||
108 | Examples: | ||
109 | |||
110 | pinctrl@fffff400 { | ||
111 | #address-cells = <1>; | ||
112 | #size-cells = <1>; | ||
113 | ranges; | ||
114 | compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; | ||
115 | reg = <0xfffff400 0x600>; | ||
116 | |||
117 | atmel,mux-mask = < | ||
118 | /* A B */ | ||
119 | 0xffffffff 0xffc00c3b /* pioA */ | ||
120 | 0xffffffff 0x7fff3ccf /* pioB */ | ||
121 | 0xffffffff 0x007fffff /* pioC */ | ||
122 | >; | ||
123 | |||
124 | /* shared pinctrl settings */ | ||
125 | dbgu { | ||
126 | pinctrl_dbgu: dbgu-0 { | ||
127 | atmel,pins = | ||
128 | <1 14 0x1 0x0 /* PB14 periph A */ | ||
129 | 1 15 0x1 0x1>; /* PB15 periph with pullup */ | ||
130 | }; | ||
131 | }; | ||
132 | }; | ||
133 | |||
134 | dbgu: serial@fffff200 { | ||
135 | compatible = "atmel,at91sam9260-usart"; | ||
136 | reg = <0xfffff200 0x200>; | ||
137 | interrupts = <1 4 7>; | ||
138 | pinctrl-names = "default"; | ||
139 | pinctrl-0 = <&pinctrl_dbgu>; | ||
140 | status = "disabled"; | ||
141 | }; | ||
diff --git a/Documentation/gpio.txt b/Documentation/gpio.txt index e08a883de36e..77a1d11af723 100644 --- a/Documentation/gpio.txt +++ b/Documentation/gpio.txt | |||
@@ -439,6 +439,48 @@ slower clock delays the rising edge of SCK, and the I2C master adjusts its | |||
439 | signaling rate accordingly. | 439 | signaling rate accordingly. |
440 | 440 | ||
441 | 441 | ||
442 | GPIO controllers and the pinctrl subsystem | ||
443 | ------------------------------------------ | ||
444 | |||
445 | A GPIO controller on a SOC might be tightly coupled with the pinctrl | ||
446 | subsystem, in the sense that the pins can be used by other functions | ||
447 | together with an optional gpio feature. We have already covered the | ||
448 | case where e.g. a GPIO controller need to reserve a pin or set the | ||
449 | direction of a pin by calling any of: | ||
450 | |||
451 | pinctrl_request_gpio() | ||
452 | pinctrl_free_gpio() | ||
453 | pinctrl_gpio_direction_input() | ||
454 | pinctrl_gpio_direction_output() | ||
455 | |||
456 | But how does the pin control subsystem cross-correlate the GPIO | ||
457 | numbers (which are a global business) to a certain pin on a certain | ||
458 | pin controller? | ||
459 | |||
460 | This is done by registering "ranges" of pins, which are essentially | ||
461 | cross-reference tables. These are described in | ||
462 | Documentation/pinctrl.txt | ||
463 | |||
464 | While the pin allocation is totally managed by the pinctrl subsystem, | ||
465 | gpio (under gpiolib) is still maintained by gpio drivers. It may happen | ||
466 | that different pin ranges in a SoC is managed by different gpio drivers. | ||
467 | |||
468 | This makes it logical to let gpio drivers announce their pin ranges to | ||
469 | the pin ctrl subsystem before it will call 'pinctrl_request_gpio' in order | ||
470 | to request the corresponding pin to be prepared by the pinctrl subsystem | ||
471 | before any gpio usage. | ||
472 | |||
473 | For this, the gpio controller can register its pin range with pinctrl | ||
474 | subsystem. There are two ways of doing it currently: with or without DT. | ||
475 | |||
476 | For with DT support refer to Documentation/devicetree/bindings/gpio/gpio.txt. | ||
477 | |||
478 | For non-DT support, user can call gpiochip_add_pin_range() with appropriate | ||
479 | parameters to register a range of gpio pins with a pinctrl driver. For this | ||
480 | exact name string of pinctrl device has to be passed as one of the | ||
481 | argument to this routine. | ||
482 | |||
483 | |||
442 | What do these conventions omit? | 484 | What do these conventions omit? |
443 | =============================== | 485 | =============================== |
444 | One of the biggest things these conventions omit is pin multiplexing, since | 486 | One of the biggest things these conventions omit is pin multiplexing, since |
diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt index 3b4ee5328868..da40efbef6ec 100644 --- a/Documentation/pinctrl.txt +++ b/Documentation/pinctrl.txt | |||
@@ -364,6 +364,9 @@ will get an pin number into its handled number range. Further it is also passed | |||
364 | the range ID value, so that the pin controller knows which range it should | 364 | the range ID value, so that the pin controller knows which range it should |
365 | deal with. | 365 | deal with. |
366 | 366 | ||
367 | Calling pinctrl_add_gpio_range from pinctrl driver is DEPRECATED. Please see | ||
368 | section 2.1 of Documentation/devicetree/bindings/gpio/gpio.txt on how to bind | ||
369 | pinctrl and gpio drivers. | ||
367 | 370 | ||
368 | PINMUX interfaces | 371 | PINMUX interfaces |
369 | ================= | 372 | ================= |
@@ -1193,4 +1196,6 @@ foo_switch() | |||
1193 | ... | 1196 | ... |
1194 | } | 1197 | } |
1195 | 1198 | ||
1196 | The above has to be done from process context. | 1199 | The above has to be done from process context. The reservation of the pins |
1200 | will be done when the state is activated, so in effect one specific pin | ||
1201 | can be used by different functions at different times on a running system. | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 3d3abbacc1a3..d02cdb596d35 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -5689,6 +5689,12 @@ S: Maintained | |||
5689 | F: drivers/pinctrl/ | 5689 | F: drivers/pinctrl/ |
5690 | F: include/linux/pinctrl/ | 5690 | F: include/linux/pinctrl/ |
5691 | 5691 | ||
5692 | PIN CONTROLLER - ATMEL AT91 | ||
5693 | M: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> | ||
5694 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||
5695 | S: Maintained | ||
5696 | F: drivers/pinctrl/pinctrl-at91.c | ||
5697 | |||
5692 | PIN CONTROLLER - ST SPEAR | 5698 | PIN CONTROLLER - ST SPEAR |
5693 | M: Viresh Kumar <viresh.linux@gmail.com> | 5699 | M: Viresh Kumar <viresh.linux@gmail.com> |
5694 | L: spear-devel@list.st.com | 5700 | L: spear-devel@list.st.com |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9759fec0b704..67f1fdbad7f9 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -330,6 +330,8 @@ config ARCH_AT91 | |||
330 | select IRQ_DOMAIN | 330 | select IRQ_DOMAIN |
331 | select NEED_MACH_GPIO_H | 331 | select NEED_MACH_GPIO_H |
332 | select NEED_MACH_IO_H if PCCARD | 332 | select NEED_MACH_IO_H if PCCARD |
333 | select PINCTRL | ||
334 | select PINCTRL_AT91 if USE_OF | ||
333 | help | 335 | help |
334 | This enables support for systems based on Atmel | 336 | This enables support for systems based on Atmel |
335 | AT91RM9200 and AT91SAM9* processors. | 337 | AT91RM9200 and AT91SAM9* processors. |
@@ -587,6 +589,7 @@ config ARCH_MMP | |||
587 | select GPIO_PXA | 589 | select GPIO_PXA |
588 | select IRQ_DOMAIN | 590 | select IRQ_DOMAIN |
589 | select NEED_MACH_GPIO_H | 591 | select NEED_MACH_GPIO_H |
592 | select PINCTRL | ||
590 | select PLAT_PXA | 593 | select PLAT_PXA |
591 | select SPARSE_IRQ | 594 | select SPARSE_IRQ |
592 | help | 595 | help |
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index f37cf9fa5fa0..fb5b07737ca7 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
@@ -1,21 +1,37 @@ | |||
1 | ifeq ($(CONFIG_OF),y) | 1 | ifeq ($(CONFIG_OF),y) |
2 | 2 | ||
3 | dtb-$(CONFIG_ARCH_AT91) += aks-cdu.dtb \ | 3 | # Keep at91 dtb files sorted alphabetically for each SoC |
4 | at91sam9263ek.dtb \ | 4 | # rm9200 |
5 | at91sam9g20ek_2mmc.dtb \ | 5 | dtb-$(CONFIG_ARCH_AT91) += at91rm9200ek.dtb |
6 | at91sam9g20ek.dtb \ | 6 | # sam9260 |
7 | at91sam9g25ek.dtb \ | 7 | dtb-$(CONFIG_ARCH_AT91) += animeo_ip.dtb |
8 | at91sam9m10g45ek.dtb \ | 8 | dtb-$(CONFIG_ARCH_AT91) += aks-cdu.dtb |
9 | at91sam9n12ek.dtb \ | 9 | dtb-$(CONFIG_ARCH_AT91) += ethernut5.dtb |
10 | ethernut5.dtb \ | 10 | dtb-$(CONFIG_ARCH_AT91) += evk-pro3.dtb |
11 | evk-pro3.dtb \ | 11 | dtb-$(CONFIG_ARCH_AT91) += tny_a9260.dtb |
12 | kizbox.dtb \ | 12 | dtb-$(CONFIG_ARCH_AT91) += usb_a9260.dtb |
13 | tny_a9260.dtb \ | 13 | # sam9263 |
14 | tny_a9263.dtb \ | 14 | dtb-$(CONFIG_ARCH_AT91) += at91sam9263ek.dtb |
15 | tny_a9g20.dtb \ | 15 | dtb-$(CONFIG_ARCH_AT91) += tny_a9263.dtb |
16 | usb_a9260.dtb \ | 16 | dtb-$(CONFIG_ARCH_AT91) += usb_a9263.dtb |
17 | usb_a9263.dtb \ | 17 | # sam9g20 |
18 | usb_a9g20.dtb | 18 | dtb-$(CONFIG_ARCH_AT91) += at91sam9g20ek.dtb |
19 | dtb-$(CONFIG_ARCH_AT91) += at91sam9g20ek_2mmc.dtb | ||
20 | dtb-$(CONFIG_ARCH_AT91) += kizbox.dtb | ||
21 | dtb-$(CONFIG_ARCH_AT91) += tny_a9g20.dtb | ||
22 | dtb-$(CONFIG_ARCH_AT91) += usb_a9g20.dtb | ||
23 | # sam9g45 | ||
24 | dtb-$(CONFIG_ARCH_AT91) += at91sam9m10g45ek.dtb | ||
25 | dtb-$(CONFIG_ARCH_AT91) += pm9g45.dtb | ||
26 | # sam9n12 | ||
27 | dtb-$(CONFIG_ARCH_AT91) += at91sam9n12ek.dtb | ||
28 | # sam9x5 | ||
29 | dtb-$(CONFIG_ARCH_AT91) += at91sam9g15ek.dtb | ||
30 | dtb-$(CONFIG_ARCH_AT91) += at91sam9g25ek.dtb | ||
31 | dtb-$(CONFIG_ARCH_AT91) += at91sam9g35ek.dtb | ||
32 | dtb-$(CONFIG_ARCH_AT91) += at91sam9x25ek.dtb | ||
33 | dtb-$(CONFIG_ARCH_AT91) += at91sam9x35ek.dtb | ||
34 | |||
19 | dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb | 35 | dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb |
20 | dtb-$(CONFIG_ARCH_DOVE) += dove-cm-a510.dtb \ | 36 | dtb-$(CONFIG_ARCH_DOVE) += dove-cm-a510.dtb \ |
21 | dove-cubox.dtb \ | 37 | dove-cubox.dtb \ |
diff --git a/arch/arm/boot/dts/animeo_ip.dts b/arch/arm/boot/dts/animeo_ip.dts new file mode 100644 index 000000000000..74d92cd29d87 --- /dev/null +++ b/arch/arm/boot/dts/animeo_ip.dts | |||
@@ -0,0 +1,178 @@ | |||
1 | /* | ||
2 | * animeo_ip.dts - Device Tree file for Somfy Animeo IP Boards | ||
3 | * | ||
4 | * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Licensed under GPLv2 only. | ||
7 | */ | ||
8 | |||
9 | /dts-v1/; | ||
10 | /include/ "at91sam9260.dtsi" | ||
11 | |||
12 | / { | ||
13 | model = "Somfy Animeo IP"; | ||
14 | compatible = "somfy,animeo-ip", "atmel,at91sam9260", "atmel,at91sam9"; | ||
15 | |||
16 | aliases { | ||
17 | serial0 = &usart1; | ||
18 | serial1 = &usart2; | ||
19 | serial2 = &usart0; | ||
20 | serial3 = &dbgu; | ||
21 | serial4 = &usart3; | ||
22 | serial5 = &uart0; | ||
23 | serial6 = &uart1; | ||
24 | }; | ||
25 | |||
26 | chosen { | ||
27 | linux,stdout-path = &usart2; | ||
28 | }; | ||
29 | |||
30 | memory { | ||
31 | reg = <0x20000000 0x4000000>; | ||
32 | }; | ||
33 | |||
34 | clocks { | ||
35 | #address-cells = <1>; | ||
36 | #size-cells = <1>; | ||
37 | ranges; | ||
38 | |||
39 | main_clock: clock@0 { | ||
40 | compatible = "atmel,osc", "fixed-clock"; | ||
41 | clock-frequency = <18432000>; | ||
42 | }; | ||
43 | }; | ||
44 | |||
45 | ahb { | ||
46 | apb { | ||
47 | usart0: serial@fffb0000 { | ||
48 | pinctrl-0 = <&pinctrl_usart0 &pinctrl_usart0_rts>; | ||
49 | linux,rs485-enabled-at-boot-time; | ||
50 | status = "okay"; | ||
51 | }; | ||
52 | |||
53 | usart1: serial@fffb4000 { | ||
54 | pinctrl-0 = <&pinctrl_usart1 &pinctrl_usart1_rts>; | ||
55 | linux,rs485-enabled-at-boot-time; | ||
56 | status = "okay"; | ||
57 | }; | ||
58 | |||
59 | usart2: serial@fffb8000 { | ||
60 | pinctrl-0 = <&pinctrl_usart2>; | ||
61 | status = "okay"; | ||
62 | }; | ||
63 | |||
64 | macb0: ethernet@fffc4000 { | ||
65 | pinctrl-0 = <&pinctrl_macb_rmii &pinctrl_macb_rmii_mii>; | ||
66 | phy-mode = "mii"; | ||
67 | status = "okay"; | ||
68 | }; | ||
69 | |||
70 | mmc0: mmc@fffa8000 { | ||
71 | pinctrl-0 = <&pinctrl_mmc0_clk | ||
72 | &pinctrl_mmc0_slot1_cmd_dat0 | ||
73 | &pinctrl_mmc0_slot1_dat1_3>; | ||
74 | status = "okay"; | ||
75 | |||
76 | slot@1 { | ||
77 | reg = <1>; | ||
78 | bus-width = <4>; | ||
79 | }; | ||
80 | }; | ||
81 | }; | ||
82 | |||
83 | nand0: nand@40000000 { | ||
84 | nand-bus-width = <8>; | ||
85 | nand-ecc-mode = "soft"; | ||
86 | nand-on-flash-bbt; | ||
87 | status = "okay"; | ||
88 | |||
89 | at91bootstrap@0 { | ||
90 | label = "at91bootstrap"; | ||
91 | reg = <0x0 0x8000>; | ||
92 | }; | ||
93 | |||
94 | barebox@8000 { | ||
95 | label = "barebox"; | ||
96 | reg = <0x8000 0x40000>; | ||
97 | }; | ||
98 | |||
99 | bareboxenv@48000 { | ||
100 | label = "bareboxenv"; | ||
101 | reg = <0x48000 0x8000>; | ||
102 | }; | ||
103 | |||
104 | user_block@0x50000 { | ||
105 | label = "user_block"; | ||
106 | reg = <0x50000 0xb0000>; | ||
107 | }; | ||
108 | |||
109 | kernel@100000 { | ||
110 | label = "kernel"; | ||
111 | reg = <0x100000 0x1b0000>; | ||
112 | }; | ||
113 | |||
114 | root@2b0000 { | ||
115 | label = "root"; | ||
116 | reg = <0x2b0000 0x1D50000>; | ||
117 | }; | ||
118 | }; | ||
119 | |||
120 | usb0: ohci@00500000 { | ||
121 | num-ports = <2>; | ||
122 | atmel,vbus-gpio = <&pioB 15 1>; | ||
123 | status = "okay"; | ||
124 | }; | ||
125 | }; | ||
126 | |||
127 | leds { | ||
128 | compatible = "gpio-leds"; | ||
129 | |||
130 | power_green { | ||
131 | label = "power_green"; | ||
132 | gpios = <&pioC 17 0>; | ||
133 | linux,default-trigger = "heartbeat"; | ||
134 | }; | ||
135 | |||
136 | power_red { | ||
137 | label = "power_red"; | ||
138 | gpios = <&pioA 2 0>; | ||
139 | }; | ||
140 | |||
141 | tx_green { | ||
142 | label = "tx_green"; | ||
143 | gpios = <&pioC 19 0>; | ||
144 | }; | ||
145 | |||
146 | tx_red { | ||
147 | label = "tx_red"; | ||
148 | gpios = <&pioC 18 0>; | ||
149 | }; | ||
150 | }; | ||
151 | |||
152 | gpio_keys { | ||
153 | compatible = "gpio-keys"; | ||
154 | #address-cells = <1>; | ||
155 | #size-cells = <0>; | ||
156 | |||
157 | keyswitch_in { | ||
158 | label = "keyswitch_in"; | ||
159 | gpios = <&pioB 1 0>; | ||
160 | linux,code = <28>; | ||
161 | gpio-key,wakeup; | ||
162 | }; | ||
163 | |||
164 | error_in { | ||
165 | label = "error_in"; | ||
166 | gpios = <&pioB 2 0>; | ||
167 | linux,code = <29>; | ||
168 | gpio-key,wakeup; | ||
169 | }; | ||
170 | |||
171 | btn { | ||
172 | label = "btn"; | ||
173 | gpios = <&pioC 23 0>; | ||
174 | linux,code = <31>; | ||
175 | gpio-key,wakeup; | ||
176 | }; | ||
177 | }; | ||
178 | }; | ||
diff --git a/arch/arm/boot/dts/at91rm9200.dtsi b/arch/arm/boot/dts/at91rm9200.dtsi new file mode 100644 index 000000000000..e154f242c680 --- /dev/null +++ b/arch/arm/boot/dts/at91rm9200.dtsi | |||
@@ -0,0 +1,349 @@ | |||
1 | /* | ||
2 | * at91rm9200.dtsi - Device Tree Include file for AT91RM9200 family SoC | ||
3 | * | ||
4 | * Copyright (C) 2011 Atmel, | ||
5 | * 2011 Nicolas Ferre <nicolas.ferre@atmel.com>, | ||
6 | * 2012 Joachim Eastwood <manabian@gmail.com> | ||
7 | * | ||
8 | * Based on at91sam9260.dtsi | ||
9 | * | ||
10 | * Licensed under GPLv2 or later. | ||
11 | */ | ||
12 | |||
13 | /include/ "skeleton.dtsi" | ||
14 | |||
15 | / { | ||
16 | model = "Atmel AT91RM9200 family SoC"; | ||
17 | compatible = "atmel,at91rm9200"; | ||
18 | interrupt-parent = <&aic>; | ||
19 | |||
20 | aliases { | ||
21 | serial0 = &dbgu; | ||
22 | serial1 = &usart0; | ||
23 | serial2 = &usart1; | ||
24 | serial3 = &usart2; | ||
25 | serial4 = &usart3; | ||
26 | gpio0 = &pioA; | ||
27 | gpio1 = &pioB; | ||
28 | gpio2 = &pioC; | ||
29 | gpio3 = &pioD; | ||
30 | tcb0 = &tcb0; | ||
31 | tcb1 = &tcb1; | ||
32 | }; | ||
33 | cpus { | ||
34 | cpu@0 { | ||
35 | compatible = "arm,arm920t"; | ||
36 | }; | ||
37 | }; | ||
38 | |||
39 | memory { | ||
40 | reg = <0x20000000 0x04000000>; | ||
41 | }; | ||
42 | |||
43 | ahb { | ||
44 | compatible = "simple-bus"; | ||
45 | #address-cells = <1>; | ||
46 | #size-cells = <1>; | ||
47 | ranges; | ||
48 | |||
49 | apb { | ||
50 | compatible = "simple-bus"; | ||
51 | #address-cells = <1>; | ||
52 | #size-cells = <1>; | ||
53 | ranges; | ||
54 | |||
55 | aic: interrupt-controller@fffff000 { | ||
56 | #interrupt-cells = <3>; | ||
57 | compatible = "atmel,at91rm9200-aic"; | ||
58 | interrupt-controller; | ||
59 | reg = <0xfffff000 0x200>; | ||
60 | atmel,external-irqs = <25 26 27 28 29 30 31>; | ||
61 | }; | ||
62 | |||
63 | ramc0: ramc@ffffff00 { | ||
64 | compatible = "atmel,at91rm9200-sdramc"; | ||
65 | reg = <0xffffff00 0x100>; | ||
66 | }; | ||
67 | |||
68 | pmc: pmc@fffffc00 { | ||
69 | compatible = "atmel,at91rm9200-pmc"; | ||
70 | reg = <0xfffffc00 0x100>; | ||
71 | }; | ||
72 | |||
73 | st: timer@fffffd00 { | ||
74 | compatible = "atmel,at91rm9200-st"; | ||
75 | reg = <0xfffffd00 0x100>; | ||
76 | interrupts = <1 4 7>; | ||
77 | }; | ||
78 | |||
79 | tcb0: timer@fffa0000 { | ||
80 | compatible = "atmel,at91rm9200-tcb"; | ||
81 | reg = <0xfffa0000 0x100>; | ||
82 | interrupts = <17 4 0 18 4 0 19 4 0>; | ||
83 | }; | ||
84 | |||
85 | tcb1: timer@fffa4000 { | ||
86 | compatible = "atmel,at91rm9200-tcb"; | ||
87 | reg = <0xfffa4000 0x100>; | ||
88 | interrupts = <20 4 0 21 4 0 22 4 0>; | ||
89 | }; | ||
90 | |||
91 | pinctrl@fffff400 { | ||
92 | #address-cells = <1>; | ||
93 | #size-cells = <1>; | ||
94 | compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; | ||
95 | ranges = <0xfffff400 0xfffff400 0x800>; | ||
96 | |||
97 | atmel,mux-mask = < | ||
98 | /* A B */ | ||
99 | 0xffffffff 0xffffffff /* pioA */ | ||
100 | 0xffffffff 0x083fffff /* pioB */ | ||
101 | 0xffff3fff 0x00000000 /* pioC */ | ||
102 | 0x03ff87ff 0x0fffff80 /* pioD */ | ||
103 | >; | ||
104 | |||
105 | /* shared pinctrl settings */ | ||
106 | dbgu { | ||
107 | pinctrl_dbgu: dbgu-0 { | ||
108 | atmel,pins = | ||
109 | <0 30 0x1 0x0 /* PA30 periph A */ | ||
110 | 0 31 0x1 0x1>; /* PA31 periph with pullup */ | ||
111 | }; | ||
112 | }; | ||
113 | |||
114 | uart0 { | ||
115 | pinctrl_uart0: uart0-0 { | ||
116 | atmel,pins = | ||
117 | <0 17 0x1 0x0 /* PA17 periph A */ | ||
118 | 0 18 0x1 0x0>; /* PA18 periph A */ | ||
119 | }; | ||
120 | |||
121 | pinctrl_uart0_rts: uart0_rts-0 { | ||
122 | atmel,pins = | ||
123 | <0 20 0x1 0x0>; /* PA20 periph A */ | ||
124 | }; | ||
125 | |||
126 | pinctrl_uart0_cts: uart0_cts-0 { | ||
127 | atmel,pins = | ||
128 | <0 21 0x1 0x0>; /* PA21 periph A */ | ||
129 | }; | ||
130 | }; | ||
131 | |||
132 | uart1 { | ||
133 | pinctrl_uart1: uart1-0 { | ||
134 | atmel,pins = | ||
135 | <1 20 0x1 0x1 /* PB20 periph A with pullup */ | ||
136 | 1 21 0x1 0x0>; /* PB21 periph A */ | ||
137 | }; | ||
138 | |||
139 | pinctrl_uart1_rts: uart1_rts-0 { | ||
140 | atmel,pins = | ||
141 | <1 24 0x1 0x0>; /* PB24 periph A */ | ||
142 | }; | ||
143 | |||
144 | pinctrl_uart1_cts: uart1_cts-0 { | ||
145 | atmel,pins = | ||
146 | <1 26 0x1 0x0>; /* PB26 periph A */ | ||
147 | }; | ||
148 | |||
149 | pinctrl_uart1_dtr_dsr: uart1_dtr_dsr-0 { | ||
150 | atmel,pins = | ||
151 | <1 19 0x1 0x0 /* PB19 periph A */ | ||
152 | 1 25 0x1 0x0>; /* PB25 periph A */ | ||
153 | }; | ||
154 | |||
155 | pinctrl_uart1_dcd: uart1_dcd-0 { | ||
156 | atmel,pins = | ||
157 | <1 23 0x1 0x0>; /* PB23 periph A */ | ||
158 | }; | ||
159 | |||
160 | pinctrl_uart1_ri: uart1_ri-0 { | ||
161 | atmel,pins = | ||
162 | <1 18 0x1 0x0>; /* PB18 periph A */ | ||
163 | }; | ||
164 | }; | ||
165 | |||
166 | uart2 { | ||
167 | pinctrl_uart2: uart2-0 { | ||
168 | atmel,pins = | ||
169 | <0 22 0x1 0x0 /* PA22 periph A */ | ||
170 | 0 23 0x1 0x1>; /* PA23 periph A with pullup */ | ||
171 | }; | ||
172 | |||
173 | pinctrl_uart2_rts: uart2_rts-0 { | ||
174 | atmel,pins = | ||
175 | <0 30 0x2 0x0>; /* PA30 periph B */ | ||
176 | }; | ||
177 | |||
178 | pinctrl_uart2_cts: uart2_cts-0 { | ||
179 | atmel,pins = | ||
180 | <0 31 0x2 0x0>; /* PA31 periph B */ | ||
181 | }; | ||
182 | }; | ||
183 | |||
184 | uart3 { | ||
185 | pinctrl_uart3: uart3-0 { | ||
186 | atmel,pins = | ||
187 | <0 5 0x2 0x1 /* PA5 periph B with pullup */ | ||
188 | 0 6 0x2 0x0>; /* PA6 periph B */ | ||
189 | }; | ||
190 | |||
191 | pinctrl_uart3_rts: uart3_rts-0 { | ||
192 | atmel,pins = | ||
193 | <1 0 0x2 0x0>; /* PB0 periph B */ | ||
194 | }; | ||
195 | |||
196 | pinctrl_uart3_cts: uart3_cts-0 { | ||
197 | atmel,pins = | ||
198 | <1 1 0x2 0x0>; /* PB1 periph B */ | ||
199 | }; | ||
200 | }; | ||
201 | |||
202 | nand { | ||
203 | pinctrl_nand: nand-0 { | ||
204 | atmel,pins = | ||
205 | <2 2 0x0 0x1 /* PC2 gpio RDY pin pull_up */ | ||
206 | 1 1 0x0 0x1>; /* PB1 gpio CD pin pull_up */ | ||
207 | }; | ||
208 | }; | ||
209 | |||
210 | pioA: gpio@fffff400 { | ||
211 | compatible = "atmel,at91rm9200-gpio"; | ||
212 | reg = <0xfffff400 0x200>; | ||
213 | interrupts = <2 4 1>; | ||
214 | #gpio-cells = <2>; | ||
215 | gpio-controller; | ||
216 | interrupt-controller; | ||
217 | #interrupt-cells = <2>; | ||
218 | }; | ||
219 | |||
220 | pioB: gpio@fffff600 { | ||
221 | compatible = "atmel,at91rm9200-gpio"; | ||
222 | reg = <0xfffff600 0x200>; | ||
223 | interrupts = <3 4 1>; | ||
224 | #gpio-cells = <2>; | ||
225 | gpio-controller; | ||
226 | interrupt-controller; | ||
227 | #interrupt-cells = <2>; | ||
228 | }; | ||
229 | |||
230 | pioC: gpio@fffff800 { | ||
231 | compatible = "atmel,at91rm9200-gpio"; | ||
232 | reg = <0xfffff800 0x200>; | ||
233 | interrupts = <4 4 1>; | ||
234 | #gpio-cells = <2>; | ||
235 | gpio-controller; | ||
236 | interrupt-controller; | ||
237 | #interrupt-cells = <2>; | ||
238 | }; | ||
239 | |||
240 | pioD: gpio@fffffa00 { | ||
241 | compatible = "atmel,at91rm9200-gpio"; | ||
242 | reg = <0xfffffa00 0x200>; | ||
243 | interrupts = <5 4 1>; | ||
244 | #gpio-cells = <2>; | ||
245 | gpio-controller; | ||
246 | interrupt-controller; | ||
247 | #interrupt-cells = <2>; | ||
248 | }; | ||
249 | }; | ||
250 | |||
251 | dbgu: serial@fffff200 { | ||
252 | compatible = "atmel,at91rm9200-usart"; | ||
253 | reg = <0xfffff200 0x200>; | ||
254 | interrupts = <1 4 7>; | ||
255 | pinctrl-names = "default"; | ||
256 | pinctrl-0 = <&pinctrl_dbgu>; | ||
257 | status = "disabled"; | ||
258 | }; | ||
259 | |||
260 | usart0: serial@fffc0000 { | ||
261 | compatible = "atmel,at91rm9200-usart"; | ||
262 | reg = <0xfffc0000 0x200>; | ||
263 | interrupts = <6 4 5>; | ||
264 | atmel,use-dma-rx; | ||
265 | atmel,use-dma-tx; | ||
266 | pinctrl-names = "default"; | ||
267 | pinctrl-0 = <&pinctrl_uart0>; | ||
268 | status = "disabled"; | ||
269 | }; | ||
270 | |||
271 | usart1: serial@fffc4000 { | ||
272 | compatible = "atmel,at91rm9200-usart"; | ||
273 | reg = <0xfffc4000 0x200>; | ||
274 | interrupts = <7 4 5>; | ||
275 | atmel,use-dma-rx; | ||
276 | atmel,use-dma-tx; | ||
277 | pinctrl-names = "default"; | ||
278 | pinctrl-0 = <&pinctrl_uart1>; | ||
279 | status = "disabled"; | ||
280 | }; | ||
281 | |||
282 | usart2: serial@fffc8000 { | ||
283 | compatible = "atmel,at91rm9200-usart"; | ||
284 | reg = <0xfffc8000 0x200>; | ||
285 | interrupts = <8 4 5>; | ||
286 | atmel,use-dma-rx; | ||
287 | atmel,use-dma-tx; | ||
288 | pinctrl-names = "default"; | ||
289 | pinctrl-0 = <&pinctrl_uart2>; | ||
290 | status = "disabled"; | ||
291 | }; | ||
292 | |||
293 | usart3: serial@fffcc000 { | ||
294 | compatible = "atmel,at91rm9200-usart"; | ||
295 | reg = <0xfffcc000 0x200>; | ||
296 | interrupts = <23 4 5>; | ||
297 | atmel,use-dma-rx; | ||
298 | atmel,use-dma-tx; | ||
299 | pinctrl-names = "default"; | ||
300 | pinctrl-0 = <&pinctrl_uart3>; | ||
301 | status = "disabled"; | ||
302 | }; | ||
303 | |||
304 | usb1: gadget@fffb0000 { | ||
305 | compatible = "atmel,at91rm9200-udc"; | ||
306 | reg = <0xfffb0000 0x4000>; | ||
307 | interrupts = <11 4 2>; | ||
308 | status = "disabled"; | ||
309 | }; | ||
310 | }; | ||
311 | |||
312 | nand0: nand@40000000 { | ||
313 | compatible = "atmel,at91rm9200-nand"; | ||
314 | #address-cells = <1>; | ||
315 | #size-cells = <1>; | ||
316 | reg = <0x40000000 0x10000000>; | ||
317 | atmel,nand-addr-offset = <21>; | ||
318 | atmel,nand-cmd-offset = <22>; | ||
319 | pinctrl-names = "default"; | ||
320 | pinctrl-0 = <&pinctrl_nand>; | ||
321 | nand-ecc-mode = "soft"; | ||
322 | gpios = <&pioC 2 0 | ||
323 | 0 | ||
324 | &pioB 1 0 | ||
325 | >; | ||
326 | status = "disabled"; | ||
327 | }; | ||
328 | |||
329 | usb0: ohci@00300000 { | ||
330 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | ||
331 | reg = <0x00300000 0x100000>; | ||
332 | interrupts = <23 4 2>; | ||
333 | status = "disabled"; | ||
334 | }; | ||
335 | }; | ||
336 | |||
337 | i2c@0 { | ||
338 | compatible = "i2c-gpio"; | ||
339 | gpios = <&pioA 23 0 /* sda */ | ||
340 | &pioA 24 0 /* scl */ | ||
341 | >; | ||
342 | i2c-gpio,sda-open-drain; | ||
343 | i2c-gpio,scl-open-drain; | ||
344 | i2c-gpio,delay-us = <2>; /* ~100 kHz */ | ||
345 | #address-cells = <1>; | ||
346 | #size-cells = <0>; | ||
347 | status = "disabled"; | ||
348 | }; | ||
349 | }; | ||
diff --git a/arch/arm/boot/dts/at91rm9200ek.dts b/arch/arm/boot/dts/at91rm9200ek.dts new file mode 100644 index 000000000000..8aa48931e0a2 --- /dev/null +++ b/arch/arm/boot/dts/at91rm9200ek.dts | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * at91rm9200ek.dts - Device Tree file for Atmel AT91RM9200 evaluation kit | ||
3 | * | ||
4 | * Copyright (C) 2012 Joachim Eastwood <manabian@gmail.com> | ||
5 | * | ||
6 | * Licensed under GPLv2 only | ||
7 | */ | ||
8 | /dts-v1/; | ||
9 | /include/ "at91rm9200.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Atmel AT91RM9200 evaluation kit"; | ||
13 | compatible = "atmel,at91rm9200ek", "atmel,at91rm9200"; | ||
14 | |||
15 | memory { | ||
16 | reg = <0x20000000 0x4000000>; | ||
17 | }; | ||
18 | |||
19 | clocks { | ||
20 | #address-cells = <1>; | ||
21 | #size-cells = <1>; | ||
22 | ranges; | ||
23 | |||
24 | main_clock: clock@0 { | ||
25 | compatible = "atmel,osc", "fixed-clock"; | ||
26 | clock-frequency = <18432000>; | ||
27 | }; | ||
28 | }; | ||
29 | |||
30 | ahb { | ||
31 | apb { | ||
32 | dbgu: serial@fffff200 { | ||
33 | status = "okay"; | ||
34 | }; | ||
35 | |||
36 | usart1: serial@fffc4000 { | ||
37 | pinctrl-0 = | ||
38 | <&pinctrl_uart1 | ||
39 | &pinctrl_uart1_rts | ||
40 | &pinctrl_uart1_cts | ||
41 | &pinctrl_uart1_dtr_dsr | ||
42 | &pinctrl_uart1_dcd | ||
43 | &pinctrl_uart1_ri>; | ||
44 | status = "okay"; | ||
45 | }; | ||
46 | |||
47 | usb1: gadget@fffb0000 { | ||
48 | atmel,vbus-gpio = <&pioD 4 0>; | ||
49 | status = "okay"; | ||
50 | }; | ||
51 | }; | ||
52 | |||
53 | usb0: ohci@00300000 { | ||
54 | num-ports = <2>; | ||
55 | status = "okay"; | ||
56 | }; | ||
57 | }; | ||
58 | |||
59 | leds { | ||
60 | compatible = "gpio-leds"; | ||
61 | |||
62 | ds2 { | ||
63 | label = "green"; | ||
64 | gpios = <&pioB 0 0x1>; | ||
65 | linux,default-trigger = "mmc0"; | ||
66 | }; | ||
67 | |||
68 | ds4 { | ||
69 | label = "yellow"; | ||
70 | gpios = <&pioB 1 0x1>; | ||
71 | linux,default-trigger = "heartbeat"; | ||
72 | }; | ||
73 | |||
74 | ds6 { | ||
75 | label = "red"; | ||
76 | gpios = <&pioB 2 0x1>; | ||
77 | }; | ||
78 | }; | ||
79 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index d410581a5a85..b1d3fab60e0a 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi | |||
@@ -21,8 +21,8 @@ | |||
21 | serial2 = &usart1; | 21 | serial2 = &usart1; |
22 | serial3 = &usart2; | 22 | serial3 = &usart2; |
23 | serial4 = &usart3; | 23 | serial4 = &usart3; |
24 | serial5 = &usart4; | 24 | serial5 = &uart0; |
25 | serial6 = &usart5; | 25 | serial6 = &uart1; |
26 | gpio0 = &pioA; | 26 | gpio0 = &pioA; |
27 | gpio1 = &pioB; | 27 | gpio1 = &pioB; |
28 | gpio2 = &pioC; | 28 | gpio2 = &pioC; |
@@ -98,40 +98,250 @@ | |||
98 | interrupts = <26 4 0 27 4 0 28 4 0>; | 98 | interrupts = <26 4 0 27 4 0 28 4 0>; |
99 | }; | 99 | }; |
100 | 100 | ||
101 | pioA: gpio@fffff400 { | 101 | pinctrl@fffff400 { |
102 | compatible = "atmel,at91rm9200-gpio"; | 102 | #address-cells = <1>; |
103 | reg = <0xfffff400 0x100>; | 103 | #size-cells = <1>; |
104 | interrupts = <2 4 1>; | 104 | compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; |
105 | #gpio-cells = <2>; | 105 | ranges = <0xfffff400 0xfffff400 0x600>; |
106 | gpio-controller; | 106 | |
107 | interrupt-controller; | 107 | atmel,mux-mask = < |
108 | #interrupt-cells = <2>; | 108 | /* A B */ |
109 | }; | 109 | 0xffffffff 0xffc00c3b /* pioA */ |
110 | 0xffffffff 0x7fff3ccf /* pioB */ | ||
111 | 0xffffffff 0x007fffff /* pioC */ | ||
112 | >; | ||
113 | |||
114 | /* shared pinctrl settings */ | ||
115 | dbgu { | ||
116 | pinctrl_dbgu: dbgu-0 { | ||
117 | atmel,pins = | ||
118 | <1 14 0x1 0x0 /* PB14 periph A */ | ||
119 | 1 15 0x1 0x1>; /* PB15 periph with pullup */ | ||
120 | }; | ||
121 | }; | ||
110 | 122 | ||
111 | pioB: gpio@fffff600 { | 123 | usart0 { |
112 | compatible = "atmel,at91rm9200-gpio"; | 124 | pinctrl_usart0: usart0-0 { |
113 | reg = <0xfffff600 0x100>; | 125 | atmel,pins = |
114 | interrupts = <3 4 1>; | 126 | <1 4 0x1 0x0 /* PB4 periph A */ |
115 | #gpio-cells = <2>; | 127 | 1 5 0x1 0x0>; /* PB5 periph A */ |
116 | gpio-controller; | 128 | }; |
117 | interrupt-controller; | 129 | |
118 | #interrupt-cells = <2>; | 130 | pinctrl_usart0_rts: usart0_rts-0 { |
119 | }; | 131 | atmel,pins = |
132 | <1 26 0x1 0x0>; /* PB26 periph A */ | ||
133 | }; | ||
134 | |||
135 | pinctrl_usart0_cts: usart0_cts-0 { | ||
136 | atmel,pins = | ||
137 | <1 27 0x1 0x0>; /* PB27 periph A */ | ||
138 | }; | ||
139 | |||
140 | pinctrl_usart0_dtr_dsr: usart0_dtr_dsr-0 { | ||
141 | atmel,pins = | ||
142 | <1 24 0x1 0x0 /* PB24 periph A */ | ||
143 | 1 22 0x1 0x0>; /* PB22 periph A */ | ||
144 | }; | ||
145 | |||
146 | pinctrl_usart0_dcd: usart0_dcd-0 { | ||
147 | atmel,pins = | ||
148 | <1 23 0x1 0x0>; /* PB23 periph A */ | ||
149 | }; | ||
150 | |||
151 | pinctrl_usart0_ri: usart0_ri-0 { | ||
152 | atmel,pins = | ||
153 | <1 25 0x1 0x0>; /* PB25 periph A */ | ||
154 | }; | ||
155 | }; | ||
120 | 156 | ||
121 | pioC: gpio@fffff800 { | 157 | usart1 { |
122 | compatible = "atmel,at91rm9200-gpio"; | 158 | pinctrl_usart1: usart1-0 { |
123 | reg = <0xfffff800 0x100>; | 159 | atmel,pins = |
124 | interrupts = <4 4 1>; | 160 | <2 6 0x1 0x1 /* PB6 periph A with pullup */ |
125 | #gpio-cells = <2>; | 161 | 2 7 0x1 0x0>; /* PB7 periph A */ |
126 | gpio-controller; | 162 | }; |
127 | interrupt-controller; | 163 | |
128 | #interrupt-cells = <2>; | 164 | pinctrl_usart1_rts: usart1_rts-0 { |
165 | atmel,pins = | ||
166 | <1 28 0x1 0x0>; /* PB28 periph A */ | ||
167 | }; | ||
168 | |||
169 | pinctrl_usart1_cts: usart1_cts-0 { | ||
170 | atmel,pins = | ||
171 | <1 29 0x1 0x0>; /* PB29 periph A */ | ||
172 | }; | ||
173 | }; | ||
174 | |||
175 | usart2 { | ||
176 | pinctrl_usart2: usart2-0 { | ||
177 | atmel,pins = | ||
178 | <1 8 0x1 0x1 /* PB8 periph A with pullup */ | ||
179 | 1 9 0x1 0x0>; /* PB9 periph A */ | ||
180 | }; | ||
181 | |||
182 | pinctrl_usart2_rts: usart2_rts-0 { | ||
183 | atmel,pins = | ||
184 | <0 4 0x1 0x0>; /* PA4 periph A */ | ||
185 | }; | ||
186 | |||
187 | pinctrl_usart2_cts: usart2_cts-0 { | ||
188 | atmel,pins = | ||
189 | <0 5 0x1 0x0>; /* PA5 periph A */ | ||
190 | }; | ||
191 | }; | ||
192 | |||
193 | usart3 { | ||
194 | pinctrl_usart3: usart3-0 { | ||
195 | atmel,pins = | ||
196 | <2 10 0x1 0x1 /* PB10 periph A with pullup */ | ||
197 | 2 11 0x1 0x0>; /* PB11 periph A */ | ||
198 | }; | ||
199 | |||
200 | pinctrl_usart3_rts: usart3_rts-0 { | ||
201 | atmel,pins = | ||
202 | <3 8 0x2 0x0>; /* PB8 periph B */ | ||
203 | }; | ||
204 | |||
205 | pinctrl_usart3_cts: usart3_cts-0 { | ||
206 | atmel,pins = | ||
207 | <3 10 0x2 0x0>; /* PB10 periph B */ | ||
208 | }; | ||
209 | }; | ||
210 | |||
211 | uart0 { | ||
212 | pinctrl_uart0: uart0-0 { | ||
213 | atmel,pins = | ||
214 | <0 31 0x2 0x1 /* PA31 periph B with pullup */ | ||
215 | 0 30 0x2 0x0>; /* PA30 periph B */ | ||
216 | }; | ||
217 | }; | ||
218 | |||
219 | uart1 { | ||
220 | pinctrl_uart1: uart1-0 { | ||
221 | atmel,pins = | ||
222 | <2 12 0x1 0x1 /* PB12 periph A with pullup */ | ||
223 | 2 13 0x1 0x0>; /* PB13 periph A */ | ||
224 | }; | ||
225 | }; | ||
226 | |||
227 | nand { | ||
228 | pinctrl_nand: nand-0 { | ||
229 | atmel,pins = | ||
230 | <2 13 0x0 0x1 /* PC13 gpio RDY pin pull_up */ | ||
231 | 2 14 0x0 0x1>; /* PC14 gpio enable pin pull_up */ | ||
232 | }; | ||
233 | }; | ||
234 | |||
235 | macb { | ||
236 | pinctrl_macb_rmii: macb_rmii-0 { | ||
237 | atmel,pins = | ||
238 | <0 12 0x1 0x0 /* PA12 periph A */ | ||
239 | 0 13 0x1 0x0 /* PA13 periph A */ | ||
240 | 0 14 0x1 0x0 /* PA14 periph A */ | ||
241 | 0 15 0x1 0x0 /* PA15 periph A */ | ||
242 | 0 16 0x1 0x0 /* PA16 periph A */ | ||
243 | 0 17 0x1 0x0 /* PA17 periph A */ | ||
244 | 0 18 0x1 0x0 /* PA18 periph A */ | ||
245 | 0 19 0x1 0x0 /* PA19 periph A */ | ||
246 | 0 20 0x1 0x0 /* PA20 periph A */ | ||
247 | 0 21 0x1 0x0>; /* PA21 periph A */ | ||
248 | }; | ||
249 | |||
250 | pinctrl_macb_rmii_mii: macb_rmii_mii-0 { | ||
251 | atmel,pins = | ||
252 | <0 22 0x2 0x0 /* PA22 periph B */ | ||
253 | 0 23 0x2 0x0 /* PA23 periph B */ | ||
254 | 0 24 0x2 0x0 /* PA24 periph B */ | ||
255 | 0 25 0x2 0x0 /* PA25 periph B */ | ||
256 | 0 26 0x2 0x0 /* PA26 periph B */ | ||
257 | 0 27 0x2 0x0 /* PA27 periph B */ | ||
258 | 0 28 0x2 0x0 /* PA28 periph B */ | ||
259 | 0 29 0x2 0x0>; /* PA29 periph B */ | ||
260 | }; | ||
261 | |||
262 | pinctrl_macb_rmii_mii_alt: macb_rmii_mii-1 { | ||
263 | atmel,pins = | ||
264 | <0 10 0x2 0x0 /* PA10 periph B */ | ||
265 | 0 11 0x2 0x0 /* PA11 periph B */ | ||
266 | 0 24 0x2 0x0 /* PA24 periph B */ | ||
267 | 0 25 0x2 0x0 /* PA25 periph B */ | ||
268 | 0 26 0x2 0x0 /* PA26 periph B */ | ||
269 | 0 27 0x2 0x0 /* PA27 periph B */ | ||
270 | 0 28 0x2 0x0 /* PA28 periph B */ | ||
271 | 0 29 0x2 0x0>; /* PA29 periph B */ | ||
272 | }; | ||
273 | }; | ||
274 | |||
275 | mmc0 { | ||
276 | pinctrl_mmc0_clk: mmc0_clk-0 { | ||
277 | atmel,pins = | ||
278 | <0 8 0x1 0x0>; /* PA8 periph A */ | ||
279 | }; | ||
280 | |||
281 | pinctrl_mmc0_slot0_cmd_dat0: mmc0_slot0_cmd_dat0-0 { | ||
282 | atmel,pins = | ||
283 | <0 7 0x1 0x1 /* PA7 periph A with pullup */ | ||
284 | 0 6 0x1 0x1>; /* PA6 periph A with pullup */ | ||
285 | }; | ||
286 | |||
287 | pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { | ||
288 | atmel,pins = | ||
289 | <0 9 0x1 0x1 /* PA9 periph A with pullup */ | ||
290 | 0 10 0x1 0x1 /* PA10 periph A with pullup */ | ||
291 | 0 11 0x1 0x1>; /* PA11 periph A with pullup */ | ||
292 | }; | ||
293 | |||
294 | pinctrl_mmc0_slot1_cmd_dat0: mmc0_slot1_cmd_dat0-0 { | ||
295 | atmel,pins = | ||
296 | <0 1 0x2 0x1 /* PA1 periph B with pullup */ | ||
297 | 0 0 0x2 0x1>; /* PA0 periph B with pullup */ | ||
298 | }; | ||
299 | |||
300 | pinctrl_mmc0_slot1_dat1_3: mmc0_slot1_dat1_3-0 { | ||
301 | atmel,pins = | ||
302 | <0 5 0x2 0x1 /* PA5 periph B with pullup */ | ||
303 | 0 4 0x2 0x1 /* PA4 periph B with pullup */ | ||
304 | 0 3 0x2 0x1>; /* PA3 periph B with pullup */ | ||
305 | }; | ||
306 | }; | ||
307 | |||
308 | pioA: gpio@fffff400 { | ||
309 | compatible = "atmel,at91rm9200-gpio"; | ||
310 | reg = <0xfffff400 0x200>; | ||
311 | interrupts = <2 4 1>; | ||
312 | #gpio-cells = <2>; | ||
313 | gpio-controller; | ||
314 | interrupt-controller; | ||
315 | #interrupt-cells = <2>; | ||
316 | }; | ||
317 | |||
318 | pioB: gpio@fffff600 { | ||
319 | compatible = "atmel,at91rm9200-gpio"; | ||
320 | reg = <0xfffff600 0x200>; | ||
321 | interrupts = <3 4 1>; | ||
322 | #gpio-cells = <2>; | ||
323 | gpio-controller; | ||
324 | interrupt-controller; | ||
325 | #interrupt-cells = <2>; | ||
326 | }; | ||
327 | |||
328 | pioC: gpio@fffff800 { | ||
329 | compatible = "atmel,at91rm9200-gpio"; | ||
330 | reg = <0xfffff800 0x200>; | ||
331 | interrupts = <4 4 1>; | ||
332 | #gpio-cells = <2>; | ||
333 | gpio-controller; | ||
334 | interrupt-controller; | ||
335 | #interrupt-cells = <2>; | ||
336 | }; | ||
129 | }; | 337 | }; |
130 | 338 | ||
131 | dbgu: serial@fffff200 { | 339 | dbgu: serial@fffff200 { |
132 | compatible = "atmel,at91sam9260-usart"; | 340 | compatible = "atmel,at91sam9260-usart"; |
133 | reg = <0xfffff200 0x200>; | 341 | reg = <0xfffff200 0x200>; |
134 | interrupts = <1 4 7>; | 342 | interrupts = <1 4 7>; |
343 | pinctrl-names = "default"; | ||
344 | pinctrl-0 = <&pinctrl_dbgu>; | ||
135 | status = "disabled"; | 345 | status = "disabled"; |
136 | }; | 346 | }; |
137 | 347 | ||
@@ -141,6 +351,8 @@ | |||
141 | interrupts = <6 4 5>; | 351 | interrupts = <6 4 5>; |
142 | atmel,use-dma-rx; | 352 | atmel,use-dma-rx; |
143 | atmel,use-dma-tx; | 353 | atmel,use-dma-tx; |
354 | pinctrl-names = "default"; | ||
355 | pinctrl-0 = <&pinctrl_usart0>; | ||
144 | status = "disabled"; | 356 | status = "disabled"; |
145 | }; | 357 | }; |
146 | 358 | ||
@@ -150,6 +362,8 @@ | |||
150 | interrupts = <7 4 5>; | 362 | interrupts = <7 4 5>; |
151 | atmel,use-dma-rx; | 363 | atmel,use-dma-rx; |
152 | atmel,use-dma-tx; | 364 | atmel,use-dma-tx; |
365 | pinctrl-names = "default"; | ||
366 | pinctrl-0 = <&pinctrl_usart1>; | ||
153 | status = "disabled"; | 367 | status = "disabled"; |
154 | }; | 368 | }; |
155 | 369 | ||
@@ -159,6 +373,8 @@ | |||
159 | interrupts = <8 4 5>; | 373 | interrupts = <8 4 5>; |
160 | atmel,use-dma-rx; | 374 | atmel,use-dma-rx; |
161 | atmel,use-dma-tx; | 375 | atmel,use-dma-tx; |
376 | pinctrl-names = "default"; | ||
377 | pinctrl-0 = <&pinctrl_usart2>; | ||
162 | status = "disabled"; | 378 | status = "disabled"; |
163 | }; | 379 | }; |
164 | 380 | ||
@@ -168,24 +384,30 @@ | |||
168 | interrupts = <23 4 5>; | 384 | interrupts = <23 4 5>; |
169 | atmel,use-dma-rx; | 385 | atmel,use-dma-rx; |
170 | atmel,use-dma-tx; | 386 | atmel,use-dma-tx; |
387 | pinctrl-names = "default"; | ||
388 | pinctrl-0 = <&pinctrl_usart3>; | ||
171 | status = "disabled"; | 389 | status = "disabled"; |
172 | }; | 390 | }; |
173 | 391 | ||
174 | usart4: serial@fffd4000 { | 392 | uart0: serial@fffd4000 { |
175 | compatible = "atmel,at91sam9260-usart"; | 393 | compatible = "atmel,at91sam9260-usart"; |
176 | reg = <0xfffd4000 0x200>; | 394 | reg = <0xfffd4000 0x200>; |
177 | interrupts = <24 4 5>; | 395 | interrupts = <24 4 5>; |
178 | atmel,use-dma-rx; | 396 | atmel,use-dma-rx; |
179 | atmel,use-dma-tx; | 397 | atmel,use-dma-tx; |
398 | pinctrl-names = "default"; | ||
399 | pinctrl-0 = <&pinctrl_uart0>; | ||
180 | status = "disabled"; | 400 | status = "disabled"; |
181 | }; | 401 | }; |
182 | 402 | ||
183 | usart5: serial@fffd8000 { | 403 | uart1: serial@fffd8000 { |
184 | compatible = "atmel,at91sam9260-usart"; | 404 | compatible = "atmel,at91sam9260-usart"; |
185 | reg = <0xfffd8000 0x200>; | 405 | reg = <0xfffd8000 0x200>; |
186 | interrupts = <25 4 5>; | 406 | interrupts = <25 4 5>; |
187 | atmel,use-dma-rx; | 407 | atmel,use-dma-rx; |
188 | atmel,use-dma-tx; | 408 | atmel,use-dma-tx; |
409 | pinctrl-names = "default"; | ||
410 | pinctrl-0 = <&pinctrl_uart1>; | ||
189 | status = "disabled"; | 411 | status = "disabled"; |
190 | }; | 412 | }; |
191 | 413 | ||
@@ -193,6 +415,8 @@ | |||
193 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; | 415 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; |
194 | reg = <0xfffc4000 0x100>; | 416 | reg = <0xfffc4000 0x100>; |
195 | interrupts = <21 4 3>; | 417 | interrupts = <21 4 3>; |
418 | pinctrl-names = "default"; | ||
419 | pinctrl-0 = <&pinctrl_macb_rmii>; | ||
196 | status = "disabled"; | 420 | status = "disabled"; |
197 | }; | 421 | }; |
198 | 422 | ||
@@ -212,6 +436,15 @@ | |||
212 | status = "disabled"; | 436 | status = "disabled"; |
213 | }; | 437 | }; |
214 | 438 | ||
439 | mmc0: mmc@fffa8000 { | ||
440 | compatible = "atmel,hsmci"; | ||
441 | reg = <0xfffa8000 0x600>; | ||
442 | interrupts = <9 4 0>; | ||
443 | #address-cells = <1>; | ||
444 | #size-cells = <0>; | ||
445 | status = "disabled"; | ||
446 | }; | ||
447 | |||
215 | adc0: adc@fffe0000 { | 448 | adc0: adc@fffe0000 { |
216 | compatible = "atmel,at91sam9260-adc"; | 449 | compatible = "atmel,at91sam9260-adc"; |
217 | reg = <0xfffe0000 0x100>; | 450 | reg = <0xfffe0000 0x100>; |
@@ -257,6 +490,8 @@ | |||
257 | >; | 490 | >; |
258 | atmel,nand-addr-offset = <21>; | 491 | atmel,nand-addr-offset = <21>; |
259 | atmel,nand-cmd-offset = <22>; | 492 | atmel,nand-cmd-offset = <22>; |
493 | pinctrl-names = "default"; | ||
494 | pinctrl-0 = <&pinctrl_nand>; | ||
260 | gpios = <&pioC 13 0 | 495 | gpios = <&pioC 13 0 |
261 | &pioC 14 0 | 496 | &pioC 14 0 |
262 | 0 | 497 | 0 |
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 3e6e5c1abbf3..66106eecf1ed 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
@@ -89,60 +89,243 @@ | |||
89 | reg = <0xfffffd10 0x10>; | 89 | reg = <0xfffffd10 0x10>; |
90 | }; | 90 | }; |
91 | 91 | ||
92 | pioA: gpio@fffff200 { | 92 | pinctrl@fffff200 { |
93 | compatible = "atmel,at91rm9200-gpio"; | 93 | #address-cells = <1>; |
94 | reg = <0xfffff200 0x100>; | 94 | #size-cells = <1>; |
95 | interrupts = <2 4 1>; | 95 | compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; |
96 | #gpio-cells = <2>; | 96 | ranges = <0xfffff200 0xfffff200 0xa00>; |
97 | gpio-controller; | ||
98 | interrupt-controller; | ||
99 | #interrupt-cells = <2>; | ||
100 | }; | ||
101 | 97 | ||
102 | pioB: gpio@fffff400 { | 98 | atmel,mux-mask = < |
103 | compatible = "atmel,at91rm9200-gpio"; | 99 | /* A B */ |
104 | reg = <0xfffff400 0x100>; | 100 | 0xfffffffb 0xffffe07f /* pioA */ |
105 | interrupts = <3 4 1>; | 101 | 0x0007ffff 0x39072fff /* pioB */ |
106 | #gpio-cells = <2>; | 102 | 0xffffffff 0x3ffffff8 /* pioC */ |
107 | gpio-controller; | 103 | 0xfffffbff 0xffffffff /* pioD */ |
108 | interrupt-controller; | 104 | 0xffe00fff 0xfbfcff00 /* pioE */ |
109 | #interrupt-cells = <2>; | 105 | >; |
110 | }; | ||
111 | 106 | ||
112 | pioC: gpio@fffff600 { | 107 | /* shared pinctrl settings */ |
113 | compatible = "atmel,at91rm9200-gpio"; | 108 | dbgu { |
114 | reg = <0xfffff600 0x100>; | 109 | pinctrl_dbgu: dbgu-0 { |
115 | interrupts = <4 4 1>; | 110 | atmel,pins = |
116 | #gpio-cells = <2>; | 111 | <2 30 0x1 0x0 /* PC30 periph A */ |
117 | gpio-controller; | 112 | 2 31 0x1 0x1>; /* PC31 periph with pullup */ |
118 | interrupt-controller; | 113 | }; |
119 | #interrupt-cells = <2>; | 114 | }; |
120 | }; | ||
121 | 115 | ||
122 | pioD: gpio@fffff800 { | 116 | usart0 { |
123 | compatible = "atmel,at91rm9200-gpio"; | 117 | pinctrl_usart0: usart0-0 { |
124 | reg = <0xfffff800 0x100>; | 118 | atmel,pins = |
125 | interrupts = <4 4 1>; | 119 | <0 26 0x1 0x1 /* PA26 periph A with pullup */ |
126 | #gpio-cells = <2>; | 120 | 0 27 0x1 0x0>; /* PA27 periph A */ |
127 | gpio-controller; | 121 | }; |
128 | interrupt-controller; | ||
129 | #interrupt-cells = <2>; | ||
130 | }; | ||
131 | 122 | ||
132 | pioE: gpio@fffffa00 { | 123 | pinctrl_usart0_rts: usart0_rts-0 { |
133 | compatible = "atmel,at91rm9200-gpio"; | 124 | atmel,pins = |
134 | reg = <0xfffffa00 0x100>; | 125 | <0 28 0x1 0x0>; /* PA28 periph A */ |
135 | interrupts = <4 4 1>; | 126 | }; |
136 | #gpio-cells = <2>; | 127 | |
137 | gpio-controller; | 128 | pinctrl_usart0_cts: usart0_cts-0 { |
138 | interrupt-controller; | 129 | atmel,pins = |
139 | #interrupt-cells = <2>; | 130 | <0 29 0x1 0x0>; /* PA29 periph A */ |
131 | }; | ||
132 | }; | ||
133 | |||
134 | usart1 { | ||
135 | pinctrl_usart1: usart1-0 { | ||
136 | atmel,pins = | ||
137 | <3 0 0x1 0x1 /* PD0 periph A with pullup */ | ||
138 | 3 1 0x1 0x0>; /* PD1 periph A */ | ||
139 | }; | ||
140 | |||
141 | pinctrl_usart1_rts: usart1_rts-0 { | ||
142 | atmel,pins = | ||
143 | <3 7 0x2 0x0>; /* PD7 periph B */ | ||
144 | }; | ||
145 | |||
146 | pinctrl_usart1_cts: usart1_cts-0 { | ||
147 | atmel,pins = | ||
148 | <3 8 0x2 0x0>; /* PD8 periph B */ | ||
149 | }; | ||
150 | }; | ||
151 | |||
152 | usart2 { | ||
153 | pinctrl_usart2: usart2-0 { | ||
154 | atmel,pins = | ||
155 | <3 2 0x1 0x1 /* PD2 periph A with pullup */ | ||
156 | 3 3 0x1 0x0>; /* PD3 periph A */ | ||
157 | }; | ||
158 | |||
159 | pinctrl_usart2_rts: usart2_rts-0 { | ||
160 | atmel,pins = | ||
161 | <3 5 0x2 0x0>; /* PD5 periph B */ | ||
162 | }; | ||
163 | |||
164 | pinctrl_usart2_cts: usart2_cts-0 { | ||
165 | atmel,pins = | ||
166 | <4 6 0x2 0x0>; /* PD6 periph B */ | ||
167 | }; | ||
168 | }; | ||
169 | |||
170 | nand { | ||
171 | pinctrl_nand: nand-0 { | ||
172 | atmel,pins = | ||
173 | <0 22 0x0 0x1 /* PA22 gpio RDY pin pull_up*/ | ||
174 | 3 15 0x0 0x1>; /* PD15 gpio enable pin pull_up */ | ||
175 | }; | ||
176 | }; | ||
177 | |||
178 | macb { | ||
179 | pinctrl_macb_rmii: macb_rmii-0 { | ||
180 | atmel,pins = | ||
181 | <2 25 0x2 0x0 /* PC25 periph B */ | ||
182 | 4 21 0x1 0x0 /* PE21 periph A */ | ||
183 | 4 23 0x1 0x0 /* PE23 periph A */ | ||
184 | 4 24 0x1 0x0 /* PE24 periph A */ | ||
185 | 4 25 0x1 0x0 /* PE25 periph A */ | ||
186 | 4 26 0x1 0x0 /* PE26 periph A */ | ||
187 | 4 27 0x1 0x0 /* PE27 periph A */ | ||
188 | 4 28 0x1 0x0 /* PE28 periph A */ | ||
189 | 4 29 0x1 0x0 /* PE29 periph A */ | ||
190 | 4 30 0x1 0x0>; /* PE30 periph A */ | ||
191 | }; | ||
192 | |||
193 | pinctrl_macb_rmii_mii: macb_rmii_mii-0 { | ||
194 | atmel,pins = | ||
195 | <2 20 0x2 0x0 /* PC20 periph B */ | ||
196 | 2 21 0x2 0x0 /* PC21 periph B */ | ||
197 | 2 22 0x2 0x0 /* PC22 periph B */ | ||
198 | 2 23 0x2 0x0 /* PC23 periph B */ | ||
199 | 2 24 0x2 0x0 /* PC24 periph B */ | ||
200 | 2 25 0x2 0x0 /* PC25 periph B */ | ||
201 | 2 27 0x2 0x0 /* PC27 periph B */ | ||
202 | 4 22 0x2 0x0>; /* PE22 periph B */ | ||
203 | }; | ||
204 | }; | ||
205 | |||
206 | mmc0 { | ||
207 | pinctrl_mmc0_clk: mmc0_clk-0 { | ||
208 | atmel,pins = | ||
209 | <0 12 0x1 0x0>; /* PA12 periph A */ | ||
210 | }; | ||
211 | |||
212 | pinctrl_mmc0_slot0_cmd_dat0: mmc0_slot0_cmd_dat0-0 { | ||
213 | atmel,pins = | ||
214 | <0 1 0x1 0x1 /* PA1 periph A with pullup */ | ||
215 | 0 0 0x1 0x1>; /* PA0 periph A with pullup */ | ||
216 | }; | ||
217 | |||
218 | pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { | ||
219 | atmel,pins = | ||
220 | <0 3 0x1 0x1 /* PA3 periph A with pullup */ | ||
221 | 0 4 0x1 0x1 /* PA4 periph A with pullup */ | ||
222 | 0 5 0x1 0x1>; /* PA5 periph A with pullup */ | ||
223 | }; | ||
224 | |||
225 | pinctrl_mmc0_slot1_cmd_dat0: mmc0_slot1_cmd_dat0-0 { | ||
226 | atmel,pins = | ||
227 | <0 16 0x1 0x1 /* PA16 periph A with pullup */ | ||
228 | 0 17 0x1 0x1>; /* PA17 periph A with pullup */ | ||
229 | }; | ||
230 | |||
231 | pinctrl_mmc0_slot1_dat1_3: mmc0_slot1_dat1_3-0 { | ||
232 | atmel,pins = | ||
233 | <0 18 0x1 0x1 /* PA18 periph A with pullup */ | ||
234 | 0 19 0x1 0x1 /* PA19 periph A with pullup */ | ||
235 | 0 20 0x1 0x1>; /* PA20 periph A with pullup */ | ||
236 | }; | ||
237 | }; | ||
238 | |||
239 | mmc1 { | ||
240 | pinctrl_mmc1_clk: mmc1_clk-0 { | ||
241 | atmel,pins = | ||
242 | <0 6 0x1 0x0>; /* PA6 periph A */ | ||
243 | }; | ||
244 | |||
245 | pinctrl_mmc1_slot0_cmd_dat0: mmc1_slot0_cmd_dat0-0 { | ||
246 | atmel,pins = | ||
247 | <0 7 0x1 0x1 /* PA7 periph A with pullup */ | ||
248 | 0 8 0x1 0x1>; /* PA8 periph A with pullup */ | ||
249 | }; | ||
250 | |||
251 | pinctrl_mmc1_slot0_dat1_3: mmc1_slot0_dat1_3-0 { | ||
252 | atmel,pins = | ||
253 | <0 9 0x1 0x1 /* PA9 periph A with pullup */ | ||
254 | 0 10 0x1 0x1 /* PA10 periph A with pullup */ | ||
255 | 0 11 0x1 0x1>; /* PA11 periph A with pullup */ | ||
256 | }; | ||
257 | |||
258 | pinctrl_mmc1_slot1_cmd_dat0: mmc1_slot1_cmd_dat0-0 { | ||
259 | atmel,pins = | ||
260 | <0 21 0x1 0x1 /* PA21 periph A with pullup */ | ||
261 | 0 22 0x1 0x1>; /* PA22 periph A with pullup */ | ||
262 | }; | ||
263 | |||
264 | pinctrl_mmc1_slot1_dat1_3: mmc1_slot1_dat1_3-0 { | ||
265 | atmel,pins = | ||
266 | <0 23 0x1 0x1 /* PA23 periph A with pullup */ | ||
267 | 0 24 0x1 0x1 /* PA24 periph A with pullup */ | ||
268 | 0 25 0x1 0x1>; /* PA25 periph A with pullup */ | ||
269 | }; | ||
270 | }; | ||
271 | |||
272 | pioA: gpio@fffff200 { | ||
273 | compatible = "atmel,at91rm9200-gpio"; | ||
274 | reg = <0xfffff200 0x200>; | ||
275 | interrupts = <2 4 1>; | ||
276 | #gpio-cells = <2>; | ||
277 | gpio-controller; | ||
278 | interrupt-controller; | ||
279 | #interrupt-cells = <2>; | ||
280 | }; | ||
281 | |||
282 | pioB: gpio@fffff400 { | ||
283 | compatible = "atmel,at91rm9200-gpio"; | ||
284 | reg = <0xfffff400 0x200>; | ||
285 | interrupts = <3 4 1>; | ||
286 | #gpio-cells = <2>; | ||
287 | gpio-controller; | ||
288 | interrupt-controller; | ||
289 | #interrupt-cells = <2>; | ||
290 | }; | ||
291 | |||
292 | pioC: gpio@fffff600 { | ||
293 | compatible = "atmel,at91rm9200-gpio"; | ||
294 | reg = <0xfffff600 0x200>; | ||
295 | interrupts = <4 4 1>; | ||
296 | #gpio-cells = <2>; | ||
297 | gpio-controller; | ||
298 | interrupt-controller; | ||
299 | #interrupt-cells = <2>; | ||
300 | }; | ||
301 | |||
302 | pioD: gpio@fffff800 { | ||
303 | compatible = "atmel,at91rm9200-gpio"; | ||
304 | reg = <0xfffff800 0x200>; | ||
305 | interrupts = <4 4 1>; | ||
306 | #gpio-cells = <2>; | ||
307 | gpio-controller; | ||
308 | interrupt-controller; | ||
309 | #interrupt-cells = <2>; | ||
310 | }; | ||
311 | |||
312 | pioE: gpio@fffffa00 { | ||
313 | compatible = "atmel,at91rm9200-gpio"; | ||
314 | reg = <0xfffffa00 0x200>; | ||
315 | interrupts = <4 4 1>; | ||
316 | #gpio-cells = <2>; | ||
317 | gpio-controller; | ||
318 | interrupt-controller; | ||
319 | #interrupt-cells = <2>; | ||
320 | }; | ||
140 | }; | 321 | }; |
141 | 322 | ||
142 | dbgu: serial@ffffee00 { | 323 | dbgu: serial@ffffee00 { |
143 | compatible = "atmel,at91sam9260-usart"; | 324 | compatible = "atmel,at91sam9260-usart"; |
144 | reg = <0xffffee00 0x200>; | 325 | reg = <0xffffee00 0x200>; |
145 | interrupts = <1 4 7>; | 326 | interrupts = <1 4 7>; |
327 | pinctrl-names = "default"; | ||
328 | pinctrl-0 = <&pinctrl_dbgu>; | ||
146 | status = "disabled"; | 329 | status = "disabled"; |
147 | }; | 330 | }; |
148 | 331 | ||
@@ -152,6 +335,8 @@ | |||
152 | interrupts = <7 4 5>; | 335 | interrupts = <7 4 5>; |
153 | atmel,use-dma-rx; | 336 | atmel,use-dma-rx; |
154 | atmel,use-dma-tx; | 337 | atmel,use-dma-tx; |
338 | pinctrl-names = "default"; | ||
339 | pinctrl-0 = <&pinctrl_usart0>; | ||
155 | status = "disabled"; | 340 | status = "disabled"; |
156 | }; | 341 | }; |
157 | 342 | ||
@@ -161,6 +346,8 @@ | |||
161 | interrupts = <8 4 5>; | 346 | interrupts = <8 4 5>; |
162 | atmel,use-dma-rx; | 347 | atmel,use-dma-rx; |
163 | atmel,use-dma-tx; | 348 | atmel,use-dma-tx; |
349 | pinctrl-names = "default"; | ||
350 | pinctrl-0 = <&pinctrl_usart1>; | ||
164 | status = "disabled"; | 351 | status = "disabled"; |
165 | }; | 352 | }; |
166 | 353 | ||
@@ -170,6 +357,8 @@ | |||
170 | interrupts = <9 4 5>; | 357 | interrupts = <9 4 5>; |
171 | atmel,use-dma-rx; | 358 | atmel,use-dma-rx; |
172 | atmel,use-dma-tx; | 359 | atmel,use-dma-tx; |
360 | pinctrl-names = "default"; | ||
361 | pinctrl-0 = <&pinctrl_usart2>; | ||
173 | status = "disabled"; | 362 | status = "disabled"; |
174 | }; | 363 | }; |
175 | 364 | ||
@@ -177,6 +366,8 @@ | |||
177 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; | 366 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; |
178 | reg = <0xfffbc000 0x100>; | 367 | reg = <0xfffbc000 0x100>; |
179 | interrupts = <21 4 3>; | 368 | interrupts = <21 4 3>; |
369 | pinctrl-names = "default"; | ||
370 | pinctrl-0 = <&pinctrl_macb_rmii>; | ||
180 | status = "disabled"; | 371 | status = "disabled"; |
181 | }; | 372 | }; |
182 | 373 | ||
@@ -195,6 +386,24 @@ | |||
195 | #size-cells = <0>; | 386 | #size-cells = <0>; |
196 | status = "disabled"; | 387 | status = "disabled"; |
197 | }; | 388 | }; |
389 | |||
390 | mmc0: mmc@fff80000 { | ||
391 | compatible = "atmel,hsmci"; | ||
392 | reg = <0xfff80000 0x600>; | ||
393 | interrupts = <10 4 0>; | ||
394 | #address-cells = <1>; | ||
395 | #size-cells = <0>; | ||
396 | status = "disabled"; | ||
397 | }; | ||
398 | |||
399 | mmc1: mmc@fff84000 { | ||
400 | compatible = "atmel,hsmci"; | ||
401 | reg = <0xfff84000 0x600>; | ||
402 | interrupts = <11 4 0>; | ||
403 | #address-cells = <1>; | ||
404 | #size-cells = <0>; | ||
405 | status = "disabled"; | ||
406 | }; | ||
198 | }; | 407 | }; |
199 | 408 | ||
200 | nand0: nand@40000000 { | 409 | nand0: nand@40000000 { |
@@ -206,6 +415,8 @@ | |||
206 | >; | 415 | >; |
207 | atmel,nand-addr-offset = <21>; | 416 | atmel,nand-addr-offset = <21>; |
208 | atmel,nand-cmd-offset = <22>; | 417 | atmel,nand-cmd-offset = <22>; |
418 | pinctrl-names = "default"; | ||
419 | pinctrl-0 = <&pinctrl_nand>; | ||
209 | gpios = <&pioA 22 0 | 420 | gpios = <&pioA 22 0 |
210 | &pioD 15 0 | 421 | &pioD 15 0 |
211 | 0 | 422 | 0 |
diff --git a/arch/arm/boot/dts/at91sam9263ek.dts b/arch/arm/boot/dts/at91sam9263ek.dts index f86ac4b609fc..1eb08728f527 100644 --- a/arch/arm/boot/dts/at91sam9263ek.dts +++ b/arch/arm/boot/dts/at91sam9263ek.dts | |||
@@ -38,6 +38,10 @@ | |||
38 | }; | 38 | }; |
39 | 39 | ||
40 | usart0: serial@fff8c000 { | 40 | usart0: serial@fff8c000 { |
41 | pinctrl-0 = < | ||
42 | &pinctrl_usart0 | ||
43 | &pinctrl_usart0_rts | ||
44 | &pinctrl_usart0_cts>; | ||
41 | status = "okay"; | 45 | status = "okay"; |
42 | }; | 46 | }; |
43 | 47 | ||
@@ -50,6 +54,31 @@ | |||
50 | atmel,vbus-gpio = <&pioA 25 0>; | 54 | atmel,vbus-gpio = <&pioA 25 0>; |
51 | status = "okay"; | 55 | status = "okay"; |
52 | }; | 56 | }; |
57 | |||
58 | mmc0: mmc@fff80000 { | ||
59 | pinctrl-0 = < | ||
60 | &pinctrl_board_mmc0 | ||
61 | &pinctrl_mmc0_clk | ||
62 | &pinctrl_mmc0_slot0_cmd_dat0 | ||
63 | &pinctrl_mmc0_slot0_dat1_3>; | ||
64 | status = "okay"; | ||
65 | slot@0 { | ||
66 | reg = <0>; | ||
67 | bus-width = <4>; | ||
68 | cd-gpios = <&pioE 18 0>; | ||
69 | wp-gpios = <&pioE 19 0>; | ||
70 | }; | ||
71 | }; | ||
72 | |||
73 | pinctrl@fffff200 { | ||
74 | mmc0 { | ||
75 | pinctrl_board_mmc0: mmc0-board { | ||
76 | atmel,pins = | ||
77 | <5 18 0x0 0x5 /* PE18 gpio CD pin pull up and deglitch */ | ||
78 | 5 19 0x0 0x1>; /* PE19 gpio WP pin pull up */ | ||
79 | }; | ||
80 | }; | ||
81 | }; | ||
53 | }; | 82 | }; |
54 | 83 | ||
55 | nand0: nand@40000000 { | 84 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9g15.dtsi b/arch/arm/boot/dts/at91sam9g15.dtsi new file mode 100644 index 000000000000..fbe7a7089c2a --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g15.dtsi | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * at91sam9g15.dtsi - Device Tree Include file for AT91SAM9G15 SoC | ||
3 | * | ||
4 | * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Licensed under GPLv2. | ||
7 | */ | ||
8 | |||
9 | /include/ "at91sam9x5.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Atmel AT91SAM9G15 SoC"; | ||
13 | compatible = "atmel, at91sam9g15, atmel,at91sam9x5"; | ||
14 | |||
15 | ahb { | ||
16 | apb { | ||
17 | pinctrl@fffff400 { | ||
18 | atmel,mux-mask = < | ||
19 | /* A B C */ | ||
20 | 0xffffffff 0xffe0399f 0x00000000 /* pioA */ | ||
21 | 0x00040000 0x00047e3f 0x00000000 /* pioB */ | ||
22 | 0xfdffffff 0x00000000 0xb83fffff /* pioC */ | ||
23 | 0x003fffff 0x003f8000 0x00000000 /* pioD */ | ||
24 | >; | ||
25 | }; | ||
26 | }; | ||
27 | }; | ||
28 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9g15ek.dts b/arch/arm/boot/dts/at91sam9g15ek.dts new file mode 100644 index 000000000000..86dd3f6d938f --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g15ek.dts | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * at91sam9g15ek.dts - Device Tree file for AT91SAM9G15-EK board | ||
3 | * | ||
4 | * Copyright (C) 2012 Atmel, | ||
5 | * 2012 Nicolas Ferre <nicolas.ferre@atmel.com> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later. | ||
8 | */ | ||
9 | /dts-v1/; | ||
10 | /include/ "at91sam9g15.dtsi" | ||
11 | /include/ "at91sam9x5ek.dtsi" | ||
12 | |||
13 | / { | ||
14 | model = "Atmel AT91SAM9G25-EK"; | ||
15 | compatible = "atmel,at91sam9g15ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | ||
16 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts b/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts index f1b2e148ac8c..66467b113126 100644 --- a/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts +++ b/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts | |||
@@ -12,6 +12,32 @@ | |||
12 | model = "Atmel at91sam9g20ek 2 mmc"; | 12 | model = "Atmel at91sam9g20ek 2 mmc"; |
13 | compatible = "atmel,at91sam9g20ek_2mmc", "atmel,at91sam9g20", "atmel,at91sam9"; | 13 | compatible = "atmel,at91sam9g20ek_2mmc", "atmel,at91sam9g20", "atmel,at91sam9"; |
14 | 14 | ||
15 | ahb { | ||
16 | apb{ | ||
17 | mmc0: mmc@fffa8000 { | ||
18 | /* clk already mux wuth slot0 */ | ||
19 | pinctrl-0 = < | ||
20 | &pinctrl_board_mmc0_slot0 | ||
21 | &pinctrl_mmc0_slot0_cmd_dat0 | ||
22 | &pinctrl_mmc0_slot0_dat1_3>; | ||
23 | slot@0 { | ||
24 | reg = <0>; | ||
25 | bus-width = <4>; | ||
26 | cd-gpios = <&pioC 2 0>; | ||
27 | }; | ||
28 | }; | ||
29 | |||
30 | pinctrl@fffff400 { | ||
31 | mmc0_slot0 { | ||
32 | pinctrl_board_mmc0_slot0: mmc0_slot0-board { | ||
33 | atmel,pins = | ||
34 | <2 2 0x0 0x5>; /* PC2 gpio CD pin pull up and deglitch */ | ||
35 | }; | ||
36 | }; | ||
37 | }; | ||
38 | }; | ||
39 | }; | ||
40 | |||
15 | leds { | 41 | leds { |
16 | compatible = "gpio-leds"; | 42 | compatible = "gpio-leds"; |
17 | 43 | ||
diff --git a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi index e6391a4e6649..32a500a0e481 100644 --- a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi +++ b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi | |||
@@ -35,6 +35,13 @@ | |||
35 | }; | 35 | }; |
36 | 36 | ||
37 | usart0: serial@fffb0000 { | 37 | usart0: serial@fffb0000 { |
38 | pinctrl-0 = | ||
39 | <&pinctrl_usart0 | ||
40 | &pinctrl_usart0_rts | ||
41 | &pinctrl_usart0_cts | ||
42 | &pinctrl_usart0_dtr_dsr | ||
43 | &pinctrl_usart0_dcd | ||
44 | &pinctrl_usart0_ri>; | ||
38 | status = "okay"; | 45 | status = "okay"; |
39 | }; | 46 | }; |
40 | 47 | ||
@@ -51,6 +58,29 @@ | |||
51 | atmel,vbus-gpio = <&pioC 5 0>; | 58 | atmel,vbus-gpio = <&pioC 5 0>; |
52 | status = "okay"; | 59 | status = "okay"; |
53 | }; | 60 | }; |
61 | |||
62 | mmc0: mmc@fffa8000 { | ||
63 | pinctrl-0 = < | ||
64 | &pinctrl_board_mmc0_slot1 | ||
65 | &pinctrl_mmc0_clk | ||
66 | &pinctrl_mmc0_slot1_cmd_dat0 | ||
67 | &pinctrl_mmc0_slot1_dat1_3>; | ||
68 | status = "okay"; | ||
69 | slot@1 { | ||
70 | reg = <1>; | ||
71 | bus-width = <4>; | ||
72 | cd-gpios = <&pioC 9 0>; | ||
73 | }; | ||
74 | }; | ||
75 | |||
76 | pinctrl@fffff400 { | ||
77 | mmc0_slot1 { | ||
78 | pinctrl_board_mmc0_slot1: mmc0_slot1-board { | ||
79 | atmel,pins = | ||
80 | <2 9 0x0 0x5>; /* PC9 gpio CD pin pull up and deglitch */ | ||
81 | }; | ||
82 | }; | ||
83 | }; | ||
54 | }; | 84 | }; |
55 | 85 | ||
56 | nand0: nand@40000000 { | 86 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9g25.dtsi b/arch/arm/boot/dts/at91sam9g25.dtsi new file mode 100644 index 000000000000..05a718fb83c4 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g25.dtsi | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * at91sam9g25.dtsi - Device Tree Include file for AT91SAM9G25 SoC | ||
3 | * | ||
4 | * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Licensed under GPLv2. | ||
7 | */ | ||
8 | |||
9 | /include/ "at91sam9x5.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Atmel AT91SAM9G25 SoC"; | ||
13 | compatible = "atmel, at91sam9g25, atmel,at91sam9x5"; | ||
14 | |||
15 | ahb { | ||
16 | apb { | ||
17 | pinctrl@fffff400 { | ||
18 | atmel,mux-mask = < | ||
19 | /* A B C */ | ||
20 | 0xffffffff 0xffe0399f 0xc000001c /* pioA */ | ||
21 | 0x0007ffff 0x8000fe3f 0x00000000 /* pioB */ | ||
22 | 0x80000000 0x07c0ffff 0xb83fffff /* pioC */ | ||
23 | 0x003fffff 0x003f8000 0x00000000 /* pioD */ | ||
24 | >; | ||
25 | }; | ||
26 | }; | ||
27 | }; | ||
28 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts index 877c08f06763..c5ab16fba059 100644 --- a/arch/arm/boot/dts/at91sam9g25ek.dts +++ b/arch/arm/boot/dts/at91sam9g25ek.dts | |||
@@ -7,55 +7,10 @@ | |||
7 | * Licensed under GPLv2 or later. | 7 | * Licensed under GPLv2 or later. |
8 | */ | 8 | */ |
9 | /dts-v1/; | 9 | /dts-v1/; |
10 | /include/ "at91sam9x5.dtsi" | 10 | /include/ "at91sam9g25.dtsi" |
11 | /include/ "at91sam9x5cm.dtsi" | 11 | /include/ "at91sam9x5ek.dtsi" |
12 | 12 | ||
13 | / { | 13 | / { |
14 | model = "Atmel AT91SAM9G25-EK"; | 14 | model = "Atmel AT91SAM9G25-EK"; |
15 | compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | 15 | compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; |
16 | |||
17 | chosen { | ||
18 | bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; | ||
19 | }; | ||
20 | |||
21 | ahb { | ||
22 | apb { | ||
23 | dbgu: serial@fffff200 { | ||
24 | status = "okay"; | ||
25 | }; | ||
26 | |||
27 | usart0: serial@f801c000 { | ||
28 | status = "okay"; | ||
29 | }; | ||
30 | |||
31 | macb0: ethernet@f802c000 { | ||
32 | phy-mode = "rmii"; | ||
33 | status = "okay"; | ||
34 | }; | ||
35 | |||
36 | i2c0: i2c@f8010000 { | ||
37 | status = "okay"; | ||
38 | }; | ||
39 | |||
40 | i2c1: i2c@f8014000 { | ||
41 | status = "okay"; | ||
42 | }; | ||
43 | |||
44 | i2c2: i2c@f8018000 { | ||
45 | status = "okay"; | ||
46 | }; | ||
47 | }; | ||
48 | |||
49 | usb0: ohci@00600000 { | ||
50 | status = "okay"; | ||
51 | num-ports = <2>; | ||
52 | atmel,vbus-gpio = <&pioD 19 1 | ||
53 | &pioD 20 1 | ||
54 | >; | ||
55 | }; | ||
56 | |||
57 | usb1: ehci@00700000 { | ||
58 | status = "okay"; | ||
59 | }; | ||
60 | }; | ||
61 | }; | 16 | }; |
diff --git a/arch/arm/boot/dts/at91sam9g35.dtsi b/arch/arm/boot/dts/at91sam9g35.dtsi new file mode 100644 index 000000000000..f9d14a722794 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g35.dtsi | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * at91sam9g35.dtsi - Device Tree Include file for AT91SAM9G35 SoC | ||
3 | * | ||
4 | * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Licensed under GPLv2. | ||
7 | */ | ||
8 | |||
9 | /include/ "at91sam9x5.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Atmel AT91SAM9G35 SoC"; | ||
13 | compatible = "atmel, at91sam9g35, atmel,at91sam9x5"; | ||
14 | |||
15 | ahb { | ||
16 | apb { | ||
17 | pinctrl@fffff400 { | ||
18 | atmel,mux-mask = < | ||
19 | /* A B C */ | ||
20 | 0xffffffff 0xffe0399f 0xc000000c /* pioA */ | ||
21 | 0x000406ff 0x00047e3f 0x00000000 /* pioB */ | ||
22 | 0xfdffffff 0x00000000 0xb83fffff /* pioC */ | ||
23 | 0x003fffff 0x003f8000 0x00000000 /* pioD */ | ||
24 | >; | ||
25 | }; | ||
26 | }; | ||
27 | }; | ||
28 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9g35ek.dts b/arch/arm/boot/dts/at91sam9g35ek.dts new file mode 100644 index 000000000000..95944bdd798d --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g35ek.dts | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * at91sam9g35ek.dts - Device Tree file for AT91SAM9G35-EK board | ||
3 | * | ||
4 | * Copyright (C) 2012 Atmel, | ||
5 | * 2012 Nicolas Ferre <nicolas.ferre@atmel.com> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later. | ||
8 | */ | ||
9 | /dts-v1/; | ||
10 | /include/ "at91sam9g35.dtsi" | ||
11 | /include/ "at91sam9x5ek.dtsi" | ||
12 | |||
13 | / { | ||
14 | model = "Atmel AT91SAM9G35-EK"; | ||
15 | compatible = "atmel,at91sam9g35ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | ||
16 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 3add030d61f8..0741caeeced1 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
@@ -108,60 +108,243 @@ | |||
108 | interrupts = <21 4 0>; | 108 | interrupts = <21 4 0>; |
109 | }; | 109 | }; |
110 | 110 | ||
111 | pioA: gpio@fffff200 { | 111 | pinctrl@fffff200 { |
112 | compatible = "atmel,at91rm9200-gpio"; | 112 | #address-cells = <1>; |
113 | reg = <0xfffff200 0x100>; | 113 | #size-cells = <1>; |
114 | interrupts = <2 4 1>; | 114 | compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; |
115 | #gpio-cells = <2>; | 115 | ranges = <0xfffff200 0xfffff200 0xa00>; |
116 | gpio-controller; | 116 | |
117 | interrupt-controller; | 117 | atmel,mux-mask = < |
118 | #interrupt-cells = <2>; | 118 | /* A B */ |
119 | }; | 119 | 0xffffffff 0xffc003ff /* pioA */ |
120 | 0xffffffff 0x800f8f00 /* pioB */ | ||
121 | 0xffffffff 0x00000e00 /* pioC */ | ||
122 | 0xffffffff 0xff0c1381 /* pioD */ | ||
123 | 0xffffffff 0x81ffff81 /* pioE */ | ||
124 | >; | ||
125 | |||
126 | /* shared pinctrl settings */ | ||
127 | dbgu { | ||
128 | pinctrl_dbgu: dbgu-0 { | ||
129 | atmel,pins = | ||
130 | <1 12 0x1 0x0 /* PB12 periph A */ | ||
131 | 1 13 0x1 0x0>; /* PB13 periph A */ | ||
132 | }; | ||
133 | }; | ||
120 | 134 | ||
121 | pioB: gpio@fffff400 { | 135 | usart0 { |
122 | compatible = "atmel,at91rm9200-gpio"; | 136 | pinctrl_usart0: usart0-0 { |
123 | reg = <0xfffff400 0x100>; | 137 | atmel,pins = |
124 | interrupts = <3 4 1>; | 138 | <1 19 0x1 0x1 /* PB19 periph A with pullup */ |
125 | #gpio-cells = <2>; | 139 | 1 18 0x1 0x0>; /* PB18 periph A */ |
126 | gpio-controller; | 140 | }; |
127 | interrupt-controller; | 141 | |
128 | #interrupt-cells = <2>; | 142 | pinctrl_usart0_rts: usart0_rts-0 { |
129 | }; | 143 | atmel,pins = |
144 | <1 17 0x2 0x0>; /* PB17 periph B */ | ||
145 | }; | ||
146 | |||
147 | pinctrl_usart0_cts: usart0_cts-0 { | ||
148 | atmel,pins = | ||
149 | <1 15 0x2 0x0>; /* PB15 periph B */ | ||
150 | }; | ||
151 | }; | ||
130 | 152 | ||
131 | pioC: gpio@fffff600 { | 153 | uart1 { |
132 | compatible = "atmel,at91rm9200-gpio"; | 154 | pinctrl_usart1: usart1-0 { |
133 | reg = <0xfffff600 0x100>; | 155 | atmel,pins = |
134 | interrupts = <4 4 1>; | 156 | <1 4 0x1 0x1 /* PB4 periph A with pullup */ |
135 | #gpio-cells = <2>; | 157 | 1 5 0x1 0x0>; /* PB5 periph A */ |
136 | gpio-controller; | 158 | }; |
137 | interrupt-controller; | 159 | |
138 | #interrupt-cells = <2>; | 160 | pinctrl_usart1_rts: usart1_rts-0 { |
139 | }; | 161 | atmel,pins = |
162 | <3 16 0x1 0x0>; /* PD16 periph A */ | ||
163 | }; | ||
164 | |||
165 | pinctrl_usart1_cts: usart1_cts-0 { | ||
166 | atmel,pins = | ||
167 | <3 17 0x1 0x0>; /* PD17 periph A */ | ||
168 | }; | ||
169 | }; | ||
140 | 170 | ||
141 | pioD: gpio@fffff800 { | 171 | usart2 { |
142 | compatible = "atmel,at91rm9200-gpio"; | 172 | pinctrl_usart2: usart2-0 { |
143 | reg = <0xfffff800 0x100>; | 173 | atmel,pins = |
144 | interrupts = <5 4 1>; | 174 | <1 6 0x1 0x1 /* PB6 periph A with pullup */ |
145 | #gpio-cells = <2>; | 175 | 1 7 0x1 0x0>; /* PB7 periph A */ |
146 | gpio-controller; | 176 | }; |
147 | interrupt-controller; | 177 | |
148 | #interrupt-cells = <2>; | 178 | pinctrl_usart2_rts: usart2_rts-0 { |
149 | }; | 179 | atmel,pins = |
180 | <2 9 0x2 0x0>; /* PC9 periph B */ | ||
181 | }; | ||
182 | |||
183 | pinctrl_usart2_cts: usart2_cts-0 { | ||
184 | atmel,pins = | ||
185 | <2 11 0x2 0x0>; /* PC11 periph B */ | ||
186 | }; | ||
187 | }; | ||
150 | 188 | ||
151 | pioE: gpio@fffffa00 { | 189 | usart3 { |
152 | compatible = "atmel,at91rm9200-gpio"; | 190 | pinctrl_usart3: usart3-0 { |
153 | reg = <0xfffffa00 0x100>; | 191 | atmel,pins = |
154 | interrupts = <5 4 1>; | 192 | <1 8 0x1 0x1 /* PB9 periph A with pullup */ |
155 | #gpio-cells = <2>; | 193 | 1 9 0x1 0x0>; /* PB8 periph A */ |
156 | gpio-controller; | 194 | }; |
157 | interrupt-controller; | 195 | |
158 | #interrupt-cells = <2>; | 196 | pinctrl_usart3_rts: usart3_rts-0 { |
197 | atmel,pins = | ||
198 | <0 23 0x2 0x0>; /* PA23 periph B */ | ||
199 | }; | ||
200 | |||
201 | pinctrl_usart3_cts: usart3_cts-0 { | ||
202 | atmel,pins = | ||
203 | <0 24 0x2 0x0>; /* PA24 periph B */ | ||
204 | }; | ||
205 | }; | ||
206 | |||
207 | nand { | ||
208 | pinctrl_nand: nand-0 { | ||
209 | atmel,pins = | ||
210 | <2 8 0x0 0x1 /* PC8 gpio RDY pin pull_up*/ | ||
211 | 2 14 0x0 0x1>; /* PC14 gpio enable pin pull_up */ | ||
212 | }; | ||
213 | }; | ||
214 | |||
215 | macb { | ||
216 | pinctrl_macb_rmii: macb_rmii-0 { | ||
217 | atmel,pins = | ||
218 | <0 10 0x1 0x0 /* PA10 periph A */ | ||
219 | 0 11 0x1 0x0 /* PA11 periph A */ | ||
220 | 0 12 0x1 0x0 /* PA12 periph A */ | ||
221 | 0 13 0x1 0x0 /* PA13 periph A */ | ||
222 | 0 14 0x1 0x0 /* PA14 periph A */ | ||
223 | 0 15 0x1 0x0 /* PA15 periph A */ | ||
224 | 0 16 0x1 0x0 /* PA16 periph A */ | ||
225 | 0 17 0x1 0x0 /* PA17 periph A */ | ||
226 | 0 18 0x1 0x0 /* PA18 periph A */ | ||
227 | 0 19 0x1 0x0>; /* PA19 periph A */ | ||
228 | }; | ||
229 | |||
230 | pinctrl_macb_rmii_mii: macb_rmii_mii-0 { | ||
231 | atmel,pins = | ||
232 | <0 6 0x2 0x0 /* PA6 periph B */ | ||
233 | 0 7 0x2 0x0 /* PA7 periph B */ | ||
234 | 0 8 0x2 0x0 /* PA8 periph B */ | ||
235 | 0 9 0x2 0x0 /* PA9 periph B */ | ||
236 | 0 27 0x2 0x0 /* PA27 periph B */ | ||
237 | 0 28 0x2 0x0 /* PA28 periph B */ | ||
238 | 0 29 0x2 0x0 /* PA29 periph B */ | ||
239 | 0 30 0x2 0x0>; /* PA30 periph B */ | ||
240 | }; | ||
241 | }; | ||
242 | |||
243 | mmc0 { | ||
244 | pinctrl_mmc0_slot0_clk_cmd_dat0: mmc0_slot0_clk_cmd_dat0-0 { | ||
245 | atmel,pins = | ||
246 | <0 0 0x1 0x0 /* PA0 periph A */ | ||
247 | 0 1 0x1 0x1 /* PA1 periph A with pullup */ | ||
248 | 0 2 0x1 0x1>; /* PA2 periph A with pullup */ | ||
249 | }; | ||
250 | |||
251 | pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { | ||
252 | atmel,pins = | ||
253 | <0 3 0x1 0x1 /* PA3 periph A with pullup */ | ||
254 | 0 4 0x1 0x1 /* PA4 periph A with pullup */ | ||
255 | 0 5 0x1 0x1>; /* PA5 periph A with pullup */ | ||
256 | }; | ||
257 | |||
258 | pinctrl_mmc0_slot0_dat4_7: mmc0_slot0_dat4_7-0 { | ||
259 | atmel,pins = | ||
260 | <0 6 0x1 0x1 /* PA6 periph A with pullup */ | ||
261 | 0 7 0x1 0x1 /* PA7 periph A with pullup */ | ||
262 | 0 8 0x1 0x1 /* PA8 periph A with pullup */ | ||
263 | 0 9 0x1 0x1>; /* PA9 periph A with pullup */ | ||
264 | }; | ||
265 | }; | ||
266 | |||
267 | mmc1 { | ||
268 | pinctrl_mmc1_slot0_clk_cmd_dat0: mmc1_slot0_clk_cmd_dat0-0 { | ||
269 | atmel,pins = | ||
270 | <0 31 0x1 0x0 /* PA31 periph A */ | ||
271 | 0 22 0x1 0x1 /* PA22 periph A with pullup */ | ||
272 | 0 23 0x1 0x1>; /* PA23 periph A with pullup */ | ||
273 | }; | ||
274 | |||
275 | pinctrl_mmc1_slot0_dat1_3: mmc1_slot0_dat1_3-0 { | ||
276 | atmel,pins = | ||
277 | <0 24 0x1 0x1 /* PA24 periph A with pullup */ | ||
278 | 0 25 0x1 0x1 /* PA25 periph A with pullup */ | ||
279 | 0 26 0x1 0x1>; /* PA26 periph A with pullup */ | ||
280 | }; | ||
281 | |||
282 | pinctrl_mmc1_slot0_dat4_7: mmc1_slot0_dat4_7-0 { | ||
283 | atmel,pins = | ||
284 | <0 27 0x1 0x1 /* PA27 periph A with pullup */ | ||
285 | 0 28 0x1 0x1 /* PA28 periph A with pullup */ | ||
286 | 0 29 0x1 0x1 /* PA29 periph A with pullup */ | ||
287 | 0 20 0x1 0x1>; /* PA30 periph A with pullup */ | ||
288 | }; | ||
289 | }; | ||
290 | |||
291 | pioA: gpio@fffff200 { | ||
292 | compatible = "atmel,at91rm9200-gpio"; | ||
293 | reg = <0xfffff200 0x200>; | ||
294 | interrupts = <2 4 1>; | ||
295 | #gpio-cells = <2>; | ||
296 | gpio-controller; | ||
297 | interrupt-controller; | ||
298 | #interrupt-cells = <2>; | ||
299 | }; | ||
300 | |||
301 | pioB: gpio@fffff400 { | ||
302 | compatible = "atmel,at91rm9200-gpio"; | ||
303 | reg = <0xfffff400 0x200>; | ||
304 | interrupts = <3 4 1>; | ||
305 | #gpio-cells = <2>; | ||
306 | gpio-controller; | ||
307 | interrupt-controller; | ||
308 | #interrupt-cells = <2>; | ||
309 | }; | ||
310 | |||
311 | pioC: gpio@fffff600 { | ||
312 | compatible = "atmel,at91rm9200-gpio"; | ||
313 | reg = <0xfffff600 0x200>; | ||
314 | interrupts = <4 4 1>; | ||
315 | #gpio-cells = <2>; | ||
316 | gpio-controller; | ||
317 | interrupt-controller; | ||
318 | #interrupt-cells = <2>; | ||
319 | }; | ||
320 | |||
321 | pioD: gpio@fffff800 { | ||
322 | compatible = "atmel,at91rm9200-gpio"; | ||
323 | reg = <0xfffff800 0x200>; | ||
324 | interrupts = <5 4 1>; | ||
325 | #gpio-cells = <2>; | ||
326 | gpio-controller; | ||
327 | interrupt-controller; | ||
328 | #interrupt-cells = <2>; | ||
329 | }; | ||
330 | |||
331 | pioE: gpio@fffffa00 { | ||
332 | compatible = "atmel,at91rm9200-gpio"; | ||
333 | reg = <0xfffffa00 0x200>; | ||
334 | interrupts = <5 4 1>; | ||
335 | #gpio-cells = <2>; | ||
336 | gpio-controller; | ||
337 | interrupt-controller; | ||
338 | #interrupt-cells = <2>; | ||
339 | }; | ||
159 | }; | 340 | }; |
160 | 341 | ||
161 | dbgu: serial@ffffee00 { | 342 | dbgu: serial@ffffee00 { |
162 | compatible = "atmel,at91sam9260-usart"; | 343 | compatible = "atmel,at91sam9260-usart"; |
163 | reg = <0xffffee00 0x200>; | 344 | reg = <0xffffee00 0x200>; |
164 | interrupts = <1 4 7>; | 345 | interrupts = <1 4 7>; |
346 | pinctrl-names = "default"; | ||
347 | pinctrl-0 = <&pinctrl_dbgu>; | ||
165 | status = "disabled"; | 348 | status = "disabled"; |
166 | }; | 349 | }; |
167 | 350 | ||
@@ -171,6 +354,8 @@ | |||
171 | interrupts = <7 4 5>; | 354 | interrupts = <7 4 5>; |
172 | atmel,use-dma-rx; | 355 | atmel,use-dma-rx; |
173 | atmel,use-dma-tx; | 356 | atmel,use-dma-tx; |
357 | pinctrl-names = "default"; | ||
358 | pinctrl-0 = <&pinctrl_usart0>; | ||
174 | status = "disabled"; | 359 | status = "disabled"; |
175 | }; | 360 | }; |
176 | 361 | ||
@@ -180,6 +365,8 @@ | |||
180 | interrupts = <8 4 5>; | 365 | interrupts = <8 4 5>; |
181 | atmel,use-dma-rx; | 366 | atmel,use-dma-rx; |
182 | atmel,use-dma-tx; | 367 | atmel,use-dma-tx; |
368 | pinctrl-names = "default"; | ||
369 | pinctrl-0 = <&pinctrl_usart1>; | ||
183 | status = "disabled"; | 370 | status = "disabled"; |
184 | }; | 371 | }; |
185 | 372 | ||
@@ -189,6 +376,8 @@ | |||
189 | interrupts = <9 4 5>; | 376 | interrupts = <9 4 5>; |
190 | atmel,use-dma-rx; | 377 | atmel,use-dma-rx; |
191 | atmel,use-dma-tx; | 378 | atmel,use-dma-tx; |
379 | pinctrl-names = "default"; | ||
380 | pinctrl-0 = <&pinctrl_usart2>; | ||
192 | status = "disabled"; | 381 | status = "disabled"; |
193 | }; | 382 | }; |
194 | 383 | ||
@@ -198,6 +387,8 @@ | |||
198 | interrupts = <10 4 5>; | 387 | interrupts = <10 4 5>; |
199 | atmel,use-dma-rx; | 388 | atmel,use-dma-rx; |
200 | atmel,use-dma-tx; | 389 | atmel,use-dma-tx; |
390 | pinctrl-names = "default"; | ||
391 | pinctrl-0 = <&pinctrl_usart3>; | ||
201 | status = "disabled"; | 392 | status = "disabled"; |
202 | }; | 393 | }; |
203 | 394 | ||
@@ -205,6 +396,8 @@ | |||
205 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; | 396 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; |
206 | reg = <0xfffbc000 0x100>; | 397 | reg = <0xfffbc000 0x100>; |
207 | interrupts = <25 4 3>; | 398 | interrupts = <25 4 3>; |
399 | pinctrl-names = "default"; | ||
400 | pinctrl-0 = <&pinctrl_macb_rmii>; | ||
208 | status = "disabled"; | 401 | status = "disabled"; |
209 | }; | 402 | }; |
210 | 403 | ||
@@ -262,6 +455,24 @@ | |||
262 | trigger-value = <0x6>; | 455 | trigger-value = <0x6>; |
263 | }; | 456 | }; |
264 | }; | 457 | }; |
458 | |||
459 | mmc0: mmc@fff80000 { | ||
460 | compatible = "atmel,hsmci"; | ||
461 | reg = <0xfff80000 0x600>; | ||
462 | interrupts = <11 4 0>; | ||
463 | #address-cells = <1>; | ||
464 | #size-cells = <0>; | ||
465 | status = "disabled"; | ||
466 | }; | ||
467 | |||
468 | mmc1: mmc@fffd0000 { | ||
469 | compatible = "atmel,hsmci"; | ||
470 | reg = <0xfffd0000 0x600>; | ||
471 | interrupts = <29 4 0>; | ||
472 | #address-cells = <1>; | ||
473 | #size-cells = <0>; | ||
474 | status = "disabled"; | ||
475 | }; | ||
265 | }; | 476 | }; |
266 | 477 | ||
267 | nand0: nand@40000000 { | 478 | nand0: nand@40000000 { |
@@ -273,6 +484,8 @@ | |||
273 | >; | 484 | >; |
274 | atmel,nand-addr-offset = <21>; | 485 | atmel,nand-addr-offset = <21>; |
275 | atmel,nand-cmd-offset = <22>; | 486 | atmel,nand-cmd-offset = <22>; |
487 | pinctrl-names = "default"; | ||
488 | pinctrl-0 = <&pinctrl_nand>; | ||
276 | gpios = <&pioC 8 0 | 489 | gpios = <&pioC 8 0 |
277 | &pioC 14 0 | 490 | &pioC 14 0 |
278 | 0 | 491 | 0 |
diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index 15e1dd43f625..20c31913c270 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts | |||
@@ -39,6 +39,10 @@ | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | usart1: serial@fff90000 { | 41 | usart1: serial@fff90000 { |
42 | pinctrl-0 = | ||
43 | <&pinctrl_usart1 | ||
44 | &pinctrl_usart1_rts | ||
45 | &pinctrl_usart1_cts>; | ||
42 | status = "okay"; | 46 | status = "okay"; |
43 | }; | 47 | }; |
44 | 48 | ||
@@ -54,6 +58,50 @@ | |||
54 | i2c1: i2c@fff88000 { | 58 | i2c1: i2c@fff88000 { |
55 | status = "okay"; | 59 | status = "okay"; |
56 | }; | 60 | }; |
61 | |||
62 | mmc0: mmc@fff80000 { | ||
63 | pinctrl-0 = < | ||
64 | &pinctrl_board_mmc0 | ||
65 | &pinctrl_mmc0_slot0_clk_cmd_dat0 | ||
66 | &pinctrl_mmc0_slot0_dat1_3>; | ||
67 | status = "okay"; | ||
68 | slot@0 { | ||
69 | reg = <0>; | ||
70 | bus-width = <4>; | ||
71 | cd-gpios = <&pioD 10 0>; | ||
72 | }; | ||
73 | }; | ||
74 | |||
75 | mmc1: mmc@fffd0000 { | ||
76 | pinctrl-0 = < | ||
77 | &pinctrl_board_mmc1 | ||
78 | &pinctrl_mmc1_slot0_clk_cmd_dat0 | ||
79 | &pinctrl_mmc1_slot0_dat1_3>; | ||
80 | status = "okay"; | ||
81 | slot@0 { | ||
82 | reg = <0>; | ||
83 | bus-width = <4>; | ||
84 | cd-gpios = <&pioD 11 0>; | ||
85 | wp-gpios = <&pioD 29 0>; | ||
86 | }; | ||
87 | }; | ||
88 | |||
89 | pinctrl@fffff200 { | ||
90 | mmc0 { | ||
91 | pinctrl_board_mmc0: mmc0-board { | ||
92 | atmel,pins = | ||
93 | <3 10 0x0 0x5>; /* PD10 gpio CD pin pull up and deglitch */ | ||
94 | }; | ||
95 | }; | ||
96 | |||
97 | mmc1 { | ||
98 | pinctrl_board_mmc1: mmc1-board { | ||
99 | atmel,pins = | ||
100 | <3 11 0x0 0x5 /* PD11 gpio CD pin pull up and deglitch */ | ||
101 | 3 29 0x0 0x1>; /* PD29 gpio WP pin pull up */ | ||
102 | }; | ||
103 | }; | ||
104 | }; | ||
57 | }; | 105 | }; |
58 | 106 | ||
59 | nand0: nand@40000000 { | 107 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index 82508d68aa7e..e9efb34f4379 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi | |||
@@ -84,6 +84,15 @@ | |||
84 | reg = <0xfffffe10 0x10>; | 84 | reg = <0xfffffe10 0x10>; |
85 | }; | 85 | }; |
86 | 86 | ||
87 | mmc0: mmc@f0008000 { | ||
88 | compatible = "atmel,hsmci"; | ||
89 | reg = <0xf0008000 0x600>; | ||
90 | interrupts = <12 4 0>; | ||
91 | #address-cells = <1>; | ||
92 | #size-cells = <0>; | ||
93 | status = "disabled"; | ||
94 | }; | ||
95 | |||
87 | tcb0: timer@f8008000 { | 96 | tcb0: timer@f8008000 { |
88 | compatible = "atmel,at91sam9x5-tcb"; | 97 | compatible = "atmel,at91sam9x5-tcb"; |
89 | reg = <0xf8008000 0x100>; | 98 | reg = <0xf8008000 0x100>; |
@@ -102,50 +111,186 @@ | |||
102 | interrupts = <20 4 0>; | 111 | interrupts = <20 4 0>; |
103 | }; | 112 | }; |
104 | 113 | ||
105 | pioA: gpio@fffff400 { | 114 | pinctrl@fffff400 { |
106 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 115 | #address-cells = <1>; |
107 | reg = <0xfffff400 0x100>; | 116 | #size-cells = <1>; |
108 | interrupts = <2 4 1>; | 117 | compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus"; |
109 | #gpio-cells = <2>; | 118 | ranges = <0xfffff400 0xfffff400 0x800>; |
110 | gpio-controller; | ||
111 | interrupt-controller; | ||
112 | #interrupt-cells = <2>; | ||
113 | }; | ||
114 | 119 | ||
115 | pioB: gpio@fffff600 { | 120 | atmel,mux-mask = < |
116 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 121 | /* A B C */ |
117 | reg = <0xfffff600 0x100>; | 122 | 0xffffffff 0xffe07983 0x00000000 /* pioA */ |
118 | interrupts = <2 4 1>; | 123 | 0x00040000 0x00047e0f 0x00000000 /* pioB */ |
119 | #gpio-cells = <2>; | 124 | 0xfdffffff 0x07c00000 0xb83fffff /* pioC */ |
120 | gpio-controller; | 125 | 0x003fffff 0x003f8000 0x00000000 /* pioD */ |
121 | interrupt-controller; | 126 | >; |
122 | #interrupt-cells = <2>; | ||
123 | }; | ||
124 | 127 | ||
125 | pioC: gpio@fffff800 { | 128 | /* shared pinctrl settings */ |
126 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 129 | dbgu { |
127 | reg = <0xfffff800 0x100>; | 130 | pinctrl_dbgu: dbgu-0 { |
128 | interrupts = <3 4 1>; | 131 | atmel,pins = |
129 | #gpio-cells = <2>; | 132 | <0 9 0x1 0x0 /* PA9 periph A */ |
130 | gpio-controller; | 133 | 0 10 0x1 0x1>; /* PA10 periph with pullup */ |
131 | interrupt-controller; | 134 | }; |
132 | #interrupt-cells = <2>; | 135 | }; |
133 | }; | ||
134 | 136 | ||
135 | pioD: gpio@fffffa00 { | 137 | usart0 { |
136 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 138 | pinctrl_usart0: usart0-0 { |
137 | reg = <0xfffffa00 0x100>; | 139 | atmel,pins = |
138 | interrupts = <3 4 1>; | 140 | <0 1 0x1 0x1 /* PA1 periph A with pullup */ |
139 | #gpio-cells = <2>; | 141 | 0 0 0x1 0x0>; /* PA0 periph A */ |
140 | gpio-controller; | 142 | }; |
141 | interrupt-controller; | 143 | |
142 | #interrupt-cells = <2>; | 144 | pinctrl_usart0_rts: usart0_rts-0 { |
145 | atmel,pins = | ||
146 | <0 2 0x1 0x0>; /* PA2 periph A */ | ||
147 | }; | ||
148 | |||
149 | pinctrl_usart0_cts: usart0_cts-0 { | ||
150 | atmel,pins = | ||
151 | <0 3 0x1 0x0>; /* PA3 periph A */ | ||
152 | }; | ||
153 | }; | ||
154 | |||
155 | usart1 { | ||
156 | pinctrl_usart1: usart1-0 { | ||
157 | atmel,pins = | ||
158 | <0 6 0x1 0x1 /* PA6 periph A with pullup */ | ||
159 | 0 5 0x1 0x0>; /* PA5 periph A */ | ||
160 | }; | ||
161 | }; | ||
162 | |||
163 | usart2 { | ||
164 | pinctrl_usart2: usart2-0 { | ||
165 | atmel,pins = | ||
166 | <0 8 0x1 0x1 /* PA8 periph A with pullup */ | ||
167 | 0 7 0x1 0x0>; /* PA7 periph A */ | ||
168 | }; | ||
169 | |||
170 | pinctrl_usart2_rts: usart2_rts-0 { | ||
171 | atmel,pins = | ||
172 | <1 0 0x2 0x0>; /* PB0 periph B */ | ||
173 | }; | ||
174 | |||
175 | pinctrl_usart2_cts: usart2_cts-0 { | ||
176 | atmel,pins = | ||
177 | <1 1 0x2 0x0>; /* PB1 periph B */ | ||
178 | }; | ||
179 | }; | ||
180 | |||
181 | usart3 { | ||
182 | pinctrl_usart3: usart3-0 { | ||
183 | atmel,pins = | ||
184 | <2 23 0x2 0x1 /* PC23 periph B with pullup */ | ||
185 | 2 22 0x2 0x0>; /* PC22 periph B */ | ||
186 | }; | ||
187 | |||
188 | pinctrl_usart3_rts: usart3_rts-0 { | ||
189 | atmel,pins = | ||
190 | <2 24 0x2 0x0>; /* PC24 periph B */ | ||
191 | }; | ||
192 | |||
193 | pinctrl_usart3_cts: usart3_cts-0 { | ||
194 | atmel,pins = | ||
195 | <2 25 0x2 0x0>; /* PC25 periph B */ | ||
196 | }; | ||
197 | }; | ||
198 | |||
199 | uart0 { | ||
200 | pinctrl_uart0: uart0-0 { | ||
201 | atmel,pins = | ||
202 | <2 9 0x3 0x1 /* PC9 periph C with pullup */ | ||
203 | 2 8 0x3 0x0>; /* PC8 periph C */ | ||
204 | }; | ||
205 | }; | ||
206 | |||
207 | uart1 { | ||
208 | pinctrl_uart1: uart1-0 { | ||
209 | atmel,pins = | ||
210 | <2 16 0x3 0x1 /* PC17 periph C with pullup */ | ||
211 | 2 17 0x3 0x0>; /* PC16 periph C */ | ||
212 | }; | ||
213 | }; | ||
214 | |||
215 | nand { | ||
216 | pinctrl_nand: nand-0 { | ||
217 | atmel,pins = | ||
218 | <3 5 0x0 0x1 /* PD5 gpio RDY pin pull_up*/ | ||
219 | 3 4 0x0 0x1>; /* PD4 gpio enable pin pull_up */ | ||
220 | }; | ||
221 | }; | ||
222 | |||
223 | mmc0 { | ||
224 | pinctrl_mmc0_slot0_clk_cmd_dat0: mmc0_slot0_clk_cmd_dat0-0 { | ||
225 | atmel,pins = | ||
226 | <0 17 0x1 0x0 /* PA17 periph A */ | ||
227 | 0 16 0x1 0x1 /* PA16 periph A with pullup */ | ||
228 | 0 15 0x1 0x1>; /* PA15 periph A with pullup */ | ||
229 | }; | ||
230 | |||
231 | pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { | ||
232 | atmel,pins = | ||
233 | <0 18 0x1 0x1 /* PA18 periph A with pullup */ | ||
234 | 0 19 0x1 0x1 /* PA19 periph A with pullup */ | ||
235 | 0 20 0x1 0x1>; /* PA20 periph A with pullup */ | ||
236 | }; | ||
237 | |||
238 | pinctrl_mmc0_slot0_dat4_7: mmc0_slot0_dat4_7-0 { | ||
239 | atmel,pins = | ||
240 | <0 11 0x2 0x1 /* PA11 periph B with pullup */ | ||
241 | 0 12 0x2 0x1 /* PA12 periph B with pullup */ | ||
242 | 0 13 0x2 0x1 /* PA13 periph B with pullup */ | ||
243 | 0 14 0x2 0x1>; /* PA14 periph B with pullup */ | ||
244 | }; | ||
245 | }; | ||
246 | |||
247 | pioA: gpio@fffff400 { | ||
248 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
249 | reg = <0xfffff400 0x200>; | ||
250 | interrupts = <2 4 1>; | ||
251 | #gpio-cells = <2>; | ||
252 | gpio-controller; | ||
253 | interrupt-controller; | ||
254 | #interrupt-cells = <2>; | ||
255 | }; | ||
256 | |||
257 | pioB: gpio@fffff600 { | ||
258 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
259 | reg = <0xfffff600 0x200>; | ||
260 | interrupts = <2 4 1>; | ||
261 | #gpio-cells = <2>; | ||
262 | gpio-controller; | ||
263 | interrupt-controller; | ||
264 | #interrupt-cells = <2>; | ||
265 | }; | ||
266 | |||
267 | pioC: gpio@fffff800 { | ||
268 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
269 | reg = <0xfffff800 0x200>; | ||
270 | interrupts = <3 4 1>; | ||
271 | #gpio-cells = <2>; | ||
272 | gpio-controller; | ||
273 | interrupt-controller; | ||
274 | #interrupt-cells = <2>; | ||
275 | }; | ||
276 | |||
277 | pioD: gpio@fffffa00 { | ||
278 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
279 | reg = <0xfffffa00 0x200>; | ||
280 | interrupts = <3 4 1>; | ||
281 | #gpio-cells = <2>; | ||
282 | gpio-controller; | ||
283 | interrupt-controller; | ||
284 | #interrupt-cells = <2>; | ||
285 | }; | ||
143 | }; | 286 | }; |
144 | 287 | ||
145 | dbgu: serial@fffff200 { | 288 | dbgu: serial@fffff200 { |
146 | compatible = "atmel,at91sam9260-usart"; | 289 | compatible = "atmel,at91sam9260-usart"; |
147 | reg = <0xfffff200 0x200>; | 290 | reg = <0xfffff200 0x200>; |
148 | interrupts = <1 4 7>; | 291 | interrupts = <1 4 7>; |
292 | pinctrl-names = "default"; | ||
293 | pinctrl-0 = <&pinctrl_dbgu>; | ||
149 | status = "disabled"; | 294 | status = "disabled"; |
150 | }; | 295 | }; |
151 | 296 | ||
@@ -155,6 +300,8 @@ | |||
155 | interrupts = <5 4 5>; | 300 | interrupts = <5 4 5>; |
156 | atmel,use-dma-rx; | 301 | atmel,use-dma-rx; |
157 | atmel,use-dma-tx; | 302 | atmel,use-dma-tx; |
303 | pinctrl-names = "default"; | ||
304 | pinctrl-0 = <&pinctrl_usart0>; | ||
158 | status = "disabled"; | 305 | status = "disabled"; |
159 | }; | 306 | }; |
160 | 307 | ||
@@ -164,6 +311,8 @@ | |||
164 | interrupts = <6 4 5>; | 311 | interrupts = <6 4 5>; |
165 | atmel,use-dma-rx; | 312 | atmel,use-dma-rx; |
166 | atmel,use-dma-tx; | 313 | atmel,use-dma-tx; |
314 | pinctrl-names = "default"; | ||
315 | pinctrl-0 = <&pinctrl_usart1>; | ||
167 | status = "disabled"; | 316 | status = "disabled"; |
168 | }; | 317 | }; |
169 | 318 | ||
@@ -173,6 +322,8 @@ | |||
173 | interrupts = <7 4 5>; | 322 | interrupts = <7 4 5>; |
174 | atmel,use-dma-rx; | 323 | atmel,use-dma-rx; |
175 | atmel,use-dma-tx; | 324 | atmel,use-dma-tx; |
325 | pinctrl-names = "default"; | ||
326 | pinctrl-0 = <&pinctrl_usart2>; | ||
176 | status = "disabled"; | 327 | status = "disabled"; |
177 | }; | 328 | }; |
178 | 329 | ||
@@ -182,6 +333,8 @@ | |||
182 | interrupts = <8 4 5>; | 333 | interrupts = <8 4 5>; |
183 | atmel,use-dma-rx; | 334 | atmel,use-dma-rx; |
184 | atmel,use-dma-tx; | 335 | atmel,use-dma-tx; |
336 | pinctrl-names = "default"; | ||
337 | pinctrl-0 = <&pinctrl_usart3>; | ||
185 | status = "disabled"; | 338 | status = "disabled"; |
186 | }; | 339 | }; |
187 | 340 | ||
@@ -215,6 +368,8 @@ | |||
215 | >; | 368 | >; |
216 | atmel,nand-addr-offset = <21>; | 369 | atmel,nand-addr-offset = <21>; |
217 | atmel,nand-cmd-offset = <22>; | 370 | atmel,nand-cmd-offset = <22>; |
371 | pinctrl-names = "default"; | ||
372 | pinctrl-0 = <&pinctrl_nand>; | ||
218 | gpios = <&pioD 5 0 | 373 | gpios = <&pioD 5 0 |
219 | &pioD 4 0 | 374 | &pioD 4 0 |
220 | 0 | 375 | 0 |
diff --git a/arch/arm/boot/dts/at91sam9n12ek.dts b/arch/arm/boot/dts/at91sam9n12ek.dts index 912b2c283d6f..0376bf4fd66b 100644 --- a/arch/arm/boot/dts/at91sam9n12ek.dts +++ b/arch/arm/boot/dts/at91sam9n12ek.dts | |||
@@ -45,6 +45,28 @@ | |||
45 | i2c1: i2c@f8014000 { | 45 | i2c1: i2c@f8014000 { |
46 | status = "okay"; | 46 | status = "okay"; |
47 | }; | 47 | }; |
48 | |||
49 | mmc0: mmc@f0008000 { | ||
50 | pinctrl-0 = < | ||
51 | &pinctrl_board_mmc0 | ||
52 | &pinctrl_mmc0_slot0_clk_cmd_dat0 | ||
53 | &pinctrl_mmc0_slot0_dat1_3>; | ||
54 | status = "okay"; | ||
55 | slot@0 { | ||
56 | reg = <0>; | ||
57 | bus-width = <4>; | ||
58 | cd-gpios = <&pioA 7 0>; | ||
59 | }; | ||
60 | }; | ||
61 | |||
62 | pinctrl@fffff400 { | ||
63 | mmc0 { | ||
64 | pinctrl_board_mmc0: mmc0-board { | ||
65 | atmel,pins = | ||
66 | <0 7 0x0 0x5>; /* PA7 gpio CD pin pull up and deglitch */ | ||
67 | }; | ||
68 | }; | ||
69 | }; | ||
48 | }; | 70 | }; |
49 | 71 | ||
50 | nand0: nand@40000000 { | 72 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9x25.dtsi b/arch/arm/boot/dts/at91sam9x25.dtsi new file mode 100644 index 000000000000..54eb33ba6d22 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x25.dtsi | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * at91sam9x25.dtsi - Device Tree Include file for AT91SAM9X25 SoC | ||
3 | * | ||
4 | * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Licensed under GPLv2. | ||
7 | */ | ||
8 | |||
9 | /include/ "at91sam9x5.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Atmel AT91SAM9X25 SoC"; | ||
13 | compatible = "atmel, at91sam9x25, atmel,at91sam9x5"; | ||
14 | |||
15 | ahb { | ||
16 | apb { | ||
17 | pinctrl@fffff400 { | ||
18 | atmel,mux-mask = < | ||
19 | /* A B C */ | ||
20 | 0xffffffff 0xffe03fff 0xc000001c /* pioA */ | ||
21 | 0x0007ffff 0x00047e3f 0x00000000 /* pioB */ | ||
22 | 0x80000000 0xfffd0000 0xb83fffff /* pioC */ | ||
23 | 0x003fffff 0x003f8000 0x00000000 /* pioD */ | ||
24 | >; | ||
25 | |||
26 | macb1 { | ||
27 | pinctrl_macb1_rmii: macb1_rmii-0 { | ||
28 | atmel,pins = | ||
29 | <2 16 0x2 0x0 /* PC16 periph B */ | ||
30 | 2 18 0x2 0x0 /* PC18 periph B */ | ||
31 | 2 19 0x2 0x0 /* PC19 periph B */ | ||
32 | 2 20 0x2 0x0 /* PC20 periph B */ | ||
33 | 2 21 0x2 0x0 /* PC21 periph B */ | ||
34 | 2 27 0x2 0x0 /* PC27 periph B */ | ||
35 | 2 28 0x2 0x0 /* PC28 periph B */ | ||
36 | 2 29 0x2 0x0 /* PC29 periph B */ | ||
37 | 2 30 0x2 0x0 /* PC30 periph B */ | ||
38 | 2 31 0x2 0x0>; /* PC31 periph B */ | ||
39 | }; | ||
40 | }; | ||
41 | }; | ||
42 | |||
43 | macb1: ethernet@f8030000 { | ||
44 | pinctrl-names = "default"; | ||
45 | pinctrl-0 = <&pinctrl_macb1_rmii>; | ||
46 | }; | ||
47 | }; | ||
48 | }; | ||
49 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9x25ek.dts b/arch/arm/boot/dts/at91sam9x25ek.dts new file mode 100644 index 000000000000..af907eaa1f25 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x25ek.dts | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * at91sam9x25ek.dts - Device Tree file for AT91SAM9X25-EK board | ||
3 | * | ||
4 | * Copyright (C) 2012 Atmel, | ||
5 | * 2012 Nicolas Ferre <nicolas.ferre@atmel.com> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later. | ||
8 | */ | ||
9 | /dts-v1/; | ||
10 | /include/ "at91sam9x25.dtsi" | ||
11 | /include/ "at91sam9x5ek.dtsi" | ||
12 | |||
13 | / { | ||
14 | model = "Atmel AT91SAM9G25-EK"; | ||
15 | compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | ||
16 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9x35.dtsi b/arch/arm/boot/dts/at91sam9x35.dtsi new file mode 100644 index 000000000000..fb102d6126ce --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x35.dtsi | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * at91sam9x35.dtsi - Device Tree Include file for AT91SAM9X35 SoC | ||
3 | * | ||
4 | * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Licensed under GPLv2. | ||
7 | */ | ||
8 | |||
9 | /include/ "at91sam9x5.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Atmel AT91SAM9X35 SoC"; | ||
13 | compatible = "atmel, at91sam9x35, atmel,at91sam9x5"; | ||
14 | |||
15 | ahb { | ||
16 | apb { | ||
17 | pinctrl@fffff400 { | ||
18 | atmel,mux-mask = < | ||
19 | /* A B C */ | ||
20 | 0xffffffff 0xffe03fff 0xc000000c /* pioA */ | ||
21 | 0x000406ff 0x00047e3f 0x00000000 /* pioB */ | ||
22 | 0xfdffffff 0x00000000 0xb83fffff /* pioC */ | ||
23 | 0x003fffff 0x003f8000 0x00000000 /* pioD */ | ||
24 | >; | ||
25 | }; | ||
26 | }; | ||
27 | }; | ||
28 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9x35ek.dts b/arch/arm/boot/dts/at91sam9x35ek.dts new file mode 100644 index 000000000000..5ccb607b5414 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x35ek.dts | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * at91sam9x35ek.dts - Device Tree file for AT91SAM9X35-EK board | ||
3 | * | ||
4 | * Copyright (C) 2012 Atmel, | ||
5 | * 2012 Nicolas Ferre <nicolas.ferre@atmel.com> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later. | ||
8 | */ | ||
9 | /dts-v1/; | ||
10 | /include/ "at91sam9x35.dtsi" | ||
11 | /include/ "at91sam9x5ek.dtsi" | ||
12 | |||
13 | / { | ||
14 | model = "Atmel AT91SAM9X35-EK"; | ||
15 | compatible = "atmel,at91sam9x35ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | ||
16 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 03fc136421c5..7ee49e8daf98 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
@@ -111,50 +111,244 @@ | |||
111 | interrupts = <21 4 0>; | 111 | interrupts = <21 4 0>; |
112 | }; | 112 | }; |
113 | 113 | ||
114 | pioA: gpio@fffff400 { | 114 | pinctrl@fffff400 { |
115 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 115 | #address-cells = <1>; |
116 | reg = <0xfffff400 0x100>; | 116 | #size-cells = <1>; |
117 | interrupts = <2 4 1>; | 117 | compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus"; |
118 | #gpio-cells = <2>; | 118 | ranges = <0xfffff400 0xfffff400 0x800>; |
119 | gpio-controller; | 119 | |
120 | interrupt-controller; | 120 | /* shared pinctrl settings */ |
121 | #interrupt-cells = <2>; | 121 | dbgu { |
122 | }; | 122 | pinctrl_dbgu: dbgu-0 { |
123 | atmel,pins = | ||
124 | <0 9 0x1 0x0 /* PA9 periph A */ | ||
125 | 0 10 0x1 0x1>; /* PA10 periph A with pullup */ | ||
126 | }; | ||
127 | }; | ||
123 | 128 | ||
124 | pioB: gpio@fffff600 { | 129 | usart0 { |
125 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 130 | pinctrl_usart0: usart0-0 { |
126 | reg = <0xfffff600 0x100>; | 131 | atmel,pins = |
127 | interrupts = <2 4 1>; | 132 | <0 0 0x1 0x1 /* PA0 periph A with pullup */ |
128 | #gpio-cells = <2>; | 133 | 0 1 0x1 0x0>; /* PA1 periph A */ |
129 | gpio-controller; | 134 | }; |
130 | interrupt-controller; | 135 | |
131 | #interrupt-cells = <2>; | 136 | pinctrl_usart0_rts: usart0_rts-0 { |
137 | atmel,pins = | ||
138 | <0 2 0x1 0x0>; /* PA2 periph A */ | ||
139 | }; | ||
140 | |||
141 | pinctrl_usart0_cts: usart0_cts-0 { | ||
142 | atmel,pins = | ||
143 | <0 3 0x1 0x0>; /* PA3 periph A */ | ||
144 | }; | ||
145 | }; | ||
146 | |||
147 | usart1 { | ||
148 | pinctrl_usart1: usart1-0 { | ||
149 | atmel,pins = | ||
150 | <0 5 0x1 0x1 /* PA5 periph A with pullup */ | ||
151 | 0 6 0x1 0x0>; /* PA6 periph A */ | ||
152 | }; | ||
153 | |||
154 | pinctrl_usart1_rts: usart1_rts-0 { | ||
155 | atmel,pins = | ||
156 | <3 27 0x3 0x0>; /* PC27 periph C */ | ||
157 | }; | ||
158 | |||
159 | pinctrl_usart1_cts: usart1_cts-0 { | ||
160 | atmel,pins = | ||
161 | <3 28 0x3 0x0>; /* PC28 periph C */ | ||
162 | }; | ||
163 | }; | ||
164 | |||
165 | usart2 { | ||
166 | pinctrl_usart2: usart2-0 { | ||
167 | atmel,pins = | ||
168 | <0 7 0x1 0x1 /* PA7 periph A with pullup */ | ||
169 | 0 8 0x1 0x0>; /* PA8 periph A */ | ||
170 | }; | ||
171 | |||
172 | pinctrl_uart2_rts: uart2_rts-0 { | ||
173 | atmel,pins = | ||
174 | <0 0 0x2 0x0>; /* PB0 periph B */ | ||
175 | }; | ||
176 | |||
177 | pinctrl_uart2_cts: uart2_cts-0 { | ||
178 | atmel,pins = | ||
179 | <0 1 0x2 0x0>; /* PB1 periph B */ | ||
180 | }; | ||
181 | }; | ||
182 | |||
183 | usart3 { | ||
184 | pinctrl_uart3: usart3-0 { | ||
185 | atmel,pins = | ||
186 | <3 23 0x2 0x1 /* PC22 periph B with pullup */ | ||
187 | 3 23 0x2 0x0>; /* PC23 periph B */ | ||
188 | }; | ||
189 | |||
190 | pinctrl_usart3_rts: usart3_rts-0 { | ||
191 | atmel,pins = | ||
192 | <3 24 0x2 0x0>; /* PC24 periph B */ | ||
193 | }; | ||
194 | |||
195 | pinctrl_usart3_cts: usart3_cts-0 { | ||
196 | atmel,pins = | ||
197 | <3 25 0x2 0x0>; /* PC25 periph B */ | ||
198 | }; | ||
199 | }; | ||
200 | |||
201 | uart0 { | ||
202 | pinctrl_uart0: uart0-0 { | ||
203 | atmel,pins = | ||
204 | <3 8 0x3 0x0 /* PC8 periph C */ | ||
205 | 3 9 0x3 0x1>; /* PC9 periph C with pullup */ | ||
206 | }; | ||
207 | }; | ||
208 | |||
209 | uart1 { | ||
210 | pinctrl_uart1: uart1-0 { | ||
211 | atmel,pins = | ||
212 | <3 16 0x3 0x0 /* PC16 periph C */ | ||
213 | 3 17 0x3 0x1>; /* PC17 periph C with pullup */ | ||
214 | }; | ||
215 | }; | ||
216 | |||
217 | nand { | ||
218 | pinctrl_nand: nand-0 { | ||
219 | atmel,pins = | ||
220 | <3 4 0x0 0x1 /* PD5 gpio RDY pin pull_up */ | ||
221 | 3 5 0x0 0x1>; /* PD4 gpio enable pin pull_up */ | ||
222 | }; | ||
223 | }; | ||
224 | |||
225 | macb0 { | ||
226 | pinctrl_macb0_rmii: macb0_rmii-0 { | ||
227 | atmel,pins = | ||
228 | <1 0 0x1 0x0 /* PB0 periph A */ | ||
229 | 1 1 0x1 0x0 /* PB1 periph A */ | ||
230 | 1 2 0x1 0x0 /* PB2 periph A */ | ||
231 | 1 3 0x1 0x0 /* PB3 periph A */ | ||
232 | 1 4 0x1 0x0 /* PB4 periph A */ | ||
233 | 1 5 0x1 0x0 /* PB5 periph A */ | ||
234 | 1 6 0x1 0x0 /* PB6 periph A */ | ||
235 | 1 7 0x1 0x0 /* PB7 periph A */ | ||
236 | 1 9 0x1 0x0 /* PB9 periph A */ | ||
237 | 1 10 0x1 0x0>; /* PB10 periph A */ | ||
238 | }; | ||
239 | |||
240 | pinctrl_macb0_rmii_mii: macb0_rmii_mii-0 { | ||
241 | atmel,pins = | ||
242 | <1 8 0x1 0x0 /* PA8 periph A */ | ||
243 | 1 11 0x1 0x0 /* PA11 periph A */ | ||
244 | 1 12 0x1 0x0 /* PA12 periph A */ | ||
245 | 1 13 0x1 0x0 /* PA13 periph A */ | ||
246 | 1 14 0x1 0x0 /* PA14 periph A */ | ||
247 | 1 15 0x1 0x0 /* PA15 periph A */ | ||
248 | 1 16 0x1 0x0 /* PA16 periph A */ | ||
249 | 1 17 0x1 0x0>; /* PA17 periph A */ | ||
250 | }; | ||
251 | }; | ||
252 | |||
253 | mmc0 { | ||
254 | pinctrl_mmc0_slot0_clk_cmd_dat0: mmc0_slot0_clk_cmd_dat0-0 { | ||
255 | atmel,pins = | ||
256 | <0 17 0x1 0x0 /* PA17 periph A */ | ||
257 | 0 16 0x1 0x1 /* PA16 periph A with pullup */ | ||
258 | 0 15 0x1 0x1>; /* PA15 periph A with pullup */ | ||
259 | }; | ||
260 | |||
261 | pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { | ||
262 | atmel,pins = | ||
263 | <0 18 0x1 0x1 /* PA18 periph A with pullup */ | ||
264 | 0 19 0x1 0x1 /* PA19 periph A with pullup */ | ||
265 | 0 20 0x1 0x1>; /* PA20 periph A with pullup */ | ||
266 | }; | ||
267 | }; | ||
268 | |||
269 | mmc1 { | ||
270 | pinctrl_mmc1_slot0_clk_cmd_dat0: mmc1_slot0_clk_cmd_dat0-0 { | ||
271 | atmel,pins = | ||
272 | <0 13 0x2 0x0 /* PA13 periph B */ | ||
273 | 0 12 0x2 0x1 /* PA12 periph B with pullup */ | ||
274 | 0 11 0x2 0x1>; /* PA11 periph B with pullup */ | ||
275 | }; | ||
276 | |||
277 | pinctrl_mmc1_slot0_dat1_3: mmc1_slot0_dat1_3-0 { | ||
278 | atmel,pins = | ||
279 | <0 2 0x2 0x1 /* PA2 periph B with pullup */ | ||
280 | 0 3 0x2 0x1 /* PA3 periph B with pullup */ | ||
281 | 0 4 0x2 0x1>; /* PA4 periph B with pullup */ | ||
282 | }; | ||
283 | }; | ||
284 | |||
285 | pioA: gpio@fffff400 { | ||
286 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
287 | reg = <0xfffff400 0x200>; | ||
288 | interrupts = <2 4 1>; | ||
289 | #gpio-cells = <2>; | ||
290 | gpio-controller; | ||
291 | interrupt-controller; | ||
292 | #interrupt-cells = <2>; | ||
293 | }; | ||
294 | |||
295 | pioB: gpio@fffff600 { | ||
296 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
297 | reg = <0xfffff600 0x200>; | ||
298 | interrupts = <2 4 1>; | ||
299 | #gpio-cells = <2>; | ||
300 | gpio-controller; | ||
301 | #gpio-lines = <19>; | ||
302 | interrupt-controller; | ||
303 | #interrupt-cells = <2>; | ||
304 | }; | ||
305 | |||
306 | pioC: gpio@fffff800 { | ||
307 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
308 | reg = <0xfffff800 0x200>; | ||
309 | interrupts = <3 4 1>; | ||
310 | #gpio-cells = <2>; | ||
311 | gpio-controller; | ||
312 | interrupt-controller; | ||
313 | #interrupt-cells = <2>; | ||
314 | }; | ||
315 | |||
316 | pioD: gpio@fffffa00 { | ||
317 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | ||
318 | reg = <0xfffffa00 0x200>; | ||
319 | interrupts = <3 4 1>; | ||
320 | #gpio-cells = <2>; | ||
321 | gpio-controller; | ||
322 | #gpio-lines = <22>; | ||
323 | interrupt-controller; | ||
324 | #interrupt-cells = <2>; | ||
325 | }; | ||
132 | }; | 326 | }; |
133 | 327 | ||
134 | pioC: gpio@fffff800 { | 328 | mmc0: mmc@f0008000 { |
135 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 329 | compatible = "atmel,hsmci"; |
136 | reg = <0xfffff800 0x100>; | 330 | reg = <0xf0008000 0x600>; |
137 | interrupts = <3 4 1>; | 331 | interrupts = <12 4 0>; |
138 | #gpio-cells = <2>; | 332 | #address-cells = <1>; |
139 | gpio-controller; | 333 | #size-cells = <0>; |
140 | interrupt-controller; | 334 | status = "disabled"; |
141 | #interrupt-cells = <2>; | ||
142 | }; | 335 | }; |
143 | 336 | ||
144 | pioD: gpio@fffffa00 { | 337 | mmc1: mmc@f000c000 { |
145 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 338 | compatible = "atmel,hsmci"; |
146 | reg = <0xfffffa00 0x100>; | 339 | reg = <0xf000c000 0x600>; |
147 | interrupts = <3 4 1>; | 340 | interrupts = <26 4 0>; |
148 | #gpio-cells = <2>; | 341 | #address-cells = <1>; |
149 | gpio-controller; | 342 | #size-cells = <0>; |
150 | interrupt-controller; | 343 | status = "disabled"; |
151 | #interrupt-cells = <2>; | ||
152 | }; | 344 | }; |
153 | 345 | ||
154 | dbgu: serial@fffff200 { | 346 | dbgu: serial@fffff200 { |
155 | compatible = "atmel,at91sam9260-usart"; | 347 | compatible = "atmel,at91sam9260-usart"; |
156 | reg = <0xfffff200 0x200>; | 348 | reg = <0xfffff200 0x200>; |
157 | interrupts = <1 4 7>; | 349 | interrupts = <1 4 7>; |
350 | pinctrl-names = "default"; | ||
351 | pinctrl-0 = <&pinctrl_dbgu>; | ||
158 | status = "disabled"; | 352 | status = "disabled"; |
159 | }; | 353 | }; |
160 | 354 | ||
@@ -164,6 +358,8 @@ | |||
164 | interrupts = <5 4 5>; | 358 | interrupts = <5 4 5>; |
165 | atmel,use-dma-rx; | 359 | atmel,use-dma-rx; |
166 | atmel,use-dma-tx; | 360 | atmel,use-dma-tx; |
361 | pinctrl-names = "default"; | ||
362 | pinctrl-0 = <&pinctrl_usart0>; | ||
167 | status = "disabled"; | 363 | status = "disabled"; |
168 | }; | 364 | }; |
169 | 365 | ||
@@ -173,6 +369,8 @@ | |||
173 | interrupts = <6 4 5>; | 369 | interrupts = <6 4 5>; |
174 | atmel,use-dma-rx; | 370 | atmel,use-dma-rx; |
175 | atmel,use-dma-tx; | 371 | atmel,use-dma-tx; |
372 | pinctrl-names = "default"; | ||
373 | pinctrl-0 = <&pinctrl_usart1>; | ||
176 | status = "disabled"; | 374 | status = "disabled"; |
177 | }; | 375 | }; |
178 | 376 | ||
@@ -182,6 +380,8 @@ | |||
182 | interrupts = <7 4 5>; | 380 | interrupts = <7 4 5>; |
183 | atmel,use-dma-rx; | 381 | atmel,use-dma-rx; |
184 | atmel,use-dma-tx; | 382 | atmel,use-dma-tx; |
383 | pinctrl-names = "default"; | ||
384 | pinctrl-0 = <&pinctrl_usart2>; | ||
185 | status = "disabled"; | 385 | status = "disabled"; |
186 | }; | 386 | }; |
187 | 387 | ||
@@ -189,6 +389,8 @@ | |||
189 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; | 389 | compatible = "cdns,at32ap7000-macb", "cdns,macb"; |
190 | reg = <0xf802c000 0x100>; | 390 | reg = <0xf802c000 0x100>; |
191 | interrupts = <24 4 3>; | 391 | interrupts = <24 4 3>; |
392 | pinctrl-names = "default"; | ||
393 | pinctrl-0 = <&pinctrl_macb0_rmii>; | ||
192 | status = "disabled"; | 394 | status = "disabled"; |
193 | }; | 395 | }; |
194 | 396 | ||
@@ -273,6 +475,8 @@ | |||
273 | >; | 475 | >; |
274 | atmel,nand-addr-offset = <21>; | 476 | atmel,nand-addr-offset = <21>; |
275 | atmel,nand-cmd-offset = <22>; | 477 | atmel,nand-cmd-offset = <22>; |
478 | pinctrl-names = "default"; | ||
479 | pinctrl-0 = <&pinctrl_nand>; | ||
276 | gpios = <&pioD 5 0 | 480 | gpios = <&pioD 5 0 |
277 | &pioD 4 0 | 481 | &pioD 4 0 |
278 | 0 | 482 | 0 |
diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi new file mode 100644 index 000000000000..8a7cf1d9cf5d --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi | |||
@@ -0,0 +1,101 @@ | |||
1 | /* | ||
2 | * at91sam9x5ek.dtsi - Device Tree file for AT91SAM9x5CM Base board | ||
3 | * | ||
4 | * Copyright (C) 2012 Atmel, | ||
5 | * 2012 Nicolas Ferre <nicolas.ferre@atmel.com> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later. | ||
8 | */ | ||
9 | /include/ "at91sam9x5cm.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Atmel AT91SAM9X5-EK"; | ||
13 | compatible = "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | ||
14 | |||
15 | chosen { | ||
16 | bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; | ||
17 | }; | ||
18 | |||
19 | ahb { | ||
20 | apb { | ||
21 | mmc0: mmc@f0008000 { | ||
22 | pinctrl-0 = < | ||
23 | &pinctrl_board_mmc0 | ||
24 | &pinctrl_mmc0_slot0_clk_cmd_dat0 | ||
25 | &pinctrl_mmc0_slot0_dat1_3>; | ||
26 | status = "okay"; | ||
27 | slot@0 { | ||
28 | reg = <0>; | ||
29 | bus-width = <4>; | ||
30 | cd-gpios = <&pioD 15 0>; | ||
31 | }; | ||
32 | }; | ||
33 | |||
34 | mmc1: mmc@f000c000 { | ||
35 | pinctrl-0 = < | ||
36 | &pinctrl_board_mmc1 | ||
37 | &pinctrl_mmc1_slot0_clk_cmd_dat0 | ||
38 | &pinctrl_mmc1_slot0_dat1_3>; | ||
39 | status = "okay"; | ||
40 | slot@0 { | ||
41 | reg = <0>; | ||
42 | bus-width = <4>; | ||
43 | cd-gpios = <&pioD 14 0>; | ||
44 | }; | ||
45 | }; | ||
46 | |||
47 | dbgu: serial@fffff200 { | ||
48 | status = "okay"; | ||
49 | }; | ||
50 | |||
51 | usart0: serial@f801c000 { | ||
52 | status = "okay"; | ||
53 | }; | ||
54 | |||
55 | macb0: ethernet@f802c000 { | ||
56 | phy-mode = "rmii"; | ||
57 | status = "okay"; | ||
58 | }; | ||
59 | |||
60 | i2c0: i2c@f8010000 { | ||
61 | status = "okay"; | ||
62 | }; | ||
63 | |||
64 | i2c1: i2c@f8014000 { | ||
65 | status = "okay"; | ||
66 | }; | ||
67 | |||
68 | i2c2: i2c@f8018000 { | ||
69 | status = "okay"; | ||
70 | }; | ||
71 | |||
72 | pinctrl@fffff400 { | ||
73 | mmc0 { | ||
74 | pinctrl_board_mmc0: mmc0-board { | ||
75 | atmel,pins = | ||
76 | <3 15 0x0 0x5>; /* PD15 gpio CD pin pull up and deglitch */ | ||
77 | }; | ||
78 | }; | ||
79 | |||
80 | mmc1 { | ||
81 | pinctrl_board_mmc1: mmc1-board { | ||
82 | atmel,pins = | ||
83 | <3 14 0x0 0x5>; /* PD14 gpio CD pin pull up and deglitch */ | ||
84 | }; | ||
85 | }; | ||
86 | }; | ||
87 | }; | ||
88 | |||
89 | usb0: ohci@00600000 { | ||
90 | status = "okay"; | ||
91 | num-ports = <2>; | ||
92 | atmel,vbus-gpio = <&pioD 19 1 | ||
93 | &pioD 20 1 | ||
94 | >; | ||
95 | }; | ||
96 | |||
97 | usb1: ehci@00700000 { | ||
98 | status = "okay"; | ||
99 | }; | ||
100 | }; | ||
101 | }; | ||
diff --git a/arch/arm/boot/dts/pm9g45.dts b/arch/arm/boot/dts/pm9g45.dts new file mode 100644 index 000000000000..387fedb58988 --- /dev/null +++ b/arch/arm/boot/dts/pm9g45.dts | |||
@@ -0,0 +1,165 @@ | |||
1 | /* | ||
2 | * pm9g45.dts - Device Tree file for Ronetix pm9g45 board | ||
3 | * | ||
4 | * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Licensed under GPLv2. | ||
7 | */ | ||
8 | /dts-v1/; | ||
9 | /include/ "at91sam9g45.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Ronetix pm9g45"; | ||
13 | compatible = "ronetix,pm9g45", "atmel,at91sam9g45", "atmel,at91sam9"; | ||
14 | |||
15 | chosen { | ||
16 | bootargs = "console=ttyS0,115200"; | ||
17 | }; | ||
18 | |||
19 | memory { | ||
20 | reg = <0x70000000 0x8000000>; | ||
21 | }; | ||
22 | |||
23 | clocks { | ||
24 | #address-cells = <1>; | ||
25 | #size-cells = <1>; | ||
26 | ranges; | ||
27 | |||
28 | main_clock: clock@0 { | ||
29 | compatible = "atmel,osc", "fixed-clock"; | ||
30 | clock-frequency = <12000000>; | ||
31 | }; | ||
32 | }; | ||
33 | |||
34 | ahb { | ||
35 | apb { | ||
36 | dbgu: serial@ffffee00 { | ||
37 | status = "okay"; | ||
38 | }; | ||
39 | |||
40 | pinctrl@fffff200 { | ||
41 | |||
42 | board { | ||
43 | pinctrl_board_nand: nand0-board { | ||
44 | atmel,pins = | ||
45 | <3 3 0x0 0x1 /* PD3 gpio RDY pin pull_up*/ | ||
46 | 2 14 0x0 0x1>; /* PC14 gpio enable pin pull_up */ | ||
47 | }; | ||
48 | }; | ||
49 | |||
50 | mmc { | ||
51 | pinctrl_board_mmc: mmc0-board { | ||
52 | atmel,pins = | ||
53 | <3 6 0x0 0x5>; /* PD6 gpio CD pin pull_up and deglitch */ | ||
54 | }; | ||
55 | }; | ||
56 | }; | ||
57 | |||
58 | mmc0: mmc@fff80000 { | ||
59 | pinctrl-0 = < | ||
60 | &pinctrl_board_mmc | ||
61 | &pinctrl_mmc0_slot0_clk_cmd_dat0 | ||
62 | &pinctrl_mmc0_slot0_dat1_3>; | ||
63 | status = "okay"; | ||
64 | slot@0 { | ||
65 | reg = <0>; | ||
66 | bus-width = <4>; | ||
67 | cd-gpios = <&pioD 6 0>; | ||
68 | }; | ||
69 | }; | ||
70 | |||
71 | macb0: ethernet@fffbc000 { | ||
72 | phy-mode = "rmii"; | ||
73 | status = "okay"; | ||
74 | }; | ||
75 | |||
76 | }; | ||
77 | |||
78 | nand0: nand@40000000 { | ||
79 | nand-bus-width = <8>; | ||
80 | nand-ecc-mode = "soft"; | ||
81 | nand-on-flash-bbt; | ||
82 | pinctrl-0 = <&pinctrl_board_nand>; | ||
83 | |||
84 | gpios = <&pioD 3 0 | ||
85 | &pioC 14 0 | ||
86 | 0 | ||
87 | >; | ||
88 | |||
89 | status = "okay"; | ||
90 | |||
91 | at91bootstrap@0 { | ||
92 | label = "at91bootstrap"; | ||
93 | reg = <0x0 0x20000>; | ||
94 | }; | ||
95 | |||
96 | barebox@20000 { | ||
97 | label = "barebox"; | ||
98 | reg = <0x20000 0x40000>; | ||
99 | }; | ||
100 | |||
101 | bareboxenv@60000 { | ||
102 | label = "bareboxenv"; | ||
103 | reg = <0x60000 0x1A0000>; | ||
104 | }; | ||
105 | |||
106 | kernel@200000 { | ||
107 | label = "bareboxenv2"; | ||
108 | reg = <0x200000 0x300000>; | ||
109 | }; | ||
110 | |||
111 | kernel@500000 { | ||
112 | label = "root"; | ||
113 | reg = <0x500000 0x400000>; | ||
114 | }; | ||
115 | |||
116 | data@900000 { | ||
117 | label = "data"; | ||
118 | reg = <0x900000 0x8340000>; | ||
119 | }; | ||
120 | }; | ||
121 | |||
122 | usb0: ohci@00700000 { | ||
123 | status = "okay"; | ||
124 | num-ports = <2>; | ||
125 | }; | ||
126 | |||
127 | usb1: ehci@00800000 { | ||
128 | status = "okay"; | ||
129 | }; | ||
130 | }; | ||
131 | |||
132 | leds { | ||
133 | compatible = "gpio-leds"; | ||
134 | |||
135 | led0 { | ||
136 | label = "led0"; | ||
137 | gpios = <&pioD 0 1>; | ||
138 | linux,default-trigger = "nand-disk"; | ||
139 | }; | ||
140 | |||
141 | led1 { | ||
142 | label = "led1"; | ||
143 | gpios = <&pioD 31 0>; | ||
144 | linux,default-trigger = "heartbeat"; | ||
145 | }; | ||
146 | }; | ||
147 | |||
148 | gpio_keys { | ||
149 | compatible = "gpio-keys"; | ||
150 | #address-cells = <1>; | ||
151 | #size-cells = <0>; | ||
152 | |||
153 | right { | ||
154 | label = "SW4"; | ||
155 | gpios = <&pioE 7 1>; | ||
156 | linux,code = <106>; | ||
157 | }; | ||
158 | |||
159 | up { | ||
160 | label = "SW3"; | ||
161 | gpios = <&pioE 8 1>; | ||
162 | linux,code = <103>; | ||
163 | }; | ||
164 | }; | ||
165 | }; | ||
diff --git a/arch/arm/boot/dts/spear1310-evb.dts b/arch/arm/boot/dts/spear1310-evb.dts index dd4358bc26e2..2e4c5727468e 100644 --- a/arch/arm/boot/dts/spear1310-evb.dts +++ b/arch/arm/boot/dts/spear1310-evb.dts | |||
@@ -181,6 +181,10 @@ | |||
181 | status = "okay"; | 181 | status = "okay"; |
182 | }; | 182 | }; |
183 | 183 | ||
184 | gpio@d8400000 { | ||
185 | status = "okay"; | ||
186 | }; | ||
187 | |||
184 | i2c0: i2c@e0280000 { | 188 | i2c0: i2c@e0280000 { |
185 | status = "okay"; | 189 | status = "okay"; |
186 | }; | 190 | }; |
diff --git a/arch/arm/boot/dts/spear1310.dtsi b/arch/arm/boot/dts/spear1310.dtsi index 419ea7413d23..7cd25eb4f8e0 100644 --- a/arch/arm/boot/dts/spear1310.dtsi +++ b/arch/arm/boot/dts/spear1310.dtsi | |||
@@ -70,6 +70,12 @@ | |||
70 | status = "disabled"; | 70 | status = "disabled"; |
71 | }; | 71 | }; |
72 | 72 | ||
73 | pinmux: pinmux@e0700000 { | ||
74 | compatible = "st,spear1310-pinmux"; | ||
75 | reg = <0xe0700000 0x1000>; | ||
76 | #gpio-range-cells = <2>; | ||
77 | }; | ||
78 | |||
73 | spi1: spi@5d400000 { | 79 | spi1: spi@5d400000 { |
74 | compatible = "arm,pl022", "arm,primecell"; | 80 | compatible = "arm,pl022", "arm,primecell"; |
75 | reg = <0x5d400000 0x1000>; | 81 | reg = <0x5d400000 0x1000>; |
@@ -179,6 +185,27 @@ | |||
179 | thermal@e07008c4 { | 185 | thermal@e07008c4 { |
180 | st,thermal-flags = <0x7000>; | 186 | st,thermal-flags = <0x7000>; |
181 | }; | 187 | }; |
188 | |||
189 | gpiopinctrl: gpio@d8400000 { | ||
190 | compatible = "st,spear-plgpio"; | ||
191 | reg = <0xd8400000 0x1000>; | ||
192 | interrupts = <0 100 0x4>; | ||
193 | #interrupt-cells = <1>; | ||
194 | interrupt-controller; | ||
195 | gpio-controller; | ||
196 | #gpio-cells = <2>; | ||
197 | gpio-ranges = <&pinmux 0 246>; | ||
198 | status = "disabled"; | ||
199 | |||
200 | st-plgpio,ngpio = <246>; | ||
201 | st-plgpio,enb-reg = <0xd0>; | ||
202 | st-plgpio,wdata-reg = <0x90>; | ||
203 | st-plgpio,dir-reg = <0xb0>; | ||
204 | st-plgpio,ie-reg = <0x30>; | ||
205 | st-plgpio,rdata-reg = <0x70>; | ||
206 | st-plgpio,mis-reg = <0x10>; | ||
207 | st-plgpio,eit-reg = <0x50>; | ||
208 | }; | ||
182 | }; | 209 | }; |
183 | }; | 210 | }; |
184 | }; | 211 | }; |
diff --git a/arch/arm/boot/dts/spear1340-evb.dts b/arch/arm/boot/dts/spear1340-evb.dts index c9a54e06fb68..045f7123ffac 100644 --- a/arch/arm/boot/dts/spear1340-evb.dts +++ b/arch/arm/boot/dts/spear1340-evb.dts | |||
@@ -193,6 +193,10 @@ | |||
193 | status = "okay"; | 193 | status = "okay"; |
194 | }; | 194 | }; |
195 | 195 | ||
196 | gpio@e2800000 { | ||
197 | status = "okay"; | ||
198 | }; | ||
199 | |||
196 | i2c0: i2c@e0280000 { | 200 | i2c0: i2c@e0280000 { |
197 | status = "okay"; | 201 | status = "okay"; |
198 | }; | 202 | }; |
diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi index d71fe2a68f09..6c09eb0a1b2b 100644 --- a/arch/arm/boot/dts/spear1340.dtsi +++ b/arch/arm/boot/dts/spear1340.dtsi | |||
@@ -24,6 +24,12 @@ | |||
24 | status = "disabled"; | 24 | status = "disabled"; |
25 | }; | 25 | }; |
26 | 26 | ||
27 | pinmux: pinmux@e0700000 { | ||
28 | compatible = "st,spear1340-pinmux"; | ||
29 | reg = <0xe0700000 0x1000>; | ||
30 | #gpio-range-cells = <2>; | ||
31 | }; | ||
32 | |||
27 | spi1: spi@5d400000 { | 33 | spi1: spi@5d400000 { |
28 | compatible = "arm,pl022", "arm,primecell"; | 34 | compatible = "arm,pl022", "arm,primecell"; |
29 | reg = <0x5d400000 0x1000>; | 35 | reg = <0x5d400000 0x1000>; |
@@ -51,6 +57,26 @@ | |||
51 | thermal@e07008c4 { | 57 | thermal@e07008c4 { |
52 | st,thermal-flags = <0x2a00>; | 58 | st,thermal-flags = <0x2a00>; |
53 | }; | 59 | }; |
60 | |||
61 | gpiopinctrl: gpio@e2800000 { | ||
62 | compatible = "st,spear-plgpio"; | ||
63 | reg = <0xe2800000 0x1000>; | ||
64 | interrupts = <0 107 0x4>; | ||
65 | #interrupt-cells = <1>; | ||
66 | interrupt-controller; | ||
67 | gpio-controller; | ||
68 | #gpio-cells = <2>; | ||
69 | gpio-ranges = <&pinmux 0 252>; | ||
70 | status = "disabled"; | ||
71 | |||
72 | st-plgpio,ngpio = <250>; | ||
73 | st-plgpio,wdata-reg = <0x40>; | ||
74 | st-plgpio,dir-reg = <0x00>; | ||
75 | st-plgpio,ie-reg = <0x80>; | ||
76 | st-plgpio,rdata-reg = <0x20>; | ||
77 | st-plgpio,mis-reg = <0xa0>; | ||
78 | st-plgpio,eit-reg = <0x60>; | ||
79 | }; | ||
54 | }; | 80 | }; |
55 | }; | 81 | }; |
56 | }; | 82 | }; |
diff --git a/arch/arm/boot/dts/spear310.dtsi b/arch/arm/boot/dts/spear310.dtsi index 62fc4fb3e5f9..930303e48df9 100644 --- a/arch/arm/boot/dts/spear310.dtsi +++ b/arch/arm/boot/dts/spear310.dtsi | |||
@@ -22,9 +22,10 @@ | |||
22 | 0xb0000000 0xb0000000 0x10000000 | 22 | 0xb0000000 0xb0000000 0x10000000 |
23 | 0xd0000000 0xd0000000 0x30000000>; | 23 | 0xd0000000 0xd0000000 0x30000000>; |
24 | 24 | ||
25 | pinmux@b4000000 { | 25 | pinmux: pinmux@b4000000 { |
26 | compatible = "st,spear310-pinmux"; | 26 | compatible = "st,spear310-pinmux"; |
27 | reg = <0xb4000000 0x1000>; | 27 | reg = <0xb4000000 0x1000>; |
28 | #gpio-range-cells = <2>; | ||
28 | }; | 29 | }; |
29 | 30 | ||
30 | fsmc: flash@44000000 { | 31 | fsmc: flash@44000000 { |
@@ -75,6 +76,25 @@ | |||
75 | reg = <0xb2200000 0x1000>; | 76 | reg = <0xb2200000 0x1000>; |
76 | status = "disabled"; | 77 | status = "disabled"; |
77 | }; | 78 | }; |
79 | |||
80 | gpiopinctrl: gpio@b4000000 { | ||
81 | compatible = "st,spear-plgpio"; | ||
82 | reg = <0xb4000000 0x1000>; | ||
83 | #interrupt-cells = <1>; | ||
84 | interrupt-controller; | ||
85 | gpio-controller; | ||
86 | #gpio-cells = <2>; | ||
87 | gpio-ranges = <&pinmux 0 102>; | ||
88 | status = "disabled"; | ||
89 | |||
90 | st-plgpio,ngpio = <102>; | ||
91 | st-plgpio,enb-reg = <0x10>; | ||
92 | st-plgpio,wdata-reg = <0x20>; | ||
93 | st-plgpio,dir-reg = <0x30>; | ||
94 | st-plgpio,ie-reg = <0x50>; | ||
95 | st-plgpio,rdata-reg = <0x40>; | ||
96 | st-plgpio,mis-reg = <0x60>; | ||
97 | }; | ||
78 | }; | 98 | }; |
79 | }; | 99 | }; |
80 | }; | 100 | }; |
diff --git a/arch/arm/boot/dts/spear320-evb.dts b/arch/arm/boot/dts/spear320-evb.dts index 082328bd64ab..ad4bfc68ee05 100644 --- a/arch/arm/boot/dts/spear320-evb.dts +++ b/arch/arm/boot/dts/spear320-evb.dts | |||
@@ -164,6 +164,10 @@ | |||
164 | status = "okay"; | 164 | status = "okay"; |
165 | }; | 165 | }; |
166 | 166 | ||
167 | gpio@b3000000 { | ||
168 | status = "okay"; | ||
169 | }; | ||
170 | |||
167 | i2c0: i2c@d0180000 { | 171 | i2c0: i2c@d0180000 { |
168 | status = "okay"; | 172 | status = "okay"; |
169 | }; | 173 | }; |
diff --git a/arch/arm/boot/dts/spear320.dtsi b/arch/arm/boot/dts/spear320.dtsi index 1f49d69595a0..67d7ada71275 100644 --- a/arch/arm/boot/dts/spear320.dtsi +++ b/arch/arm/boot/dts/spear320.dtsi | |||
@@ -21,9 +21,10 @@ | |||
21 | ranges = <0x40000000 0x40000000 0x80000000 | 21 | ranges = <0x40000000 0x40000000 0x80000000 |
22 | 0xd0000000 0xd0000000 0x30000000>; | 22 | 0xd0000000 0xd0000000 0x30000000>; |
23 | 23 | ||
24 | pinmux@b3000000 { | 24 | pinmux: pinmux@b3000000 { |
25 | compatible = "st,spear320-pinmux"; | 25 | compatible = "st,spear320-pinmux"; |
26 | reg = <0xb3000000 0x1000>; | 26 | reg = <0xb3000000 0x1000>; |
27 | #gpio-range-cells = <2>; | ||
27 | }; | 28 | }; |
28 | 29 | ||
29 | clcd@90000000 { | 30 | clcd@90000000 { |
@@ -90,6 +91,26 @@ | |||
90 | reg = <0xa4000000 0x1000>; | 91 | reg = <0xa4000000 0x1000>; |
91 | status = "disabled"; | 92 | status = "disabled"; |
92 | }; | 93 | }; |
94 | |||
95 | gpiopinctrl: gpio@b3000000 { | ||
96 | compatible = "st,spear-plgpio"; | ||
97 | reg = <0xb3000000 0x1000>; | ||
98 | #interrupt-cells = <1>; | ||
99 | interrupt-controller; | ||
100 | gpio-controller; | ||
101 | #gpio-cells = <2>; | ||
102 | gpio-ranges = <&pinmux 0 102>; | ||
103 | status = "disabled"; | ||
104 | |||
105 | st-plgpio,ngpio = <102>; | ||
106 | st-plgpio,enb-reg = <0x24>; | ||
107 | st-plgpio,wdata-reg = <0x34>; | ||
108 | st-plgpio,dir-reg = <0x44>; | ||
109 | st-plgpio,ie-reg = <0x64>; | ||
110 | st-plgpio,rdata-reg = <0x54>; | ||
111 | st-plgpio,mis-reg = <0x84>; | ||
112 | st-plgpio,eit-reg = <0x94>; | ||
113 | }; | ||
93 | }; | 114 | }; |
94 | }; | 115 | }; |
95 | }; | 116 | }; |
diff --git a/arch/arm/configs/at91_dt_defconfig b/arch/arm/configs/at91_dt_defconfig index 67bc571ed0c3..b175577d7abb 100644 --- a/arch/arm/configs/at91_dt_defconfig +++ b/arch/arm/configs/at91_dt_defconfig | |||
@@ -111,6 +111,7 @@ CONFIG_I2C=y | |||
111 | CONFIG_I2C_GPIO=y | 111 | CONFIG_I2C_GPIO=y |
112 | CONFIG_SPI=y | 112 | CONFIG_SPI=y |
113 | CONFIG_SPI_ATMEL=y | 113 | CONFIG_SPI_ATMEL=y |
114 | CONFIG_PINCTRL_AT91=y | ||
114 | # CONFIG_HWMON is not set | 115 | # CONFIG_HWMON is not set |
115 | CONFIG_WATCHDOG=y | 116 | CONFIG_WATCHDOG=y |
116 | CONFIG_AT91SAM9X_WATCHDOG=y | 117 | CONFIG_AT91SAM9X_WATCHDOG=y |
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 043624219b55..e34c1bdb804d 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig | |||
@@ -494,8 +494,17 @@ endif | |||
494 | 494 | ||
495 | comment "Generic Board Type" | 495 | comment "Generic Board Type" |
496 | 496 | ||
497 | config MACH_AT91RM9200_DT | ||
498 | bool "Atmel AT91RM9200 Evaluation Kits with device-tree support" | ||
499 | depends on SOC_AT91RM9200 | ||
500 | select USE_OF | ||
501 | help | ||
502 | Select this if you want to experiment device-tree with | ||
503 | an Atmel RM9200 Evaluation Kit. | ||
504 | |||
497 | config MACH_AT91SAM_DT | 505 | config MACH_AT91SAM_DT |
498 | bool "Atmel AT91SAM Evaluation Kits with device-tree support" | 506 | bool "Atmel AT91SAM Evaluation Kits with device-tree support" |
507 | depends on SOC_AT91SAM9 | ||
499 | select USE_OF | 508 | select USE_OF |
500 | help | 509 | help |
501 | Select this if you want to experiment device-tree with | 510 | Select this if you want to experiment device-tree with |
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 3bb7a51efc9d..b38a1dcb79b8 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile | |||
@@ -88,6 +88,7 @@ obj-$(CONFIG_MACH_SNAPPER_9260) += board-snapper9260.o | |||
88 | obj-$(CONFIG_MACH_AT91SAM9M10G45EK) += board-sam9m10g45ek.o | 88 | obj-$(CONFIG_MACH_AT91SAM9M10G45EK) += board-sam9m10g45ek.o |
89 | 89 | ||
90 | # AT91SAM board with device-tree | 90 | # AT91SAM board with device-tree |
91 | obj-$(CONFIG_MACH_AT91RM9200_DT) += board-rm9200-dt.o | ||
91 | obj-$(CONFIG_MACH_AT91SAM_DT) += board-dt.o | 92 | obj-$(CONFIG_MACH_AT91SAM_DT) += board-dt.o |
92 | 93 | ||
93 | # AT91X40 board-specific support | 94 | # AT91X40 board-specific support |
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 5269825194a8..6cceb42a4c33 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c | |||
@@ -194,6 +194,24 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
194 | CLKDEV_CON_ID("pioB", &pioB_clk), | 194 | CLKDEV_CON_ID("pioB", &pioB_clk), |
195 | CLKDEV_CON_ID("pioC", &pioC_clk), | 195 | CLKDEV_CON_ID("pioC", &pioC_clk), |
196 | CLKDEV_CON_ID("pioD", &pioD_clk), | 196 | CLKDEV_CON_ID("pioD", &pioD_clk), |
197 | /* usart lookup table for DT entries */ | ||
198 | CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck), | ||
199 | CLKDEV_CON_DEV_ID("usart", "fffc0000.serial", &usart0_clk), | ||
200 | CLKDEV_CON_DEV_ID("usart", "fffc4000.serial", &usart1_clk), | ||
201 | CLKDEV_CON_DEV_ID("usart", "fffc8000.serial", &usart2_clk), | ||
202 | CLKDEV_CON_DEV_ID("usart", "fffcc000.serial", &usart3_clk), | ||
203 | /* tc lookup table for DT entries */ | ||
204 | CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk), | ||
205 | CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk), | ||
206 | CLKDEV_CON_DEV_ID("t2_clk", "fffa0000.timer", &tc2_clk), | ||
207 | CLKDEV_CON_DEV_ID("t0_clk", "fffa4000.timer", &tc3_clk), | ||
208 | CLKDEV_CON_DEV_ID("t1_clk", "fffa4000.timer", &tc4_clk), | ||
209 | CLKDEV_CON_DEV_ID("t2_clk", "fffa4000.timer", &tc5_clk), | ||
210 | CLKDEV_CON_DEV_ID("hclk", "300000.ohci", &ohci_clk), | ||
211 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioA_clk), | ||
212 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk), | ||
213 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk), | ||
214 | CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioD_clk), | ||
197 | }; | 215 | }; |
198 | 216 | ||
199 | static struct clk_lookup usart_clocks_lookups[] = { | 217 | static struct clk_lookup usart_clocks_lookups[] = { |
@@ -361,10 +379,10 @@ static unsigned int at91rm9200_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
361 | 0 /* Advanced Interrupt Controller (IRQ6) */ | 379 | 0 /* Advanced Interrupt Controller (IRQ6) */ |
362 | }; | 380 | }; |
363 | 381 | ||
364 | struct at91_init_soc __initdata at91rm9200_soc = { | 382 | AT91_SOC_START(rm9200) |
365 | .map_io = at91rm9200_map_io, | 383 | .map_io = at91rm9200_map_io, |
366 | .default_irq_priority = at91rm9200_default_irq_priority, | 384 | .default_irq_priority = at91rm9200_default_irq_priority, |
367 | .ioremap_registers = at91rm9200_ioremap_registers, | 385 | .ioremap_registers = at91rm9200_ioremap_registers, |
368 | .register_clocks = at91rm9200_register_clocks, | 386 | .register_clocks = at91rm9200_register_clocks, |
369 | .init = at91rm9200_initialize, | 387 | .init = at91rm9200_initialize, |
370 | }; | 388 | AT91_SOC_END |
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index aaa443b48c91..cafe98836c8a 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c | |||
@@ -24,6 +24,9 @@ | |||
24 | #include <linux/irq.h> | 24 | #include <linux/irq.h> |
25 | #include <linux/clockchips.h> | 25 | #include <linux/clockchips.h> |
26 | #include <linux/export.h> | 26 | #include <linux/export.h> |
27 | #include <linux/of.h> | ||
28 | #include <linux/of_address.h> | ||
29 | #include <linux/of_irq.h> | ||
27 | 30 | ||
28 | #include <asm/mach/time.h> | 31 | #include <asm/mach/time.h> |
29 | 32 | ||
@@ -91,7 +94,8 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id) | |||
91 | static struct irqaction at91rm9200_timer_irq = { | 94 | static struct irqaction at91rm9200_timer_irq = { |
92 | .name = "at91_tick", | 95 | .name = "at91_tick", |
93 | .flags = IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | 96 | .flags = IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, |
94 | .handler = at91rm9200_timer_interrupt | 97 | .handler = at91rm9200_timer_interrupt, |
98 | .irq = NR_IRQS_LEGACY + AT91_ID_SYS, | ||
95 | }; | 99 | }; |
96 | 100 | ||
97 | static cycle_t read_clk32k(struct clocksource *cs) | 101 | static cycle_t read_clk32k(struct clocksource *cs) |
@@ -179,8 +183,60 @@ static struct clock_event_device clkevt = { | |||
179 | void __iomem *at91_st_base; | 183 | void __iomem *at91_st_base; |
180 | EXPORT_SYMBOL_GPL(at91_st_base); | 184 | EXPORT_SYMBOL_GPL(at91_st_base); |
181 | 185 | ||
186 | #ifdef CONFIG_OF | ||
187 | static struct of_device_id at91rm9200_st_timer_ids[] = { | ||
188 | { .compatible = "atmel,at91rm9200-st" }, | ||
189 | { /* sentinel */ } | ||
190 | }; | ||
191 | |||
192 | static int __init of_at91rm9200_st_init(void) | ||
193 | { | ||
194 | struct device_node *np; | ||
195 | int ret; | ||
196 | |||
197 | np = of_find_matching_node(NULL, at91rm9200_st_timer_ids); | ||
198 | if (!np) | ||
199 | goto err; | ||
200 | |||
201 | at91_st_base = of_iomap(np, 0); | ||
202 | if (!at91_st_base) | ||
203 | goto node_err; | ||
204 | |||
205 | /* Get the interrupts property */ | ||
206 | ret = irq_of_parse_and_map(np, 0); | ||
207 | if (!ret) | ||
208 | goto ioremap_err; | ||
209 | at91rm9200_timer_irq.irq = ret; | ||
210 | |||
211 | of_node_put(np); | ||
212 | |||
213 | return 0; | ||
214 | |||
215 | ioremap_err: | ||
216 | iounmap(at91_st_base); | ||
217 | node_err: | ||
218 | of_node_put(np); | ||
219 | err: | ||
220 | return -EINVAL; | ||
221 | } | ||
222 | #else | ||
223 | static int __init of_at91rm9200_st_init(void) | ||
224 | { | ||
225 | return -EINVAL; | ||
226 | } | ||
227 | #endif | ||
228 | |||
182 | void __init at91rm9200_ioremap_st(u32 addr) | 229 | void __init at91rm9200_ioremap_st(u32 addr) |
183 | { | 230 | { |
231 | #ifdef CONFIG_OF | ||
232 | struct device_node *np; | ||
233 | |||
234 | np = of_find_matching_node(NULL, at91rm9200_st_timer_ids); | ||
235 | if (np) { | ||
236 | of_node_put(np); | ||
237 | return; | ||
238 | } | ||
239 | #endif | ||
184 | at91_st_base = ioremap(addr, 256); | 240 | at91_st_base = ioremap(addr, 256); |
185 | if (!at91_st_base) | 241 | if (!at91_st_base) |
186 | panic("Impossible to ioremap ST\n"); | 242 | panic("Impossible to ioremap ST\n"); |
@@ -191,13 +247,16 @@ void __init at91rm9200_ioremap_st(u32 addr) | |||
191 | */ | 247 | */ |
192 | void __init at91rm9200_timer_init(void) | 248 | void __init at91rm9200_timer_init(void) |
193 | { | 249 | { |
250 | /* For device tree enabled device: initialize here */ | ||
251 | of_at91rm9200_st_init(); | ||
252 | |||
194 | /* Disable all timer interrupts, and clear any pending ones */ | 253 | /* Disable all timer interrupts, and clear any pending ones */ |
195 | at91_st_write(AT91_ST_IDR, | 254 | at91_st_write(AT91_ST_IDR, |
196 | AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS); | 255 | AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS); |
197 | at91_st_read(AT91_ST_SR); | 256 | at91_st_read(AT91_ST_SR); |
198 | 257 | ||
199 | /* Make IRQs happen for the system timer */ | 258 | /* Make IRQs happen for the system timer */ |
200 | setup_irq(NR_IRQS_LEGACY + AT91_ID_SYS, &at91rm9200_timer_irq); | 259 | setup_irq(at91rm9200_timer_irq.irq, &at91rm9200_timer_irq); |
201 | 260 | ||
202 | /* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used | 261 | /* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used |
203 | * directly for the clocksource and all clockevents, after adjusting | 262 | * directly for the clocksource and all clockevents, after adjusting |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index f8202615f4a8..c9e029e44d8a 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
@@ -230,11 +230,15 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
230 | CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk), | 230 | CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk), |
231 | CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk), | 231 | CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk), |
232 | CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk), | 232 | CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk), |
233 | CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk), | ||
233 | /* fake hclk clock */ | 234 | /* fake hclk clock */ |
234 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), | 235 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), |
235 | CLKDEV_CON_ID("pioA", &pioA_clk), | 236 | CLKDEV_CON_ID("pioA", &pioA_clk), |
236 | CLKDEV_CON_ID("pioB", &pioB_clk), | 237 | CLKDEV_CON_ID("pioB", &pioB_clk), |
237 | CLKDEV_CON_ID("pioC", &pioC_clk), | 238 | CLKDEV_CON_ID("pioC", &pioC_clk), |
239 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioA_clk), | ||
240 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk), | ||
241 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk), | ||
238 | }; | 242 | }; |
239 | 243 | ||
240 | static struct clk_lookup usart_clocks_lookups[] = { | 244 | static struct clk_lookup usart_clocks_lookups[] = { |
@@ -390,10 +394,10 @@ static unsigned int at91sam9260_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
390 | 0, /* Advanced Interrupt Controller */ | 394 | 0, /* Advanced Interrupt Controller */ |
391 | }; | 395 | }; |
392 | 396 | ||
393 | struct at91_init_soc __initdata at91sam9260_soc = { | 397 | AT91_SOC_START(sam9260) |
394 | .map_io = at91sam9260_map_io, | 398 | .map_io = at91sam9260_map_io, |
395 | .default_irq_priority = at91sam9260_default_irq_priority, | 399 | .default_irq_priority = at91sam9260_default_irq_priority, |
396 | .ioremap_registers = at91sam9260_ioremap_registers, | 400 | .ioremap_registers = at91sam9260_ioremap_registers, |
397 | .register_clocks = at91sam9260_register_clocks, | 401 | .register_clocks = at91sam9260_register_clocks, |
398 | .init = at91sam9260_initialize, | 402 | .init = at91sam9260_initialize, |
399 | }; | 403 | AT91_SOC_END |
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index 04295c04b3e0..4d262f346fd9 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
@@ -334,10 +334,10 @@ static unsigned int at91sam9261_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
334 | 0, /* Advanced Interrupt Controller */ | 334 | 0, /* Advanced Interrupt Controller */ |
335 | }; | 335 | }; |
336 | 336 | ||
337 | struct at91_init_soc __initdata at91sam9261_soc = { | 337 | AT91_SOC_START(sam9261) |
338 | .map_io = at91sam9261_map_io, | 338 | .map_io = at91sam9261_map_io, |
339 | .default_irq_priority = at91sam9261_default_irq_priority, | 339 | .default_irq_priority = at91sam9261_default_irq_priority, |
340 | .ioremap_registers = at91sam9261_ioremap_registers, | 340 | .ioremap_registers = at91sam9261_ioremap_registers, |
341 | .register_clocks = at91sam9261_register_clocks, | 341 | .register_clocks = at91sam9261_register_clocks, |
342 | .init = at91sam9261_initialize, | 342 | .init = at91sam9261_initialize, |
343 | }; | 343 | AT91_SOC_END |
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index d6f9c23927c4..ed390f6fa232 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
@@ -211,7 +211,14 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
211 | CLKDEV_CON_DEV_ID("hclk", "a00000.ohci", &ohci_clk), | 211 | CLKDEV_CON_DEV_ID("hclk", "a00000.ohci", &ohci_clk), |
212 | CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk), | 212 | CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk), |
213 | CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk), | 213 | CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk), |
214 | CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk), | ||
215 | CLKDEV_CON_DEV_ID("mci_clk", "fff84000.mmc", &mmc1_clk), | ||
214 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi_clk), | 216 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi_clk), |
217 | CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), | ||
218 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioB_clk), | ||
219 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioCDE_clk), | ||
220 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCDE_clk), | ||
221 | CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCDE_clk), | ||
215 | }; | 222 | }; |
216 | 223 | ||
217 | static struct clk_lookup usart_clocks_lookups[] = { | 224 | static struct clk_lookup usart_clocks_lookups[] = { |
@@ -365,10 +372,10 @@ static unsigned int at91sam9263_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
365 | 0, /* Advanced Interrupt Controller (IRQ1) */ | 372 | 0, /* Advanced Interrupt Controller (IRQ1) */ |
366 | }; | 373 | }; |
367 | 374 | ||
368 | struct at91_init_soc __initdata at91sam9263_soc = { | 375 | AT91_SOC_START(sam9263) |
369 | .map_io = at91sam9263_map_io, | 376 | .map_io = at91sam9263_map_io, |
370 | .default_irq_priority = at91sam9263_default_irq_priority, | 377 | .default_irq_priority = at91sam9263_default_irq_priority, |
371 | .ioremap_registers = at91sam9263_ioremap_registers, | 378 | .ioremap_registers = at91sam9263_ioremap_registers, |
372 | .register_clocks = at91sam9263_register_clocks, | 379 | .register_clocks = at91sam9263_register_clocks, |
373 | .init = at91sam9263_initialize, | 380 | .init = at91sam9263_initialize, |
374 | }; | 381 | AT91_SOC_END |
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 84af1b506d92..c5c2acc4bf22 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
@@ -256,10 +256,18 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
256 | CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk), | 256 | CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk), |
257 | CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk), | 257 | CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk), |
258 | CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk), | 258 | CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk), |
259 | CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk), | ||
260 | CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk), | ||
259 | CLKDEV_CON_DEV_ID(NULL, "fff84000.i2c", &twi0_clk), | 261 | CLKDEV_CON_DEV_ID(NULL, "fff84000.i2c", &twi0_clk), |
260 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi1_clk), | 262 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi1_clk), |
261 | /* fake hclk clock */ | 263 | /* fake hclk clock */ |
262 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), | 264 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), |
265 | CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), | ||
266 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioB_clk), | ||
267 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioC_clk), | ||
268 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioDE_clk), | ||
269 | CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioDE_clk), | ||
270 | |||
263 | CLKDEV_CON_ID("pioA", &pioA_clk), | 271 | CLKDEV_CON_ID("pioA", &pioA_clk), |
264 | CLKDEV_CON_ID("pioB", &pioB_clk), | 272 | CLKDEV_CON_ID("pioB", &pioB_clk), |
265 | CLKDEV_CON_ID("pioC", &pioC_clk), | 273 | CLKDEV_CON_ID("pioC", &pioC_clk), |
@@ -409,10 +417,10 @@ static unsigned int at91sam9g45_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
409 | 0, /* Advanced Interrupt Controller (IRQ0) */ | 417 | 0, /* Advanced Interrupt Controller (IRQ0) */ |
410 | }; | 418 | }; |
411 | 419 | ||
412 | struct at91_init_soc __initdata at91sam9g45_soc = { | 420 | AT91_SOC_START(sam9g45) |
413 | .map_io = at91sam9g45_map_io, | 421 | .map_io = at91sam9g45_map_io, |
414 | .default_irq_priority = at91sam9g45_default_irq_priority, | 422 | .default_irq_priority = at91sam9g45_default_irq_priority, |
415 | .ioremap_registers = at91sam9g45_ioremap_registers, | 423 | .ioremap_registers = at91sam9g45_ioremap_registers, |
416 | .register_clocks = at91sam9g45_register_clocks, | 424 | .register_clocks = at91sam9g45_register_clocks, |
417 | .init = at91sam9g45_initialize, | 425 | .init = at91sam9g45_initialize, |
418 | }; | 426 | AT91_SOC_END |
diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c index 732d3d3f4ec5..70b3a99244ab 100644 --- a/arch/arm/mach-at91/at91sam9n12.c +++ b/arch/arm/mach-at91/at91sam9n12.c | |||
@@ -168,13 +168,14 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
168 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), | 168 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), |
169 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb_clk), | 169 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb_clk), |
170 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb_clk), | 170 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb_clk), |
171 | CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc_clk), | ||
171 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk), | 172 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk), |
172 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), | 173 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), |
173 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), | 174 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), |
174 | CLKDEV_CON_ID("pioA", &pioAB_clk), | 175 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), |
175 | CLKDEV_CON_ID("pioB", &pioAB_clk), | 176 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), |
176 | CLKDEV_CON_ID("pioC", &pioCD_clk), | 177 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), |
177 | CLKDEV_CON_ID("pioD", &pioCD_clk), | 178 | CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCD_clk), |
178 | /* additional fake clock for macb_hclk */ | 179 | /* additional fake clock for macb_hclk */ |
179 | CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &uhp_clk), | 180 | CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &uhp_clk), |
180 | CLKDEV_CON_DEV_ID("ohci_clk", "500000.ohci", &uhp_clk), | 181 | CLKDEV_CON_DEV_ID("ohci_clk", "500000.ohci", &uhp_clk), |
@@ -223,13 +224,10 @@ static void __init at91sam9n12_map_io(void) | |||
223 | void __init at91sam9n12_initialize(void) | 224 | void __init at91sam9n12_initialize(void) |
224 | { | 225 | { |
225 | at91_extern_irq = (1 << AT91SAM9N12_ID_IRQ0); | 226 | at91_extern_irq = (1 << AT91SAM9N12_ID_IRQ0); |
226 | |||
227 | /* Register GPIO subsystem (using DT) */ | ||
228 | at91_gpio_init(NULL, 0); | ||
229 | } | 227 | } |
230 | 228 | ||
231 | struct at91_init_soc __initdata at91sam9n12_soc = { | 229 | AT91_SOC_START(sam9n12) |
232 | .map_io = at91sam9n12_map_io, | 230 | .map_io = at91sam9n12_map_io, |
233 | .register_clocks = at91sam9n12_register_clocks, | 231 | .register_clocks = at91sam9n12_register_clocks, |
234 | .init = at91sam9n12_initialize, | 232 | .init = at91sam9n12_initialize, |
235 | }; | 233 | AT91_SOC_END |
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 72e908412222..cbe72e44c13f 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
@@ -338,10 +338,10 @@ static unsigned int at91sam9rl_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
338 | 0, /* Advanced Interrupt Controller */ | 338 | 0, /* Advanced Interrupt Controller */ |
339 | }; | 339 | }; |
340 | 340 | ||
341 | struct at91_init_soc __initdata at91sam9rl_soc = { | 341 | AT91_SOC_START(sam9rl) |
342 | .map_io = at91sam9rl_map_io, | 342 | .map_io = at91sam9rl_map_io, |
343 | .default_irq_priority = at91sam9rl_default_irq_priority, | 343 | .default_irq_priority = at91sam9rl_default_irq_priority, |
344 | .ioremap_registers = at91sam9rl_ioremap_registers, | 344 | .ioremap_registers = at91sam9rl_ioremap_registers, |
345 | .register_clocks = at91sam9rl_register_clocks, | 345 | .register_clocks = at91sam9rl_register_clocks, |
346 | .init = at91sam9rl_initialize, | 346 | .init = at91sam9rl_initialize, |
347 | }; | 347 | AT91_SOC_END |
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index e5035380dcbc..3c729f0e2d3c 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c | |||
@@ -229,15 +229,17 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
229 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), | 229 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), |
230 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), | 230 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), |
231 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), | 231 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), |
232 | CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk), | ||
233 | CLKDEV_CON_DEV_ID("mci_clk", "f000c000.mmc", &mmc1_clk), | ||
232 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk), | 234 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk), |
233 | CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk), | 235 | CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk), |
234 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), | 236 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), |
235 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), | 237 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), |
236 | CLKDEV_CON_DEV_ID(NULL, "f8018000.i2c", &twi2_clk), | 238 | CLKDEV_CON_DEV_ID(NULL, "f8018000.i2c", &twi2_clk), |
237 | CLKDEV_CON_ID("pioA", &pioAB_clk), | 239 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), |
238 | CLKDEV_CON_ID("pioB", &pioAB_clk), | 240 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), |
239 | CLKDEV_CON_ID("pioC", &pioCD_clk), | 241 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), |
240 | CLKDEV_CON_ID("pioD", &pioCD_clk), | 242 | CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCD_clk), |
241 | /* additional fake clock for macb_hclk */ | 243 | /* additional fake clock for macb_hclk */ |
242 | CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb0_clk), | 244 | CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb0_clk), |
243 | CLKDEV_CON_DEV_ID("hclk", "f8030000.ethernet", &macb1_clk), | 245 | CLKDEV_CON_DEV_ID("hclk", "f8030000.ethernet", &macb1_clk), |
@@ -313,18 +315,11 @@ static void __init at91sam9x5_map_io(void) | |||
313 | at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE); | 315 | at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE); |
314 | } | 316 | } |
315 | 317 | ||
316 | void __init at91sam9x5_initialize(void) | ||
317 | { | ||
318 | /* Register GPIO subsystem (using DT) */ | ||
319 | at91_gpio_init(NULL, 0); | ||
320 | } | ||
321 | |||
322 | /* -------------------------------------------------------------------- | 318 | /* -------------------------------------------------------------------- |
323 | * Interrupt initialization | 319 | * Interrupt initialization |
324 | * -------------------------------------------------------------------- */ | 320 | * -------------------------------------------------------------------- */ |
325 | 321 | ||
326 | struct at91_init_soc __initdata at91sam9x5_soc = { | 322 | AT91_SOC_START(sam9x5) |
327 | .map_io = at91sam9x5_map_io, | 323 | .map_io = at91sam9x5_map_io, |
328 | .register_clocks = at91sam9x5_register_clocks, | 324 | .register_clocks = at91sam9x5_register_clocks, |
329 | .init = at91sam9x5_initialize, | 325 | AT91_SOC_END |
330 | }; | ||
diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c index e8f45c4e0ea8..3b6a94820fa0 100644 --- a/arch/arm/mach-at91/board-dt.c +++ b/arch/arm/mach-at91/board-dt.c | |||
@@ -30,8 +30,6 @@ | |||
30 | static const struct of_device_id irq_of_match[] __initconst = { | 30 | static const struct of_device_id irq_of_match[] __initconst = { |
31 | 31 | ||
32 | { .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, | 32 | { .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, |
33 | { .compatible = "atmel,at91rm9200-gpio", .data = at91_gpio_of_irq_setup }, | ||
34 | { .compatible = "atmel,at91sam9x5-gpio", .data = at91_gpio_of_irq_setup }, | ||
35 | { /*sentinel*/ } | 33 | { /*sentinel*/ } |
36 | }; | 34 | }; |
37 | 35 | ||
diff --git a/arch/arm/mach-at91/board-rm9200-dt.c b/arch/arm/mach-at91/board-rm9200-dt.c new file mode 100644 index 000000000000..5f9ce3da3fde --- /dev/null +++ b/arch/arm/mach-at91/board-rm9200-dt.c | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | * Setup code for AT91RM9200 Evaluation Kits with Device Tree support | ||
3 | * | ||
4 | * Copyright (C) 2011 Atmel, | ||
5 | * 2011 Nicolas Ferre <nicolas.ferre@atmel.com> | ||
6 | * 2012 Joachim Eastwood <manabian@gmail.com> | ||
7 | * | ||
8 | * Licensed under GPLv2 or later. | ||
9 | */ | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/gpio.h> | ||
15 | #include <linux/of.h> | ||
16 | #include <linux/of_irq.h> | ||
17 | #include <linux/of_platform.h> | ||
18 | |||
19 | #include <asm/setup.h> | ||
20 | #include <asm/irq.h> | ||
21 | #include <asm/mach/arch.h> | ||
22 | #include <asm/mach/map.h> | ||
23 | #include <asm/mach/irq.h> | ||
24 | |||
25 | #include "at91_aic.h" | ||
26 | #include "generic.h" | ||
27 | |||
28 | |||
29 | static const struct of_device_id irq_of_match[] __initconst = { | ||
30 | { .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, | ||
31 | { /*sentinel*/ } | ||
32 | }; | ||
33 | |||
34 | static void __init at91rm9200_dt_init_irq(void) | ||
35 | { | ||
36 | of_irq_init(irq_of_match); | ||
37 | } | ||
38 | |||
39 | static void __init at91rm9200_dt_device_init(void) | ||
40 | { | ||
41 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | ||
42 | } | ||
43 | |||
44 | static const char *at91rm9200_dt_board_compat[] __initdata = { | ||
45 | "atmel,at91rm9200", | ||
46 | NULL | ||
47 | }; | ||
48 | |||
49 | DT_MACHINE_START(at91rm9200_dt, "Atmel AT91RM9200 (Device Tree)") | ||
50 | .timer = &at91rm9200_timer, | ||
51 | .map_io = at91_map_io, | ||
52 | .handle_irq = at91_aic_handle_irq, | ||
53 | .init_early = at91rm9200_dt_initialize, | ||
54 | .init_irq = at91rm9200_dt_init_irq, | ||
55 | .init_machine = at91rm9200_dt_device_init, | ||
56 | .dt_compat = at91rm9200_dt_board_compat, | ||
57 | MACHINE_END | ||
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index b62f560e6c75..fc593d615e7d 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h | |||
@@ -20,6 +20,7 @@ extern void __init at91_init_sram(int bank, unsigned long base, | |||
20 | extern void __init at91rm9200_set_type(int type); | 20 | extern void __init at91rm9200_set_type(int type); |
21 | extern void __init at91_initialize(unsigned long main_clock); | 21 | extern void __init at91_initialize(unsigned long main_clock); |
22 | extern void __init at91x40_initialize(unsigned long main_clock); | 22 | extern void __init at91x40_initialize(unsigned long main_clock); |
23 | extern void __init at91rm9200_dt_initialize(void); | ||
23 | extern void __init at91_dt_initialize(void); | 24 | extern void __init at91_dt_initialize(void); |
24 | 25 | ||
25 | /* Interrupts */ | 26 | /* Interrupts */ |
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index be42cf0e74bd..c5d7e1e9d757 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c | |||
@@ -23,8 +23,6 @@ | |||
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/irqdomain.h> | 24 | #include <linux/irqdomain.h> |
25 | #include <linux/of_address.h> | 25 | #include <linux/of_address.h> |
26 | #include <linux/of_irq.h> | ||
27 | #include <linux/of_gpio.h> | ||
28 | 26 | ||
29 | #include <asm/mach/irq.h> | 27 | #include <asm/mach/irq.h> |
30 | 28 | ||
@@ -33,6 +31,8 @@ | |||
33 | 31 | ||
34 | #include "generic.h" | 32 | #include "generic.h" |
35 | 33 | ||
34 | #define MAX_NB_GPIO_PER_BANK 32 | ||
35 | |||
36 | struct at91_gpio_chip { | 36 | struct at91_gpio_chip { |
37 | struct gpio_chip chip; | 37 | struct gpio_chip chip; |
38 | struct at91_gpio_chip *next; /* Bank sharing same clock */ | 38 | struct at91_gpio_chip *next; /* Bank sharing same clock */ |
@@ -46,6 +46,7 @@ struct at91_gpio_chip { | |||
46 | 46 | ||
47 | #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip) | 47 | #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip) |
48 | 48 | ||
49 | static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset); | ||
49 | static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip); | 50 | static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip); |
50 | static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val); | 51 | static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val); |
51 | static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset); | 52 | static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset); |
@@ -55,26 +56,27 @@ static int at91_gpiolib_direction_input(struct gpio_chip *chip, | |||
55 | unsigned offset); | 56 | unsigned offset); |
56 | static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset); | 57 | static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset); |
57 | 58 | ||
58 | #define AT91_GPIO_CHIP(name, nr_gpio) \ | 59 | #define AT91_GPIO_CHIP(name) \ |
59 | { \ | 60 | { \ |
60 | .chip = { \ | 61 | .chip = { \ |
61 | .label = name, \ | 62 | .label = name, \ |
63 | .request = at91_gpiolib_request, \ | ||
62 | .direction_input = at91_gpiolib_direction_input, \ | 64 | .direction_input = at91_gpiolib_direction_input, \ |
63 | .direction_output = at91_gpiolib_direction_output, \ | 65 | .direction_output = at91_gpiolib_direction_output, \ |
64 | .get = at91_gpiolib_get, \ | 66 | .get = at91_gpiolib_get, \ |
65 | .set = at91_gpiolib_set, \ | 67 | .set = at91_gpiolib_set, \ |
66 | .dbg_show = at91_gpiolib_dbg_show, \ | 68 | .dbg_show = at91_gpiolib_dbg_show, \ |
67 | .to_irq = at91_gpiolib_to_irq, \ | 69 | .to_irq = at91_gpiolib_to_irq, \ |
68 | .ngpio = nr_gpio, \ | 70 | .ngpio = MAX_NB_GPIO_PER_BANK, \ |
69 | }, \ | 71 | }, \ |
70 | } | 72 | } |
71 | 73 | ||
72 | static struct at91_gpio_chip gpio_chip[] = { | 74 | static struct at91_gpio_chip gpio_chip[] = { |
73 | AT91_GPIO_CHIP("pioA", 32), | 75 | AT91_GPIO_CHIP("pioA"), |
74 | AT91_GPIO_CHIP("pioB", 32), | 76 | AT91_GPIO_CHIP("pioB"), |
75 | AT91_GPIO_CHIP("pioC", 32), | 77 | AT91_GPIO_CHIP("pioC"), |
76 | AT91_GPIO_CHIP("pioD", 32), | 78 | AT91_GPIO_CHIP("pioD"), |
77 | AT91_GPIO_CHIP("pioE", 32), | 79 | AT91_GPIO_CHIP("pioE"), |
78 | }; | 80 | }; |
79 | 81 | ||
80 | static int gpio_banks; | 82 | static int gpio_banks; |
@@ -89,7 +91,7 @@ static unsigned long at91_gpio_caps; | |||
89 | 91 | ||
90 | static inline void __iomem *pin_to_controller(unsigned pin) | 92 | static inline void __iomem *pin_to_controller(unsigned pin) |
91 | { | 93 | { |
92 | pin /= 32; | 94 | pin /= MAX_NB_GPIO_PER_BANK; |
93 | if (likely(pin < gpio_banks)) | 95 | if (likely(pin < gpio_banks)) |
94 | return gpio_chip[pin].regbase; | 96 | return gpio_chip[pin].regbase; |
95 | 97 | ||
@@ -98,7 +100,7 @@ static inline void __iomem *pin_to_controller(unsigned pin) | |||
98 | 100 | ||
99 | static inline unsigned pin_to_mask(unsigned pin) | 101 | static inline unsigned pin_to_mask(unsigned pin) |
100 | { | 102 | { |
101 | return 1 << (pin % 32); | 103 | return 1 << (pin % MAX_NB_GPIO_PER_BANK); |
102 | } | 104 | } |
103 | 105 | ||
104 | 106 | ||
@@ -713,80 +715,6 @@ postcore_initcall(at91_gpio_debugfs_init); | |||
713 | */ | 715 | */ |
714 | static struct lock_class_key gpio_lock_class; | 716 | static struct lock_class_key gpio_lock_class; |
715 | 717 | ||
716 | #if defined(CONFIG_OF) | ||
717 | static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq, | ||
718 | irq_hw_number_t hw) | ||
719 | { | ||
720 | struct at91_gpio_chip *at91_gpio = h->host_data; | ||
721 | |||
722 | irq_set_lockdep_class(virq, &gpio_lock_class); | ||
723 | |||
724 | /* | ||
725 | * Can use the "simple" and not "edge" handler since it's | ||
726 | * shorter, and the AIC handles interrupts sanely. | ||
727 | */ | ||
728 | irq_set_chip_and_handler(virq, &gpio_irqchip, | ||
729 | handle_simple_irq); | ||
730 | set_irq_flags(virq, IRQF_VALID); | ||
731 | irq_set_chip_data(virq, at91_gpio); | ||
732 | |||
733 | return 0; | ||
734 | } | ||
735 | |||
736 | static struct irq_domain_ops at91_gpio_ops = { | ||
737 | .map = at91_gpio_irq_map, | ||
738 | .xlate = irq_domain_xlate_twocell, | ||
739 | }; | ||
740 | |||
741 | int __init at91_gpio_of_irq_setup(struct device_node *node, | ||
742 | struct device_node *parent) | ||
743 | { | ||
744 | struct at91_gpio_chip *prev = NULL; | ||
745 | int alias_idx = of_alias_get_id(node, "gpio"); | ||
746 | struct at91_gpio_chip *at91_gpio = &gpio_chip[alias_idx]; | ||
747 | |||
748 | /* Setup proper .irq_set_type function */ | ||
749 | if (has_pio3()) | ||
750 | gpio_irqchip.irq_set_type = alt_gpio_irq_type; | ||
751 | else | ||
752 | gpio_irqchip.irq_set_type = gpio_irq_type; | ||
753 | |||
754 | /* Disable irqs of this PIO controller */ | ||
755 | __raw_writel(~0, at91_gpio->regbase + PIO_IDR); | ||
756 | |||
757 | /* Setup irq domain */ | ||
758 | at91_gpio->domain = irq_domain_add_linear(node, at91_gpio->chip.ngpio, | ||
759 | &at91_gpio_ops, at91_gpio); | ||
760 | if (!at91_gpio->domain) | ||
761 | panic("at91_gpio.%d: couldn't allocate irq domain (DT).\n", | ||
762 | at91_gpio->pioc_idx); | ||
763 | |||
764 | /* Setup chained handler */ | ||
765 | if (at91_gpio->pioc_idx) | ||
766 | prev = &gpio_chip[at91_gpio->pioc_idx - 1]; | ||
767 | |||
768 | /* The toplevel handler handles one bank of GPIOs, except | ||
769 | * on some SoC it can handles up to three... | ||
770 | * We only set up the handler for the first of the list. | ||
771 | */ | ||
772 | if (prev && prev->next == at91_gpio) | ||
773 | return 0; | ||
774 | |||
775 | at91_gpio->pioc_virq = irq_create_mapping(irq_find_host(parent), | ||
776 | at91_gpio->pioc_hwirq); | ||
777 | irq_set_chip_data(at91_gpio->pioc_virq, at91_gpio); | ||
778 | irq_set_chained_handler(at91_gpio->pioc_virq, gpio_irq_handler); | ||
779 | |||
780 | return 0; | ||
781 | } | ||
782 | #else | ||
783 | int __init at91_gpio_of_irq_setup(struct device_node *node, | ||
784 | struct device_node *parent) | ||
785 | { | ||
786 | return -EINVAL; | ||
787 | } | ||
788 | #endif | ||
789 | |||
790 | /* | 718 | /* |
791 | * irqdomain initialization: pile up irqdomains on top of AIC range | 719 | * irqdomain initialization: pile up irqdomains on top of AIC range |
792 | */ | 720 | */ |
@@ -862,6 +790,16 @@ void __init at91_gpio_irq_setup(void) | |||
862 | } | 790 | } |
863 | 791 | ||
864 | /* gpiolib support */ | 792 | /* gpiolib support */ |
793 | static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset) | ||
794 | { | ||
795 | struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); | ||
796 | void __iomem *pio = at91_gpio->regbase; | ||
797 | unsigned mask = 1 << offset; | ||
798 | |||
799 | __raw_writel(mask, pio + PIO_PER); | ||
800 | return 0; | ||
801 | } | ||
802 | |||
865 | static int at91_gpiolib_direction_input(struct gpio_chip *chip, | 803 | static int at91_gpiolib_direction_input(struct gpio_chip *chip, |
866 | unsigned offset) | 804 | unsigned offset) |
867 | { | 805 | { |
@@ -975,81 +913,11 @@ err: | |||
975 | return -EINVAL; | 913 | return -EINVAL; |
976 | } | 914 | } |
977 | 915 | ||
978 | #ifdef CONFIG_OF_GPIO | ||
979 | static void __init of_at91_gpio_init_one(struct device_node *np) | ||
980 | { | ||
981 | int alias_idx; | ||
982 | struct at91_gpio_chip *at91_gpio; | ||
983 | |||
984 | if (!np) | ||
985 | return; | ||
986 | |||
987 | alias_idx = of_alias_get_id(np, "gpio"); | ||
988 | if (alias_idx >= MAX_GPIO_BANKS) { | ||
989 | pr_err("at91_gpio, failed alias idx(%d) > MAX_GPIO_BANKS(%d), ignoring.\n", | ||
990 | alias_idx, MAX_GPIO_BANKS); | ||
991 | return; | ||
992 | } | ||
993 | |||
994 | at91_gpio = &gpio_chip[alias_idx]; | ||
995 | at91_gpio->chip.base = alias_idx * at91_gpio->chip.ngpio; | ||
996 | |||
997 | at91_gpio->regbase = of_iomap(np, 0); | ||
998 | if (!at91_gpio->regbase) { | ||
999 | pr_err("at91_gpio.%d, failed to map registers, ignoring.\n", | ||
1000 | alias_idx); | ||
1001 | return; | ||
1002 | } | ||
1003 | |||
1004 | /* Get the interrupts property */ | ||
1005 | if (of_property_read_u32(np, "interrupts", &at91_gpio->pioc_hwirq)) { | ||
1006 | pr_err("at91_gpio.%d, failed to get interrupts property, ignoring.\n", | ||
1007 | alias_idx); | ||
1008 | goto ioremap_err; | ||
1009 | } | ||
1010 | |||
1011 | /* Get capabilities from compatibility property */ | ||
1012 | if (of_device_is_compatible(np, "atmel,at91sam9x5-gpio")) | ||
1013 | at91_gpio_caps |= AT91_GPIO_CAP_PIO3; | ||
1014 | |||
1015 | /* Setup clock */ | ||
1016 | if (at91_gpio_setup_clk(alias_idx)) | ||
1017 | goto ioremap_err; | ||
1018 | |||
1019 | at91_gpio->chip.of_node = np; | ||
1020 | gpio_banks = max(gpio_banks, alias_idx + 1); | ||
1021 | at91_gpio->pioc_idx = alias_idx; | ||
1022 | return; | ||
1023 | |||
1024 | ioremap_err: | ||
1025 | iounmap(at91_gpio->regbase); | ||
1026 | } | ||
1027 | |||
1028 | static int __init of_at91_gpio_init(void) | ||
1029 | { | ||
1030 | struct device_node *np = NULL; | ||
1031 | |||
1032 | /* | ||
1033 | * This isn't ideal, but it gets things hooked up until this | ||
1034 | * driver is converted into a platform_device | ||
1035 | */ | ||
1036 | for_each_compatible_node(np, NULL, "atmel,at91rm9200-gpio") | ||
1037 | of_at91_gpio_init_one(np); | ||
1038 | |||
1039 | return gpio_banks > 0 ? 0 : -EINVAL; | ||
1040 | } | ||
1041 | #else | ||
1042 | static int __init of_at91_gpio_init(void) | ||
1043 | { | ||
1044 | return -EINVAL; | ||
1045 | } | ||
1046 | #endif | ||
1047 | |||
1048 | static void __init at91_gpio_init_one(int idx, u32 regbase, int pioc_hwirq) | 916 | static void __init at91_gpio_init_one(int idx, u32 regbase, int pioc_hwirq) |
1049 | { | 917 | { |
1050 | struct at91_gpio_chip *at91_gpio = &gpio_chip[idx]; | 918 | struct at91_gpio_chip *at91_gpio = &gpio_chip[idx]; |
1051 | 919 | ||
1052 | at91_gpio->chip.base = idx * at91_gpio->chip.ngpio; | 920 | at91_gpio->chip.base = idx * MAX_NB_GPIO_PER_BANK; |
1053 | at91_gpio->pioc_hwirq = pioc_hwirq; | 921 | at91_gpio->pioc_hwirq = pioc_hwirq; |
1054 | at91_gpio->pioc_idx = idx; | 922 | at91_gpio->pioc_idx = idx; |
1055 | 923 | ||
@@ -1079,11 +947,11 @@ void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks) | |||
1079 | 947 | ||
1080 | BUG_ON(nr_banks > MAX_GPIO_BANKS); | 948 | BUG_ON(nr_banks > MAX_GPIO_BANKS); |
1081 | 949 | ||
1082 | if (of_at91_gpio_init() < 0) { | 950 | if (of_have_populated_dt()) |
1083 | /* No GPIO controller found in device tree */ | 951 | return; |
1084 | for (i = 0; i < nr_banks; i++) | 952 | |
1085 | at91_gpio_init_one(i, data[i].regbase, data[i].id); | 953 | for (i = 0; i < nr_banks; i++) |
1086 | } | 954 | at91_gpio_init_one(i, data[i].regbase, data[i].id); |
1087 | 955 | ||
1088 | for (i = 0; i < gpio_banks; i++) { | 956 | for (i = 0; i < gpio_banks; i++) { |
1089 | at91_gpio = &gpio_chip[i]; | 957 | at91_gpio = &gpio_chip[i]; |
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 0b32c81730a5..19cdd0b5b391 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <linux/pm.h> | 11 | #include <linux/pm.h> |
12 | #include <linux/of_address.h> | 12 | #include <linux/of_address.h> |
13 | #include <linux/pinctrl/machine.h> | ||
13 | 14 | ||
14 | #include <asm/system_misc.h> | 15 | #include <asm/system_misc.h> |
15 | #include <asm/mach/map.h> | 16 | #include <asm/mach/map.h> |
@@ -338,6 +339,7 @@ static void at91_dt_rstc(void) | |||
338 | } | 339 | } |
339 | 340 | ||
340 | static struct of_device_id ramc_ids[] = { | 341 | static struct of_device_id ramc_ids[] = { |
342 | { .compatible = "atmel,at91rm9200-sdramc" }, | ||
341 | { .compatible = "atmel,at91sam9260-sdramc" }, | 343 | { .compatible = "atmel,at91sam9260-sdramc" }, |
342 | { .compatible = "atmel,at91sam9g45-ddramc" }, | 344 | { .compatible = "atmel,at91sam9g45-ddramc" }, |
343 | { /*sentinel*/ } | 345 | { /*sentinel*/ } |
@@ -436,6 +438,19 @@ end: | |||
436 | of_node_put(np); | 438 | of_node_put(np); |
437 | } | 439 | } |
438 | 440 | ||
441 | void __init at91rm9200_dt_initialize(void) | ||
442 | { | ||
443 | at91_dt_ramc(); | ||
444 | |||
445 | /* Init clock subsystem */ | ||
446 | at91_dt_clock_init(); | ||
447 | |||
448 | /* Register the processor-specific clocks */ | ||
449 | at91_boot_soc.register_clocks(); | ||
450 | |||
451 | at91_boot_soc.init(); | ||
452 | } | ||
453 | |||
439 | void __init at91_dt_initialize(void) | 454 | void __init at91_dt_initialize(void) |
440 | { | 455 | { |
441 | at91_dt_rstc(); | 456 | at91_dt_rstc(); |
@@ -448,7 +463,8 @@ void __init at91_dt_initialize(void) | |||
448 | /* Register the processor-specific clocks */ | 463 | /* Register the processor-specific clocks */ |
449 | at91_boot_soc.register_clocks(); | 464 | at91_boot_soc.register_clocks(); |
450 | 465 | ||
451 | at91_boot_soc.init(); | 466 | if (at91_boot_soc.init) |
467 | at91_boot_soc.init(); | ||
452 | } | 468 | } |
453 | #endif | 469 | #endif |
454 | 470 | ||
@@ -463,4 +479,6 @@ void __init at91_initialize(unsigned long main_clock) | |||
463 | at91_boot_soc.register_clocks(); | 479 | at91_boot_soc.register_clocks(); |
464 | 480 | ||
465 | at91_boot_soc.init(); | 481 | at91_boot_soc.init(); |
482 | |||
483 | pinctrl_provide_dummies(); | ||
466 | } | 484 | } |
diff --git a/arch/arm/mach-at91/soc.h b/arch/arm/mach-at91/soc.h index a9cfeb153719..9c6d3d4f9a23 100644 --- a/arch/arm/mach-at91/soc.h +++ b/arch/arm/mach-at91/soc.h | |||
@@ -5,6 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | 6 | ||
7 | struct at91_init_soc { | 7 | struct at91_init_soc { |
8 | int builtin; | ||
8 | unsigned int *default_irq_priority; | 9 | unsigned int *default_irq_priority; |
9 | void (*map_io)(void); | 10 | void (*map_io)(void); |
10 | void (*ioremap_registers)(void); | 11 | void (*ioremap_registers)(void); |
@@ -22,9 +23,18 @@ extern struct at91_init_soc at91sam9rl_soc; | |||
22 | extern struct at91_init_soc at91sam9x5_soc; | 23 | extern struct at91_init_soc at91sam9x5_soc; |
23 | extern struct at91_init_soc at91sam9n12_soc; | 24 | extern struct at91_init_soc at91sam9n12_soc; |
24 | 25 | ||
26 | #define AT91_SOC_START(_name) \ | ||
27 | struct at91_init_soc __initdata at91##_name##_soc \ | ||
28 | __used \ | ||
29 | = { \ | ||
30 | .builtin = 1, \ | ||
31 | |||
32 | #define AT91_SOC_END \ | ||
33 | }; | ||
34 | |||
25 | static inline int at91_soc_is_enabled(void) | 35 | static inline int at91_soc_is_enabled(void) |
26 | { | 36 | { |
27 | return at91_boot_soc.init != NULL; | 37 | return at91_boot_soc.builtin; |
28 | } | 38 | } |
29 | 39 | ||
30 | #if !defined(CONFIG_SOC_AT91RM9200) | 40 | #if !defined(CONFIG_SOC_AT91RM9200) |
diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index bfa1eab91f41..22ef8a1abe08 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
25 | #include <linux/io.h> | 25 | #include <linux/io.h> |
26 | #include <linux/pinctrl/machine.h> | 26 | #include <linux/pinctrl/machine.h> |
27 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
27 | #include <asm/hardware/vic.h> | 28 | #include <asm/hardware/vic.h> |
28 | #include <asm/sizes.h> | 29 | #include <asm/sizes.h> |
29 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
@@ -32,9 +33,7 @@ | |||
32 | #include <asm/mach/flash.h> | 33 | #include <asm/mach/flash.h> |
33 | #include <asm/mach/time.h> | 34 | #include <asm/mach/time.h> |
34 | 35 | ||
35 | #include <plat/gpio-nomadik.h> | ||
36 | #include <plat/mtu.h> | 36 | #include <plat/mtu.h> |
37 | #include <plat/pincfg.h> | ||
38 | 37 | ||
39 | #include <linux/platform_data/mtd-nomadik-nand.h> | 38 | #include <linux/platform_data/mtd-nomadik-nand.h> |
40 | #include <mach/fsmc.h> | 39 | #include <mach/fsmc.h> |
diff --git a/arch/arm/mach-nomadik/cpu-8815.c b/arch/arm/mach-nomadik/cpu-8815.c index b617eaed0ce5..1273931303fb 100644 --- a/arch/arm/mach-nomadik/cpu-8815.c +++ b/arch/arm/mach-nomadik/cpu-8815.c | |||
@@ -26,8 +26,8 @@ | |||
26 | #include <linux/irq.h> | 26 | #include <linux/irq.h> |
27 | #include <linux/dma-mapping.h> | 27 | #include <linux/dma-mapping.h> |
28 | #include <linux/platform_data/clk-nomadik.h> | 28 | #include <linux/platform_data/clk-nomadik.h> |
29 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
29 | 30 | ||
30 | #include <plat/gpio-nomadik.h> | ||
31 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
32 | #include <mach/irqs.h> | 32 | #include <mach/irqs.h> |
33 | #include <asm/mach/map.h> | 33 | #include <asm/mach/map.h> |
diff --git a/arch/arm/mach-nomadik/i2c-8815nhk.c b/arch/arm/mach-nomadik/i2c-8815nhk.c index 6d14454d4609..0c2f6628299a 100644 --- a/arch/arm/mach-nomadik/i2c-8815nhk.c +++ b/arch/arm/mach-nomadik/i2c-8815nhk.c | |||
@@ -4,8 +4,7 @@ | |||
4 | #include <linux/i2c-algo-bit.h> | 4 | #include <linux/i2c-algo-bit.h> |
5 | #include <linux/i2c-gpio.h> | 5 | #include <linux/i2c-gpio.h> |
6 | #include <linux/platform_device.h> | 6 | #include <linux/platform_device.h> |
7 | #include <plat/gpio-nomadik.h> | 7 | #include <linux/platform_data/pinctrl-nomadik.h> |
8 | #include <plat/pincfg.h> | ||
9 | 8 | ||
10 | /* | 9 | /* |
11 | * There are two busses in the 8815NHK. | 10 | * There are two busses in the 8815NHK. |
diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index b8efac4daed8..ece8a2dfb814 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c | |||
@@ -1445,8 +1445,6 @@ static struct platform_device pinctrl_device = { | |||
1445 | static struct u300_gpio_platform u300_gpio_plat = { | 1445 | static struct u300_gpio_platform u300_gpio_plat = { |
1446 | .ports = 7, | 1446 | .ports = 7, |
1447 | .gpio_base = 0, | 1447 | .gpio_base = 0, |
1448 | .gpio_irq_base = IRQ_U300_GPIO_BASE, | ||
1449 | .pinctrl_device = &pinctrl_device, | ||
1450 | }; | 1448 | }; |
1451 | 1449 | ||
1452 | static struct platform_device gpio_device = { | 1450 | static struct platform_device gpio_device = { |
@@ -1590,6 +1588,7 @@ static struct platform_device *platform_devs[] __initdata = { | |||
1590 | &i2c1_device, | 1588 | &i2c1_device, |
1591 | &keypad_device, | 1589 | &keypad_device, |
1592 | &rtc_device, | 1590 | &rtc_device, |
1591 | &pinctrl_device, | ||
1593 | &gpio_device, | 1592 | &gpio_device, |
1594 | &nand_device, | 1593 | &nand_device, |
1595 | &wdog_device, | 1594 | &wdog_device, |
@@ -1804,7 +1803,7 @@ MACHINE_START(U300, "Ericsson AB U335 S335/B335 Prototype Board") | |||
1804 | /* Maintainer: Linus Walleij <linus.walleij@stericsson.com> */ | 1803 | /* Maintainer: Linus Walleij <linus.walleij@stericsson.com> */ |
1805 | .atag_offset = 0x100, | 1804 | .atag_offset = 0x100, |
1806 | .map_io = u300_map_io, | 1805 | .map_io = u300_map_io, |
1807 | .nr_irqs = NR_IRQS_U300, | 1806 | .nr_irqs = 0, |
1808 | .init_irq = u300_init_irq, | 1807 | .init_irq = u300_init_irq, |
1809 | .handle_irq = vic_handle_irq, | 1808 | .handle_irq = vic_handle_irq, |
1810 | .timer = &u300_timer, | 1809 | .timer = &u300_timer, |
diff --git a/arch/arm/mach-u300/include/mach/irqs.h b/arch/arm/mach-u300/include/mach/irqs.h index e27425a63fa1..21d5e76a6cd3 100644 --- a/arch/arm/mach-u300/include/mach/irqs.h +++ b/arch/arm/mach-u300/include/mach/irqs.h | |||
@@ -12,79 +12,69 @@ | |||
12 | #ifndef __MACH_IRQS_H | 12 | #ifndef __MACH_IRQS_H |
13 | #define __MACH_IRQS_H | 13 | #define __MACH_IRQS_H |
14 | 14 | ||
15 | #define IRQ_U300_INTCON0_START 1 | 15 | #define IRQ_U300_INTCON0_START 32 |
16 | #define IRQ_U300_INTCON1_START 33 | 16 | #define IRQ_U300_INTCON1_START 64 |
17 | /* These are on INTCON0 - 30 lines */ | 17 | /* These are on INTCON0 - 30 lines */ |
18 | #define IRQ_U300_IRQ0_EXT 1 | 18 | #define IRQ_U300_IRQ0_EXT 32 |
19 | #define IRQ_U300_IRQ1_EXT 2 | 19 | #define IRQ_U300_IRQ1_EXT 33 |
20 | #define IRQ_U300_DMA 3 | 20 | #define IRQ_U300_DMA 34 |
21 | #define IRQ_U300_VIDEO_ENC_0 4 | 21 | #define IRQ_U300_VIDEO_ENC_0 35 |
22 | #define IRQ_U300_VIDEO_ENC_1 5 | 22 | #define IRQ_U300_VIDEO_ENC_1 36 |
23 | #define IRQ_U300_AAIF_RX 6 | 23 | #define IRQ_U300_AAIF_RX 37 |
24 | #define IRQ_U300_AAIF_TX 7 | 24 | #define IRQ_U300_AAIF_TX 38 |
25 | #define IRQ_U300_AAIF_VGPIO 8 | 25 | #define IRQ_U300_AAIF_VGPIO 39 |
26 | #define IRQ_U300_AAIF_WAKEUP 9 | 26 | #define IRQ_U300_AAIF_WAKEUP 40 |
27 | #define IRQ_U300_PCM_I2S0_FRAME 10 | 27 | #define IRQ_U300_PCM_I2S0_FRAME 41 |
28 | #define IRQ_U300_PCM_I2S0_FIFO 11 | 28 | #define IRQ_U300_PCM_I2S0_FIFO 42 |
29 | #define IRQ_U300_PCM_I2S1_FRAME 12 | 29 | #define IRQ_U300_PCM_I2S1_FRAME 43 |
30 | #define IRQ_U300_PCM_I2S1_FIFO 13 | 30 | #define IRQ_U300_PCM_I2S1_FIFO 44 |
31 | #define IRQ_U300_XGAM_GAMCON 14 | 31 | #define IRQ_U300_XGAM_GAMCON 45 |
32 | #define IRQ_U300_XGAM_CDI 15 | 32 | #define IRQ_U300_XGAM_CDI 46 |
33 | #define IRQ_U300_XGAM_CDICON 16 | 33 | #define IRQ_U300_XGAM_CDICON 47 |
34 | #define IRQ_U300_XGAM_PDI 18 | 34 | #define IRQ_U300_XGAM_PDI 49 |
35 | #define IRQ_U300_XGAM_PDICON 19 | 35 | #define IRQ_U300_XGAM_PDICON 50 |
36 | #define IRQ_U300_XGAM_GAMEACC 20 | 36 | #define IRQ_U300_XGAM_GAMEACC 51 |
37 | #define IRQ_U300_XGAM_MCIDCT 21 | 37 | #define IRQ_U300_XGAM_MCIDCT 52 |
38 | #define IRQ_U300_APEX 22 | 38 | #define IRQ_U300_APEX 53 |
39 | #define IRQ_U300_UART0 23 | 39 | #define IRQ_U300_UART0 54 |
40 | #define IRQ_U300_SPI 24 | 40 | #define IRQ_U300_SPI 55 |
41 | #define IRQ_U300_TIMER_APP_OS 25 | 41 | #define IRQ_U300_TIMER_APP_OS 56 |
42 | #define IRQ_U300_TIMER_APP_DD 26 | 42 | #define IRQ_U300_TIMER_APP_DD 57 |
43 | #define IRQ_U300_TIMER_APP_GP1 27 | 43 | #define IRQ_U300_TIMER_APP_GP1 58 |
44 | #define IRQ_U300_TIMER_APP_GP2 28 | 44 | #define IRQ_U300_TIMER_APP_GP2 59 |
45 | #define IRQ_U300_TIMER_OS 29 | 45 | #define IRQ_U300_TIMER_OS 60 |
46 | #define IRQ_U300_TIMER_MS 30 | 46 | #define IRQ_U300_TIMER_MS 61 |
47 | #define IRQ_U300_KEYPAD_KEYBF 31 | 47 | #define IRQ_U300_KEYPAD_KEYBF 62 |
48 | #define IRQ_U300_KEYPAD_KEYBR 32 | 48 | #define IRQ_U300_KEYPAD_KEYBR 63 |
49 | /* These are on INTCON1 - 32 lines */ | 49 | /* These are on INTCON1 - 32 lines */ |
50 | #define IRQ_U300_GPIO_PORT0 33 | 50 | #define IRQ_U300_GPIO_PORT0 64 |
51 | #define IRQ_U300_GPIO_PORT1 34 | 51 | #define IRQ_U300_GPIO_PORT1 65 |
52 | #define IRQ_U300_GPIO_PORT2 35 | 52 | #define IRQ_U300_GPIO_PORT2 66 |
53 | 53 | ||
54 | /* These are for DB3150, DB3200 and DB3350 */ | 54 | /* These are for DB3150, DB3200 and DB3350 */ |
55 | #define IRQ_U300_WDOG 36 | 55 | #define IRQ_U300_WDOG 67 |
56 | #define IRQ_U300_EVHIST 37 | 56 | #define IRQ_U300_EVHIST 68 |
57 | #define IRQ_U300_MSPRO 38 | 57 | #define IRQ_U300_MSPRO 69 |
58 | #define IRQ_U300_MMCSD_MCIINTR0 39 | 58 | #define IRQ_U300_MMCSD_MCIINTR0 70 |
59 | #define IRQ_U300_MMCSD_MCIINTR1 40 | 59 | #define IRQ_U300_MMCSD_MCIINTR1 71 |
60 | #define IRQ_U300_I2C0 41 | 60 | #define IRQ_U300_I2C0 72 |
61 | #define IRQ_U300_I2C1 42 | 61 | #define IRQ_U300_I2C1 73 |
62 | #define IRQ_U300_RTC 43 | 62 | #define IRQ_U300_RTC 74 |
63 | #define IRQ_U300_NFIF 44 | 63 | #define IRQ_U300_NFIF 75 |
64 | #define IRQ_U300_NFIF2 45 | 64 | #define IRQ_U300_NFIF2 76 |
65 | 65 | ||
66 | /* The DB3350-specific interrupt lines */ | 66 | /* The DB3350-specific interrupt lines */ |
67 | #define IRQ_U300_ISP_F0 46 | 67 | #define IRQ_U300_ISP_F0 77 |
68 | #define IRQ_U300_ISP_F1 47 | 68 | #define IRQ_U300_ISP_F1 78 |
69 | #define IRQ_U300_ISP_F2 48 | 69 | #define IRQ_U300_ISP_F2 79 |
70 | #define IRQ_U300_ISP_F3 49 | 70 | #define IRQ_U300_ISP_F3 80 |
71 | #define IRQ_U300_ISP_F4 50 | 71 | #define IRQ_U300_ISP_F4 81 |
72 | #define IRQ_U300_GPIO_PORT3 51 | 72 | #define IRQ_U300_GPIO_PORT3 82 |
73 | #define IRQ_U300_SYSCON_PLL_LOCK 52 | 73 | #define IRQ_U300_SYSCON_PLL_LOCK 83 |
74 | #define IRQ_U300_UART1 53 | 74 | #define IRQ_U300_UART1 84 |
75 | #define IRQ_U300_GPIO_PORT4 54 | 75 | #define IRQ_U300_GPIO_PORT4 85 |
76 | #define IRQ_U300_GPIO_PORT5 55 | 76 | #define IRQ_U300_GPIO_PORT5 86 |
77 | #define IRQ_U300_GPIO_PORT6 56 | 77 | #define IRQ_U300_GPIO_PORT6 87 |
78 | #define U300_VIC_IRQS_END 57 | 78 | #define U300_VIC_IRQS_END 88 |
79 | |||
80 | /* Maximum 8*7 GPIO lines */ | ||
81 | #ifdef CONFIG_PINCTRL_COH901 | ||
82 | #define IRQ_U300_GPIO_BASE (U300_VIC_IRQS_END) | ||
83 | #define IRQ_U300_GPIO_END (IRQ_U300_GPIO_BASE + 56) | ||
84 | #else | ||
85 | #define IRQ_U300_GPIO_END (U300_VIC_IRQS_END) | ||
86 | #endif | ||
87 | |||
88 | #define NR_IRQS_U300 (IRQ_U300_GPIO_END - IRQ_U300_INTCON0_START) | ||
89 | 79 | ||
90 | #endif | 80 | #endif |
diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c index 070629a95625..33631c9f1218 100644 --- a/arch/arm/mach-ux500/board-mop500-audio.c +++ b/arch/arm/mach-ux500/board-mop500-audio.c | |||
@@ -7,9 +7,8 @@ | |||
7 | #include <linux/platform_device.h> | 7 | #include <linux/platform_device.h> |
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <linux/gpio.h> | 9 | #include <linux/gpio.h> |
10 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
10 | 11 | ||
11 | #include <plat/gpio-nomadik.h> | ||
12 | #include <plat/pincfg.h> | ||
13 | #include <plat/ste_dma40.h> | 12 | #include <plat/ste_dma40.h> |
14 | 13 | ||
15 | #include <mach/devices.h> | 14 | #include <mach/devices.h> |
diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c index a267c6d30e37..c34d4efd0d5c 100644 --- a/arch/arm/mach-ux500/board-mop500-pins.c +++ b/arch/arm/mach-ux500/board-mop500-pins.c | |||
@@ -9,10 +9,9 @@ | |||
9 | #include <linux/bug.h> | 9 | #include <linux/bug.h> |
10 | #include <linux/string.h> | 10 | #include <linux/string.h> |
11 | #include <linux/pinctrl/machine.h> | 11 | #include <linux/pinctrl/machine.h> |
12 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
12 | 13 | ||
13 | #include <asm/mach-types.h> | 14 | #include <asm/mach-types.h> |
14 | #include <plat/pincfg.h> | ||
15 | #include <plat/gpio-nomadik.h> | ||
16 | 15 | ||
17 | #include <mach/hardware.h> | 16 | #include <mach/hardware.h> |
18 | 17 | ||
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 416d436111f2..0a3dd601a400 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -37,13 +37,13 @@ | |||
37 | #include <linux/of_platform.h> | 37 | #include <linux/of_platform.h> |
38 | #include <linux/leds.h> | 38 | #include <linux/leds.h> |
39 | #include <linux/pinctrl/consumer.h> | 39 | #include <linux/pinctrl/consumer.h> |
40 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
40 | 41 | ||
41 | #include <asm/mach-types.h> | 42 | #include <asm/mach-types.h> |
42 | #include <asm/mach/arch.h> | 43 | #include <asm/mach/arch.h> |
43 | #include <asm/hardware/gic.h> | 44 | #include <asm/hardware/gic.h> |
44 | 45 | ||
45 | #include <plat/ste_dma40.h> | 46 | #include <plat/ste_dma40.h> |
46 | #include <plat/gpio-nomadik.h> | ||
47 | 47 | ||
48 | #include <mach/hardware.h> | 48 | #include <mach/hardware.h> |
49 | #include <mach/setup.h> | 49 | #include <mach/setup.h> |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index bcdfe6b1d453..113d9c47a842 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -17,14 +17,14 @@ | |||
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | #include <linux/mfd/abx500/ab8500.h> | 19 | #include <linux/mfd/abx500/ab8500.h> |
20 | #include <linux/platform_data/usb-musb-ux500.h> | ||
21 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
20 | 22 | ||
21 | #include <asm/pmu.h> | 23 | #include <asm/pmu.h> |
22 | #include <asm/mach/map.h> | 24 | #include <asm/mach/map.h> |
23 | #include <plat/gpio-nomadik.h> | ||
24 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
25 | #include <mach/setup.h> | 26 | #include <mach/setup.h> |
26 | #include <mach/devices.h> | 27 | #include <mach/devices.h> |
27 | #include <linux/platform_data/usb-musb-ux500.h> | ||
28 | #include <mach/db8500-regs.h> | 28 | #include <mach/db8500-regs.h> |
29 | 29 | ||
30 | #include "devices-db8500.h" | 30 | #include "devices-db8500.h" |
@@ -158,7 +158,7 @@ static void __init db8500_add_gpios(struct device *parent) | |||
158 | 158 | ||
159 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), | 159 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), |
160 | IRQ_DB8500_GPIO0, &pdata); | 160 | IRQ_DB8500_GPIO0, &pdata); |
161 | dbx500_add_pinctrl(parent, "pinctrl-db8500"); | 161 | dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE); |
162 | } | 162 | } |
163 | 163 | ||
164 | static int usb_db8500_rx_dma_cfg[] = { | 164 | static int usb_db8500_rx_dma_cfg[] = { |
diff --git a/arch/arm/mach-ux500/devices-common.c b/arch/arm/mach-ux500/devices-common.c index dfdd4a54668d..692a77a1c153 100644 --- a/arch/arm/mach-ux500/devices-common.c +++ b/arch/arm/mach-ux500/devices-common.c | |||
@@ -11,8 +11,7 @@ | |||
11 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | 14 | #include <linux/platform_data/pinctrl-nomadik.h> | |
15 | #include <plat/gpio-nomadik.h> | ||
16 | 15 | ||
17 | #include <mach/hardware.h> | 16 | #include <mach/hardware.h> |
18 | 17 | ||
diff --git a/arch/arm/mach-ux500/devices-common.h b/arch/arm/mach-ux500/devices-common.h index 7fbf0ba336e1..96fa4ac89e2e 100644 --- a/arch/arm/mach-ux500/devices-common.h +++ b/arch/arm/mach-ux500/devices-common.h | |||
@@ -129,12 +129,18 @@ void dbx500_add_gpios(struct device *parent, resource_size_t *base, int num, | |||
129 | int irq, struct nmk_gpio_platform_data *pdata); | 129 | int irq, struct nmk_gpio_platform_data *pdata); |
130 | 130 | ||
131 | static inline void | 131 | static inline void |
132 | dbx500_add_pinctrl(struct device *parent, const char *name) | 132 | dbx500_add_pinctrl(struct device *parent, const char *name, |
133 | resource_size_t base) | ||
133 | { | 134 | { |
135 | struct resource res[] = { | ||
136 | DEFINE_RES_MEM(base, SZ_8K), | ||
137 | }; | ||
134 | struct platform_device_info pdevinfo = { | 138 | struct platform_device_info pdevinfo = { |
135 | .parent = parent, | 139 | .parent = parent, |
136 | .name = name, | 140 | .name = name, |
137 | .id = -1, | 141 | .id = -1, |
142 | .res = res, | ||
143 | .num_res = ARRAY_SIZE(res), | ||
138 | }; | 144 | }; |
139 | 145 | ||
140 | platform_device_register_full(&pdevinfo); | 146 | platform_device_register_full(&pdevinfo); |
diff --git a/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h b/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h deleted file mode 100644 index c08a54d9d889..000000000000 --- a/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h +++ /dev/null | |||
@@ -1,102 +0,0 @@ | |||
1 | /* | ||
2 | * Structures and registers for GPIO access in the Nomadik SoC | ||
3 | * | ||
4 | * Copyright (C) 2008 STMicroelectronics | ||
5 | * Author: Prafulla WADASKAR <prafulla.wadaskar@st.com> | ||
6 | * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __PLAT_NOMADIK_GPIO | ||
14 | #define __PLAT_NOMADIK_GPIO | ||
15 | |||
16 | /* | ||
17 | * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving | ||
18 | * the "gpio" namespace for generic and cross-machine functions | ||
19 | */ | ||
20 | |||
21 | /* Register in the logic block */ | ||
22 | #define NMK_GPIO_DAT 0x00 | ||
23 | #define NMK_GPIO_DATS 0x04 | ||
24 | #define NMK_GPIO_DATC 0x08 | ||
25 | #define NMK_GPIO_PDIS 0x0c | ||
26 | #define NMK_GPIO_DIR 0x10 | ||
27 | #define NMK_GPIO_DIRS 0x14 | ||
28 | #define NMK_GPIO_DIRC 0x18 | ||
29 | #define NMK_GPIO_SLPC 0x1c | ||
30 | #define NMK_GPIO_AFSLA 0x20 | ||
31 | #define NMK_GPIO_AFSLB 0x24 | ||
32 | #define NMK_GPIO_LOWEMI 0x28 | ||
33 | |||
34 | #define NMK_GPIO_RIMSC 0x40 | ||
35 | #define NMK_GPIO_FIMSC 0x44 | ||
36 | #define NMK_GPIO_IS 0x48 | ||
37 | #define NMK_GPIO_IC 0x4c | ||
38 | #define NMK_GPIO_RWIMSC 0x50 | ||
39 | #define NMK_GPIO_FWIMSC 0x54 | ||
40 | #define NMK_GPIO_WKS 0x58 | ||
41 | |||
42 | /* Alternate functions: function C is set in hw by setting both A and B */ | ||
43 | #define NMK_GPIO_ALT_GPIO 0 | ||
44 | #define NMK_GPIO_ALT_A 1 | ||
45 | #define NMK_GPIO_ALT_B 2 | ||
46 | #define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B) | ||
47 | |||
48 | #define NMK_GPIO_ALT_CX_SHIFT 2 | ||
49 | #define NMK_GPIO_ALT_C1 ((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
50 | #define NMK_GPIO_ALT_C2 ((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
51 | #define NMK_GPIO_ALT_C3 ((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
52 | #define NMK_GPIO_ALT_C4 ((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
53 | |||
54 | /* Pull up/down values */ | ||
55 | enum nmk_gpio_pull { | ||
56 | NMK_GPIO_PULL_NONE, | ||
57 | NMK_GPIO_PULL_UP, | ||
58 | NMK_GPIO_PULL_DOWN, | ||
59 | }; | ||
60 | |||
61 | /* Sleep mode */ | ||
62 | enum nmk_gpio_slpm { | ||
63 | NMK_GPIO_SLPM_INPUT, | ||
64 | NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT, | ||
65 | NMK_GPIO_SLPM_NOCHANGE, | ||
66 | NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE, | ||
67 | }; | ||
68 | |||
69 | extern int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode); | ||
70 | extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull); | ||
71 | #ifdef CONFIG_PINCTRL_NOMADIK | ||
72 | extern int nmk_gpio_set_mode(int gpio, int gpio_mode); | ||
73 | #else | ||
74 | static inline int nmk_gpio_set_mode(int gpio, int gpio_mode) | ||
75 | { | ||
76 | return -ENODEV; | ||
77 | } | ||
78 | #endif | ||
79 | extern int nmk_gpio_get_mode(int gpio); | ||
80 | |||
81 | extern void nmk_gpio_wakeups_suspend(void); | ||
82 | extern void nmk_gpio_wakeups_resume(void); | ||
83 | |||
84 | extern void nmk_gpio_clocks_enable(void); | ||
85 | extern void nmk_gpio_clocks_disable(void); | ||
86 | |||
87 | extern void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up); | ||
88 | |||
89 | /* | ||
90 | * Platform data to register a block: only the initial gpio/irq number. | ||
91 | */ | ||
92 | struct nmk_gpio_platform_data { | ||
93 | char *name; | ||
94 | int first_gpio; | ||
95 | int first_irq; | ||
96 | int num_gpio; | ||
97 | u32 (*get_secondary_status)(unsigned int bank); | ||
98 | void (*set_ioforce)(bool enable); | ||
99 | bool supports_sleepmode; | ||
100 | }; | ||
101 | |||
102 | #endif /* __PLAT_NOMADIK_GPIO */ | ||
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index f1a45997aea8..d542a141811a 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | #include <linux/of_address.h> | 20 | #include <linux/of_address.h> |
21 | #include <linux/of_gpio.h> | 21 | #include <linux/of_gpio.h> |
22 | #include <linux/pinctrl/pinctrl.h> | ||
22 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
23 | 24 | ||
24 | /* Private data structure for of_gpiochip_find_and_xlate */ | 25 | /* Private data structure for of_gpiochip_find_and_xlate */ |
@@ -216,6 +217,54 @@ err0: | |||
216 | } | 217 | } |
217 | EXPORT_SYMBOL(of_mm_gpiochip_add); | 218 | EXPORT_SYMBOL(of_mm_gpiochip_add); |
218 | 219 | ||
220 | #ifdef CONFIG_PINCTRL | ||
221 | static void of_gpiochip_add_pin_range(struct gpio_chip *chip) | ||
222 | { | ||
223 | struct device_node *np = chip->of_node; | ||
224 | struct of_phandle_args pinspec; | ||
225 | struct pinctrl_dev *pctldev; | ||
226 | int index = 0, ret; | ||
227 | |||
228 | if (!np) | ||
229 | return; | ||
230 | |||
231 | do { | ||
232 | ret = of_parse_phandle_with_args(np, "gpio-ranges", | ||
233 | "#gpio-range-cells", index, &pinspec); | ||
234 | if (ret) | ||
235 | break; | ||
236 | |||
237 | pctldev = of_pinctrl_get(pinspec.np); | ||
238 | if (!pctldev) | ||
239 | break; | ||
240 | |||
241 | /* | ||
242 | * This assumes that the n GPIO pins are consecutive in the | ||
243 | * GPIO number space, and that the pins are also consecutive | ||
244 | * in their local number space. Currently it is not possible | ||
245 | * to add different ranges for one and the same GPIO chip, | ||
246 | * as the code assumes that we have one consecutive range | ||
247 | * on both, mapping 1-to-1. | ||
248 | * | ||
249 | * TODO: make the OF bindings handle multiple sparse ranges | ||
250 | * on the same GPIO chip. | ||
251 | */ | ||
252 | ret = gpiochip_add_pin_range(chip, | ||
253 | pinctrl_dev_get_name(pctldev), | ||
254 | 0, /* offset in gpiochip */ | ||
255 | pinspec.args[0], | ||
256 | pinspec.args[1]); | ||
257 | |||
258 | if (ret) | ||
259 | break; | ||
260 | |||
261 | } while (index++); | ||
262 | } | ||
263 | |||
264 | #else | ||
265 | static void of_gpiochip_add_pin_range(struct gpio_chip *chip) {} | ||
266 | #endif | ||
267 | |||
219 | void of_gpiochip_add(struct gpio_chip *chip) | 268 | void of_gpiochip_add(struct gpio_chip *chip) |
220 | { | 269 | { |
221 | if ((!chip->of_node) && (chip->dev)) | 270 | if ((!chip->of_node) && (chip->dev)) |
@@ -229,11 +278,14 @@ void of_gpiochip_add(struct gpio_chip *chip) | |||
229 | chip->of_xlate = of_gpio_simple_xlate; | 278 | chip->of_xlate = of_gpio_simple_xlate; |
230 | } | 279 | } |
231 | 280 | ||
281 | of_gpiochip_add_pin_range(chip); | ||
232 | of_node_get(chip->of_node); | 282 | of_node_get(chip->of_node); |
233 | } | 283 | } |
234 | 284 | ||
235 | void of_gpiochip_remove(struct gpio_chip *chip) | 285 | void of_gpiochip_remove(struct gpio_chip *chip) |
236 | { | 286 | { |
287 | gpiochip_remove_pin_ranges(chip); | ||
288 | |||
237 | if (chip->of_node) | 289 | if (chip->of_node) |
238 | of_node_put(chip->of_node); | 290 | of_node_put(chip->of_node); |
239 | } | 291 | } |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 1c8d9e3380e1..58b9838801c0 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -1083,6 +1083,10 @@ int gpiochip_add(struct gpio_chip *chip) | |||
1083 | } | 1083 | } |
1084 | } | 1084 | } |
1085 | 1085 | ||
1086 | #ifdef CONFIG_PINCTRL | ||
1087 | INIT_LIST_HEAD(&chip->pin_ranges); | ||
1088 | #endif | ||
1089 | |||
1086 | of_gpiochip_add(chip); | 1090 | of_gpiochip_add(chip); |
1087 | 1091 | ||
1088 | unlock: | 1092 | unlock: |
@@ -1123,6 +1127,7 @@ int gpiochip_remove(struct gpio_chip *chip) | |||
1123 | 1127 | ||
1124 | spin_lock_irqsave(&gpio_lock, flags); | 1128 | spin_lock_irqsave(&gpio_lock, flags); |
1125 | 1129 | ||
1130 | gpiochip_remove_pin_ranges(chip); | ||
1126 | of_gpiochip_remove(chip); | 1131 | of_gpiochip_remove(chip); |
1127 | 1132 | ||
1128 | for (id = chip->base; id < chip->base + chip->ngpio; id++) { | 1133 | for (id = chip->base; id < chip->base + chip->ngpio; id++) { |
@@ -1180,6 +1185,77 @@ struct gpio_chip *gpiochip_find(void *data, | |||
1180 | } | 1185 | } |
1181 | EXPORT_SYMBOL_GPL(gpiochip_find); | 1186 | EXPORT_SYMBOL_GPL(gpiochip_find); |
1182 | 1187 | ||
1188 | #ifdef CONFIG_PINCTRL | ||
1189 | |||
1190 | /** | ||
1191 | * gpiochip_add_pin_range() - add a range for GPIO <-> pin mapping | ||
1192 | * @chip: the gpiochip to add the range for | ||
1193 | * @pinctrl_name: the dev_name() of the pin controller to map to | ||
1194 | * @gpio_offset: the start offset in the current gpio_chip number space | ||
1195 | * @pin_offset: the start offset in the pin controller number space | ||
1196 | * @npins: the number of pins from the offset of each pin space (GPIO and | ||
1197 | * pin controller) to accumulate in this range | ||
1198 | */ | ||
1199 | int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | ||
1200 | unsigned int gpio_offset, unsigned int pin_offset, | ||
1201 | unsigned int npins) | ||
1202 | { | ||
1203 | struct gpio_pin_range *pin_range; | ||
1204 | int ret; | ||
1205 | |||
1206 | pin_range = kzalloc(sizeof(*pin_range), GFP_KERNEL); | ||
1207 | if (!pin_range) { | ||
1208 | pr_err("%s: GPIO chip: failed to allocate pin ranges\n", | ||
1209 | chip->label); | ||
1210 | return -ENOMEM; | ||
1211 | } | ||
1212 | |||
1213 | /* Use local offset as range ID */ | ||
1214 | pin_range->range.id = gpio_offset; | ||
1215 | pin_range->range.gc = chip; | ||
1216 | pin_range->range.name = chip->label; | ||
1217 | pin_range->range.base = chip->base + gpio_offset; | ||
1218 | pin_range->range.pin_base = pin_offset; | ||
1219 | pin_range->range.npins = npins; | ||
1220 | pin_range->pctldev = pinctrl_find_and_add_gpio_range(pinctl_name, | ||
1221 | &pin_range->range); | ||
1222 | if (IS_ERR(pin_range->pctldev)) { | ||
1223 | ret = PTR_ERR(pin_range->pctldev); | ||
1224 | pr_err("%s: GPIO chip: could not create pin range\n", | ||
1225 | chip->label); | ||
1226 | kfree(pin_range); | ||
1227 | return ret; | ||
1228 | } | ||
1229 | pr_debug("GPIO chip %s: created GPIO range %d->%d ==> %s PIN %d->%d\n", | ||
1230 | chip->label, gpio_offset, gpio_offset + npins - 1, | ||
1231 | pinctl_name, | ||
1232 | pin_offset, pin_offset + npins - 1); | ||
1233 | |||
1234 | list_add_tail(&pin_range->node, &chip->pin_ranges); | ||
1235 | |||
1236 | return 0; | ||
1237 | } | ||
1238 | EXPORT_SYMBOL_GPL(gpiochip_add_pin_range); | ||
1239 | |||
1240 | /** | ||
1241 | * gpiochip_remove_pin_ranges() - remove all the GPIO <-> pin mappings | ||
1242 | * @chip: the chip to remove all the mappings for | ||
1243 | */ | ||
1244 | void gpiochip_remove_pin_ranges(struct gpio_chip *chip) | ||
1245 | { | ||
1246 | struct gpio_pin_range *pin_range, *tmp; | ||
1247 | |||
1248 | list_for_each_entry_safe(pin_range, tmp, &chip->pin_ranges, node) { | ||
1249 | list_del(&pin_range->node); | ||
1250 | pinctrl_remove_gpio_range(pin_range->pctldev, | ||
1251 | &pin_range->range); | ||
1252 | kfree(pin_range); | ||
1253 | } | ||
1254 | } | ||
1255 | EXPORT_SYMBOL_GPL(gpiochip_remove_pin_ranges); | ||
1256 | |||
1257 | #endif /* CONFIG_PINCTRL */ | ||
1258 | |||
1183 | /* These "optional" allocation calls help prevent drivers from stomping | 1259 | /* These "optional" allocation calls help prevent drivers from stomping |
1184 | * on each other, and help provide better diagnostics in debugfs. | 1260 | * on each other, and help provide better diagnostics in debugfs. |
1185 | * They're called even less than the "set direction" calls. | 1261 | * They're called even less than the "set direction" calls. |
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 914455783302..92623ac2015a 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/gpio.h> | 41 | #include <linux/gpio.h> |
42 | #include <linux/io.h> | 42 | #include <linux/io.h> |
43 | #include <linux/platform_data/atmel.h> | 43 | #include <linux/platform_data/atmel.h> |
44 | #include <linux/pinctrl/consumer.h> | ||
44 | 45 | ||
45 | #include <mach/cpu.h> | 46 | #include <mach/cpu.h> |
46 | 47 | ||
@@ -1370,6 +1371,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
1370 | struct resource *mem; | 1371 | struct resource *mem; |
1371 | struct mtd_part_parser_data ppdata = {}; | 1372 | struct mtd_part_parser_data ppdata = {}; |
1372 | int res; | 1373 | int res; |
1374 | struct pinctrl *pinctrl; | ||
1373 | 1375 | ||
1374 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1376 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1375 | if (!mem) { | 1377 | if (!mem) { |
@@ -1414,6 +1416,13 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
1414 | nand_chip->IO_ADDR_W = host->io_base; | 1416 | nand_chip->IO_ADDR_W = host->io_base; |
1415 | nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl; | 1417 | nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl; |
1416 | 1418 | ||
1419 | pinctrl = devm_pinctrl_get_select_default(&pdev->dev); | ||
1420 | if (IS_ERR(pinctrl)) { | ||
1421 | dev_err(host->dev, "Failed to request pinctrl\n"); | ||
1422 | res = PTR_ERR(pinctrl); | ||
1423 | goto err_ecc_ioremap; | ||
1424 | } | ||
1425 | |||
1417 | if (gpio_is_valid(host->board.rdy_pin)) { | 1426 | if (gpio_is_valid(host->board.rdy_pin)) { |
1418 | res = gpio_request(host->board.rdy_pin, "nand_rdy"); | 1427 | res = gpio_request(host->board.rdy_pin, "nand_rdy"); |
1419 | if (res < 0) { | 1428 | if (res < 0) { |
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index aeecf0f72cad..390ab69ea569 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
@@ -26,6 +26,15 @@ config DEBUG_PINCTRL | |||
26 | help | 26 | help |
27 | Say Y here to add some extra checks and diagnostics to PINCTRL calls. | 27 | Say Y here to add some extra checks and diagnostics to PINCTRL calls. |
28 | 28 | ||
29 | config PINCTRL_AT91 | ||
30 | bool "AT91 pinctrl driver" | ||
31 | depends on OF | ||
32 | depends on ARCH_AT91 | ||
33 | select PINMUX | ||
34 | select PINCONF | ||
35 | help | ||
36 | Say Y here to enable the at91 pinctrl driver | ||
37 | |||
29 | config PINCTRL_BCM2835 | 38 | config PINCTRL_BCM2835 |
30 | bool | 39 | bool |
31 | select PINMUX | 40 | select PINMUX |
@@ -87,21 +96,18 @@ config PINCTRL_MMP2 | |||
87 | bool "MMP2 pin controller driver" | 96 | bool "MMP2 pin controller driver" |
88 | depends on ARCH_MMP | 97 | depends on ARCH_MMP |
89 | select PINCTRL_PXA3xx | 98 | select PINCTRL_PXA3xx |
90 | select PINCONF | ||
91 | 99 | ||
92 | config PINCTRL_MXS | 100 | config PINCTRL_MXS |
93 | bool | 101 | bool |
102 | select PINMUX | ||
103 | select PINCONF | ||
94 | 104 | ||
95 | config PINCTRL_IMX23 | 105 | config PINCTRL_IMX23 |
96 | bool | 106 | bool |
97 | select PINMUX | ||
98 | select PINCONF | ||
99 | select PINCTRL_MXS | 107 | select PINCTRL_MXS |
100 | 108 | ||
101 | config PINCTRL_IMX28 | 109 | config PINCTRL_IMX28 |
102 | bool | 110 | bool |
103 | select PINMUX | ||
104 | select PINCONF | ||
105 | select PINCTRL_MXS | 111 | select PINCTRL_MXS |
106 | 112 | ||
107 | config PINCTRL_NOMADIK | 113 | config PINCTRL_NOMADIK |
@@ -126,13 +132,11 @@ config PINCTRL_PXA168 | |||
126 | bool "PXA168 pin controller driver" | 132 | bool "PXA168 pin controller driver" |
127 | depends on ARCH_MMP | 133 | depends on ARCH_MMP |
128 | select PINCTRL_PXA3xx | 134 | select PINCTRL_PXA3xx |
129 | select PINCONF | ||
130 | 135 | ||
131 | config PINCTRL_PXA910 | 136 | config PINCTRL_PXA910 |
132 | bool "PXA910 pin controller driver" | 137 | bool "PXA910 pin controller driver" |
133 | depends on ARCH_MMP | 138 | depends on ARCH_MMP |
134 | select PINCTRL_PXA3xx | 139 | select PINCTRL_PXA3xx |
135 | select PINCONF | ||
136 | 140 | ||
137 | config PINCTRL_SINGLE | 141 | config PINCTRL_SINGLE |
138 | tristate "One-register-per-pin type device tree based pinctrl driver" | 142 | tristate "One-register-per-pin type device tree based pinctrl driver" |
@@ -143,23 +147,21 @@ config PINCTRL_SINGLE | |||
143 | This selects the device tree based generic pinctrl driver. | 147 | This selects the device tree based generic pinctrl driver. |
144 | 148 | ||
145 | config PINCTRL_SIRF | 149 | config PINCTRL_SIRF |
146 | bool "CSR SiRFprimaII pin controller driver" | 150 | bool "CSR SiRFprimaII/SiRFmarco pin controller driver" |
147 | depends on ARCH_PRIMA2 | 151 | depends on ARCH_SIRF |
148 | select PINMUX | 152 | select PINMUX |
149 | 153 | ||
150 | config PINCTRL_TEGRA | 154 | config PINCTRL_TEGRA |
151 | bool | 155 | bool |
156 | select PINMUX | ||
157 | select PINCONF | ||
152 | 158 | ||
153 | config PINCTRL_TEGRA20 | 159 | config PINCTRL_TEGRA20 |
154 | bool | 160 | bool |
155 | select PINMUX | ||
156 | select PINCONF | ||
157 | select PINCTRL_TEGRA | 161 | select PINCTRL_TEGRA |
158 | 162 | ||
159 | config PINCTRL_TEGRA30 | 163 | config PINCTRL_TEGRA30 |
160 | bool | 164 | bool |
161 | select PINMUX | ||
162 | select PINCONF | ||
163 | select PINCTRL_TEGRA | 165 | select PINCTRL_TEGRA |
164 | 166 | ||
165 | config PINCTRL_U300 | 167 | config PINCTRL_U300 |
@@ -188,27 +190,7 @@ config PINCTRL_EXYNOS4 | |||
188 | depends on OF && GPIOLIB | 190 | depends on OF && GPIOLIB |
189 | select PINCTRL_SAMSUNG | 191 | select PINCTRL_SAMSUNG |
190 | 192 | ||
191 | config PINCTRL_MVEBU | 193 | source "drivers/pinctrl/mvebu/Kconfig" |
192 | bool | ||
193 | depends on ARCH_MVEBU | ||
194 | select PINMUX | ||
195 | select PINCONF | ||
196 | |||
197 | config PINCTRL_DOVE | ||
198 | bool | ||
199 | select PINCTRL_MVEBU | ||
200 | |||
201 | config PINCTRL_KIRKWOOD | ||
202 | bool | ||
203 | select PINCTRL_MVEBU | ||
204 | |||
205 | config PINCTRL_ARMADA_370 | ||
206 | bool | ||
207 | select PINCTRL_MVEBU | ||
208 | |||
209 | config PINCTRL_ARMADA_XP | ||
210 | bool | ||
211 | select PINCTRL_MVEBU | ||
212 | 194 | ||
213 | source "drivers/pinctrl/spear/Kconfig" | 195 | source "drivers/pinctrl/spear/Kconfig" |
214 | 196 | ||
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index f395ba5cec25..f95f5ed923be 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile | |||
@@ -9,6 +9,7 @@ ifeq ($(CONFIG_OF),y) | |||
9 | obj-$(CONFIG_PINCTRL) += devicetree.o | 9 | obj-$(CONFIG_PINCTRL) += devicetree.o |
10 | endif | 10 | endif |
11 | obj-$(CONFIG_GENERIC_PINCONF) += pinconf-generic.o | 11 | obj-$(CONFIG_GENERIC_PINCONF) += pinconf-generic.o |
12 | obj-$(CONFIG_PINCTRL_AT91) += pinctrl-at91.o | ||
12 | obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o | 13 | obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o |
13 | obj-$(CONFIG_PINCTRL_IMX) += pinctrl-imx.o | 14 | obj-$(CONFIG_PINCTRL_IMX) += pinctrl-imx.o |
14 | obj-$(CONFIG_PINCTRL_IMX35) += pinctrl-imx35.o | 15 | obj-$(CONFIG_PINCTRL_IMX35) += pinctrl-imx35.o |
@@ -36,12 +37,8 @@ obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o | |||
36 | obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o | 37 | obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o |
37 | obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o | 38 | obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o |
38 | obj-$(CONFIG_PINCTRL_EXYNOS4) += pinctrl-exynos.o | 39 | obj-$(CONFIG_PINCTRL_EXYNOS4) += pinctrl-exynos.o |
39 | obj-$(CONFIG_PINCTRL_MVEBU) += pinctrl-mvebu.o | ||
40 | obj-$(CONFIG_PINCTRL_DOVE) += pinctrl-dove.o | ||
41 | obj-$(CONFIG_PINCTRL_KIRKWOOD) += pinctrl-kirkwood.o | ||
42 | obj-$(CONFIG_PINCTRL_ARMADA_370) += pinctrl-armada-370.o | ||
43 | obj-$(CONFIG_PINCTRL_ARMADA_XP) += pinctrl-armada-xp.o | ||
44 | obj-$(CONFIG_PINCTRL_XWAY) += pinctrl-xway.o | 40 | obj-$(CONFIG_PINCTRL_XWAY) += pinctrl-xway.o |
45 | obj-$(CONFIG_PINCTRL_LANTIQ) += pinctrl-lantiq.o | 41 | obj-$(CONFIG_PINCTRL_LANTIQ) += pinctrl-lantiq.o |
46 | 42 | ||
43 | obj-$(CONFIG_PLAT_ORION) += mvebu/ | ||
47 | obj-$(CONFIG_PLAT_SPEAR) += spear/ | 44 | obj-$(CONFIG_PLAT_SPEAR) += spear/ |
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 2e39c04fc16b..5cdee8669ea3 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -345,6 +345,62 @@ void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev, | |||
345 | } | 345 | } |
346 | EXPORT_SYMBOL_GPL(pinctrl_add_gpio_ranges); | 346 | EXPORT_SYMBOL_GPL(pinctrl_add_gpio_ranges); |
347 | 347 | ||
348 | struct pinctrl_dev *pinctrl_find_and_add_gpio_range(const char *devname, | ||
349 | struct pinctrl_gpio_range *range) | ||
350 | { | ||
351 | struct pinctrl_dev *pctldev = get_pinctrl_dev_from_devname(devname); | ||
352 | |||
353 | /* | ||
354 | * If we can't find this device, let's assume that is because | ||
355 | * it has not probed yet, so the driver trying to register this | ||
356 | * range need to defer probing. | ||
357 | */ | ||
358 | if (!pctldev) | ||
359 | return ERR_PTR(-EPROBE_DEFER); | ||
360 | |||
361 | pinctrl_add_gpio_range(pctldev, range); | ||
362 | return pctldev; | ||
363 | } | ||
364 | EXPORT_SYMBOL_GPL(pinctrl_find_and_add_gpio_range); | ||
365 | |||
366 | /** | ||
367 | * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin | ||
368 | * @pctldev: the pin controller device to look in | ||
369 | * @pin: a controller-local number to find the range for | ||
370 | */ | ||
371 | struct pinctrl_gpio_range * | ||
372 | pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, | ||
373 | unsigned int pin) | ||
374 | { | ||
375 | struct pinctrl_gpio_range *range = NULL; | ||
376 | |||
377 | /* Loop over the ranges */ | ||
378 | list_for_each_entry(range, &pctldev->gpio_ranges, node) { | ||
379 | /* Check if we're in the valid range */ | ||
380 | if (pin >= range->pin_base && | ||
381 | pin < range->pin_base + range->npins) { | ||
382 | return range; | ||
383 | } | ||
384 | } | ||
385 | |||
386 | return NULL; | ||
387 | } | ||
388 | EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin); | ||
389 | |||
390 | /** | ||
391 | * pinctrl_remove_gpio_range() - remove a range of GPIOs fro a pin controller | ||
392 | * @pctldev: pin controller device to remove the range from | ||
393 | * @range: the GPIO range to remove | ||
394 | */ | ||
395 | void pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev, | ||
396 | struct pinctrl_gpio_range *range) | ||
397 | { | ||
398 | mutex_lock(&pinctrl_mutex); | ||
399 | list_del(&range->node); | ||
400 | mutex_unlock(&pinctrl_mutex); | ||
401 | } | ||
402 | EXPORT_SYMBOL_GPL(pinctrl_remove_gpio_range); | ||
403 | |||
348 | /** | 404 | /** |
349 | * pinctrl_get_group_selector() - returns the group selector for a group | 405 | * pinctrl_get_group_selector() - returns the group selector for a group |
350 | * @pctldev: the pin controller handling the group | 406 | * @pctldev: the pin controller handling the group |
@@ -563,6 +619,8 @@ static int add_setting(struct pinctrl *p, struct pinctrl_map const *map) | |||
563 | return -EPROBE_DEFER; | 619 | return -EPROBE_DEFER; |
564 | } | 620 | } |
565 | 621 | ||
622 | setting->dev_name = map->dev_name; | ||
623 | |||
566 | switch (map->type) { | 624 | switch (map->type) { |
567 | case PIN_MAP_TYPE_MUX_GROUP: | 625 | case PIN_MAP_TYPE_MUX_GROUP: |
568 | ret = pinmux_map_to_setting(map, setting); | 626 | ret = pinmux_map_to_setting(map, setting); |
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index 1f40ff68a8c4..12f5694f3d5d 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h | |||
@@ -105,12 +105,14 @@ struct pinctrl_setting_configs { | |||
105 | * @type: the type of setting | 105 | * @type: the type of setting |
106 | * @pctldev: pin control device handling to be programmed. Not used for | 106 | * @pctldev: pin control device handling to be programmed. Not used for |
107 | * PIN_MAP_TYPE_DUMMY_STATE. | 107 | * PIN_MAP_TYPE_DUMMY_STATE. |
108 | * @dev_name: the name of the device using this state | ||
108 | * @data: Data specific to the setting type | 109 | * @data: Data specific to the setting type |
109 | */ | 110 | */ |
110 | struct pinctrl_setting { | 111 | struct pinctrl_setting { |
111 | struct list_head node; | 112 | struct list_head node; |
112 | enum pinctrl_map_type type; | 113 | enum pinctrl_map_type type; |
113 | struct pinctrl_dev *pctldev; | 114 | struct pinctrl_dev *pctldev; |
115 | const char *dev_name; | ||
114 | union { | 116 | union { |
115 | struct pinctrl_setting_mux mux; | 117 | struct pinctrl_setting_mux mux; |
116 | struct pinctrl_setting_configs configs; | 118 | struct pinctrl_setting_configs configs; |
diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c index fcb1de45473c..fe2d1af7cfa0 100644 --- a/drivers/pinctrl/devicetree.c +++ b/drivers/pinctrl/devicetree.c | |||
@@ -106,6 +106,17 @@ static struct pinctrl_dev *find_pinctrl_by_of_node(struct device_node *np) | |||
106 | return NULL; | 106 | return NULL; |
107 | } | 107 | } |
108 | 108 | ||
109 | struct pinctrl_dev *of_pinctrl_get(struct device_node *np) | ||
110 | { | ||
111 | struct pinctrl_dev *pctldev; | ||
112 | |||
113 | pctldev = find_pinctrl_by_of_node(np); | ||
114 | if (!pctldev) | ||
115 | return NULL; | ||
116 | |||
117 | return pctldev; | ||
118 | } | ||
119 | |||
109 | static int dt_to_map_one_config(struct pinctrl *p, const char *statename, | 120 | static int dt_to_map_one_config(struct pinctrl *p, const char *statename, |
110 | struct device_node *np_config) | 121 | struct device_node *np_config) |
111 | { | 122 | { |
diff --git a/drivers/pinctrl/mvebu/Kconfig b/drivers/pinctrl/mvebu/Kconfig new file mode 100644 index 000000000000..366fa541ee91 --- /dev/null +++ b/drivers/pinctrl/mvebu/Kconfig | |||
@@ -0,0 +1,24 @@ | |||
1 | if PLAT_ORION | ||
2 | |||
3 | config PINCTRL_MVEBU | ||
4 | bool | ||
5 | select PINMUX | ||
6 | select PINCONF | ||
7 | |||
8 | config PINCTRL_DOVE | ||
9 | bool | ||
10 | select PINCTRL_MVEBU | ||
11 | |||
12 | config PINCTRL_KIRKWOOD | ||
13 | bool | ||
14 | select PINCTRL_MVEBU | ||
15 | |||
16 | config PINCTRL_ARMADA_370 | ||
17 | bool | ||
18 | select PINCTRL_MVEBU | ||
19 | |||
20 | config PINCTRL_ARMADA_XP | ||
21 | bool | ||
22 | select PINCTRL_MVEBU | ||
23 | |||
24 | endif | ||
diff --git a/drivers/pinctrl/mvebu/Makefile b/drivers/pinctrl/mvebu/Makefile new file mode 100644 index 000000000000..37c253297af0 --- /dev/null +++ b/drivers/pinctrl/mvebu/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | obj-$(CONFIG_PINCTRL_MVEBU) += pinctrl-mvebu.o | ||
2 | obj-$(CONFIG_PINCTRL_DOVE) += pinctrl-dove.o | ||
3 | obj-$(CONFIG_PINCTRL_KIRKWOOD) += pinctrl-kirkwood.o | ||
4 | obj-$(CONFIG_PINCTRL_ARMADA_370) += pinctrl-armada-370.o | ||
5 | obj-$(CONFIG_PINCTRL_ARMADA_XP) += pinctrl-armada-xp.o | ||
diff --git a/drivers/pinctrl/pinctrl-armada-370.c b/drivers/pinctrl/mvebu/pinctrl-armada-370.c index c907647de6ad..c907647de6ad 100644 --- a/drivers/pinctrl/pinctrl-armada-370.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-370.c | |||
diff --git a/drivers/pinctrl/pinctrl-armada-xp.c b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c index 40bd52a46b4e..40bd52a46b4e 100644 --- a/drivers/pinctrl/pinctrl-armada-xp.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c | |||
diff --git a/drivers/pinctrl/pinctrl-dove.c b/drivers/pinctrl/mvebu/pinctrl-dove.c index ffe74b27d66d..ffe74b27d66d 100644 --- a/drivers/pinctrl/pinctrl-dove.c +++ b/drivers/pinctrl/mvebu/pinctrl-dove.c | |||
diff --git a/drivers/pinctrl/pinctrl-kirkwood.c b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c index 9a74ef674a0e..9a74ef674a0e 100644 --- a/drivers/pinctrl/pinctrl-kirkwood.c +++ b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c | |||
diff --git a/drivers/pinctrl/pinctrl-mvebu.c b/drivers/pinctrl/mvebu/pinctrl-mvebu.c index 8e6266c6249a..6c44b7e8964c 100644 --- a/drivers/pinctrl/pinctrl-mvebu.c +++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/pinctrl/pinctrl.h> | 24 | #include <linux/pinctrl/pinctrl.h> |
25 | #include <linux/pinctrl/pinmux.h> | 25 | #include <linux/pinctrl/pinmux.h> |
26 | 26 | ||
27 | #include "core.h" | ||
28 | #include "pinctrl-mvebu.h" | 27 | #include "pinctrl-mvebu.h" |
29 | 28 | ||
30 | #define MPPS_PER_REG 8 | 29 | #define MPPS_PER_REG 8 |
diff --git a/drivers/pinctrl/pinctrl-mvebu.h b/drivers/pinctrl/mvebu/pinctrl-mvebu.h index 90bd3beee860..90bd3beee860 100644 --- a/drivers/pinctrl/pinctrl-mvebu.h +++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.h | |||
diff --git a/drivers/pinctrl/pinconf-generic.c b/drivers/pinctrl/pinconf-generic.c index 33fbaeaa65dd..833a36458157 100644 --- a/drivers/pinctrl/pinconf-generic.c +++ b/drivers/pinctrl/pinconf-generic.c | |||
@@ -41,6 +41,7 @@ struct pin_config_item conf_items[] = { | |||
41 | PCONFDUMP(PIN_CONFIG_DRIVE_PUSH_PULL, "output drive push pull", NULL), | 41 | PCONFDUMP(PIN_CONFIG_DRIVE_PUSH_PULL, "output drive push pull", NULL), |
42 | PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_DRAIN, "output drive open drain", NULL), | 42 | PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_DRAIN, "output drive open drain", NULL), |
43 | PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_SOURCE, "output drive open source", NULL), | 43 | PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_SOURCE, "output drive open source", NULL), |
44 | PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT_DISABLE, "input schmitt disabled", NULL), | ||
44 | PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT, "input schmitt trigger", NULL), | 45 | PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT, "input schmitt trigger", NULL), |
45 | PCONFDUMP(PIN_CONFIG_INPUT_DEBOUNCE, "input debounce", "time units"), | 46 | PCONFDUMP(PIN_CONFIG_INPUT_DEBOUNCE, "input debounce", "time units"), |
46 | PCONFDUMP(PIN_CONFIG_POWER_SOURCE, "pin power source", "selector"), | 47 | PCONFDUMP(PIN_CONFIG_POWER_SOURCE, "pin power source", "selector"), |
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c new file mode 100644 index 000000000000..c5e757157183 --- /dev/null +++ b/drivers/pinctrl/pinctrl-at91.c | |||
@@ -0,0 +1,1634 @@ | |||
1 | /* | ||
2 | * at91 pinctrl driver based on at91 pinmux core | ||
3 | * | ||
4 | * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
5 | * | ||
6 | * Under GPLv2 only | ||
7 | */ | ||
8 | |||
9 | #include <linux/clk.h> | ||
10 | #include <linux/err.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/of.h> | ||
14 | #include <linux/of_device.h> | ||
15 | #include <linux/of_address.h> | ||
16 | #include <linux/of_irq.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/irqdomain.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/gpio.h> | ||
23 | #include <linux/pinctrl/machine.h> | ||
24 | #include <linux/pinctrl/pinconf.h> | ||
25 | #include <linux/pinctrl/pinctrl.h> | ||
26 | #include <linux/pinctrl/pinmux.h> | ||
27 | /* Since we request GPIOs from ourself */ | ||
28 | #include <linux/pinctrl/consumer.h> | ||
29 | |||
30 | #include <asm/mach/irq.h> | ||
31 | |||
32 | #include <mach/hardware.h> | ||
33 | #include <mach/at91_pio.h> | ||
34 | |||
35 | #include "core.h" | ||
36 | |||
37 | #define MAX_NB_GPIO_PER_BANK 32 | ||
38 | |||
39 | struct at91_pinctrl_mux_ops; | ||
40 | |||
41 | struct at91_gpio_chip { | ||
42 | struct gpio_chip chip; | ||
43 | struct pinctrl_gpio_range range; | ||
44 | struct at91_gpio_chip *next; /* Bank sharing same clock */ | ||
45 | int pioc_hwirq; /* PIO bank interrupt identifier on AIC */ | ||
46 | int pioc_virq; /* PIO bank Linux virtual interrupt */ | ||
47 | int pioc_idx; /* PIO bank index */ | ||
48 | void __iomem *regbase; /* PIO bank virtual address */ | ||
49 | struct clk *clock; /* associated clock */ | ||
50 | struct irq_domain *domain; /* associated irq domain */ | ||
51 | struct at91_pinctrl_mux_ops *ops; /* ops */ | ||
52 | }; | ||
53 | |||
54 | #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip) | ||
55 | |||
56 | static struct at91_gpio_chip *gpio_chips[MAX_GPIO_BANKS]; | ||
57 | |||
58 | static int gpio_banks; | ||
59 | |||
60 | #define PULL_UP (1 << 0) | ||
61 | #define MULTI_DRIVE (1 << 1) | ||
62 | #define DEGLITCH (1 << 2) | ||
63 | #define PULL_DOWN (1 << 3) | ||
64 | #define DIS_SCHMIT (1 << 4) | ||
65 | #define DEBOUNCE (1 << 16) | ||
66 | #define DEBOUNCE_VAL_SHIFT 17 | ||
67 | #define DEBOUNCE_VAL (0x3fff << DEBOUNCE_VAL_SHIFT) | ||
68 | |||
69 | /** | ||
70 | * struct at91_pmx_func - describes AT91 pinmux functions | ||
71 | * @name: the name of this specific function | ||
72 | * @groups: corresponding pin groups | ||
73 | * @ngroups: the number of groups | ||
74 | */ | ||
75 | struct at91_pmx_func { | ||
76 | const char *name; | ||
77 | const char **groups; | ||
78 | unsigned ngroups; | ||
79 | }; | ||
80 | |||
81 | enum at91_mux { | ||
82 | AT91_MUX_GPIO = 0, | ||
83 | AT91_MUX_PERIPH_A = 1, | ||
84 | AT91_MUX_PERIPH_B = 2, | ||
85 | AT91_MUX_PERIPH_C = 3, | ||
86 | AT91_MUX_PERIPH_D = 4, | ||
87 | }; | ||
88 | |||
89 | /** | ||
90 | * struct at91_pmx_pin - describes an At91 pin mux | ||
91 | * @bank: the bank of the pin | ||
92 | * @pin: the pin number in the @bank | ||
93 | * @mux: the mux mode : gpio or periph_x of the pin i.e. alternate function. | ||
94 | * @conf: the configuration of the pin: PULL_UP, MULTIDRIVE etc... | ||
95 | */ | ||
96 | struct at91_pmx_pin { | ||
97 | uint32_t bank; | ||
98 | uint32_t pin; | ||
99 | enum at91_mux mux; | ||
100 | unsigned long conf; | ||
101 | }; | ||
102 | |||
103 | /** | ||
104 | * struct at91_pin_group - describes an At91 pin group | ||
105 | * @name: the name of this specific pin group | ||
106 | * @pins_conf: the mux mode for each pin in this group. The size of this | ||
107 | * array is the same as pins. | ||
108 | * @pins: an array of discrete physical pins used in this group, taken | ||
109 | * from the driver-local pin enumeration space | ||
110 | * @npins: the number of pins in this group array, i.e. the number of | ||
111 | * elements in .pins so we can iterate over that array | ||
112 | */ | ||
113 | struct at91_pin_group { | ||
114 | const char *name; | ||
115 | struct at91_pmx_pin *pins_conf; | ||
116 | unsigned int *pins; | ||
117 | unsigned npins; | ||
118 | }; | ||
119 | |||
120 | /** | ||
121 | * struct at91_pinctrl_mux_ops - describes an At91 mux ops group | ||
122 | * on new IP with support for periph C and D the way to mux in | ||
123 | * periph A and B has changed | ||
124 | * So provide the right call back | ||
125 | * if not present means the IP does not support it | ||
126 | * @get_periph: return the periph mode configured | ||
127 | * @mux_A_periph: mux as periph A | ||
128 | * @mux_B_periph: mux as periph B | ||
129 | * @mux_C_periph: mux as periph C | ||
130 | * @mux_D_periph: mux as periph D | ||
131 | * @get_deglitch: get deglitch status | ||
132 | * @set_deglitch: enable/disable deglitch | ||
133 | * @get_debounce: get debounce status | ||
134 | * @set_debounce: enable/disable debounce | ||
135 | * @get_pulldown: get pulldown status | ||
136 | * @set_pulldown: enable/disable pulldown | ||
137 | * @get_schmitt_trig: get schmitt trigger status | ||
138 | * @disable_schmitt_trig: disable schmitt trigger | ||
139 | * @irq_type: return irq type | ||
140 | */ | ||
141 | struct at91_pinctrl_mux_ops { | ||
142 | enum at91_mux (*get_periph)(void __iomem *pio, unsigned mask); | ||
143 | void (*mux_A_periph)(void __iomem *pio, unsigned mask); | ||
144 | void (*mux_B_periph)(void __iomem *pio, unsigned mask); | ||
145 | void (*mux_C_periph)(void __iomem *pio, unsigned mask); | ||
146 | void (*mux_D_periph)(void __iomem *pio, unsigned mask); | ||
147 | bool (*get_deglitch)(void __iomem *pio, unsigned pin); | ||
148 | void (*set_deglitch)(void __iomem *pio, unsigned mask, bool in_on); | ||
149 | bool (*get_debounce)(void __iomem *pio, unsigned pin, u32 *div); | ||
150 | void (*set_debounce)(void __iomem *pio, unsigned mask, bool in_on, u32 div); | ||
151 | bool (*get_pulldown)(void __iomem *pio, unsigned pin); | ||
152 | void (*set_pulldown)(void __iomem *pio, unsigned mask, bool in_on); | ||
153 | bool (*get_schmitt_trig)(void __iomem *pio, unsigned pin); | ||
154 | void (*disable_schmitt_trig)(void __iomem *pio, unsigned mask); | ||
155 | /* irq */ | ||
156 | int (*irq_type)(struct irq_data *d, unsigned type); | ||
157 | }; | ||
158 | |||
159 | static int gpio_irq_type(struct irq_data *d, unsigned type); | ||
160 | static int alt_gpio_irq_type(struct irq_data *d, unsigned type); | ||
161 | |||
162 | struct at91_pinctrl { | ||
163 | struct device *dev; | ||
164 | struct pinctrl_dev *pctl; | ||
165 | |||
166 | int nbanks; | ||
167 | |||
168 | uint32_t *mux_mask; | ||
169 | int nmux; | ||
170 | |||
171 | struct at91_pmx_func *functions; | ||
172 | int nfunctions; | ||
173 | |||
174 | struct at91_pin_group *groups; | ||
175 | int ngroups; | ||
176 | |||
177 | struct at91_pinctrl_mux_ops *ops; | ||
178 | }; | ||
179 | |||
180 | static const inline struct at91_pin_group *at91_pinctrl_find_group_by_name( | ||
181 | const struct at91_pinctrl *info, | ||
182 | const char *name) | ||
183 | { | ||
184 | const struct at91_pin_group *grp = NULL; | ||
185 | int i; | ||
186 | |||
187 | for (i = 0; i < info->ngroups; i++) { | ||
188 | if (strcmp(info->groups[i].name, name)) | ||
189 | continue; | ||
190 | |||
191 | grp = &info->groups[i]; | ||
192 | dev_dbg(info->dev, "%s: %d 0:%d\n", name, grp->npins, grp->pins[0]); | ||
193 | break; | ||
194 | } | ||
195 | |||
196 | return grp; | ||
197 | } | ||
198 | |||
199 | static int at91_get_groups_count(struct pinctrl_dev *pctldev) | ||
200 | { | ||
201 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
202 | |||
203 | return info->ngroups; | ||
204 | } | ||
205 | |||
206 | static const char *at91_get_group_name(struct pinctrl_dev *pctldev, | ||
207 | unsigned selector) | ||
208 | { | ||
209 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
210 | |||
211 | return info->groups[selector].name; | ||
212 | } | ||
213 | |||
214 | static int at91_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, | ||
215 | const unsigned **pins, | ||
216 | unsigned *npins) | ||
217 | { | ||
218 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
219 | |||
220 | if (selector >= info->ngroups) | ||
221 | return -EINVAL; | ||
222 | |||
223 | *pins = info->groups[selector].pins; | ||
224 | *npins = info->groups[selector].npins; | ||
225 | |||
226 | return 0; | ||
227 | } | ||
228 | |||
229 | static void at91_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, | ||
230 | unsigned offset) | ||
231 | { | ||
232 | seq_printf(s, "%s", dev_name(pctldev->dev)); | ||
233 | } | ||
234 | |||
235 | static int at91_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
236 | struct device_node *np, | ||
237 | struct pinctrl_map **map, unsigned *num_maps) | ||
238 | { | ||
239 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
240 | const struct at91_pin_group *grp; | ||
241 | struct pinctrl_map *new_map; | ||
242 | struct device_node *parent; | ||
243 | int map_num = 1; | ||
244 | int i; | ||
245 | |||
246 | /* | ||
247 | * first find the group of this node and check if we need create | ||
248 | * config maps for pins | ||
249 | */ | ||
250 | grp = at91_pinctrl_find_group_by_name(info, np->name); | ||
251 | if (!grp) { | ||
252 | dev_err(info->dev, "unable to find group for node %s\n", | ||
253 | np->name); | ||
254 | return -EINVAL; | ||
255 | } | ||
256 | |||
257 | map_num += grp->npins; | ||
258 | new_map = devm_kzalloc(pctldev->dev, sizeof(*new_map) * map_num, GFP_KERNEL); | ||
259 | if (!new_map) | ||
260 | return -ENOMEM; | ||
261 | |||
262 | *map = new_map; | ||
263 | *num_maps = map_num; | ||
264 | |||
265 | /* create mux map */ | ||
266 | parent = of_get_parent(np); | ||
267 | if (!parent) { | ||
268 | kfree(new_map); | ||
269 | return -EINVAL; | ||
270 | } | ||
271 | new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; | ||
272 | new_map[0].data.mux.function = parent->name; | ||
273 | new_map[0].data.mux.group = np->name; | ||
274 | of_node_put(parent); | ||
275 | |||
276 | /* create config map */ | ||
277 | new_map++; | ||
278 | for (i = 0; i < grp->npins; i++) { | ||
279 | new_map[i].type = PIN_MAP_TYPE_CONFIGS_PIN; | ||
280 | new_map[i].data.configs.group_or_pin = | ||
281 | pin_get_name(pctldev, grp->pins[i]); | ||
282 | new_map[i].data.configs.configs = &grp->pins_conf[i].conf; | ||
283 | new_map[i].data.configs.num_configs = 1; | ||
284 | } | ||
285 | |||
286 | dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n", | ||
287 | (*map)->data.mux.function, (*map)->data.mux.group, map_num); | ||
288 | |||
289 | return 0; | ||
290 | } | ||
291 | |||
292 | static void at91_dt_free_map(struct pinctrl_dev *pctldev, | ||
293 | struct pinctrl_map *map, unsigned num_maps) | ||
294 | { | ||
295 | } | ||
296 | |||
297 | static struct pinctrl_ops at91_pctrl_ops = { | ||
298 | .get_groups_count = at91_get_groups_count, | ||
299 | .get_group_name = at91_get_group_name, | ||
300 | .get_group_pins = at91_get_group_pins, | ||
301 | .pin_dbg_show = at91_pin_dbg_show, | ||
302 | .dt_node_to_map = at91_dt_node_to_map, | ||
303 | .dt_free_map = at91_dt_free_map, | ||
304 | }; | ||
305 | |||
306 | static void __iomem * pin_to_controller(struct at91_pinctrl *info, | ||
307 | unsigned int bank) | ||
308 | { | ||
309 | return gpio_chips[bank]->regbase; | ||
310 | } | ||
311 | |||
312 | static inline int pin_to_bank(unsigned pin) | ||
313 | { | ||
314 | return pin /= MAX_NB_GPIO_PER_BANK; | ||
315 | } | ||
316 | |||
317 | static unsigned pin_to_mask(unsigned int pin) | ||
318 | { | ||
319 | return 1 << pin; | ||
320 | } | ||
321 | |||
322 | static void at91_mux_disable_interrupt(void __iomem *pio, unsigned mask) | ||
323 | { | ||
324 | writel_relaxed(mask, pio + PIO_IDR); | ||
325 | } | ||
326 | |||
327 | static unsigned at91_mux_get_pullup(void __iomem *pio, unsigned pin) | ||
328 | { | ||
329 | return (readl_relaxed(pio + PIO_PUSR) >> pin) & 0x1; | ||
330 | } | ||
331 | |||
332 | static void at91_mux_set_pullup(void __iomem *pio, unsigned mask, bool on) | ||
333 | { | ||
334 | writel_relaxed(mask, pio + (on ? PIO_PUER : PIO_PUDR)); | ||
335 | } | ||
336 | |||
337 | static unsigned at91_mux_get_multidrive(void __iomem *pio, unsigned pin) | ||
338 | { | ||
339 | return (readl_relaxed(pio + PIO_MDSR) >> pin) & 0x1; | ||
340 | } | ||
341 | |||
342 | static void at91_mux_set_multidrive(void __iomem *pio, unsigned mask, bool on) | ||
343 | { | ||
344 | writel_relaxed(mask, pio + (on ? PIO_MDER : PIO_MDDR)); | ||
345 | } | ||
346 | |||
347 | static void at91_mux_set_A_periph(void __iomem *pio, unsigned mask) | ||
348 | { | ||
349 | writel_relaxed(mask, pio + PIO_ASR); | ||
350 | } | ||
351 | |||
352 | static void at91_mux_set_B_periph(void __iomem *pio, unsigned mask) | ||
353 | { | ||
354 | writel_relaxed(mask, pio + PIO_BSR); | ||
355 | } | ||
356 | |||
357 | static void at91_mux_pio3_set_A_periph(void __iomem *pio, unsigned mask) | ||
358 | { | ||
359 | |||
360 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR1) & ~mask, | ||
361 | pio + PIO_ABCDSR1); | ||
362 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR2) & ~mask, | ||
363 | pio + PIO_ABCDSR2); | ||
364 | } | ||
365 | |||
366 | static void at91_mux_pio3_set_B_periph(void __iomem *pio, unsigned mask) | ||
367 | { | ||
368 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR1) | mask, | ||
369 | pio + PIO_ABCDSR1); | ||
370 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR2) & ~mask, | ||
371 | pio + PIO_ABCDSR2); | ||
372 | } | ||
373 | |||
374 | static void at91_mux_pio3_set_C_periph(void __iomem *pio, unsigned mask) | ||
375 | { | ||
376 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR1) & ~mask, pio + PIO_ABCDSR1); | ||
377 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR2) | mask, pio + PIO_ABCDSR2); | ||
378 | } | ||
379 | |||
380 | static void at91_mux_pio3_set_D_periph(void __iomem *pio, unsigned mask) | ||
381 | { | ||
382 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR1) | mask, pio + PIO_ABCDSR1); | ||
383 | writel_relaxed(readl_relaxed(pio + PIO_ABCDSR2) | mask, pio + PIO_ABCDSR2); | ||
384 | } | ||
385 | |||
386 | static enum at91_mux at91_mux_pio3_get_periph(void __iomem *pio, unsigned mask) | ||
387 | { | ||
388 | unsigned select; | ||
389 | |||
390 | if (readl_relaxed(pio + PIO_PSR) & mask) | ||
391 | return AT91_MUX_GPIO; | ||
392 | |||
393 | select = !!(readl_relaxed(pio + PIO_ABCDSR1) & mask); | ||
394 | select |= (!!(readl_relaxed(pio + PIO_ABCDSR2) & mask) << 1); | ||
395 | |||
396 | return select + 1; | ||
397 | } | ||
398 | |||
399 | static enum at91_mux at91_mux_get_periph(void __iomem *pio, unsigned mask) | ||
400 | { | ||
401 | unsigned select; | ||
402 | |||
403 | if (readl_relaxed(pio + PIO_PSR) & mask) | ||
404 | return AT91_MUX_GPIO; | ||
405 | |||
406 | select = readl_relaxed(pio + PIO_ABSR) & mask; | ||
407 | |||
408 | return select + 1; | ||
409 | } | ||
410 | |||
411 | static bool at91_mux_get_deglitch(void __iomem *pio, unsigned pin) | ||
412 | { | ||
413 | return (__raw_readl(pio + PIO_IFSR) >> pin) & 0x1; | ||
414 | } | ||
415 | |||
416 | static void at91_mux_set_deglitch(void __iomem *pio, unsigned mask, bool is_on) | ||
417 | { | ||
418 | __raw_writel(mask, pio + (is_on ? PIO_IFER : PIO_IFDR)); | ||
419 | } | ||
420 | |||
421 | static void at91_mux_pio3_set_deglitch(void __iomem *pio, unsigned mask, bool is_on) | ||
422 | { | ||
423 | if (is_on) | ||
424 | __raw_writel(mask, pio + PIO_IFSCDR); | ||
425 | at91_mux_set_deglitch(pio, mask, is_on); | ||
426 | } | ||
427 | |||
428 | static bool at91_mux_pio3_get_debounce(void __iomem *pio, unsigned pin, u32 *div) | ||
429 | { | ||
430 | *div = __raw_readl(pio + PIO_SCDR); | ||
431 | |||
432 | return (__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1; | ||
433 | } | ||
434 | |||
435 | static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask, | ||
436 | bool is_on, u32 div) | ||
437 | { | ||
438 | if (is_on) { | ||
439 | __raw_writel(mask, pio + PIO_IFSCER); | ||
440 | __raw_writel(div & PIO_SCDR_DIV, pio + PIO_SCDR); | ||
441 | __raw_writel(mask, pio + PIO_IFER); | ||
442 | } else { | ||
443 | __raw_writel(mask, pio + PIO_IFDR); | ||
444 | } | ||
445 | } | ||
446 | |||
447 | static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin) | ||
448 | { | ||
449 | return (__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1; | ||
450 | } | ||
451 | |||
452 | static void at91_mux_pio3_set_pulldown(void __iomem *pio, unsigned mask, bool is_on) | ||
453 | { | ||
454 | __raw_writel(mask, pio + (is_on ? PIO_PPDER : PIO_PPDDR)); | ||
455 | } | ||
456 | |||
457 | static void at91_mux_pio3_disable_schmitt_trig(void __iomem *pio, unsigned mask) | ||
458 | { | ||
459 | __raw_writel(__raw_readl(pio + PIO_SCHMITT) | mask, pio + PIO_SCHMITT); | ||
460 | } | ||
461 | |||
462 | static bool at91_mux_pio3_get_schmitt_trig(void __iomem *pio, unsigned pin) | ||
463 | { | ||
464 | return (__raw_readl(pio + PIO_SCHMITT) >> pin) & 0x1; | ||
465 | } | ||
466 | |||
467 | static struct at91_pinctrl_mux_ops at91rm9200_ops = { | ||
468 | .get_periph = at91_mux_get_periph, | ||
469 | .mux_A_periph = at91_mux_set_A_periph, | ||
470 | .mux_B_periph = at91_mux_set_B_periph, | ||
471 | .get_deglitch = at91_mux_get_deglitch, | ||
472 | .set_deglitch = at91_mux_set_deglitch, | ||
473 | .irq_type = gpio_irq_type, | ||
474 | }; | ||
475 | |||
476 | static struct at91_pinctrl_mux_ops at91sam9x5_ops = { | ||
477 | .get_periph = at91_mux_pio3_get_periph, | ||
478 | .mux_A_periph = at91_mux_pio3_set_A_periph, | ||
479 | .mux_B_periph = at91_mux_pio3_set_B_periph, | ||
480 | .mux_C_periph = at91_mux_pio3_set_C_periph, | ||
481 | .mux_D_periph = at91_mux_pio3_set_D_periph, | ||
482 | .get_deglitch = at91_mux_get_deglitch, | ||
483 | .set_deglitch = at91_mux_pio3_set_deglitch, | ||
484 | .get_debounce = at91_mux_pio3_get_debounce, | ||
485 | .set_debounce = at91_mux_pio3_set_debounce, | ||
486 | .get_pulldown = at91_mux_pio3_get_pulldown, | ||
487 | .set_pulldown = at91_mux_pio3_set_pulldown, | ||
488 | .get_schmitt_trig = at91_mux_pio3_get_schmitt_trig, | ||
489 | .disable_schmitt_trig = at91_mux_pio3_disable_schmitt_trig, | ||
490 | .irq_type = alt_gpio_irq_type, | ||
491 | }; | ||
492 | |||
493 | static void at91_pin_dbg(const struct device *dev, const struct at91_pmx_pin *pin) | ||
494 | { | ||
495 | if (pin->mux) { | ||
496 | dev_dbg(dev, "pio%c%d configured as periph%c with conf = 0x%lu\n", | ||
497 | pin->bank + 'A', pin->pin, pin->mux - 1 + 'A', pin->conf); | ||
498 | } else { | ||
499 | dev_dbg(dev, "pio%c%d configured as gpio with conf = 0x%lu\n", | ||
500 | pin->bank + 'A', pin->pin, pin->conf); | ||
501 | } | ||
502 | } | ||
503 | |||
504 | static int pin_check_config(struct at91_pinctrl *info, const char* name, | ||
505 | int index, const struct at91_pmx_pin *pin) | ||
506 | { | ||
507 | int mux; | ||
508 | |||
509 | /* check if it's a valid config */ | ||
510 | if (pin->bank >= info->nbanks) { | ||
511 | dev_err(info->dev, "%s: pin conf %d bank_id %d >= nbanks %d\n", | ||
512 | name, index, pin->bank, info->nbanks); | ||
513 | return -EINVAL; | ||
514 | } | ||
515 | |||
516 | if (pin->pin >= MAX_NB_GPIO_PER_BANK) { | ||
517 | dev_err(info->dev, "%s: pin conf %d pin_bank_id %d >= %d\n", | ||
518 | name, index, pin->pin, MAX_NB_GPIO_PER_BANK); | ||
519 | return -EINVAL; | ||
520 | } | ||
521 | |||
522 | if (!pin->mux) | ||
523 | return 0; | ||
524 | |||
525 | mux = pin->mux - 1; | ||
526 | |||
527 | if (mux >= info->nmux) { | ||
528 | dev_err(info->dev, "%s: pin conf %d mux_id %d >= nmux %d\n", | ||
529 | name, index, mux, info->nmux); | ||
530 | return -EINVAL; | ||
531 | } | ||
532 | |||
533 | if (!(info->mux_mask[pin->bank * info->nmux + mux] & 1 << pin->pin)) { | ||
534 | dev_err(info->dev, "%s: pin conf %d mux_id %d not supported for pio%c%d\n", | ||
535 | name, index, mux, pin->bank + 'A', pin->pin); | ||
536 | return -EINVAL; | ||
537 | } | ||
538 | |||
539 | return 0; | ||
540 | } | ||
541 | |||
542 | static void at91_mux_gpio_disable(void __iomem *pio, unsigned mask) | ||
543 | { | ||
544 | writel_relaxed(mask, pio + PIO_PDR); | ||
545 | } | ||
546 | |||
547 | static void at91_mux_gpio_enable(void __iomem *pio, unsigned mask, bool input) | ||
548 | { | ||
549 | writel_relaxed(mask, pio + PIO_PER); | ||
550 | writel_relaxed(mask, pio + (input ? PIO_ODR : PIO_OER)); | ||
551 | } | ||
552 | |||
553 | static int at91_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector, | ||
554 | unsigned group) | ||
555 | { | ||
556 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
557 | const struct at91_pmx_pin *pins_conf = info->groups[group].pins_conf; | ||
558 | const struct at91_pmx_pin *pin; | ||
559 | uint32_t npins = info->groups[group].npins; | ||
560 | int i, ret; | ||
561 | unsigned mask; | ||
562 | void __iomem *pio; | ||
563 | |||
564 | dev_dbg(info->dev, "enable function %s group %s\n", | ||
565 | info->functions[selector].name, info->groups[group].name); | ||
566 | |||
567 | /* first check that all the pins of the group are valid with a valid | ||
568 | * paramter */ | ||
569 | for (i = 0; i < npins; i++) { | ||
570 | pin = &pins_conf[i]; | ||
571 | ret = pin_check_config(info, info->groups[group].name, i, pin); | ||
572 | if (ret) | ||
573 | return ret; | ||
574 | } | ||
575 | |||
576 | for (i = 0; i < npins; i++) { | ||
577 | pin = &pins_conf[i]; | ||
578 | at91_pin_dbg(info->dev, pin); | ||
579 | pio = pin_to_controller(info, pin->bank); | ||
580 | mask = pin_to_mask(pin->pin); | ||
581 | at91_mux_disable_interrupt(pio, mask); | ||
582 | switch(pin->mux) { | ||
583 | case AT91_MUX_GPIO: | ||
584 | at91_mux_gpio_enable(pio, mask, 1); | ||
585 | break; | ||
586 | case AT91_MUX_PERIPH_A: | ||
587 | info->ops->mux_A_periph(pio, mask); | ||
588 | break; | ||
589 | case AT91_MUX_PERIPH_B: | ||
590 | info->ops->mux_B_periph(pio, mask); | ||
591 | break; | ||
592 | case AT91_MUX_PERIPH_C: | ||
593 | if (!info->ops->mux_C_periph) | ||
594 | return -EINVAL; | ||
595 | info->ops->mux_C_periph(pio, mask); | ||
596 | break; | ||
597 | case AT91_MUX_PERIPH_D: | ||
598 | if (!info->ops->mux_D_periph) | ||
599 | return -EINVAL; | ||
600 | info->ops->mux_D_periph(pio, mask); | ||
601 | break; | ||
602 | } | ||
603 | if (pin->mux) | ||
604 | at91_mux_gpio_disable(pio, mask); | ||
605 | } | ||
606 | |||
607 | return 0; | ||
608 | } | ||
609 | |||
610 | static void at91_pmx_disable(struct pinctrl_dev *pctldev, unsigned selector, | ||
611 | unsigned group) | ||
612 | { | ||
613 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
614 | const struct at91_pmx_pin *pins_conf = info->groups[group].pins_conf; | ||
615 | const struct at91_pmx_pin *pin; | ||
616 | uint32_t npins = info->groups[group].npins; | ||
617 | int i; | ||
618 | unsigned mask; | ||
619 | void __iomem *pio; | ||
620 | |||
621 | for (i = 0; i < npins; i++) { | ||
622 | pin = &pins_conf[i]; | ||
623 | at91_pin_dbg(info->dev, pin); | ||
624 | pio = pin_to_controller(info, pin->bank); | ||
625 | mask = pin_to_mask(pin->pin); | ||
626 | at91_mux_gpio_enable(pio, mask, 1); | ||
627 | } | ||
628 | } | ||
629 | |||
630 | static int at91_pmx_get_funcs_count(struct pinctrl_dev *pctldev) | ||
631 | { | ||
632 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
633 | |||
634 | return info->nfunctions; | ||
635 | } | ||
636 | |||
637 | static const char *at91_pmx_get_func_name(struct pinctrl_dev *pctldev, | ||
638 | unsigned selector) | ||
639 | { | ||
640 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
641 | |||
642 | return info->functions[selector].name; | ||
643 | } | ||
644 | |||
645 | static int at91_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector, | ||
646 | const char * const **groups, | ||
647 | unsigned * const num_groups) | ||
648 | { | ||
649 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
650 | |||
651 | *groups = info->functions[selector].groups; | ||
652 | *num_groups = info->functions[selector].ngroups; | ||
653 | |||
654 | return 0; | ||
655 | } | ||
656 | |||
657 | static int at91_gpio_request_enable(struct pinctrl_dev *pctldev, | ||
658 | struct pinctrl_gpio_range *range, | ||
659 | unsigned offset) | ||
660 | { | ||
661 | struct at91_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev); | ||
662 | struct at91_gpio_chip *at91_chip; | ||
663 | struct gpio_chip *chip; | ||
664 | unsigned mask; | ||
665 | |||
666 | if (!range) { | ||
667 | dev_err(npct->dev, "invalid range\n"); | ||
668 | return -EINVAL; | ||
669 | } | ||
670 | if (!range->gc) { | ||
671 | dev_err(npct->dev, "missing GPIO chip in range\n"); | ||
672 | return -EINVAL; | ||
673 | } | ||
674 | chip = range->gc; | ||
675 | at91_chip = container_of(chip, struct at91_gpio_chip, chip); | ||
676 | |||
677 | dev_dbg(npct->dev, "enable pin %u as GPIO\n", offset); | ||
678 | |||
679 | mask = 1 << (offset - chip->base); | ||
680 | |||
681 | dev_dbg(npct->dev, "enable pin %u as PIO%c%d 0x%x\n", | ||
682 | offset, 'A' + range->id, offset - chip->base, mask); | ||
683 | |||
684 | writel_relaxed(mask, at91_chip->regbase + PIO_PER); | ||
685 | |||
686 | return 0; | ||
687 | } | ||
688 | |||
689 | static void at91_gpio_disable_free(struct pinctrl_dev *pctldev, | ||
690 | struct pinctrl_gpio_range *range, | ||
691 | unsigned offset) | ||
692 | { | ||
693 | struct at91_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev); | ||
694 | |||
695 | dev_dbg(npct->dev, "disable pin %u as GPIO\n", offset); | ||
696 | /* Set the pin to some default state, GPIO is usually default */ | ||
697 | } | ||
698 | |||
699 | static struct pinmux_ops at91_pmx_ops = { | ||
700 | .get_functions_count = at91_pmx_get_funcs_count, | ||
701 | .get_function_name = at91_pmx_get_func_name, | ||
702 | .get_function_groups = at91_pmx_get_groups, | ||
703 | .enable = at91_pmx_enable, | ||
704 | .disable = at91_pmx_disable, | ||
705 | .gpio_request_enable = at91_gpio_request_enable, | ||
706 | .gpio_disable_free = at91_gpio_disable_free, | ||
707 | }; | ||
708 | |||
709 | static int at91_pinconf_get(struct pinctrl_dev *pctldev, | ||
710 | unsigned pin_id, unsigned long *config) | ||
711 | { | ||
712 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
713 | void __iomem *pio; | ||
714 | unsigned pin; | ||
715 | int div; | ||
716 | |||
717 | dev_dbg(info->dev, "%s:%d, pin_id=%d, config=0x%lx", __func__, __LINE__, pin_id, *config); | ||
718 | pio = pin_to_controller(info, pin_to_bank(pin_id)); | ||
719 | pin = pin_id % MAX_NB_GPIO_PER_BANK; | ||
720 | |||
721 | if (at91_mux_get_multidrive(pio, pin)) | ||
722 | *config |= MULTI_DRIVE; | ||
723 | |||
724 | if (at91_mux_get_pullup(pio, pin)) | ||
725 | *config |= PULL_UP; | ||
726 | |||
727 | if (info->ops->get_deglitch && info->ops->get_deglitch(pio, pin)) | ||
728 | *config |= DEGLITCH; | ||
729 | if (info->ops->get_debounce && info->ops->get_debounce(pio, pin, &div)) | ||
730 | *config |= DEBOUNCE | (div << DEBOUNCE_VAL_SHIFT); | ||
731 | if (info->ops->get_pulldown && info->ops->get_pulldown(pio, pin)) | ||
732 | *config |= PULL_DOWN; | ||
733 | if (info->ops->get_schmitt_trig && info->ops->get_schmitt_trig(pio, pin)) | ||
734 | *config |= DIS_SCHMIT; | ||
735 | |||
736 | return 0; | ||
737 | } | ||
738 | |||
739 | static int at91_pinconf_set(struct pinctrl_dev *pctldev, | ||
740 | unsigned pin_id, unsigned long config) | ||
741 | { | ||
742 | struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); | ||
743 | unsigned mask; | ||
744 | void __iomem *pio; | ||
745 | |||
746 | dev_dbg(info->dev, "%s:%d, pin_id=%d, config=0x%lx", __func__, __LINE__, pin_id, config); | ||
747 | pio = pin_to_controller(info, pin_to_bank(pin_id)); | ||
748 | mask = pin_to_mask(pin_id % MAX_NB_GPIO_PER_BANK); | ||
749 | |||
750 | if (config & PULL_UP && config & PULL_DOWN) | ||
751 | return -EINVAL; | ||
752 | |||
753 | at91_mux_set_pullup(pio, mask, config & PULL_UP); | ||
754 | at91_mux_set_multidrive(pio, mask, config & MULTI_DRIVE); | ||
755 | if (info->ops->set_deglitch) | ||
756 | info->ops->set_deglitch(pio, mask, config & DEGLITCH); | ||
757 | if (info->ops->set_debounce) | ||
758 | info->ops->set_debounce(pio, mask, config & DEBOUNCE, | ||
759 | (config & DEBOUNCE_VAL) >> DEBOUNCE_VAL_SHIFT); | ||
760 | if (info->ops->set_pulldown) | ||
761 | info->ops->set_pulldown(pio, mask, config & PULL_DOWN); | ||
762 | if (info->ops->disable_schmitt_trig && config & DIS_SCHMIT) | ||
763 | info->ops->disable_schmitt_trig(pio, mask); | ||
764 | |||
765 | return 0; | ||
766 | } | ||
767 | |||
768 | static void at91_pinconf_dbg_show(struct pinctrl_dev *pctldev, | ||
769 | struct seq_file *s, unsigned pin_id) | ||
770 | { | ||
771 | |||
772 | } | ||
773 | |||
774 | static void at91_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, | ||
775 | struct seq_file *s, unsigned group) | ||
776 | { | ||
777 | } | ||
778 | |||
779 | static struct pinconf_ops at91_pinconf_ops = { | ||
780 | .pin_config_get = at91_pinconf_get, | ||
781 | .pin_config_set = at91_pinconf_set, | ||
782 | .pin_config_dbg_show = at91_pinconf_dbg_show, | ||
783 | .pin_config_group_dbg_show = at91_pinconf_group_dbg_show, | ||
784 | }; | ||
785 | |||
786 | static struct pinctrl_desc at91_pinctrl_desc = { | ||
787 | .pctlops = &at91_pctrl_ops, | ||
788 | .pmxops = &at91_pmx_ops, | ||
789 | .confops = &at91_pinconf_ops, | ||
790 | .owner = THIS_MODULE, | ||
791 | }; | ||
792 | |||
793 | static const char *gpio_compat = "atmel,at91rm9200-gpio"; | ||
794 | |||
795 | static void __devinit at91_pinctrl_child_count(struct at91_pinctrl *info, | ||
796 | struct device_node *np) | ||
797 | { | ||
798 | struct device_node *child; | ||
799 | |||
800 | for_each_child_of_node(np, child) { | ||
801 | if (of_device_is_compatible(child, gpio_compat)) { | ||
802 | info->nbanks++; | ||
803 | } else { | ||
804 | info->nfunctions++; | ||
805 | info->ngroups += of_get_child_count(child); | ||
806 | } | ||
807 | } | ||
808 | } | ||
809 | |||
810 | static int __devinit at91_pinctrl_mux_mask(struct at91_pinctrl *info, | ||
811 | struct device_node *np) | ||
812 | { | ||
813 | int ret = 0; | ||
814 | int size; | ||
815 | const const __be32 *list; | ||
816 | |||
817 | list = of_get_property(np, "atmel,mux-mask", &size); | ||
818 | if (!list) { | ||
819 | dev_err(info->dev, "can not read the mux-mask of %d\n", size); | ||
820 | return -EINVAL; | ||
821 | } | ||
822 | |||
823 | size /= sizeof(*list); | ||
824 | if (!size || size % info->nbanks) { | ||
825 | dev_err(info->dev, "wrong mux mask array should be by %d\n", info->nbanks); | ||
826 | return -EINVAL; | ||
827 | } | ||
828 | info->nmux = size / info->nbanks; | ||
829 | |||
830 | info->mux_mask = devm_kzalloc(info->dev, sizeof(u32) * size, GFP_KERNEL); | ||
831 | if (!info->mux_mask) { | ||
832 | dev_err(info->dev, "could not alloc mux_mask\n"); | ||
833 | return -ENOMEM; | ||
834 | } | ||
835 | |||
836 | ret = of_property_read_u32_array(np, "atmel,mux-mask", | ||
837 | info->mux_mask, size); | ||
838 | if (ret) | ||
839 | dev_err(info->dev, "can not read the mux-mask of %d\n", size); | ||
840 | return ret; | ||
841 | } | ||
842 | |||
843 | static int __devinit at91_pinctrl_parse_groups(struct device_node *np, | ||
844 | struct at91_pin_group *grp, | ||
845 | struct at91_pinctrl *info, | ||
846 | u32 index) | ||
847 | { | ||
848 | struct at91_pmx_pin *pin; | ||
849 | int size; | ||
850 | const const __be32 *list; | ||
851 | int i, j; | ||
852 | |||
853 | dev_dbg(info->dev, "group(%d): %s\n", index, np->name); | ||
854 | |||
855 | /* Initialise group */ | ||
856 | grp->name = np->name; | ||
857 | |||
858 | /* | ||
859 | * the binding format is atmel,pins = <bank pin mux CONFIG ...>, | ||
860 | * do sanity check and calculate pins number | ||
861 | */ | ||
862 | list = of_get_property(np, "atmel,pins", &size); | ||
863 | /* we do not check return since it's safe node passed down */ | ||
864 | size /= sizeof(*list); | ||
865 | if (!size || size % 4) { | ||
866 | dev_err(info->dev, "wrong pins number or pins and configs should be by 4\n"); | ||
867 | return -EINVAL; | ||
868 | } | ||
869 | |||
870 | grp->npins = size / 4; | ||
871 | pin = grp->pins_conf = devm_kzalloc(info->dev, grp->npins * sizeof(struct at91_pmx_pin), | ||
872 | GFP_KERNEL); | ||
873 | grp->pins = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int), | ||
874 | GFP_KERNEL); | ||
875 | if (!grp->pins_conf || !grp->pins) | ||
876 | return -ENOMEM; | ||
877 | |||
878 | for (i = 0, j = 0; i < size; i += 4, j++) { | ||
879 | pin->bank = be32_to_cpu(*list++); | ||
880 | pin->pin = be32_to_cpu(*list++); | ||
881 | grp->pins[j] = pin->bank * MAX_NB_GPIO_PER_BANK + pin->pin; | ||
882 | pin->mux = be32_to_cpu(*list++); | ||
883 | pin->conf = be32_to_cpu(*list++); | ||
884 | |||
885 | at91_pin_dbg(info->dev, pin); | ||
886 | pin++; | ||
887 | } | ||
888 | |||
889 | return 0; | ||
890 | } | ||
891 | |||
892 | static int __devinit at91_pinctrl_parse_functions(struct device_node *np, | ||
893 | struct at91_pinctrl *info, u32 index) | ||
894 | { | ||
895 | struct device_node *child; | ||
896 | struct at91_pmx_func *func; | ||
897 | struct at91_pin_group *grp; | ||
898 | int ret; | ||
899 | static u32 grp_index; | ||
900 | u32 i = 0; | ||
901 | |||
902 | dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name); | ||
903 | |||
904 | func = &info->functions[index]; | ||
905 | |||
906 | /* Initialise function */ | ||
907 | func->name = np->name; | ||
908 | func->ngroups = of_get_child_count(np); | ||
909 | if (func->ngroups <= 0) { | ||
910 | dev_err(info->dev, "no groups defined\n"); | ||
911 | return -EINVAL; | ||
912 | } | ||
913 | func->groups = devm_kzalloc(info->dev, | ||
914 | func->ngroups * sizeof(char *), GFP_KERNEL); | ||
915 | if (!func->groups) | ||
916 | return -ENOMEM; | ||
917 | |||
918 | for_each_child_of_node(np, child) { | ||
919 | func->groups[i] = child->name; | ||
920 | grp = &info->groups[grp_index++]; | ||
921 | ret = at91_pinctrl_parse_groups(child, grp, info, i++); | ||
922 | if (ret) | ||
923 | return ret; | ||
924 | } | ||
925 | |||
926 | return 0; | ||
927 | } | ||
928 | |||
929 | static struct of_device_id at91_pinctrl_of_match[] __devinitdata = { | ||
930 | { .compatible = "atmel,at91sam9x5-pinctrl", .data = &at91sam9x5_ops }, | ||
931 | { .compatible = "atmel,at91rm9200-pinctrl", .data = &at91rm9200_ops }, | ||
932 | { /* sentinel */ } | ||
933 | }; | ||
934 | |||
935 | static int __devinit at91_pinctrl_probe_dt(struct platform_device *pdev, | ||
936 | struct at91_pinctrl *info) | ||
937 | { | ||
938 | int ret = 0; | ||
939 | int i, j; | ||
940 | uint32_t *tmp; | ||
941 | struct device_node *np = pdev->dev.of_node; | ||
942 | struct device_node *child; | ||
943 | |||
944 | if (!np) | ||
945 | return -ENODEV; | ||
946 | |||
947 | info->dev = &pdev->dev; | ||
948 | info->ops = (struct at91_pinctrl_mux_ops*) | ||
949 | of_match_device(at91_pinctrl_of_match, &pdev->dev)->data; | ||
950 | at91_pinctrl_child_count(info, np); | ||
951 | |||
952 | if (info->nbanks < 1) { | ||
953 | dev_err(&pdev->dev, "you need to specify atleast one gpio-controller\n"); | ||
954 | return -EINVAL; | ||
955 | } | ||
956 | |||
957 | ret = at91_pinctrl_mux_mask(info, np); | ||
958 | if (ret) | ||
959 | return ret; | ||
960 | |||
961 | dev_dbg(&pdev->dev, "nmux = %d\n", info->nmux); | ||
962 | |||
963 | dev_dbg(&pdev->dev, "mux-mask\n"); | ||
964 | tmp = info->mux_mask; | ||
965 | for (i = 0; i < info->nbanks; i++) { | ||
966 | for (j = 0; j < info->nmux; j++, tmp++) { | ||
967 | dev_dbg(&pdev->dev, "%d:%d\t0x%x\n", i, j, tmp[0]); | ||
968 | } | ||
969 | } | ||
970 | |||
971 | dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions); | ||
972 | dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups); | ||
973 | info->functions = devm_kzalloc(&pdev->dev, info->nfunctions * sizeof(struct at91_pmx_func), | ||
974 | GFP_KERNEL); | ||
975 | if (!info->functions) | ||
976 | return -ENOMEM; | ||
977 | |||
978 | info->groups = devm_kzalloc(&pdev->dev, info->ngroups * sizeof(struct at91_pin_group), | ||
979 | GFP_KERNEL); | ||
980 | if (!info->groups) | ||
981 | return -ENOMEM; | ||
982 | |||
983 | dev_dbg(&pdev->dev, "nbanks = %d\n", info->nbanks); | ||
984 | dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions); | ||
985 | dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups); | ||
986 | |||
987 | i = 0; | ||
988 | |||
989 | for_each_child_of_node(np, child) { | ||
990 | if (of_device_is_compatible(child, gpio_compat)) | ||
991 | continue; | ||
992 | ret = at91_pinctrl_parse_functions(child, info, i++); | ||
993 | if (ret) { | ||
994 | dev_err(&pdev->dev, "failed to parse function\n"); | ||
995 | return ret; | ||
996 | } | ||
997 | } | ||
998 | |||
999 | return 0; | ||
1000 | } | ||
1001 | |||
1002 | static int __devinit at91_pinctrl_probe(struct platform_device *pdev) | ||
1003 | { | ||
1004 | struct at91_pinctrl *info; | ||
1005 | struct pinctrl_pin_desc *pdesc; | ||
1006 | int ret, i, j ,k; | ||
1007 | |||
1008 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); | ||
1009 | if (!info) | ||
1010 | return -ENOMEM; | ||
1011 | |||
1012 | ret = at91_pinctrl_probe_dt(pdev, info); | ||
1013 | if (ret) | ||
1014 | return ret; | ||
1015 | |||
1016 | /* | ||
1017 | * We need all the GPIO drivers to probe FIRST, or we will not be able | ||
1018 | * to obtain references to the struct gpio_chip * for them, and we | ||
1019 | * need this to proceed. | ||
1020 | */ | ||
1021 | for (i = 0; i < info->nbanks; i++) { | ||
1022 | if (!gpio_chips[i]) { | ||
1023 | dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i); | ||
1024 | devm_kfree(&pdev->dev, info); | ||
1025 | return -EPROBE_DEFER; | ||
1026 | } | ||
1027 | } | ||
1028 | |||
1029 | at91_pinctrl_desc.name = dev_name(&pdev->dev); | ||
1030 | at91_pinctrl_desc.npins = info->nbanks * MAX_NB_GPIO_PER_BANK; | ||
1031 | at91_pinctrl_desc.pins = pdesc = | ||
1032 | devm_kzalloc(&pdev->dev, sizeof(*pdesc) * at91_pinctrl_desc.npins, GFP_KERNEL); | ||
1033 | |||
1034 | if (!at91_pinctrl_desc.pins) | ||
1035 | return -ENOMEM; | ||
1036 | |||
1037 | for (i = 0 , k = 0; i < info->nbanks; i++) { | ||
1038 | for (j = 0; j < MAX_NB_GPIO_PER_BANK; j++, k++) { | ||
1039 | pdesc->number = k; | ||
1040 | pdesc->name = kasprintf(GFP_KERNEL, "pio%c%d", i + 'A', j); | ||
1041 | pdesc++; | ||
1042 | } | ||
1043 | } | ||
1044 | |||
1045 | platform_set_drvdata(pdev, info); | ||
1046 | info->pctl = pinctrl_register(&at91_pinctrl_desc, &pdev->dev, info); | ||
1047 | |||
1048 | if (!info->pctl) { | ||
1049 | dev_err(&pdev->dev, "could not register AT91 pinctrl driver\n"); | ||
1050 | ret = -EINVAL; | ||
1051 | goto err; | ||
1052 | } | ||
1053 | |||
1054 | /* We will handle a range of GPIO pins */ | ||
1055 | for (i = 0; i < info->nbanks; i++) | ||
1056 | pinctrl_add_gpio_range(info->pctl, &gpio_chips[i]->range); | ||
1057 | |||
1058 | dev_info(&pdev->dev, "initialized AT91 pinctrl driver\n"); | ||
1059 | |||
1060 | return 0; | ||
1061 | |||
1062 | err: | ||
1063 | return ret; | ||
1064 | } | ||
1065 | |||
1066 | static int __devexit at91_pinctrl_remove(struct platform_device *pdev) | ||
1067 | { | ||
1068 | struct at91_pinctrl *info = platform_get_drvdata(pdev); | ||
1069 | |||
1070 | pinctrl_unregister(info->pctl); | ||
1071 | |||
1072 | return 0; | ||
1073 | } | ||
1074 | |||
1075 | static int at91_gpio_request(struct gpio_chip *chip, unsigned offset) | ||
1076 | { | ||
1077 | /* | ||
1078 | * Map back to global GPIO space and request muxing, the direction | ||
1079 | * parameter does not matter for this controller. | ||
1080 | */ | ||
1081 | int gpio = chip->base + offset; | ||
1082 | int bank = chip->base / chip->ngpio; | ||
1083 | |||
1084 | dev_dbg(chip->dev, "%s:%d pio%c%d(%d)\n", __func__, __LINE__, | ||
1085 | 'A' + bank, offset, gpio); | ||
1086 | |||
1087 | return pinctrl_request_gpio(gpio); | ||
1088 | } | ||
1089 | |||
1090 | static void at91_gpio_free(struct gpio_chip *chip, unsigned offset) | ||
1091 | { | ||
1092 | int gpio = chip->base + offset; | ||
1093 | |||
1094 | pinctrl_free_gpio(gpio); | ||
1095 | } | ||
1096 | |||
1097 | static int at91_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
1098 | { | ||
1099 | struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); | ||
1100 | void __iomem *pio = at91_gpio->regbase; | ||
1101 | unsigned mask = 1 << offset; | ||
1102 | |||
1103 | writel_relaxed(mask, pio + PIO_ODR); | ||
1104 | return 0; | ||
1105 | } | ||
1106 | |||
1107 | static int at91_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
1108 | { | ||
1109 | struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); | ||
1110 | void __iomem *pio = at91_gpio->regbase; | ||
1111 | unsigned mask = 1 << offset; | ||
1112 | u32 pdsr; | ||
1113 | |||
1114 | pdsr = readl_relaxed(pio + PIO_PDSR); | ||
1115 | return (pdsr & mask) != 0; | ||
1116 | } | ||
1117 | |||
1118 | static void at91_gpio_set(struct gpio_chip *chip, unsigned offset, | ||
1119 | int val) | ||
1120 | { | ||
1121 | struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); | ||
1122 | void __iomem *pio = at91_gpio->regbase; | ||
1123 | unsigned mask = 1 << offset; | ||
1124 | |||
1125 | writel_relaxed(mask, pio + (val ? PIO_SODR : PIO_CODR)); | ||
1126 | } | ||
1127 | |||
1128 | static int at91_gpio_direction_output(struct gpio_chip *chip, unsigned offset, | ||
1129 | int val) | ||
1130 | { | ||
1131 | struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); | ||
1132 | void __iomem *pio = at91_gpio->regbase; | ||
1133 | unsigned mask = 1 << offset; | ||
1134 | |||
1135 | writel_relaxed(mask, pio + (val ? PIO_SODR : PIO_CODR)); | ||
1136 | writel_relaxed(mask, pio + PIO_OER); | ||
1137 | |||
1138 | return 0; | ||
1139 | } | ||
1140 | |||
1141 | static int at91_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | ||
1142 | { | ||
1143 | struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); | ||
1144 | int virq; | ||
1145 | |||
1146 | if (offset < chip->ngpio) | ||
1147 | virq = irq_create_mapping(at91_gpio->domain, offset); | ||
1148 | else | ||
1149 | virq = -ENXIO; | ||
1150 | |||
1151 | dev_dbg(chip->dev, "%s: request IRQ for GPIO %d, return %d\n", | ||
1152 | chip->label, offset + chip->base, virq); | ||
1153 | return virq; | ||
1154 | } | ||
1155 | |||
1156 | #ifdef CONFIG_DEBUG_FS | ||
1157 | static void at91_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) | ||
1158 | { | ||
1159 | enum at91_mux mode; | ||
1160 | int i; | ||
1161 | struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); | ||
1162 | void __iomem *pio = at91_gpio->regbase; | ||
1163 | |||
1164 | for (i = 0; i < chip->ngpio; i++) { | ||
1165 | unsigned pin = chip->base + i; | ||
1166 | unsigned mask = pin_to_mask(pin); | ||
1167 | const char *gpio_label; | ||
1168 | u32 pdsr; | ||
1169 | |||
1170 | gpio_label = gpiochip_is_requested(chip, i); | ||
1171 | if (!gpio_label) | ||
1172 | continue; | ||
1173 | mode = at91_gpio->ops->get_periph(pio, mask); | ||
1174 | seq_printf(s, "[%s] GPIO%s%d: ", | ||
1175 | gpio_label, chip->label, i); | ||
1176 | if (mode == AT91_MUX_GPIO) { | ||
1177 | pdsr = readl_relaxed(pio + PIO_PDSR); | ||
1178 | |||
1179 | seq_printf(s, "[gpio] %s\n", | ||
1180 | pdsr & mask ? | ||
1181 | "set" : "clear"); | ||
1182 | } else { | ||
1183 | seq_printf(s, "[periph %c]\n", | ||
1184 | mode + 'A' - 1); | ||
1185 | } | ||
1186 | } | ||
1187 | } | ||
1188 | #else | ||
1189 | #define at91_gpio_dbg_show NULL | ||
1190 | #endif | ||
1191 | |||
1192 | /* Several AIC controller irqs are dispatched through this GPIO handler. | ||
1193 | * To use any AT91_PIN_* as an externally triggered IRQ, first call | ||
1194 | * at91_set_gpio_input() then maybe enable its glitch filter. | ||
1195 | * Then just request_irq() with the pin ID; it works like any ARM IRQ | ||
1196 | * handler. | ||
1197 | * First implementation always triggers on rising and falling edges | ||
1198 | * whereas the newer PIO3 can be additionally configured to trigger on | ||
1199 | * level, edge with any polarity. | ||
1200 | * | ||
1201 | * Alternatively, certain pins may be used directly as IRQ0..IRQ6 after | ||
1202 | * configuring them with at91_set_a_periph() or at91_set_b_periph(). | ||
1203 | * IRQ0..IRQ6 should be configurable, e.g. level vs edge triggering. | ||
1204 | */ | ||
1205 | |||
1206 | static void gpio_irq_mask(struct irq_data *d) | ||
1207 | { | ||
1208 | struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); | ||
1209 | void __iomem *pio = at91_gpio->regbase; | ||
1210 | unsigned mask = 1 << d->hwirq; | ||
1211 | |||
1212 | if (pio) | ||
1213 | writel_relaxed(mask, pio + PIO_IDR); | ||
1214 | } | ||
1215 | |||
1216 | static void gpio_irq_unmask(struct irq_data *d) | ||
1217 | { | ||
1218 | struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); | ||
1219 | void __iomem *pio = at91_gpio->regbase; | ||
1220 | unsigned mask = 1 << d->hwirq; | ||
1221 | |||
1222 | if (pio) | ||
1223 | writel_relaxed(mask, pio + PIO_IER); | ||
1224 | } | ||
1225 | |||
1226 | static int gpio_irq_type(struct irq_data *d, unsigned type) | ||
1227 | { | ||
1228 | switch (type) { | ||
1229 | case IRQ_TYPE_NONE: | ||
1230 | case IRQ_TYPE_EDGE_BOTH: | ||
1231 | return 0; | ||
1232 | default: | ||
1233 | return -EINVAL; | ||
1234 | } | ||
1235 | } | ||
1236 | |||
1237 | /* Alternate irq type for PIO3 support */ | ||
1238 | static int alt_gpio_irq_type(struct irq_data *d, unsigned type) | ||
1239 | { | ||
1240 | struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); | ||
1241 | void __iomem *pio = at91_gpio->regbase; | ||
1242 | unsigned mask = 1 << d->hwirq; | ||
1243 | |||
1244 | switch (type) { | ||
1245 | case IRQ_TYPE_EDGE_RISING: | ||
1246 | writel_relaxed(mask, pio + PIO_ESR); | ||
1247 | writel_relaxed(mask, pio + PIO_REHLSR); | ||
1248 | break; | ||
1249 | case IRQ_TYPE_EDGE_FALLING: | ||
1250 | writel_relaxed(mask, pio + PIO_ESR); | ||
1251 | writel_relaxed(mask, pio + PIO_FELLSR); | ||
1252 | break; | ||
1253 | case IRQ_TYPE_LEVEL_LOW: | ||
1254 | writel_relaxed(mask, pio + PIO_LSR); | ||
1255 | writel_relaxed(mask, pio + PIO_FELLSR); | ||
1256 | break; | ||
1257 | case IRQ_TYPE_LEVEL_HIGH: | ||
1258 | writel_relaxed(mask, pio + PIO_LSR); | ||
1259 | writel_relaxed(mask, pio + PIO_REHLSR); | ||
1260 | break; | ||
1261 | case IRQ_TYPE_EDGE_BOTH: | ||
1262 | /* | ||
1263 | * disable additional interrupt modes: | ||
1264 | * fall back to default behavior | ||
1265 | */ | ||
1266 | writel_relaxed(mask, pio + PIO_AIMDR); | ||
1267 | return 0; | ||
1268 | case IRQ_TYPE_NONE: | ||
1269 | default: | ||
1270 | pr_warn("AT91: No type for irq %d\n", gpio_to_irq(d->irq)); | ||
1271 | return -EINVAL; | ||
1272 | } | ||
1273 | |||
1274 | /* enable additional interrupt modes */ | ||
1275 | writel_relaxed(mask, pio + PIO_AIMER); | ||
1276 | |||
1277 | return 0; | ||
1278 | } | ||
1279 | |||
1280 | #ifdef CONFIG_PM | ||
1281 | static int gpio_irq_set_wake(struct irq_data *d, unsigned state) | ||
1282 | { | ||
1283 | struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); | ||
1284 | unsigned bank = at91_gpio->pioc_idx; | ||
1285 | |||
1286 | if (unlikely(bank >= MAX_GPIO_BANKS)) | ||
1287 | return -EINVAL; | ||
1288 | |||
1289 | irq_set_irq_wake(at91_gpio->pioc_virq, state); | ||
1290 | |||
1291 | return 0; | ||
1292 | } | ||
1293 | #else | ||
1294 | #define gpio_irq_set_wake NULL | ||
1295 | #endif | ||
1296 | |||
1297 | static struct irq_chip gpio_irqchip = { | ||
1298 | .name = "GPIO", | ||
1299 | .irq_disable = gpio_irq_mask, | ||
1300 | .irq_mask = gpio_irq_mask, | ||
1301 | .irq_unmask = gpio_irq_unmask, | ||
1302 | /* .irq_set_type is set dynamically */ | ||
1303 | .irq_set_wake = gpio_irq_set_wake, | ||
1304 | }; | ||
1305 | |||
1306 | static void gpio_irq_handler(unsigned irq, struct irq_desc *desc) | ||
1307 | { | ||
1308 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
1309 | struct irq_data *idata = irq_desc_get_irq_data(desc); | ||
1310 | struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(idata); | ||
1311 | void __iomem *pio = at91_gpio->regbase; | ||
1312 | unsigned long isr; | ||
1313 | int n; | ||
1314 | |||
1315 | chained_irq_enter(chip, desc); | ||
1316 | for (;;) { | ||
1317 | /* Reading ISR acks pending (edge triggered) GPIO interrupts. | ||
1318 | * When there none are pending, we're finished unless we need | ||
1319 | * to process multiple banks (like ID_PIOCDE on sam9263). | ||
1320 | */ | ||
1321 | isr = readl_relaxed(pio + PIO_ISR) & readl_relaxed(pio + PIO_IMR); | ||
1322 | if (!isr) { | ||
1323 | if (!at91_gpio->next) | ||
1324 | break; | ||
1325 | at91_gpio = at91_gpio->next; | ||
1326 | pio = at91_gpio->regbase; | ||
1327 | continue; | ||
1328 | } | ||
1329 | |||
1330 | for_each_set_bit(n, &isr, BITS_PER_LONG) { | ||
1331 | generic_handle_irq(irq_find_mapping(at91_gpio->domain, n)); | ||
1332 | } | ||
1333 | } | ||
1334 | chained_irq_exit(chip, desc); | ||
1335 | /* now it may re-trigger */ | ||
1336 | } | ||
1337 | |||
1338 | /* | ||
1339 | * This lock class tells lockdep that GPIO irqs are in a different | ||
1340 | * category than their parents, so it won't report false recursion. | ||
1341 | */ | ||
1342 | static struct lock_class_key gpio_lock_class; | ||
1343 | |||
1344 | static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq, | ||
1345 | irq_hw_number_t hw) | ||
1346 | { | ||
1347 | struct at91_gpio_chip *at91_gpio = h->host_data; | ||
1348 | |||
1349 | irq_set_lockdep_class(virq, &gpio_lock_class); | ||
1350 | |||
1351 | /* | ||
1352 | * Can use the "simple" and not "edge" handler since it's | ||
1353 | * shorter, and the AIC handles interrupts sanely. | ||
1354 | */ | ||
1355 | irq_set_chip_and_handler(virq, &gpio_irqchip, | ||
1356 | handle_simple_irq); | ||
1357 | set_irq_flags(virq, IRQF_VALID); | ||
1358 | irq_set_chip_data(virq, at91_gpio); | ||
1359 | |||
1360 | return 0; | ||
1361 | } | ||
1362 | |||
1363 | static int at91_gpio_irq_domain_xlate(struct irq_domain *d, | ||
1364 | struct device_node *ctrlr, | ||
1365 | const u32 *intspec, unsigned int intsize, | ||
1366 | irq_hw_number_t *out_hwirq, | ||
1367 | unsigned int *out_type) | ||
1368 | { | ||
1369 | struct at91_gpio_chip *at91_gpio = d->host_data; | ||
1370 | int ret; | ||
1371 | int pin = at91_gpio->chip.base + intspec[0]; | ||
1372 | |||
1373 | if (WARN_ON(intsize < 2)) | ||
1374 | return -EINVAL; | ||
1375 | *out_hwirq = intspec[0]; | ||
1376 | *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; | ||
1377 | |||
1378 | ret = gpio_request(pin, ctrlr->full_name); | ||
1379 | if (ret) | ||
1380 | return ret; | ||
1381 | |||
1382 | ret = gpio_direction_input(pin); | ||
1383 | if (ret) | ||
1384 | return ret; | ||
1385 | |||
1386 | return 0; | ||
1387 | } | ||
1388 | |||
1389 | static struct irq_domain_ops at91_gpio_ops = { | ||
1390 | .map = at91_gpio_irq_map, | ||
1391 | .xlate = at91_gpio_irq_domain_xlate, | ||
1392 | }; | ||
1393 | |||
1394 | static int at91_gpio_of_irq_setup(struct device_node *node, | ||
1395 | struct at91_gpio_chip *at91_gpio) | ||
1396 | { | ||
1397 | struct at91_gpio_chip *prev = NULL; | ||
1398 | struct irq_data *d = irq_get_irq_data(at91_gpio->pioc_virq); | ||
1399 | |||
1400 | at91_gpio->pioc_hwirq = irqd_to_hwirq(d); | ||
1401 | |||
1402 | /* Setup proper .irq_set_type function */ | ||
1403 | gpio_irqchip.irq_set_type = at91_gpio->ops->irq_type; | ||
1404 | |||
1405 | /* Disable irqs of this PIO controller */ | ||
1406 | writel_relaxed(~0, at91_gpio->regbase + PIO_IDR); | ||
1407 | |||
1408 | /* Setup irq domain */ | ||
1409 | at91_gpio->domain = irq_domain_add_linear(node, at91_gpio->chip.ngpio, | ||
1410 | &at91_gpio_ops, at91_gpio); | ||
1411 | if (!at91_gpio->domain) | ||
1412 | panic("at91_gpio.%d: couldn't allocate irq domain (DT).\n", | ||
1413 | at91_gpio->pioc_idx); | ||
1414 | |||
1415 | /* Setup chained handler */ | ||
1416 | if (at91_gpio->pioc_idx) | ||
1417 | prev = gpio_chips[at91_gpio->pioc_idx - 1]; | ||
1418 | |||
1419 | /* The toplevel handler handles one bank of GPIOs, except | ||
1420 | * on some SoC it can handles up to three... | ||
1421 | * We only set up the handler for the first of the list. | ||
1422 | */ | ||
1423 | if (prev && prev->next == at91_gpio) | ||
1424 | return 0; | ||
1425 | |||
1426 | irq_set_chip_data(at91_gpio->pioc_virq, at91_gpio); | ||
1427 | irq_set_chained_handler(at91_gpio->pioc_virq, gpio_irq_handler); | ||
1428 | |||
1429 | return 0; | ||
1430 | } | ||
1431 | |||
1432 | /* This structure is replicated for each GPIO block allocated at probe time */ | ||
1433 | static struct gpio_chip at91_gpio_template = { | ||
1434 | .request = at91_gpio_request, | ||
1435 | .free = at91_gpio_free, | ||
1436 | .direction_input = at91_gpio_direction_input, | ||
1437 | .get = at91_gpio_get, | ||
1438 | .direction_output = at91_gpio_direction_output, | ||
1439 | .set = at91_gpio_set, | ||
1440 | .to_irq = at91_gpio_to_irq, | ||
1441 | .dbg_show = at91_gpio_dbg_show, | ||
1442 | .can_sleep = 0, | ||
1443 | .ngpio = MAX_NB_GPIO_PER_BANK, | ||
1444 | }; | ||
1445 | |||
1446 | static void __devinit at91_gpio_probe_fixup(void) | ||
1447 | { | ||
1448 | unsigned i; | ||
1449 | struct at91_gpio_chip *at91_gpio, *last = NULL; | ||
1450 | |||
1451 | for (i = 0; i < gpio_banks; i++) { | ||
1452 | at91_gpio = gpio_chips[i]; | ||
1453 | |||
1454 | /* | ||
1455 | * GPIO controller are grouped on some SoC: | ||
1456 | * PIOC, PIOD and PIOE can share the same IRQ line | ||
1457 | */ | ||
1458 | if (last && last->pioc_virq == at91_gpio->pioc_virq) | ||
1459 | last->next = at91_gpio; | ||
1460 | last = at91_gpio; | ||
1461 | } | ||
1462 | } | ||
1463 | |||
1464 | static struct of_device_id at91_gpio_of_match[] __devinitdata = { | ||
1465 | { .compatible = "atmel,at91sam9x5-gpio", .data = &at91sam9x5_ops, }, | ||
1466 | { .compatible = "atmel,at91rm9200-gpio", .data = &at91rm9200_ops }, | ||
1467 | { /* sentinel */ } | ||
1468 | }; | ||
1469 | |||
1470 | static int __devinit at91_gpio_probe(struct platform_device *pdev) | ||
1471 | { | ||
1472 | struct device_node *np = pdev->dev.of_node; | ||
1473 | struct resource *res; | ||
1474 | struct at91_gpio_chip *at91_chip = NULL; | ||
1475 | struct gpio_chip *chip; | ||
1476 | struct pinctrl_gpio_range *range; | ||
1477 | int ret = 0; | ||
1478 | int irq, i; | ||
1479 | int alias_idx = of_alias_get_id(np, "gpio"); | ||
1480 | uint32_t ngpio; | ||
1481 | char **names; | ||
1482 | |||
1483 | BUG_ON(alias_idx >= ARRAY_SIZE(gpio_chips)); | ||
1484 | if (gpio_chips[alias_idx]) { | ||
1485 | ret = -EBUSY; | ||
1486 | goto err; | ||
1487 | } | ||
1488 | |||
1489 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1490 | if (!res) { | ||
1491 | ret = -ENOENT; | ||
1492 | goto err; | ||
1493 | } | ||
1494 | |||
1495 | irq = platform_get_irq(pdev, 0); | ||
1496 | if (irq < 0) { | ||
1497 | ret = irq; | ||
1498 | goto err; | ||
1499 | } | ||
1500 | |||
1501 | at91_chip = devm_kzalloc(&pdev->dev, sizeof(*at91_chip), GFP_KERNEL); | ||
1502 | if (!at91_chip) { | ||
1503 | ret = -ENOMEM; | ||
1504 | goto err; | ||
1505 | } | ||
1506 | |||
1507 | at91_chip->regbase = devm_request_and_ioremap(&pdev->dev, res); | ||
1508 | if (!at91_chip->regbase) { | ||
1509 | dev_err(&pdev->dev, "failed to map registers, ignoring.\n"); | ||
1510 | ret = -EBUSY; | ||
1511 | goto err; | ||
1512 | } | ||
1513 | |||
1514 | at91_chip->ops = (struct at91_pinctrl_mux_ops*) | ||
1515 | of_match_device(at91_gpio_of_match, &pdev->dev)->data; | ||
1516 | at91_chip->pioc_virq = irq; | ||
1517 | at91_chip->pioc_idx = alias_idx; | ||
1518 | |||
1519 | at91_chip->clock = clk_get(&pdev->dev, NULL); | ||
1520 | if (IS_ERR(at91_chip->clock)) { | ||
1521 | dev_err(&pdev->dev, "failed to get clock, ignoring.\n"); | ||
1522 | goto err; | ||
1523 | } | ||
1524 | |||
1525 | if (clk_prepare(at91_chip->clock)) | ||
1526 | goto clk_prep_err; | ||
1527 | |||
1528 | /* enable PIO controller's clock */ | ||
1529 | if (clk_enable(at91_chip->clock)) { | ||
1530 | dev_err(&pdev->dev, "failed to enable clock, ignoring.\n"); | ||
1531 | goto clk_err; | ||
1532 | } | ||
1533 | |||
1534 | at91_chip->chip = at91_gpio_template; | ||
1535 | |||
1536 | chip = &at91_chip->chip; | ||
1537 | chip->of_node = np; | ||
1538 | chip->label = dev_name(&pdev->dev); | ||
1539 | chip->dev = &pdev->dev; | ||
1540 | chip->owner = THIS_MODULE; | ||
1541 | chip->base = alias_idx * MAX_NB_GPIO_PER_BANK; | ||
1542 | |||
1543 | if (!of_property_read_u32(np, "#gpio-lines", &ngpio)) { | ||
1544 | if (ngpio >= MAX_NB_GPIO_PER_BANK) | ||
1545 | pr_err("at91_gpio.%d, gpio-nb >= %d failback to %d\n", | ||
1546 | alias_idx, MAX_NB_GPIO_PER_BANK, MAX_NB_GPIO_PER_BANK); | ||
1547 | else | ||
1548 | chip->ngpio = ngpio; | ||
1549 | } | ||
1550 | |||
1551 | names = devm_kzalloc(&pdev->dev, sizeof(char*) * chip->ngpio, GFP_KERNEL); | ||
1552 | |||
1553 | if (!names) { | ||
1554 | ret = -ENOMEM; | ||
1555 | goto clk_err; | ||
1556 | } | ||
1557 | |||
1558 | for (i = 0; i < chip->ngpio; i++) | ||
1559 | names[i] = kasprintf(GFP_KERNEL, "pio%c%d", alias_idx + 'A', i); | ||
1560 | |||
1561 | chip->names = (const char*const*)names; | ||
1562 | |||
1563 | range = &at91_chip->range; | ||
1564 | range->name = chip->label; | ||
1565 | range->id = alias_idx; | ||
1566 | range->pin_base = range->base = range->id * MAX_NB_GPIO_PER_BANK; | ||
1567 | |||
1568 | range->npins = chip->ngpio; | ||
1569 | range->gc = chip; | ||
1570 | |||
1571 | ret = gpiochip_add(chip); | ||
1572 | if (ret) | ||
1573 | goto clk_err; | ||
1574 | |||
1575 | gpio_chips[alias_idx] = at91_chip; | ||
1576 | gpio_banks = max(gpio_banks, alias_idx + 1); | ||
1577 | |||
1578 | at91_gpio_probe_fixup(); | ||
1579 | |||
1580 | at91_gpio_of_irq_setup(np, at91_chip); | ||
1581 | |||
1582 | dev_info(&pdev->dev, "at address %p\n", at91_chip->regbase); | ||
1583 | |||
1584 | return 0; | ||
1585 | |||
1586 | clk_err: | ||
1587 | clk_unprepare(at91_chip->clock); | ||
1588 | clk_prep_err: | ||
1589 | clk_put(at91_chip->clock); | ||
1590 | err: | ||
1591 | dev_err(&pdev->dev, "Failure %i for GPIO %i\n", ret, alias_idx); | ||
1592 | |||
1593 | return ret; | ||
1594 | } | ||
1595 | |||
1596 | static struct platform_driver at91_gpio_driver = { | ||
1597 | .driver = { | ||
1598 | .name = "gpio-at91", | ||
1599 | .owner = THIS_MODULE, | ||
1600 | .of_match_table = of_match_ptr(at91_gpio_of_match), | ||
1601 | }, | ||
1602 | .probe = at91_gpio_probe, | ||
1603 | }; | ||
1604 | |||
1605 | static struct platform_driver at91_pinctrl_driver = { | ||
1606 | .driver = { | ||
1607 | .name = "pinctrl-at91", | ||
1608 | .owner = THIS_MODULE, | ||
1609 | .of_match_table = of_match_ptr(at91_pinctrl_of_match), | ||
1610 | }, | ||
1611 | .probe = at91_pinctrl_probe, | ||
1612 | .remove = __devexit_p(at91_pinctrl_remove), | ||
1613 | }; | ||
1614 | |||
1615 | static int __init at91_pinctrl_init(void) | ||
1616 | { | ||
1617 | int ret; | ||
1618 | |||
1619 | ret = platform_driver_register(&at91_gpio_driver); | ||
1620 | if (ret) | ||
1621 | return ret; | ||
1622 | return platform_driver_register(&at91_pinctrl_driver); | ||
1623 | } | ||
1624 | arch_initcall(at91_pinctrl_init); | ||
1625 | |||
1626 | static void __exit at91_pinctrl_exit(void) | ||
1627 | { | ||
1628 | platform_driver_unregister(&at91_pinctrl_driver); | ||
1629 | } | ||
1630 | |||
1631 | module_exit(at91_pinctrl_exit); | ||
1632 | MODULE_AUTHOR("Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>"); | ||
1633 | MODULE_DESCRIPTION("Atmel AT91 pinctrl driver"); | ||
1634 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/pinctrl/pinctrl-bcm2835.c b/drivers/pinctrl/pinctrl-bcm2835.c index 7e9be18ec2d2..9a963edd66d1 100644 --- a/drivers/pinctrl/pinctrl-bcm2835.c +++ b/drivers/pinctrl/pinctrl-bcm2835.c | |||
@@ -916,7 +916,7 @@ static int bcm2835_pinconf_set(struct pinctrl_dev *pctldev, | |||
916 | return 0; | 916 | return 0; |
917 | } | 917 | } |
918 | 918 | ||
919 | struct pinconf_ops bcm2835_pinconf_ops = { | 919 | static struct pinconf_ops bcm2835_pinconf_ops = { |
920 | .pin_config_get = bcm2835_pinconf_get, | 920 | .pin_config_get = bcm2835_pinconf_get, |
921 | .pin_config_set = bcm2835_pinconf_set, | 921 | .pin_config_set = bcm2835_pinconf_set, |
922 | }; | 922 | }; |
diff --git a/drivers/pinctrl/pinctrl-coh901.c b/drivers/pinctrl/pinctrl-coh901.c index b446c9641212..fbb37154471c 100644 --- a/drivers/pinctrl/pinctrl-coh901.c +++ b/drivers/pinctrl/pinctrl-coh901.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/delay.h> | 13 | #include <linux/delay.h> |
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/irqdomain.h> | ||
16 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
17 | #include <linux/err.h> | 18 | #include <linux/err.h> |
18 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
@@ -64,10 +65,8 @@ struct u300_gpio { | |||
64 | struct gpio_chip chip; | 65 | struct gpio_chip chip; |
65 | struct list_head port_list; | 66 | struct list_head port_list; |
66 | struct clk *clk; | 67 | struct clk *clk; |
67 | struct resource *memres; | ||
68 | void __iomem *base; | 68 | void __iomem *base; |
69 | struct device *dev; | 69 | struct device *dev; |
70 | int irq_base; | ||
71 | u32 stride; | 70 | u32 stride; |
72 | /* Register offsets */ | 71 | /* Register offsets */ |
73 | u32 pcr; | 72 | u32 pcr; |
@@ -83,6 +82,7 @@ struct u300_gpio_port { | |||
83 | struct list_head node; | 82 | struct list_head node; |
84 | struct u300_gpio *gpio; | 83 | struct u300_gpio *gpio; |
85 | char name[8]; | 84 | char name[8]; |
85 | struct irq_domain *domain; | ||
86 | int irq; | 86 | int irq; |
87 | int number; | 87 | int number; |
88 | u8 toggle_edge_mode; | 88 | u8 toggle_edge_mode; |
@@ -314,10 +314,30 @@ static int u300_gpio_direction_output(struct gpio_chip *chip, unsigned offset, | |||
314 | static int u300_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | 314 | static int u300_gpio_to_irq(struct gpio_chip *chip, unsigned offset) |
315 | { | 315 | { |
316 | struct u300_gpio *gpio = to_u300_gpio(chip); | 316 | struct u300_gpio *gpio = to_u300_gpio(chip); |
317 | int retirq = gpio->irq_base + offset; | 317 | int portno = offset >> 3; |
318 | struct u300_gpio_port *port = NULL; | ||
319 | struct list_head *p; | ||
320 | int retirq; | ||
318 | 321 | ||
319 | dev_dbg(gpio->dev, "request IRQ for GPIO %d, return %d\n", offset, | 322 | list_for_each(p, &gpio->port_list) { |
320 | retirq); | 323 | port = list_entry(p, struct u300_gpio_port, node); |
324 | if (port->number == portno) | ||
325 | break; | ||
326 | } | ||
327 | if (port == NULL) { | ||
328 | dev_err(gpio->dev, "could not locate port for GPIO %d IRQ\n", | ||
329 | offset); | ||
330 | return -EINVAL; | ||
331 | } | ||
332 | |||
333 | /* | ||
334 | * The local hwirqs on the port are the lower three bits, there | ||
335 | * are exactly 8 IRQs per port since they are 8-bit | ||
336 | */ | ||
337 | retirq = irq_find_mapping(port->domain, (offset & 0x7)); | ||
338 | |||
339 | dev_dbg(gpio->dev, "request IRQ for GPIO %d, return %d from port %d\n", | ||
340 | offset, retirq, port->number); | ||
321 | return retirq; | 341 | return retirq; |
322 | } | 342 | } |
323 | 343 | ||
@@ -467,7 +487,7 @@ static int u300_gpio_irq_type(struct irq_data *d, unsigned trigger) | |||
467 | { | 487 | { |
468 | struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); | 488 | struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); |
469 | struct u300_gpio *gpio = port->gpio; | 489 | struct u300_gpio *gpio = port->gpio; |
470 | int offset = d->irq - gpio->irq_base; | 490 | int offset = (port->number << 3) + d->hwirq; |
471 | u32 val; | 491 | u32 val; |
472 | 492 | ||
473 | if ((trigger & IRQF_TRIGGER_RISING) && | 493 | if ((trigger & IRQF_TRIGGER_RISING) && |
@@ -503,10 +523,12 @@ static void u300_gpio_irq_enable(struct irq_data *d) | |||
503 | { | 523 | { |
504 | struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); | 524 | struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); |
505 | struct u300_gpio *gpio = port->gpio; | 525 | struct u300_gpio *gpio = port->gpio; |
506 | int offset = d->irq - gpio->irq_base; | 526 | int offset = (port->number << 3) + d->hwirq; |
507 | u32 val; | 527 | u32 val; |
508 | unsigned long flags; | 528 | unsigned long flags; |
509 | 529 | ||
530 | dev_dbg(gpio->dev, "enable IRQ for hwirq %lu on port %s, offset %d\n", | ||
531 | d->hwirq, port->name, offset); | ||
510 | local_irq_save(flags); | 532 | local_irq_save(flags); |
511 | val = readl(U300_PIN_REG(offset, ien)); | 533 | val = readl(U300_PIN_REG(offset, ien)); |
512 | writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, ien)); | 534 | writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, ien)); |
@@ -517,7 +539,7 @@ static void u300_gpio_irq_disable(struct irq_data *d) | |||
517 | { | 539 | { |
518 | struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); | 540 | struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); |
519 | struct u300_gpio *gpio = port->gpio; | 541 | struct u300_gpio *gpio = port->gpio; |
520 | int offset = d->irq - gpio->irq_base; | 542 | int offset = (port->number << 3) + d->hwirq; |
521 | u32 val; | 543 | u32 val; |
522 | unsigned long flags; | 544 | unsigned long flags; |
523 | 545 | ||
@@ -555,8 +577,7 @@ static void u300_gpio_irq_handler(unsigned irq, struct irq_desc *desc) | |||
555 | int irqoffset; | 577 | int irqoffset; |
556 | 578 | ||
557 | for_each_set_bit(irqoffset, &val, U300_GPIO_PINS_PER_PORT) { | 579 | for_each_set_bit(irqoffset, &val, U300_GPIO_PINS_PER_PORT) { |
558 | int pin_irq = gpio->irq_base + (port->number << 3) | 580 | int pin_irq = irq_find_mapping(port->domain, irqoffset); |
559 | + irqoffset; | ||
560 | int offset = pinoffset + irqoffset; | 581 | int offset = pinoffset + irqoffset; |
561 | 582 | ||
562 | dev_dbg(gpio->dev, "GPIO IRQ %d on pin %d\n", | 583 | dev_dbg(gpio->dev, "GPIO IRQ %d on pin %d\n", |
@@ -631,64 +652,86 @@ static inline void u300_gpio_free_ports(struct u300_gpio *gpio) | |||
631 | list_for_each_safe(p, n, &gpio->port_list) { | 652 | list_for_each_safe(p, n, &gpio->port_list) { |
632 | port = list_entry(p, struct u300_gpio_port, node); | 653 | port = list_entry(p, struct u300_gpio_port, node); |
633 | list_del(&port->node); | 654 | list_del(&port->node); |
655 | if (port->domain) | ||
656 | irq_domain_remove(port->domain); | ||
634 | kfree(port); | 657 | kfree(port); |
635 | } | 658 | } |
636 | } | 659 | } |
637 | 660 | ||
661 | /* | ||
662 | * Here we map a GPIO in the local gpio_chip pin space to a pin in | ||
663 | * the local pinctrl pin space. The pin controller used is | ||
664 | * pinctrl-u300. | ||
665 | */ | ||
666 | struct coh901_pinpair { | ||
667 | unsigned int offset; | ||
668 | unsigned int pin_base; | ||
669 | }; | ||
670 | |||
671 | #define COH901_PINRANGE(a, b) { .offset = a, .pin_base = b } | ||
672 | |||
673 | static struct coh901_pinpair coh901_pintable[] = { | ||
674 | COH901_PINRANGE(10, 426), | ||
675 | COH901_PINRANGE(11, 180), | ||
676 | COH901_PINRANGE(12, 165), /* MS/MMC card insertion */ | ||
677 | COH901_PINRANGE(13, 179), | ||
678 | COH901_PINRANGE(14, 178), | ||
679 | COH901_PINRANGE(16, 194), | ||
680 | COH901_PINRANGE(17, 193), | ||
681 | COH901_PINRANGE(18, 192), | ||
682 | COH901_PINRANGE(19, 191), | ||
683 | COH901_PINRANGE(20, 186), | ||
684 | COH901_PINRANGE(21, 185), | ||
685 | COH901_PINRANGE(22, 184), | ||
686 | COH901_PINRANGE(23, 183), | ||
687 | COH901_PINRANGE(24, 182), | ||
688 | COH901_PINRANGE(25, 181), | ||
689 | }; | ||
690 | |||
638 | static int __init u300_gpio_probe(struct platform_device *pdev) | 691 | static int __init u300_gpio_probe(struct platform_device *pdev) |
639 | { | 692 | { |
640 | struct u300_gpio_platform *plat = dev_get_platdata(&pdev->dev); | 693 | struct u300_gpio_platform *plat = dev_get_platdata(&pdev->dev); |
641 | struct u300_gpio *gpio; | 694 | struct u300_gpio *gpio; |
695 | struct resource *memres; | ||
642 | int err = 0; | 696 | int err = 0; |
643 | int portno; | 697 | int portno; |
644 | u32 val; | 698 | u32 val; |
645 | u32 ifr; | 699 | u32 ifr; |
646 | int i; | 700 | int i; |
647 | 701 | ||
648 | gpio = kzalloc(sizeof(struct u300_gpio), GFP_KERNEL); | 702 | gpio = devm_kzalloc(&pdev->dev, sizeof(struct u300_gpio), GFP_KERNEL); |
649 | if (gpio == NULL) { | 703 | if (gpio == NULL) |
650 | dev_err(&pdev->dev, "failed to allocate memory\n"); | ||
651 | return -ENOMEM; | 704 | return -ENOMEM; |
652 | } | ||
653 | 705 | ||
654 | gpio->chip = u300_gpio_chip; | 706 | gpio->chip = u300_gpio_chip; |
655 | gpio->chip.ngpio = plat->ports * U300_GPIO_PINS_PER_PORT; | 707 | gpio->chip.ngpio = plat->ports * U300_GPIO_PINS_PER_PORT; |
656 | gpio->irq_base = plat->gpio_irq_base; | ||
657 | gpio->chip.dev = &pdev->dev; | 708 | gpio->chip.dev = &pdev->dev; |
658 | gpio->chip.base = plat->gpio_base; | 709 | gpio->chip.base = plat->gpio_base; |
659 | gpio->dev = &pdev->dev; | 710 | gpio->dev = &pdev->dev; |
660 | 711 | ||
661 | /* Get GPIO clock */ | 712 | memres = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
662 | gpio->clk = clk_get(gpio->dev, NULL); | 713 | if (!memres) { |
714 | dev_err(gpio->dev, "could not get GPIO memory resource\n"); | ||
715 | return -ENODEV; | ||
716 | } | ||
717 | |||
718 | gpio->base = devm_request_and_ioremap(&pdev->dev, memres); | ||
719 | if (!gpio->base) { | ||
720 | dev_err(gpio->dev, "could not get remap memory\n"); | ||
721 | return -ENOMEM; | ||
722 | } | ||
723 | |||
724 | gpio->clk = devm_clk_get(gpio->dev, NULL); | ||
663 | if (IS_ERR(gpio->clk)) { | 725 | if (IS_ERR(gpio->clk)) { |
664 | err = PTR_ERR(gpio->clk); | 726 | err = PTR_ERR(gpio->clk); |
665 | dev_err(gpio->dev, "could not get GPIO clock\n"); | 727 | dev_err(gpio->dev, "could not get GPIO clock\n"); |
666 | goto err_no_clk; | 728 | return err; |
667 | } | 729 | } |
730 | |||
668 | err = clk_prepare_enable(gpio->clk); | 731 | err = clk_prepare_enable(gpio->clk); |
669 | if (err) { | 732 | if (err) { |
670 | dev_err(gpio->dev, "could not enable GPIO clock\n"); | 733 | dev_err(gpio->dev, "could not enable GPIO clock\n"); |
671 | goto err_no_clk_enable; | 734 | return err; |
672 | } | ||
673 | |||
674 | gpio->memres = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
675 | if (!gpio->memres) { | ||
676 | dev_err(gpio->dev, "could not get GPIO memory resource\n"); | ||
677 | err = -ENODEV; | ||
678 | goto err_no_resource; | ||
679 | } | ||
680 | |||
681 | if (!request_mem_region(gpio->memres->start, | ||
682 | resource_size(gpio->memres), | ||
683 | "GPIO Controller")) { | ||
684 | err = -ENODEV; | ||
685 | goto err_no_ioregion; | ||
686 | } | ||
687 | |||
688 | gpio->base = ioremap(gpio->memres->start, resource_size(gpio->memres)); | ||
689 | if (!gpio->base) { | ||
690 | err = -ENOMEM; | ||
691 | goto err_no_ioremap; | ||
692 | } | 735 | } |
693 | 736 | ||
694 | dev_info(gpio->dev, | 737 | dev_info(gpio->dev, |
@@ -732,18 +775,28 @@ static int __init u300_gpio_probe(struct platform_device *pdev) | |||
732 | port->irq = platform_get_irq_byname(pdev, | 775 | port->irq = platform_get_irq_byname(pdev, |
733 | port->name); | 776 | port->name); |
734 | 777 | ||
735 | dev_dbg(gpio->dev, "register IRQ %d for %s\n", port->irq, | 778 | dev_dbg(gpio->dev, "register IRQ %d for port %s\n", port->irq, |
736 | port->name); | 779 | port->name); |
737 | 780 | ||
781 | port->domain = irq_domain_add_linear(pdev->dev.of_node, | ||
782 | U300_GPIO_PINS_PER_PORT, | ||
783 | &irq_domain_simple_ops, | ||
784 | port); | ||
785 | if (!port->domain) { | ||
786 | err = -ENOMEM; | ||
787 | goto err_no_domain; | ||
788 | } | ||
789 | |||
738 | irq_set_chained_handler(port->irq, u300_gpio_irq_handler); | 790 | irq_set_chained_handler(port->irq, u300_gpio_irq_handler); |
739 | irq_set_handler_data(port->irq, port); | 791 | irq_set_handler_data(port->irq, port); |
740 | 792 | ||
741 | /* For each GPIO pin set the unique IRQ handler */ | 793 | /* For each GPIO pin set the unique IRQ handler */ |
742 | for (i = 0; i < U300_GPIO_PINS_PER_PORT; i++) { | 794 | for (i = 0; i < U300_GPIO_PINS_PER_PORT; i++) { |
743 | int irqno = gpio->irq_base + (portno << 3) + i; | 795 | int irqno = irq_create_mapping(port->domain, i); |
744 | 796 | ||
745 | dev_dbg(gpio->dev, "handler for IRQ %d on %s\n", | 797 | dev_dbg(gpio->dev, "GPIO%d on port %s gets IRQ %d\n", |
746 | irqno, port->name); | 798 | gpio->chip.base + (port->number << 3) + i, |
799 | port->name, irqno); | ||
747 | irq_set_chip_and_handler(irqno, &u300_gpio_irqchip, | 800 | irq_set_chip_and_handler(irqno, &u300_gpio_irqchip, |
748 | handle_simple_irq); | 801 | handle_simple_irq); |
749 | set_irq_flags(irqno, IRQF_VALID); | 802 | set_irq_flags(irqno, IRQF_VALID); |
@@ -763,32 +816,31 @@ static int __init u300_gpio_probe(struct platform_device *pdev) | |||
763 | goto err_no_chip; | 816 | goto err_no_chip; |
764 | } | 817 | } |
765 | 818 | ||
766 | /* Spawn pin controller device as child of the GPIO, pass gpio chip */ | 819 | /* |
767 | plat->pinctrl_device->dev.platform_data = &gpio->chip; | 820 | * Add pinctrl pin ranges, the pin controller must be registered |
768 | err = platform_device_register(plat->pinctrl_device); | 821 | * at this point |
769 | if (err) | 822 | */ |
770 | goto err_no_pinctrl; | 823 | for (i = 0; i < ARRAY_SIZE(coh901_pintable); i++) { |
824 | struct coh901_pinpair *p = &coh901_pintable[i]; | ||
825 | |||
826 | err = gpiochip_add_pin_range(&gpio->chip, "pinctrl-u300", | ||
827 | p->offset, p->pin_base, 1); | ||
828 | if (err) | ||
829 | goto err_no_range; | ||
830 | } | ||
771 | 831 | ||
772 | platform_set_drvdata(pdev, gpio); | 832 | platform_set_drvdata(pdev, gpio); |
773 | 833 | ||
774 | return 0; | 834 | return 0; |
775 | 835 | ||
776 | err_no_pinctrl: | 836 | err_no_range: |
777 | err = gpiochip_remove(&gpio->chip); | 837 | err = gpiochip_remove(&gpio->chip); |
778 | err_no_chip: | 838 | err_no_chip: |
839 | err_no_domain: | ||
779 | err_no_port: | 840 | err_no_port: |
780 | u300_gpio_free_ports(gpio); | 841 | u300_gpio_free_ports(gpio); |
781 | iounmap(gpio->base); | ||
782 | err_no_ioremap: | ||
783 | release_mem_region(gpio->memres->start, resource_size(gpio->memres)); | ||
784 | err_no_ioregion: | ||
785 | err_no_resource: | ||
786 | clk_disable_unprepare(gpio->clk); | 842 | clk_disable_unprepare(gpio->clk); |
787 | err_no_clk_enable: | 843 | dev_err(&pdev->dev, "module ERROR:%d\n", err); |
788 | clk_put(gpio->clk); | ||
789 | err_no_clk: | ||
790 | kfree(gpio); | ||
791 | dev_info(&pdev->dev, "module ERROR:%d\n", err); | ||
792 | return err; | 844 | return err; |
793 | } | 845 | } |
794 | 846 | ||
@@ -806,13 +858,8 @@ static int __exit u300_gpio_remove(struct platform_device *pdev) | |||
806 | return err; | 858 | return err; |
807 | } | 859 | } |
808 | u300_gpio_free_ports(gpio); | 860 | u300_gpio_free_ports(gpio); |
809 | iounmap(gpio->base); | ||
810 | release_mem_region(gpio->memres->start, | ||
811 | resource_size(gpio->memres)); | ||
812 | clk_disable_unprepare(gpio->clk); | 861 | clk_disable_unprepare(gpio->clk); |
813 | clk_put(gpio->clk); | ||
814 | platform_set_drvdata(pdev, NULL); | 862 | platform_set_drvdata(pdev, NULL); |
815 | kfree(gpio); | ||
816 | return 0; | 863 | return 0; |
817 | } | 864 | } |
818 | 865 | ||
diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c index 21362f48d370..6ff665209a4c 100644 --- a/drivers/pinctrl/pinctrl-exynos.c +++ b/drivers/pinctrl/pinctrl-exynos.c | |||
@@ -36,6 +36,7 @@ | |||
36 | /* list of external wakeup controllers supported */ | 36 | /* list of external wakeup controllers supported */ |
37 | static const struct of_device_id exynos_wkup_irq_ids[] = { | 37 | static const struct of_device_id exynos_wkup_irq_ids[] = { |
38 | { .compatible = "samsung,exynos4210-wakeup-eint", }, | 38 | { .compatible = "samsung,exynos4210-wakeup-eint", }, |
39 | { } | ||
39 | }; | 40 | }; |
40 | 41 | ||
41 | static void exynos_gpio_irq_unmask(struct irq_data *irqd) | 42 | static void exynos_gpio_irq_unmask(struct irq_data *irqd) |
diff --git a/drivers/pinctrl/pinctrl-falcon.c b/drivers/pinctrl/pinctrl-falcon.c index ee7305903470..8ed20e84cb02 100644 --- a/drivers/pinctrl/pinctrl-falcon.c +++ b/drivers/pinctrl/pinctrl-falcon.c | |||
@@ -322,7 +322,7 @@ static void falcon_pinconf_group_dbg_show(struct pinctrl_dev *pctrldev, | |||
322 | { | 322 | { |
323 | } | 323 | } |
324 | 324 | ||
325 | struct pinconf_ops falcon_pinconf_ops = { | 325 | static struct pinconf_ops falcon_pinconf_ops = { |
326 | .pin_config_get = falcon_pinconf_get, | 326 | .pin_config_get = falcon_pinconf_get, |
327 | .pin_config_set = falcon_pinconf_set, | 327 | .pin_config_set = falcon_pinconf_set, |
328 | .pin_config_group_get = falcon_pinconf_group_get, | 328 | .pin_config_group_get = falcon_pinconf_group_get, |
diff --git a/drivers/pinctrl/pinctrl-imx.c b/drivers/pinctrl/pinctrl-imx.c index 63866d95357d..525a2c8644f6 100644 --- a/drivers/pinctrl/pinctrl-imx.c +++ b/drivers/pinctrl/pinctrl-imx.c | |||
@@ -71,7 +71,7 @@ static const struct imx_pin_reg *imx_find_pin_reg( | |||
71 | break; | 71 | break; |
72 | } | 72 | } |
73 | 73 | ||
74 | if (!pin_reg) { | 74 | if (i == info->npin_regs) { |
75 | dev_err(info->dev, "Pin(%s): unable to find pin reg map\n", | 75 | dev_err(info->dev, "Pin(%s): unable to find pin reg map\n", |
76 | info->pins[pin].name); | 76 | info->pins[pin].name); |
77 | return NULL; | 77 | return NULL; |
@@ -397,7 +397,7 @@ static void imx_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, | |||
397 | } | 397 | } |
398 | } | 398 | } |
399 | 399 | ||
400 | struct pinconf_ops imx_pinconf_ops = { | 400 | static struct pinconf_ops imx_pinconf_ops = { |
401 | .pin_config_get = imx_pinconf_get, | 401 | .pin_config_get = imx_pinconf_get, |
402 | .pin_config_set = imx_pinconf_set, | 402 | .pin_config_set = imx_pinconf_set, |
403 | .pin_config_dbg_show = imx_pinconf_dbg_show, | 403 | .pin_config_dbg_show = imx_pinconf_dbg_show, |
diff --git a/drivers/pinctrl/pinctrl-lantiq.c b/drivers/pinctrl/pinctrl-lantiq.c index 07ba7682cf22..15f501d89026 100644 --- a/drivers/pinctrl/pinctrl-lantiq.c +++ b/drivers/pinctrl/pinctrl-lantiq.c | |||
@@ -46,8 +46,8 @@ static int ltq_get_group_pins(struct pinctrl_dev *pctrldev, | |||
46 | return 0; | 46 | return 0; |
47 | } | 47 | } |
48 | 48 | ||
49 | void ltq_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, | 49 | static void ltq_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, |
50 | struct pinctrl_map *map, unsigned num_maps) | 50 | struct pinctrl_map *map, unsigned num_maps) |
51 | { | 51 | { |
52 | int i; | 52 | int i; |
53 | 53 | ||
@@ -128,10 +128,10 @@ static int ltq_pinctrl_dt_subnode_size(struct device_node *np) | |||
128 | return ret; | 128 | return ret; |
129 | } | 129 | } |
130 | 130 | ||
131 | int ltq_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, | 131 | static int ltq_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, |
132 | struct device_node *np_config, | 132 | struct device_node *np_config, |
133 | struct pinctrl_map **map, | 133 | struct pinctrl_map **map, |
134 | unsigned *num_maps) | 134 | unsigned *num_maps) |
135 | { | 135 | { |
136 | struct pinctrl_map *tmp; | 136 | struct pinctrl_map *tmp; |
137 | struct device_node *np; | 137 | struct device_node *np; |
@@ -275,16 +275,6 @@ static int ltq_pmx_enable(struct pinctrl_dev *pctrldev, | |||
275 | return 0; | 275 | return 0; |
276 | } | 276 | } |
277 | 277 | ||
278 | static void ltq_pmx_disable(struct pinctrl_dev *pctrldev, | ||
279 | unsigned func, | ||
280 | unsigned group) | ||
281 | { | ||
282 | /* | ||
283 | * Nothing to do here. However, pinconf_check_ops() requires this | ||
284 | * callback to be defined. | ||
285 | */ | ||
286 | } | ||
287 | |||
288 | static int ltq_pmx_gpio_request_enable(struct pinctrl_dev *pctrldev, | 278 | static int ltq_pmx_gpio_request_enable(struct pinctrl_dev *pctrldev, |
289 | struct pinctrl_gpio_range *range, | 279 | struct pinctrl_gpio_range *range, |
290 | unsigned pin) | 280 | unsigned pin) |
@@ -312,7 +302,6 @@ static struct pinmux_ops ltq_pmx_ops = { | |||
312 | .get_function_name = ltq_pmx_func_name, | 302 | .get_function_name = ltq_pmx_func_name, |
313 | .get_function_groups = ltq_pmx_get_groups, | 303 | .get_function_groups = ltq_pmx_get_groups, |
314 | .enable = ltq_pmx_enable, | 304 | .enable = ltq_pmx_enable, |
315 | .disable = ltq_pmx_disable, | ||
316 | .gpio_request_enable = ltq_pmx_gpio_request_enable, | 305 | .gpio_request_enable = ltq_pmx_gpio_request_enable, |
317 | }; | 306 | }; |
318 | 307 | ||
diff --git a/drivers/pinctrl/pinctrl-mxs.c b/drivers/pinctrl/pinctrl-mxs.c index 4ba4636b6a4a..3e7d4d63f8bf 100644 --- a/drivers/pinctrl/pinctrl-mxs.c +++ b/drivers/pinctrl/pinctrl-mxs.c | |||
@@ -319,7 +319,7 @@ static void mxs_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, | |||
319 | seq_printf(s, "0x%lx", config); | 319 | seq_printf(s, "0x%lx", config); |
320 | } | 320 | } |
321 | 321 | ||
322 | struct pinconf_ops mxs_pinconf_ops = { | 322 | static struct pinconf_ops mxs_pinconf_ops = { |
323 | .pin_config_get = mxs_pinconf_get, | 323 | .pin_config_get = mxs_pinconf_get, |
324 | .pin_config_set = mxs_pinconf_set, | 324 | .pin_config_set = mxs_pinconf_set, |
325 | .pin_config_group_get = mxs_pinconf_group_get, | 325 | .pin_config_group_get = mxs_pinconf_group_get, |
diff --git a/drivers/pinctrl/pinctrl-nomadik-db8500.c b/drivers/pinctrl/pinctrl-nomadik-db8500.c index debaa75b0552..7d88ae352119 100644 --- a/drivers/pinctrl/pinctrl-nomadik-db8500.c +++ b/drivers/pinctrl/pinctrl-nomadik-db8500.c | |||
@@ -475,8 +475,10 @@ static const unsigned hsit_a_1_pins[] = { DB8500_PIN_AJ9, DB8500_PIN_AH9, | |||
475 | DB8500_PIN_AG9, DB8500_PIN_AG8, DB8500_PIN_AF8 }; | 475 | DB8500_PIN_AG9, DB8500_PIN_AG8, DB8500_PIN_AF8 }; |
476 | static const unsigned hsit_a_2_pins[] = { DB8500_PIN_AJ9, DB8500_PIN_AH9, | 476 | static const unsigned hsit_a_2_pins[] = { DB8500_PIN_AJ9, DB8500_PIN_AH9, |
477 | DB8500_PIN_AG9, DB8500_PIN_AG8 }; | 477 | DB8500_PIN_AG9, DB8500_PIN_AG8 }; |
478 | static const unsigned clkout_a_1_pins[] = { DB8500_PIN_AH7, DB8500_PIN_AJ6 }; | 478 | static const unsigned clkout1_a_1_pins[] = { DB8500_PIN_AH7 }; |
479 | static const unsigned clkout_a_2_pins[] = { DB8500_PIN_AG7, DB8500_PIN_AF7 }; | 479 | static const unsigned clkout1_a_2_pins[] = { DB8500_PIN_AG7 }; |
480 | static const unsigned clkout2_a_1_pins[] = { DB8500_PIN_AJ6 }; | ||
481 | static const unsigned clkout2_a_2_pins[] = { DB8500_PIN_AF7 }; | ||
480 | static const unsigned usb_a_1_pins[] = { DB8500_PIN_AF28, DB8500_PIN_AE29, | 482 | static const unsigned usb_a_1_pins[] = { DB8500_PIN_AF28, DB8500_PIN_AE29, |
481 | DB8500_PIN_AD29, DB8500_PIN_AC29, DB8500_PIN_AD28, DB8500_PIN_AD26, | 483 | DB8500_PIN_AD29, DB8500_PIN_AC29, DB8500_PIN_AD28, DB8500_PIN_AD26, |
482 | DB8500_PIN_AE26, DB8500_PIN_AG29, DB8500_PIN_AE27, DB8500_PIN_AD27, | 484 | DB8500_PIN_AE26, DB8500_PIN_AG29, DB8500_PIN_AE27, DB8500_PIN_AD27, |
@@ -592,7 +594,8 @@ static const unsigned stmmod_c_1_pins[] = { DB8500_PIN_C20, DB8500_PIN_B21, | |||
592 | DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24 }; | 594 | DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24 }; |
593 | static const unsigned usbsim_c_1_pins[] = { DB8500_PIN_D22 }; | 595 | static const unsigned usbsim_c_1_pins[] = { DB8500_PIN_D22 }; |
594 | static const unsigned mc4rstn_c_1_pins[] = { DB8500_PIN_AF25 }; | 596 | static const unsigned mc4rstn_c_1_pins[] = { DB8500_PIN_AF25 }; |
595 | static const unsigned clkout_c_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AH12 }; | 597 | static const unsigned clkout1_c_1_pins[] = { DB8500_PIN_AH13 }; |
598 | static const unsigned clkout2_c_1_pins[] = { DB8500_PIN_AH12 }; | ||
596 | static const unsigned i2c3_c_1_pins[] = { DB8500_PIN_AG12, DB8500_PIN_AH11 }; | 599 | static const unsigned i2c3_c_1_pins[] = { DB8500_PIN_AG12, DB8500_PIN_AH11 }; |
597 | static const unsigned spi0_c_1_pins[] = { DB8500_PIN_AH10, DB8500_PIN_AH9, | 600 | static const unsigned spi0_c_1_pins[] = { DB8500_PIN_AH10, DB8500_PIN_AH9, |
598 | DB8500_PIN_AG9, DB8500_PIN_AG8 }; | 601 | DB8500_PIN_AG9, DB8500_PIN_AG8 }; |
@@ -600,14 +603,66 @@ static const unsigned usbsim_c_2_pins[] = { DB8500_PIN_AF8 }; | |||
600 | static const unsigned i2c3_c_2_pins[] = { DB8500_PIN_AG7, DB8500_PIN_AF7 }; | 603 | static const unsigned i2c3_c_2_pins[] = { DB8500_PIN_AG7, DB8500_PIN_AF7 }; |
601 | 604 | ||
602 | /* Other C1 column */ | 605 | /* Other C1 column */ |
606 | static const unsigned u2rx_oc1_1_pins[] = { DB8500_PIN_AB2 }; | ||
607 | static const unsigned stmape_oc1_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_Y4, | ||
608 | DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 }; | ||
609 | static const unsigned remap0_oc1_1_pins[] = { DB8500_PIN_E1 }; | ||
610 | static const unsigned remap1_oc1_1_pins[] = { DB8500_PIN_E2 }; | ||
611 | static const unsigned ptma9_oc1_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4, | ||
612 | DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2, | ||
613 | DB8500_PIN_J2, DB8500_PIN_H1 }; | ||
603 | static const unsigned kp_oc1_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3, | 614 | static const unsigned kp_oc1_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3, |
604 | DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6, | 615 | DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6, |
605 | DB8500_PIN_D6, DB8500_PIN_B7 }; | 616 | DB8500_PIN_D6, DB8500_PIN_B7 }; |
617 | static const unsigned rf_oc1_1_pins[] = { DB8500_PIN_D8, DB8500_PIN_D9 }; | ||
618 | static const unsigned hxclk_oc1_1_pins[] = { DB8500_PIN_D16 }; | ||
619 | static const unsigned uartmodrx_oc1_1_pins[] = { DB8500_PIN_B17 }; | ||
620 | static const unsigned uartmodtx_oc1_1_pins[] = { DB8500_PIN_C16 }; | ||
621 | static const unsigned stmmod_oc1_1_pins[] = { DB8500_PIN_C19, DB8500_PIN_C17, | ||
622 | DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19 }; | ||
623 | static const unsigned hxgpio_oc1_1_pins[] = { DB8500_PIN_D21, DB8500_PIN_D20, | ||
624 | DB8500_PIN_C20, DB8500_PIN_B21, DB8500_PIN_C21, DB8500_PIN_A22, | ||
625 | DB8500_PIN_B24, DB8500_PIN_C22 }; | ||
626 | static const unsigned rf_oc1_2_pins[] = { DB8500_PIN_C23, DB8500_PIN_D23 }; | ||
606 | static const unsigned spi2_oc1_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12, | 627 | static const unsigned spi2_oc1_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12, |
607 | DB8500_PIN_AH12, DB8500_PIN_AH11 }; | 628 | DB8500_PIN_AH12, DB8500_PIN_AH11 }; |
608 | static const unsigned spi2_oc1_2_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AH12, | 629 | static const unsigned spi2_oc1_2_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AH12, |
609 | DB8500_PIN_AH11 }; | 630 | DB8500_PIN_AH11 }; |
610 | 631 | ||
632 | /* Other C2 column */ | ||
633 | static const unsigned sbag_oc2_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_AB2, | ||
634 | DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 }; | ||
635 | static const unsigned etmr4_oc2_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4, | ||
636 | DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2, | ||
637 | DB8500_PIN_J2, DB8500_PIN_H1 }; | ||
638 | static const unsigned ptma9_oc2_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16, | ||
639 | DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17, | ||
640 | DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20, | ||
641 | DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21, | ||
642 | DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 }; | ||
643 | |||
644 | /* Other C3 column */ | ||
645 | static const unsigned stmmod_oc3_1_pins[] = { DB8500_PIN_AB2, DB8500_PIN_W2, | ||
646 | DB8500_PIN_W3, DB8500_PIN_V3, DB8500_PIN_V2 }; | ||
647 | static const unsigned stmmod_oc3_2_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4, | ||
648 | DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3 }; | ||
649 | static const unsigned uartmodrx_oc3_1_pins[] = { DB8500_PIN_H2 }; | ||
650 | static const unsigned uartmodtx_oc3_1_pins[] = { DB8500_PIN_J2 }; | ||
651 | static const unsigned etmr4_oc3_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16, | ||
652 | DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17, | ||
653 | DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20, | ||
654 | DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21, | ||
655 | DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 }; | ||
656 | |||
657 | /* Other C4 column */ | ||
658 | static const unsigned sbag_oc4_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4, | ||
659 | DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H1 }; | ||
660 | static const unsigned hwobs_oc4_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16, | ||
661 | DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17, | ||
662 | DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20, | ||
663 | DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21, | ||
664 | DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 }; | ||
665 | |||
611 | #define DB8500_PIN_GROUP(a,b) { .name = #a, .pins = a##_pins, \ | 666 | #define DB8500_PIN_GROUP(a,b) { .name = #a, .pins = a##_pins, \ |
612 | .npins = ARRAY_SIZE(a##_pins), .altsetting = b } | 667 | .npins = ARRAY_SIZE(a##_pins), .altsetting = b } |
613 | 668 | ||
@@ -639,6 +694,7 @@ static const struct nmk_pingroup nmk_db8500_groups[] = { | |||
639 | DB8500_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A), | 694 | DB8500_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A), |
640 | DB8500_PIN_GROUP(ipgpio0_a_1, NMK_GPIO_ALT_A), | 695 | DB8500_PIN_GROUP(ipgpio0_a_1, NMK_GPIO_ALT_A), |
641 | DB8500_PIN_GROUP(ipgpio1_a_1, NMK_GPIO_ALT_A), | 696 | DB8500_PIN_GROUP(ipgpio1_a_1, NMK_GPIO_ALT_A), |
697 | DB8500_PIN_GROUP(kp_a_2, NMK_GPIO_ALT_A), | ||
642 | DB8500_PIN_GROUP(msp2sck_a_1, NMK_GPIO_ALT_A), | 698 | DB8500_PIN_GROUP(msp2sck_a_1, NMK_GPIO_ALT_A), |
643 | DB8500_PIN_GROUP(msp2_a_1, NMK_GPIO_ALT_A), | 699 | DB8500_PIN_GROUP(msp2_a_1, NMK_GPIO_ALT_A), |
644 | DB8500_PIN_GROUP(mc4_a_1, NMK_GPIO_ALT_A), | 700 | DB8500_PIN_GROUP(mc4_a_1, NMK_GPIO_ALT_A), |
@@ -647,8 +703,10 @@ static const struct nmk_pingroup nmk_db8500_groups[] = { | |||
647 | DB8500_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A), | 703 | DB8500_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A), |
648 | DB8500_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A), | 704 | DB8500_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A), |
649 | DB8500_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A), | 705 | DB8500_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A), |
650 | DB8500_PIN_GROUP(clkout_a_1, NMK_GPIO_ALT_A), | 706 | DB8500_PIN_GROUP(clkout1_a_1, NMK_GPIO_ALT_A), |
651 | DB8500_PIN_GROUP(clkout_a_2, NMK_GPIO_ALT_A), | 707 | DB8500_PIN_GROUP(clkout1_a_2, NMK_GPIO_ALT_A), |
708 | DB8500_PIN_GROUP(clkout2_a_1, NMK_GPIO_ALT_A), | ||
709 | DB8500_PIN_GROUP(clkout2_a_2, NMK_GPIO_ALT_A), | ||
652 | DB8500_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A), | 710 | DB8500_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A), |
653 | /* Altfunction B column */ | 711 | /* Altfunction B column */ |
654 | DB8500_PIN_GROUP(trig_b_1, NMK_GPIO_ALT_B), | 712 | DB8500_PIN_GROUP(trig_b_1, NMK_GPIO_ALT_B), |
@@ -720,15 +778,41 @@ static const struct nmk_pingroup nmk_db8500_groups[] = { | |||
720 | DB8500_PIN_GROUP(stmmod_c_1, NMK_GPIO_ALT_C), | 778 | DB8500_PIN_GROUP(stmmod_c_1, NMK_GPIO_ALT_C), |
721 | DB8500_PIN_GROUP(usbsim_c_1, NMK_GPIO_ALT_C), | 779 | DB8500_PIN_GROUP(usbsim_c_1, NMK_GPIO_ALT_C), |
722 | DB8500_PIN_GROUP(mc4rstn_c_1, NMK_GPIO_ALT_C), | 780 | DB8500_PIN_GROUP(mc4rstn_c_1, NMK_GPIO_ALT_C), |
723 | DB8500_PIN_GROUP(clkout_c_1, NMK_GPIO_ALT_C), | 781 | DB8500_PIN_GROUP(clkout1_c_1, NMK_GPIO_ALT_C), |
782 | DB8500_PIN_GROUP(clkout2_c_1, NMK_GPIO_ALT_C), | ||
724 | DB8500_PIN_GROUP(i2c3_c_1, NMK_GPIO_ALT_C), | 783 | DB8500_PIN_GROUP(i2c3_c_1, NMK_GPIO_ALT_C), |
725 | DB8500_PIN_GROUP(spi0_c_1, NMK_GPIO_ALT_C), | 784 | DB8500_PIN_GROUP(spi0_c_1, NMK_GPIO_ALT_C), |
726 | DB8500_PIN_GROUP(usbsim_c_2, NMK_GPIO_ALT_C), | 785 | DB8500_PIN_GROUP(usbsim_c_2, NMK_GPIO_ALT_C), |
727 | DB8500_PIN_GROUP(i2c3_c_2, NMK_GPIO_ALT_C), | 786 | DB8500_PIN_GROUP(i2c3_c_2, NMK_GPIO_ALT_C), |
728 | /* Other alt C1 column */ | 787 | /* Other alt C1 column */ |
788 | DB8500_PIN_GROUP(u2rx_oc1_1, NMK_GPIO_ALT_C1), | ||
789 | DB8500_PIN_GROUP(stmape_oc1_1, NMK_GPIO_ALT_C1), | ||
790 | DB8500_PIN_GROUP(remap0_oc1_1, NMK_GPIO_ALT_C1), | ||
791 | DB8500_PIN_GROUP(remap1_oc1_1, NMK_GPIO_ALT_C1), | ||
792 | DB8500_PIN_GROUP(ptma9_oc1_1, NMK_GPIO_ALT_C1), | ||
729 | DB8500_PIN_GROUP(kp_oc1_1, NMK_GPIO_ALT_C1), | 793 | DB8500_PIN_GROUP(kp_oc1_1, NMK_GPIO_ALT_C1), |
794 | DB8500_PIN_GROUP(rf_oc1_1, NMK_GPIO_ALT_C1), | ||
795 | DB8500_PIN_GROUP(hxclk_oc1_1, NMK_GPIO_ALT_C1), | ||
796 | DB8500_PIN_GROUP(uartmodrx_oc1_1, NMK_GPIO_ALT_C1), | ||
797 | DB8500_PIN_GROUP(uartmodtx_oc1_1, NMK_GPIO_ALT_C1), | ||
798 | DB8500_PIN_GROUP(stmmod_oc1_1, NMK_GPIO_ALT_C1), | ||
799 | DB8500_PIN_GROUP(hxgpio_oc1_1, NMK_GPIO_ALT_C1), | ||
800 | DB8500_PIN_GROUP(rf_oc1_2, NMK_GPIO_ALT_C1), | ||
730 | DB8500_PIN_GROUP(spi2_oc1_1, NMK_GPIO_ALT_C1), | 801 | DB8500_PIN_GROUP(spi2_oc1_1, NMK_GPIO_ALT_C1), |
731 | DB8500_PIN_GROUP(spi2_oc1_2, NMK_GPIO_ALT_C1), | 802 | DB8500_PIN_GROUP(spi2_oc1_2, NMK_GPIO_ALT_C1), |
803 | /* Other alt C2 column */ | ||
804 | DB8500_PIN_GROUP(sbag_oc2_1, NMK_GPIO_ALT_C2), | ||
805 | DB8500_PIN_GROUP(etmr4_oc2_1, NMK_GPIO_ALT_C2), | ||
806 | DB8500_PIN_GROUP(ptma9_oc2_1, NMK_GPIO_ALT_C2), | ||
807 | /* Other alt C3 column */ | ||
808 | DB8500_PIN_GROUP(stmmod_oc3_1, NMK_GPIO_ALT_C3), | ||
809 | DB8500_PIN_GROUP(stmmod_oc3_2, NMK_GPIO_ALT_C3), | ||
810 | DB8500_PIN_GROUP(uartmodrx_oc3_1, NMK_GPIO_ALT_C3), | ||
811 | DB8500_PIN_GROUP(uartmodtx_oc3_1, NMK_GPIO_ALT_C3), | ||
812 | DB8500_PIN_GROUP(etmr4_oc3_1, NMK_GPIO_ALT_C3), | ||
813 | /* Other alt C4 column */ | ||
814 | DB8500_PIN_GROUP(sbag_oc4_1, NMK_GPIO_ALT_C4), | ||
815 | DB8500_PIN_GROUP(hwobs_oc4_1, NMK_GPIO_ALT_C4), | ||
732 | }; | 816 | }; |
733 | 817 | ||
734 | /* We use this macro to define the groups applicable to a function */ | 818 | /* We use this macro to define the groups applicable to a function */ |
@@ -742,7 +826,7 @@ DB8500_FUNC_GROUPS(u1, "u1rxtx_a_1", "u1ctsrts_a_1"); | |||
742 | * only available on two pins in alternative function C | 826 | * only available on two pins in alternative function C |
743 | */ | 827 | */ |
744 | DB8500_FUNC_GROUPS(u2, "u2rxtx_b_1", "u2rxtx_c_1", "u2ctsrts_c_1", | 828 | DB8500_FUNC_GROUPS(u2, "u2rxtx_b_1", "u2rxtx_c_1", "u2ctsrts_c_1", |
745 | "u2rxtx_c_2", "u2rxtx_c_3"); | 829 | "u2rxtx_c_2", "u2rxtx_c_3", "u2rx_oc1_1"); |
746 | DB8500_FUNC_GROUPS(ipi2c, "ipi2c_a_1", "ipi2c_a_2"); | 830 | DB8500_FUNC_GROUPS(ipi2c, "ipi2c_a_1", "ipi2c_a_2"); |
747 | /* | 831 | /* |
748 | * MSP0 can only be on a certain set of pins, but the TX/RX pins can be | 832 | * MSP0 can only be on a certain set of pins, but the TX/RX pins can be |
@@ -757,7 +841,7 @@ DB8500_FUNC_GROUPS(msp1, "msp1txrx_a_1", "msp1_a_1", "msp1txrx_b_1"); | |||
757 | DB8500_FUNC_GROUPS(lcdb, "lcdb_a_1"); | 841 | DB8500_FUNC_GROUPS(lcdb, "lcdb_a_1"); |
758 | DB8500_FUNC_GROUPS(lcd, "lcdvsi0_a_1", "lcdvsi1_a_1", "lcd_d0_d7_a_1", | 842 | DB8500_FUNC_GROUPS(lcd, "lcdvsi0_a_1", "lcdvsi1_a_1", "lcd_d0_d7_a_1", |
759 | "lcd_d8_d11_a_1", "lcd_d12_d23_a_1", "lcd_b_1"); | 843 | "lcd_d8_d11_a_1", "lcd_d12_d23_a_1", "lcd_b_1"); |
760 | DB8500_FUNC_GROUPS(kp, "kp_a_1", "kp_b_1", "kp_b_2", "kp_c_1", "kp_oc1_1"); | 844 | DB8500_FUNC_GROUPS(kp, "kp_a_1", "kp_a_2", "kp_b_1", "kp_b_2", "kp_c_1", "kp_oc1_1"); |
761 | DB8500_FUNC_GROUPS(mc2, "mc2_a_1", "mc2rstn_c_1"); | 845 | DB8500_FUNC_GROUPS(mc2, "mc2_a_1", "mc2rstn_c_1"); |
762 | DB8500_FUNC_GROUPS(ssp1, "ssp1_a_1"); | 846 | DB8500_FUNC_GROUPS(ssp1, "ssp1_a_1"); |
763 | DB8500_FUNC_GROUPS(ssp0, "ssp0_a_1"); | 847 | DB8500_FUNC_GROUPS(ssp0, "ssp0_a_1"); |
@@ -773,7 +857,8 @@ DB8500_FUNC_GROUPS(msp2, "msp2sck_a_1", "msp2_a_1"); | |||
773 | DB8500_FUNC_GROUPS(mc4, "mc4_a_1", "mc4rstn_c_1"); | 857 | DB8500_FUNC_GROUPS(mc4, "mc4_a_1", "mc4rstn_c_1"); |
774 | DB8500_FUNC_GROUPS(mc1, "mc1_a_1", "mc1_a_2", "mc1dir_a_1"); | 858 | DB8500_FUNC_GROUPS(mc1, "mc1_a_1", "mc1_a_2", "mc1dir_a_1"); |
775 | DB8500_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2"); | 859 | DB8500_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2"); |
776 | DB8500_FUNC_GROUPS(clkout, "clkout_a_1", "clkout_a_2", "clkout_c_1"); | 860 | DB8500_FUNC_GROUPS(clkout, "clkout1_a_1", "clkout1_a_2", "clkout1_c_1", |
861 | "clkout2_a_1", "clkout2_a_2", "clkout2_c_1"); | ||
777 | DB8500_FUNC_GROUPS(usb, "usb_a_1"); | 862 | DB8500_FUNC_GROUPS(usb, "usb_a_1"); |
778 | DB8500_FUNC_GROUPS(trig, "trig_b_1"); | 863 | DB8500_FUNC_GROUPS(trig, "trig_b_1"); |
779 | DB8500_FUNC_GROUPS(i2c4, "i2c4_b_1"); | 864 | DB8500_FUNC_GROUPS(i2c4, "i2c4_b_1"); |
@@ -784,8 +869,10 @@ DB8500_FUNC_GROUPS(i2c2, "i2c2_b_1", "i2c2_b_2"); | |||
784 | * so select one of each. | 869 | * so select one of each. |
785 | */ | 870 | */ |
786 | DB8500_FUNC_GROUPS(uartmod, "uartmodtx_b_1", "uartmodrx_b_1", "uartmodrx_b_2", | 871 | DB8500_FUNC_GROUPS(uartmod, "uartmodtx_b_1", "uartmodrx_b_1", "uartmodrx_b_2", |
787 | "uartmodrx_c_1", "uartmod_tx_c_1"); | 872 | "uartmodrx_c_1", "uartmod_tx_c_1", "uartmodrx_oc1_1", |
788 | DB8500_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_c_1"); | 873 | "uartmodtx_oc1_1", "uartmodrx_oc3_1", "uartmodtx_oc3_1"); |
874 | DB8500_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_c_1", "stmmod_oc1_1", | ||
875 | "stmmod_oc3_1", "stmmod_oc3_2"); | ||
789 | DB8500_FUNC_GROUPS(spi3, "spi3_b_1"); | 876 | DB8500_FUNC_GROUPS(spi3, "spi3_b_1"); |
790 | /* Select between CS0 on alt B or PS1 on alt C */ | 877 | /* Select between CS0 on alt B or PS1 on alt C */ |
791 | DB8500_FUNC_GROUPS(sm, "sm_b_1", "smcs0_b_1", "smcs1_b_1", "smcleale_c_1", | 878 | DB8500_FUNC_GROUPS(sm, "sm_b_1", "smcs0_b_1", "smcs1_b_1", "smcleale_c_1", |
@@ -799,13 +886,19 @@ DB8500_FUNC_GROUPS(ipjtag, "ipjtag_c_1"); | |||
799 | DB8500_FUNC_GROUPS(slim0, "slim0_c_1"); | 886 | DB8500_FUNC_GROUPS(slim0, "slim0_c_1"); |
800 | DB8500_FUNC_GROUPS(ms, "ms_c_1"); | 887 | DB8500_FUNC_GROUPS(ms, "ms_c_1"); |
801 | DB8500_FUNC_GROUPS(iptrigout, "iptrigout_c_1"); | 888 | DB8500_FUNC_GROUPS(iptrigout, "iptrigout_c_1"); |
802 | DB8500_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_c_2"); | 889 | DB8500_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_c_2", "stmape_oc1_1"); |
803 | DB8500_FUNC_GROUPS(mc5, "mc5_c_1"); | 890 | DB8500_FUNC_GROUPS(mc5, "mc5_c_1"); |
804 | DB8500_FUNC_GROUPS(usbsim, "usbsim_c_1", "usbsim_c_2"); | 891 | DB8500_FUNC_GROUPS(usbsim, "usbsim_c_1", "usbsim_c_2"); |
805 | DB8500_FUNC_GROUPS(i2c3, "i2c3_c_1", "i2c3_c_2"); | 892 | DB8500_FUNC_GROUPS(i2c3, "i2c3_c_1", "i2c3_c_2"); |
806 | DB8500_FUNC_GROUPS(spi0, "spi0_c_1"); | 893 | DB8500_FUNC_GROUPS(spi0, "spi0_c_1"); |
807 | DB8500_FUNC_GROUPS(spi2, "spi2_oc1_1", "spi2_oc1_2"); | 894 | DB8500_FUNC_GROUPS(spi2, "spi2_oc1_1", "spi2_oc1_2"); |
808 | 895 | DB8500_FUNC_GROUPS(remap, "remap0_oc1_1", "remap1_oc1_1"); | |
896 | DB8500_FUNC_GROUPS(sbag, "sbag_oc2_1", "sbag_oc4_1"); | ||
897 | DB8500_FUNC_GROUPS(ptm, "ptma9_oc1_1", "ptma9_oc2_1"); | ||
898 | DB8500_FUNC_GROUPS(rf, "rf_oc1_1", "rf_oc1_2"); | ||
899 | DB8500_FUNC_GROUPS(hx, "hxclk_oc1_1", "hxgpio_oc1_1"); | ||
900 | DB8500_FUNC_GROUPS(etm, "etmr4_oc2_1", "etmr4_oc3_1"); | ||
901 | DB8500_FUNC_GROUPS(hwobs, "hwobs_oc4_1"); | ||
809 | #define FUNCTION(fname) \ | 902 | #define FUNCTION(fname) \ |
810 | { \ | 903 | { \ |
811 | .name = #fname, \ | 904 | .name = #fname, \ |
@@ -858,6 +951,12 @@ static const struct nmk_function nmk_db8500_functions[] = { | |||
858 | FUNCTION(i2c3), | 951 | FUNCTION(i2c3), |
859 | FUNCTION(spi0), | 952 | FUNCTION(spi0), |
860 | FUNCTION(spi2), | 953 | FUNCTION(spi2), |
954 | FUNCTION(remap), | ||
955 | FUNCTION(ptm), | ||
956 | FUNCTION(rf), | ||
957 | FUNCTION(hx), | ||
958 | FUNCTION(etm), | ||
959 | FUNCTION(hwobs), | ||
861 | }; | 960 | }; |
862 | 961 | ||
863 | static const struct prcm_gpiocr_altcx_pin_desc db8500_altcx_pins[] = { | 962 | static const struct prcm_gpiocr_altcx_pin_desc db8500_altcx_pins[] = { |
diff --git a/drivers/pinctrl/pinctrl-nomadik-db8540.c b/drivers/pinctrl/pinctrl-nomadik-db8540.c index 52fc30181f7e..bb6a4016322a 100644 --- a/drivers/pinctrl/pinctrl-nomadik-db8540.c +++ b/drivers/pinctrl/pinctrl-nomadik-db8540.c | |||
@@ -460,8 +460,10 @@ static const unsigned hsit_a_1_pins[] = { DB8540_PIN_B11, DB8540_PIN_B10, | |||
460 | DB8540_PIN_E10, DB8540_PIN_B12, DB8540_PIN_D10 }; | 460 | DB8540_PIN_E10, DB8540_PIN_B12, DB8540_PIN_D10 }; |
461 | static const unsigned hsit_a_2_pins[] = { DB8540_PIN_B11, DB8540_PIN_B10, | 461 | static const unsigned hsit_a_2_pins[] = { DB8540_PIN_B11, DB8540_PIN_B10, |
462 | DB8540_PIN_E10, DB8540_PIN_B12 }; | 462 | DB8540_PIN_E10, DB8540_PIN_B12 }; |
463 | static const unsigned clkout_a_1_pins[] = { DB8540_PIN_D11, DB8540_PIN_AJ6 }; | 463 | static const unsigned clkout1_a_1_pins[] = { DB8540_PIN_D11 }; |
464 | static const unsigned clkout_a_2_pins[] = { DB8540_PIN_B13, DB8540_PIN_C12 }; | 464 | static const unsigned clkout1_a_2_pins[] = { DB8540_PIN_B13 }; |
465 | static const unsigned clkout2_a_1_pins[] = { DB8540_PIN_AJ6 }; | ||
466 | static const unsigned clkout2_a_2_pins[] = { DB8540_PIN_C12 }; | ||
465 | static const unsigned msp4_a_1_pins[] = { DB8540_PIN_B14, DB8540_PIN_E11 }; | 467 | static const unsigned msp4_a_1_pins[] = { DB8540_PIN_B14, DB8540_PIN_E11 }; |
466 | static const unsigned usb_a_1_pins[] = { DB8540_PIN_D12, DB8540_PIN_D15, | 468 | static const unsigned usb_a_1_pins[] = { DB8540_PIN_D12, DB8540_PIN_D15, |
467 | DB8540_PIN_C13, DB8540_PIN_C14, DB8540_PIN_C18, DB8540_PIN_C16, | 469 | DB8540_PIN_C13, DB8540_PIN_C14, DB8540_PIN_C18, DB8540_PIN_C16, |
@@ -698,8 +700,10 @@ static const struct nmk_pingroup nmk_db8540_groups[] = { | |||
698 | DB8540_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A), | 700 | DB8540_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A), |
699 | DB8540_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A), | 701 | DB8540_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A), |
700 | DB8540_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A), | 702 | DB8540_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A), |
701 | DB8540_PIN_GROUP(clkout_a_1, NMK_GPIO_ALT_A), | 703 | DB8540_PIN_GROUP(clkout1_a_1, NMK_GPIO_ALT_A), |
702 | DB8540_PIN_GROUP(clkout_a_2, NMK_GPIO_ALT_A), | 704 | DB8540_PIN_GROUP(clkout1_a_2, NMK_GPIO_ALT_A), |
705 | DB8540_PIN_GROUP(clkout2_a_1, NMK_GPIO_ALT_A), | ||
706 | DB8540_PIN_GROUP(clkout2_a_2, NMK_GPIO_ALT_A), | ||
703 | DB8540_PIN_GROUP(msp4_a_1, NMK_GPIO_ALT_A), | 707 | DB8540_PIN_GROUP(msp4_a_1, NMK_GPIO_ALT_A), |
704 | DB8540_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A), | 708 | DB8540_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A), |
705 | /* Altfunction B column */ | 709 | /* Altfunction B column */ |
@@ -822,6 +826,7 @@ static const struct nmk_pingroup nmk_db8540_groups[] = { | |||
822 | DB8540_PIN_GROUP(modaccuarttxrx_oc4_1, NMK_GPIO_ALT_C4), | 826 | DB8540_PIN_GROUP(modaccuarttxrx_oc4_1, NMK_GPIO_ALT_C4), |
823 | DB8540_PIN_GROUP(modaccuartrtscts_oc4_1, NMK_GPIO_ALT_C4), | 827 | DB8540_PIN_GROUP(modaccuartrtscts_oc4_1, NMK_GPIO_ALT_C4), |
824 | DB8540_PIN_GROUP(stmmod_oc4_1, NMK_GPIO_ALT_C4), | 828 | DB8540_PIN_GROUP(stmmod_oc4_1, NMK_GPIO_ALT_C4), |
829 | DB8540_PIN_GROUP(moduartstmmux_oc4_1, NMK_GPIO_ALT_C4), | ||
825 | 830 | ||
826 | }; | 831 | }; |
827 | 832 | ||
@@ -830,7 +835,8 @@ static const struct nmk_pingroup nmk_db8540_groups[] = { | |||
830 | static const char * const a##_groups[] = { b }; | 835 | static const char * const a##_groups[] = { b }; |
831 | 836 | ||
832 | DB8540_FUNC_GROUPS(apetrig, "apetrig_b_1"); | 837 | DB8540_FUNC_GROUPS(apetrig, "apetrig_b_1"); |
833 | DB8540_FUNC_GROUPS(clkout, "clkoutreq_a_1", "clkout_a_1", "clkout_a_2"); | 838 | DB8540_FUNC_GROUPS(clkout, "clkoutreq_a_1", "clkout1_a_1", "clkout1_a_2", |
839 | "clkout2_a_1", "clkout2_a_2"); | ||
834 | DB8540_FUNC_GROUPS(ddrtrig, "ddrtrig_b_1"); | 840 | DB8540_FUNC_GROUPS(ddrtrig, "ddrtrig_b_1"); |
835 | DB8540_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2"); | 841 | DB8540_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2"); |
836 | DB8540_FUNC_GROUPS(hwobs, "hwobs_oc4_1"); | 842 | DB8540_FUNC_GROUPS(hwobs, "hwobs_oc4_1"); |
diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c index cf82d9ce4dee..8ef3e85cb011 100644 --- a/drivers/pinctrl/pinctrl-nomadik.c +++ b/drivers/pinctrl/pinctrl-nomadik.c | |||
@@ -30,26 +30,10 @@ | |||
30 | #include <linux/pinctrl/pinconf.h> | 30 | #include <linux/pinctrl/pinconf.h> |
31 | /* Since we request GPIOs from ourself */ | 31 | /* Since we request GPIOs from ourself */ |
32 | #include <linux/pinctrl/consumer.h> | 32 | #include <linux/pinctrl/consumer.h> |
33 | /* | 33 | #include <linux/platform_data/pinctrl-nomadik.h> |
34 | * For the U8500 archs, use the PRCMU register interface, for the older | ||
35 | * Nomadik, provide some stubs. The functions using these will only be | ||
36 | * called on the U8500 series. | ||
37 | */ | ||
38 | #ifdef CONFIG_ARCH_U8500 | ||
39 | #include <linux/mfd/dbx500-prcmu.h> | ||
40 | #else | ||
41 | static inline u32 prcmu_read(unsigned int reg) { | ||
42 | return 0; | ||
43 | } | ||
44 | static inline void prcmu_write(unsigned int reg, u32 value) {} | ||
45 | static inline void prcmu_write_masked(unsigned int reg, u32 mask, u32 value) {} | ||
46 | #endif | ||
47 | 34 | ||
48 | #include <asm/mach/irq.h> | 35 | #include <asm/mach/irq.h> |
49 | 36 | ||
50 | #include <plat/pincfg.h> | ||
51 | #include <plat/gpio-nomadik.h> | ||
52 | |||
53 | #include "pinctrl-nomadik.h" | 37 | #include "pinctrl-nomadik.h" |
54 | 38 | ||
55 | /* | 39 | /* |
@@ -60,8 +44,6 @@ static inline void prcmu_write_masked(unsigned int reg, u32 mask, u32 value) {} | |||
60 | * Symbols in this file are called "nmk_gpio" for "nomadik gpio" | 44 | * Symbols in this file are called "nmk_gpio" for "nomadik gpio" |
61 | */ | 45 | */ |
62 | 46 | ||
63 | #define NMK_GPIO_PER_CHIP 32 | ||
64 | |||
65 | struct nmk_gpio_chip { | 47 | struct nmk_gpio_chip { |
66 | struct gpio_chip chip; | 48 | struct gpio_chip chip; |
67 | struct irq_domain *domain; | 49 | struct irq_domain *domain; |
@@ -86,10 +68,18 @@ struct nmk_gpio_chip { | |||
86 | u32 lowemi; | 68 | u32 lowemi; |
87 | }; | 69 | }; |
88 | 70 | ||
71 | /** | ||
72 | * struct nmk_pinctrl - state container for the Nomadik pin controller | ||
73 | * @dev: containing device pointer | ||
74 | * @pctl: corresponding pin controller device | ||
75 | * @soc: SoC data for this specific chip | ||
76 | * @prcm_base: PRCM register range virtual base | ||
77 | */ | ||
89 | struct nmk_pinctrl { | 78 | struct nmk_pinctrl { |
90 | struct device *dev; | 79 | struct device *dev; |
91 | struct pinctrl_dev *pctl; | 80 | struct pinctrl_dev *pctl; |
92 | const struct nmk_pinctrl_soc_data *soc; | 81 | const struct nmk_pinctrl_soc_data *soc; |
82 | void __iomem *prcm_base; | ||
93 | }; | 83 | }; |
94 | 84 | ||
95 | static struct nmk_gpio_chip * | 85 | static struct nmk_gpio_chip * |
@@ -251,6 +241,15 @@ nmk_gpio_disable_lazy_irq(struct nmk_gpio_chip *nmk_chip, unsigned offset) | |||
251 | dev_dbg(nmk_chip->chip.dev, "%d: clearing interrupt mask\n", gpio); | 241 | dev_dbg(nmk_chip->chip.dev, "%d: clearing interrupt mask\n", gpio); |
252 | } | 242 | } |
253 | 243 | ||
244 | static void nmk_write_masked(void __iomem *reg, u32 mask, u32 value) | ||
245 | { | ||
246 | u32 val; | ||
247 | |||
248 | val = readl(reg); | ||
249 | val = ((val & ~mask) | (value & mask)); | ||
250 | writel(val, reg); | ||
251 | } | ||
252 | |||
254 | static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct, | 253 | static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct, |
255 | unsigned offset, unsigned alt_num) | 254 | unsigned offset, unsigned alt_num) |
256 | { | 255 | { |
@@ -289,8 +288,8 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct, | |||
289 | if (pin_desc->altcx[i].used == true) { | 288 | if (pin_desc->altcx[i].used == true) { |
290 | reg = gpiocr_regs[pin_desc->altcx[i].reg_index]; | 289 | reg = gpiocr_regs[pin_desc->altcx[i].reg_index]; |
291 | bit = pin_desc->altcx[i].control_bit; | 290 | bit = pin_desc->altcx[i].control_bit; |
292 | if (prcmu_read(reg) & BIT(bit)) { | 291 | if (readl(npct->prcm_base + reg) & BIT(bit)) { |
293 | prcmu_write_masked(reg, BIT(bit), 0); | 292 | nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0); |
294 | dev_dbg(npct->dev, | 293 | dev_dbg(npct->dev, |
295 | "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n", | 294 | "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n", |
296 | offset, i+1); | 295 | offset, i+1); |
@@ -318,8 +317,8 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct, | |||
318 | if (pin_desc->altcx[i].used == true) { | 317 | if (pin_desc->altcx[i].used == true) { |
319 | reg = gpiocr_regs[pin_desc->altcx[i].reg_index]; | 318 | reg = gpiocr_regs[pin_desc->altcx[i].reg_index]; |
320 | bit = pin_desc->altcx[i].control_bit; | 319 | bit = pin_desc->altcx[i].control_bit; |
321 | if (prcmu_read(reg) & BIT(bit)) { | 320 | if (readl(npct->prcm_base + reg) & BIT(bit)) { |
322 | prcmu_write_masked(reg, BIT(bit), 0); | 321 | nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0); |
323 | dev_dbg(npct->dev, | 322 | dev_dbg(npct->dev, |
324 | "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n", | 323 | "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n", |
325 | offset, i+1); | 324 | offset, i+1); |
@@ -331,7 +330,7 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct, | |||
331 | bit = pin_desc->altcx[alt_index].control_bit; | 330 | bit = pin_desc->altcx[alt_index].control_bit; |
332 | dev_dbg(npct->dev, "PRCM GPIOCR: pin %i: alternate-C%i has been selected\n", | 331 | dev_dbg(npct->dev, "PRCM GPIOCR: pin %i: alternate-C%i has been selected\n", |
333 | offset, alt_index+1); | 332 | offset, alt_index+1); |
334 | prcmu_write_masked(reg, BIT(bit), BIT(bit)); | 333 | nmk_write_masked(npct->prcm_base + reg, BIT(bit), BIT(bit)); |
335 | } | 334 | } |
336 | 335 | ||
337 | static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset, | 336 | static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset, |
@@ -536,7 +535,7 @@ static int __nmk_config_pins(pin_cfg_t *cfgs, int num, bool sleep) | |||
536 | * and its sleep mode based on the specified configuration. The @cfg is | 535 | * and its sleep mode based on the specified configuration. The @cfg is |
537 | * usually one of the SoC specific macros defined in mach/<soc>-pins.h. These | 536 | * usually one of the SoC specific macros defined in mach/<soc>-pins.h. These |
538 | * are constructed using, and can be further enhanced with, the macros in | 537 | * are constructed using, and can be further enhanced with, the macros in |
539 | * plat/pincfg.h. | 538 | * <linux/platform_data/pinctrl-nomadik.h> |
540 | * | 539 | * |
541 | * If a pin's mode is set to GPIO, it is configured as an input to avoid | 540 | * If a pin's mode is set to GPIO, it is configured as an input to avoid |
542 | * side-effects. The gpio can be manipulated later using standard GPIO API | 541 | * side-effects. The gpio can be manipulated later using standard GPIO API |
@@ -675,6 +674,35 @@ int nmk_gpio_set_mode(int gpio, int gpio_mode) | |||
675 | } | 674 | } |
676 | EXPORT_SYMBOL(nmk_gpio_set_mode); | 675 | EXPORT_SYMBOL(nmk_gpio_set_mode); |
677 | 676 | ||
677 | static int nmk_prcm_gpiocr_get_mode(struct pinctrl_dev *pctldev, int gpio) | ||
678 | { | ||
679 | int i; | ||
680 | u16 reg; | ||
681 | u8 bit; | ||
682 | struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev); | ||
683 | const struct prcm_gpiocr_altcx_pin_desc *pin_desc; | ||
684 | const u16 *gpiocr_regs; | ||
685 | |||
686 | for (i = 0; i < npct->soc->npins_altcx; i++) { | ||
687 | if (npct->soc->altcx_pins[i].pin == gpio) | ||
688 | break; | ||
689 | } | ||
690 | if (i == npct->soc->npins_altcx) | ||
691 | return NMK_GPIO_ALT_C; | ||
692 | |||
693 | pin_desc = npct->soc->altcx_pins + i; | ||
694 | gpiocr_regs = npct->soc->prcm_gpiocr_registers; | ||
695 | for (i = 0; i < PRCM_IDX_GPIOCR_ALTC_MAX; i++) { | ||
696 | if (pin_desc->altcx[i].used == true) { | ||
697 | reg = gpiocr_regs[pin_desc->altcx[i].reg_index]; | ||
698 | bit = pin_desc->altcx[i].control_bit; | ||
699 | if (readl(npct->prcm_base + reg) & BIT(bit)) | ||
700 | return NMK_GPIO_ALT_C+i+1; | ||
701 | } | ||
702 | } | ||
703 | return NMK_GPIO_ALT_C; | ||
704 | } | ||
705 | |||
678 | int nmk_gpio_get_mode(int gpio) | 706 | int nmk_gpio_get_mode(int gpio) |
679 | { | 707 | { |
680 | struct nmk_gpio_chip *nmk_chip; | 708 | struct nmk_gpio_chip *nmk_chip; |
@@ -1063,8 +1091,9 @@ static int nmk_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | |||
1063 | 1091 | ||
1064 | #include <linux/seq_file.h> | 1092 | #include <linux/seq_file.h> |
1065 | 1093 | ||
1066 | static void nmk_gpio_dbg_show_one(struct seq_file *s, struct gpio_chip *chip, | 1094 | static void nmk_gpio_dbg_show_one(struct seq_file *s, |
1067 | unsigned offset, unsigned gpio) | 1095 | struct pinctrl_dev *pctldev, struct gpio_chip *chip, |
1096 | unsigned offset, unsigned gpio) | ||
1068 | { | 1097 | { |
1069 | const char *label = gpiochip_is_requested(chip, offset); | 1098 | const char *label = gpiochip_is_requested(chip, offset); |
1070 | struct nmk_gpio_chip *nmk_chip = | 1099 | struct nmk_gpio_chip *nmk_chip = |
@@ -1078,12 +1107,18 @@ static void nmk_gpio_dbg_show_one(struct seq_file *s, struct gpio_chip *chip, | |||
1078 | [NMK_GPIO_ALT_A] = "altA", | 1107 | [NMK_GPIO_ALT_A] = "altA", |
1079 | [NMK_GPIO_ALT_B] = "altB", | 1108 | [NMK_GPIO_ALT_B] = "altB", |
1080 | [NMK_GPIO_ALT_C] = "altC", | 1109 | [NMK_GPIO_ALT_C] = "altC", |
1110 | [NMK_GPIO_ALT_C+1] = "altC1", | ||
1111 | [NMK_GPIO_ALT_C+2] = "altC2", | ||
1112 | [NMK_GPIO_ALT_C+3] = "altC3", | ||
1113 | [NMK_GPIO_ALT_C+4] = "altC4", | ||
1081 | }; | 1114 | }; |
1082 | 1115 | ||
1083 | clk_enable(nmk_chip->clk); | 1116 | clk_enable(nmk_chip->clk); |
1084 | is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & bit); | 1117 | is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & bit); |
1085 | pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit); | 1118 | pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit); |
1086 | mode = nmk_gpio_get_mode(gpio); | 1119 | mode = nmk_gpio_get_mode(gpio); |
1120 | if ((mode == NMK_GPIO_ALT_C) && pctldev) | ||
1121 | mode = nmk_prcm_gpiocr_get_mode(pctldev, gpio); | ||
1087 | 1122 | ||
1088 | seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s", | 1123 | seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s", |
1089 | gpio, label ?: "(none)", | 1124 | gpio, label ?: "(none)", |
@@ -1127,13 +1162,14 @@ static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) | |||
1127 | unsigned gpio = chip->base; | 1162 | unsigned gpio = chip->base; |
1128 | 1163 | ||
1129 | for (i = 0; i < chip->ngpio; i++, gpio++) { | 1164 | for (i = 0; i < chip->ngpio; i++, gpio++) { |
1130 | nmk_gpio_dbg_show_one(s, chip, i, gpio); | 1165 | nmk_gpio_dbg_show_one(s, NULL, chip, i, gpio); |
1131 | seq_printf(s, "\n"); | 1166 | seq_printf(s, "\n"); |
1132 | } | 1167 | } |
1133 | } | 1168 | } |
1134 | 1169 | ||
1135 | #else | 1170 | #else |
1136 | static inline void nmk_gpio_dbg_show_one(struct seq_file *s, | 1171 | static inline void nmk_gpio_dbg_show_one(struct seq_file *s, |
1172 | struct pinctrl_dev *pctldev, | ||
1137 | struct gpio_chip *chip, | 1173 | struct gpio_chip *chip, |
1138 | unsigned offset, unsigned gpio) | 1174 | unsigned offset, unsigned gpio) |
1139 | { | 1175 | { |
@@ -1250,8 +1286,8 @@ void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up) | |||
1250 | } | 1286 | } |
1251 | } | 1287 | } |
1252 | 1288 | ||
1253 | int nmk_gpio_irq_map(struct irq_domain *d, unsigned int irq, | 1289 | static int nmk_gpio_irq_map(struct irq_domain *d, unsigned int irq, |
1254 | irq_hw_number_t hwirq) | 1290 | irq_hw_number_t hwirq) |
1255 | { | 1291 | { |
1256 | struct nmk_gpio_chip *nmk_chip = d->host_data; | 1292 | struct nmk_gpio_chip *nmk_chip = d->host_data; |
1257 | 1293 | ||
@@ -1464,7 +1500,7 @@ static void nmk_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, | |||
1464 | return; | 1500 | return; |
1465 | } | 1501 | } |
1466 | chip = range->gc; | 1502 | chip = range->gc; |
1467 | nmk_gpio_dbg_show_one(s, chip, offset - chip->base, offset); | 1503 | nmk_gpio_dbg_show_one(s, pctldev, chip, offset - chip->base, offset); |
1468 | } | 1504 | } |
1469 | 1505 | ||
1470 | static struct pinctrl_ops nmk_pinctrl_ops = { | 1506 | static struct pinctrl_ops nmk_pinctrl_ops = { |
@@ -1635,9 +1671,9 @@ static void nmk_pmx_disable(struct pinctrl_dev *pctldev, | |||
1635 | dev_dbg(npct->dev, "disable group %s, %u pins\n", g->name, g->npins); | 1671 | dev_dbg(npct->dev, "disable group %s, %u pins\n", g->name, g->npins); |
1636 | } | 1672 | } |
1637 | 1673 | ||
1638 | int nmk_gpio_request_enable(struct pinctrl_dev *pctldev, | 1674 | static int nmk_gpio_request_enable(struct pinctrl_dev *pctldev, |
1639 | struct pinctrl_gpio_range *range, | 1675 | struct pinctrl_gpio_range *range, |
1640 | unsigned offset) | 1676 | unsigned offset) |
1641 | { | 1677 | { |
1642 | struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev); | 1678 | struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev); |
1643 | struct nmk_gpio_chip *nmk_chip; | 1679 | struct nmk_gpio_chip *nmk_chip; |
@@ -1666,9 +1702,9 @@ int nmk_gpio_request_enable(struct pinctrl_dev *pctldev, | |||
1666 | return 0; | 1702 | return 0; |
1667 | } | 1703 | } |
1668 | 1704 | ||
1669 | void nmk_gpio_disable_free(struct pinctrl_dev *pctldev, | 1705 | static void nmk_gpio_disable_free(struct pinctrl_dev *pctldev, |
1670 | struct pinctrl_gpio_range *range, | 1706 | struct pinctrl_gpio_range *range, |
1671 | unsigned offset) | 1707 | unsigned offset) |
1672 | { | 1708 | { |
1673 | struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev); | 1709 | struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev); |
1674 | 1710 | ||
@@ -1686,17 +1722,15 @@ static struct pinmux_ops nmk_pinmux_ops = { | |||
1686 | .gpio_disable_free = nmk_gpio_disable_free, | 1722 | .gpio_disable_free = nmk_gpio_disable_free, |
1687 | }; | 1723 | }; |
1688 | 1724 | ||
1689 | int nmk_pin_config_get(struct pinctrl_dev *pctldev, | 1725 | static int nmk_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin, |
1690 | unsigned pin, | 1726 | unsigned long *config) |
1691 | unsigned long *config) | ||
1692 | { | 1727 | { |
1693 | /* Not implemented */ | 1728 | /* Not implemented */ |
1694 | return -EINVAL; | 1729 | return -EINVAL; |
1695 | } | 1730 | } |
1696 | 1731 | ||
1697 | int nmk_pin_config_set(struct pinctrl_dev *pctldev, | 1732 | static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin, |
1698 | unsigned pin, | 1733 | unsigned long config) |
1699 | unsigned long config) | ||
1700 | { | 1734 | { |
1701 | static const char *pullnames[] = { | 1735 | static const char *pullnames[] = { |
1702 | [NMK_GPIO_PULL_NONE] = "none", | 1736 | [NMK_GPIO_PULL_NONE] = "none", |
@@ -1818,6 +1852,7 @@ static int __devinit nmk_pinctrl_probe(struct platform_device *pdev) | |||
1818 | const struct platform_device_id *platid = platform_get_device_id(pdev); | 1852 | const struct platform_device_id *platid = platform_get_device_id(pdev); |
1819 | struct device_node *np = pdev->dev.of_node; | 1853 | struct device_node *np = pdev->dev.of_node; |
1820 | struct nmk_pinctrl *npct; | 1854 | struct nmk_pinctrl *npct; |
1855 | struct resource *res; | ||
1821 | unsigned int version = 0; | 1856 | unsigned int version = 0; |
1822 | int i; | 1857 | int i; |
1823 | 1858 | ||
@@ -1827,9 +1862,14 @@ static int __devinit nmk_pinctrl_probe(struct platform_device *pdev) | |||
1827 | 1862 | ||
1828 | if (platid) | 1863 | if (platid) |
1829 | version = platid->driver_data; | 1864 | version = platid->driver_data; |
1830 | else if (np) | 1865 | else if (np) { |
1831 | version = (unsigned int) | 1866 | const struct of_device_id *match; |
1832 | of_match_device(nmk_pinctrl_match, &pdev->dev)->data; | 1867 | |
1868 | match = of_match_device(nmk_pinctrl_match, &pdev->dev); | ||
1869 | if (!match) | ||
1870 | return -ENODEV; | ||
1871 | version = (unsigned int) match->data; | ||
1872 | } | ||
1833 | 1873 | ||
1834 | /* Poke in other ASIC variants here */ | 1874 | /* Poke in other ASIC variants here */ |
1835 | if (version == PINCTRL_NMK_STN8815) | 1875 | if (version == PINCTRL_NMK_STN8815) |
@@ -1839,22 +1879,37 @@ static int __devinit nmk_pinctrl_probe(struct platform_device *pdev) | |||
1839 | if (version == PINCTRL_NMK_DB8540) | 1879 | if (version == PINCTRL_NMK_DB8540) |
1840 | nmk_pinctrl_db8540_init(&npct->soc); | 1880 | nmk_pinctrl_db8540_init(&npct->soc); |
1841 | 1881 | ||
1882 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1883 | if (res) { | ||
1884 | npct->prcm_base = devm_ioremap(&pdev->dev, res->start, | ||
1885 | resource_size(res)); | ||
1886 | if (!npct->prcm_base) { | ||
1887 | dev_err(&pdev->dev, | ||
1888 | "failed to ioremap PRCM registers\n"); | ||
1889 | return -ENOMEM; | ||
1890 | } | ||
1891 | } else { | ||
1892 | dev_info(&pdev->dev, | ||
1893 | "No PRCM base, assume no ALT-Cx control is available\n"); | ||
1894 | } | ||
1895 | |||
1842 | /* | 1896 | /* |
1843 | * We need all the GPIO drivers to probe FIRST, or we will not be able | 1897 | * We need all the GPIO drivers to probe FIRST, or we will not be able |
1844 | * to obtain references to the struct gpio_chip * for them, and we | 1898 | * to obtain references to the struct gpio_chip * for them, and we |
1845 | * need this to proceed. | 1899 | * need this to proceed. |
1846 | */ | 1900 | */ |
1847 | for (i = 0; i < npct->soc->gpio_num_ranges; i++) { | 1901 | for (i = 0; i < npct->soc->gpio_num_ranges; i++) { |
1848 | if (!nmk_gpio_chips[i]) { | 1902 | if (!nmk_gpio_chips[npct->soc->gpio_ranges[i].id]) { |
1849 | dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i); | 1903 | dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i); |
1850 | return -EPROBE_DEFER; | 1904 | return -EPROBE_DEFER; |
1851 | } | 1905 | } |
1852 | npct->soc->gpio_ranges[i].gc = &nmk_gpio_chips[i]->chip; | 1906 | npct->soc->gpio_ranges[i].gc = &nmk_gpio_chips[npct->soc->gpio_ranges[i].id]->chip; |
1853 | } | 1907 | } |
1854 | 1908 | ||
1855 | nmk_pinctrl_desc.pins = npct->soc->pins; | 1909 | nmk_pinctrl_desc.pins = npct->soc->pins; |
1856 | nmk_pinctrl_desc.npins = npct->soc->npins; | 1910 | nmk_pinctrl_desc.npins = npct->soc->npins; |
1857 | npct->dev = &pdev->dev; | 1911 | npct->dev = &pdev->dev; |
1912 | |||
1858 | npct->pctl = pinctrl_register(&nmk_pinctrl_desc, &pdev->dev, npct); | 1913 | npct->pctl = pinctrl_register(&nmk_pinctrl_desc, &pdev->dev, npct); |
1859 | if (!npct->pctl) { | 1914 | if (!npct->pctl) { |
1860 | dev_err(&pdev->dev, "could not register Nomadik pinctrl driver\n"); | 1915 | dev_err(&pdev->dev, "could not register Nomadik pinctrl driver\n"); |
@@ -1889,6 +1944,7 @@ static const struct platform_device_id nmk_pinctrl_id[] = { | |||
1889 | { "pinctrl-stn8815", PINCTRL_NMK_STN8815 }, | 1944 | { "pinctrl-stn8815", PINCTRL_NMK_STN8815 }, |
1890 | { "pinctrl-db8500", PINCTRL_NMK_DB8500 }, | 1945 | { "pinctrl-db8500", PINCTRL_NMK_DB8500 }, |
1891 | { "pinctrl-db8540", PINCTRL_NMK_DB8540 }, | 1946 | { "pinctrl-db8540", PINCTRL_NMK_DB8540 }, |
1947 | { } | ||
1892 | }; | 1948 | }; |
1893 | 1949 | ||
1894 | static struct platform_driver nmk_pinctrl_driver = { | 1950 | static struct platform_driver nmk_pinctrl_driver = { |
diff --git a/drivers/pinctrl/pinctrl-nomadik.h b/drivers/pinctrl/pinctrl-nomadik.h index eef316e979a0..bcd4191e10ea 100644 --- a/drivers/pinctrl/pinctrl-nomadik.h +++ b/drivers/pinctrl/pinctrl-nomadik.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef PINCTRL_PINCTRL_NOMADIK_H | 1 | #ifndef PINCTRL_PINCTRL_NOMADIK_H |
2 | #define PINCTRL_PINCTRL_NOMADIK_H | 2 | #define PINCTRL_PINCTRL_NOMADIK_H |
3 | 3 | ||
4 | #include <plat/gpio-nomadik.h> | 4 | #include <linux/platform_data/pinctrl-nomadik.h> |
5 | 5 | ||
6 | /* Package definitions */ | 6 | /* Package definitions */ |
7 | #define PINCTRL_NMK_STN8815 0 | 7 | #define PINCTRL_NMK_STN8815 0 |
diff --git a/drivers/pinctrl/pinctrl-pxa3xx.c b/drivers/pinctrl/pinctrl-pxa3xx.c index f14cd6ba4c0b..51f8a388b917 100644 --- a/drivers/pinctrl/pinctrl-pxa3xx.c +++ b/drivers/pinctrl/pinctrl-pxa3xx.c | |||
@@ -173,7 +173,6 @@ int pxa3xx_pinctrl_register(struct platform_device *pdev, | |||
173 | { | 173 | { |
174 | struct pinctrl_desc *desc; | 174 | struct pinctrl_desc *desc; |
175 | struct resource *res; | 175 | struct resource *res; |
176 | int ret = 0; | ||
177 | 176 | ||
178 | if (!info || !info->cputype) | 177 | if (!info || !info->cputype) |
179 | return -EINVAL; | 178 | return -EINVAL; |
@@ -188,23 +187,17 @@ int pxa3xx_pinctrl_register(struct platform_device *pdev, | |||
188 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 187 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
189 | if (!res) | 188 | if (!res) |
190 | return -ENOENT; | 189 | return -ENOENT; |
191 | info->phy_base = res->start; | 190 | info->virt_base = devm_request_and_ioremap(&pdev->dev, res); |
192 | info->phy_size = resource_size(res); | ||
193 | info->virt_base = ioremap(info->phy_base, info->phy_size); | ||
194 | if (!info->virt_base) | 191 | if (!info->virt_base) |
195 | return -ENOMEM; | 192 | return -ENOMEM; |
196 | info->pctrl = pinctrl_register(desc, &pdev->dev, info); | 193 | info->pctrl = pinctrl_register(desc, &pdev->dev, info); |
197 | if (!info->pctrl) { | 194 | if (!info->pctrl) { |
198 | dev_err(&pdev->dev, "failed to register PXA pinmux driver\n"); | 195 | dev_err(&pdev->dev, "failed to register PXA pinmux driver\n"); |
199 | ret = -EINVAL; | 196 | return -EINVAL; |
200 | goto err; | ||
201 | } | 197 | } |
202 | pinctrl_add_gpio_range(info->pctrl, &pxa3xx_pinctrl_gpio_range); | 198 | pinctrl_add_gpio_range(info->pctrl, &pxa3xx_pinctrl_gpio_range); |
203 | platform_set_drvdata(pdev, info); | 199 | platform_set_drvdata(pdev, info); |
204 | return 0; | 200 | return 0; |
205 | err: | ||
206 | iounmap(info->virt_base); | ||
207 | return ret; | ||
208 | } | 201 | } |
209 | 202 | ||
210 | int pxa3xx_pinctrl_unregister(struct platform_device *pdev) | 203 | int pxa3xx_pinctrl_unregister(struct platform_device *pdev) |
@@ -212,7 +205,6 @@ int pxa3xx_pinctrl_unregister(struct platform_device *pdev) | |||
212 | struct pxa3xx_pinmux_info *info = platform_get_drvdata(pdev); | 205 | struct pxa3xx_pinmux_info *info = platform_get_drvdata(pdev); |
213 | 206 | ||
214 | pinctrl_unregister(info->pctrl); | 207 | pinctrl_unregister(info->pctrl); |
215 | iounmap(info->virt_base); | ||
216 | platform_set_drvdata(pdev, NULL); | 208 | platform_set_drvdata(pdev, NULL); |
217 | return 0; | 209 | return 0; |
218 | } | 210 | } |
diff --git a/drivers/pinctrl/pinctrl-pxa3xx.h b/drivers/pinctrl/pinctrl-pxa3xx.h index 8135744d6599..92fad0880834 100644 --- a/drivers/pinctrl/pinctrl-pxa3xx.h +++ b/drivers/pinctrl/pinctrl-pxa3xx.h | |||
@@ -60,8 +60,6 @@ struct pxa3xx_pinmux_info { | |||
60 | struct device *dev; | 60 | struct device *dev; |
61 | struct pinctrl_dev *pctrl; | 61 | struct pinctrl_dev *pctrl; |
62 | enum pxa_cpu_type cputype; | 62 | enum pxa_cpu_type cputype; |
63 | unsigned int phy_base; | ||
64 | unsigned int phy_size; | ||
65 | void __iomem *virt_base; | 63 | void __iomem *virt_base; |
66 | 64 | ||
67 | struct pxa3xx_mfp_pin *mfp; | 65 | struct pxa3xx_mfp_pin *mfp; |
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 726a729a2ec9..554946356fba 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #define PCS_MUX_BITS_NAME "pinctrl-single,bits" | 30 | #define PCS_MUX_BITS_NAME "pinctrl-single,bits" |
31 | #define PCS_REG_NAME_LEN ((sizeof(unsigned long) * 2) + 1) | 31 | #define PCS_REG_NAME_LEN ((sizeof(unsigned long) * 2) + 1) |
32 | #define PCS_OFF_DISABLED ~0U | 32 | #define PCS_OFF_DISABLED ~0U |
33 | #define PCS_MAX_GPIO_VALUES 2 | ||
33 | 34 | ||
34 | /** | 35 | /** |
35 | * struct pcs_pingroup - pingroups for a function | 36 | * struct pcs_pingroup - pingroups for a function |
@@ -77,6 +78,16 @@ struct pcs_function { | |||
77 | }; | 78 | }; |
78 | 79 | ||
79 | /** | 80 | /** |
81 | * struct pcs_gpio_range - pinctrl gpio range | ||
82 | * @range: subrange of the GPIO number space | ||
83 | * @gpio_func: gpio function value in the pinmux register | ||
84 | */ | ||
85 | struct pcs_gpio_range { | ||
86 | struct pinctrl_gpio_range range; | ||
87 | int gpio_func; | ||
88 | }; | ||
89 | |||
90 | /** | ||
80 | * struct pcs_data - wrapper for data needed by pinctrl framework | 91 | * struct pcs_data - wrapper for data needed by pinctrl framework |
81 | * @pa: pindesc array | 92 | * @pa: pindesc array |
82 | * @cur: index to current element | 93 | * @cur: index to current element |
@@ -244,15 +255,15 @@ static int pcs_get_group_pins(struct pinctrl_dev *pctldev, | |||
244 | 255 | ||
245 | static void pcs_pin_dbg_show(struct pinctrl_dev *pctldev, | 256 | static void pcs_pin_dbg_show(struct pinctrl_dev *pctldev, |
246 | struct seq_file *s, | 257 | struct seq_file *s, |
247 | unsigned offset) | 258 | unsigned pin) |
248 | { | 259 | { |
249 | struct pcs_device *pcs; | 260 | struct pcs_device *pcs; |
250 | unsigned val; | 261 | unsigned val, mux_bytes; |
251 | 262 | ||
252 | pcs = pinctrl_dev_get_drvdata(pctldev); | 263 | pcs = pinctrl_dev_get_drvdata(pctldev); |
253 | 264 | ||
254 | val = pcs->read(pcs->base + offset); | 265 | mux_bytes = pcs->width / BITS_PER_BYTE; |
255 | val &= pcs->fmask; | 266 | val = pcs->read(pcs->base + pin * mux_bytes); |
256 | 267 | ||
257 | seq_printf(s, "%08x %s " , val, DRIVER_NAME); | 268 | seq_printf(s, "%08x %s " , val, DRIVER_NAME); |
258 | } | 269 | } |
@@ -403,9 +414,26 @@ static void pcs_disable(struct pinctrl_dev *pctldev, unsigned fselector, | |||
403 | } | 414 | } |
404 | 415 | ||
405 | static int pcs_request_gpio(struct pinctrl_dev *pctldev, | 416 | static int pcs_request_gpio(struct pinctrl_dev *pctldev, |
406 | struct pinctrl_gpio_range *range, unsigned offset) | 417 | struct pinctrl_gpio_range *range, unsigned pin) |
407 | { | 418 | { |
408 | return -ENOTSUPP; | 419 | struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev); |
420 | struct pcs_gpio_range *gpio = NULL; | ||
421 | int end, mux_bytes; | ||
422 | unsigned data; | ||
423 | |||
424 | gpio = container_of(range, struct pcs_gpio_range, range); | ||
425 | end = range->pin_base + range->npins - 1; | ||
426 | if (pin < range->pin_base || pin > end) { | ||
427 | dev_err(pctldev->dev, | ||
428 | "pin %d isn't in the range of %d to %d\n", | ||
429 | pin, range->pin_base, end); | ||
430 | return -EINVAL; | ||
431 | } | ||
432 | mux_bytes = pcs->width / BITS_PER_BYTE; | ||
433 | data = pcs->read(pcs->base + pin * mux_bytes) & ~pcs->fmask; | ||
434 | data |= gpio->gpio_func; | ||
435 | pcs->write(data, pcs->base + pin * mux_bytes); | ||
436 | return 0; | ||
409 | } | 437 | } |
410 | 438 | ||
411 | static struct pinmux_ops pcs_pinmux_ops = { | 439 | static struct pinmux_ops pcs_pinmux_ops = { |
@@ -772,7 +800,7 @@ static int pcs_dt_node_to_map(struct pinctrl_dev *pctldev, | |||
772 | pcs = pinctrl_dev_get_drvdata(pctldev); | 800 | pcs = pinctrl_dev_get_drvdata(pctldev); |
773 | 801 | ||
774 | *map = devm_kzalloc(pcs->dev, sizeof(**map), GFP_KERNEL); | 802 | *map = devm_kzalloc(pcs->dev, sizeof(**map), GFP_KERNEL); |
775 | if (!map) | 803 | if (!*map) |
776 | return -ENOMEM; | 804 | return -ENOMEM; |
777 | 805 | ||
778 | *num_maps = 0; | 806 | *num_maps = 0; |
@@ -879,6 +907,50 @@ static void pcs_free_resources(struct pcs_device *pcs) | |||
879 | 907 | ||
880 | static struct of_device_id pcs_of_match[]; | 908 | static struct of_device_id pcs_of_match[]; |
881 | 909 | ||
910 | static int __devinit pcs_add_gpio_range(struct device_node *node, | ||
911 | struct pcs_device *pcs) | ||
912 | { | ||
913 | struct pcs_gpio_range *gpio; | ||
914 | struct device_node *child; | ||
915 | struct resource r; | ||
916 | const char name[] = "pinctrl-single"; | ||
917 | u32 gpiores[PCS_MAX_GPIO_VALUES]; | ||
918 | int ret, i = 0, mux_bytes = 0; | ||
919 | |||
920 | for_each_child_of_node(node, child) { | ||
921 | ret = of_address_to_resource(child, 0, &r); | ||
922 | if (ret < 0) | ||
923 | continue; | ||
924 | memset(gpiores, 0, sizeof(u32) * PCS_MAX_GPIO_VALUES); | ||
925 | ret = of_property_read_u32_array(child, "pinctrl-single,gpio", | ||
926 | gpiores, PCS_MAX_GPIO_VALUES); | ||
927 | if (ret < 0) | ||
928 | continue; | ||
929 | gpio = devm_kzalloc(pcs->dev, sizeof(*gpio), GFP_KERNEL); | ||
930 | if (!gpio) { | ||
931 | dev_err(pcs->dev, "failed to allocate pcs gpio\n"); | ||
932 | return -ENOMEM; | ||
933 | } | ||
934 | gpio->range.name = devm_kzalloc(pcs->dev, sizeof(name), | ||
935 | GFP_KERNEL); | ||
936 | if (!gpio->range.name) { | ||
937 | dev_err(pcs->dev, "failed to allocate range name\n"); | ||
938 | return -ENOMEM; | ||
939 | } | ||
940 | memcpy((char *)gpio->range.name, name, sizeof(name)); | ||
941 | |||
942 | gpio->range.id = i++; | ||
943 | gpio->range.base = gpiores[0]; | ||
944 | gpio->gpio_func = gpiores[1]; | ||
945 | mux_bytes = pcs->width / BITS_PER_BYTE; | ||
946 | gpio->range.pin_base = (r.start - pcs->res->start) / mux_bytes; | ||
947 | gpio->range.npins = (r.end - r.start) / mux_bytes + 1; | ||
948 | |||
949 | pinctrl_add_gpio_range(pcs->pctl, &gpio->range); | ||
950 | } | ||
951 | return 0; | ||
952 | } | ||
953 | |||
882 | static int __devinit pcs_probe(struct platform_device *pdev) | 954 | static int __devinit pcs_probe(struct platform_device *pdev) |
883 | { | 955 | { |
884 | struct device_node *np = pdev->dev.of_node; | 956 | struct device_node *np = pdev->dev.of_node; |
@@ -975,6 +1047,10 @@ static int __devinit pcs_probe(struct platform_device *pdev) | |||
975 | goto free; | 1047 | goto free; |
976 | } | 1048 | } |
977 | 1049 | ||
1050 | ret = pcs_add_gpio_range(np, pcs); | ||
1051 | if (ret < 0) | ||
1052 | goto free; | ||
1053 | |||
978 | dev_info(pcs->dev, "%i pins at pa %p size %u\n", | 1054 | dev_info(pcs->dev, "%i pins at pa %p size %u\n", |
979 | pcs->desc.npins, pcs->base, pcs->size); | 1055 | pcs->desc.npins, pcs->base, pcs->size); |
980 | 1056 | ||
diff --git a/drivers/pinctrl/pinctrl-sirf.c b/drivers/pinctrl/pinctrl-sirf.c index 9ecacf3d0a75..a3905e58d1b3 100644 --- a/drivers/pinctrl/pinctrl-sirf.c +++ b/drivers/pinctrl/pinctrl-sirf.c | |||
@@ -32,10 +32,10 @@ | |||
32 | #define SIRFSOC_NUM_PADS 622 | 32 | #define SIRFSOC_NUM_PADS 622 |
33 | #define SIRFSOC_RSC_PIN_MUX 0x4 | 33 | #define SIRFSOC_RSC_PIN_MUX 0x4 |
34 | 34 | ||
35 | #define SIRFSOC_GPIO_PAD_EN(g) ((g)*0x100 + 0x84) | 35 | #define SIRFSOC_GPIO_PAD_EN(g) ((g)*0x100 + 0x84) |
36 | #define SIRFSOC_GPIO_PAD_EN_CLR(g) ((g)*0x100 + 0x90) | ||
36 | #define SIRFSOC_GPIO_CTRL(g, i) ((g)*0x100 + (i)*4) | 37 | #define SIRFSOC_GPIO_CTRL(g, i) ((g)*0x100 + (i)*4) |
37 | #define SIRFSOC_GPIO_DSP_EN0 (0x80) | 38 | #define SIRFSOC_GPIO_DSP_EN0 (0x80) |
38 | #define SIRFSOC_GPIO_PAD_EN(g) ((g)*0x100 + 0x84) | ||
39 | #define SIRFSOC_GPIO_INT_STATUS(g) ((g)*0x100 + 0x8C) | 39 | #define SIRFSOC_GPIO_INT_STATUS(g) ((g)*0x100 + 0x8C) |
40 | 40 | ||
41 | #define SIRFSOC_GPIO_CTL_INTR_LOW_MASK 0x1 | 41 | #define SIRFSOC_GPIO_CTL_INTR_LOW_MASK 0x1 |
@@ -60,6 +60,7 @@ struct sirfsoc_gpio_bank { | |||
60 | int id; | 60 | int id; |
61 | int parent_irq; | 61 | int parent_irq; |
62 | spinlock_t lock; | 62 | spinlock_t lock; |
63 | bool is_marco; /* for marco, some registers are different with prima2 */ | ||
63 | }; | 64 | }; |
64 | 65 | ||
65 | static struct sirfsoc_gpio_bank sgpio_bank[SIRFSOC_GPIO_NO_OF_BANKS]; | 66 | static struct sirfsoc_gpio_bank sgpio_bank[SIRFSOC_GPIO_NO_OF_BANKS]; |
@@ -191,6 +192,7 @@ struct sirfsoc_pmx { | |||
191 | struct pinctrl_dev *pmx; | 192 | struct pinctrl_dev *pmx; |
192 | void __iomem *gpio_virtbase; | 193 | void __iomem *gpio_virtbase; |
193 | void __iomem *rsc_virtbase; | 194 | void __iomem *rsc_virtbase; |
195 | bool is_marco; | ||
194 | }; | 196 | }; |
195 | 197 | ||
196 | /* SIRFSOC_GPIO_PAD_EN set */ | 198 | /* SIRFSOC_GPIO_PAD_EN set */ |
@@ -1088,12 +1090,21 @@ static void sirfsoc_pinmux_endisable(struct sirfsoc_pmx *spmx, unsigned selector | |||
1088 | 1090 | ||
1089 | for (i = 0; i < mux->muxmask_counts; i++) { | 1091 | for (i = 0; i < mux->muxmask_counts; i++) { |
1090 | u32 muxval; | 1092 | u32 muxval; |
1091 | muxval = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(mask[i].group)); | 1093 | if (!spmx->is_marco) { |
1092 | if (enable) | 1094 | muxval = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(mask[i].group)); |
1093 | muxval = muxval & ~mask[i].mask; | 1095 | if (enable) |
1094 | else | 1096 | muxval = muxval & ~mask[i].mask; |
1095 | muxval = muxval | mask[i].mask; | 1097 | else |
1096 | writel(muxval, spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(mask[i].group)); | 1098 | muxval = muxval | mask[i].mask; |
1099 | writel(muxval, spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(mask[i].group)); | ||
1100 | } else { | ||
1101 | if (enable) | ||
1102 | writel(mask[i].mask, spmx->gpio_virtbase + | ||
1103 | SIRFSOC_GPIO_PAD_EN_CLR(mask[i].group)); | ||
1104 | else | ||
1105 | writel(mask[i].mask, spmx->gpio_virtbase + | ||
1106 | SIRFSOC_GPIO_PAD_EN(mask[i].group)); | ||
1107 | } | ||
1097 | } | 1108 | } |
1098 | 1109 | ||
1099 | if (mux->funcmask && enable) { | 1110 | if (mux->funcmask && enable) { |
@@ -1158,9 +1169,14 @@ static int sirfsoc_pinmux_request_gpio(struct pinctrl_dev *pmxdev, | |||
1158 | 1169 | ||
1159 | spmx = pinctrl_dev_get_drvdata(pmxdev); | 1170 | spmx = pinctrl_dev_get_drvdata(pmxdev); |
1160 | 1171 | ||
1161 | muxval = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(group)); | 1172 | if (!spmx->is_marco) { |
1162 | muxval = muxval | (1 << (offset - range->pin_base)); | 1173 | muxval = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(group)); |
1163 | writel(muxval, spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(group)); | 1174 | muxval = muxval | (1 << (offset - range->pin_base)); |
1175 | writel(muxval, spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(group)); | ||
1176 | } else { | ||
1177 | writel(1 << (offset - range->pin_base), spmx->gpio_virtbase + | ||
1178 | SIRFSOC_GPIO_PAD_EN(group)); | ||
1179 | } | ||
1164 | 1180 | ||
1165 | return 0; | 1181 | return 0; |
1166 | } | 1182 | } |
@@ -1218,6 +1234,7 @@ static void __iomem *sirfsoc_rsc_of_iomap(void) | |||
1218 | { | 1234 | { |
1219 | const struct of_device_id rsc_ids[] = { | 1235 | const struct of_device_id rsc_ids[] = { |
1220 | { .compatible = "sirf,prima2-rsc" }, | 1236 | { .compatible = "sirf,prima2-rsc" }, |
1237 | { .compatible = "sirf,marco-rsc" }, | ||
1221 | {} | 1238 | {} |
1222 | }; | 1239 | }; |
1223 | struct device_node *np; | 1240 | struct device_node *np; |
@@ -1259,6 +1276,9 @@ static int __devinit sirfsoc_pinmux_probe(struct platform_device *pdev) | |||
1259 | goto out_no_rsc_remap; | 1276 | goto out_no_rsc_remap; |
1260 | } | 1277 | } |
1261 | 1278 | ||
1279 | if (of_device_is_compatible(np, "sirf,marco-pinctrl")) | ||
1280 | spmx->is_marco = 1; | ||
1281 | |||
1262 | /* Now register the pin controller and all pins it handles */ | 1282 | /* Now register the pin controller and all pins it handles */ |
1263 | spmx->pmx = pinctrl_register(&sirfsoc_pinmux_desc, &pdev->dev, spmx); | 1283 | spmx->pmx = pinctrl_register(&sirfsoc_pinmux_desc, &pdev->dev, spmx); |
1264 | if (!spmx->pmx) { | 1284 | if (!spmx->pmx) { |
@@ -1287,6 +1307,7 @@ out_no_gpio_remap: | |||
1287 | 1307 | ||
1288 | static const struct of_device_id pinmux_ids[] __devinitconst = { | 1308 | static const struct of_device_id pinmux_ids[] __devinitconst = { |
1289 | { .compatible = "sirf,prima2-pinctrl" }, | 1309 | { .compatible = "sirf,prima2-pinctrl" }, |
1310 | { .compatible = "sirf,marco-pinctrl" }, | ||
1290 | {} | 1311 | {} |
1291 | }; | 1312 | }; |
1292 | 1313 | ||
@@ -1621,8 +1642,8 @@ static void sirfsoc_gpio_set_value(struct gpio_chip *chip, unsigned offset, | |||
1621 | spin_unlock_irqrestore(&bank->lock, flags); | 1642 | spin_unlock_irqrestore(&bank->lock, flags); |
1622 | } | 1643 | } |
1623 | 1644 | ||
1624 | int sirfsoc_gpio_irq_map(struct irq_domain *d, unsigned int irq, | 1645 | static int sirfsoc_gpio_irq_map(struct irq_domain *d, unsigned int irq, |
1625 | irq_hw_number_t hwirq) | 1646 | irq_hw_number_t hwirq) |
1626 | { | 1647 | { |
1627 | struct sirfsoc_gpio_bank *bank = d->host_data; | 1648 | struct sirfsoc_gpio_bank *bank = d->host_data; |
1628 | 1649 | ||
@@ -1648,6 +1669,7 @@ static int __devinit sirfsoc_gpio_probe(struct device_node *np) | |||
1648 | struct sirfsoc_gpio_bank *bank; | 1669 | struct sirfsoc_gpio_bank *bank; |
1649 | void *regs; | 1670 | void *regs; |
1650 | struct platform_device *pdev; | 1671 | struct platform_device *pdev; |
1672 | bool is_marco = false; | ||
1651 | 1673 | ||
1652 | pdev = of_find_device_by_node(np); | 1674 | pdev = of_find_device_by_node(np); |
1653 | if (!pdev) | 1675 | if (!pdev) |
@@ -1657,6 +1679,9 @@ static int __devinit sirfsoc_gpio_probe(struct device_node *np) | |||
1657 | if (!regs) | 1679 | if (!regs) |
1658 | return -ENOMEM; | 1680 | return -ENOMEM; |
1659 | 1681 | ||
1682 | if (of_device_is_compatible(np, "sirf,marco-pinctrl")) | ||
1683 | is_marco = 1; | ||
1684 | |||
1660 | for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) { | 1685 | for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) { |
1661 | bank = &sgpio_bank[i]; | 1686 | bank = &sgpio_bank[i]; |
1662 | spin_lock_init(&bank->lock); | 1687 | spin_lock_init(&bank->lock); |
@@ -1673,6 +1698,7 @@ static int __devinit sirfsoc_gpio_probe(struct device_node *np) | |||
1673 | bank->chip.gc.of_node = np; | 1698 | bank->chip.gc.of_node = np; |
1674 | bank->chip.regs = regs; | 1699 | bank->chip.regs = regs; |
1675 | bank->id = i; | 1700 | bank->id = i; |
1701 | bank->is_marco = is_marco; | ||
1676 | bank->parent_irq = platform_get_irq(pdev, i); | 1702 | bank->parent_irq = platform_get_irq(pdev, i); |
1677 | if (bank->parent_irq < 0) { | 1703 | if (bank->parent_irq < 0) { |
1678 | err = bank->parent_irq; | 1704 | err = bank->parent_irq; |
diff --git a/drivers/pinctrl/pinctrl-tegra.c b/drivers/pinctrl/pinctrl-tegra.c index 7da0b371fd65..e9f80a54b3d0 100644 --- a/drivers/pinctrl/pinctrl-tegra.c +++ b/drivers/pinctrl/pinctrl-tegra.c | |||
@@ -178,8 +178,9 @@ static int add_config(struct device *dev, unsigned long **configs, | |||
178 | return 0; | 178 | return 0; |
179 | } | 179 | } |
180 | 180 | ||
181 | void tegra_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, | 181 | static void tegra_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, |
182 | struct pinctrl_map *map, unsigned num_maps) | 182 | struct pinctrl_map *map, |
183 | unsigned num_maps) | ||
183 | { | 184 | { |
184 | int i; | 185 | int i; |
185 | 186 | ||
@@ -209,11 +210,11 @@ static const struct cfg_param { | |||
209 | {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING}, | 210 | {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING}, |
210 | }; | 211 | }; |
211 | 212 | ||
212 | int tegra_pinctrl_dt_subnode_to_map(struct device *dev, | 213 | static int tegra_pinctrl_dt_subnode_to_map(struct device *dev, |
213 | struct device_node *np, | 214 | struct device_node *np, |
214 | struct pinctrl_map **map, | 215 | struct pinctrl_map **map, |
215 | unsigned *reserved_maps, | 216 | unsigned *reserved_maps, |
216 | unsigned *num_maps) | 217 | unsigned *num_maps) |
217 | { | 218 | { |
218 | int ret, i; | 219 | int ret, i; |
219 | const char *function; | 220 | const char *function; |
@@ -288,9 +289,10 @@ exit: | |||
288 | return ret; | 289 | return ret; |
289 | } | 290 | } |
290 | 291 | ||
291 | int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, | 292 | static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, |
292 | struct device_node *np_config, | 293 | struct device_node *np_config, |
293 | struct pinctrl_map **map, unsigned *num_maps) | 294 | struct pinctrl_map **map, |
295 | unsigned *num_maps) | ||
294 | { | 296 | { |
295 | unsigned reserved_maps; | 297 | unsigned reserved_maps; |
296 | struct device_node *np; | 298 | struct device_node *np; |
@@ -660,7 +662,7 @@ static void tegra_pinconf_config_dbg_show(struct pinctrl_dev *pctldev, | |||
660 | } | 662 | } |
661 | #endif | 663 | #endif |
662 | 664 | ||
663 | struct pinconf_ops tegra_pinconf_ops = { | 665 | static struct pinconf_ops tegra_pinconf_ops = { |
664 | .pin_config_get = tegra_pinconf_get, | 666 | .pin_config_get = tegra_pinconf_get, |
665 | .pin_config_set = tegra_pinconf_set, | 667 | .pin_config_set = tegra_pinconf_set, |
666 | .pin_config_group_get = tegra_pinconf_group_get, | 668 | .pin_config_group_get = tegra_pinconf_group_get, |
diff --git a/drivers/pinctrl/pinctrl-u300.c b/drivers/pinctrl/pinctrl-u300.c index 309f5b9a70ec..b84de03ed54d 100644 --- a/drivers/pinctrl/pinctrl-u300.c +++ b/drivers/pinctrl/pinctrl-u300.c | |||
@@ -663,8 +663,6 @@ static const struct pinctrl_pin_desc u300_pads[] = { | |||
663 | struct u300_pmx { | 663 | struct u300_pmx { |
664 | struct device *dev; | 664 | struct device *dev; |
665 | struct pinctrl_dev *pctl; | 665 | struct pinctrl_dev *pctl; |
666 | u32 phybase; | ||
667 | u32 physize; | ||
668 | void __iomem *virtbase; | 666 | void __iomem *virtbase; |
669 | }; | 667 | }; |
670 | 668 | ||
@@ -1013,52 +1011,11 @@ static struct pinmux_ops u300_pmx_ops = { | |||
1013 | .disable = u300_pmx_disable, | 1011 | .disable = u300_pmx_disable, |
1014 | }; | 1012 | }; |
1015 | 1013 | ||
1016 | /* | 1014 | static int u300_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin, |
1017 | * GPIO ranges handled by the application-side COH901XXX GPIO controller | 1015 | unsigned long *config) |
1018 | * Very many pins can be converted into GPIO pins, but we only list those | ||
1019 | * that are useful in practice to cut down on tables. | ||
1020 | */ | ||
1021 | #define U300_GPIO_RANGE(a, b, c) { .name = "COH901XXX", .id = a, .base= a, \ | ||
1022 | .pin_base = b, .npins = c } | ||
1023 | |||
1024 | static struct pinctrl_gpio_range u300_gpio_ranges[] = { | ||
1025 | U300_GPIO_RANGE(10, 426, 1), | ||
1026 | U300_GPIO_RANGE(11, 180, 1), | ||
1027 | U300_GPIO_RANGE(12, 165, 1), /* MS/MMC card insertion */ | ||
1028 | U300_GPIO_RANGE(13, 179, 1), | ||
1029 | U300_GPIO_RANGE(14, 178, 1), | ||
1030 | U300_GPIO_RANGE(16, 194, 1), | ||
1031 | U300_GPIO_RANGE(17, 193, 1), | ||
1032 | U300_GPIO_RANGE(18, 192, 1), | ||
1033 | U300_GPIO_RANGE(19, 191, 1), | ||
1034 | U300_GPIO_RANGE(20, 186, 1), | ||
1035 | U300_GPIO_RANGE(21, 185, 1), | ||
1036 | U300_GPIO_RANGE(22, 184, 1), | ||
1037 | U300_GPIO_RANGE(23, 183, 1), | ||
1038 | U300_GPIO_RANGE(24, 182, 1), | ||
1039 | U300_GPIO_RANGE(25, 181, 1), | ||
1040 | }; | ||
1041 | |||
1042 | static struct pinctrl_gpio_range *u300_match_gpio_range(unsigned pin) | ||
1043 | { | ||
1044 | int i; | ||
1045 | |||
1046 | for (i = 0; i < ARRAY_SIZE(u300_gpio_ranges); i++) { | ||
1047 | struct pinctrl_gpio_range *range; | ||
1048 | |||
1049 | range = &u300_gpio_ranges[i]; | ||
1050 | if (pin >= range->pin_base && | ||
1051 | pin <= (range->pin_base + range->npins - 1)) | ||
1052 | return range; | ||
1053 | } | ||
1054 | return NULL; | ||
1055 | } | ||
1056 | |||
1057 | int u300_pin_config_get(struct pinctrl_dev *pctldev, | ||
1058 | unsigned pin, | ||
1059 | unsigned long *config) | ||
1060 | { | 1016 | { |
1061 | struct pinctrl_gpio_range *range = u300_match_gpio_range(pin); | 1017 | struct pinctrl_gpio_range *range = |
1018 | pinctrl_find_gpio_range_from_pin(pctldev, pin); | ||
1062 | 1019 | ||
1063 | /* We get config for those pins we CAN get it for and that's it */ | 1020 | /* We get config for those pins we CAN get it for and that's it */ |
1064 | if (!range) | 1021 | if (!range) |
@@ -1069,11 +1026,11 @@ int u300_pin_config_get(struct pinctrl_dev *pctldev, | |||
1069 | config); | 1026 | config); |
1070 | } | 1027 | } |
1071 | 1028 | ||
1072 | int u300_pin_config_set(struct pinctrl_dev *pctldev, | 1029 | static int u300_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin, |
1073 | unsigned pin, | 1030 | unsigned long config) |
1074 | unsigned long config) | ||
1075 | { | 1031 | { |
1076 | struct pinctrl_gpio_range *range = u300_match_gpio_range(pin); | 1032 | struct pinctrl_gpio_range *range = |
1033 | pinctrl_find_gpio_range_from_pin(pctldev, pin); | ||
1077 | int ret; | 1034 | int ret; |
1078 | 1035 | ||
1079 | if (!range) | 1036 | if (!range) |
@@ -1109,9 +1066,6 @@ static int __devinit u300_pmx_probe(struct platform_device *pdev) | |||
1109 | { | 1066 | { |
1110 | struct u300_pmx *upmx; | 1067 | struct u300_pmx *upmx; |
1111 | struct resource *res; | 1068 | struct resource *res; |
1112 | struct gpio_chip *gpio_chip = dev_get_platdata(&pdev->dev); | ||
1113 | int ret; | ||
1114 | int i; | ||
1115 | 1069 | ||
1116 | /* Create state holders etc for this driver */ | 1070 | /* Create state holders etc for this driver */ |
1117 | upmx = devm_kzalloc(&pdev->dev, sizeof(*upmx), GFP_KERNEL); | 1071 | upmx = devm_kzalloc(&pdev->dev, sizeof(*upmx), GFP_KERNEL); |
@@ -1123,32 +1077,15 @@ static int __devinit u300_pmx_probe(struct platform_device *pdev) | |||
1123 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1077 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1124 | if (!res) | 1078 | if (!res) |
1125 | return -ENOENT; | 1079 | return -ENOENT; |
1126 | upmx->phybase = res->start; | ||
1127 | upmx->physize = resource_size(res); | ||
1128 | |||
1129 | if (request_mem_region(upmx->phybase, upmx->physize, | ||
1130 | DRIVER_NAME) == NULL) { | ||
1131 | ret = -ENOMEM; | ||
1132 | goto out_no_memregion; | ||
1133 | } | ||
1134 | 1080 | ||
1135 | upmx->virtbase = ioremap(upmx->phybase, upmx->physize); | 1081 | upmx->virtbase = devm_request_and_ioremap(&pdev->dev, res); |
1136 | if (!upmx->virtbase) { | 1082 | if (!upmx->virtbase) |
1137 | ret = -ENOMEM; | 1083 | return -ENOMEM; |
1138 | goto out_no_remap; | ||
1139 | } | ||
1140 | 1084 | ||
1141 | upmx->pctl = pinctrl_register(&u300_pmx_desc, &pdev->dev, upmx); | 1085 | upmx->pctl = pinctrl_register(&u300_pmx_desc, &pdev->dev, upmx); |
1142 | if (!upmx->pctl) { | 1086 | if (!upmx->pctl) { |
1143 | dev_err(&pdev->dev, "could not register U300 pinmux driver\n"); | 1087 | dev_err(&pdev->dev, "could not register U300 pinmux driver\n"); |
1144 | ret = -EINVAL; | 1088 | return -EINVAL; |
1145 | goto out_no_pmx; | ||
1146 | } | ||
1147 | |||
1148 | /* We will handle a range of GPIO pins */ | ||
1149 | for (i = 0; i < ARRAY_SIZE(u300_gpio_ranges); i++) { | ||
1150 | u300_gpio_ranges[i].gc = gpio_chip; | ||
1151 | pinctrl_add_gpio_range(upmx->pctl, &u300_gpio_ranges[i]); | ||
1152 | } | 1089 | } |
1153 | 1090 | ||
1154 | platform_set_drvdata(pdev, upmx); | 1091 | platform_set_drvdata(pdev, upmx); |
@@ -1156,14 +1093,6 @@ static int __devinit u300_pmx_probe(struct platform_device *pdev) | |||
1156 | dev_info(&pdev->dev, "initialized U300 pin control driver\n"); | 1093 | dev_info(&pdev->dev, "initialized U300 pin control driver\n"); |
1157 | 1094 | ||
1158 | return 0; | 1095 | return 0; |
1159 | |||
1160 | out_no_pmx: | ||
1161 | iounmap(upmx->virtbase); | ||
1162 | out_no_remap: | ||
1163 | platform_set_drvdata(pdev, NULL); | ||
1164 | out_no_memregion: | ||
1165 | release_mem_region(upmx->phybase, upmx->physize); | ||
1166 | return ret; | ||
1167 | } | 1096 | } |
1168 | 1097 | ||
1169 | static int __devexit u300_pmx_remove(struct platform_device *pdev) | 1098 | static int __devexit u300_pmx_remove(struct platform_device *pdev) |
@@ -1171,8 +1100,6 @@ static int __devexit u300_pmx_remove(struct platform_device *pdev) | |||
1171 | struct u300_pmx *upmx = platform_get_drvdata(pdev); | 1100 | struct u300_pmx *upmx = platform_get_drvdata(pdev); |
1172 | 1101 | ||
1173 | pinctrl_unregister(upmx->pctl); | 1102 | pinctrl_unregister(upmx->pctl); |
1174 | iounmap(upmx->virtbase); | ||
1175 | release_mem_region(upmx->phybase, upmx->physize); | ||
1176 | platform_set_drvdata(pdev, NULL); | 1103 | platform_set_drvdata(pdev, NULL); |
1177 | 1104 | ||
1178 | return 0; | 1105 | return 0; |
diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c index b9bcaec66223..ad90984ec500 100644 --- a/drivers/pinctrl/pinctrl-xway.c +++ b/drivers/pinctrl/pinctrl-xway.c | |||
@@ -522,7 +522,7 @@ static int xway_pinconf_set(struct pinctrl_dev *pctldev, | |||
522 | return 0; | 522 | return 0; |
523 | } | 523 | } |
524 | 524 | ||
525 | struct pinconf_ops xway_pinconf_ops = { | 525 | static struct pinconf_ops xway_pinconf_ops = { |
526 | .pin_config_get = xway_pinconf_get, | 526 | .pin_config_get = xway_pinconf_get, |
527 | .pin_config_set = xway_pinconf_set, | 527 | .pin_config_set = xway_pinconf_set, |
528 | }; | 528 | }; |
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index 9301a7a95eff..1a00658b3ea0 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c | |||
@@ -314,14 +314,11 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, | |||
314 | { | 314 | { |
315 | struct pinctrl_dev *pctldev = setting->pctldev; | 315 | struct pinctrl_dev *pctldev = setting->pctldev; |
316 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; | 316 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; |
317 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | ||
318 | char const * const *groups; | 317 | char const * const *groups; |
319 | unsigned num_groups; | 318 | unsigned num_groups; |
320 | int ret; | 319 | int ret; |
321 | const char *group; | 320 | const char *group; |
322 | int i; | 321 | int i; |
323 | const unsigned *pins; | ||
324 | unsigned num_pins; | ||
325 | 322 | ||
326 | if (!pmxops) { | 323 | if (!pmxops) { |
327 | dev_err(pctldev->dev, "does not support mux function\n"); | 324 | dev_err(pctldev->dev, "does not support mux function\n"); |
@@ -376,53 +373,12 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, | |||
376 | } | 373 | } |
377 | setting->data.mux.group = ret; | 374 | setting->data.mux.group = ret; |
378 | 375 | ||
379 | ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, &pins, | ||
380 | &num_pins); | ||
381 | if (ret) { | ||
382 | dev_err(pctldev->dev, | ||
383 | "could not get pins for device %s group selector %d\n", | ||
384 | pinctrl_dev_get_name(pctldev), setting->data.mux.group); | ||
385 | return -ENODEV; | ||
386 | } | ||
387 | |||
388 | /* Try to allocate all pins in this group, one by one */ | ||
389 | for (i = 0; i < num_pins; i++) { | ||
390 | ret = pin_request(pctldev, pins[i], map->dev_name, NULL); | ||
391 | if (ret) { | ||
392 | dev_err(pctldev->dev, | ||
393 | "could not request pin %d on device %s\n", | ||
394 | pins[i], pinctrl_dev_get_name(pctldev)); | ||
395 | /* On error release all taken pins */ | ||
396 | i--; /* this pin just failed */ | ||
397 | for (; i >= 0; i--) | ||
398 | pin_free(pctldev, pins[i], NULL); | ||
399 | return -ENODEV; | ||
400 | } | ||
401 | } | ||
402 | |||
403 | return 0; | 376 | return 0; |
404 | } | 377 | } |
405 | 378 | ||
406 | void pinmux_free_setting(struct pinctrl_setting const *setting) | 379 | void pinmux_free_setting(struct pinctrl_setting const *setting) |
407 | { | 380 | { |
408 | struct pinctrl_dev *pctldev = setting->pctldev; | 381 | /* This function is currently unused */ |
409 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | ||
410 | const unsigned *pins; | ||
411 | unsigned num_pins; | ||
412 | int ret; | ||
413 | int i; | ||
414 | |||
415 | ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, | ||
416 | &pins, &num_pins); | ||
417 | if (ret) { | ||
418 | dev_err(pctldev->dev, | ||
419 | "could not get pins for device %s group selector %d\n", | ||
420 | pinctrl_dev_get_name(pctldev), setting->data.mux.group); | ||
421 | return; | ||
422 | } | ||
423 | |||
424 | for (i = 0; i < num_pins; i++) | ||
425 | pin_free(pctldev, pins[i], NULL); | ||
426 | } | 382 | } |
427 | 383 | ||
428 | int pinmux_enable_setting(struct pinctrl_setting const *setting) | 384 | int pinmux_enable_setting(struct pinctrl_setting const *setting) |
@@ -446,6 +402,18 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting) | |||
446 | num_pins = 0; | 402 | num_pins = 0; |
447 | } | 403 | } |
448 | 404 | ||
405 | /* Try to allocate all pins in this group, one by one */ | ||
406 | for (i = 0; i < num_pins; i++) { | ||
407 | ret = pin_request(pctldev, pins[i], setting->dev_name, NULL); | ||
408 | if (ret) { | ||
409 | dev_err(pctldev->dev, | ||
410 | "could not request pin %d on device %s\n", | ||
411 | pins[i], pinctrl_dev_get_name(pctldev)); | ||
412 | goto err_pin_request; | ||
413 | } | ||
414 | } | ||
415 | |||
416 | /* Now that we have acquired the pins, encode the mux setting */ | ||
449 | for (i = 0; i < num_pins; i++) { | 417 | for (i = 0; i < num_pins; i++) { |
450 | desc = pin_desc_get(pctldev, pins[i]); | 418 | desc = pin_desc_get(pctldev, pins[i]); |
451 | if (desc == NULL) { | 419 | if (desc == NULL) { |
@@ -457,8 +425,26 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting) | |||
457 | desc->mux_setting = &(setting->data.mux); | 425 | desc->mux_setting = &(setting->data.mux); |
458 | } | 426 | } |
459 | 427 | ||
460 | return ops->enable(pctldev, setting->data.mux.func, | 428 | ret = ops->enable(pctldev, setting->data.mux.func, |
461 | setting->data.mux.group); | 429 | setting->data.mux.group); |
430 | |||
431 | if (ret) | ||
432 | goto err_enable; | ||
433 | |||
434 | return 0; | ||
435 | |||
436 | err_enable: | ||
437 | for (i = 0; i < num_pins; i++) { | ||
438 | desc = pin_desc_get(pctldev, pins[i]); | ||
439 | if (desc) | ||
440 | desc->mux_setting = NULL; | ||
441 | } | ||
442 | err_pin_request: | ||
443 | /* On error release all taken pins */ | ||
444 | while (--i >= 0) | ||
445 | pin_free(pctldev, pins[i], NULL); | ||
446 | |||
447 | return ret; | ||
462 | } | 448 | } |
463 | 449 | ||
464 | void pinmux_disable_setting(struct pinctrl_setting const *setting) | 450 | void pinmux_disable_setting(struct pinctrl_setting const *setting) |
@@ -482,6 +468,7 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting) | |||
482 | num_pins = 0; | 468 | num_pins = 0; |
483 | } | 469 | } |
484 | 470 | ||
471 | /* Flag the descs that no setting is active */ | ||
485 | for (i = 0; i < num_pins; i++) { | 472 | for (i = 0; i < num_pins; i++) { |
486 | desc = pin_desc_get(pctldev, pins[i]); | 473 | desc = pin_desc_get(pctldev, pins[i]); |
487 | if (desc == NULL) { | 474 | if (desc == NULL) { |
@@ -493,6 +480,10 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting) | |||
493 | desc->mux_setting = NULL; | 480 | desc->mux_setting = NULL; |
494 | } | 481 | } |
495 | 482 | ||
483 | /* And release the pins */ | ||
484 | for (i = 0; i < num_pins; i++) | ||
485 | pin_free(pctldev, pins[i], NULL); | ||
486 | |||
496 | if (ops->disable) | 487 | if (ops->disable) |
497 | ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group); | 488 | ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group); |
498 | } | 489 | } |
diff --git a/drivers/pinctrl/spear/Kconfig b/drivers/pinctrl/spear/Kconfig index 91558791e766..04d93e602674 100644 --- a/drivers/pinctrl/spear/Kconfig +++ b/drivers/pinctrl/spear/Kconfig | |||
@@ -25,20 +25,31 @@ config PINCTRL_SPEAR310 | |||
25 | bool "ST Microelectronics SPEAr310 SoC pin controller driver" | 25 | bool "ST Microelectronics SPEAr310 SoC pin controller driver" |
26 | depends on MACH_SPEAR310 | 26 | depends on MACH_SPEAR310 |
27 | select PINCTRL_SPEAR3XX | 27 | select PINCTRL_SPEAR3XX |
28 | select PINCTRL_SPEAR_PLGPIO | ||
28 | 29 | ||
29 | config PINCTRL_SPEAR320 | 30 | config PINCTRL_SPEAR320 |
30 | bool "ST Microelectronics SPEAr320 SoC pin controller driver" | 31 | bool "ST Microelectronics SPEAr320 SoC pin controller driver" |
31 | depends on MACH_SPEAR320 | 32 | depends on MACH_SPEAR320 |
32 | select PINCTRL_SPEAR3XX | 33 | select PINCTRL_SPEAR3XX |
34 | select PINCTRL_SPEAR_PLGPIO | ||
33 | 35 | ||
34 | config PINCTRL_SPEAR1310 | 36 | config PINCTRL_SPEAR1310 |
35 | bool "ST Microelectronics SPEAr1310 SoC pin controller driver" | 37 | bool "ST Microelectronics SPEAr1310 SoC pin controller driver" |
36 | depends on MACH_SPEAR1310 | 38 | depends on MACH_SPEAR1310 |
37 | select PINCTRL_SPEAR | 39 | select PINCTRL_SPEAR |
40 | select PINCTRL_SPEAR_PLGPIO | ||
38 | 41 | ||
39 | config PINCTRL_SPEAR1340 | 42 | config PINCTRL_SPEAR1340 |
40 | bool "ST Microelectronics SPEAr1340 SoC pin controller driver" | 43 | bool "ST Microelectronics SPEAr1340 SoC pin controller driver" |
41 | depends on MACH_SPEAR1340 | 44 | depends on MACH_SPEAR1340 |
42 | select PINCTRL_SPEAR | 45 | select PINCTRL_SPEAR |
46 | select PINCTRL_SPEAR_PLGPIO | ||
47 | |||
48 | config PINCTRL_SPEAR_PLGPIO | ||
49 | bool "SPEAr SoC PLGPIO Controller" | ||
50 | depends on GPIOLIB && PINCTRL_SPEAR | ||
51 | help | ||
52 | Say yes here to support PLGPIO controller on ST Microelectronics SPEAr | ||
53 | SoCs. | ||
43 | 54 | ||
44 | endif | 55 | endif |
diff --git a/drivers/pinctrl/spear/Makefile b/drivers/pinctrl/spear/Makefile index b28a7ba22443..0e400ebeb8ff 100644 --- a/drivers/pinctrl/spear/Makefile +++ b/drivers/pinctrl/spear/Makefile | |||
@@ -1,5 +1,6 @@ | |||
1 | # SPEAr pinmux support | 1 | # SPEAr pinmux support |
2 | 2 | ||
3 | obj-$(CONFIG_PINCTRL_SPEAR_PLGPIO) += pinctrl-plgpio.o | ||
3 | obj-$(CONFIG_PINCTRL_SPEAR) += pinctrl-spear.o | 4 | obj-$(CONFIG_PINCTRL_SPEAR) += pinctrl-spear.o |
4 | obj-$(CONFIG_PINCTRL_SPEAR3XX) += pinctrl-spear3xx.o | 5 | obj-$(CONFIG_PINCTRL_SPEAR3XX) += pinctrl-spear3xx.o |
5 | obj-$(CONFIG_PINCTRL_SPEAR300) += pinctrl-spear300.o | 6 | obj-$(CONFIG_PINCTRL_SPEAR300) += pinctrl-spear300.o |
diff --git a/drivers/pinctrl/spear/pinctrl-plgpio.c b/drivers/pinctrl/spear/pinctrl-plgpio.c new file mode 100644 index 000000000000..4c045053bbdd --- /dev/null +++ b/drivers/pinctrl/spear/pinctrl-plgpio.c | |||
@@ -0,0 +1,758 @@ | |||
1 | /* | ||
2 | * SPEAr platform PLGPIO driver | ||
3 | * | ||
4 | * Copyright (C) 2012 ST Microelectronics | ||
5 | * Viresh Kumar <viresh.kumar@linaro.org> | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/clk.h> | ||
13 | #include <linux/err.h> | ||
14 | #include <linux/gpio.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <linux/irqdomain.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/pinctrl/consumer.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/pm.h> | ||
22 | #include <linux/spinlock.h> | ||
23 | #include <asm/mach/irq.h> | ||
24 | |||
25 | #define MAX_GPIO_PER_REG 32 | ||
26 | #define PIN_OFFSET(pin) (pin % MAX_GPIO_PER_REG) | ||
27 | #define REG_OFFSET(base, reg, pin) (base + reg + (pin / MAX_GPIO_PER_REG) \ | ||
28 | * sizeof(int *)) | ||
29 | |||
30 | /* | ||
31 | * plgpio pins in all machines are not one to one mapped, bitwise with registers | ||
32 | * bits. These set of macros define register masks for which below functions | ||
33 | * (pin_to_offset and offset_to_pin) are required to be called. | ||
34 | */ | ||
35 | #define PTO_ENB_REG 0x001 | ||
36 | #define PTO_WDATA_REG 0x002 | ||
37 | #define PTO_DIR_REG 0x004 | ||
38 | #define PTO_IE_REG 0x008 | ||
39 | #define PTO_RDATA_REG 0x010 | ||
40 | #define PTO_MIS_REG 0x020 | ||
41 | |||
42 | struct plgpio_regs { | ||
43 | u32 enb; /* enable register */ | ||
44 | u32 wdata; /* write data register */ | ||
45 | u32 dir; /* direction set register */ | ||
46 | u32 rdata; /* read data register */ | ||
47 | u32 ie; /* interrupt enable register */ | ||
48 | u32 mis; /* mask interrupt status register */ | ||
49 | u32 eit; /* edge interrupt type */ | ||
50 | }; | ||
51 | |||
52 | /* | ||
53 | * struct plgpio: plgpio driver specific structure | ||
54 | * | ||
55 | * lock: lock for guarding gpio registers | ||
56 | * base: base address of plgpio block | ||
57 | * irq_base: irq number of plgpio0 | ||
58 | * chip: gpio framework specific chip information structure | ||
59 | * p2o: function ptr for pin to offset conversion. This is required only for | ||
60 | * machines where mapping b/w pin and offset is not 1-to-1. | ||
61 | * o2p: function ptr for offset to pin conversion. This is required only for | ||
62 | * machines where mapping b/w pin and offset is not 1-to-1. | ||
63 | * p2o_regs: mask of registers for which p2o and o2p are applicable | ||
64 | * regs: register offsets | ||
65 | * csave_regs: context save registers for standby/sleep/hibernate cases | ||
66 | */ | ||
67 | struct plgpio { | ||
68 | spinlock_t lock; | ||
69 | void __iomem *base; | ||
70 | struct clk *clk; | ||
71 | unsigned irq_base; | ||
72 | struct irq_domain *irq_domain; | ||
73 | struct gpio_chip chip; | ||
74 | int (*p2o)(int pin); /* pin_to_offset */ | ||
75 | int (*o2p)(int offset); /* offset_to_pin */ | ||
76 | u32 p2o_regs; | ||
77 | struct plgpio_regs regs; | ||
78 | #ifdef CONFIG_PM | ||
79 | struct plgpio_regs *csave_regs; | ||
80 | #endif | ||
81 | }; | ||
82 | |||
83 | /* register manipulation inline functions */ | ||
84 | static inline u32 is_plgpio_set(void __iomem *base, u32 pin, u32 reg) | ||
85 | { | ||
86 | u32 offset = PIN_OFFSET(pin); | ||
87 | void __iomem *reg_off = REG_OFFSET(base, reg, pin); | ||
88 | u32 val = readl_relaxed(reg_off); | ||
89 | |||
90 | return !!(val & (1 << offset)); | ||
91 | } | ||
92 | |||
93 | static inline void plgpio_reg_set(void __iomem *base, u32 pin, u32 reg) | ||
94 | { | ||
95 | u32 offset = PIN_OFFSET(pin); | ||
96 | void __iomem *reg_off = REG_OFFSET(base, reg, pin); | ||
97 | u32 val = readl_relaxed(reg_off); | ||
98 | |||
99 | writel_relaxed(val | (1 << offset), reg_off); | ||
100 | } | ||
101 | |||
102 | static inline void plgpio_reg_reset(void __iomem *base, u32 pin, u32 reg) | ||
103 | { | ||
104 | u32 offset = PIN_OFFSET(pin); | ||
105 | void __iomem *reg_off = REG_OFFSET(base, reg, pin); | ||
106 | u32 val = readl_relaxed(reg_off); | ||
107 | |||
108 | writel_relaxed(val & ~(1 << offset), reg_off); | ||
109 | } | ||
110 | |||
111 | /* gpio framework specific routines */ | ||
112 | static int plgpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
113 | { | ||
114 | struct plgpio *plgpio = container_of(chip, struct plgpio, chip); | ||
115 | unsigned long flags; | ||
116 | |||
117 | /* get correct offset for "offset" pin */ | ||
118 | if (plgpio->p2o && (plgpio->p2o_regs & PTO_DIR_REG)) { | ||
119 | offset = plgpio->p2o(offset); | ||
120 | if (offset == -1) | ||
121 | return -EINVAL; | ||
122 | } | ||
123 | |||
124 | spin_lock_irqsave(&plgpio->lock, flags); | ||
125 | plgpio_reg_set(plgpio->base, offset, plgpio->regs.dir); | ||
126 | spin_unlock_irqrestore(&plgpio->lock, flags); | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static int plgpio_direction_output(struct gpio_chip *chip, unsigned offset, | ||
132 | int value) | ||
133 | { | ||
134 | struct plgpio *plgpio = container_of(chip, struct plgpio, chip); | ||
135 | unsigned long flags; | ||
136 | unsigned dir_offset = offset, wdata_offset = offset, tmp; | ||
137 | |||
138 | /* get correct offset for "offset" pin */ | ||
139 | if (plgpio->p2o && (plgpio->p2o_regs & (PTO_DIR_REG | PTO_WDATA_REG))) { | ||
140 | tmp = plgpio->p2o(offset); | ||
141 | if (tmp == -1) | ||
142 | return -EINVAL; | ||
143 | |||
144 | if (plgpio->p2o_regs & PTO_DIR_REG) | ||
145 | dir_offset = tmp; | ||
146 | if (plgpio->p2o_regs & PTO_WDATA_REG) | ||
147 | wdata_offset = tmp; | ||
148 | } | ||
149 | |||
150 | spin_lock_irqsave(&plgpio->lock, flags); | ||
151 | if (value) | ||
152 | plgpio_reg_set(plgpio->base, wdata_offset, | ||
153 | plgpio->regs.wdata); | ||
154 | else | ||
155 | plgpio_reg_reset(plgpio->base, wdata_offset, | ||
156 | plgpio->regs.wdata); | ||
157 | |||
158 | plgpio_reg_reset(plgpio->base, dir_offset, plgpio->regs.dir); | ||
159 | spin_unlock_irqrestore(&plgpio->lock, flags); | ||
160 | |||
161 | return 0; | ||
162 | } | ||
163 | |||
164 | static int plgpio_get_value(struct gpio_chip *chip, unsigned offset) | ||
165 | { | ||
166 | struct plgpio *plgpio = container_of(chip, struct plgpio, chip); | ||
167 | |||
168 | if (offset >= chip->ngpio) | ||
169 | return -EINVAL; | ||
170 | |||
171 | /* get correct offset for "offset" pin */ | ||
172 | if (plgpio->p2o && (plgpio->p2o_regs & PTO_RDATA_REG)) { | ||
173 | offset = plgpio->p2o(offset); | ||
174 | if (offset == -1) | ||
175 | return -EINVAL; | ||
176 | } | ||
177 | |||
178 | return is_plgpio_set(plgpio->base, offset, plgpio->regs.rdata); | ||
179 | } | ||
180 | |||
181 | static void plgpio_set_value(struct gpio_chip *chip, unsigned offset, int value) | ||
182 | { | ||
183 | struct plgpio *plgpio = container_of(chip, struct plgpio, chip); | ||
184 | |||
185 | if (offset >= chip->ngpio) | ||
186 | return; | ||
187 | |||
188 | /* get correct offset for "offset" pin */ | ||
189 | if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) { | ||
190 | offset = plgpio->p2o(offset); | ||
191 | if (offset == -1) | ||
192 | return; | ||
193 | } | ||
194 | |||
195 | if (value) | ||
196 | plgpio_reg_set(plgpio->base, offset, plgpio->regs.wdata); | ||
197 | else | ||
198 | plgpio_reg_reset(plgpio->base, offset, plgpio->regs.wdata); | ||
199 | } | ||
200 | |||
201 | static int plgpio_request(struct gpio_chip *chip, unsigned offset) | ||
202 | { | ||
203 | struct plgpio *plgpio = container_of(chip, struct plgpio, chip); | ||
204 | int gpio = chip->base + offset; | ||
205 | unsigned long flags; | ||
206 | int ret = 0; | ||
207 | |||
208 | if (offset >= chip->ngpio) | ||
209 | return -EINVAL; | ||
210 | |||
211 | ret = pinctrl_request_gpio(gpio); | ||
212 | if (ret) | ||
213 | return ret; | ||
214 | |||
215 | if (!IS_ERR(plgpio->clk)) { | ||
216 | ret = clk_enable(plgpio->clk); | ||
217 | if (ret) | ||
218 | goto err0; | ||
219 | } | ||
220 | |||
221 | if (plgpio->regs.enb == -1) | ||
222 | return 0; | ||
223 | |||
224 | /* | ||
225 | * put gpio in IN mode before enabling it. This make enabling gpio safe | ||
226 | */ | ||
227 | ret = plgpio_direction_input(chip, offset); | ||
228 | if (ret) | ||
229 | goto err1; | ||
230 | |||
231 | /* get correct offset for "offset" pin */ | ||
232 | if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) { | ||
233 | offset = plgpio->p2o(offset); | ||
234 | if (offset == -1) { | ||
235 | ret = -EINVAL; | ||
236 | goto err1; | ||
237 | } | ||
238 | } | ||
239 | |||
240 | spin_lock_irqsave(&plgpio->lock, flags); | ||
241 | plgpio_reg_set(plgpio->base, offset, plgpio->regs.enb); | ||
242 | spin_unlock_irqrestore(&plgpio->lock, flags); | ||
243 | return 0; | ||
244 | |||
245 | err1: | ||
246 | if (!IS_ERR(plgpio->clk)) | ||
247 | clk_disable(plgpio->clk); | ||
248 | err0: | ||
249 | pinctrl_free_gpio(gpio); | ||
250 | return ret; | ||
251 | } | ||
252 | |||
253 | static void plgpio_free(struct gpio_chip *chip, unsigned offset) | ||
254 | { | ||
255 | struct plgpio *plgpio = container_of(chip, struct plgpio, chip); | ||
256 | int gpio = chip->base + offset; | ||
257 | unsigned long flags; | ||
258 | |||
259 | if (offset >= chip->ngpio) | ||
260 | return; | ||
261 | |||
262 | if (plgpio->regs.enb == -1) | ||
263 | goto disable_clk; | ||
264 | |||
265 | /* get correct offset for "offset" pin */ | ||
266 | if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) { | ||
267 | offset = plgpio->p2o(offset); | ||
268 | if (offset == -1) | ||
269 | return; | ||
270 | } | ||
271 | |||
272 | spin_lock_irqsave(&plgpio->lock, flags); | ||
273 | plgpio_reg_reset(plgpio->base, offset, plgpio->regs.enb); | ||
274 | spin_unlock_irqrestore(&plgpio->lock, flags); | ||
275 | |||
276 | disable_clk: | ||
277 | if (!IS_ERR(plgpio->clk)) | ||
278 | clk_disable(plgpio->clk); | ||
279 | |||
280 | pinctrl_free_gpio(gpio); | ||
281 | } | ||
282 | |||
283 | static int plgpio_to_irq(struct gpio_chip *chip, unsigned offset) | ||
284 | { | ||
285 | struct plgpio *plgpio = container_of(chip, struct plgpio, chip); | ||
286 | |||
287 | if (IS_ERR_VALUE(plgpio->irq_base)) | ||
288 | return -EINVAL; | ||
289 | |||
290 | return irq_find_mapping(plgpio->irq_domain, offset); | ||
291 | } | ||
292 | |||
293 | /* PLGPIO IRQ */ | ||
294 | static void plgpio_irq_disable(struct irq_data *d) | ||
295 | { | ||
296 | struct plgpio *plgpio = irq_data_get_irq_chip_data(d); | ||
297 | int offset = d->irq - plgpio->irq_base; | ||
298 | unsigned long flags; | ||
299 | |||
300 | /* get correct offset for "offset" pin */ | ||
301 | if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) { | ||
302 | offset = plgpio->p2o(offset); | ||
303 | if (offset == -1) | ||
304 | return; | ||
305 | } | ||
306 | |||
307 | spin_lock_irqsave(&plgpio->lock, flags); | ||
308 | plgpio_reg_set(plgpio->base, offset, plgpio->regs.ie); | ||
309 | spin_unlock_irqrestore(&plgpio->lock, flags); | ||
310 | } | ||
311 | |||
312 | static void plgpio_irq_enable(struct irq_data *d) | ||
313 | { | ||
314 | struct plgpio *plgpio = irq_data_get_irq_chip_data(d); | ||
315 | int offset = d->irq - plgpio->irq_base; | ||
316 | unsigned long flags; | ||
317 | |||
318 | /* get correct offset for "offset" pin */ | ||
319 | if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) { | ||
320 | offset = plgpio->p2o(offset); | ||
321 | if (offset == -1) | ||
322 | return; | ||
323 | } | ||
324 | |||
325 | spin_lock_irqsave(&plgpio->lock, flags); | ||
326 | plgpio_reg_reset(plgpio->base, offset, plgpio->regs.ie); | ||
327 | spin_unlock_irqrestore(&plgpio->lock, flags); | ||
328 | } | ||
329 | |||
330 | static int plgpio_irq_set_type(struct irq_data *d, unsigned trigger) | ||
331 | { | ||
332 | struct plgpio *plgpio = irq_data_get_irq_chip_data(d); | ||
333 | int offset = d->irq - plgpio->irq_base; | ||
334 | void __iomem *reg_off; | ||
335 | unsigned int supported_type = 0, val; | ||
336 | |||
337 | if (offset >= plgpio->chip.ngpio) | ||
338 | return -EINVAL; | ||
339 | |||
340 | if (plgpio->regs.eit == -1) | ||
341 | supported_type = IRQ_TYPE_LEVEL_HIGH; | ||
342 | else | ||
343 | supported_type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING; | ||
344 | |||
345 | if (!(trigger & supported_type)) | ||
346 | return -EINVAL; | ||
347 | |||
348 | if (plgpio->regs.eit == -1) | ||
349 | return 0; | ||
350 | |||
351 | reg_off = REG_OFFSET(plgpio->base, plgpio->regs.eit, offset); | ||
352 | val = readl_relaxed(reg_off); | ||
353 | |||
354 | offset = PIN_OFFSET(offset); | ||
355 | if (trigger & IRQ_TYPE_EDGE_RISING) | ||
356 | writel_relaxed(val | (1 << offset), reg_off); | ||
357 | else | ||
358 | writel_relaxed(val & ~(1 << offset), reg_off); | ||
359 | |||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | static struct irq_chip plgpio_irqchip = { | ||
364 | .name = "PLGPIO", | ||
365 | .irq_enable = plgpio_irq_enable, | ||
366 | .irq_disable = plgpio_irq_disable, | ||
367 | .irq_set_type = plgpio_irq_set_type, | ||
368 | }; | ||
369 | |||
370 | static void plgpio_irq_handler(unsigned irq, struct irq_desc *desc) | ||
371 | { | ||
372 | struct plgpio *plgpio = irq_get_handler_data(irq); | ||
373 | struct irq_chip *irqchip = irq_desc_get_chip(desc); | ||
374 | int regs_count, count, pin, offset, i = 0; | ||
375 | unsigned long pending; | ||
376 | |||
377 | count = plgpio->chip.ngpio; | ||
378 | regs_count = DIV_ROUND_UP(count, MAX_GPIO_PER_REG); | ||
379 | |||
380 | chained_irq_enter(irqchip, desc); | ||
381 | /* check all plgpio MIS registers for a possible interrupt */ | ||
382 | for (; i < regs_count; i++) { | ||
383 | pending = readl_relaxed(plgpio->base + plgpio->regs.mis + | ||
384 | i * sizeof(int *)); | ||
385 | if (!pending) | ||
386 | continue; | ||
387 | |||
388 | /* clear interrupts */ | ||
389 | writel_relaxed(~pending, plgpio->base + plgpio->regs.mis + | ||
390 | i * sizeof(int *)); | ||
391 | /* | ||
392 | * clear extra bits in last register having gpios < MAX/REG | ||
393 | * ex: Suppose there are max 102 plgpios. then last register | ||
394 | * must have only (102 - MAX_GPIO_PER_REG * 3) = 6 relevant bits | ||
395 | * so, we must not take other 28 bits into consideration for | ||
396 | * checking interrupt. so clear those bits. | ||
397 | */ | ||
398 | count = count - i * MAX_GPIO_PER_REG; | ||
399 | if (count < MAX_GPIO_PER_REG) | ||
400 | pending &= (1 << count) - 1; | ||
401 | |||
402 | for_each_set_bit(offset, &pending, MAX_GPIO_PER_REG) { | ||
403 | /* get correct pin for "offset" */ | ||
404 | if (plgpio->o2p && (plgpio->p2o_regs & PTO_MIS_REG)) { | ||
405 | pin = plgpio->o2p(offset); | ||
406 | if (pin == -1) | ||
407 | continue; | ||
408 | } else | ||
409 | pin = offset; | ||
410 | |||
411 | /* get correct irq line number */ | ||
412 | pin = i * MAX_GPIO_PER_REG + pin; | ||
413 | generic_handle_irq(plgpio_to_irq(&plgpio->chip, pin)); | ||
414 | } | ||
415 | } | ||
416 | chained_irq_exit(irqchip, desc); | ||
417 | } | ||
418 | |||
419 | /* | ||
420 | * pin to offset and offset to pin converter functions | ||
421 | * | ||
422 | * In spear310 there is inconsistency among bit positions in plgpio regiseters, | ||
423 | * for different plgpio pins. For example: for pin 27, bit offset is 23, pin | ||
424 | * 28-33 are not supported, pin 95 has offset bit 95, bit 100 has offset bit 1 | ||
425 | */ | ||
426 | static int spear310_p2o(int pin) | ||
427 | { | ||
428 | int offset = pin; | ||
429 | |||
430 | if (pin <= 27) | ||
431 | offset += 4; | ||
432 | else if (pin <= 33) | ||
433 | offset = -1; | ||
434 | else if (pin <= 97) | ||
435 | offset -= 2; | ||
436 | else if (pin <= 101) | ||
437 | offset = 101 - pin; | ||
438 | else | ||
439 | offset = -1; | ||
440 | |||
441 | return offset; | ||
442 | } | ||
443 | |||
444 | int spear310_o2p(int offset) | ||
445 | { | ||
446 | if (offset <= 3) | ||
447 | return 101 - offset; | ||
448 | else if (offset <= 31) | ||
449 | return offset - 4; | ||
450 | else | ||
451 | return offset + 2; | ||
452 | } | ||
453 | |||
454 | static int __devinit plgpio_probe_dt(struct platform_device *pdev, | ||
455 | struct plgpio *plgpio) | ||
456 | { | ||
457 | struct device_node *np = pdev->dev.of_node; | ||
458 | int ret = -EINVAL; | ||
459 | u32 val; | ||
460 | |||
461 | if (of_machine_is_compatible("st,spear310")) { | ||
462 | plgpio->p2o = spear310_p2o; | ||
463 | plgpio->o2p = spear310_o2p; | ||
464 | plgpio->p2o_regs = PTO_WDATA_REG | PTO_DIR_REG | PTO_IE_REG | | ||
465 | PTO_RDATA_REG | PTO_MIS_REG; | ||
466 | } | ||
467 | |||
468 | if (!of_property_read_u32(np, "st-plgpio,ngpio", &val)) { | ||
469 | plgpio->chip.ngpio = val; | ||
470 | } else { | ||
471 | dev_err(&pdev->dev, "DT: Invalid ngpio field\n"); | ||
472 | goto end; | ||
473 | } | ||
474 | |||
475 | if (!of_property_read_u32(np, "st-plgpio,enb-reg", &val)) | ||
476 | plgpio->regs.enb = val; | ||
477 | else | ||
478 | plgpio->regs.enb = -1; | ||
479 | |||
480 | if (!of_property_read_u32(np, "st-plgpio,wdata-reg", &val)) { | ||
481 | plgpio->regs.wdata = val; | ||
482 | } else { | ||
483 | dev_err(&pdev->dev, "DT: Invalid wdata reg\n"); | ||
484 | goto end; | ||
485 | } | ||
486 | |||
487 | if (!of_property_read_u32(np, "st-plgpio,dir-reg", &val)) { | ||
488 | plgpio->regs.dir = val; | ||
489 | } else { | ||
490 | dev_err(&pdev->dev, "DT: Invalid dir reg\n"); | ||
491 | goto end; | ||
492 | } | ||
493 | |||
494 | if (!of_property_read_u32(np, "st-plgpio,ie-reg", &val)) { | ||
495 | plgpio->regs.ie = val; | ||
496 | } else { | ||
497 | dev_err(&pdev->dev, "DT: Invalid ie reg\n"); | ||
498 | goto end; | ||
499 | } | ||
500 | |||
501 | if (!of_property_read_u32(np, "st-plgpio,rdata-reg", &val)) { | ||
502 | plgpio->regs.rdata = val; | ||
503 | } else { | ||
504 | dev_err(&pdev->dev, "DT: Invalid rdata reg\n"); | ||
505 | goto end; | ||
506 | } | ||
507 | |||
508 | if (!of_property_read_u32(np, "st-plgpio,mis-reg", &val)) { | ||
509 | plgpio->regs.mis = val; | ||
510 | } else { | ||
511 | dev_err(&pdev->dev, "DT: Invalid mis reg\n"); | ||
512 | goto end; | ||
513 | } | ||
514 | |||
515 | if (!of_property_read_u32(np, "st-plgpio,eit-reg", &val)) | ||
516 | plgpio->regs.eit = val; | ||
517 | else | ||
518 | plgpio->regs.eit = -1; | ||
519 | |||
520 | return 0; | ||
521 | |||
522 | end: | ||
523 | return ret; | ||
524 | } | ||
525 | static int __devinit plgpio_probe(struct platform_device *pdev) | ||
526 | { | ||
527 | struct device_node *np = pdev->dev.of_node; | ||
528 | struct plgpio *plgpio; | ||
529 | struct resource *res; | ||
530 | int ret, irq, i; | ||
531 | |||
532 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
533 | if (!res) { | ||
534 | dev_err(&pdev->dev, "invalid IORESOURCE_MEM\n"); | ||
535 | return -EBUSY; | ||
536 | } | ||
537 | |||
538 | plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL); | ||
539 | if (!plgpio) { | ||
540 | dev_err(&pdev->dev, "memory allocation fail\n"); | ||
541 | return -ENOMEM; | ||
542 | } | ||
543 | |||
544 | plgpio->base = devm_request_and_ioremap(&pdev->dev, res); | ||
545 | if (!plgpio->base) { | ||
546 | dev_err(&pdev->dev, "request and ioremap fail\n"); | ||
547 | return -ENOMEM; | ||
548 | } | ||
549 | |||
550 | ret = plgpio_probe_dt(pdev, plgpio); | ||
551 | if (ret) { | ||
552 | dev_err(&pdev->dev, "DT probe failed\n"); | ||
553 | return ret; | ||
554 | } | ||
555 | |||
556 | plgpio->clk = devm_clk_get(&pdev->dev, NULL); | ||
557 | if (IS_ERR(plgpio->clk)) | ||
558 | dev_warn(&pdev->dev, "clk_get() failed, work without it\n"); | ||
559 | |||
560 | #ifdef CONFIG_PM | ||
561 | plgpio->csave_regs = devm_kzalloc(&pdev->dev, | ||
562 | sizeof(*plgpio->csave_regs) * | ||
563 | DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG), | ||
564 | GFP_KERNEL); | ||
565 | if (!plgpio->csave_regs) { | ||
566 | dev_err(&pdev->dev, "csave registers memory allocation fail\n"); | ||
567 | return -ENOMEM; | ||
568 | } | ||
569 | #endif | ||
570 | |||
571 | platform_set_drvdata(pdev, plgpio); | ||
572 | spin_lock_init(&plgpio->lock); | ||
573 | |||
574 | plgpio->irq_base = -1; | ||
575 | plgpio->chip.base = -1; | ||
576 | plgpio->chip.request = plgpio_request; | ||
577 | plgpio->chip.free = plgpio_free; | ||
578 | plgpio->chip.direction_input = plgpio_direction_input; | ||
579 | plgpio->chip.direction_output = plgpio_direction_output; | ||
580 | plgpio->chip.get = plgpio_get_value; | ||
581 | plgpio->chip.set = plgpio_set_value; | ||
582 | plgpio->chip.to_irq = plgpio_to_irq; | ||
583 | plgpio->chip.label = dev_name(&pdev->dev); | ||
584 | plgpio->chip.dev = &pdev->dev; | ||
585 | plgpio->chip.owner = THIS_MODULE; | ||
586 | |||
587 | if (!IS_ERR(plgpio->clk)) { | ||
588 | ret = clk_prepare(plgpio->clk); | ||
589 | if (ret) { | ||
590 | dev_err(&pdev->dev, "clk prepare failed\n"); | ||
591 | return ret; | ||
592 | } | ||
593 | } | ||
594 | |||
595 | ret = gpiochip_add(&plgpio->chip); | ||
596 | if (ret) { | ||
597 | dev_err(&pdev->dev, "unable to add gpio chip\n"); | ||
598 | goto unprepare_clk; | ||
599 | } | ||
600 | |||
601 | irq = platform_get_irq(pdev, 0); | ||
602 | if (irq < 0) { | ||
603 | dev_info(&pdev->dev, "irqs not supported\n"); | ||
604 | return 0; | ||
605 | } | ||
606 | |||
607 | plgpio->irq_base = irq_alloc_descs(-1, 0, plgpio->chip.ngpio, 0); | ||
608 | if (IS_ERR_VALUE(plgpio->irq_base)) { | ||
609 | /* we would not support irq for gpio */ | ||
610 | dev_warn(&pdev->dev, "couldn't allocate irq base\n"); | ||
611 | return 0; | ||
612 | } | ||
613 | |||
614 | plgpio->irq_domain = irq_domain_add_legacy(np, plgpio->chip.ngpio, | ||
615 | plgpio->irq_base, 0, &irq_domain_simple_ops, NULL); | ||
616 | if (WARN_ON(!plgpio->irq_domain)) { | ||
617 | dev_err(&pdev->dev, "irq domain init failed\n"); | ||
618 | irq_free_descs(plgpio->irq_base, plgpio->chip.ngpio); | ||
619 | ret = -ENXIO; | ||
620 | goto remove_gpiochip; | ||
621 | } | ||
622 | |||
623 | irq_set_chained_handler(irq, plgpio_irq_handler); | ||
624 | for (i = 0; i < plgpio->chip.ngpio; i++) { | ||
625 | irq_set_chip_and_handler(i + plgpio->irq_base, &plgpio_irqchip, | ||
626 | handle_simple_irq); | ||
627 | set_irq_flags(i + plgpio->irq_base, IRQF_VALID); | ||
628 | irq_set_chip_data(i + plgpio->irq_base, plgpio); | ||
629 | } | ||
630 | |||
631 | irq_set_handler_data(irq, plgpio); | ||
632 | dev_info(&pdev->dev, "PLGPIO registered with IRQs\n"); | ||
633 | |||
634 | return 0; | ||
635 | |||
636 | remove_gpiochip: | ||
637 | dev_info(&pdev->dev, "Remove gpiochip\n"); | ||
638 | if (gpiochip_remove(&plgpio->chip)) | ||
639 | dev_err(&pdev->dev, "unable to remove gpiochip\n"); | ||
640 | unprepare_clk: | ||
641 | if (!IS_ERR(plgpio->clk)) | ||
642 | clk_unprepare(plgpio->clk); | ||
643 | |||
644 | return ret; | ||
645 | } | ||
646 | |||
647 | #ifdef CONFIG_PM | ||
648 | static int plgpio_suspend(struct device *dev) | ||
649 | { | ||
650 | struct plgpio *plgpio = dev_get_drvdata(dev); | ||
651 | int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG); | ||
652 | void __iomem *off; | ||
653 | |||
654 | for (i = 0; i < reg_count; i++) { | ||
655 | off = plgpio->base + i * sizeof(int *); | ||
656 | |||
657 | if (plgpio->regs.enb != -1) | ||
658 | plgpio->csave_regs[i].enb = | ||
659 | readl_relaxed(plgpio->regs.enb + off); | ||
660 | if (plgpio->regs.eit != -1) | ||
661 | plgpio->csave_regs[i].eit = | ||
662 | readl_relaxed(plgpio->regs.eit + off); | ||
663 | plgpio->csave_regs[i].wdata = readl_relaxed(plgpio->regs.wdata + | ||
664 | off); | ||
665 | plgpio->csave_regs[i].dir = readl_relaxed(plgpio->regs.dir + | ||
666 | off); | ||
667 | plgpio->csave_regs[i].ie = readl_relaxed(plgpio->regs.ie + off); | ||
668 | } | ||
669 | |||
670 | return 0; | ||
671 | } | ||
672 | |||
673 | /* | ||
674 | * This is used to correct the values in end registers. End registers contain | ||
675 | * extra bits that might be used for other purpose in platform. So, we shouldn't | ||
676 | * overwrite these bits. This macro, reads given register again, preserves other | ||
677 | * bit values (non-plgpio bits), and retain captured value (plgpio bits). | ||
678 | */ | ||
679 | #define plgpio_prepare_reg(__reg, _off, _mask, _tmp) \ | ||
680 | { \ | ||
681 | _tmp = readl_relaxed(plgpio->regs.__reg + _off); \ | ||
682 | _tmp &= ~_mask; \ | ||
683 | plgpio->csave_regs[i].__reg = \ | ||
684 | _tmp | (plgpio->csave_regs[i].__reg & _mask); \ | ||
685 | } | ||
686 | |||
687 | static int plgpio_resume(struct device *dev) | ||
688 | { | ||
689 | struct plgpio *plgpio = dev_get_drvdata(dev); | ||
690 | int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG); | ||
691 | void __iomem *off; | ||
692 | u32 mask, tmp; | ||
693 | |||
694 | for (i = 0; i < reg_count; i++) { | ||
695 | off = plgpio->base + i * sizeof(int *); | ||
696 | |||
697 | if (i == reg_count - 1) { | ||
698 | mask = (1 << (plgpio->chip.ngpio - i * | ||
699 | MAX_GPIO_PER_REG)) - 1; | ||
700 | |||
701 | if (plgpio->regs.enb != -1) | ||
702 | plgpio_prepare_reg(enb, off, mask, tmp); | ||
703 | |||
704 | if (plgpio->regs.eit != -1) | ||
705 | plgpio_prepare_reg(eit, off, mask, tmp); | ||
706 | |||
707 | plgpio_prepare_reg(wdata, off, mask, tmp); | ||
708 | plgpio_prepare_reg(dir, off, mask, tmp); | ||
709 | plgpio_prepare_reg(ie, off, mask, tmp); | ||
710 | } | ||
711 | |||
712 | writel_relaxed(plgpio->csave_regs[i].wdata, plgpio->regs.wdata + | ||
713 | off); | ||
714 | writel_relaxed(plgpio->csave_regs[i].dir, plgpio->regs.dir + | ||
715 | off); | ||
716 | |||
717 | if (plgpio->regs.eit != -1) | ||
718 | writel_relaxed(plgpio->csave_regs[i].eit, | ||
719 | plgpio->regs.eit + off); | ||
720 | |||
721 | writel_relaxed(plgpio->csave_regs[i].ie, plgpio->regs.ie + off); | ||
722 | |||
723 | if (plgpio->regs.enb != -1) | ||
724 | writel_relaxed(plgpio->csave_regs[i].enb, | ||
725 | plgpio->regs.enb + off); | ||
726 | } | ||
727 | |||
728 | return 0; | ||
729 | } | ||
730 | #endif | ||
731 | |||
732 | static SIMPLE_DEV_PM_OPS(plgpio_dev_pm_ops, plgpio_suspend, plgpio_resume); | ||
733 | |||
734 | static const struct of_device_id plgpio_of_match[] = { | ||
735 | { .compatible = "st,spear-plgpio" }, | ||
736 | {} | ||
737 | }; | ||
738 | MODULE_DEVICE_TABLE(of, plgpio_of_match); | ||
739 | |||
740 | static struct platform_driver plgpio_driver = { | ||
741 | .probe = plgpio_probe, | ||
742 | .driver = { | ||
743 | .owner = THIS_MODULE, | ||
744 | .name = "spear-plgpio", | ||
745 | .pm = &plgpio_dev_pm_ops, | ||
746 | .of_match_table = of_match_ptr(plgpio_of_match), | ||
747 | }, | ||
748 | }; | ||
749 | |||
750 | static int __init plgpio_init(void) | ||
751 | { | ||
752 | return platform_driver_register(&plgpio_driver); | ||
753 | } | ||
754 | subsys_initcall(plgpio_init); | ||
755 | |||
756 | MODULE_AUTHOR("Viresh Kumar <viresh.kumar@linaro.org>"); | ||
757 | MODULE_DESCRIPTION("ST Microlectronics SPEAr PLGPIO driver"); | ||
758 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/pinctrl/spear/pinctrl-spear.c b/drivers/pinctrl/spear/pinctrl-spear.c index b1fd6ee33c6c..bf78eb7f85c4 100644 --- a/drivers/pinctrl/spear/pinctrl-spear.c +++ b/drivers/pinctrl/spear/pinctrl-spear.c | |||
@@ -14,10 +14,10 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/io.h> | ||
18 | #include <linux/module.h> | 17 | #include <linux/module.h> |
19 | #include <linux/of.h> | 18 | #include <linux/of.h> |
20 | #include <linux/of_address.h> | 19 | #include <linux/of_address.h> |
20 | #include <linux/of_gpio.h> | ||
21 | #include <linux/pinctrl/machine.h> | 21 | #include <linux/pinctrl/machine.h> |
22 | #include <linux/pinctrl/pinctrl.h> | 22 | #include <linux/pinctrl/pinctrl.h> |
23 | #include <linux/pinctrl/pinmux.h> | 23 | #include <linux/pinctrl/pinmux.h> |
@@ -28,14 +28,26 @@ | |||
28 | 28 | ||
29 | #define DRIVER_NAME "spear-pinmux" | 29 | #define DRIVER_NAME "spear-pinmux" |
30 | 30 | ||
31 | static inline u32 pmx_readl(struct spear_pmx *pmx, u32 reg) | 31 | static void muxregs_endisable(struct spear_pmx *pmx, |
32 | struct spear_muxreg *muxregs, u8 count, bool enable) | ||
32 | { | 33 | { |
33 | return readl_relaxed(pmx->vbase + reg); | 34 | struct spear_muxreg *muxreg; |
34 | } | 35 | u32 val, temp, j; |
35 | 36 | ||
36 | static inline void pmx_writel(struct spear_pmx *pmx, u32 val, u32 reg) | 37 | for (j = 0; j < count; j++) { |
37 | { | 38 | muxreg = &muxregs[j]; |
38 | writel_relaxed(val, pmx->vbase + reg); | 39 | |
40 | val = pmx_readl(pmx, muxreg->reg); | ||
41 | val &= ~muxreg->mask; | ||
42 | |||
43 | if (enable) | ||
44 | temp = muxreg->val; | ||
45 | else | ||
46 | temp = ~muxreg->val; | ||
47 | |||
48 | val |= muxreg->mask & temp; | ||
49 | pmx_writel(pmx, val, muxreg->reg); | ||
50 | } | ||
39 | } | 51 | } |
40 | 52 | ||
41 | static int set_mode(struct spear_pmx *pmx, int mode) | 53 | static int set_mode(struct spear_pmx *pmx, int mode) |
@@ -70,6 +82,17 @@ static int set_mode(struct spear_pmx *pmx, int mode) | |||
70 | return 0; | 82 | return 0; |
71 | } | 83 | } |
72 | 84 | ||
85 | void __devinit | ||
86 | pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup *gpio_pingroup, | ||
87 | unsigned count, u16 reg) | ||
88 | { | ||
89 | int i, j; | ||
90 | |||
91 | for (i = 0; i < count; i++) | ||
92 | for (j = 0; j < gpio_pingroup[i].nmuxregs; j++) | ||
93 | gpio_pingroup[i].muxregs[j].reg = reg; | ||
94 | } | ||
95 | |||
73 | void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg) | 96 | void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg) |
74 | { | 97 | { |
75 | struct spear_pingroup *pgroup; | 98 | struct spear_pingroup *pgroup; |
@@ -121,9 +144,10 @@ static void spear_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, | |||
121 | seq_printf(s, " " DRIVER_NAME); | 144 | seq_printf(s, " " DRIVER_NAME); |
122 | } | 145 | } |
123 | 146 | ||
124 | int spear_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, | 147 | static int spear_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, |
125 | struct device_node *np_config, | 148 | struct device_node *np_config, |
126 | struct pinctrl_map **map, unsigned *num_maps) | 149 | struct pinctrl_map **map, |
150 | unsigned *num_maps) | ||
127 | { | 151 | { |
128 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 152 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
129 | struct device_node *np; | 153 | struct device_node *np; |
@@ -168,8 +192,9 @@ int spear_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, | |||
168 | return 0; | 192 | return 0; |
169 | } | 193 | } |
170 | 194 | ||
171 | void spear_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, | 195 | static void spear_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, |
172 | struct pinctrl_map *map, unsigned num_maps) | 196 | struct pinctrl_map *map, |
197 | unsigned num_maps) | ||
173 | { | 198 | { |
174 | kfree(map); | 199 | kfree(map); |
175 | } | 200 | } |
@@ -216,9 +241,7 @@ static int spear_pinctrl_endisable(struct pinctrl_dev *pctldev, | |||
216 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 241 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
217 | const struct spear_pingroup *pgroup; | 242 | const struct spear_pingroup *pgroup; |
218 | const struct spear_modemux *modemux; | 243 | const struct spear_modemux *modemux; |
219 | struct spear_muxreg *muxreg; | 244 | int i; |
220 | u32 val, temp; | ||
221 | int i, j; | ||
222 | bool found = false; | 245 | bool found = false; |
223 | 246 | ||
224 | pgroup = pmx->machdata->groups[group]; | 247 | pgroup = pmx->machdata->groups[group]; |
@@ -233,20 +256,8 @@ static int spear_pinctrl_endisable(struct pinctrl_dev *pctldev, | |||
233 | } | 256 | } |
234 | 257 | ||
235 | found = true; | 258 | found = true; |
236 | for (j = 0; j < modemux->nmuxregs; j++) { | 259 | muxregs_endisable(pmx, modemux->muxregs, modemux->nmuxregs, |
237 | muxreg = &modemux->muxregs[j]; | 260 | enable); |
238 | |||
239 | val = pmx_readl(pmx, muxreg->reg); | ||
240 | val &= ~muxreg->mask; | ||
241 | |||
242 | if (enable) | ||
243 | temp = muxreg->val; | ||
244 | else | ||
245 | temp = ~muxreg->val; | ||
246 | |||
247 | val |= muxreg->mask & temp; | ||
248 | pmx_writel(pmx, val, muxreg->reg); | ||
249 | } | ||
250 | } | 261 | } |
251 | 262 | ||
252 | if (!found) { | 263 | if (!found) { |
@@ -270,12 +281,74 @@ static void spear_pinctrl_disable(struct pinctrl_dev *pctldev, | |||
270 | spear_pinctrl_endisable(pctldev, function, group, false); | 281 | spear_pinctrl_endisable(pctldev, function, group, false); |
271 | } | 282 | } |
272 | 283 | ||
284 | /* gpio with pinmux */ | ||
285 | static struct spear_gpio_pingroup *get_gpio_pingroup(struct spear_pmx *pmx, | ||
286 | unsigned pin) | ||
287 | { | ||
288 | struct spear_gpio_pingroup *gpio_pingroup; | ||
289 | int i, j; | ||
290 | |||
291 | if (!pmx->machdata->gpio_pingroups) | ||
292 | return NULL; | ||
293 | |||
294 | for (i = 0; i < pmx->machdata->ngpio_pingroups; i++) { | ||
295 | gpio_pingroup = &pmx->machdata->gpio_pingroups[i]; | ||
296 | |||
297 | for (j = 0; j < gpio_pingroup->npins; j++) { | ||
298 | if (gpio_pingroup->pins[j] == pin) | ||
299 | return gpio_pingroup; | ||
300 | } | ||
301 | } | ||
302 | |||
303 | return NULL; | ||
304 | } | ||
305 | |||
306 | static int gpio_request_endisable(struct pinctrl_dev *pctldev, | ||
307 | struct pinctrl_gpio_range *range, unsigned offset, bool enable) | ||
308 | { | ||
309 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
310 | struct spear_pinctrl_machdata *machdata = pmx->machdata; | ||
311 | struct spear_gpio_pingroup *gpio_pingroup; | ||
312 | |||
313 | /* | ||
314 | * Some SoC have configuration options applicable to group of pins, | ||
315 | * rather than a single pin. | ||
316 | */ | ||
317 | gpio_pingroup = get_gpio_pingroup(pmx, offset); | ||
318 | if (gpio_pingroup) | ||
319 | muxregs_endisable(pmx, gpio_pingroup->muxregs, | ||
320 | gpio_pingroup->nmuxregs, enable); | ||
321 | |||
322 | /* | ||
323 | * SoC may need some extra configurations, or configurations for single | ||
324 | * pin | ||
325 | */ | ||
326 | if (machdata->gpio_request_endisable) | ||
327 | machdata->gpio_request_endisable(pmx, offset, enable); | ||
328 | |||
329 | return 0; | ||
330 | } | ||
331 | |||
332 | static int gpio_request_enable(struct pinctrl_dev *pctldev, | ||
333 | struct pinctrl_gpio_range *range, unsigned offset) | ||
334 | { | ||
335 | return gpio_request_endisable(pctldev, range, offset, true); | ||
336 | } | ||
337 | |||
338 | static void gpio_disable_free(struct pinctrl_dev *pctldev, | ||
339 | struct pinctrl_gpio_range *range, unsigned offset) | ||
340 | { | ||
341 | gpio_request_endisable(pctldev, range, offset, false); | ||
342 | } | ||
343 | |||
273 | static struct pinmux_ops spear_pinmux_ops = { | 344 | static struct pinmux_ops spear_pinmux_ops = { |
274 | .get_functions_count = spear_pinctrl_get_funcs_count, | 345 | .get_functions_count = spear_pinctrl_get_funcs_count, |
275 | .get_function_name = spear_pinctrl_get_func_name, | 346 | .get_function_name = spear_pinctrl_get_func_name, |
276 | .get_function_groups = spear_pinctrl_get_func_groups, | 347 | .get_function_groups = spear_pinctrl_get_func_groups, |
277 | .enable = spear_pinctrl_enable, | 348 | .enable = spear_pinctrl_enable, |
278 | .disable = spear_pinctrl_disable, | 349 | .disable = spear_pinctrl_disable, |
350 | .gpio_request_enable = gpio_request_enable, | ||
351 | .gpio_disable_free = gpio_disable_free, | ||
279 | }; | 352 | }; |
280 | 353 | ||
281 | static struct pinctrl_desc spear_pinctrl_desc = { | 354 | static struct pinctrl_desc spear_pinctrl_desc = { |
diff --git a/drivers/pinctrl/spear/pinctrl-spear.h b/drivers/pinctrl/spear/pinctrl-spear.h index d950eb78d939..b06332719b2c 100644 --- a/drivers/pinctrl/spear/pinctrl-spear.h +++ b/drivers/pinctrl/spear/pinctrl-spear.h | |||
@@ -12,11 +12,14 @@ | |||
12 | #ifndef __PINMUX_SPEAR_H__ | 12 | #ifndef __PINMUX_SPEAR_H__ |
13 | #define __PINMUX_SPEAR_H__ | 13 | #define __PINMUX_SPEAR_H__ |
14 | 14 | ||
15 | #include <linux/gpio.h> | ||
16 | #include <linux/io.h> | ||
15 | #include <linux/pinctrl/pinctrl.h> | 17 | #include <linux/pinctrl/pinctrl.h> |
16 | #include <linux/types.h> | 18 | #include <linux/types.h> |
17 | 19 | ||
18 | struct platform_device; | 20 | struct platform_device; |
19 | struct device; | 21 | struct device; |
22 | struct spear_pmx; | ||
20 | 23 | ||
21 | /** | 24 | /** |
22 | * struct spear_pmx_mode - SPEAr pmx mode | 25 | * struct spear_pmx_mode - SPEAr pmx mode |
@@ -46,6 +49,44 @@ struct spear_muxreg { | |||
46 | u32 val; | 49 | u32 val; |
47 | }; | 50 | }; |
48 | 51 | ||
52 | struct spear_gpio_pingroup { | ||
53 | const unsigned *pins; | ||
54 | unsigned npins; | ||
55 | struct spear_muxreg *muxregs; | ||
56 | u8 nmuxregs; | ||
57 | }; | ||
58 | |||
59 | /* ste: set to enable */ | ||
60 | #define DEFINE_MUXREG(__pins, __muxreg, __mask, __ste) \ | ||
61 | static struct spear_muxreg __pins##_muxregs[] = { \ | ||
62 | { \ | ||
63 | .reg = __muxreg, \ | ||
64 | .mask = __mask, \ | ||
65 | .val = __ste ? __mask : 0, \ | ||
66 | }, \ | ||
67 | } | ||
68 | |||
69 | #define DEFINE_2_MUXREG(__pins, __muxreg1, __muxreg2, __mask, __ste1, __ste2) \ | ||
70 | static struct spear_muxreg __pins##_muxregs[] = { \ | ||
71 | { \ | ||
72 | .reg = __muxreg1, \ | ||
73 | .mask = __mask, \ | ||
74 | .val = __ste1 ? __mask : 0, \ | ||
75 | }, { \ | ||
76 | .reg = __muxreg2, \ | ||
77 | .mask = __mask, \ | ||
78 | .val = __ste2 ? __mask : 0, \ | ||
79 | }, \ | ||
80 | } | ||
81 | |||
82 | #define GPIO_PINGROUP(__pins) \ | ||
83 | { \ | ||
84 | .pins = __pins, \ | ||
85 | .npins = ARRAY_SIZE(__pins), \ | ||
86 | .muxregs = __pins##_muxregs, \ | ||
87 | .nmuxregs = ARRAY_SIZE(__pins##_muxregs), \ | ||
88 | } | ||
89 | |||
49 | /** | 90 | /** |
50 | * struct spear_modemux - SPEAr mode mux configuration | 91 | * struct spear_modemux - SPEAr mode mux configuration |
51 | * @modes: mode ids supported by this group of muxregs | 92 | * @modes: mode ids supported by this group of muxregs |
@@ -100,6 +141,8 @@ struct spear_function { | |||
100 | * @nfunctions: The numbmer of entries in @functions. | 141 | * @nfunctions: The numbmer of entries in @functions. |
101 | * @groups: An array describing all pin groups the pin SoC supports. | 142 | * @groups: An array describing all pin groups the pin SoC supports. |
102 | * @ngroups: The numbmer of entries in @groups. | 143 | * @ngroups: The numbmer of entries in @groups. |
144 | * @gpio_pingroups: gpio pingroups | ||
145 | * @ngpio_pingroups: gpio pingroups count | ||
103 | * | 146 | * |
104 | * @modes_supported: Does SoC support modes | 147 | * @modes_supported: Does SoC support modes |
105 | * @mode: mode configured from probe | 148 | * @mode: mode configured from probe |
@@ -113,6 +156,10 @@ struct spear_pinctrl_machdata { | |||
113 | unsigned nfunctions; | 156 | unsigned nfunctions; |
114 | struct spear_pingroup **groups; | 157 | struct spear_pingroup **groups; |
115 | unsigned ngroups; | 158 | unsigned ngroups; |
159 | struct spear_gpio_pingroup *gpio_pingroups; | ||
160 | void (*gpio_request_endisable)(struct spear_pmx *pmx, int offset, | ||
161 | bool enable); | ||
162 | unsigned ngpio_pingroups; | ||
116 | 163 | ||
117 | bool modes_supported; | 164 | bool modes_supported; |
118 | u16 mode; | 165 | u16 mode; |
@@ -135,7 +182,20 @@ struct spear_pmx { | |||
135 | }; | 182 | }; |
136 | 183 | ||
137 | /* exported routines */ | 184 | /* exported routines */ |
185 | static inline u32 pmx_readl(struct spear_pmx *pmx, u32 reg) | ||
186 | { | ||
187 | return readl_relaxed(pmx->vbase + reg); | ||
188 | } | ||
189 | |||
190 | static inline void pmx_writel(struct spear_pmx *pmx, u32 val, u32 reg) | ||
191 | { | ||
192 | writel_relaxed(val, pmx->vbase + reg); | ||
193 | } | ||
194 | |||
138 | void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg); | 195 | void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg); |
196 | void __devinit | ||
197 | pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup *gpio_pingroup, | ||
198 | unsigned count, u16 reg); | ||
139 | int __devinit spear_pinctrl_probe(struct platform_device *pdev, | 199 | int __devinit spear_pinctrl_probe(struct platform_device *pdev, |
140 | struct spear_pinctrl_machdata *machdata); | 200 | struct spear_pinctrl_machdata *machdata); |
141 | int __devexit spear_pinctrl_remove(struct platform_device *pdev); | 201 | int __devexit spear_pinctrl_remove(struct platform_device *pdev); |
diff --git a/drivers/pinctrl/spear/pinctrl-spear1310.c b/drivers/pinctrl/spear/pinctrl-spear1310.c index 0436fc7895d6..30134f727455 100644 --- a/drivers/pinctrl/spear/pinctrl-spear1310.c +++ b/drivers/pinctrl/spear/pinctrl-spear1310.c | |||
@@ -2418,6 +2418,268 @@ static struct spear_function *spear1310_functions[] = { | |||
2418 | &gpt64_function, | 2418 | &gpt64_function, |
2419 | }; | 2419 | }; |
2420 | 2420 | ||
2421 | static const unsigned pin18[] = { 18, }; | ||
2422 | static const unsigned pin19[] = { 19, }; | ||
2423 | static const unsigned pin20[] = { 20, }; | ||
2424 | static const unsigned pin21[] = { 21, }; | ||
2425 | static const unsigned pin22[] = { 22, }; | ||
2426 | static const unsigned pin23[] = { 23, }; | ||
2427 | static const unsigned pin54[] = { 54, }; | ||
2428 | static const unsigned pin55[] = { 55, }; | ||
2429 | static const unsigned pin56[] = { 56, }; | ||
2430 | static const unsigned pin57[] = { 57, }; | ||
2431 | static const unsigned pin58[] = { 58, }; | ||
2432 | static const unsigned pin59[] = { 59, }; | ||
2433 | static const unsigned pin60[] = { 60, }; | ||
2434 | static const unsigned pin61[] = { 61, }; | ||
2435 | static const unsigned pin62[] = { 62, }; | ||
2436 | static const unsigned pin63[] = { 63, }; | ||
2437 | static const unsigned pin143[] = { 143, }; | ||
2438 | static const unsigned pin144[] = { 144, }; | ||
2439 | static const unsigned pin145[] = { 145, }; | ||
2440 | static const unsigned pin146[] = { 146, }; | ||
2441 | static const unsigned pin147[] = { 147, }; | ||
2442 | static const unsigned pin148[] = { 148, }; | ||
2443 | static const unsigned pin149[] = { 149, }; | ||
2444 | static const unsigned pin150[] = { 150, }; | ||
2445 | static const unsigned pin151[] = { 151, }; | ||
2446 | static const unsigned pin152[] = { 152, }; | ||
2447 | static const unsigned pin205[] = { 205, }; | ||
2448 | static const unsigned pin206[] = { 206, }; | ||
2449 | static const unsigned pin211[] = { 211, }; | ||
2450 | static const unsigned pin212[] = { 212, }; | ||
2451 | static const unsigned pin213[] = { 213, }; | ||
2452 | static const unsigned pin214[] = { 214, }; | ||
2453 | static const unsigned pin215[] = { 215, }; | ||
2454 | static const unsigned pin216[] = { 216, }; | ||
2455 | static const unsigned pin217[] = { 217, }; | ||
2456 | static const unsigned pin218[] = { 218, }; | ||
2457 | static const unsigned pin219[] = { 219, }; | ||
2458 | static const unsigned pin220[] = { 220, }; | ||
2459 | static const unsigned pin221[] = { 221, }; | ||
2460 | static const unsigned pin222[] = { 222, }; | ||
2461 | static const unsigned pin223[] = { 223, }; | ||
2462 | static const unsigned pin224[] = { 224, }; | ||
2463 | static const unsigned pin225[] = { 225, }; | ||
2464 | static const unsigned pin226[] = { 226, }; | ||
2465 | static const unsigned pin227[] = { 227, }; | ||
2466 | static const unsigned pin228[] = { 228, }; | ||
2467 | static const unsigned pin229[] = { 229, }; | ||
2468 | static const unsigned pin230[] = { 230, }; | ||
2469 | static const unsigned pin231[] = { 231, }; | ||
2470 | static const unsigned pin232[] = { 232, }; | ||
2471 | static const unsigned pin233[] = { 233, }; | ||
2472 | static const unsigned pin234[] = { 234, }; | ||
2473 | static const unsigned pin235[] = { 235, }; | ||
2474 | static const unsigned pin236[] = { 236, }; | ||
2475 | static const unsigned pin237[] = { 237, }; | ||
2476 | static const unsigned pin238[] = { 238, }; | ||
2477 | static const unsigned pin239[] = { 239, }; | ||
2478 | static const unsigned pin240[] = { 240, }; | ||
2479 | static const unsigned pin241[] = { 241, }; | ||
2480 | static const unsigned pin242[] = { 242, }; | ||
2481 | static const unsigned pin243[] = { 243, }; | ||
2482 | static const unsigned pin244[] = { 244, }; | ||
2483 | static const unsigned pin245[] = { 245, }; | ||
2484 | |||
2485 | static const unsigned pin_grp0[] = { 173, 174, }; | ||
2486 | static const unsigned pin_grp1[] = { 175, 185, 188, 197, 198, }; | ||
2487 | static const unsigned pin_grp2[] = { 176, 177, 178, 179, 184, 186, 187, 189, | ||
2488 | 190, 191, 192, }; | ||
2489 | static const unsigned pin_grp3[] = { 180, 181, 182, 183, 193, 194, 195, 196, }; | ||
2490 | static const unsigned pin_grp4[] = { 199, 200, }; | ||
2491 | static const unsigned pin_grp5[] = { 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, | ||
2492 | 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, }; | ||
2493 | static const unsigned pin_grp6[] = { 86, 87, 88, 89, 90, 91, 92, 93, }; | ||
2494 | static const unsigned pin_grp7[] = { 98, 99, }; | ||
2495 | static const unsigned pin_grp8[] = { 158, 159, 160, 161, 162, 163, 164, 165, | ||
2496 | 166, 167, 168, 169, 170, 171, 172, }; | ||
2497 | |||
2498 | /* Define muxreg arrays */ | ||
2499 | DEFINE_2_MUXREG(i2c0_pins, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_I2C0_MASK, 0, 1); | ||
2500 | DEFINE_2_MUXREG(ssp0_pins, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_SSP0_MASK, 0, 1); | ||
2501 | DEFINE_2_MUXREG(ssp0_cs0_pins, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_SSP0_CS0_MASK, 0, 1); | ||
2502 | DEFINE_2_MUXREG(ssp0_cs1_2_pins, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_SSP0_CS1_2_MASK, 0, 1); | ||
2503 | DEFINE_2_MUXREG(i2s0_pins, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_I2S0_MASK, 0, 1); | ||
2504 | DEFINE_2_MUXREG(i2s1_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_I2S1_MASK, 0, 1); | ||
2505 | DEFINE_2_MUXREG(clcd_pins, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_CLCD1_MASK, 0, 1); | ||
2506 | DEFINE_2_MUXREG(clcd_high_res_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_CLCD2_MASK, 0, 1); | ||
2507 | DEFINE_2_MUXREG(pin18, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO15_MASK, 0, 1); | ||
2508 | DEFINE_2_MUXREG(pin19, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO14_MASK, 0, 1); | ||
2509 | DEFINE_2_MUXREG(pin20, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO13_MASK, 0, 1); | ||
2510 | DEFINE_2_MUXREG(pin21, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO12_MASK, 0, 1); | ||
2511 | DEFINE_2_MUXREG(pin22, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO11_MASK, 0, 1); | ||
2512 | DEFINE_2_MUXREG(pin23, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO10_MASK, 0, 1); | ||
2513 | DEFINE_2_MUXREG(pin143, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO00_MASK, 0, 1); | ||
2514 | DEFINE_2_MUXREG(pin144, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO01_MASK, 0, 1); | ||
2515 | DEFINE_2_MUXREG(pin145, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO02_MASK, 0, 1); | ||
2516 | DEFINE_2_MUXREG(pin146, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO03_MASK, 0, 1); | ||
2517 | DEFINE_2_MUXREG(pin147, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO04_MASK, 0, 1); | ||
2518 | DEFINE_2_MUXREG(pin148, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO05_MASK, 0, 1); | ||
2519 | DEFINE_2_MUXREG(pin149, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO06_MASK, 0, 1); | ||
2520 | DEFINE_2_MUXREG(pin150, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO07_MASK, 0, 1); | ||
2521 | DEFINE_2_MUXREG(pin151, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO08_MASK, 0, 1); | ||
2522 | DEFINE_2_MUXREG(pin152, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_EGPIO09_MASK, 0, 1); | ||
2523 | DEFINE_2_MUXREG(smi_2_chips_pins, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_SMI_MASK, 0, 1); | ||
2524 | DEFINE_2_MUXREG(pin54, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_SMINCS3_MASK, 0, 1); | ||
2525 | DEFINE_2_MUXREG(pin55, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_SMINCS2_MASK, 0, 1); | ||
2526 | DEFINE_2_MUXREG(pin56, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_NFRSTPWDWN3_MASK, 0, 1); | ||
2527 | DEFINE_2_MUXREG(pin57, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFRSTPWDWN2_MASK, 0, 1); | ||
2528 | DEFINE_2_MUXREG(pin58, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFRSTPWDWN1_MASK, 0, 1); | ||
2529 | DEFINE_2_MUXREG(pin59, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFRSTPWDWN0_MASK, 0, 1); | ||
2530 | DEFINE_2_MUXREG(pin60, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFWPRT3_MASK, 0, 1); | ||
2531 | DEFINE_2_MUXREG(pin61, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFCE3_MASK, 0, 1); | ||
2532 | DEFINE_2_MUXREG(pin62, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFAD25_MASK, 0, 1); | ||
2533 | DEFINE_2_MUXREG(pin63, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFAD24_MASK, 0, 1); | ||
2534 | DEFINE_2_MUXREG(pin_grp0, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_GMIICLK_MASK, 0, 1); | ||
2535 | DEFINE_2_MUXREG(pin_grp1, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_GMIICOL_CRS_XFERER_MIITXCLK_MASK, 0, 1); | ||
2536 | DEFINE_2_MUXREG(pin_grp2, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_RXCLK_RDV_TXEN_D03_MASK, 0, 1); | ||
2537 | DEFINE_2_MUXREG(pin_grp3, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_GMIID47_MASK, 0, 1); | ||
2538 | DEFINE_2_MUXREG(pin_grp4, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_MDC_MDIO_MASK, 0, 1); | ||
2539 | DEFINE_2_MUXREG(pin_grp5, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_NFAD23_MASK, 0, 1); | ||
2540 | DEFINE_2_MUXREG(pin_grp6, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_MCI_DATA8_15_MASK, 0, 1); | ||
2541 | DEFINE_2_MUXREG(pin_grp7, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_NFCE2_MASK, 0, 1); | ||
2542 | DEFINE_2_MUXREG(pin_grp8, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_NAND8_MASK, 0, 1); | ||
2543 | DEFINE_2_MUXREG(nand_16bit_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_NAND16BIT_1_MASK, 0, 1); | ||
2544 | DEFINE_2_MUXREG(pin205, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_KBD_COL1_MASK | PMX_NFCE1_MASK, 0, 1); | ||
2545 | DEFINE_2_MUXREG(pin206, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_KBD_COL0_MASK | PMX_NFCE2_MASK, 0, 1); | ||
2546 | DEFINE_2_MUXREG(pin211, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_KBD_ROW1_MASK | PMX_NFWPRT1_MASK, 0, 1); | ||
2547 | DEFINE_2_MUXREG(pin212, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_KBD_ROW0_MASK | PMX_NFWPRT2_MASK, 0, 1); | ||
2548 | DEFINE_2_MUXREG(pin213, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_MCIDATA0_MASK, 0, 1); | ||
2549 | DEFINE_2_MUXREG(pin214, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_MCIDATA1_MASK, 0, 1); | ||
2550 | DEFINE_2_MUXREG(pin215, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_MCIDATA2_MASK, 0, 1); | ||
2551 | DEFINE_2_MUXREG(pin216, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_MCIDATA3_MASK, 0, 1); | ||
2552 | DEFINE_2_MUXREG(pin217, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_MCIDATA4_MASK, 0, 1); | ||
2553 | DEFINE_2_MUXREG(pin218, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDATA5_MASK, 0, 1); | ||
2554 | DEFINE_2_MUXREG(pin219, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDATA6_MASK, 0, 1); | ||
2555 | DEFINE_2_MUXREG(pin220, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDATA7_MASK, 0, 1); | ||
2556 | DEFINE_2_MUXREG(pin221, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDATA1SD_MASK, 0, 1); | ||
2557 | DEFINE_2_MUXREG(pin222, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDATA2SD_MASK, 0, 1); | ||
2558 | DEFINE_2_MUXREG(pin223, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDATA3SD_MASK, 0, 1); | ||
2559 | DEFINE_2_MUXREG(pin224, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIADDR0ALE_MASK, 0, 1); | ||
2560 | DEFINE_2_MUXREG(pin225, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIADDR1CLECLK_MASK, 0, 1); | ||
2561 | DEFINE_2_MUXREG(pin226, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIADDR2_MASK, 0, 1); | ||
2562 | DEFINE_2_MUXREG(pin227, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICECF_MASK, 0, 1); | ||
2563 | DEFINE_2_MUXREG(pin228, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICEXD_MASK, 0, 1); | ||
2564 | DEFINE_2_MUXREG(pin229, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICESDMMC_MASK, 0, 1); | ||
2565 | DEFINE_2_MUXREG(pin230, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICDCF1_MASK, 0, 1); | ||
2566 | DEFINE_2_MUXREG(pin231, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICDCF2_MASK, 0, 1); | ||
2567 | DEFINE_2_MUXREG(pin232, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICDXD_MASK, 0, 1); | ||
2568 | DEFINE_2_MUXREG(pin233, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICDSDMMC_MASK, 0, 1); | ||
2569 | DEFINE_2_MUXREG(pin234, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDATADIR_MASK, 0, 1); | ||
2570 | DEFINE_2_MUXREG(pin235, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDMARQWP_MASK, 0, 1); | ||
2571 | DEFINE_2_MUXREG(pin236, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIIORDRE_MASK, 0, 1); | ||
2572 | DEFINE_2_MUXREG(pin237, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIIOWRWE_MASK, 0, 1); | ||
2573 | DEFINE_2_MUXREG(pin238, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIRESETCF_MASK, 0, 1); | ||
2574 | DEFINE_2_MUXREG(pin239, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICS0CE_MASK, 0, 1); | ||
2575 | DEFINE_2_MUXREG(pin240, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICFINTR_MASK, 0, 1); | ||
2576 | DEFINE_2_MUXREG(pin241, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIIORDY_MASK, 0, 1); | ||
2577 | DEFINE_2_MUXREG(pin242, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCICS1_MASK, 0, 1); | ||
2578 | DEFINE_2_MUXREG(pin243, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCIDMAACK_MASK, 0, 1); | ||
2579 | DEFINE_2_MUXREG(pin244, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCISDCMD_MASK, 0, 1); | ||
2580 | DEFINE_2_MUXREG(pin245, PAD_FUNCTION_EN_2, PAD_DIRECTION_SEL_2, PMX_MCILEDS_MASK, 0, 1); | ||
2581 | DEFINE_2_MUXREG(keyboard_rowcol6_8_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_KBD_ROWCOL68_MASK, 0, 1); | ||
2582 | DEFINE_2_MUXREG(uart0_pins, PAD_FUNCTION_EN_0, PAD_DIRECTION_SEL_0, PMX_UART0_MASK, 0, 1); | ||
2583 | DEFINE_2_MUXREG(uart0_modem_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_UART0_MODEM_MASK, 0, 1); | ||
2584 | DEFINE_2_MUXREG(gpt0_tmr0_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_GPT0_TMR0_MASK, 0, 1); | ||
2585 | DEFINE_2_MUXREG(gpt0_tmr1_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_GPT0_TMR1_MASK, 0, 1); | ||
2586 | DEFINE_2_MUXREG(gpt1_tmr0_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_GPT1_TMR0_MASK, 0, 1); | ||
2587 | DEFINE_2_MUXREG(gpt1_tmr1_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_GPT1_TMR1_MASK, 0, 1); | ||
2588 | DEFINE_2_MUXREG(touch_xy_pins, PAD_FUNCTION_EN_1, PAD_DIRECTION_SEL_1, PMX_TOUCH_XY_MASK, 0, 1); | ||
2589 | |||
2590 | static struct spear_gpio_pingroup spear1310_gpio_pingroup[] = { | ||
2591 | GPIO_PINGROUP(i2c0_pins), | ||
2592 | GPIO_PINGROUP(ssp0_pins), | ||
2593 | GPIO_PINGROUP(ssp0_cs0_pins), | ||
2594 | GPIO_PINGROUP(ssp0_cs1_2_pins), | ||
2595 | GPIO_PINGROUP(i2s0_pins), | ||
2596 | GPIO_PINGROUP(i2s1_pins), | ||
2597 | GPIO_PINGROUP(clcd_pins), | ||
2598 | GPIO_PINGROUP(clcd_high_res_pins), | ||
2599 | GPIO_PINGROUP(pin18), | ||
2600 | GPIO_PINGROUP(pin19), | ||
2601 | GPIO_PINGROUP(pin20), | ||
2602 | GPIO_PINGROUP(pin21), | ||
2603 | GPIO_PINGROUP(pin22), | ||
2604 | GPIO_PINGROUP(pin23), | ||
2605 | GPIO_PINGROUP(pin143), | ||
2606 | GPIO_PINGROUP(pin144), | ||
2607 | GPIO_PINGROUP(pin145), | ||
2608 | GPIO_PINGROUP(pin146), | ||
2609 | GPIO_PINGROUP(pin147), | ||
2610 | GPIO_PINGROUP(pin148), | ||
2611 | GPIO_PINGROUP(pin149), | ||
2612 | GPIO_PINGROUP(pin150), | ||
2613 | GPIO_PINGROUP(pin151), | ||
2614 | GPIO_PINGROUP(pin152), | ||
2615 | GPIO_PINGROUP(smi_2_chips_pins), | ||
2616 | GPIO_PINGROUP(pin54), | ||
2617 | GPIO_PINGROUP(pin55), | ||
2618 | GPIO_PINGROUP(pin56), | ||
2619 | GPIO_PINGROUP(pin57), | ||
2620 | GPIO_PINGROUP(pin58), | ||
2621 | GPIO_PINGROUP(pin59), | ||
2622 | GPIO_PINGROUP(pin60), | ||
2623 | GPIO_PINGROUP(pin61), | ||
2624 | GPIO_PINGROUP(pin62), | ||
2625 | GPIO_PINGROUP(pin63), | ||
2626 | GPIO_PINGROUP(pin_grp0), | ||
2627 | GPIO_PINGROUP(pin_grp1), | ||
2628 | GPIO_PINGROUP(pin_grp2), | ||
2629 | GPIO_PINGROUP(pin_grp3), | ||
2630 | GPIO_PINGROUP(pin_grp4), | ||
2631 | GPIO_PINGROUP(pin_grp5), | ||
2632 | GPIO_PINGROUP(pin_grp6), | ||
2633 | GPIO_PINGROUP(pin_grp7), | ||
2634 | GPIO_PINGROUP(pin_grp8), | ||
2635 | GPIO_PINGROUP(nand_16bit_pins), | ||
2636 | GPIO_PINGROUP(pin205), | ||
2637 | GPIO_PINGROUP(pin206), | ||
2638 | GPIO_PINGROUP(pin211), | ||
2639 | GPIO_PINGROUP(pin212), | ||
2640 | GPIO_PINGROUP(pin213), | ||
2641 | GPIO_PINGROUP(pin214), | ||
2642 | GPIO_PINGROUP(pin215), | ||
2643 | GPIO_PINGROUP(pin216), | ||
2644 | GPIO_PINGROUP(pin217), | ||
2645 | GPIO_PINGROUP(pin218), | ||
2646 | GPIO_PINGROUP(pin219), | ||
2647 | GPIO_PINGROUP(pin220), | ||
2648 | GPIO_PINGROUP(pin221), | ||
2649 | GPIO_PINGROUP(pin222), | ||
2650 | GPIO_PINGROUP(pin223), | ||
2651 | GPIO_PINGROUP(pin224), | ||
2652 | GPIO_PINGROUP(pin225), | ||
2653 | GPIO_PINGROUP(pin226), | ||
2654 | GPIO_PINGROUP(pin227), | ||
2655 | GPIO_PINGROUP(pin228), | ||
2656 | GPIO_PINGROUP(pin229), | ||
2657 | GPIO_PINGROUP(pin230), | ||
2658 | GPIO_PINGROUP(pin231), | ||
2659 | GPIO_PINGROUP(pin232), | ||
2660 | GPIO_PINGROUP(pin233), | ||
2661 | GPIO_PINGROUP(pin234), | ||
2662 | GPIO_PINGROUP(pin235), | ||
2663 | GPIO_PINGROUP(pin236), | ||
2664 | GPIO_PINGROUP(pin237), | ||
2665 | GPIO_PINGROUP(pin238), | ||
2666 | GPIO_PINGROUP(pin239), | ||
2667 | GPIO_PINGROUP(pin240), | ||
2668 | GPIO_PINGROUP(pin241), | ||
2669 | GPIO_PINGROUP(pin242), | ||
2670 | GPIO_PINGROUP(pin243), | ||
2671 | GPIO_PINGROUP(pin244), | ||
2672 | GPIO_PINGROUP(pin245), | ||
2673 | GPIO_PINGROUP(keyboard_rowcol6_8_pins), | ||
2674 | GPIO_PINGROUP(uart0_pins), | ||
2675 | GPIO_PINGROUP(uart0_modem_pins), | ||
2676 | GPIO_PINGROUP(gpt0_tmr0_pins), | ||
2677 | GPIO_PINGROUP(gpt0_tmr1_pins), | ||
2678 | GPIO_PINGROUP(gpt1_tmr0_pins), | ||
2679 | GPIO_PINGROUP(gpt1_tmr1_pins), | ||
2680 | GPIO_PINGROUP(touch_xy_pins), | ||
2681 | }; | ||
2682 | |||
2421 | static struct spear_pinctrl_machdata spear1310_machdata = { | 2683 | static struct spear_pinctrl_machdata spear1310_machdata = { |
2422 | .pins = spear1310_pins, | 2684 | .pins = spear1310_pins, |
2423 | .npins = ARRAY_SIZE(spear1310_pins), | 2685 | .npins = ARRAY_SIZE(spear1310_pins), |
@@ -2425,6 +2687,8 @@ static struct spear_pinctrl_machdata spear1310_machdata = { | |||
2425 | .ngroups = ARRAY_SIZE(spear1310_pingroups), | 2687 | .ngroups = ARRAY_SIZE(spear1310_pingroups), |
2426 | .functions = spear1310_functions, | 2688 | .functions = spear1310_functions, |
2427 | .nfunctions = ARRAY_SIZE(spear1310_functions), | 2689 | .nfunctions = ARRAY_SIZE(spear1310_functions), |
2690 | .gpio_pingroups = spear1310_gpio_pingroup, | ||
2691 | .ngpio_pingroups = ARRAY_SIZE(spear1310_gpio_pingroup), | ||
2428 | .modes_supported = false, | 2692 | .modes_supported = false, |
2429 | }; | 2693 | }; |
2430 | 2694 | ||
diff --git a/drivers/pinctrl/spear/pinctrl-spear1340.c b/drivers/pinctrl/spear/pinctrl-spear1340.c index 0606b8cf3f2c..0b4af0e5cdc1 100644 --- a/drivers/pinctrl/spear/pinctrl-spear1340.c +++ b/drivers/pinctrl/spear/pinctrl-spear1340.c | |||
@@ -1971,6 +1971,32 @@ static struct spear_function *spear1340_functions[] = { | |||
1971 | &sata_function, | 1971 | &sata_function, |
1972 | }; | 1972 | }; |
1973 | 1973 | ||
1974 | static void gpio_request_endisable(struct spear_pmx *pmx, int pin, | ||
1975 | bool enable) | ||
1976 | { | ||
1977 | unsigned int regoffset, regindex, bitoffset; | ||
1978 | unsigned int val; | ||
1979 | |||
1980 | /* pin++ as gpio configuration starts from 2nd bit of base register */ | ||
1981 | pin++; | ||
1982 | |||
1983 | regindex = pin / 32; | ||
1984 | bitoffset = pin % 32; | ||
1985 | |||
1986 | if (regindex <= 3) | ||
1987 | regoffset = PAD_FUNCTION_EN_1 + regindex * sizeof(int *); | ||
1988 | else | ||
1989 | regoffset = PAD_FUNCTION_EN_5 + (regindex - 4) * sizeof(int *); | ||
1990 | |||
1991 | val = pmx_readl(pmx, regoffset); | ||
1992 | if (enable) | ||
1993 | val &= ~(0x1 << bitoffset); | ||
1994 | else | ||
1995 | val |= 0x1 << bitoffset; | ||
1996 | |||
1997 | pmx_writel(pmx, val, regoffset); | ||
1998 | } | ||
1999 | |||
1974 | static struct spear_pinctrl_machdata spear1340_machdata = { | 2000 | static struct spear_pinctrl_machdata spear1340_machdata = { |
1975 | .pins = spear1340_pins, | 2001 | .pins = spear1340_pins, |
1976 | .npins = ARRAY_SIZE(spear1340_pins), | 2002 | .npins = ARRAY_SIZE(spear1340_pins), |
@@ -1978,6 +2004,7 @@ static struct spear_pinctrl_machdata spear1340_machdata = { | |||
1978 | .ngroups = ARRAY_SIZE(spear1340_pingroups), | 2004 | .ngroups = ARRAY_SIZE(spear1340_pingroups), |
1979 | .functions = spear1340_functions, | 2005 | .functions = spear1340_functions, |
1980 | .nfunctions = ARRAY_SIZE(spear1340_functions), | 2006 | .nfunctions = ARRAY_SIZE(spear1340_functions), |
2007 | .gpio_request_endisable = gpio_request_endisable, | ||
1981 | .modes_supported = false, | 2008 | .modes_supported = false, |
1982 | }; | 2009 | }; |
1983 | 2010 | ||
diff --git a/drivers/pinctrl/spear/pinctrl-spear300.c b/drivers/pinctrl/spear/pinctrl-spear300.c index 4dfc2849b172..9a491007f42d 100644 --- a/drivers/pinctrl/spear/pinctrl-spear300.c +++ b/drivers/pinctrl/spear/pinctrl-spear300.c | |||
@@ -661,6 +661,8 @@ static int __devinit spear300_pinctrl_probe(struct platform_device *pdev) | |||
661 | spear3xx_machdata.ngroups = ARRAY_SIZE(spear300_pingroups); | 661 | spear3xx_machdata.ngroups = ARRAY_SIZE(spear300_pingroups); |
662 | spear3xx_machdata.functions = spear300_functions; | 662 | spear3xx_machdata.functions = spear300_functions; |
663 | spear3xx_machdata.nfunctions = ARRAY_SIZE(spear300_functions); | 663 | spear3xx_machdata.nfunctions = ARRAY_SIZE(spear300_functions); |
664 | spear3xx_machdata.gpio_pingroups = NULL; | ||
665 | spear3xx_machdata.ngpio_pingroups = 0; | ||
664 | 666 | ||
665 | spear3xx_machdata.modes_supported = true; | 667 | spear3xx_machdata.modes_supported = true; |
666 | spear3xx_machdata.pmx_modes = spear300_pmx_modes; | 668 | spear3xx_machdata.pmx_modes = spear300_pmx_modes; |
diff --git a/drivers/pinctrl/spear/pinctrl-spear310.c b/drivers/pinctrl/spear/pinctrl-spear310.c index 96883693fb7e..4d5dfe9c760a 100644 --- a/drivers/pinctrl/spear/pinctrl-spear310.c +++ b/drivers/pinctrl/spear/pinctrl-spear310.c | |||
@@ -388,6 +388,8 @@ static int __devinit spear310_pinctrl_probe(struct platform_device *pdev) | |||
388 | spear3xx_machdata.nfunctions = ARRAY_SIZE(spear310_functions); | 388 | spear3xx_machdata.nfunctions = ARRAY_SIZE(spear310_functions); |
389 | 389 | ||
390 | pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG); | 390 | pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG); |
391 | pmx_init_gpio_pingroup_addr(spear3xx_machdata.gpio_pingroups, | ||
392 | spear3xx_machdata.ngpio_pingroups, PMX_CONFIG_REG); | ||
391 | 393 | ||
392 | spear3xx_machdata.modes_supported = false; | 394 | spear3xx_machdata.modes_supported = false; |
393 | 395 | ||
diff --git a/drivers/pinctrl/spear/pinctrl-spear320.c b/drivers/pinctrl/spear/pinctrl-spear320.c index ca47b0e50780..c996e26e3b6c 100644 --- a/drivers/pinctrl/spear/pinctrl-spear320.c +++ b/drivers/pinctrl/spear/pinctrl-spear320.c | |||
@@ -3431,6 +3431,8 @@ static int __devinit spear320_pinctrl_probe(struct platform_device *pdev) | |||
3431 | spear3xx_machdata.npmx_modes = ARRAY_SIZE(spear320_pmx_modes); | 3431 | spear3xx_machdata.npmx_modes = ARRAY_SIZE(spear320_pmx_modes); |
3432 | 3432 | ||
3433 | pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG); | 3433 | pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG); |
3434 | pmx_init_gpio_pingroup_addr(spear3xx_machdata.gpio_pingroups, | ||
3435 | spear3xx_machdata.ngpio_pingroups, PMX_CONFIG_REG); | ||
3434 | 3436 | ||
3435 | ret = spear_pinctrl_probe(pdev, &spear3xx_machdata); | 3437 | ret = spear_pinctrl_probe(pdev, &spear3xx_machdata); |
3436 | if (ret) | 3438 | if (ret) |
diff --git a/drivers/pinctrl/spear/pinctrl-spear3xx.c b/drivers/pinctrl/spear/pinctrl-spear3xx.c index 0242378f7cb8..12ee21af766b 100644 --- a/drivers/pinctrl/spear/pinctrl-spear3xx.c +++ b/drivers/pinctrl/spear/pinctrl-spear3xx.c | |||
@@ -481,7 +481,44 @@ struct spear_function spear3xx_timer_2_3_function = { | |||
481 | .ngroups = ARRAY_SIZE(timer_2_3_grps), | 481 | .ngroups = ARRAY_SIZE(timer_2_3_grps), |
482 | }; | 482 | }; |
483 | 483 | ||
484 | /* Define muxreg arrays */ | ||
485 | DEFINE_MUXREG(firda_pins, 0, PMX_FIRDA_MASK, 0); | ||
486 | DEFINE_MUXREG(i2c_pins, 0, PMX_I2C_MASK, 0); | ||
487 | DEFINE_MUXREG(ssp_cs_pins, 0, PMX_SSP_CS_MASK, 0); | ||
488 | DEFINE_MUXREG(ssp_pins, 0, PMX_SSP_MASK, 0); | ||
489 | DEFINE_MUXREG(mii_pins, 0, PMX_MII_MASK, 0); | ||
490 | DEFINE_MUXREG(gpio0_pin0_pins, 0, PMX_GPIO_PIN0_MASK, 0); | ||
491 | DEFINE_MUXREG(gpio0_pin1_pins, 0, PMX_GPIO_PIN1_MASK, 0); | ||
492 | DEFINE_MUXREG(gpio0_pin2_pins, 0, PMX_GPIO_PIN2_MASK, 0); | ||
493 | DEFINE_MUXREG(gpio0_pin3_pins, 0, PMX_GPIO_PIN3_MASK, 0); | ||
494 | DEFINE_MUXREG(gpio0_pin4_pins, 0, PMX_GPIO_PIN4_MASK, 0); | ||
495 | DEFINE_MUXREG(gpio0_pin5_pins, 0, PMX_GPIO_PIN5_MASK, 0); | ||
496 | DEFINE_MUXREG(uart0_ext_pins, 0, PMX_UART0_MODEM_MASK, 0); | ||
497 | DEFINE_MUXREG(uart0_pins, 0, PMX_UART0_MASK, 0); | ||
498 | DEFINE_MUXREG(timer_0_1_pins, 0, PMX_TIMER_0_1_MASK, 0); | ||
499 | DEFINE_MUXREG(timer_2_3_pins, 0, PMX_TIMER_2_3_MASK, 0); | ||
500 | |||
501 | static struct spear_gpio_pingroup spear3xx_gpio_pingroup[] = { | ||
502 | GPIO_PINGROUP(firda_pins), | ||
503 | GPIO_PINGROUP(i2c_pins), | ||
504 | GPIO_PINGROUP(ssp_cs_pins), | ||
505 | GPIO_PINGROUP(ssp_pins), | ||
506 | GPIO_PINGROUP(mii_pins), | ||
507 | GPIO_PINGROUP(gpio0_pin0_pins), | ||
508 | GPIO_PINGROUP(gpio0_pin1_pins), | ||
509 | GPIO_PINGROUP(gpio0_pin2_pins), | ||
510 | GPIO_PINGROUP(gpio0_pin3_pins), | ||
511 | GPIO_PINGROUP(gpio0_pin4_pins), | ||
512 | GPIO_PINGROUP(gpio0_pin5_pins), | ||
513 | GPIO_PINGROUP(uart0_ext_pins), | ||
514 | GPIO_PINGROUP(uart0_pins), | ||
515 | GPIO_PINGROUP(timer_0_1_pins), | ||
516 | GPIO_PINGROUP(timer_2_3_pins), | ||
517 | }; | ||
518 | |||
484 | struct spear_pinctrl_machdata spear3xx_machdata = { | 519 | struct spear_pinctrl_machdata spear3xx_machdata = { |
485 | .pins = spear3xx_pins, | 520 | .pins = spear3xx_pins, |
486 | .npins = ARRAY_SIZE(spear3xx_pins), | 521 | .npins = ARRAY_SIZE(spear3xx_pins), |
522 | .gpio_pingroups = spear3xx_gpio_pingroup, | ||
523 | .ngpio_pingroups = ARRAY_SIZE(spear3xx_gpio_pingroup), | ||
487 | }; | 524 | }; |
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 3d7e1ee2fa57..65f891be12d1 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/atmel_pdc.h> | 39 | #include <linux/atmel_pdc.h> |
40 | #include <linux/atmel_serial.h> | 40 | #include <linux/atmel_serial.h> |
41 | #include <linux/uaccess.h> | 41 | #include <linux/uaccess.h> |
42 | #include <linux/pinctrl/consumer.h> | ||
42 | 43 | ||
43 | #include <asm/io.h> | 44 | #include <asm/io.h> |
44 | #include <asm/ioctls.h> | 45 | #include <asm/ioctls.h> |
@@ -1773,6 +1774,7 @@ static int __devinit atmel_serial_probe(struct platform_device *pdev) | |||
1773 | struct atmel_uart_data *pdata = pdev->dev.platform_data; | 1774 | struct atmel_uart_data *pdata = pdev->dev.platform_data; |
1774 | void *data; | 1775 | void *data; |
1775 | int ret = -ENODEV; | 1776 | int ret = -ENODEV; |
1777 | struct pinctrl *pinctrl; | ||
1776 | 1778 | ||
1777 | BUILD_BUG_ON(ATMEL_SERIAL_RINGSIZE & (ATMEL_SERIAL_RINGSIZE - 1)); | 1779 | BUILD_BUG_ON(ATMEL_SERIAL_RINGSIZE & (ATMEL_SERIAL_RINGSIZE - 1)); |
1778 | 1780 | ||
@@ -1805,6 +1807,12 @@ static int __devinit atmel_serial_probe(struct platform_device *pdev) | |||
1805 | 1807 | ||
1806 | atmel_init_port(port, pdev); | 1808 | atmel_init_port(port, pdev); |
1807 | 1809 | ||
1810 | pinctrl = devm_pinctrl_get_select_default(&pdev->dev); | ||
1811 | if (IS_ERR(pinctrl)) { | ||
1812 | ret = PTR_ERR(pinctrl); | ||
1813 | goto err; | ||
1814 | } | ||
1815 | |||
1808 | if (!atmel_use_dma_rx(&port->uart)) { | 1816 | if (!atmel_use_dma_rx(&port->uart)) { |
1809 | ret = -ENOMEM; | 1817 | ret = -ENOMEM; |
1810 | data = kmalloc(sizeof(struct atmel_uart_char) | 1818 | data = kmalloc(sizeof(struct atmel_uart_char) |
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index a9432fc6b8ba..9fd3093d855a 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/types.h> | 5 | #include <linux/types.h> |
6 | #include <linux/errno.h> | 6 | #include <linux/errno.h> |
7 | #include <linux/of.h> | 7 | #include <linux/of.h> |
8 | #include <linux/pinctrl/pinctrl.h> | ||
8 | 9 | ||
9 | #ifdef CONFIG_GPIOLIB | 10 | #ifdef CONFIG_GPIOLIB |
10 | 11 | ||
@@ -134,6 +135,15 @@ struct gpio_chip { | |||
134 | int (*of_xlate)(struct gpio_chip *gc, | 135 | int (*of_xlate)(struct gpio_chip *gc, |
135 | const struct of_phandle_args *gpiospec, u32 *flags); | 136 | const struct of_phandle_args *gpiospec, u32 *flags); |
136 | #endif | 137 | #endif |
138 | #ifdef CONFIG_PINCTRL | ||
139 | /* | ||
140 | * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally | ||
141 | * describe the actual pin range which they serve in an SoC. This | ||
142 | * information would be used by pinctrl subsystem to configure | ||
143 | * corresponding pins for gpio usage. | ||
144 | */ | ||
145 | struct list_head pin_ranges; | ||
146 | #endif | ||
137 | }; | 147 | }; |
138 | 148 | ||
139 | extern const char *gpiochip_is_requested(struct gpio_chip *chip, | 149 | extern const char *gpiochip_is_requested(struct gpio_chip *chip, |
@@ -257,4 +267,41 @@ static inline void gpio_unexport(unsigned gpio) | |||
257 | } | 267 | } |
258 | #endif /* CONFIG_GPIO_SYSFS */ | 268 | #endif /* CONFIG_GPIO_SYSFS */ |
259 | 269 | ||
270 | #ifdef CONFIG_PINCTRL | ||
271 | |||
272 | /** | ||
273 | * struct gpio_pin_range - pin range controlled by a gpio chip | ||
274 | * @head: list for maintaining set of pin ranges, used internally | ||
275 | * @pctldev: pinctrl device which handles corresponding pins | ||
276 | * @range: actual range of pins controlled by a gpio controller | ||
277 | */ | ||
278 | |||
279 | struct gpio_pin_range { | ||
280 | struct list_head node; | ||
281 | struct pinctrl_dev *pctldev; | ||
282 | struct pinctrl_gpio_range range; | ||
283 | }; | ||
284 | |||
285 | int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | ||
286 | unsigned int gpio_offset, unsigned int pin_offset, | ||
287 | unsigned int npins); | ||
288 | void gpiochip_remove_pin_ranges(struct gpio_chip *chip); | ||
289 | |||
290 | #else | ||
291 | |||
292 | static inline int | ||
293 | gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | ||
294 | unsigned int gpio_offset, unsigned int pin_offset, | ||
295 | unsigned int npins) | ||
296 | { | ||
297 | return 0; | ||
298 | } | ||
299 | |||
300 | static inline void | ||
301 | gpiochip_remove_pin_ranges(struct gpio_chip *chip) | ||
302 | { | ||
303 | } | ||
304 | |||
305 | #endif /* CONFIG_PINCTRL */ | ||
306 | |||
260 | #endif /* _ASM_GENERIC_GPIO_H */ | 307 | #endif /* _ASM_GENERIC_GPIO_H */ |
diff --git a/include/linux/gpio.h b/include/linux/gpio.h index 2e31e8b3a190..bfe665621536 100644 --- a/include/linux/gpio.h +++ b/include/linux/gpio.h | |||
@@ -72,9 +72,9 @@ static inline int irq_to_gpio(unsigned int irq) | |||
72 | return -EINVAL; | 72 | return -EINVAL; |
73 | } | 73 | } |
74 | 74 | ||
75 | #endif | 75 | #endif /* ! CONFIG_ARCH_HAVE_CUSTOM_GPIO_H */ |
76 | 76 | ||
77 | #else | 77 | #else /* ! CONFIG_GENERIC_GPIO */ |
78 | 78 | ||
79 | #include <linux/kernel.h> | 79 | #include <linux/kernel.h> |
80 | #include <linux/types.h> | 80 | #include <linux/types.h> |
@@ -231,6 +231,21 @@ static inline int irq_to_gpio(unsigned irq) | |||
231 | return -EINVAL; | 231 | return -EINVAL; |
232 | } | 232 | } |
233 | 233 | ||
234 | #endif | 234 | static inline int |
235 | gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | ||
236 | unsigned int gpio_offset, unsigned int pin_offset, | ||
237 | unsigned int npins) | ||
238 | { | ||
239 | WARN_ON(1); | ||
240 | return -EINVAL; | ||
241 | } | ||
242 | |||
243 | static inline void | ||
244 | gpiochip_remove_pin_ranges(struct gpio_chip *chip) | ||
245 | { | ||
246 | WARN_ON(1); | ||
247 | } | ||
248 | |||
249 | #endif /* ! CONFIG_GENERIC_GPIO */ | ||
235 | 250 | ||
236 | #endif /* __LINUX_GPIO_H */ | 251 | #endif /* __LINUX_GPIO_H */ |
diff --git a/include/linux/pinctrl/pinconf-generic.h b/include/linux/pinctrl/pinconf-generic.h index 4f0abb9f1c09..47a1bdd88878 100644 --- a/include/linux/pinctrl/pinconf-generic.h +++ b/include/linux/pinctrl/pinconf-generic.h | |||
@@ -46,11 +46,11 @@ | |||
46 | * @PIN_CONFIG_DRIVE_OPEN_SOURCE: the pin will be driven with open source | 46 | * @PIN_CONFIG_DRIVE_OPEN_SOURCE: the pin will be driven with open source |
47 | * (open emitter). Sending this config will enabale open drain mode, the | 47 | * (open emitter). Sending this config will enabale open drain mode, the |
48 | * argument is ignored. | 48 | * argument is ignored. |
49 | * @PIN_CONFIG_INPUT_SCHMITT_DISABLE: disable schmitt-trigger mode on the pin. | ||
49 | * @PIN_CONFIG_INPUT_SCHMITT: this will configure an input pin to run in | 50 | * @PIN_CONFIG_INPUT_SCHMITT: this will configure an input pin to run in |
50 | * schmitt-trigger mode. If the schmitt-trigger has adjustable hysteresis, | 51 | * schmitt-trigger mode. If the schmitt-trigger has adjustable hysteresis, |
51 | * the threshold value is given on a custom format as argument when | 52 | * the threshold value is given on a custom format as argument when |
52 | * setting pins to this mode. The argument zero turns the schmitt trigger | 53 | * setting pins to this mode. |
53 | * off. | ||
54 | * @PIN_CONFIG_INPUT_DEBOUNCE: this will configure the pin to debounce mode, | 54 | * @PIN_CONFIG_INPUT_DEBOUNCE: this will configure the pin to debounce mode, |
55 | * which means it will wait for signals to settle when reading inputs. The | 55 | * which means it will wait for signals to settle when reading inputs. The |
56 | * argument gives the debounce time on a custom format. Setting the | 56 | * argument gives the debounce time on a custom format. Setting the |
@@ -74,6 +74,7 @@ enum pin_config_param { | |||
74 | PIN_CONFIG_DRIVE_PUSH_PULL, | 74 | PIN_CONFIG_DRIVE_PUSH_PULL, |
75 | PIN_CONFIG_DRIVE_OPEN_DRAIN, | 75 | PIN_CONFIG_DRIVE_OPEN_DRAIN, |
76 | PIN_CONFIG_DRIVE_OPEN_SOURCE, | 76 | PIN_CONFIG_DRIVE_OPEN_SOURCE, |
77 | PIN_CONFIG_INPUT_SCHMITT_DISABLE, | ||
77 | PIN_CONFIG_INPUT_SCHMITT, | 78 | PIN_CONFIG_INPUT_SCHMITT, |
78 | PIN_CONFIG_INPUT_DEBOUNCE, | 79 | PIN_CONFIG_INPUT_DEBOUNCE, |
79 | PIN_CONFIG_POWER_SOURCE, | 80 | PIN_CONFIG_POWER_SOURCE, |
diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index 7d087f03e91e..04d6700d99af 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h | |||
@@ -134,6 +134,25 @@ extern void pinctrl_add_gpio_range(struct pinctrl_dev *pctldev, | |||
134 | extern void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev, | 134 | extern void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev, |
135 | struct pinctrl_gpio_range *ranges, | 135 | struct pinctrl_gpio_range *ranges, |
136 | unsigned nranges); | 136 | unsigned nranges); |
137 | extern void pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev, | ||
138 | struct pinctrl_gpio_range *range); | ||
139 | |||
140 | extern struct pinctrl_dev *pinctrl_find_and_add_gpio_range(const char *devname, | ||
141 | struct pinctrl_gpio_range *range); | ||
142 | extern struct pinctrl_gpio_range * | ||
143 | pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, | ||
144 | unsigned int pin); | ||
145 | |||
146 | #ifdef CONFIG_OF | ||
147 | extern struct pinctrl_dev *of_pinctrl_get(struct device_node *np); | ||
148 | #else | ||
149 | static inline | ||
150 | struct pinctrl_dev *of_pinctrl_get(struct device_node *np) | ||
151 | { | ||
152 | return NULL; | ||
153 | } | ||
154 | #endif /* CONFIG_OF */ | ||
155 | |||
137 | extern const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev); | 156 | extern const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev); |
138 | extern void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev); | 157 | extern void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev); |
139 | #else | 158 | #else |
diff --git a/include/linux/platform_data/pinctrl-coh901.h b/include/linux/platform_data/pinctrl-coh901.h index 30dea251b835..dfbc65d10484 100644 --- a/include/linux/platform_data/pinctrl-coh901.h +++ b/include/linux/platform_data/pinctrl-coh901.h | |||
@@ -13,14 +13,10 @@ | |||
13 | * struct u300_gpio_platform - U300 GPIO platform data | 13 | * struct u300_gpio_platform - U300 GPIO platform data |
14 | * @ports: number of GPIO block ports | 14 | * @ports: number of GPIO block ports |
15 | * @gpio_base: first GPIO number for this block (use a free range) | 15 | * @gpio_base: first GPIO number for this block (use a free range) |
16 | * @gpio_irq_base: first GPIO IRQ number for this block (use a free range) | ||
17 | * @pinctrl_device: pin control device to spawn as child | ||
18 | */ | 16 | */ |
19 | struct u300_gpio_platform { | 17 | struct u300_gpio_platform { |
20 | u8 ports; | 18 | u8 ports; |
21 | int gpio_base; | 19 | int gpio_base; |
22 | int gpio_irq_base; | ||
23 | struct platform_device *pinctrl_device; | ||
24 | }; | 20 | }; |
25 | 21 | ||
26 | #endif /* __MACH_U300_GPIO_U300_H */ | 22 | #endif /* __MACH_U300_GPIO_U300_H */ |
diff --git a/arch/arm/plat-nomadik/include/plat/pincfg.h b/include/linux/platform_data/pinctrl-nomadik.h index 3b8ec60af351..f73b2f0c55b7 100644 --- a/arch/arm/plat-nomadik/include/plat/pincfg.h +++ b/include/linux/platform_data/pinctrl-nomadik.h | |||
@@ -1,16 +1,17 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) ST-Ericsson SA 2010 | 2 | * Structures and registers for GPIO access in the Nomadik SoC |
3 | * | 3 | * |
4 | * License terms: GNU General Public License, version 2 | 4 | * Copyright (C) 2008 STMicroelectronics |
5 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson | 5 | * Author: Prafulla WADASKAR <prafulla.wadaskar@st.com> |
6 | * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it> | ||
6 | * | 7 | * |
7 | * Based on arch/arm/mach-pxa/include/mach/mfp.h: | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * Copyright (C) 2007 Marvell International Ltd. | 9 | * it under the terms of the GNU General Public License version 2 as |
9 | * eric miao <eric.miao@marvell.com> | 10 | * published by the Free Software Foundation. |
10 | */ | 11 | */ |
11 | 12 | ||
12 | #ifndef __PLAT_PINCFG_H | 13 | #ifndef __PLAT_NOMADIK_GPIO |
13 | #define __PLAT_PINCFG_H | 14 | #define __PLAT_NOMADIK_GPIO |
14 | 15 | ||
15 | /* | 16 | /* |
16 | * pin configurations are represented by 32-bit integers: | 17 | * pin configurations are represented by 32-bit integers: |
@@ -166,8 +167,100 @@ typedef unsigned long pin_cfg_t; | |||
166 | (PIN_CFG_DEFAULT |\ | 167 | (PIN_CFG_DEFAULT |\ |
167 | (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val)) | 168 | (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val)) |
168 | 169 | ||
170 | /* | ||
171 | * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving | ||
172 | * the "gpio" namespace for generic and cross-machine functions | ||
173 | */ | ||
174 | |||
175 | #define GPIO_BLOCK_SHIFT 5 | ||
176 | #define NMK_GPIO_PER_CHIP (1 << GPIO_BLOCK_SHIFT) | ||
177 | |||
178 | /* Register in the logic block */ | ||
179 | #define NMK_GPIO_DAT 0x00 | ||
180 | #define NMK_GPIO_DATS 0x04 | ||
181 | #define NMK_GPIO_DATC 0x08 | ||
182 | #define NMK_GPIO_PDIS 0x0c | ||
183 | #define NMK_GPIO_DIR 0x10 | ||
184 | #define NMK_GPIO_DIRS 0x14 | ||
185 | #define NMK_GPIO_DIRC 0x18 | ||
186 | #define NMK_GPIO_SLPC 0x1c | ||
187 | #define NMK_GPIO_AFSLA 0x20 | ||
188 | #define NMK_GPIO_AFSLB 0x24 | ||
189 | #define NMK_GPIO_LOWEMI 0x28 | ||
190 | |||
191 | #define NMK_GPIO_RIMSC 0x40 | ||
192 | #define NMK_GPIO_FIMSC 0x44 | ||
193 | #define NMK_GPIO_IS 0x48 | ||
194 | #define NMK_GPIO_IC 0x4c | ||
195 | #define NMK_GPIO_RWIMSC 0x50 | ||
196 | #define NMK_GPIO_FWIMSC 0x54 | ||
197 | #define NMK_GPIO_WKS 0x58 | ||
198 | /* These appear in DB8540 and later ASICs */ | ||
199 | #define NMK_GPIO_EDGELEVEL 0x5C | ||
200 | #define NMK_GPIO_LEVEL 0x60 | ||
201 | |||
202 | /* Alternate functions: function C is set in hw by setting both A and B */ | ||
203 | #define NMK_GPIO_ALT_GPIO 0 | ||
204 | #define NMK_GPIO_ALT_A 1 | ||
205 | #define NMK_GPIO_ALT_B 2 | ||
206 | #define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B) | ||
207 | |||
208 | #define NMK_GPIO_ALT_CX_SHIFT 2 | ||
209 | #define NMK_GPIO_ALT_C1 ((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
210 | #define NMK_GPIO_ALT_C2 ((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
211 | #define NMK_GPIO_ALT_C3 ((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
212 | #define NMK_GPIO_ALT_C4 ((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) | ||
213 | |||
214 | /* Pull up/down values */ | ||
215 | enum nmk_gpio_pull { | ||
216 | NMK_GPIO_PULL_NONE, | ||
217 | NMK_GPIO_PULL_UP, | ||
218 | NMK_GPIO_PULL_DOWN, | ||
219 | }; | ||
220 | |||
221 | /* Sleep mode */ | ||
222 | enum nmk_gpio_slpm { | ||
223 | NMK_GPIO_SLPM_INPUT, | ||
224 | NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT, | ||
225 | NMK_GPIO_SLPM_NOCHANGE, | ||
226 | NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE, | ||
227 | }; | ||
228 | |||
229 | /* Older deprecated pin config API that should go away soon */ | ||
169 | extern int nmk_config_pin(pin_cfg_t cfg, bool sleep); | 230 | extern int nmk_config_pin(pin_cfg_t cfg, bool sleep); |
170 | extern int nmk_config_pins(pin_cfg_t *cfgs, int num); | 231 | extern int nmk_config_pins(pin_cfg_t *cfgs, int num); |
171 | extern int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num); | 232 | extern int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num); |
172 | 233 | extern int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode); | |
234 | extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull); | ||
235 | #ifdef CONFIG_PINCTRL_NOMADIK | ||
236 | extern int nmk_gpio_set_mode(int gpio, int gpio_mode); | ||
237 | #else | ||
238 | static inline int nmk_gpio_set_mode(int gpio, int gpio_mode) | ||
239 | { | ||
240 | return -ENODEV; | ||
241 | } | ||
173 | #endif | 242 | #endif |
243 | extern int nmk_gpio_get_mode(int gpio); | ||
244 | |||
245 | extern void nmk_gpio_wakeups_suspend(void); | ||
246 | extern void nmk_gpio_wakeups_resume(void); | ||
247 | |||
248 | extern void nmk_gpio_clocks_enable(void); | ||
249 | extern void nmk_gpio_clocks_disable(void); | ||
250 | |||
251 | extern void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up); | ||
252 | |||
253 | /* | ||
254 | * Platform data to register a block: only the initial gpio/irq number. | ||
255 | */ | ||
256 | struct nmk_gpio_platform_data { | ||
257 | char *name; | ||
258 | int first_gpio; | ||
259 | int first_irq; | ||
260 | int num_gpio; | ||
261 | u32 (*get_secondary_status)(unsigned int bank); | ||
262 | void (*set_ioforce)(bool enable); | ||
263 | bool supports_sleepmode; | ||
264 | }; | ||
265 | |||
266 | #endif /* __PLAT_NOMADIK_GPIO */ | ||