Intel x86 PINCTRL/GPIO controller Pin-muxing on broadwell devices can be described with a node for the PINCTRL master node and a set of child nodes for each required pin state on the SoC. These pin states use phandles and are referred to but a configuration section which lists all pins in the device. The PINCTRL master node requires the following properties: - compatible : "intel,x86-broadwell-pinctrl" Pin state nodes must be sub-nodes of the pinctrl master node. The must have a phandle. They can contain the following optional properties: - mode-gpio - forces the pin into GPIO mode - output-value - sets the default output value of the GPIO, 0 (low, default) or 1 (high) - direction - sets the direction of the gpio, either PIN_INPUT (default) or PIN_OUTPUT - invert - the input pin is inverted - trigger - sets the trigger type, either TRIGGER_EDGE (default) or TRIGGER_LEVEL - sense-disable - the input state sense is disabled - owner 0 sets the owner of the pin, either OWNER_ACPI (default) or ONWER_GPIO - route - sets whether the pin is routed, either PIRQ_APIC_MASK or PIRQ_APIC_ROUTE - irq-enable - the interrupt is enabled - reset-rsmrst - the pin will only be reset by RSMRST - pirq-apic - the pin will be routed to the IOxAPIC The first pin state will be the default, so pins without a configuration will use that. The pin configuration node is also a sub-node of the pinctrl master node, but does not have a phandle. It has a single property: - config - configuration to use for each pin. Each entry has of 3 cells: - GPIO number (0..94) - phandle of configuration (above) - interrupt number (0..15) There should be one entry for each pin (i.e. 95 entries). But missing pins will receive the default configuration. Example: pch_pinctrl { compatible = "intel,x86-broadwell-pinctrl"; /* Put this first: it is the default */ gpio_unused: gpio-unused { mode-gpio; direction = ; owner = ; sense-disable; }; gpio_acpi_sci: acpi-sci { mode-gpio; direction = ; invert; route = ; }; gpio_acpi_smi: acpi-smi { mode-gpio; direction = ; invert; route = ; }; gpio_input: gpio-input { mode-gpio; direction = ; owner = ; }; gpio_input_invert: gpio-input-invert { mode-gpio; direction = ; owner = ; invert; }; gpio_native: gpio-native { }; gpio_out_high: gpio-out-high { mode-gpio; direction = ; output-value = <1>; owner = ; sense-disable; }; gpio_out_low: gpio-out-low { mode-gpio; direction = ; output-value = <0>; owner = ; sense-disable; }; gpio_pirq: gpio-pirq { mode-gpio; direction = ; owner = ; pirq-apic = ; }; soc_gpio@0 { config = <0 &gpio_unused 0>, /* unused */ <1 &gpio_unused 0>, /* unused */ <2 &gpio_unused 0>, /* unused */ <3 &gpio_unused 0>, /* unused */ <4 &gpio_native 0>, /* native: i2c0_sda_gpio4 */ <5 &gpio_native 0>, /* native: i2c0_scl_gpio5 */ <6 &gpio_native 0>, /* native: i2c1_sda_gpio6 */ <7 &gpio_native 0>, /* native: i2c1_scl_gpio7 */ <8 &gpio_acpi_sci 0>, /* pch_lte_wake_l */ <9 &gpio_input_invert 0>,/* trackpad_int_l (wake) */ <10 &gpio_acpi_sci 0>, /* pch_wlan_wake_l */ <11 &gpio_unused 0>, /* unused */ <12 &gpio_unused 0>, /* unused */ <13 &gpio_pirq 3>, /* trackpad_int_l (pirql) */ <14 &gpio_pirq 4>, /* touch_int_l (pirqm) */ <15 &gpio_unused 0>, /* unused (strap) */ <16 &gpio_input 0>, /* pch_wp */ <17 &gpio_unused 0>, /* unused */ <18 &gpio_unused 0>, /* unused */ <19 &gpio_unused 0>, /* unused */ <20 &gpio_native 0>, /* pcie_wlan_clkreq_l */ <21 &gpio_out_high 0>, /* pp3300_ssd_en */ <22 &gpio_unused 0>, /* unused */ <23 &gpio_out_low 0>, /* pp3300_autobahn_en */ <24 &gpio_unused 0>, /* unused */ <25 &gpio_input 0>, /* ec_in_rw */ <26 &gpio_unused 0>, /* unused */ <27 &gpio_acpi_sci 0>, /* pch_wake_l */ <28 &gpio_unused 0>, /* unused */ <29 &gpio_unused 0>, /* unused */ <30 &gpio_native 0>, /* native: pch_suswarn_l */ <31 &gpio_native 0>, /* native: acok_buf */ <32 &gpio_native 0>, /* native: lpc_clkrun_l */ <33 &gpio_native 0>, /* native: ssd_devslp */ <34 &gpio_acpi_smi 0>, /* ec_smi_l */ <35 &gpio_acpi_smi 0>, /* pch_nmi_dbg_l (route in nmi_en) */ <36 &gpio_acpi_sci 0>, /* ec_sci_l */ <37 &gpio_unused 0>, /* unused */ <38 &gpio_unused 0>, /* unused */ <39 &gpio_unused 0>, /* unused */ <40 &gpio_native 0>, /* native: pch_usb1_oc_l */ <41 &gpio_native 0>, /* native: pch_usb2_oc_l */ <42 &gpio_unused 0>, /* wlan_disable_l */ <43 &gpio_out_high 0>, /* pp1800_codec_en */ <44 &gpio_unused 0>, /* unused */ <45 &gpio_acpi_sci 0>, /* dsp_int - codec wake */ <46 &gpio_pirq 6>, /* hotword_det_l_3v3 (pirqo) - codec irq */ <47 &gpio_out_low 0>, /* ssd_reset_l */ <48 &gpio_unused 0>, /* unused */ <49 &gpio_unused 0>, /* unused */ <50 &gpio_unused 0>, /* unused */ <51 &gpio_unused 0>, /* unused */ <52 &gpio_input 0>, /* sim_det */ <53 &gpio_unused 0>, /* unused */ <54 &gpio_unused 0>, /* unused */ <55 &gpio_unused 0>, /* unused */ <56 &gpio_unused 0>, /* unused */ <57 &gpio_out_high 0>, /* codec_reset_l */ <58 &gpio_unused 0>, /* unused */ <59 &gpio_out_high 0>, /* lte_disable_l */ <60 &gpio_unused 0>, /* unused */ <61 &gpio_native 0>, /* native: pch_sus_stat */ <62 &gpio_native 0>, /* native: pch_susclk */ <63 &gpio_native 0>, /* native: pch_slp_s5_l */ <64 &gpio_unused 0>, /* unused */ <65 &gpio_input 0>, /* ram_id3 */ <66 &gpio_input 0>, /* ram_id3_old (strap) */ <67 &gpio_input 0>, /* ram_id0 */ <68 &gpio_input 0>, /* ram_id1 */ <69 &gpio_input 0>, /* ram_id2 */ <70 &gpio_unused 0>, /* unused */ <71 &gpio_native 0>, /* native: modphy_en */ <72 &gpio_unused 0>, /* unused */ <73 &gpio_unused 0>, /* unused */ <74 &gpio_unused 0>, /* unused */ <75 &gpio_unused 0>, /* unused */ <76 &gpio_unused 0>, /* unused */ <77 &gpio_unused 0>, /* unused */ <78 &gpio_unused 0>, /* unused */ <79 &gpio_unused 0>, /* unused */ <80 &gpio_unused 0>, /* unused */ <81 &gpio_unused 0>, /* unused */ <82 &gpio_native 0>, /* native: ec_rcin_l */ <83 &gpio_native 0>, /* gspi0_cs */ <84 &gpio_native 0>, /* gspi0_clk */ <85 &gpio_native 0>, /* gspi0_miso */ <86 &gpio_native 0>, /* gspi0_mosi (strap) */ <87 &gpio_unused 0>, /* unused */ <88 &gpio_unused 0>, /* unused */ <89 &gpio_out_high 0>, /* pp3300_sd_en */ <90 &gpio_unused 0>, /* unused */ <91 &gpio_unused 0>, /* unused */ <92 &gpio_unused 0>, /* unused */ <93 &gpio_unused 0>, /* unused */ <94 &gpio_unused 0 >; /* unused */ }; };