1*4882a593Smuzhiyun* Atmel AT91 Pinmux Controller 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunThe AT91 Pinmux Controller, enables the IC 4*4882a593Smuzhiyunto share one PAD to several functional blocks. The sharing is done by 5*4882a593Smuzhiyunmultiplexing the PAD input/output signals. For each PAD there are up to 6*4882a593Smuzhiyun8 muxing options (called periph modes). Since different modules require 7*4882a593Smuzhiyundifferent PAD settings (like pull up, keeper, etc) the controller controls 8*4882a593Smuzhiyunalso the PAD settings parameters. 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunPlease refer to pinctrl-bindings.txt in this directory for details of the 11*4882a593Smuzhiyuncommon pinctrl bindings used by client devices, including the meaning of the 12*4882a593Smuzhiyunphrase "pin configuration node". 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunAtmel AT91 pin configuration node is a node of a group of pins which can be 15*4882a593Smuzhiyunused for a specific device or function. This node represents both mux and config 16*4882a593Smuzhiyunof the pins in that group. The 'pins' selects the function mode(also named pin 17*4882a593Smuzhiyunmode) this pin can work on and the 'config' configures various pad settings 18*4882a593Smuzhiyunsuch as pull-up, multi drive, etc. 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunRequired properties for iomux controller: 21*4882a593Smuzhiyun- compatible: "atmel,at91rm9200-pinctrl" or "atmel,at91sam9x5-pinctrl" 22*4882a593Smuzhiyun or "atmel,sama5d3-pinctrl" or "microchip,sam9x60-pinctrl" 23*4882a593Smuzhiyun- atmel,mux-mask: array of mask (periph per bank) to describe if a pin can be 24*4882a593Smuzhiyun configured in this periph mode. All the periph and bank need to be describe. 25*4882a593Smuzhiyun 26*4882a593SmuzhiyunHow to create such array: 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunEach column will represent the possible peripheral of the pinctrl 29*4882a593SmuzhiyunEach line will represent a pio bank 30*4882a593Smuzhiyun 31*4882a593SmuzhiyunTake an example on the 9260 32*4882a593SmuzhiyunPeripheral: 2 ( A and B) 33*4882a593SmuzhiyunBank: 3 (A, B and C) 34*4882a593Smuzhiyun=> 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* A B */ 37*4882a593Smuzhiyun 0xffffffff 0xffc00c3b /* pioA */ 38*4882a593Smuzhiyun 0xffffffff 0x7fff3ccf /* pioB */ 39*4882a593Smuzhiyun 0xffffffff 0x007fffff /* pioC */ 40*4882a593Smuzhiyun 41*4882a593SmuzhiyunFor each peripheral/bank we will describe in a u32 if a pin can be 42*4882a593Smuzhiyunconfigured in it by putting 1 to the pin bit (1 << pin) 43*4882a593Smuzhiyun 44*4882a593SmuzhiyunLet's take the pioA on peripheral B 45*4882a593SmuzhiyunFrom the datasheet Table 10-2. 46*4882a593SmuzhiyunPeripheral B 47*4882a593SmuzhiyunPA0 MCDB0 48*4882a593SmuzhiyunPA1 MCCDB 49*4882a593SmuzhiyunPA2 50*4882a593SmuzhiyunPA3 MCDB3 51*4882a593SmuzhiyunPA4 MCDB2 52*4882a593SmuzhiyunPA5 MCDB1 53*4882a593SmuzhiyunPA6 54*4882a593SmuzhiyunPA7 55*4882a593SmuzhiyunPA8 56*4882a593SmuzhiyunPA9 57*4882a593SmuzhiyunPA10 ETX2 58*4882a593SmuzhiyunPA11 ETX3 59*4882a593SmuzhiyunPA12 60*4882a593SmuzhiyunPA13 61*4882a593SmuzhiyunPA14 62*4882a593SmuzhiyunPA15 63*4882a593SmuzhiyunPA16 64*4882a593SmuzhiyunPA17 65*4882a593SmuzhiyunPA18 66*4882a593SmuzhiyunPA19 67*4882a593SmuzhiyunPA20 68*4882a593SmuzhiyunPA21 69*4882a593SmuzhiyunPA22 ETXER 70*4882a593SmuzhiyunPA23 ETX2 71*4882a593SmuzhiyunPA24 ETX3 72*4882a593SmuzhiyunPA25 ERX2 73*4882a593SmuzhiyunPA26 ERX3 74*4882a593SmuzhiyunPA27 ERXCK 75*4882a593SmuzhiyunPA28 ECRS 76*4882a593SmuzhiyunPA29 ECOL 77*4882a593SmuzhiyunPA30 RXD4 78*4882a593SmuzhiyunPA31 TXD4 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun=> 0xffc00c3b 81*4882a593Smuzhiyun 82*4882a593SmuzhiyunRequired properties for pin configuration node: 83*4882a593Smuzhiyun- atmel,pins: 4 integers array, represents a group of pins mux and config 84*4882a593Smuzhiyun setting. The format is atmel,pins = <PIN_BANK PIN_BANK_NUM PERIPH CONFIG>. 85*4882a593Smuzhiyun The PERIPH 0 means gpio, PERIPH 1 is periph A, PERIPH 2 is periph B... 86*4882a593Smuzhiyun PIN_BANK 0 is pioA, PIN_BANK 1 is pioB... 87*4882a593Smuzhiyun 88*4882a593SmuzhiyunBits used for CONFIG: 89*4882a593SmuzhiyunPULL_UP (1 << 0): indicate this pin needs a pull up. 90*4882a593SmuzhiyunMULTIDRIVE (1 << 1): indicate this pin needs to be configured as multi-drive. 91*4882a593Smuzhiyun Multi-drive is equivalent to open-drain type output. 92*4882a593SmuzhiyunDEGLITCH (1 << 2): indicate this pin needs deglitch. 93*4882a593SmuzhiyunPULL_DOWN (1 << 3): indicate this pin needs a pull down. 94*4882a593SmuzhiyunDIS_SCHMIT (1 << 4): indicate this pin needs to the disable schmitt trigger. 95*4882a593SmuzhiyunDRIVE_STRENGTH (3 << 5): indicate the drive strength of the pin using the 96*4882a593Smuzhiyun following values: 97*4882a593Smuzhiyun 00 - No change (reset state value kept) 98*4882a593Smuzhiyun 01 - Low 99*4882a593Smuzhiyun 10 - Medium 100*4882a593Smuzhiyun 11 - High 101*4882a593SmuzhiyunOUTPUT (1 << 7): indicate this pin need to be configured as an output. 102*4882a593SmuzhiyunOUTPUT_VAL (1 << 8): output val (1 = high, 0 = low) 103*4882a593SmuzhiyunSLEWRATE (1 << 9): slew rate of the pin: 0 = disable, 1 = enable 104*4882a593SmuzhiyunDEBOUNCE (1 << 16): indicate this pin needs debounce. 105*4882a593SmuzhiyunDEBOUNCE_VAL (0x3fff << 17): debounce value. 106*4882a593Smuzhiyun 107*4882a593SmuzhiyunNOTE: 108*4882a593SmuzhiyunSome requirements for using atmel,at91rm9200-pinctrl binding: 109*4882a593Smuzhiyun1. We have pin function node defined under at91 controller node to represent 110*4882a593Smuzhiyun what pinmux functions this SoC supports. 111*4882a593Smuzhiyun2. The driver can use the function node's name and pin configuration node's 112*4882a593Smuzhiyun name describe the pin function and group hierarchy. 113*4882a593Smuzhiyun For example, Linux at91 pinctrl driver takes the function node's name 114*4882a593Smuzhiyun as the function name and pin configuration node's name as group name to 115*4882a593Smuzhiyun create the map table. 116*4882a593Smuzhiyun3. Each pin configuration node should have a phandle, devices can set pins 117*4882a593Smuzhiyun configurations by referring to the phandle of that pin configuration node. 118*4882a593Smuzhiyun4. The gpio controller must be describe in the pinctrl simple-bus. 119*4882a593Smuzhiyun 120*4882a593SmuzhiyunFor each bank the required properties are: 121*4882a593Smuzhiyun- compatible: "atmel,at91sam9x5-gpio" or "atmel,at91rm9200-gpio" or 122*4882a593Smuzhiyun "microchip,sam9x60-gpio" 123*4882a593Smuzhiyun- reg: physical base address and length of the controller's registers 124*4882a593Smuzhiyun- interrupts: interrupt outputs from the controller 125*4882a593Smuzhiyun- interrupt-controller: marks the device node as an interrupt controller 126*4882a593Smuzhiyun- #interrupt-cells: should be 2; refer to ../interrupt-controller/interrupts.txt 127*4882a593Smuzhiyun for more details. 128*4882a593Smuzhiyun- gpio-controller 129*4882a593Smuzhiyun- #gpio-cells: should be 2; the first cell is the GPIO number and the second 130*4882a593Smuzhiyun cell specifies GPIO flags as defined in <dt-bindings/gpio/gpio.h>. 131*4882a593Smuzhiyun- clocks: bank clock 132*4882a593Smuzhiyun 133*4882a593SmuzhiyunExamples: 134*4882a593Smuzhiyun 135*4882a593Smuzhiyunpinctrl@fffff400 { 136*4882a593Smuzhiyun #address-cells = <1>; 137*4882a593Smuzhiyun #size-cells = <1>; 138*4882a593Smuzhiyun ranges; 139*4882a593Smuzhiyun compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; 140*4882a593Smuzhiyun reg = <0xfffff400 0x600>; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun pioA: gpio@fffff400 { 143*4882a593Smuzhiyun compatible = "atmel,at91sam9x5-gpio"; 144*4882a593Smuzhiyun reg = <0xfffff400 0x200>; 145*4882a593Smuzhiyun interrupts = <2 IRQ_TYPE_LEVEL_HIGH 1>; 146*4882a593Smuzhiyun #gpio-cells = <2>; 147*4882a593Smuzhiyun gpio-controller; 148*4882a593Smuzhiyun interrupt-controller; 149*4882a593Smuzhiyun #interrupt-cells = <2>; 150*4882a593Smuzhiyun clocks = <&pmc PMC_TYPE_PERIPHERAL 2>; 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun atmel,mux-mask = < 154*4882a593Smuzhiyun /* A B */ 155*4882a593Smuzhiyun 0xffffffff 0xffc00c3b /* pioA */ 156*4882a593Smuzhiyun 0xffffffff 0x7fff3ccf /* pioB */ 157*4882a593Smuzhiyun 0xffffffff 0x007fffff /* pioC */ 158*4882a593Smuzhiyun >; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* shared pinctrl settings */ 161*4882a593Smuzhiyun dbgu { 162*4882a593Smuzhiyun pinctrl_dbgu: dbgu-0 { 163*4882a593Smuzhiyun atmel,pins = 164*4882a593Smuzhiyun <1 14 0x1 0x0 /* PB14 periph A */ 165*4882a593Smuzhiyun 1 15 0x1 0x1>; /* PB15 periph A with pullup */ 166*4882a593Smuzhiyun }; 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun}; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyundbgu: serial@fffff200 { 171*4882a593Smuzhiyun compatible = "atmel,at91sam9260-usart"; 172*4882a593Smuzhiyun reg = <0xfffff200 0x200>; 173*4882a593Smuzhiyun interrupts = <1 4 7>; 174*4882a593Smuzhiyun pinctrl-names = "default"; 175*4882a593Smuzhiyun pinctrl-0 = <&pinctrl_dbgu>; 176*4882a593Smuzhiyun}; 177