Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'armsoc-late' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc

Pull more ARM SoC updates from Olof Johansson:
"A few updates that we merged late but are low risk for regressions for
other platforms (and a few other straggling patches):

- I mis-tagged the 'drivers' branch, and missed 3 patches. Merged in
here. They're for a driver for the PL353 SRAM controller and a
build fix for the qualcomm scm driver.

- A new platform, RDA Micro RDA8810PL (Cortex-A5 w/ integrated
Vivante GPU, 256MB RAM, Wifi). This includes some acked
platform-specific drivers (serial, etc). This also include DTs for
two boards with this SoC, OrangePi 2G and OrangePi i86.

- i.MX8 is another new platform (NXP, 4x Cortex-A53 + Cortex-M4, 4K
video playback offload). This is the first i.MX 64-bit SoC.

- Some minor updates to Samsung boards (adding a few peripherals in
DTs).

- Small rework for SMP bootup on STi platforms.

- A couple of TEE driver fixes.

- A couple of new config options (bcm2835 thermal, Uniphier MDMAC)
enabled in defconfigs"

* tag 'armsoc-late' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (27 commits)
ARM: multi_v7_defconfig: enable CONFIG_UNIPHIER_MDMAC
arm64: defconfig: Re-enable bcm2835-thermal driver
MAINTAINERS: Add entry for RDA Micro SoC architecture
tty: serial: Add RDA8810PL UART driver
ARM: dts: rda8810pl: Add interrupt support for UART
dt-bindings: serial: Document RDA Micro UART
ARM: dts: rda8810pl: Add timer support
ARM: dts: Add devicetree for OrangePi i96 board
ARM: dts: Add devicetree for OrangePi 2G IoT board
ARM: dts: Add devicetree for RDA8810PL SoC
ARM: Prepare RDA8810PL SoC
dt-bindings: arm: Document RDA8810PL and reference boards
dt-bindings: Add RDA Micro vendor prefix
ARM: sti: remove pen_release and boot_lock
arm64: dts: exynos: Add Bluetooth chip to TM2(e) boards
arm64: dts: imx8mq-evk: enable watchdog
arm64: dts: imx8mq: add watchdog devices
MAINTAINERS: add i.MX8 DT path to i.MX architecture
arm64: add support for i.MX8M EVK board
arm64: add basic DTS for i.MX8MQ
...

+3084 -124
+6
Documentation/admin-guide/kernel-parameters.txt
··· 1028 1028 specified address. The serial port must already be 1029 1029 setup and configured. Options are not yet supported. 1030 1030 1031 + rda,<addr> 1032 + Start an early, polled-mode console on a serial port 1033 + of an RDA Micro SoC, such as RDA8810PL, at the 1034 + specified address. The serial port must already be 1035 + setup and configured. Options are not yet supported. 1036 + 1031 1037 smh Use ARM semihosting calls for early console. 1032 1038 1033 1039 s3c2410,<addr>
+17
Documentation/devicetree/bindings/arm/rda.txt
··· 1 + RDA Micro platforms device tree bindings 2 + ---------------------------------------- 3 + 4 + RDA8810PL SoC 5 + ============= 6 + 7 + Required root node properties: 8 + 9 + - compatible : must contain "rda,8810pl" 10 + 11 + 12 + Boards: 13 + 14 + Root node property compatible must contain, depending on board: 15 + 16 + - Orange Pi 2G-IoT: "xunlong,orangepi-2g-iot" 17 + - Orange Pi i96: "xunlong,orangepi-i96"
+47
Documentation/devicetree/bindings/memory-controllers/pl353-smc.txt
··· 1 + Device tree bindings for ARM PL353 static memory controller 2 + 3 + PL353 static memory controller supports two kinds of memory 4 + interfaces.i.e NAND and SRAM/NOR interfaces. 5 + The actual devices are instantiated from the child nodes of pl353 smc node. 6 + 7 + Required properties: 8 + - compatible : Should be "arm,pl353-smc-r2p1", "arm,primecell". 9 + - reg : Controller registers map and length. 10 + - clock-names : List of input clock names - "memclk", "apb_pclk" 11 + (See clock bindings for details). 12 + - clocks : Clock phandles (see clock bindings for details). 13 + - address-cells : Must be 2. 14 + - size-cells : Must be 1. 15 + 16 + Child nodes: 17 + For NAND the "arm,pl353-nand-r2p1" and for NOR the "cfi-flash" drivers are 18 + supported as child nodes. 19 + 20 + for NAND partition information please refer the below file 21 + Documentation/devicetree/bindings/mtd/partition.txt 22 + 23 + Example: 24 + smcc: memory-controller@e000e000 25 + compatible = "arm,pl353-smc-r2p1", "arm,primecell"; 26 + clock-names = "memclk", "apb_pclk"; 27 + clocks = <&clkc 11>, <&clkc 44>; 28 + reg = <0xe000e000 0x1000>; 29 + #address-cells = <2>; 30 + #size-cells = <1>; 31 + ranges = <0x0 0x0 0xe1000000 0x1000000 //Nand CS Region 32 + 0x1 0x0 0xe2000000 0x2000000 //SRAM/NOR CS Region 33 + 0x2 0x0 0xe4000000 0x2000000>; //SRAM/NOR CS Region 34 + nand_0: flash@e1000000 { 35 + compatible = "arm,pl353-nand-r2p1" 36 + reg = <0 0 0x1000000>; 37 + (...) 38 + }; 39 + nor0: flash@e2000000 { 40 + compatible = "cfi-flash"; 41 + reg = <1 0 0x2000000>; 42 + }; 43 + nor1: flash@e4000000 { 44 + compatible = "cfi-flash"; 45 + reg = <2 0 0x2000000>; 46 + }; 47 + };
+17
Documentation/devicetree/bindings/serial/rda,8810pl-uart.txt
··· 1 + RDA Micro UART 2 + 3 + Required properties: 4 + - compatible : "rda,8810pl-uart" for RDA8810PL SoCs. 5 + - reg : Offset and length of the register set for the device. 6 + - interrupts : Should contain UART interrupt. 7 + - clocks : Phandle to the input clock. 8 + 9 + 10 + Example: 11 + 12 + uart2: serial@20a90000 { 13 + compatible = "rda,8810pl-uart"; 14 + reg = <0x20a90000 0x1000>; 15 + interrupts = <11 IRQ_TYPE_LEVEL_HIGH>; 16 + clocks = <&uart_clk>; 17 + };
+1
Documentation/devicetree/bindings/vendor-prefixes.txt
··· 325 325 ramtron Ramtron International 326 326 raspberrypi Raspberry Pi Foundation 327 327 raydium Raydium Semiconductor Corp. 328 + rda Unisoc Communications, Inc. 328 329 realtek Realtek Semiconductor Corp. 329 330 renesas Renesas Electronics Corporation 330 331 richtek Richtek Technology Corporation
+15
MAINTAINERS
··· 1540 1540 F: arch/arm/mach-mxs/ 1541 1541 F: arch/arm/boot/dts/imx* 1542 1542 F: arch/arm/configs/imx*_defconfig 1543 + F: arch/arm64/boot/dts/freescale/imx* 1543 1544 F: drivers/clk/imx/ 1544 1545 F: drivers/firmware/imx/ 1545 1546 F: drivers/soc/imx/ ··· 1967 1966 M: Lennert Buytenhek <kernel@wantstofly.org> 1968 1967 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 1969 1968 S: Maintained 1969 + 1970 + ARM/RDA MICRO ARCHITECTURE 1971 + M: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 1972 + L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 1973 + L: linux-unisoc@lists.infradead.org (moderated for non-subscribers) 1974 + S: Maintained 1975 + F: arch/arm/boot/dts/rda8810pl-* 1976 + F: drivers/clocksource/timer-rda.c 1977 + F: drivers/irqchip/irq-rda-intc.c 1978 + F: drivers/tty/serial/rda-uart.c 1979 + F: Documentation/devicetree/bindings/arm/rda.txt 1980 + F: Documentation/devicetree/bindings/interrupt-controller/rda,8810pl-intc.txt 1981 + F: Documentation/devicetree/bindings/serial/rda,8810pl-uart.txt 1982 + F: Documentation/devicetree/bindings/timer/rda,8810pl-timer.txt 1970 1983 1971 1984 ARM/REALTEK ARCHITECTURE 1972 1985 M: Andreas Färber <afaerber@suse.de>
+2
arch/arm/Kconfig
··· 787 787 788 788 source "arch/arm/mach-qcom/Kconfig" 789 789 790 + source "arch/arm/mach-rda/Kconfig" 791 + 790 792 source "arch/arm/mach-realview/Kconfig" 791 793 792 794 source "arch/arm/mach-rockchip/Kconfig"
+1
arch/arm/Makefile
··· 202 202 machine-$(CONFIG_ARCH_PICOXCELL) += picoxcell 203 203 machine-$(CONFIG_ARCH_PXA) += pxa 204 204 machine-$(CONFIG_ARCH_QCOM) += qcom 205 + machine-$(CONFIG_ARCH_RDA) += rda 205 206 machine-$(CONFIG_ARCH_REALVIEW) += realview 206 207 machine-$(CONFIG_ARCH_ROCKCHIP) += rockchip 207 208 machine-$(CONFIG_ARCH_RPC) += rpc
+3
arch/arm/boot/dts/Makefile
··· 822 822 qcom-msm8974-sony-xperia-castor.dtb \ 823 823 qcom-msm8974-sony-xperia-honami.dtb \ 824 824 qcom-mdm9615-wp8548-mangoh-green.dtb 825 + dtb-$(CONFIG_ARCH_RDA) += \ 826 + rda8810pl-orangepi-2g-iot.dtb \ 827 + rda8810pl-orangepi-i96.dtb 825 828 dtb-$(CONFIG_ARCH_REALVIEW) += \ 826 829 arm-realview-pb1176.dtb \ 827 830 arm-realview-pb11mp.dtb \
+50
arch/arm/boot/dts/rda8810pl-orangepi-2g-iot.dts
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 + /* 3 + * Copyright (c) 2017 Andreas Färber 4 + * Copyright (c) 2018 Manivannan Sadhasivam 5 + */ 6 + 7 + /dts-v1/; 8 + 9 + #include "rda8810pl.dtsi" 10 + 11 + / { 12 + compatible = "xunlong,orangepi-2g-iot", "rda,8810pl"; 13 + model = "Orange Pi 2G-IoT"; 14 + 15 + aliases { 16 + serial0 = &uart1; 17 + serial1 = &uart2; 18 + serial2 = &uart3; 19 + }; 20 + 21 + chosen { 22 + stdout-path = "serial2:921600n8"; 23 + }; 24 + 25 + memory@80000000 { 26 + device_type = "memory"; 27 + reg = <0x80000000 0x10000000>; 28 + }; 29 + 30 + uart_clk: uart-clk { 31 + compatible = "fixed-clock"; 32 + clock-frequency = <921600>; 33 + #clock-cells = <0>; 34 + }; 35 + }; 36 + 37 + &uart1 { 38 + status = "okay"; 39 + clocks = <&uart_clk>; 40 + }; 41 + 42 + &uart2 { 43 + status = "okay"; 44 + clocks = <&uart_clk>; 45 + }; 46 + 47 + &uart3 { 48 + status = "okay"; 49 + clocks = <&uart_clk>; 50 + };
+50
arch/arm/boot/dts/rda8810pl-orangepi-i96.dts
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 + /* 3 + * Copyright (c) 2017 Andreas Färber 4 + * Copyright (c) 2018 Manivannan Sadhasivam 5 + */ 6 + 7 + /dts-v1/; 8 + 9 + #include "rda8810pl.dtsi" 10 + 11 + / { 12 + compatible = "xunlong,orangepi-i96", "rda,8810pl"; 13 + model = "Orange Pi i96"; 14 + 15 + aliases { 16 + serial0 = &uart2; 17 + serial1 = &uart1; 18 + serial2 = &uart3; 19 + }; 20 + 21 + chosen { 22 + stdout-path = "serial2:921600n8"; 23 + }; 24 + 25 + memory@80000000 { 26 + device_type = "memory"; 27 + reg = <0x80000000 0x10000000>; 28 + }; 29 + 30 + uart_clk: uart-clk { 31 + compatible = "fixed-clock"; 32 + clock-frequency = <921600>; 33 + #clock-cells = <0>; 34 + }; 35 + }; 36 + 37 + &uart1 { 38 + status = "okay"; 39 + clocks = <&uart_clk>; 40 + }; 41 + 42 + &uart2 { 43 + status = "okay"; 44 + clocks = <&uart_clk>; 45 + }; 46 + 47 + &uart3 { 48 + status = "okay"; 49 + clocks = <&uart_clk>; 50 + };
+99
arch/arm/boot/dts/rda8810pl.dtsi
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 + /* 3 + * RDA8810PL SoC 4 + * 5 + * Copyright (c) 2017 Andreas Färber 6 + * Copyright (c) 2018 Manivannan Sadhasivam 7 + */ 8 + 9 + #include <dt-bindings/interrupt-controller/irq.h> 10 + 11 + / { 12 + compatible = "rda,8810pl"; 13 + interrupt-parent = <&intc>; 14 + #address-cells = <1>; 15 + #size-cells = <1>; 16 + 17 + cpus { 18 + #address-cells = <1>; 19 + #size-cells = <0>; 20 + 21 + cpu@0 { 22 + device_type = "cpu"; 23 + compatible = "arm,cortex-a5"; 24 + reg = <0x0>; 25 + }; 26 + }; 27 + 28 + sram@100000 { 29 + compatible = "mmio-sram"; 30 + reg = <0x100000 0x10000>; 31 + #address-cells = <1>; 32 + #size-cells = <1>; 33 + ranges; 34 + }; 35 + 36 + apb@20800000 { 37 + compatible = "simple-bus"; 38 + #address-cells = <1>; 39 + #size-cells = <1>; 40 + ranges = <0x0 0x20800000 0x100000>; 41 + 42 + intc: interrupt-controller@0 { 43 + compatible = "rda,8810pl-intc"; 44 + reg = <0x0 0x1000>; 45 + interrupt-controller; 46 + #interrupt-cells = <2>; 47 + }; 48 + }; 49 + 50 + apb@20900000 { 51 + compatible = "simple-bus"; 52 + #address-cells = <1>; 53 + #size-cells = <1>; 54 + ranges = <0x0 0x20900000 0x100000>; 55 + 56 + timer@10000 { 57 + compatible = "rda,8810pl-timer"; 58 + reg = <0x10000 0x1000>; 59 + interrupts = <16 IRQ_TYPE_LEVEL_HIGH>, 60 + <17 IRQ_TYPE_LEVEL_HIGH>; 61 + interrupt-names = "hwtimer", "ostimer"; 62 + }; 63 + }; 64 + 65 + apb@20a00000 { 66 + compatible = "simple-bus"; 67 + #address-cells = <1>; 68 + #size-cells = <1>; 69 + ranges = <0x0 0x20a00000 0x100000>; 70 + 71 + uart1: serial@0 { 72 + compatible = "rda,8810pl-uart"; 73 + reg = <0x0 0x1000>; 74 + interrupts = <9 IRQ_TYPE_LEVEL_HIGH>; 75 + status = "disabled"; 76 + }; 77 + 78 + uart2: serial@10000 { 79 + compatible = "rda,8810pl-uart"; 80 + reg = <0x10000 0x1000>; 81 + interrupts = <10 IRQ_TYPE_LEVEL_HIGH>; 82 + status = "disabled"; 83 + }; 84 + 85 + uart3: serial@90000 { 86 + compatible = "rda,8810pl-uart"; 87 + reg = <0x90000 0x1000>; 88 + interrupts = <11 IRQ_TYPE_LEVEL_HIGH>; 89 + status = "disabled"; 90 + }; 91 + }; 92 + 93 + l2: cache-controller@21100000 { 94 + compatible = "arm,pl310-cache"; 95 + reg = <0x21100000 0x1000>; 96 + cache-unified; 97 + cache-level = <2>; 98 + }; 99 + };
+1
arch/arm/configs/multi_v7_defconfig
··· 867 867 CONFIG_STM32_DMAMUX=y 868 868 CONFIG_STM32_MDMA=y 869 869 CONFIG_TEGRA20_APB_DMA=y 870 + CONFIG_UNIPHIER_MDMAC=y 870 871 CONFIG_XILINX_DMA=y 871 872 CONFIG_QCOM_BAM_DMA=y 872 873 CONFIG_DW_DMAC=y
+7
arch/arm/mach-rda/Kconfig
··· 1 + menuconfig ARCH_RDA 2 + bool "RDA Micro SoCs" 3 + depends on ARCH_MULTI_V7 4 + select RDA_INTC 5 + select RDA_TIMER 6 + help 7 + This enables support for the RDA Micro 8810PL SoC family.
+1
arch/arm/mach-rda/Makefile
··· 1 + obj- += dummy.o
+1 -1
arch/arm/mach-sti/Makefile
··· 1 - obj-$(CONFIG_SMP) += platsmp.o headsmp.o 1 + obj-$(CONFIG_SMP) += platsmp.o 2 2 obj-$(CONFIG_ARCH_STI) += board-dt.o
-43
arch/arm/mach-sti/headsmp.S
··· 1 - /* 2 - * arch/arm/mach-sti/headsmp.S 3 - * 4 - * Copyright (C) 2013 STMicroelectronics (R&D) Limited. 5 - * http://www.st.com 6 - * 7 - * Cloned from linux/arch/arm/mach-vexpress/headsmp.S 8 - * 9 - * Copyright (c) 2003 ARM Limited 10 - * All Rights Reserved 11 - * 12 - * This program is free software; you can redistribute it and/or modify 13 - * it under the terms of the GNU General Public License version 2 as 14 - * published by the Free Software Foundation. 15 - */ 16 - #include <linux/linkage.h> 17 - #include <linux/init.h> 18 - 19 - /* 20 - * ST specific entry point for secondary CPUs. This provides 21 - * a "holding pen" into which all secondary cores are held until we're 22 - * ready for them to initialise. 23 - */ 24 - ENTRY(sti_secondary_startup) 25 - mrc p15, 0, r0, c0, c0, 5 26 - and r0, r0, #15 27 - adr r4, 1f 28 - ldmia r4, {r5, r6} 29 - sub r4, r4, r5 30 - add r6, r6, r4 31 - pen: ldr r7, [r6] 32 - cmp r7, r0 33 - bne pen 34 - 35 - /* 36 - * we've been released from the holding pen: secondary_stack 37 - * should now contain the SVC stack for this core 38 - */ 39 - b secondary_startup 40 - ENDPROC(sti_secondary_startup) 41 - 42 - 1: .long . 43 - .long pen_release
+14 -74
arch/arm/mach-sti/platsmp.c
··· 28 28 29 29 #include "smp.h" 30 30 31 - static void write_pen_release(int val) 32 - { 33 - pen_release = val; 34 - smp_wmb(); 35 - sync_cache_w(&pen_release); 36 - } 37 - 38 - static DEFINE_SPINLOCK(boot_lock); 39 - 40 - static void sti_secondary_init(unsigned int cpu) 41 - { 42 - /* 43 - * let the primary processor know we're out of the 44 - * pen, then head off into the C entry point 45 - */ 46 - write_pen_release(-1); 47 - 48 - /* 49 - * Synchronise with the boot thread. 50 - */ 51 - spin_lock(&boot_lock); 52 - spin_unlock(&boot_lock); 53 - } 31 + static u32 __iomem *cpu_strt_ptr; 54 32 55 33 static int sti_boot_secondary(unsigned int cpu, struct task_struct *idle) 56 34 { 57 - unsigned long timeout; 35 + unsigned long entry_pa = __pa_symbol(secondary_startup); 58 36 59 37 /* 60 - * set synchronisation state between this boot processor 61 - * and the secondary one 38 + * Secondary CPU is initialised and started by a U-BOOTROM firmware. 39 + * Secondary CPU is spinning and waiting for a write at cpu_strt_ptr. 40 + * Writing secondary_startup address at cpu_strt_ptr makes it to 41 + * jump directly to secondary_startup(). 62 42 */ 63 - spin_lock(&boot_lock); 43 + __raw_writel(entry_pa, cpu_strt_ptr); 64 44 65 - /* 66 - * The secondary processor is waiting to be released from 67 - * the holding pen - release it, then wait for it to flag 68 - * that it has been released by resetting pen_release. 69 - * 70 - * Note that "pen_release" is the hardware CPU ID, whereas 71 - * "cpu" is Linux's internal ID. 72 - */ 73 - write_pen_release(cpu_logical_map(cpu)); 45 + /* wmb so that data is actually written before cache flush is done */ 46 + smp_wmb(); 47 + sync_cache_w(cpu_strt_ptr); 74 48 75 - /* 76 - * Send the secondary CPU a soft interrupt, thereby causing 77 - * it to jump to the secondary entrypoint. 78 - */ 79 - arch_send_wakeup_ipi_mask(cpumask_of(cpu)); 80 - 81 - timeout = jiffies + (1 * HZ); 82 - while (time_before(jiffies, timeout)) { 83 - smp_rmb(); 84 - if (pen_release == -1) 85 - break; 86 - 87 - udelay(10); 88 - } 89 - 90 - /* 91 - * now the secondary core is starting up let it run its 92 - * calibrations, then wait for it to finish 93 - */ 94 - spin_unlock(&boot_lock); 95 - 96 - return pen_release != -1 ? -ENOSYS : 0; 49 + return 0; 97 50 } 98 51 99 52 static void __init sti_smp_prepare_cpus(unsigned int max_cpus) 100 53 { 101 54 struct device_node *np; 102 55 void __iomem *scu_base; 103 - u32 __iomem *cpu_strt_ptr; 104 56 u32 release_phys; 105 57 int cpu; 106 - unsigned long entry_pa = __pa_symbol(sti_secondary_startup); 107 58 108 59 np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu"); 109 60 ··· 82 131 } 83 132 84 133 /* 85 - * holding pen is usually configured in SBC DMEM but can also be 86 - * in RAM. 134 + * cpu-release-addr is usually configured in SBC DMEM but can 135 + * also be in RAM. 87 136 */ 88 137 89 138 if (!memblock_is_memory(release_phys)) ··· 93 142 cpu_strt_ptr = 94 143 (u32 __iomem *)phys_to_virt(release_phys); 95 144 96 - __raw_writel(entry_pa, cpu_strt_ptr); 97 - 98 - /* 99 - * wmb so that data is actually written 100 - * before cache flush is done 101 - */ 102 - smp_wmb(); 103 - sync_cache_w(cpu_strt_ptr); 104 - 105 - if (!memblock_is_memory(release_phys)) 106 - iounmap(cpu_strt_ptr); 145 + set_cpu_possible(cpu, true); 107 146 } 108 147 } 109 148 110 149 const struct smp_operations sti_smp_ops __initconst = { 111 150 .smp_prepare_cpus = sti_smp_prepare_cpus, 112 - .smp_secondary_init = sti_secondary_init, 113 151 .smp_boot_secondary = sti_boot_secondary, 114 152 };
+8
arch/arm64/Kconfig.platforms
··· 142 142 - Armada 7K SoC Family 143 143 - Armada 8K SoC Family 144 144 145 + config ARCH_MXC 146 + bool "ARMv8 based NXP i.MX SoC family" 147 + select ARM64_ERRATUM_843419 148 + select ARM64_ERRATUM_845719 149 + help 150 + This enables support for the ARMv8 based SoCs in the 151 + NXP i.MX family. 152 + 145 153 config ARCH_QCOM 146 154 bool "Qualcomm Platforms" 147 155 select GPIOLIB
+14
arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi
··· 1202 1202 status = "okay"; 1203 1203 }; 1204 1204 1205 + &serial_3 { 1206 + status = "okay"; 1207 + 1208 + bluetooth { 1209 + compatible = "brcm,bcm43438-bt"; 1210 + max-speed = <3000000>; 1211 + shutdown-gpios = <&gpd4 0 GPIO_ACTIVE_HIGH>; 1212 + device-wakeup-gpios = <&gpr3 7 GPIO_ACTIVE_HIGH>; 1213 + host-wakeup-gpios = <&gpa2 2 GPIO_ACTIVE_HIGH>; 1214 + clocks = <&s2mps13_osc S2MPS11_CLK_BT>; 1215 + clock-names = "extclk"; 1216 + }; 1217 + }; 1218 + 1205 1219 &spi_1 { 1206 1220 cs-gpios = <&gpd6 3 GPIO_ACTIVE_HIGH>; 1207 1221 status = "okay";
+15
arch/arm64/boot/dts/exynos/exynos5433.dtsi
··· 544 544 power-domains = <&pd_cam1>; 545 545 }; 546 546 547 + cmu_imem: clock-controller@11060000 { 548 + compatible = "samsung,exynos5433-cmu-imem"; 549 + reg = <0x11060000 0x1000>; 550 + #clock-cells = <1>; 551 + 552 + clock-names = "oscclk", 553 + "aclk_imem_sssx_266", 554 + "aclk_imem_266", 555 + "aclk_imem_200"; 556 + clocks = <&xxti>, 557 + <&cmu_top CLK_DIV_ACLK_IMEM_SSSX_266>, 558 + <&cmu_top CLK_DIV_ACLK_IMEM_266>, 559 + <&cmu_top CLK_DIV_ACLK_IMEM_200>; 560 + }; 561 + 547 562 pd_gscl: power-domain@105c4000 { 548 563 compatible = "samsung,exynos5433-pd"; 549 564 reg = <0x105c4000 0x20>;
+2
arch/arm64/boot/dts/freescale/Makefile
··· 18 18 dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls2088a-rdb.dtb 19 19 dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-lx2160a-qds.dtb 20 20 dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-lx2160a-rdb.dtb 21 + 22 + dtb-$(CONFIG_ARCH_MXC) += imx8mq-evk.dtb
+303
arch/arm64/boot/dts/freescale/imx8mq-evk.dts
··· 1 + // SPDX-License-Identifier: (GPL-2.0 OR MIT) 2 + /* 3 + * Copyright 2017 NXP 4 + * Copyright (C) 2017-2018 Pengutronix, Lucas Stach <kernel@pengutronix.de> 5 + */ 6 + 7 + /dts-v1/; 8 + 9 + #include "imx8mq.dtsi" 10 + 11 + / { 12 + model = "NXP i.MX8MQ EVK"; 13 + compatible = "fsl,imx8mq-evk", "fsl,imx8mq"; 14 + 15 + chosen { 16 + stdout-path = &uart1; 17 + }; 18 + 19 + memory@40000000 { 20 + device_type = "memory"; 21 + reg = <0x00000000 0x40000000 0 0xc0000000>; 22 + }; 23 + 24 + reg_usdhc2_vmmc: regulator-vsd-3v3 { 25 + pinctrl-names = "default"; 26 + pinctrl-0 = <&pinctrl_reg_usdhc2>; 27 + compatible = "regulator-fixed"; 28 + regulator-name = "VSD_3V3"; 29 + regulator-min-microvolt = <3300000>; 30 + regulator-max-microvolt = <3300000>; 31 + gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>; 32 + enable-active-high; 33 + }; 34 + }; 35 + 36 + &fec1 { 37 + pinctrl-names = "default"; 38 + pinctrl-0 = <&pinctrl_fec1>; 39 + phy-mode = "rgmii-id"; 40 + status = "okay"; 41 + }; 42 + 43 + &i2c1 { 44 + clock-frequency = <100000>; 45 + pinctrl-names = "default"; 46 + pinctrl-0 = <&pinctrl_i2c1>; 47 + status = "okay"; 48 + 49 + pmic@8 { 50 + compatible = "fsl,pfuze100"; 51 + reg = <0x8>; 52 + 53 + regulators { 54 + sw1a_reg: sw1ab { 55 + regulator-min-microvolt = <825000>; 56 + regulator-max-microvolt = <1100000>; 57 + }; 58 + 59 + sw1c_reg: sw1c { 60 + regulator-min-microvolt = <825000>; 61 + regulator-max-microvolt = <1100000>; 62 + }; 63 + 64 + sw2_reg: sw2 { 65 + regulator-min-microvolt = <1100000>; 66 + regulator-max-microvolt = <1100000>; 67 + regulator-always-on; 68 + }; 69 + 70 + sw3a_reg: sw3ab { 71 + regulator-min-microvolt = <825000>; 72 + regulator-max-microvolt = <1100000>; 73 + regulator-always-on; 74 + }; 75 + 76 + sw4_reg: sw4 { 77 + regulator-min-microvolt = <1800000>; 78 + regulator-max-microvolt = <1800000>; 79 + regulator-always-on; 80 + }; 81 + 82 + swbst_reg: swbst { 83 + regulator-min-microvolt = <5000000>; 84 + regulator-max-microvolt = <5150000>; 85 + }; 86 + 87 + snvs_reg: vsnvs { 88 + regulator-min-microvolt = <1000000>; 89 + regulator-max-microvolt = <3000000>; 90 + regulator-always-on; 91 + }; 92 + 93 + vref_reg: vrefddr { 94 + regulator-always-on; 95 + }; 96 + 97 + vgen1_reg: vgen1 { 98 + regulator-min-microvolt = <800000>; 99 + regulator-max-microvolt = <1550000>; 100 + }; 101 + 102 + vgen2_reg: vgen2 { 103 + regulator-min-microvolt = <850000>; 104 + regulator-max-microvolt = <975000>; 105 + regulator-always-on; 106 + }; 107 + 108 + vgen3_reg: vgen3 { 109 + regulator-min-microvolt = <1675000>; 110 + regulator-max-microvolt = <1975000>; 111 + regulator-always-on; 112 + }; 113 + 114 + vgen4_reg: vgen4 { 115 + regulator-min-microvolt = <1625000>; 116 + regulator-max-microvolt = <1875000>; 117 + regulator-always-on; 118 + }; 119 + 120 + vgen5_reg: vgen5 { 121 + regulator-min-microvolt = <3075000>; 122 + regulator-max-microvolt = <3625000>; 123 + regulator-always-on; 124 + }; 125 + 126 + vgen6_reg: vgen6 { 127 + regulator-min-microvolt = <1800000>; 128 + regulator-max-microvolt = <3300000>; 129 + }; 130 + }; 131 + }; 132 + }; 133 + 134 + &uart1 { 135 + pinctrl-names = "default"; 136 + pinctrl-0 = <&pinctrl_uart1>; 137 + status = "okay"; 138 + }; 139 + 140 + &usdhc1 { 141 + pinctrl-names = "default", "state_100mhz", "state_200mhz"; 142 + pinctrl-0 = <&pinctrl_usdhc1>; 143 + pinctrl-1 = <&pinctrl_usdhc1_100mhz>; 144 + pinctrl-2 = <&pinctrl_usdhc1_200mhz>; 145 + vqmmc-supply = <&sw4_reg>; 146 + bus-width = <8>; 147 + non-removable; 148 + no-sd; 149 + no-sdio; 150 + status = "okay"; 151 + }; 152 + 153 + &usdhc2 { 154 + pinctrl-names = "default", "state_100mhz", "state_200mhz"; 155 + pinctrl-0 = <&pinctrl_usdhc2>; 156 + pinctrl-1 = <&pinctrl_usdhc2_100mhz>; 157 + pinctrl-2 = <&pinctrl_usdhc2_200mhz>; 158 + cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>; 159 + vmmc-supply = <&reg_usdhc2_vmmc>; 160 + status = "okay"; 161 + }; 162 + 163 + &wdog1 { 164 + pinctrl-names = "default"; 165 + pinctrl-0 = <&pinctrl_wdog>; 166 + fsl,ext-reset-output; 167 + status = "okay"; 168 + }; 169 + 170 + &iomuxc { 171 + pinctrl_fec1: fec1grp { 172 + fsl,pins = < 173 + MX8MQ_IOMUXC_ENET_MDC_ENET1_MDC 0x3 174 + MX8MQ_IOMUXC_ENET_MDIO_ENET1_MDIO 0x23 175 + MX8MQ_IOMUXC_ENET_TD3_ENET1_RGMII_TD3 0x1f 176 + MX8MQ_IOMUXC_ENET_TD2_ENET1_RGMII_TD2 0x1f 177 + MX8MQ_IOMUXC_ENET_TD1_ENET1_RGMII_TD1 0x1f 178 + MX8MQ_IOMUXC_ENET_TD0_ENET1_RGMII_TD0 0x1f 179 + MX8MQ_IOMUXC_ENET_RD3_ENET1_RGMII_RD3 0x91 180 + MX8MQ_IOMUXC_ENET_RD2_ENET1_RGMII_RD2 0x91 181 + MX8MQ_IOMUXC_ENET_RD1_ENET1_RGMII_RD1 0x91 182 + MX8MQ_IOMUXC_ENET_RD0_ENET1_RGMII_RD0 0x91 183 + MX8MQ_IOMUXC_ENET_TXC_ENET1_RGMII_TXC 0x1f 184 + MX8MQ_IOMUXC_ENET_RXC_ENET1_RGMII_RXC 0x91 185 + MX8MQ_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL 0x91 186 + MX8MQ_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL 0x1f 187 + MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9 0x19 188 + >; 189 + }; 190 + 191 + pinctrl_i2c1: i2c1grp { 192 + fsl,pins = < 193 + MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL 0x4000007f 194 + MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA 0x4000007f 195 + >; 196 + }; 197 + 198 + pinctrl_reg_usdhc2: regusdhc2grpgpio { 199 + fsl,pins = < 200 + MX8MQ_IOMUXC_SD2_RESET_B_GPIO2_IO19 0x41 201 + >; 202 + }; 203 + 204 + pinctrl_uart1: uart1grp { 205 + fsl,pins = < 206 + MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX 0x49 207 + MX8MQ_IOMUXC_UART1_TXD_UART1_DCE_TX 0x49 208 + >; 209 + }; 210 + 211 + pinctrl_usdhc1: usdhc1grp { 212 + fsl,pins = < 213 + MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x83 214 + MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc3 215 + MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc3 216 + MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc3 217 + MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc3 218 + MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc3 219 + MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc3 220 + MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc3 221 + MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc3 222 + MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc3 223 + MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x83 224 + MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 225 + >; 226 + }; 227 + 228 + pinctrl_usdhc1_100mhz: usdhc1-100grp { 229 + fsl,pins = < 230 + MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x85 231 + MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc5 232 + MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc5 233 + MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc5 234 + MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc5 235 + MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc5 236 + MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc5 237 + MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc5 238 + MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc5 239 + MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc5 240 + MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x85 241 + MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 242 + >; 243 + }; 244 + 245 + pinctrl_usdhc1_200mhz: usdhc1-200grp { 246 + fsl,pins = < 247 + MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x87 248 + MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc7 249 + MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc7 250 + MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc7 251 + MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc7 252 + MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc7 253 + MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc7 254 + MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc7 255 + MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc7 256 + MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc7 257 + MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x87 258 + MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 259 + >; 260 + }; 261 + 262 + pinctrl_usdhc2: usdhc2grp { 263 + fsl,pins = < 264 + MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x83 265 + MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc3 266 + MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc3 267 + MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc3 268 + MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc3 269 + MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc3 270 + MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 271 + >; 272 + }; 273 + 274 + pinctrl_usdhc2_100mhz: usdhc2-100grp { 275 + fsl,pins = < 276 + MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x85 277 + MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc5 278 + MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc5 279 + MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc5 280 + MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc5 281 + MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc5 282 + MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 283 + >; 284 + }; 285 + 286 + pinctrl_usdhc2_200mhz: usdhc2-200grp { 287 + fsl,pins = < 288 + MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x87 289 + MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc7 290 + MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc7 291 + MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc7 292 + MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc7 293 + MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc7 294 + MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 295 + >; 296 + }; 297 + 298 + pinctrl_wdog: wdog1grp { 299 + fsl,pins = < 300 + MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B 0xc6 301 + >; 302 + }; 303 + };
+623
arch/arm64/boot/dts/freescale/imx8mq-pinfunc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2016 Freescale Semiconductor, Inc. 4 + * Copyright 2017 NXP 5 + */ 6 + 7 + #ifndef __DTS_IMX8MQ_PINFUNC_H 8 + #define __DTS_IMX8MQ_PINFUNC_H 9 + 10 + /* 11 + * The pin function ID is a tuple of 12 + * <mux_reg conf_reg input_reg mux_mode input_val> 13 + */ 14 + 15 + #define MX8MQ_IOMUXC_PMIC_STBY_REQ_CCMSRCGPCMIX_PMIC_STBY_REQ 0x014 0x27C 0x000 0x0 0x0 16 + #define MX8MQ_IOMUXC_PMIC_ON_REQ_SNVSMIX_PMIC_ON_REQ 0x018 0x280 0x000 0x0 0x0 17 + #define MX8MQ_IOMUXC_ONOFF_SNVSMIX_ONOFF 0x01C 0x284 0x000 0x0 0x0 18 + #define MX8MQ_IOMUXC_POR_B_SNVSMIX_POR_B 0x020 0x288 0x000 0x0 0x0 19 + #define MX8MQ_IOMUXC_RTC_RESET_B_SNVSMIX_RTC_RESET_B 0x024 0x28C 0x000 0x0 0x0 20 + #define MX8MQ_IOMUXC_GPIO1_IO00_GPIO1_IO0 0x028 0x290 0x000 0x0 0x0 21 + #define MX8MQ_IOMUXC_GPIO1_IO00_CCMSRCGPCMIX_ENET_PHY_REF_CLK_ROOT 0x028 0x290 0x4C0 0x1 0x0 22 + #define MX8MQ_IOMUXC_GPIO1_IO00_ANAMIX_REF_CLK_32K 0x028 0x290 0x000 0x5 0x0 23 + #define MX8MQ_IOMUXC_GPIO1_IO00_CCMSRCGPCMIX_EXT_CLK1 0x028 0x290 0x000 0x6 0x0 24 + #define MX8MQ_IOMUXC_GPIO1_IO00_SJC_FAIL 0x028 0x290 0x000 0x7 0x0 25 + #define MX8MQ_IOMUXC_GPIO1_IO01_GPIO1_IO1 0x02C 0x294 0x000 0x0 0x0 26 + #define MX8MQ_IOMUXC_GPIO1_IO01_PWM1_OUT 0x02C 0x294 0x000 0x1 0x0 27 + #define MX8MQ_IOMUXC_GPIO1_IO01_ANAMIX_REF_CLK_24M 0x02C 0x294 0x4BC 0x5 0x0 28 + #define MX8MQ_IOMUXC_GPIO1_IO01_CCMSRCGPCMIX_EXT_CLK2 0x02C 0x294 0x000 0x6 0x0 29 + #define MX8MQ_IOMUXC_GPIO1_IO01_SJC_ACTIVE 0x02C 0x294 0x000 0x7 0x0 30 + #define MX8MQ_IOMUXC_GPIO1_IO02_GPIO1_IO2 0x030 0x298 0x000 0x0 0x0 31 + #define MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B 0x030 0x298 0x000 0x1 0x0 32 + #define MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_ANY 0x030 0x298 0x000 0x5 0x0 33 + #define MX8MQ_IOMUXC_GPIO1_IO02_SJC_DE_B 0x030 0x298 0x000 0x7 0x0 34 + #define MX8MQ_IOMUXC_GPIO1_IO03_GPIO1_IO3 0x034 0x29C 0x000 0x0 0x0 35 + #define MX8MQ_IOMUXC_GPIO1_IO03_USDHC1_VSELECT 0x034 0x29C 0x000 0x1 0x0 36 + #define MX8MQ_IOMUXC_GPIO1_IO03_SDMA1_EXT_EVENT0 0x034 0x29C 0x000 0x5 0x0 37 + #define MX8MQ_IOMUXC_GPIO1_IO03_ANAMIX_XTAL_OK 0x034 0x29C 0x000 0x6 0x0 38 + #define MX8MQ_IOMUXC_GPIO1_IO03_SJC_DONE 0x034 0x29C 0x000 0x7 0x0 39 + #define MX8MQ_IOMUXC_GPIO1_IO04_GPIO1_IO4 0x038 0x2A0 0x000 0x0 0x0 40 + #define MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0x038 0x2A0 0x000 0x1 0x0 41 + #define MX8MQ_IOMUXC_GPIO1_IO04_SDMA1_EXT_EVENT1 0x038 0x2A0 0x000 0x5 0x0 42 + #define MX8MQ_IOMUXC_GPIO1_IO04_ANAMIX_XTAL_OK_LV 0x038 0x2A0 0x000 0x6 0x0 43 + #define MX8MQ_IOMUXC_GPIO1_IO04_USDHC1_TEST_TRIG 0x038 0x2A0 0x000 0x7 0x0 44 + #define MX8MQ_IOMUXC_GPIO1_IO05_GPIO1_IO5 0x03C 0x2A4 0x000 0x0 0x0 45 + #define MX8MQ_IOMUXC_GPIO1_IO05_M4_NMI 0x03C 0x2A4 0x000 0x1 0x0 46 + #define MX8MQ_IOMUXC_GPIO1_IO05_CCMSRCGPCMIX_PMIC_READY 0x03C 0x2A4 0x000 0x5 0x0 47 + #define MX8MQ_IOMUXC_GPIO1_IO05_CCMSRCGPCMIX_INT_BOOT 0x03C 0x2A4 0x000 0x6 0x0 48 + #define MX8MQ_IOMUXC_GPIO1_IO05_USDHC2_TEST_TRIG 0x03C 0x2A4 0x000 0x7 0x0 49 + #define MX8MQ_IOMUXC_GPIO1_IO06_GPIO1_IO6 0x040 0x2A8 0x000 0x0 0x0 50 + #define MX8MQ_IOMUXC_GPIO1_IO06_ENET1_MDC 0x040 0x2A8 0x000 0x1 0x0 51 + #define MX8MQ_IOMUXC_GPIO1_IO06_USDHC1_CD_B 0x040 0x2A8 0x000 0x5 0x0 52 + #define MX8MQ_IOMUXC_GPIO1_IO06_CCMSRCGPCMIX_EXT_CLK3 0x040 0x2A8 0x000 0x6 0x0 53 + #define MX8MQ_IOMUXC_GPIO1_IO06_ECSPI1_TEST_TRIG 0x040 0x2A8 0x000 0x7 0x0 54 + #define MX8MQ_IOMUXC_GPIO1_IO07_GPIO1_IO7 0x044 0x2AC 0x000 0x0 0x0 55 + #define MX8MQ_IOMUXC_GPIO1_IO07_ENET1_MDIO 0x044 0x2AC 0x000 0x1 0x0 56 + #define MX8MQ_IOMUXC_GPIO1_IO07_USDHC1_WP 0x044 0x2AC 0x000 0x5 0x0 57 + #define MX8MQ_IOMUXC_GPIO1_IO07_CCMSRCGPCMIX_EXT_CLK4 0x044 0x2AC 0x000 0x6 0x0 58 + #define MX8MQ_IOMUXC_GPIO1_IO07_ECSPI2_TEST_TRIG 0x044 0x2AC 0x000 0x7 0x0 59 + #define MX8MQ_IOMUXC_GPIO1_IO08_GPIO1_IO8 0x048 0x2B0 0x000 0x0 0x0 60 + #define MX8MQ_IOMUXC_GPIO1_IO08_ENET1_1588_EVENT0_IN 0x048 0x2B0 0x000 0x1 0x0 61 + #define MX8MQ_IOMUXC_GPIO1_IO08_USDHC2_RESET_B 0x048 0x2B0 0x000 0x5 0x0 62 + #define MX8MQ_IOMUXC_GPIO1_IO08_CCMSRCGPCMIX_WAIT 0x048 0x2B0 0x000 0x6 0x0 63 + #define MX8MQ_IOMUXC_GPIO1_IO08_QSPI_TEST_TRIG 0x048 0x2B0 0x000 0x7 0x0 64 + #define MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9 0x04C 0x2B4 0x000 0x0 0x0 65 + #define MX8MQ_IOMUXC_GPIO1_IO09_ENET1_1588_EVENT0_OUT 0x04C 0x2B4 0x000 0x1 0x0 66 + #define MX8MQ_IOMUXC_GPIO1_IO09_SDMA2_EXT_EVENT0 0x04C 0x2B4 0x000 0x5 0x0 67 + #define MX8MQ_IOMUXC_GPIO1_IO09_CCMSRCGPCMIX_STOP 0x04C 0x2B4 0x000 0x6 0x0 68 + #define MX8MQ_IOMUXC_GPIO1_IO09_RAWNAND_TEST_TRIG 0x04C 0x2B4 0x000 0x7 0x0 69 + #define MX8MQ_IOMUXC_GPIO1_IO10_GPIO1_IO10 0x050 0x2B8 0x000 0x0 0x0 70 + #define MX8MQ_IOMUXC_GPIO1_IO10_USB1_OTG_ID 0x050 0x2B8 0x000 0x1 0x0 71 + #define MX8MQ_IOMUXC_GPIO1_IO10_OCOTP_CTRL_WRAPPER_FUSE_LATCHED 0x050 0x2B8 0x000 0x7 0x0 72 + #define MX8MQ_IOMUXC_GPIO1_IO11_GPIO1_IO11 0x054 0x2BC 0x000 0x0 0x0 73 + #define MX8MQ_IOMUXC_GPIO1_IO11_USB2_OTG_ID 0x054 0x2BC 0x000 0x1 0x0 74 + #define MX8MQ_IOMUXC_GPIO1_IO11_CCMSRCGPCMIX_PMIC_READY 0x054 0x2BC 0x4BC 0x5 0x1 75 + #define MX8MQ_IOMUXC_GPIO1_IO11_CCMSRCGPCMIX_OUT0 0x054 0x2BC 0x000 0x6 0x0 76 + #define MX8MQ_IOMUXC_GPIO1_IO11_CAAM_WRAPPER_RNG_OSC_OBS 0x054 0x2BC 0x000 0x7 0x0 77 + #define MX8MQ_IOMUXC_GPIO1_IO12_GPIO1_IO12 0x058 0x2C0 0x000 0x0 0x0 78 + #define MX8MQ_IOMUXC_GPIO1_IO12_USB1_OTG_PWR 0x058 0x2C0 0x000 0x1 0x0 79 + #define MX8MQ_IOMUXC_GPIO1_IO12_SDMA2_EXT_EVENT1 0x058 0x2C0 0x000 0x5 0x0 80 + #define MX8MQ_IOMUXC_GPIO1_IO12_CCMSRCGPCMIX_OUT1 0x058 0x2C0 0x000 0x6 0x0 81 + #define MX8MQ_IOMUXC_GPIO1_IO12_CSU_CSU_ALARM_AUT0 0x058 0x2C0 0x000 0x7 0x0 82 + #define MX8MQ_IOMUXC_GPIO1_IO13_GPIO1_IO13 0x05C 0x2C4 0x000 0x0 0x0 83 + #define MX8MQ_IOMUXC_GPIO1_IO13_USB1_OTG_OC 0x05C 0x2C4 0x000 0x1 0x0 84 + #define MX8MQ_IOMUXC_GPIO1_IO13_PWM2_OUT 0x05C 0x2C4 0x000 0x5 0x0 85 + #define MX8MQ_IOMUXC_GPIO1_IO13_CCMSRCGPCMIX_OUT2 0x05C 0x2C4 0x000 0x6 0x0 86 + #define MX8MQ_IOMUXC_GPIO1_IO13_CSU_CSU_ALARM_AUT1 0x05C 0x2C4 0x000 0x7 0x0 87 + #define MX8MQ_IOMUXC_GPIO1_IO14_GPIO1_IO14 0x060 0x2C8 0x000 0x0 0x0 88 + #define MX8MQ_IOMUXC_GPIO1_IO14_USB2_OTG_PWR 0x060 0x2C8 0x000 0x1 0x0 89 + #define MX8MQ_IOMUXC_GPIO1_IO14_PWM3_OUT 0x060 0x2C8 0x000 0x5 0x0 90 + #define MX8MQ_IOMUXC_GPIO1_IO14_CCMSRCGPCMIX_CLKO1 0x060 0x2C8 0x000 0x6 0x0 91 + #define MX8MQ_IOMUXC_GPIO1_IO14_CSU_CSU_ALARM_AUT2 0x060 0x2C8 0x000 0x7 0x0 92 + #define MX8MQ_IOMUXC_GPIO1_IO15_GPIO1_IO15 0x064 0x2CC 0x000 0x0 0x0 93 + #define MX8MQ_IOMUXC_GPIO1_IO15_USB2_OTG_OC 0x064 0x2CC 0x000 0x1 0x0 94 + #define MX8MQ_IOMUXC_GPIO1_IO15_PWM4_OUT 0x064 0x2CC 0x000 0x5 0x0 95 + #define MX8MQ_IOMUXC_GPIO1_IO15_CCMSRCGPCMIX_CLKO2 0x064 0x2CC 0x000 0x6 0x0 96 + #define MX8MQ_IOMUXC_GPIO1_IO15_CSU_CSU_INT_DEB 0x064 0x2CC 0x000 0x7 0x0 97 + #define MX8MQ_IOMUXC_ENET_MDC_ENET1_MDC 0x068 0x2D0 0x000 0x0 0x0 98 + #define MX8MQ_IOMUXC_ENET_MDC_GPIO1_IO16 0x068 0x2D0 0x000 0x5 0x0 99 + #define MX8MQ_IOMUXC_ENET_MDIO_ENET1_MDIO 0x06C 0x2D4 0x4C0 0x0 0x1 100 + #define MX8MQ_IOMUXC_ENET_MDIO_GPIO1_IO17 0x06C 0x2D4 0x000 0x5 0x0 101 + #define MX8MQ_IOMUXC_ENET_TD3_ENET1_RGMII_TD3 0x070 0x2D8 0x000 0x0 0x0 102 + #define MX8MQ_IOMUXC_ENET_TD3_GPIO1_IO18 0x070 0x2D8 0x000 0x5 0x0 103 + #define MX8MQ_IOMUXC_ENET_TD2_ENET1_RGMII_TD2 0x074 0x2DC 0x000 0x0 0x0 104 + #define MX8MQ_IOMUXC_ENET_TD2_ENET1_TX_CLK 0x074 0x2DC 0x000 0x1 0x0 105 + #define MX8MQ_IOMUXC_ENET_TD2_GPIO1_IO19 0x074 0x2DC 0x000 0x5 0x0 106 + #define MX8MQ_IOMUXC_ENET_TD1_ENET1_RGMII_TD1 0x078 0x2E0 0x000 0x0 0x0 107 + #define MX8MQ_IOMUXC_ENET_TD1_GPIO1_IO20 0x078 0x2E0 0x000 0x5 0x0 108 + #define MX8MQ_IOMUXC_ENET_TD0_ENET1_RGMII_TD0 0x07C 0x2E4 0x000 0x0 0x0 109 + #define MX8MQ_IOMUXC_ENET_TD0_GPIO1_IO21 0x07C 0x2E4 0x000 0x5 0x0 110 + #define MX8MQ_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL 0x080 0x2E8 0x000 0x0 0x0 111 + #define MX8MQ_IOMUXC_ENET_TX_CTL_GPIO1_IO22 0x080 0x2E8 0x000 0x5 0x0 112 + #define MX8MQ_IOMUXC_ENET_TXC_ENET1_RGMII_TXC 0x084 0x2EC 0x000 0x0 0x0 113 + #define MX8MQ_IOMUXC_ENET_TXC_ENET1_TX_ER 0x084 0x2EC 0x000 0x1 0x0 114 + #define MX8MQ_IOMUXC_ENET_TXC_GPIO1_IO23 0x084 0x2EC 0x000 0x5 0x0 115 + #define MX8MQ_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL 0x088 0x2F0 0x000 0x0 0x0 116 + #define MX8MQ_IOMUXC_ENET_RX_CTL_GPIO1_IO24 0x088 0x2F0 0x000 0x5 0x0 117 + #define MX8MQ_IOMUXC_ENET_RXC_ENET1_RGMII_RXC 0x08C 0x2F4 0x000 0x0 0x0 118 + #define MX8MQ_IOMUXC_ENET_RXC_ENET1_RX_ER 0x08C 0x2F4 0x000 0x1 0x0 119 + #define MX8MQ_IOMUXC_ENET_RXC_GPIO1_IO25 0x08C 0x2F4 0x000 0x5 0x0 120 + #define MX8MQ_IOMUXC_ENET_RD0_ENET1_RGMII_RD0 0x090 0x2F8 0x000 0x0 0x0 121 + #define MX8MQ_IOMUXC_ENET_RD0_GPIO1_IO26 0x090 0x2F8 0x000 0x5 0x0 122 + #define MX8MQ_IOMUXC_ENET_RD1_ENET1_RGMII_RD1 0x094 0x2FC 0x000 0x0 0x0 123 + #define MX8MQ_IOMUXC_ENET_RD1_GPIO1_IO27 0x094 0x2FC 0x000 0x5 0x0 124 + #define MX8MQ_IOMUXC_ENET_RD2_ENET1_RGMII_RD2 0x098 0x300 0x000 0x0 0x0 125 + #define MX8MQ_IOMUXC_ENET_RD2_GPIO1_IO28 0x098 0x300 0x000 0x5 0x0 126 + #define MX8MQ_IOMUXC_ENET_RD3_ENET1_RGMII_RD3 0x09C 0x304 0x000 0x0 0x0 127 + #define MX8MQ_IOMUXC_ENET_RD3_GPIO1_IO29 0x09C 0x304 0x000 0x5 0x0 128 + #define MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x0A0 0x308 0x000 0x0 0x0 129 + #define MX8MQ_IOMUXC_SD1_CLK_GPIO2_IO0 0x0A0 0x308 0x000 0x5 0x0 130 + #define MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0x0A4 0x30C 0x000 0x0 0x0 131 + #define MX8MQ_IOMUXC_SD1_CMD_GPIO2_IO1 0x0A4 0x30C 0x000 0x5 0x0 132 + #define MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0x0A8 0x310 0x000 0x0 0x0 133 + #define MX8MQ_IOMUXC_SD1_DATA0_GPIO2_IO2 0x0A8 0x31 0x000 0x5 0x0 134 + #define MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0x0AC 0x314 0x000 0x0 0x0 135 + #define MX8MQ_IOMUXC_SD1_DATA1_GPIO2_IO3 0x0AC 0x314 0x000 0x5 0x0 136 + #define MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0x0B0 0x318 0x000 0x0 0x0 137 + #define MX8MQ_IOMUXC_SD1_DATA2_GPIO2_IO4 0x0B0 0x318 0x000 0x5 0x0 138 + #define MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0x0B4 0x31C 0x000 0x0 0x0 139 + #define MX8MQ_IOMUXC_SD1_DATA3_GPIO2_IO5 0x0B4 0x31C 0x000 0x5 0x0 140 + #define MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0x0B8 0x320 0x000 0x0 0x0 141 + #define MX8MQ_IOMUXC_SD1_DATA4_GPIO2_IO6 0x0B8 0x320 0x000 0x5 0x0 142 + #define MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0x0BC 0x324 0x000 0x0 0x0 143 + #define MX8MQ_IOMUXC_SD1_DATA5_GPIO2_IO7 0x0BC 0x324 0x000 0x5 0x0 144 + #define MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0x0C0 0x328 0x000 0x0 0x0 145 + #define MX8MQ_IOMUXC_SD1_DATA6_GPIO2_IO8 0x0C0 0x328 0x000 0x5 0x0 146 + #define MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0x0C4 0x32C 0x000 0x0 0x0 147 + #define MX8MQ_IOMUXC_SD1_DATA7_GPIO2_IO9 0x0C4 0x32C 0x000 0x5 0x0 148 + #define MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0x0C8 0x330 0x000 0x0 0x0 149 + #define MX8MQ_IOMUXC_SD1_RESET_B_GPIO2_IO10 0x0C8 0x330 0x000 0x5 0x0 150 + #define MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x0CC 0x334 0x000 0x0 0x0 151 + #define MX8MQ_IOMUXC_SD1_STROBE_GPIO2_IO11 0x0CC 0x334 0x000 0x5 0x0 152 + #define MX8MQ_IOMUXC_SD2_CD_B_USDHC2_CD_B 0x0D0 0x338 0x000 0x0 0x0 153 + #define MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12 0x0D0 0x338 0x000 0x5 0x0 154 + #define MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x0D4 0x33C 0x000 0x0 0x0 155 + #define MX8MQ_IOMUXC_SD2_CLK_GPIO2_IO13 0x0D4 0x33C 0x000 0x5 0x0 156 + #define MX8MQ_IOMUXC_SD2_CLK_CCMSRCGPCMIX_OBSERVE0 0x0D4 0x33C 0x000 0x6 0x0 157 + #define MX8MQ_IOMUXC_SD2_CLK_OBSERVE_MUX_OUT0 0x0D4 0x33C 0x000 0x7 0x0 158 + #define MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0x0D8 0x340 0x000 0x0 0x0 159 + #define MX8MQ_IOMUXC_SD2_CMD_GPIO2_IO14 0x0D8 0x340 0x000 0x5 0x0 160 + #define MX8MQ_IOMUXC_SD2_CMD_CCMSRCGPCMIX_OBSERVE1 0x0D8 0x340 0x000 0x6 0x0 161 + #define MX8MQ_IOMUXC_SD2_CMD_OBSERVE_MUX_OUT1 0x0D8 0x340 0x000 0x7 0x0 162 + #define MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0x0DC 0x344 0x000 0x0 0x0 163 + #define MX8MQ_IOMUXC_SD2_DATA0_GPIO2_IO15 0x0DC 0x344 0x000 0x5 0x0 164 + #define MX8MQ_IOMUXC_SD2_DATA0_CCMSRCGPCMIX_OBSERVE2 0x0DC 0x344 0x000 0x6 0x0 165 + #define MX8MQ_IOMUXC_SD2_DATA0_OBSERVE_MUX_OUT2 0x0DC 0x344 0x000 0x7 0x0 166 + #define MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0x0E0 0x348 0x000 0x0 0x0 167 + #define MX8MQ_IOMUXC_SD2_DATA1_GPIO2_IO16 0x0E0 0x348 0x000 0x5 0x0 168 + #define MX8MQ_IOMUXC_SD2_DATA1_CCMSRCGPCMIX_WAIT 0x0E0 0x348 0x000 0x6 0x0 169 + #define MX8MQ_IOMUXC_SD2_DATA1_OBSERVE_MUX_OUT3 0x0E0 0x348 0x000 0x7 0x0 170 + #define MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0x0E4 0x34C 0x000 0x0 0x0 171 + #define MX8MQ_IOMUXC_SD2_DATA2_GPIO2_IO17 0x0E4 0x34C 0x000 0x5 0x0 172 + #define MX8MQ_IOMUXC_SD2_DATA2_CCMSRCGPCMIX_STOP 0x0E4 0x34C 0x000 0x6 0x0 173 + #define MX8MQ_IOMUXC_SD2_DATA2_OBSERVE_MUX_OUT4 0x0E4 0x34C 0x000 0x7 0x0 174 + #define MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0x0E8 0x350 0x000 0x0 0x0 175 + #define MX8MQ_IOMUXC_SD2_DATA3_GPIO2_IO18 0x0E8 0x350 0x000 0x5 0x0 176 + #define MX8MQ_IOMUXC_SD2_DATA3_CCMSRCGPCMIX_EARLY_RESET 0x0E8 0x350 0x000 0x6 0x0 177 + #define MX8MQ_IOMUXC_SD2_RESET_B_USDHC2_RESET_B 0x0EC 0x354 0x000 0x0 0x0 178 + #define MX8MQ_IOMUXC_SD2_RESET_B_GPIO2_IO19 0x0EC 0x354 0x000 0x5 0x0 179 + #define MX8MQ_IOMUXC_SD2_RESET_B_CCMSRCGPCMIX_SYSTEM_RESET 0x0EC 0x354 0x000 0x6 0x0 180 + #define MX8MQ_IOMUXC_SD2_WP_USDHC2_WP 0x0F0 0x358 0x000 0x0 0x0 181 + #define MX8MQ_IOMUXC_SD2_WP_GPIO2_IO20 0x0F0 0x358 0x000 0x5 0x0 182 + #define MX8MQ_IOMUXC_SD2_WP_SIM_M_HMASTLOCK 0x0F0 0x358 0x000 0x7 0x0 183 + #define MX8MQ_IOMUXC_NAND_ALE_RAWNAND_ALE 0x0F4 0x35C 0x000 0x0 0x0 184 + #define MX8MQ_IOMUXC_NAND_ALE_QSPI_A_SCLK 0x0F4 0x35C 0x000 0x1 0x0 185 + #define MX8MQ_IOMUXC_NAND_ALE_GPIO3_IO0 0x0F4 0x35C 0x000 0x5 0x0 186 + #define MX8MQ_IOMUXC_NAND_ALE_SIM_M_HPROT0 0x0F4 0x35C 0x000 0x7 0x0 187 + #define MX8MQ_IOMUXC_NAND_CE0_B_RAWNAND_CE0_B 0x0F8 0x360 0x000 0x0 0x0 188 + #define MX8MQ_IOMUXC_NAND_CE0_B_QSPI_A_SS0_B 0x0F8 0x360 0x000 0x1 0x0 189 + #define MX8MQ_IOMUXC_NAND_CE0_B_GPIO3_IO1 0x0F8 0x360 0x000 0x5 0x0 190 + #define MX8MQ_IOMUXC_NAND_CE0_B_SIM_M_HPROT1 0x0F8 0x360 0x000 0x7 0x0 191 + #define MX8MQ_IOMUXC_NAND_CE1_B_RAWNAND_CE1_B 0x0FC 0x364 0x000 0x0 0x0 192 + #define MX8MQ_IOMUXC_NAND_CE1_B_QSPI_A_SS1_B 0x0FC 0x364 0x000 0x1 0x0 193 + #define MX8MQ_IOMUXC_NAND_CE1_B_GPIO3_IO2 0x0FC 0x364 0x000 0x5 0x0 194 + #define MX8MQ_IOMUXC_NAND_CE1_B_SIM_M_HPROT2 0x0FC 0x364 0x000 0x7 0x0 195 + #define MX8MQ_IOMUXC_NAND_CE2_B_RAWNAND_CE2_B 0x100 0x368 0x000 0x0 0x0 196 + #define MX8MQ_IOMUXC_NAND_CE2_B_QSPI_B_SS0_B 0x100 0x368 0x000 0x1 0x0 197 + #define MX8MQ_IOMUXC_NAND_CE2_B_GPIO3_IO3 0x100 0x368 0x000 0x5 0x0 198 + #define MX8MQ_IOMUXC_NAND_CE2_B_SIM_M_HPROT3 0x100 0x368 0x000 0x7 0x0 199 + #define MX8MQ_IOMUXC_NAND_CE3_B_RAWNAND_CE3_B 0x104 0x36C 0x000 0x0 0x0 200 + #define MX8MQ_IOMUXC_NAND_CE3_B_QSPI_B_SS1_B 0x104 0x36C 0x000 0x1 0x0 201 + #define MX8MQ_IOMUXC_NAND_CE3_B_GPIO3_IO4 0x104 0x36C 0x000 0x5 0x0 202 + #define MX8MQ_IOMUXC_NAND_CE3_B_SIM_M_HADDR0 0x104 0x36C 0x000 0x7 0x0 203 + #define MX8MQ_IOMUXC_NAND_CLE_RAWNAND_CLE 0x108 0x370 0x000 0x0 0x0 204 + #define MX8MQ_IOMUXC_NAND_CLE_QSPI_B_SCLK 0x108 0x370 0x000 0x1 0x0 205 + #define MX8MQ_IOMUXC_NAND_CLE_GPIO3_IO5 0x108 0x370 0x000 0x5 0x0 206 + #define MX8MQ_IOMUXC_NAND_CLE_SIM_M_HADDR1 0x108 0x370 0x000 0x7 0x0 207 + #define MX8MQ_IOMUXC_NAND_DATA00_RAWNAND_DATA00 0x10C 0x374 0x000 0x0 0x0 208 + #define MX8MQ_IOMUXC_NAND_DATA00_QSPI_A_DATA0 0x10C 0x374 0x000 0x1 0x0 209 + #define MX8MQ_IOMUXC_NAND_DATA00_GPIO3_IO6 0x10C 0x374 0x000 0x5 0x0 210 + #define MX8MQ_IOMUXC_NAND_DATA00_SIM_M_HADDR2 0x10C 0x374 0x000 0x7 0x0 211 + #define MX8MQ_IOMUXC_NAND_DATA01_RAWNAND_DATA01 0x110 0x378 0x000 0x0 0x0 212 + #define MX8MQ_IOMUXC_NAND_DATA01_QSPI_A_DATA1 0x110 0x378 0x000 0x1 0x0 213 + #define MX8MQ_IOMUXC_NAND_DATA01_GPIO3_IO7 0x110 0x378 0x000 0x5 0x0 214 + #define MX8MQ_IOMUXC_NAND_DATA01_SIM_M_HADDR3 0x110 0x378 0x000 0x7 0x0 215 + #define MX8MQ_IOMUXC_NAND_DATA02_RAWNAND_DATA02 0x114 0x37C 0x000 0x0 0x0 216 + #define MX8MQ_IOMUXC_NAND_DATA02_QSPI_A_DATA2 0x114 0x37C 0x000 0x1 0x0 217 + #define MX8MQ_IOMUXC_NAND_DATA02_GPIO3_IO8 0x114 0x37C 0x000 0x5 0x0 218 + #define MX8MQ_IOMUXC_NAND_DATA02_SIM_M_HADDR4 0x114 0x37C 0x000 0x7 0x0 219 + #define MX8MQ_IOMUXC_NAND_DATA03_RAWNAND_DATA03 0x118 0x380 0x000 0x0 0x0 220 + #define MX8MQ_IOMUXC_NAND_DATA03_QSPI_A_DATA3 0x118 0x380 0x000 0x1 0x0 221 + #define MX8MQ_IOMUXC_NAND_DATA03_GPIO3_IO9 0x118 0x380 0x000 0x5 0x0 222 + #define MX8MQ_IOMUXC_NAND_DATA03_SIM_M_HADDR5 0x118 0x380 0x000 0x7 0x0 223 + #define MX8MQ_IOMUXC_NAND_DATA04_RAWNAND_DATA04 0x11C 0x384 0x000 0x0 0x0 224 + #define MX8MQ_IOMUXC_NAND_DATA04_QSPI_B_DATA0 0x11C 0x384 0x000 0x1 0x0 225 + #define MX8MQ_IOMUXC_NAND_DATA04_GPIO3_IO10 0x11C 0x384 0x000 0x5 0x0 226 + #define MX8MQ_IOMUXC_NAND_DATA04_SIM_M_HADDR6 0x11C 0x384 0x000 0x7 0x0 227 + #define MX8MQ_IOMUXC_NAND_DATA05_RAWNAND_DATA05 0x120 0x388 0x000 0x0 0x0 228 + #define MX8MQ_IOMUXC_NAND_DATA05_QSPI_B_DATA1 0x120 0x388 0x000 0x1 0x0 229 + #define MX8MQ_IOMUXC_NAND_DATA05_GPIO3_IO11 0x120 0x388 0x000 0x5 0x0 230 + #define MX8MQ_IOMUXC_NAND_DATA05_SIM_M_HADDR7 0x120 0x388 0x000 0x7 0x0 231 + #define MX8MQ_IOMUXC_NAND_DATA06_RAWNAND_DATA06 0x124 0x38C 0x000 0x0 0x0 232 + #define MX8MQ_IOMUXC_NAND_DATA06_QSPI_B_DATA2 0x124 0x38C 0x000 0x1 0x0 233 + #define MX8MQ_IOMUXC_NAND_DATA06_GPIO3_IO12 0x124 0x38C 0x000 0x5 0x0 234 + #define MX8MQ_IOMUXC_NAND_DATA06_SIM_M_HADDR8 0x124 0x38C 0x000 0x7 0x0 235 + #define MX8MQ_IOMUXC_NAND_DATA07_RAWNAND_DATA07 0x128 0x390 0x000 0x0 0x0 236 + #define MX8MQ_IOMUXC_NAND_DATA07_QSPI_B_DATA3 0x128 0x390 0x000 0x1 0x0 237 + #define MX8MQ_IOMUXC_NAND_DATA07_GPIO3_IO13 0x128 0x390 0x000 0x5 0x0 238 + #define MX8MQ_IOMUXC_NAND_DATA07_SIM_M_HADDR9 0x128 0x390 0x000 0x7 0x0 239 + #define MX8MQ_IOMUXC_NAND_DQS_RAWNAND_DQS 0x12C 0x394 0x000 0x0 0x0 240 + #define MX8MQ_IOMUXC_NAND_DQS_QSPI_A_DQS 0x12C 0x394 0x000 0x1 0x0 241 + #define MX8MQ_IOMUXC_NAND_DQS_GPIO3_IO14 0x12C 0x394 0x000 0x5 0x0 242 + #define MX8MQ_IOMUXC_NAND_DQS_SIM_M_HADDR10 0x12C 0x394 0x000 0x7 0x0 243 + #define MX8MQ_IOMUXC_NAND_RE_B_RAWNAND_RE_B 0x130 0x398 0x000 0x0 0x0 244 + #define MX8MQ_IOMUXC_NAND_RE_B_QSPI_B_DQS 0x130 0x398 0x000 0x1 0x0 245 + #define MX8MQ_IOMUXC_NAND_RE_B_GPIO3_IO15 0x130 0x398 0x000 0x5 0x0 246 + #define MX8MQ_IOMUXC_NAND_RE_B_SIM_M_HADDR11 0x130 0x398 0x000 0x7 0x0 247 + #define MX8MQ_IOMUXC_NAND_READY_B_RAWNAND_READY_B 0x134 0x39C 0x000 0x0 0x0 248 + #define MX8MQ_IOMUXC_NAND_READY_B_GPIO3_IO16 0x134 0x39C 0x000 0x5 0x0 249 + #define MX8MQ_IOMUXC_NAND_READY_B_SIM_M_HADDR12 0x134 0x39C 0x000 0x7 0x0 250 + #define MX8MQ_IOMUXC_NAND_WE_B_RAWNAND_WE_B 0x138 0x3A0 0x000 0x0 0x0 251 + #define MX8MQ_IOMUXC_NAND_WE_B_GPIO3_IO17 0x138 0x3A0 0x000 0x5 0x0 252 + #define MX8MQ_IOMUXC_NAND_WE_B_SIM_M_HADDR13 0x138 0x3A0 0x000 0x7 0x0 253 + #define MX8MQ_IOMUXC_NAND_WP_B_RAWNAND_WP_B 0x13C 0x3A4 0x000 0x0 0x0 254 + #define MX8MQ_IOMUXC_NAND_WP_B_GPIO3_IO18 0x13C 0x3A4 0x000 0x5 0x0 255 + #define MX8MQ_IOMUXC_NAND_WP_B_SIM_M_HADDR14 0x13C 0x3A4 0x000 0x7 0x0 256 + #define MX8MQ_IOMUXC_SAI5_RXFS_SAI5_RX_SYNC 0x140 0x3A8 0x4E4 0x0 0x0 257 + #define MX8MQ_IOMUXC_SAI5_RXFS_SAI1_TX_DATA0 0x140 0x3A8 0x000 0x1 0x0 258 + #define MX8MQ_IOMUXC_SAI5_RXFS_GPIO3_IO19 0x140 0x3A8 0x000 0x5 0x0 259 + #define MX8MQ_IOMUXC_SAI5_RXC_SAI5_RX_BCLK 0x144 0x3AC 0x4D0 0x0 0x0 260 + #define MX8MQ_IOMUXC_SAI5_RXC_SAI1_TX_DATA1 0x144 0x3AC 0x000 0x1 0x0 261 + #define MX8MQ_IOMUXC_SAI5_RXC_GPIO3_IO20 0x144 0x3AC 0x000 0x5 0x0 262 + #define MX8MQ_IOMUXC_SAI5_RXD0_SAI5_RX_DATA0 0x148 0x3B0 0x4D4 0x0 0x0 263 + #define MX8MQ_IOMUXC_SAI5_RXD0_SAI1_TX_DATA2 0x148 0x3B0 0x000 0x1 0x0 264 + #define MX8MQ_IOMUXC_SAI5_RXD0_GPIO3_IO21 0x148 0x3B0 0x000 0x5 0x0 265 + #define MX8MQ_IOMUXC_SAI5_RXD1_SAI5_RX_DATA1 0x14C 0x3B4 0x4D8 0x0 0x0 266 + #define MX8MQ_IOMUXC_SAI5_RXD1_SAI1_TX_DATA3 0x14C 0x3B4 0x000 0x1 0x0 267 + #define MX8MQ_IOMUXC_SAI5_RXD1_SAI1_TX_SYNC 0x14C 0x3B4 0x4CC 0x2 0x0 268 + #define MX8MQ_IOMUXC_SAI5_RXD1_SAI5_TX_SYNC 0x14C 0x3B4 0x4EC 0x3 0x0 269 + #define MX8MQ_IOMUXC_SAI5_RXD1_GPIO3_IO22 0x14C 0x3B4 0x000 0x5 0x0 270 + #define MX8MQ_IOMUXC_SAI5_RXD2_SAI5_RX_DATA2 0x150 0x3B8 0x4DC 0x0 0x0 271 + #define MX8MQ_IOMUXC_SAI5_RXD2_SAI1_TX_DATA4 0x150 0x3B8 0x000 0x1 0x0 272 + #define MX8MQ_IOMUXC_SAI5_RXD2_SAI1_TX_SYNC 0x150 0x3B8 0x4CC 0x2 0x1 273 + #define MX8MQ_IOMUXC_SAI5_RXD2_SAI5_TX_BCLK 0x150 0x3B8 0x4E8 0x3 0x0 274 + #define MX8MQ_IOMUXC_SAI5_RXD2_GPIO3_IO23 0x150 0x3B8 0x000 0x5 0x0 275 + #define MX8MQ_IOMUXC_SAI5_RXD3_SAI5_RX_DATA3 0x154 0x3BC 0x4E0 0x0 0x0 276 + #define MX8MQ_IOMUXC_SAI5_RXD3_SAI1_TX_DATA5 0x154 0x3BC 0x000 0x1 0x0 277 + #define MX8MQ_IOMUXC_SAI5_RXD3_SAI1_TX_SYNC 0x154 0x3BC 0x4CC 0x2 0x2 278 + #define MX8MQ_IOMUXC_SAI5_RXD3_SAI5_TX_DATA0 0x154 0x3BC 0x000 0x3 0x0 279 + #define MX8MQ_IOMUXC_SAI5_RXD3_GPIO3_IO24 0x154 0x3BC 0x000 0x5 0x0 280 + #define MX8MQ_IOMUXC_SAI5_MCLK_SAI5_MCLK 0x158 0x3C0 0x52C 0x0 0x0 281 + #define MX8MQ_IOMUXC_SAI5_MCLK_SAI1_TX_BCLK 0x158 0x3C0 0x4C8 0x1 0x0 282 + #define MX8MQ_IOMUXC_SAI5_MCLK_SAI4_MCLK 0x158 0x3C0 0x000 0x2 0x0 283 + #define MX8MQ_IOMUXC_SAI5_MCLK_GPIO3_IO25 0x158 0x3C0 0x000 0x5 0x0 284 + #define MX8MQ_IOMUXC_SAI5_MCLK_CCMSRCGPCMIX_TESTER_ACK 0x158 0x3C0 0x000 0x6 0x0 285 + #define MX8MQ_IOMUXC_SAI1_RXFS_SAI1_RX_SYNC 0x15C 0x3C4 0x4C4 0x0 0x0 286 + #define MX8MQ_IOMUXC_SAI1_RXFS_SAI5_RX_SYNC 0x15C 0x3C4 0x4E4 0x1 0x1 287 + #define MX8MQ_IOMUXC_SAI1_RXFS_CORESIGHT_TRACE_CLK 0x15C 0x3C4 0x000 0x4 0x0 288 + #define MX8MQ_IOMUXC_SAI1_RXFS_GPIO4_IO0 0x15C 0x3C4 0x000 0x5 0x0 289 + #define MX8MQ_IOMUXC_SAI1_RXFS_SIM_M_HADDR15 0x15C 0x3C4 0x000 0x7 0x0 290 + #define MX8MQ_IOMUXC_SAI1_RXC_SAI1_RX_BCLK 0x160 0x3C8 0x000 0x0 0x0 291 + #define MX8MQ_IOMUXC_SAI1_RXC_SAI5_RX_BCLK 0x160 0x3C8 0x4D0 0x1 0x1 292 + #define MX8MQ_IOMUXC_SAI1_RXC_CORESIGHT_TRACE_CTL 0x160 0x3C8 0x000 0x4 0x0 293 + #define MX8MQ_IOMUXC_SAI1_RXC_GPIO4_IO1 0x160 0x3C8 0x000 0x5 0x0 294 + #define MX8MQ_IOMUXC_SAI1_RXC_SIM_M_HADDR16 0x160 0x3C8 0x000 0x7 0x0 295 + #define MX8MQ_IOMUXC_SAI1_RXD0_SAI1_RX_DATA0 0x164 0x3CC 0x000 0x0 0x0 296 + #define MX8MQ_IOMUXC_SAI1_RXD0_SAI5_RX_DATA0 0x164 0x3CC 0x4D4 0x1 0x1 297 + #define MX8MQ_IOMUXC_SAI1_RXD0_CORESIGHT_TRACE0 0x164 0x3CC 0x000 0x4 0x0 298 + #define MX8MQ_IOMUXC_SAI1_RXD0_GPIO4_IO2 0x164 0x3CC 0x000 0x5 0x0 299 + #define MX8MQ_IOMUXC_SAI1_RXD0_CCMSRCGPCMIX_BOOT_CFG0 0x164 0x3CC 0x000 0x6 0x0 300 + #define MX8MQ_IOMUXC_SAI1_RXD0_SIM_M_HADDR17 0x164 0x3CC 0x000 0x7 0x0 301 + #define MX8MQ_IOMUXC_SAI1_RXD1_SAI1_RX_DATA1 0x168 0x3D0 0x000 0x0 0x0 302 + #define MX8MQ_IOMUXC_SAI1_RXD1_SAI5_RX_DATA1 0x168 0x3D0 0x4D8 0x1 0x1 303 + #define MX8MQ_IOMUXC_SAI1_RXD1_CORESIGHT_TRACE1 0x168 0x3D0 0x000 0x4 0x0 304 + #define MX8MQ_IOMUXC_SAI1_RXD1_GPIO4_IO3 0x168 0x3D0 0x000 0x5 0x0 305 + #define MX8MQ_IOMUXC_SAI1_RXD1_CCMSRCGPCMIX_BOOT_CFG1 0x168 0x3D0 0x000 0x6 0x0 306 + #define MX8MQ_IOMUXC_SAI1_RXD1_SIM_M_HADDR18 0x168 0x3D0 0x000 0x7 0x0 307 + #define MX8MQ_IOMUXC_SAI1_RXD2_SAI1_RX_DATA2 0x16C 0x3D4 0x000 0x0 0x0 308 + #define MX8MQ_IOMUXC_SAI1_RXD2_SAI5_RX_DATA2 0x16C 0x3D4 0x4DC 0x1 0x1 309 + #define MX8MQ_IOMUXC_SAI1_RXD2_CORESIGHT_TRACE2 0x16C 0x3D4 0x000 0x4 0x0 310 + #define MX8MQ_IOMUXC_SAI1_RXD2_GPIO4_IO4 0x16C 0x3D4 0x000 0x5 0x0 311 + #define MX8MQ_IOMUXC_SAI1_RXD2_CCMSRCGPCMIX_BOOT_CFG2 0x16C 0x3D4 0x000 0x6 0x0 312 + #define MX8MQ_IOMUXC_SAI1_RXD2_SIM_M_HADDR19 0x16C 0x3D4 0x000 0x7 0x0 313 + #define MX8MQ_IOMUXC_SAI1_RXD3_SAI1_RX_DATA3 0x170 0x3D8 0x4E0 0x0 0x1 314 + #define MX8MQ_IOMUXC_SAI1_RXD3_SAI5_RX_DATA3 0x170 0x3D8 0x000 0x1 0x0 315 + #define MX8MQ_IOMUXC_SAI1_RXD3_CORESIGHT_TRACE3 0x170 0x3D8 0x000 0x4 0x0 316 + #define MX8MQ_IOMUXC_SAI1_RXD3_GPIO4_IO5 0x170 0x3D8 0x000 0x5 0x0 317 + #define MX8MQ_IOMUXC_SAI1_RXD3_CCMSRCGPCMIX_BOOT_CFG3 0x170 0x3D8 0x000 0x6 0x0 318 + #define MX8MQ_IOMUXC_SAI1_RXD3_SIM_M_HADDR20 0x170 0x3D8 0x000 0x7 0x0 319 + #define MX8MQ_IOMUXC_SAI1_RXD4_SAI1_RX_DATA4 0x174 0x3DC 0x000 0x0 0x0 320 + #define MX8MQ_IOMUXC_SAI1_RXD4_SAI6_TX_BCLK 0x174 0x3DC 0x51C 0x1 0x0 321 + #define MX8MQ_IOMUXC_SAI1_RXD4_SAI6_RX_BCLK 0x174 0x3DC 0x510 0x2 0x0 322 + #define MX8MQ_IOMUXC_SAI1_RXD4_CORESIGHT_TRACE4 0x174 0x3DC 0x000 0x4 0x0 323 + #define MX8MQ_IOMUXC_SAI1_RXD4_GPIO4_IO6 0x174 0x3DC 0x000 0x5 0x0 324 + #define MX8MQ_IOMUXC_SAI1_RXD4_CCMSRCGPCMIX_BOOT_CFG4 0x174 0x3DC 0x000 0x6 0x0 325 + #define MX8MQ_IOMUXC_SAI1_RXD4_SIM_M_HADDR21 0x174 0x3DC 0x000 0x7 0x0 326 + #define MX8MQ_IOMUXC_SAI1_RXD5_SAI1_RX_DATA5 0x178 0x3E0 0x000 0x0 0x0 327 + #define MX8MQ_IOMUXC_SAI1_RXD5_SAI6_TX_DATA0 0x178 0x3E0 0x000 0x1 0x0 328 + #define MX8MQ_IOMUXC_SAI1_RXD5_SAI6_RX_DATA0 0x178 0x3E0 0x514 0x2 0x0 329 + #define MX8MQ_IOMUXC_SAI1_RXD5_SAI1_RX_SYNC 0x178 0x3E0 0x4C4 0x3 0x1 330 + #define MX8MQ_IOMUXC_SAI1_RXD5_CORESIGHT_TRACE5 0x178 0x3E0 0x000 0x4 0x0 331 + #define MX8MQ_IOMUXC_SAI1_RXD5_GPIO4_IO7 0x178 0x3E0 0x000 0x5 0x0 332 + #define MX8MQ_IOMUXC_SAI1_RXD5_CCMSRCGPCMIX_BOOT_CFG5 0x178 0x3E0 0x000 0x6 0x0 333 + #define MX8MQ_IOMUXC_SAI1_RXD5_SIM_M_HADDR22 0x178 0x3E0 0x000 0x7 0x0 334 + #define MX8MQ_IOMUXC_SAI1_RXD6_SAI1_RX_DATA6 0x17C 0x3E4 0x520 0x0 0x0 335 + #define MX8MQ_IOMUXC_SAI1_RXD6_SAI6_TX_SYNC 0x17C 0x3E4 0x000 0x1 0x0 336 + #define MX8MQ_IOMUXC_SAI1_RXD6_SAI6_RX_SYNC 0x17C 0x3E4 0x518 0x2 0x0 337 + #define MX8MQ_IOMUXC_SAI1_RXD6_CORESIGHT_TRACE6 0x17C 0x3E4 0x000 0x4 0x0 338 + #define MX8MQ_IOMUXC_SAI1_RXD6_GPIO4_IO8 0x17C 0x3E4 0x000 0x5 0x0 339 + #define MX8MQ_IOMUXC_SAI1_RXD6_CCMSRCGPCMIX_BOOT_CFG6 0x17C 0x3E4 0x000 0x6 0x0 340 + #define MX8MQ_IOMUXC_SAI1_RXD6_SIM_M_HADDR23 0x17C 0x3E4 0x000 0x7 0x0 341 + #define MX8MQ_IOMUXC_SAI1_RXD7_SAI1_RX_DATA7 0x180 0x3E8 0x000 0x0 0x0 342 + #define MX8MQ_IOMUXC_SAI1_RXD7_SAI6_MCLK 0x180 0x3E8 0x530 0x1 0x0 343 + #define MX8MQ_IOMUXC_SAI1_RXD7_SAI1_TX_SYNC 0x180 0x3E8 0x4CC 0x2 0x4 344 + #define MX8MQ_IOMUXC_SAI1_RXD7_SAI1_TX_DATA4 0x180 0x3E8 0x000 0x3 0x0 345 + #define MX8MQ_IOMUXC_SAI1_RXD7_CORESIGHT_TRACE7 0x180 0x3E8 0x000 0x4 0x0 346 + #define MX8MQ_IOMUXC_SAI1_RXD7_GPIO4_IO9 0x180 0x3E8 0x000 0x5 0x0 347 + #define MX8MQ_IOMUXC_SAI1_RXD7_CCMSRCGPCMIX_BOOT_CFG7 0x180 0x3E8 0x000 0x6 0x0 348 + #define MX8MQ_IOMUXC_SAI1_RXD7_SIM_M_HADDR24 0x180 0x3E8 0x000 0x7 0x0 349 + #define MX8MQ_IOMUXC_SAI1_TXFS_SAI1_TX_SYNC 0x184 0x3EC 0x4CC 0x0 0x3 350 + #define MX8MQ_IOMUXC_SAI1_TXFS_SAI5_TX_SYNC 0x184 0x3EC 0x4EC 0x1 0x1 351 + #define MX8MQ_IOMUXC_SAI1_TXFS_CORESIGHT_EVENTO 0x184 0x3EC 0x000 0x4 0x0 352 + #define MX8MQ_IOMUXC_SAI1_TXFS_GPIO4_IO10 0x184 0x3EC 0x000 0x5 0x0 353 + #define MX8MQ_IOMUXC_SAI1_TXFS_SIM_M_HADDR25 0x184 0x3EC 0x000 0x7 0x0 354 + #define MX8MQ_IOMUXC_SAI1_TXC_SAI1_TX_BCLK 0x188 0x3F0 0x4C8 0x0 0x1 355 + #define MX8MQ_IOMUXC_SAI1_TXC_SAI5_TX_BCLK 0x188 0x3F0 0x4E8 0x1 0x1 356 + #define MX8MQ_IOMUXC_SAI1_TXC_CORESIGHT_EVENTI 0x188 0x3F0 0x000 0x4 0x0 357 + #define MX8MQ_IOMUXC_SAI1_TXC_GPIO4_IO11 0x188 0x3F0 0x000 0x5 0x0 358 + #define MX8MQ_IOMUXC_SAI1_TXC_SIM_M_HADDR26 0x188 0x3F0 0x000 0x7 0x0 359 + #define MX8MQ_IOMUXC_SAI1_TXD0_SAI1_TX_DATA0 0x18C 0x3F4 0x000 0x0 0x0 360 + #define MX8MQ_IOMUXC_SAI1_TXD0_SAI5_TX_DATA0 0x18C 0x3F4 0x000 0x1 0x0 361 + #define MX8MQ_IOMUXC_SAI1_TXD0_CORESIGHT_TRACE8 0x18C 0x3F4 0x000 0x4 0x0 362 + #define MX8MQ_IOMUXC_SAI1_TXD0_GPIO4_IO12 0x18C 0x3F4 0x000 0x5 0x0 363 + #define MX8MQ_IOMUXC_SAI1_TXD0_CCMSRCGPCMIX_BOOT_CFG8 0x18C 0x3F4 0x000 0x6 0x0 364 + #define MX8MQ_IOMUXC_SAI1_TXD0_SIM_M_HADDR27 0x18C 0x3F4 0x000 0x7 0x0 365 + #define MX8MQ_IOMUXC_SAI1_TXD1_SAI1_TX_DATA1 0x190 0x3F8 0x000 0x0 0x0 366 + #define MX8MQ_IOMUXC_SAI1_TXD1_SAI5_TX_DATA1 0x190 0x3F8 0x000 0x1 0x0 367 + #define MX8MQ_IOMUXC_SAI1_TXD1_CORESIGHT_TRACE9 0x190 0x3F8 0x000 0x4 0x0 368 + #define MX8MQ_IOMUXC_SAI1_TXD1_GPIO4_IO13 0x190 0x3F8 0x000 0x5 0x0 369 + #define MX8MQ_IOMUXC_SAI1_TXD1_CCMSRCGPCMIX_BOOT_CFG9 0x190 0x3F8 0x000 0x6 0x0 370 + #define MX8MQ_IOMUXC_SAI1_TXD1_SIM_M_HADDR28 0x190 0x3F8 0x000 0x7 0x0 371 + #define MX8MQ_IOMUXC_SAI1_TXD2_SAI1_TX_DATA2 0x194 0x3FC 0x000 0x0 0x0 372 + #define MX8MQ_IOMUXC_SAI1_TXD2_SAI5_TX_DATA2 0x194 0x3FC 0x000 0x1 0x0 373 + #define MX8MQ_IOMUXC_SAI1_TXD2_CORESIGHT_TRACE10 0x194 0x3FC 0x000 0x4 0x0 374 + #define MX8MQ_IOMUXC_SAI1_TXD2_GPIO4_IO14 0x194 0x3FC 0x000 0x5 0x0 375 + #define MX8MQ_IOMUXC_SAI1_TXD2_CCMSRCGPCMIX_BOOT_CFG10 0x194 0x3FC 0x000 0x6 0x0 376 + #define MX8MQ_IOMUXC_SAI1_TXD2_SIM_M_HADDR29 0x194 0x3FC 0x000 0x7 0x0 377 + #define MX8MQ_IOMUXC_SAI1_TXD3_SAI1_TX_DATA3 0x198 0x400 0x000 0x0 0x0 378 + #define MX8MQ_IOMUXC_SAI1_TXD3_SAI5_TX_DATA3 0x198 0x400 0x000 0x1 0x0 379 + #define MX8MQ_IOMUXC_SAI1_TXD3_CORESIGHT_TRACE11 0x198 0x400 0x000 0x4 0x0 380 + #define MX8MQ_IOMUXC_SAI1_TXD3_GPIO4_IO15 0x198 0x400 0x000 0x5 0x0 381 + #define MX8MQ_IOMUXC_SAI1_TXD3_CCMSRCGPCMIX_BOOT_CFG11 0x198 0x400 0x000 0x6 0x0 382 + #define MX8MQ_IOMUXC_SAI1_TXD3_SIM_M_HADDR30 0x198 0x400 0x000 0x7 0x0 383 + #define MX8MQ_IOMUXC_SAI1_TXD4_SAI1_TX_DATA4 0x19C 0x404 0x000 0x0 0x0 384 + #define MX8MQ_IOMUXC_SAI1_TXD4_SAI6_RX_BCLK 0x19C 0x404 0x510 0x1 0x1 385 + #define MX8MQ_IOMUXC_SAI1_TXD4_SAI6_TX_BCLK 0x19C 0x404 0x51C 0x2 0x1 386 + #define MX8MQ_IOMUXC_SAI1_TXD4_CORESIGHT_TRACE12 0x19C 0x404 0x000 0x4 0x0 387 + #define MX8MQ_IOMUXC_SAI1_TXD4_GPIO4_IO16 0x19C 0x404 0x000 0x5 0x0 388 + #define MX8MQ_IOMUXC_SAI1_TXD4_CCMSRCGPCMIX_BOOT_CFG12 0x19C 0x404 0x000 0x6 0x0 389 + #define MX8MQ_IOMUXC_SAI1_TXD4_SIM_M_HADDR31 0x19C 0x404 0x000 0x7 0x0 390 + #define MX8MQ_IOMUXC_SAI1_TXD5_SAI1_TX_DATA5 0x1A0 0x408 0x000 0x0 0x0 391 + #define MX8MQ_IOMUXC_SAI1_TXD5_SAI6_RX_DATA0 0x1A0 0x408 0x514 0x1 0x1 392 + #define MX8MQ_IOMUXC_SAI1_TXD5_SAI6_TX_DATA0 0x1A0 0x408 0x000 0x2 0x0 393 + #define MX8MQ_IOMUXC_SAI1_TXD5_CORESIGHT_TRACE13 0x1A0 0x408 0x000 0x4 0x0 394 + #define MX8MQ_IOMUXC_SAI1_TXD5_GPIO4_IO17 0x1A0 0x408 0x000 0x5 0x0 395 + #define MX8MQ_IOMUXC_SAI1_TXD5_CCMSRCGPCMIX_BOOT_CFG13 0x1A0 0x408 0x000 0x6 0x0 396 + #define MX8MQ_IOMUXC_SAI1_TXD5_SIM_M_HBURST0 0x1A0 0x408 0x000 0x7 0x0 397 + #define MX8MQ_IOMUXC_SAI1_TXD6_SAI1_TX_DATA6 0x1A4 0x40C 0x000 0x0 0x0 398 + #define MX8MQ_IOMUXC_SAI1_TXD6_SAI6_RX_SYNC 0x1A4 0x40C 0x518 0x1 0x1 399 + #define MX8MQ_IOMUXC_SAI1_TXD6_SAI6_TX_SYNC 0x1A4 0x40C 0x520 0x2 0x1 400 + #define MX8MQ_IOMUXC_SAI1_TXD6_CORESIGHT_TRACE14 0x1A4 0x40C 0x000 0x4 0x0 401 + #define MX8MQ_IOMUXC_SAI1_TXD6_GPIO4_IO18 0x1A4 0x40C 0x000 0x5 0x0 402 + #define MX8MQ_IOMUXC_SAI1_TXD6_CCMSRCGPCMIX_BOOT_CFG14 0x1A4 0x40C 0x000 0x6 0x0 403 + #define MX8MQ_IOMUXC_SAI1_TXD6_SIM_M_HBURST1 0x1A4 0x40C 0x000 0x7 0x0 404 + #define MX8MQ_IOMUXC_SAI1_TXD7_SAI1_TX_DATA7 0x1A8 0x410 0x000 0x0 0x0 405 + #define MX8MQ_IOMUXC_SAI1_TXD7_SAI6_MCLK 0x1A8 0x410 0x530 0x1 0x1 406 + #define MX8MQ_IOMUXC_SAI1_TXD7_CORESIGHT_TRACE15 0x1A8 0x410 0x000 0x4 0x0 407 + #define MX8MQ_IOMUXC_SAI1_TXD7_GPIO4_IO19 0x1A8 0x410 0x000 0x5 0x0 408 + #define MX8MQ_IOMUXC_SAI1_TXD7_CCMSRCGPCMIX_BOOT_CFG15 0x1A8 0x410 0x000 0x6 0x0 409 + #define MX8MQ_IOMUXC_SAI1_TXD7_SIM_M_HBURST2 0x1A8 0x410 0x000 0x7 0x0 410 + #define MX8MQ_IOMUXC_SAI1_MCLK_SAI1_MCLK 0x1AC 0x414 0x000 0x0 0x0 411 + #define MX8MQ_IOMUXC_SAI1_MCLK_SAI5_MCLK 0x1AC 0x414 0x52C 0x1 0x1 412 + #define MX8MQ_IOMUXC_SAI1_MCLK_SAI1_TX_BCLK 0x1AC 0x414 0x4C8 0x2 0x2 413 + #define MX8MQ_IOMUXC_SAI1_MCLK_GPIO4_IO20 0x1AC 0x414 0x000 0x5 0x0 414 + #define MX8MQ_IOMUXC_SAI1_MCLK_SIM_M_HRESP 0x1AC 0x414 0x000 0x7 0x0 415 + #define MX8MQ_IOMUXC_SAI2_RXFS_SAI2_RX_SYNC 0x1B0 0x418 0x000 0x0 0x0 416 + #define MX8MQ_IOMUXC_SAI2_RXFS_SAI5_TX_SYNC 0x1B0 0x418 0x4EC 0x1 0x2 417 + #define MX8MQ_IOMUXC_SAI2_RXFS_GPIO4_IO21 0x1B0 0x418 0x000 0x5 0x0 418 + #define MX8MQ_IOMUXC_SAI2_RXFS_SIM_M_HSIZE0 0x1B0 0x418 0x000 0x7 0x0 419 + #define MX8MQ_IOMUXC_SAI2_RXC_SAI2_RX_BCLK 0x1B4 0x41C 0x000 0x0 0x0 420 + #define MX8MQ_IOMUXC_SAI2_RXC_SAI5_TX_BCLK 0x1B4 0x41C 0x4E8 0x1 0x2 421 + #define MX8MQ_IOMUXC_SAI2_RXC_GPIO4_IO22 0x1B4 0x41C 0x000 0x5 0x0 422 + #define MX8MQ_IOMUXC_SAI2_RXC_SIM_M_HSIZE1 0x1B4 0x41C 0x000 0x7 0x0 423 + #define MX8MQ_IOMUXC_SAI2_RXD0_SAI2_RX_DATA0 0x1B8 0x420 0x000 0x0 0x0 424 + #define MX8MQ_IOMUXC_SAI2_RXD0_SAI5_TX_DATA0 0x1B8 0x420 0x000 0x1 0x0 425 + #define MX8MQ_IOMUXC_SAI2_RXD0_GPIO4_IO23 0x1B8 0x420 0x000 0x5 0x0 426 + #define MX8MQ_IOMUXC_SAI2_RXD0_SIM_M_HSIZE2 0x1B8 0x420 0x000 0x7 0x0 427 + #define MX8MQ_IOMUXC_SAI2_TXFS_SAI2_TX_SYNC 0x1BC 0x424 0x000 0x0 0x0 428 + #define MX8MQ_IOMUXC_SAI2_TXFS_SAI5_TX_DATA1 0x1BC 0x424 0x000 0x1 0x0 429 + #define MX8MQ_IOMUXC_SAI2_TXFS_GPIO4_IO24 0x1BC 0x424 0x000 0x5 0x0 430 + #define MX8MQ_IOMUXC_SAI2_TXFS_SIM_M_HWRITE 0x1BC 0x424 0x000 0x7 0x0 431 + #define MX8MQ_IOMUXC_SAI2_TXC_SAI2_TX_BCLK 0x1C0 0x428 0x000 0x0 0x0 432 + #define MX8MQ_IOMUXC_SAI2_TXC_SAI5_TX_DATA2 0x1C0 0x428 0x000 0x1 0x0 433 + #define MX8MQ_IOMUXC_SAI2_TXC_GPIO4_IO25 0x1C0 0x428 0x000 0x5 0x0 434 + #define MX8MQ_IOMUXC_SAI2_TXC_SIM_M_HREADYOUT 0x1C0 0x428 0x000 0x7 0x0 435 + #define MX8MQ_IOMUXC_SAI2_TXD0_SAI2_TX_DATA0 0x1C4 0x42C 0x000 0x0 0x0 436 + #define MX8MQ_IOMUXC_SAI2_TXD0_SAI5_TX_DATA3 0x1C4 0x42C 0x000 0x1 0x0 437 + #define MX8MQ_IOMUXC_SAI2_TXD0_GPIO4_IO26 0x1C4 0x42C 0x000 0x5 0x0 438 + #define MX8MQ_IOMUXC_SAI2_TXD0_TPSMP_CLK 0x1C4 0x42C 0x000 0x7 0x0 439 + #define MX8MQ_IOMUXC_SAI2_MCLK_SAI2_MCLK 0x1C8 0x430 0x000 0x0 0x0 440 + #define MX8MQ_IOMUXC_SAI2_MCLK_SAI5_MCLK 0x1C8 0x430 0x52C 0x1 0x2 441 + #define MX8MQ_IOMUXC_SAI2_MCLK_GPIO4_IO27 0x1C8 0x430 0x000 0x5 0x0 442 + #define MX8MQ_IOMUXC_SAI2_MCLK_TPSMP_HDATA_DIR 0x1C8 0x430 0x000 0x7 0x0 443 + #define MX8MQ_IOMUXC_SAI3_RXFS_SAI3_RX_SYNC 0x1CC 0x434 0x000 0x0 0x0 444 + #define MX8MQ_IOMUXC_SAI3_RXFS_GPT1_CAPTURE1 0x1CC 0x434 0x000 0x1 0x0 445 + #define MX8MQ_IOMUXC_SAI3_RXFS_SAI5_RX_SYNC 0x1CC 0x434 0x4E4 0x2 0x2 446 + #define MX8MQ_IOMUXC_SAI3_RXFS_GPIO4_IO28 0x1CC 0x434 0x000 0x5 0x0 447 + #define MX8MQ_IOMUXC_SAI3_RXFS_TPSMP_HTRANS0 0x1CC 0x434 0x000 0x7 0x0 448 + #define MX8MQ_IOMUXC_SAI3_RXC_SAI3_RX_BCLK 0x1D0 0x438 0x000 0x0 0x0 449 + #define MX8MQ_IOMUXC_SAI3_RXC_GPT1_CAPTURE2 0x1D0 0x438 0x000 0x1 0x0 450 + #define MX8MQ_IOMUXC_SAI3_RXC_SAI5_RX_BCLK 0x1D0 0x438 0x4D0 0x2 0x2 451 + #define MX8MQ_IOMUXC_SAI3_RXC_GPIO4_IO29 0x1D0 0x438 0x000 0x5 0x0 452 + #define MX8MQ_IOMUXC_SAI3_RXC_TPSMP_HTRANS1 0x1D0 0x438 0x000 0x7 0x0 453 + #define MX8MQ_IOMUXC_SAI3_RXD_SAI3_RX_DATA0 0x1D4 0x43C 0x000 0x0 0x0 454 + #define MX8MQ_IOMUXC_SAI3_RXD_GPT1_COMPARE1 0x1D4 0x43C 0x000 0x1 0x0 455 + #define MX8MQ_IOMUXC_SAI3_RXD_SAI5_RX_DATA0 0x1D4 0x43C 0x4D4 0x2 0x2 456 + #define MX8MQ_IOMUXC_SAI3_RXD_GPIO4_IO30 0x1D4 0x43C 0x000 0x5 0x0 457 + #define MX8MQ_IOMUXC_SAI3_RXD_TPSMP_HDATA0 0x1D4 0x43C 0x000 0x7 0x0 458 + #define MX8MQ_IOMUXC_SAI3_TXFS_SAI3_TX_SYNC 0x1D8 0x440 0x000 0x0 0x0 459 + #define MX8MQ_IOMUXC_SAI3_TXFS_GPT1_CLK 0x1D8 0x440 0x000 0x1 0x0 460 + #define MX8MQ_IOMUXC_SAI3_TXFS_SAI5_RX_DATA1 0x1D8 0x440 0x4D8 0x2 0x2 461 + #define MX8MQ_IOMUXC_SAI3_TXFS_GPIO4_IO31 0x1D8 0x440 0x000 0x5 0x0 462 + #define MX8MQ_IOMUXC_SAI3_TXFS_TPSMP_HDATA1 0x1D8 0x440 0x000 0x7 0x0 463 + #define MX8MQ_IOMUXC_SAI3_TXC_SAI3_TX_BCLK 0x1DC 0x444 0x000 0x0 0x0 464 + #define MX8MQ_IOMUXC_SAI3_TXC_GPT1_COMPARE2 0x1DC 0x444 0x000 0x1 0x0 465 + #define MX8MQ_IOMUXC_SAI3_TXC_SAI5_RX_DATA2 0x1DC 0x444 0x4DC 0x2 0x2 466 + #define MX8MQ_IOMUXC_SAI3_TXC_GPIO5_IO0 0x1DC 0x444 0x000 0x5 0x0 467 + #define MX8MQ_IOMUXC_SAI3_TXC_TPSMP_HDATA2 0x1DC 0x444 0x000 0x7 0x0 468 + #define MX8MQ_IOMUXC_SAI3_TXD_SAI3_TX_DATA0 0x1E0 0x448 0x000 0x0 0x0 469 + #define MX8MQ_IOMUXC_SAI3_TXD_GPT1_COMPARE3 0x1E0 0x448 0x000 0x1 0x0 470 + #define MX8MQ_IOMUXC_SAI3_TXD_SAI5_RX_DATA3 0x1E0 0x448 0x4E0 0x2 0x2 471 + #define MX8MQ_IOMUXC_SAI3_TXD_GPIO5_IO1 0x1E0 0x448 0x000 0x5 0x0 472 + #define MX8MQ_IOMUXC_SAI3_TXD_TPSMP_HDATA3 0x1E0 0x448 0x000 0x7 0x0 473 + #define MX8MQ_IOMUXC_SAI3_MCLK_SAI3_MCLK 0x1E4 0x44C 0x000 0x0 0x0 474 + #define MX8MQ_IOMUXC_SAI3_MCLK_PWM4_OUT 0x1E4 0x44C 0x000 0x1 0x0 475 + #define MX8MQ_IOMUXC_SAI3_MCLK_SAI5_MCLK 0x1E4 0x44C 0x52C 0x2 0x3 476 + #define MX8MQ_IOMUXC_SAI3_MCLK_GPIO5_IO2 0x1E4 0x44C 0x000 0x5 0x0 477 + #define MX8MQ_IOMUXC_SAI3_MCLK_TPSMP_HDATA4 0x1E4 0x44C 0x000 0x7 0x0 478 + #define MX8MQ_IOMUXC_SPDIF_TX_SPDIF1_OUT 0x1E8 0x450 0x000 0x0 0x0 479 + #define MX8MQ_IOMUXC_SPDIF_TX_PWM3_OUT 0x1E8 0x450 0x000 0x1 0x0 480 + #define MX8MQ_IOMUXC_SPDIF_TX_GPIO5_IO3 0x1E8 0x450 0x000 0x5 0x0 481 + #define MX8MQ_IOMUXC_SPDIF_TX_TPSMP_HDATA5 0x1E8 0x450 0x000 0x7 0x0 482 + #define MX8MQ_IOMUXC_SPDIF_RX_SPDIF1_IN 0x1EC 0x454 0x000 0x0 0x0 483 + #define MX8MQ_IOMUXC_SPDIF_RX_PWM2_OUT 0x1EC 0x454 0x000 0x1 0x0 484 + #define MX8MQ_IOMUXC_SPDIF_RX_GPIO5_IO4 0x1EC 0x454 0x000 0x5 0x0 485 + #define MX8MQ_IOMUXC_SPDIF_RX_TPSMP_HDATA6 0x1EC 0x454 0x000 0x7 0x0 486 + #define MX8MQ_IOMUXC_SPDIF_EXT_CLK_SPDIF1_EXT_CLK 0x1F0 0x458 0x000 0x0 0x0 487 + #define MX8MQ_IOMUXC_SPDIF_EXT_CLK_PWM1_OUT 0x1F0 0x458 0x000 0x1 0x0 488 + #define MX8MQ_IOMUXC_SPDIF_EXT_CLK_GPIO5_IO5 0x1F0 0x458 0x000 0x5 0x0 489 + #define MX8MQ_IOMUXC_SPDIF_EXT_CLK_TPSMP_HDATA7 0x1F0 0x458 0x000 0x7 0x0 490 + #define MX8MQ_IOMUXC_ECSPI1_SCLK_ECSPI1_SCLK 0x1F4 0x45C 0x000 0x0 0x0 491 + #define MX8MQ_IOMUXC_ECSPI1_SCLK_UART3_DCE_RX 0x1F4 0x45C 0x504 0x1 0x0 492 + #define MX8MQ_IOMUXC_ECSPI1_SCLK_UART3_DTE_TX 0x1F4 0x45C 0x000 0x1 0x0 493 + #define MX8MQ_IOMUXC_ECSPI1_SCLK_GPIO5_IO6 0x1F4 0x45C 0x000 0x5 0x0 494 + #define MX8MQ_IOMUXC_ECSPI1_SCLK_TPSMP_HDATA8 0x1F4 0x45C 0x000 0x7 0x0 495 + #define MX8MQ_IOMUXC_ECSPI1_MOSI_ECSPI1_MOSI 0x1F8 0x460 0x000 0x0 0x0 496 + #define MX8MQ_IOMUXC_ECSPI1_MOSI_UART3_DCE_TX 0x1F8 0x460 0x000 0x1 0x0 497 + #define MX8MQ_IOMUXC_ECSPI1_MOSI_UART3_DTE_RX 0x1F8 0x460 0x504 0x1 0x1 498 + #define MX8MQ_IOMUXC_ECSPI1_MOSI_GPIO5_IO7 0x1F8 0x460 0x000 0x5 0x0 499 + #define MX8MQ_IOMUXC_ECSPI1_MOSI_TPSMP_HDATA9 0x1F8 0x460 0x000 0x7 0x0 500 + #define MX8MQ_IOMUXC_ECSPI1_MISO_ECSPI1_MISO 0x1FC 0x464 0x000 0x0 0x0 501 + #define MX8MQ_IOMUXC_ECSPI1_MISO_UART3_DCE_CTS_B 0x1FC 0x464 0x000 0x1 0x0 502 + #define MX8MQ_IOMUXC_ECSPI1_MISO_UART3_DTE_RTS_B 0x1FC 0x464 0x500 0x1 0x0 503 + #define MX8MQ_IOMUXC_ECSPI1_MISO_GPIO5_IO8 0x1FC 0x464 0x000 0x5 0x0 504 + #define MX8MQ_IOMUXC_ECSPI1_MISO_TPSMP_HDATA10 0x1FC 0x464 0x000 0x7 0x0 505 + #define MX8MQ_IOMUXC_ECSPI1_SS0_ECSPI1_SS0 0x200 0x468 0x000 0x0 0x0 506 + #define MX8MQ_IOMUXC_ECSPI1_SS0_UART3_DCE_RTS_B 0x200 0x468 0x500 0x1 0x1 507 + #define MX8MQ_IOMUXC_ECSPI1_SS0_UART3_DTE_CTS_B 0x200 0x468 0x000 0x1 0x0 508 + #define MX8MQ_IOMUXC_ECSPI1_SS0_GPIO5_IO9 0x200 0x468 0x000 0x5 0x0 509 + #define MX8MQ_IOMUXC_ECSPI1_SS0_TPSMP_HDATA11 0x200 0x468 0x000 0x7 0x0 510 + #define MX8MQ_IOMUXC_ECSPI2_SCLK_ECSPI2_SCLK 0x204 0x46C 0x000 0x0 0x0 511 + #define MX8MQ_IOMUXC_ECSPI2_SCLK_UART4_DCE_RX 0x204 0x46C 0x50C 0x1 0x0 512 + #define MX8MQ_IOMUXC_ECSPI2_SCLK_UART4_DTE_TX 0x204 0x46C 0x000 0x1 0x0 513 + #define MX8MQ_IOMUXC_ECSPI2_SCLK_GPIO5_IO10 0x204 0x46C 0x000 0x5 0x0 514 + #define MX8MQ_IOMUXC_ECSPI2_SCLK_TPSMP_HDATA12 0x204 0x46C 0x000 0x7 0x0 515 + #define MX8MQ_IOMUXC_ECSPI2_MOSI_ECSPI2_MOSI 0x208 0x470 0x000 0x0 0x0 516 + #define MX8MQ_IOMUXC_ECSPI2_MOSI_UART4_DCE_TX 0x208 0x470 0x000 0x1 0x0 517 + #define MX8MQ_IOMUXC_ECSPI2_MOSI_UART4_DTE_RX 0x208 0x470 0x50C 0x1 0x1 518 + #define MX8MQ_IOMUXC_ECSPI2_MOSI_GPIO5_IO11 0x208 0x470 0x000 0x5 0x0 519 + #define MX8MQ_IOMUXC_ECSPI2_MOSI_TPSMP_HDATA13 0x208 0x470 0x000 0x7 0x0 520 + #define MX8MQ_IOMUXC_ECSPI2_MISO_ECSPI2_MISO 0x20C 0x474 0x000 0x0 0x0 521 + #define MX8MQ_IOMUXC_ECSPI2_MISO_UART4_DCE_CTS_B 0x20C 0x474 0x000 0x1 0x0 522 + #define MX8MQ_IOMUXC_ECSPI2_MISO_UART4_DTE_RTS_B 0x20C 0x474 0x508 0x1 0x0 523 + #define MX8MQ_IOMUXC_ECSPI2_MISO_GPIO5_IO12 0x20C 0x474 0x000 0x5 0x0 524 + #define MX8MQ_IOMUXC_ECSPI2_MISO_TPSMP_HDATA14 0x20C 0x474 0x000 0x7 0x0 525 + #define MX8MQ_IOMUXC_ECSPI2_SS0_ECSPI2_SS0 0x210 0x478 0x000 0x0 0x0 526 + #define MX8MQ_IOMUXC_ECSPI2_SS0_UART4_DCE_RTS_B 0x210 0x478 0x508 0x1 0x1 527 + #define MX8MQ_IOMUXC_ECSPI2_SS0_UART4_DTE_CTS_B 0x210 0x478 0x000 0x1 0x0 528 + #define MX8MQ_IOMUXC_ECSPI2_SS0_GPIO5_IO13 0x210 0x478 0x000 0x5 0x0 529 + #define MX8MQ_IOMUXC_ECSPI2_SS0_TPSMP_HDATA15 0x210 0x478 0x000 0x7 0x0 530 + #define MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL 0x214 0x47C 0x000 0x0 0x0 531 + #define MX8MQ_IOMUXC_I2C1_SCL_ENET1_MDC 0x214 0x47C 0x000 0x1 0x0 532 + #define MX8MQ_IOMUXC_I2C1_SCL_GPIO5_IO14 0x214 0x47C 0x000 0x5 0x0 533 + #define MX8MQ_IOMUXC_I2C1_SCL_TPSMP_HDATA16 0x214 0x47C 0x000 0x7 0x0 534 + #define MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA 0x218 0x480 0x000 0x0 0x0 535 + #define MX8MQ_IOMUXC_I2C1_SDA_ENET1_MDIO 0x218 0x480 0x4C0 0x1 0x2 536 + #define MX8MQ_IOMUXC_I2C1_SDA_GPIO5_IO15 0x218 0x480 0x000 0x5 0x0 537 + #define MX8MQ_IOMUXC_I2C1_SDA_TPSMP_HDATA17 0x218 0x480 0x000 0x7 0x0 538 + #define MX8MQ_IOMUXC_I2C2_SCL_I2C2_SCL 0x21C 0x484 0x000 0x0 0x0 539 + #define MX8MQ_IOMUXC_I2C2_SCL_ENET1_1588_EVENT1_IN 0x21C 0x484 0x000 0x1 0x0 540 + #define MX8MQ_IOMUXC_I2C2_SCL_GPIO5_IO16 0x21C 0x484 0x000 0x5 0x0 541 + #define MX8MQ_IOMUXC_I2C2_SCL_TPSMP_HDATA18 0x21C 0x484 0x000 0x7 0x0 542 + #define MX8MQ_IOMUXC_I2C2_SDA_I2C2_SDA 0x220 0x488 0x000 0x0 0x0 543 + #define MX8MQ_IOMUXC_I2C2_SDA_ENET1_1588_EVENT1_OUT 0x220 0x488 0x000 0x1 0x0 544 + #define MX8MQ_IOMUXC_I2C2_SDA_GPIO5_IO17 0x220 0x488 0x000 0x5 0x0 545 + #define MX8MQ_IOMUXC_I2C2_SDA_TPSMP_HDATA19 0x220 0x488 0x000 0x7 0x0 546 + #define MX8MQ_IOMUXC_I2C3_SCL_I2C3_SCL 0x224 0x48C 0x000 0x0 0x0 547 + #define MX8MQ_IOMUXC_I2C3_SCL_PWM4_OUT 0x224 0x48C 0x000 0x1 0x0 548 + #define MX8MQ_IOMUXC_I2C3_SCL_GPT2_CLK 0x224 0x48C 0x000 0x2 0x0 549 + #define MX8MQ_IOMUXC_I2C3_SCL_GPIO5_IO18 0x224 0x48C 0x000 0x5 0x0 550 + #define MX8MQ_IOMUXC_I2C3_SCL_TPSMP_HDATA20 0x224 0x48C 0x000 0x7 0x0 551 + #define MX8MQ_IOMUXC_I2C3_SDA_I2C3_SDA 0x228 0x490 0x000 0x0 0x0 552 + #define MX8MQ_IOMUXC_I2C3_SDA_PWM3_OUT 0x228 0x490 0x000 0x1 0x0 553 + #define MX8MQ_IOMUXC_I2C3_SDA_GPT3_CLK 0x228 0x490 0x000 0x2 0x0 554 + #define MX8MQ_IOMUXC_I2C3_SDA_GPIO5_IO19 0x228 0x490 0x000 0x5 0x0 555 + #define MX8MQ_IOMUXC_I2C3_SDA_TPSMP_HDATA21 0x228 0x490 0x000 0x7 0x0 556 + #define MX8MQ_IOMUXC_I2C4_SCL_I2C4_SCL 0x22C 0x494 0x000 0x0 0x0 557 + #define MX8MQ_IOMUXC_I2C4_SCL_PWM2_OUT 0x22C 0x494 0x000 0x1 0x0 558 + #define MX8MQ_IOMUXC_I2C4_SCL_PCIE1_CLKREQ_B 0x22C 0x494 0x524 0x2 0x0 559 + #define MX8MQ_IOMUXC_I2C4_SCL_GPIO5_IO20 0x22C 0x494 0x000 0x5 0x0 560 + #define MX8MQ_IOMUXC_I2C4_SCL_TPSMP_HDATA22 0x22C 0x494 0x000 0x7 0x0 561 + #define MX8MQ_IOMUXC_I2C4_SDA_I2C4_SDA 0x230 0x498 0x000 0x0 0x0 562 + #define MX8MQ_IOMUXC_I2C4_SDA_PWM1_OUT 0x230 0x498 0x000 0x1 0x0 563 + #define MX8MQ_IOMUXC_I2C4_SDA_PCIE2_CLKREQ_B 0x230 0x498 0x528 0x2 0x0 564 + #define MX8MQ_IOMUXC_I2C4_SDA_GPIO5_IO21 0x230 0x498 0x000 0x5 0x0 565 + #define MX8MQ_IOMUXC_I2C4_SDA_TPSMP_HDATA23 0x230 0x498 0x000 0x7 0x0 566 + #define MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX 0x234 0x49C 0x4F4 0x0 0x0 567 + #define MX8MQ_IOMUXC_UART1_RXD_UART1_DTE_TX 0x234 0x49C 0x000 0x0 0x0 568 + #define MX8MQ_IOMUXC_UART1_RXD_ECSPI3_SCLK 0x234 0x49C 0x000 0x1 0x0 569 + #define MX8MQ_IOMUXC_UART1_RXD_GPIO5_IO22 0x234 0x49C 0x000 0x5 0x0 570 + #define MX8MQ_IOMUXC_UART1_RXD_TPSMP_HDATA24 0x234 0x49C 0x000 0x7 0x0 571 + #define MX8MQ_IOMUXC_UART1_TXD_UART1_DCE_TX 0x238 0x4A0 0x000 0x0 0x0 572 + #define MX8MQ_IOMUXC_UART1_TXD_UART1_DTE_RX 0x238 0x4A0 0x4F4 0x0 0x0 573 + #define MX8MQ_IOMUXC_UART1_TXD_ECSPI3_MOSI 0x238 0x4A0 0x000 0x1 0x0 574 + #define MX8MQ_IOMUXC_UART1_TXD_GPIO5_IO23 0x238 0x4A0 0x000 0x5 0x0 575 + #define MX8MQ_IOMUXC_UART1_TXD_TPSMP_HDATA25 0x238 0x4A0 0x000 0x7 0x0 576 + #define MX8MQ_IOMUXC_UART2_RXD_UART2_DCE_RX 0x23C 0x4A4 0x4FC 0x0 0x0 577 + #define MX8MQ_IOMUXC_UART2_RXD_UART2_DTE_TX 0x23C 0x4A4 0x000 0x0 0x0 578 + #define MX8MQ_IOMUXC_UART2_RXD_ECSPI3_MISO 0x23C 0x4A4 0x000 0x1 0x0 579 + #define MX8MQ_IOMUXC_UART2_RXD_GPIO5_IO24 0x23C 0x4A4 0x000 0x5 0x0 580 + #define MX8MQ_IOMUXC_UART2_RXD_TPSMP_HDATA26 0x23C 0x4A4 0x000 0x7 0x0 581 + #define MX8MQ_IOMUXC_UART2_TXD_UART2_DCE_TX 0x240 0x4A8 0x000 0x0 0x0 582 + #define MX8MQ_IOMUXC_UART2_TXD_UART2_DTE_RX 0x240 0x4A8 0x4FC 0x0 0x1 583 + #define MX8MQ_IOMUXC_UART2_TXD_ECSPI3_SS0 0x240 0x4A8 0x000 0x1 0x0 584 + #define MX8MQ_IOMUXC_UART2_TXD_GPIO5_IO25 0x240 0x4A8 0x000 0x5 0x0 585 + #define MX8MQ_IOMUXC_UART2_TXD_TPSMP_HDATA27 0x240 0x4A8 0x000 0x7 0x0 586 + #define MX8MQ_IOMUXC_UART3_RXD_UART3_DCE_RX 0x244 0x4AC 0x504 0x0 0x2 587 + #define MX8MQ_IOMUXC_UART3_RXD_UART3_DTE_TX 0x244 0x4AC 0x000 0x0 0x0 588 + #define MX8MQ_IOMUXC_UART3_RXD_UART1_DCE_CTS_B 0x244 0x4AC 0x000 0x1 0x0 589 + #define MX8MQ_IOMUXC_UART3_RXD_UART1_DTE_RTS_B 0x244 0x4AC 0x4F0 0x1 0x0 590 + #define MX8MQ_IOMUXC_UART3_RXD_GPIO5_IO26 0x244 0x4AC 0x000 0x5 0x0 591 + #define MX8MQ_IOMUXC_UART3_RXD_TPSMP_HDATA28 0x244 0x4AC 0x000 0x7 0x0 592 + #define MX8MQ_IOMUXC_UART3_TXD_UART3_DCE_TX 0x248 0x4B0 0x000 0x0 0x0 593 + #define MX8MQ_IOMUXC_UART3_TXD_UART3_DTE_RX 0x248 0x4B0 0x504 0x0 0x3 594 + #define MX8MQ_IOMUXC_UART3_TXD_UART1_DCE_RTS_B 0x248 0x4B0 0x4F0 0x1 0x1 595 + #define MX8MQ_IOMUXC_UART3_TXD_UART1_DTE_CTS_B 0x248 0x4B0 0x000 0x1 0x0 596 + #define MX8MQ_IOMUXC_UART3_TXD_GPIO5_IO27 0x248 0x4B0 0x000 0x5 0x0 597 + #define MX8MQ_IOMUXC_UART3_TXD_TPSMP_HDATA29 0x248 0x4B0 0x000 0x7 0x0 598 + #define MX8MQ_IOMUXC_UART4_RXD_UART4_DCE_RX 0x24C 0x4B4 0x50C 0x0 0x2 599 + #define MX8MQ_IOMUXC_UART4_RXD_UART4_DTE_TX 0x24C 0x4B4 0x000 0x0 0x0 600 + #define MX8MQ_IOMUXC_UART4_RXD_UART2_DCE_CTS_B 0x24C 0x4B4 0x000 0x1 0x0 601 + #define MX8MQ_IOMUXC_UART4_RXD_UART2_DTE_RTS_B 0x24C 0x4B4 0x4F8 0x1 0x0 602 + #define MX8MQ_IOMUXC_UART4_RXD_PCIE1_CLKREQ_B 0x24C 0x4B4 0x524 0x2 0x1 603 + #define MX8MQ_IOMUXC_UART4_RXD_GPIO5_IO28 0x24C 0x4B4 0x000 0x5 0x0 604 + #define MX8MQ_IOMUXC_UART4_RXD_TPSMP_HDATA30 0x24C 0x4B4 0x000 0x7 0x0 605 + #define MX8MQ_IOMUXC_UART4_TXD_UART4_DCE_TX 0x250 0x4B8 0x000 0x0 0x0 606 + #define MX8MQ_IOMUXC_UART4_TXD_UART4_DTE_RX 0x250 0x4B8 0x50C 0x0 0x3 607 + #define MX8MQ_IOMUXC_UART4_TXD_UART2_DCE_RTS_B 0x250 0x4B8 0x4F8 0x1 0x1 608 + #define MX8MQ_IOMUXC_UART4_TXD_UART2_DTE_CTS_B 0x250 0x4B8 0x000 0x1 0x0 609 + #define MX8MQ_IOMUXC_UART4_TXD_PCIE2_CLKREQ_B 0x250 0x4B8 0x528 0x2 0x1 610 + #define MX8MQ_IOMUXC_UART4_TXD_GPIO5_IO29 0x250 0x4B8 0x000 0x5 0x0 611 + #define MX8MQ_IOMUXC_UART4_TXD_TPSMP_HDATA31 0x250 0x4B8 0x000 0x7 0x0 612 + #define MX8MQ_IOMUXC_TEST_MODE 0x000 0x254 0x000 0x0 0x0 613 + #define MX8MQ_IOMUXC_BOOT_MODE0 0x000 0x258 0x000 0x0 0x0 614 + #define MX8MQ_IOMUXC_BOOT_MODE1 0x000 0x25C 0x000 0x0 0x0 615 + #define MX8MQ_IOMUXC_JTAG_MOD 0x000 0x260 0x000 0x0 0x0 616 + #define MX8MQ_IOMUXC_JTAG_TRST_B 0x000 0x264 0x000 0x0 0x0 617 + #define MX8MQ_IOMUXC_JTAG_TDI 0x000 0x268 0x000 0x0 0x0 618 + #define MX8MQ_IOMUXC_JTAG_TMS 0x000 0x26C 0x000 0x0 0x0 619 + #define MX8MQ_IOMUXC_JTAG_TCK 0x000 0x270 0x000 0x0 0x0 620 + #define MX8MQ_IOMUXC_JTAG_TDO 0x000 0x274 0x000 0x0 0x0 621 + #define MX8MQ_IOMUXC_RTC 0x000 0x278 0x000 0x0 0x0 622 + 623 + #endif /* __DTS_IMX8MQ_PINFUNC_H */
+416
arch/arm64/boot/dts/freescale/imx8mq.dtsi
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 + /* 3 + * Copyright 2017 NXP 4 + * Copyright (C) 2017-2018 Pengutronix, Lucas Stach <kernel@pengutronix.de> 5 + */ 6 + 7 + #include <dt-bindings/clock/imx8mq-clock.h> 8 + #include <dt-bindings/gpio/gpio.h> 9 + #include <dt-bindings/interrupt-controller/arm-gic.h> 10 + #include "imx8mq-pinfunc.h" 11 + 12 + / { 13 + /* This should really be the GPC, but we need a driver for this first */ 14 + interrupt-parent = <&gic>; 15 + 16 + #address-cells = <2>; 17 + #size-cells = <2>; 18 + 19 + aliases { 20 + i2c0 = &i2c1; 21 + i2c1 = &i2c2; 22 + i2c2 = &i2c3; 23 + i2c3 = &i2c4; 24 + serial0 = &uart1; 25 + serial1 = &uart2; 26 + serial2 = &uart3; 27 + serial3 = &uart4; 28 + }; 29 + 30 + ckil: clock-ckil { 31 + compatible = "fixed-clock"; 32 + #clock-cells = <0>; 33 + clock-frequency = <32768>; 34 + clock-output-names = "ckil"; 35 + }; 36 + 37 + osc_25m: clock-osc-25m { 38 + compatible = "fixed-clock"; 39 + #clock-cells = <0>; 40 + clock-frequency = <25000000>; 41 + clock-output-names = "osc_25m"; 42 + }; 43 + 44 + osc_27m: clock-osc-27m { 45 + compatible = "fixed-clock"; 46 + #clock-cells = <0>; 47 + clock-frequency = <27000000>; 48 + clock-output-names = "osc_27m"; 49 + }; 50 + 51 + clk_ext1: clock-ext1 { 52 + compatible = "fixed-clock"; 53 + #clock-cells = <0>; 54 + clock-frequency = <133000000>; 55 + clock-output-names = "clk_ext1"; 56 + }; 57 + 58 + clk_ext2: clock-ext2 { 59 + compatible = "fixed-clock"; 60 + #clock-cells = <0>; 61 + clock-frequency = <133000000>; 62 + clock-output-names = "clk_ext2"; 63 + }; 64 + 65 + clk_ext3: clock-ext3 { 66 + compatible = "fixed-clock"; 67 + #clock-cells = <0>; 68 + clock-frequency = <133000000>; 69 + clock-output-names = "clk_ext3"; 70 + }; 71 + 72 + clk_ext4: clock-ext4 { 73 + compatible = "fixed-clock"; 74 + #clock-cells = <0>; 75 + clock-frequency= <133000000>; 76 + clock-output-names = "clk_ext4"; 77 + }; 78 + 79 + cpus { 80 + #address-cells = <1>; 81 + #size-cells = <0>; 82 + 83 + A53_0: cpu@0 { 84 + device_type = "cpu"; 85 + compatible = "arm,cortex-a53"; 86 + reg = <0x0>; 87 + enable-method = "psci"; 88 + next-level-cache = <&A53_L2>; 89 + }; 90 + 91 + A53_1: cpu@1 { 92 + device_type = "cpu"; 93 + compatible = "arm,cortex-a53"; 94 + reg = <0x1>; 95 + enable-method = "psci"; 96 + next-level-cache = <&A53_L2>; 97 + }; 98 + 99 + A53_2: cpu@2 { 100 + device_type = "cpu"; 101 + compatible = "arm,cortex-a53"; 102 + reg = <0x2>; 103 + enable-method = "psci"; 104 + next-level-cache = <&A53_L2>; 105 + }; 106 + 107 + A53_3: cpu@3 { 108 + device_type = "cpu"; 109 + compatible = "arm,cortex-a53"; 110 + reg = <0x3>; 111 + enable-method = "psci"; 112 + next-level-cache = <&A53_L2>; 113 + }; 114 + 115 + A53_L2: l2-cache0 { 116 + compatible = "cache"; 117 + }; 118 + }; 119 + 120 + psci { 121 + compatible = "arm,psci-1.0"; 122 + method = "smc"; 123 + }; 124 + 125 + timer { 126 + compatible = "arm,armv8-timer"; 127 + interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>, /* Physical Secure */ 128 + <GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>, /* Physical Non-Secure */ 129 + <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>, /* Virtual */ 130 + <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>; /* Hypervisor */ 131 + interrupt-parent = <&gic>; 132 + arm,no-tick-in-suspend; 133 + }; 134 + 135 + soc@0 { 136 + compatible = "simple-bus"; 137 + #address-cells = <1>; 138 + #size-cells = <1>; 139 + ranges = <0x0 0x0 0x0 0x3e000000>; 140 + 141 + bus@30000000 { /* AIPS1 */ 142 + compatible = "fsl,imx8mq-aips-bus", "simple-bus"; 143 + #address-cells = <1>; 144 + #size-cells = <1>; 145 + ranges = <0x30000000 0x30000000 0x400000>; 146 + 147 + gpio1: gpio@30200000 { 148 + compatible = "fsl,imx8mq-gpio", "fsl,imx35-gpio"; 149 + reg = <0x30200000 0x10000>; 150 + interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>, 151 + <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>; 152 + gpio-controller; 153 + #gpio-cells = <2>; 154 + interrupt-controller; 155 + #interrupt-cells = <2>; 156 + }; 157 + 158 + gpio2: gpio@30210000 { 159 + compatible = "fsl,imx8mq-gpio", "fsl,imx35-gpio"; 160 + reg = <0x30210000 0x10000>; 161 + interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, 162 + <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; 163 + gpio-controller; 164 + #gpio-cells = <2>; 165 + interrupt-controller; 166 + #interrupt-cells = <2>; 167 + }; 168 + 169 + gpio3: gpio@30220000 { 170 + compatible = "fsl,imx8mq-gpio", "fsl,imx35-gpio"; 171 + reg = <0x30220000 0x10000>; 172 + interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>, 173 + <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>; 174 + gpio-controller; 175 + #gpio-cells = <2>; 176 + interrupt-controller; 177 + #interrupt-cells = <2>; 178 + }; 179 + 180 + gpio4: gpio@30230000 { 181 + compatible = "fsl,imx8mq-gpio", "fsl,imx35-gpio"; 182 + reg = <0x30230000 0x10000>; 183 + interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>, 184 + <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>; 185 + gpio-controller; 186 + #gpio-cells = <2>; 187 + interrupt-controller; 188 + #interrupt-cells = <2>; 189 + }; 190 + 191 + gpio5: gpio@30240000 { 192 + compatible = "fsl,imx8mq-gpio", "fsl,imx35-gpio"; 193 + reg = <0x30240000 0x10000>; 194 + interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>, 195 + <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; 196 + gpio-controller; 197 + #gpio-cells = <2>; 198 + interrupt-controller; 199 + #interrupt-cells = <2>; 200 + }; 201 + 202 + iomuxc: iomuxc@30330000 { 203 + compatible = "fsl,imx8mq-iomuxc"; 204 + reg = <0x30330000 0x10000>; 205 + }; 206 + 207 + iomuxc_gpr: syscon@30340000 { 208 + compatible = "fsl,imx8mq-iomuxc-gpr", "syscon"; 209 + reg = <0x30340000 0x10000>; 210 + }; 211 + 212 + anatop: syscon@30360000 { 213 + compatible = "fsl,imx8mq-anatop", "syscon"; 214 + reg = <0x30360000 0x10000>; 215 + interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>; 216 + }; 217 + 218 + clk: clock-controller@30380000 { 219 + compatible = "fsl,imx8mq-ccm"; 220 + reg = <0x30380000 0x10000>; 221 + interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>, 222 + <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>; 223 + #clock-cells = <1>; 224 + clocks = <&ckil>, <&osc_25m>, <&osc_27m>, 225 + <&clk_ext1>, <&clk_ext2>, 226 + <&clk_ext3>, <&clk_ext4>; 227 + clock-names = "ckil", "osc_25m", "osc_27m", 228 + "clk_ext1", "clk_ext2", 229 + "clk_ext3", "clk_ext4"; 230 + }; 231 + 232 + wdog1: watchdog@30280000 { 233 + compatible = "fsl,imx8mq-wdt", "fsl,imx21-wdt"; 234 + reg = <0x30280000 0x10000>; 235 + interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; 236 + clocks = <&clk IMX8MQ_CLK_WDOG1_ROOT>; 237 + status = "disabled"; 238 + }; 239 + 240 + wdog2: watchdog@30290000 { 241 + compatible = "fsl,imx8mq-wdt", "fsl,imx21-wdt"; 242 + reg = <0x30290000 0x10000>; 243 + interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>; 244 + clocks = <&clk IMX8MQ_CLK_WDOG2_ROOT>; 245 + status = "disabled"; 246 + }; 247 + 248 + wdog3: watchdog@302a0000 { 249 + compatible = "fsl,imx8mq-wdt", "fsl,imx21-wdt"; 250 + reg = <0x302a0000 0x10000>; 251 + interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; 252 + clocks = <&clk IMX8MQ_CLK_WDOG3_ROOT>; 253 + status = "disabled"; 254 + }; 255 + }; 256 + 257 + bus@30400000 { /* AIPS2 */ 258 + compatible = "fsl,imx8mq-aips-bus", "simple-bus"; 259 + #address-cells = <1>; 260 + #size-cells = <1>; 261 + ranges = <0x30400000 0x30400000 0x400000>; 262 + }; 263 + 264 + bus@30800000 { /* AIPS3 */ 265 + compatible = "fsl,imx8mq-aips-bus", "simple-bus"; 266 + #address-cells = <1>; 267 + #size-cells = <1>; 268 + ranges = <0x30800000 0x30800000 0x400000>; 269 + 270 + uart1: serial@30860000 { 271 + compatible = "fsl,imx8mq-uart", 272 + "fsl,imx6q-uart"; 273 + reg = <0x30860000 0x10000>; 274 + interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; 275 + clocks = <&clk IMX8MQ_CLK_UART1_ROOT>, 276 + <&clk IMX8MQ_CLK_UART1_ROOT>; 277 + clock-names = "ipg", "per"; 278 + status = "disabled"; 279 + }; 280 + 281 + uart3: serial@30880000 { 282 + compatible = "fsl,imx8mq-uart", 283 + "fsl,imx6q-uart"; 284 + reg = <0x30880000 0x10000>; 285 + interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; 286 + clocks = <&clk IMX8MQ_CLK_UART3_ROOT>, 287 + <&clk IMX8MQ_CLK_UART3_ROOT>; 288 + clock-names = "ipg", "per"; 289 + status = "disabled"; 290 + }; 291 + 292 + uart2: serial@30890000 { 293 + compatible = "fsl,imx8mq-uart", 294 + "fsl,imx6q-uart"; 295 + reg = <0x30890000 0x10000>; 296 + interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>; 297 + clocks = <&clk IMX8MQ_CLK_UART2_ROOT>, 298 + <&clk IMX8MQ_CLK_UART2_ROOT>; 299 + clock-names = "ipg", "per"; 300 + status = "disabled"; 301 + }; 302 + 303 + i2c1: i2c@30a20000 { 304 + compatible = "fsl,imx8mq-i2c", "fsl,imx21-i2c"; 305 + reg = <0x30a20000 0x10000>; 306 + interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>; 307 + clocks = <&clk IMX8MQ_CLK_I2C1_ROOT>; 308 + #address-cells = <1>; 309 + #size-cells = <0>; 310 + status = "disabled"; 311 + }; 312 + 313 + i2c2: i2c@30a30000 { 314 + compatible = "fsl,imx8mq-i2c", "fsl,imx21-i2c"; 315 + reg = <0x30a30000 0x10000>; 316 + interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>; 317 + clocks = <&clk IMX8MQ_CLK_I2C2_ROOT>; 318 + #address-cells = <1>; 319 + #size-cells = <0>; 320 + status = "disabled"; 321 + }; 322 + 323 + i2c3: i2c@30a40000 { 324 + compatible = "fsl,imx8mq-i2c", "fsl,imx21-i2c"; 325 + reg = <0x30a40000 0x10000>; 326 + interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>; 327 + clocks = <&clk IMX8MQ_CLK_I2C3_ROOT>; 328 + #address-cells = <1>; 329 + #size-cells = <0>; 330 + status = "disabled"; 331 + }; 332 + 333 + i2c4: i2c@30a50000 { 334 + compatible = "fsl,imx8mq-i2c", "fsl,imx21-i2c"; 335 + reg = <0x30a50000 0x10000>; 336 + interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>; 337 + clocks = <&clk IMX8MQ_CLK_I2C4_ROOT>; 338 + #address-cells = <1>; 339 + #size-cells = <0>; 340 + status = "disabled"; 341 + }; 342 + 343 + uart4: serial@30a60000 { 344 + compatible = "fsl,imx8mq-uart", 345 + "fsl,imx6q-uart"; 346 + reg = <0x30a60000 0x10000>; 347 + interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>; 348 + clocks = <&clk IMX8MQ_CLK_UART4_ROOT>, 349 + <&clk IMX8MQ_CLK_UART4_ROOT>; 350 + clock-names = "ipg", "per"; 351 + status = "disabled"; 352 + }; 353 + 354 + usdhc1: mmc@30b40000 { 355 + compatible = "fsl,imx8mq-usdhc", 356 + "fsl,imx7d-usdhc"; 357 + reg = <0x30b40000 0x10000>; 358 + interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>; 359 + clocks = <&clk IMX8MQ_CLK_DUMMY>, 360 + <&clk IMX8MQ_CLK_NAND_USDHC_BUS>, 361 + <&clk IMX8MQ_CLK_USDHC1_ROOT>; 362 + clock-names = "ipg", "ahb", "per"; 363 + fsl,tuning-start-tap = <20>; 364 + fsl,tuning-step = <2>; 365 + bus-width = <4>; 366 + status = "disabled"; 367 + }; 368 + 369 + usdhc2: mmc@30b50000 { 370 + compatible = "fsl,imx8mq-usdhc", 371 + "fsl,imx7d-usdhc"; 372 + reg = <0x30b50000 0x10000>; 373 + interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; 374 + clocks = <&clk IMX8MQ_CLK_DUMMY>, 375 + <&clk IMX8MQ_CLK_NAND_USDHC_BUS>, 376 + <&clk IMX8MQ_CLK_USDHC2_ROOT>; 377 + clock-names = "ipg", "ahb", "per"; 378 + fsl,tuning-start-tap = <20>; 379 + fsl,tuning-step = <2>; 380 + bus-width = <4>; 381 + status = "disabled"; 382 + }; 383 + 384 + fec1: ethernet@30be0000 { 385 + compatible = "fsl,imx8mq-fec", "fsl,imx6sx-fec"; 386 + reg = <0x30be0000 0x10000>; 387 + interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, 388 + <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>, 389 + <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; 390 + clocks = <&clk IMX8MQ_CLK_ENET1_ROOT>, 391 + <&clk IMX8MQ_CLK_ENET1_ROOT>, 392 + <&clk IMX8MQ_CLK_ENET_TIMER>, 393 + <&clk IMX8MQ_CLK_ENET_REF>, 394 + <&clk IMX8MQ_CLK_ENET_PHY_REF>; 395 + clock-names = "ipg", "ahb", "ptp", 396 + "enet_clk_ref", "enet_out"; 397 + fsl,num-tx-queues = <3>; 398 + fsl,num-rx-queues = <3>; 399 + status = "disabled"; 400 + }; 401 + }; 402 + 403 + gic: interrupt-controller@38800000 { 404 + compatible = "arm,gic-v3"; 405 + reg = <0x38800000 0x10000>, /* GIC Dist */ 406 + <0x38880000 0xc0000>, /* GICR */ 407 + <0x31000000 0x2000>, /* GICC */ 408 + <0x31010000 0x2000>, /* GICV */ 409 + <0x31020000 0x2000>; /* GICH */ 410 + #interrupt-cells = <3>; 411 + interrupt-controller; 412 + interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>; 413 + interrupt-parent = <&gic>; 414 + }; 415 + }; 416 + };
+1
arch/arm64/configs/defconfig
··· 403 403 CONFIG_ROCKCHIP_THERMAL=m 404 404 CONFIG_RCAR_GEN3_THERMAL=y 405 405 CONFIG_ARMADA_THERMAL=y 406 + CONFIG_BCM2835_THERMAL=m 406 407 CONFIG_BRCMSTB_THERMAL=m 407 408 CONFIG_EXYNOS_THERMAL=y 408 409 CONFIG_TEGRA_BPMP_THERMAL=m
+9
drivers/memory/Kconfig
··· 145 145 Texas Instruments da8xx SoCs. It's used to tweak various memory 146 146 controller configuration options. 147 147 148 + config PL353_SMC 149 + tristate "ARM PL35X Static Memory Controller(SMC) driver" 150 + default y 151 + depends on ARM 152 + depends on ARM_AMBA 153 + help 154 + This driver is for the ARM PL351/PL353 Static Memory 155 + Controller(SMC) module. 156 + 148 157 source "drivers/memory/samsung/Kconfig" 149 158 source "drivers/memory/tegra/Kconfig" 150 159
+1
drivers/memory/Makefile
··· 19 19 obj-$(CONFIG_JZ4780_NEMC) += jz4780-nemc.o 20 20 obj-$(CONFIG_MTK_SMI) += mtk-smi.o 21 21 obj-$(CONFIG_DA8XX_DDRCTL) += da8xx-ddrctl.o 22 + obj-$(CONFIG_PL353_SMC) += pl353-smc.o 22 23 23 24 obj-$(CONFIG_SAMSUNG_MC) += samsung/ 24 25 obj-$(CONFIG_TEGRA_MC) += tegra/
+463
drivers/memory/pl353-smc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * ARM PL353 SMC driver 4 + * 5 + * Copyright (C) 2012 - 2018 Xilinx, Inc 6 + * Author: Punnaiah Choudary Kalluri <punnaiah@xilinx.com> 7 + * Author: Naga Sureshkumar Relli <nagasure@xilinx.com> 8 + */ 9 + 10 + #include <linux/clk.h> 11 + #include <linux/io.h> 12 + #include <linux/kernel.h> 13 + #include <linux/module.h> 14 + #include <linux/of_platform.h> 15 + #include <linux/platform_device.h> 16 + #include <linux/slab.h> 17 + #include <linux/pl353-smc.h> 18 + #include <linux/amba/bus.h> 19 + 20 + /* Register definitions */ 21 + #define PL353_SMC_MEMC_STATUS_OFFS 0 /* Controller status reg, RO */ 22 + #define PL353_SMC_CFG_CLR_OFFS 0xC /* Clear config reg, WO */ 23 + #define PL353_SMC_DIRECT_CMD_OFFS 0x10 /* Direct command reg, WO */ 24 + #define PL353_SMC_SET_CYCLES_OFFS 0x14 /* Set cycles register, WO */ 25 + #define PL353_SMC_SET_OPMODE_OFFS 0x18 /* Set opmode register, WO */ 26 + #define PL353_SMC_ECC_STATUS_OFFS 0x400 /* ECC status register */ 27 + #define PL353_SMC_ECC_MEMCFG_OFFS 0x404 /* ECC mem config reg */ 28 + #define PL353_SMC_ECC_MEMCMD1_OFFS 0x408 /* ECC mem cmd1 reg */ 29 + #define PL353_SMC_ECC_MEMCMD2_OFFS 0x40C /* ECC mem cmd2 reg */ 30 + #define PL353_SMC_ECC_VALUE0_OFFS 0x418 /* ECC value 0 reg */ 31 + 32 + /* Controller status register specific constants */ 33 + #define PL353_SMC_MEMC_STATUS_RAW_INT_1_SHIFT 6 34 + 35 + /* Clear configuration register specific constants */ 36 + #define PL353_SMC_CFG_CLR_INT_CLR_1 0x10 37 + #define PL353_SMC_CFG_CLR_ECC_INT_DIS_1 0x40 38 + #define PL353_SMC_CFG_CLR_INT_DIS_1 0x2 39 + #define PL353_SMC_CFG_CLR_DEFAULT_MASK (PL353_SMC_CFG_CLR_INT_CLR_1 | \ 40 + PL353_SMC_CFG_CLR_ECC_INT_DIS_1 | \ 41 + PL353_SMC_CFG_CLR_INT_DIS_1) 42 + 43 + /* Set cycles register specific constants */ 44 + #define PL353_SMC_SET_CYCLES_T0_MASK 0xF 45 + #define PL353_SMC_SET_CYCLES_T0_SHIFT 0 46 + #define PL353_SMC_SET_CYCLES_T1_MASK 0xF 47 + #define PL353_SMC_SET_CYCLES_T1_SHIFT 4 48 + #define PL353_SMC_SET_CYCLES_T2_MASK 0x7 49 + #define PL353_SMC_SET_CYCLES_T2_SHIFT 8 50 + #define PL353_SMC_SET_CYCLES_T3_MASK 0x7 51 + #define PL353_SMC_SET_CYCLES_T3_SHIFT 11 52 + #define PL353_SMC_SET_CYCLES_T4_MASK 0x7 53 + #define PL353_SMC_SET_CYCLES_T4_SHIFT 14 54 + #define PL353_SMC_SET_CYCLES_T5_MASK 0x7 55 + #define PL353_SMC_SET_CYCLES_T5_SHIFT 17 56 + #define PL353_SMC_SET_CYCLES_T6_MASK 0xF 57 + #define PL353_SMC_SET_CYCLES_T6_SHIFT 20 58 + 59 + /* ECC status register specific constants */ 60 + #define PL353_SMC_ECC_STATUS_BUSY BIT(6) 61 + #define PL353_SMC_ECC_REG_SIZE_OFFS 4 62 + 63 + /* ECC memory config register specific constants */ 64 + #define PL353_SMC_ECC_MEMCFG_MODE_MASK 0xC 65 + #define PL353_SMC_ECC_MEMCFG_MODE_SHIFT 2 66 + #define PL353_SMC_ECC_MEMCFG_PGSIZE_MASK 0xC 67 + 68 + #define PL353_SMC_DC_UPT_NAND_REGS ((4 << 23) | /* CS: NAND chip */ \ 69 + (2 << 21)) /* UpdateRegs operation */ 70 + 71 + #define PL353_NAND_ECC_CMD1 ((0x80) | /* Write command */ \ 72 + (0 << 8) | /* Read command */ \ 73 + (0x30 << 16) | /* Read End command */ \ 74 + (1 << 24)) /* Read End command calid */ 75 + 76 + #define PL353_NAND_ECC_CMD2 ((0x85) | /* Write col change cmd */ \ 77 + (5 << 8) | /* Read col change cmd */ \ 78 + (0xE0 << 16) | /* Read col change end cmd */ \ 79 + (1 << 24)) /* Read col change end cmd valid */ 80 + #define PL353_NAND_ECC_BUSY_TIMEOUT (1 * HZ) 81 + /** 82 + * struct pl353_smc_data - Private smc driver structure 83 + * @memclk: Pointer to the peripheral clock 84 + * @aclk: Pointer to the APER clock 85 + */ 86 + struct pl353_smc_data { 87 + struct clk *memclk; 88 + struct clk *aclk; 89 + }; 90 + 91 + /* SMC virtual register base */ 92 + static void __iomem *pl353_smc_base; 93 + 94 + /** 95 + * pl353_smc_set_buswidth - Set memory buswidth 96 + * @bw: Memory buswidth (8 | 16) 97 + * Return: 0 on success or negative errno. 98 + */ 99 + int pl353_smc_set_buswidth(unsigned int bw) 100 + { 101 + if (bw != PL353_SMC_MEM_WIDTH_8 && bw != PL353_SMC_MEM_WIDTH_16) 102 + return -EINVAL; 103 + 104 + writel(bw, pl353_smc_base + PL353_SMC_SET_OPMODE_OFFS); 105 + writel(PL353_SMC_DC_UPT_NAND_REGS, pl353_smc_base + 106 + PL353_SMC_DIRECT_CMD_OFFS); 107 + 108 + return 0; 109 + } 110 + EXPORT_SYMBOL_GPL(pl353_smc_set_buswidth); 111 + 112 + /** 113 + * pl353_smc_set_cycles - Set memory timing parameters 114 + * @timings: NAND controller timing parameters 115 + * 116 + * Sets NAND chip specific timing parameters. 117 + */ 118 + void pl353_smc_set_cycles(u32 timings[]) 119 + { 120 + /* 121 + * Set write pulse timing. This one is easy to extract: 122 + * 123 + * NWE_PULSE = tWP 124 + */ 125 + timings[0] &= PL353_SMC_SET_CYCLES_T0_MASK; 126 + timings[1] = (timings[1] & PL353_SMC_SET_CYCLES_T1_MASK) << 127 + PL353_SMC_SET_CYCLES_T1_SHIFT; 128 + timings[2] = (timings[2] & PL353_SMC_SET_CYCLES_T2_MASK) << 129 + PL353_SMC_SET_CYCLES_T2_SHIFT; 130 + timings[3] = (timings[3] & PL353_SMC_SET_CYCLES_T3_MASK) << 131 + PL353_SMC_SET_CYCLES_T3_SHIFT; 132 + timings[4] = (timings[4] & PL353_SMC_SET_CYCLES_T4_MASK) << 133 + PL353_SMC_SET_CYCLES_T4_SHIFT; 134 + timings[5] = (timings[5] & PL353_SMC_SET_CYCLES_T5_MASK) << 135 + PL353_SMC_SET_CYCLES_T5_SHIFT; 136 + timings[6] = (timings[6] & PL353_SMC_SET_CYCLES_T6_MASK) << 137 + PL353_SMC_SET_CYCLES_T6_SHIFT; 138 + timings[0] |= timings[1] | timings[2] | timings[3] | 139 + timings[4] | timings[5] | timings[6]; 140 + 141 + writel(timings[0], pl353_smc_base + PL353_SMC_SET_CYCLES_OFFS); 142 + writel(PL353_SMC_DC_UPT_NAND_REGS, pl353_smc_base + 143 + PL353_SMC_DIRECT_CMD_OFFS); 144 + } 145 + EXPORT_SYMBOL_GPL(pl353_smc_set_cycles); 146 + 147 + /** 148 + * pl353_smc_ecc_is_busy - Read ecc busy flag 149 + * Return: the ecc_status bit from the ecc_status register. 1 = busy, 0 = idle 150 + */ 151 + bool pl353_smc_ecc_is_busy(void) 152 + { 153 + return ((readl(pl353_smc_base + PL353_SMC_ECC_STATUS_OFFS) & 154 + PL353_SMC_ECC_STATUS_BUSY) == PL353_SMC_ECC_STATUS_BUSY); 155 + } 156 + EXPORT_SYMBOL_GPL(pl353_smc_ecc_is_busy); 157 + 158 + /** 159 + * pl353_smc_get_ecc_val - Read ecc_valueN registers 160 + * @ecc_reg: Index of the ecc_value reg (0..3) 161 + * Return: the content of the requested ecc_value register. 162 + * 163 + * There are four valid ecc_value registers. The argument is truncated to stay 164 + * within this valid boundary. 165 + */ 166 + u32 pl353_smc_get_ecc_val(int ecc_reg) 167 + { 168 + u32 addr, reg; 169 + 170 + addr = PL353_SMC_ECC_VALUE0_OFFS + 171 + (ecc_reg * PL353_SMC_ECC_REG_SIZE_OFFS); 172 + reg = readl(pl353_smc_base + addr); 173 + 174 + return reg; 175 + } 176 + EXPORT_SYMBOL_GPL(pl353_smc_get_ecc_val); 177 + 178 + /** 179 + * pl353_smc_get_nand_int_status_raw - Get NAND interrupt status bit 180 + * Return: the raw_int_status1 bit from the memc_status register 181 + */ 182 + int pl353_smc_get_nand_int_status_raw(void) 183 + { 184 + u32 reg; 185 + 186 + reg = readl(pl353_smc_base + PL353_SMC_MEMC_STATUS_OFFS); 187 + reg >>= PL353_SMC_MEMC_STATUS_RAW_INT_1_SHIFT; 188 + reg &= 1; 189 + 190 + return reg; 191 + } 192 + EXPORT_SYMBOL_GPL(pl353_smc_get_nand_int_status_raw); 193 + 194 + /** 195 + * pl353_smc_clr_nand_int - Clear NAND interrupt 196 + */ 197 + void pl353_smc_clr_nand_int(void) 198 + { 199 + writel(PL353_SMC_CFG_CLR_INT_CLR_1, 200 + pl353_smc_base + PL353_SMC_CFG_CLR_OFFS); 201 + } 202 + EXPORT_SYMBOL_GPL(pl353_smc_clr_nand_int); 203 + 204 + /** 205 + * pl353_smc_set_ecc_mode - Set SMC ECC mode 206 + * @mode: ECC mode (BYPASS, APB, MEM) 207 + * Return: 0 on success or negative errno. 208 + */ 209 + int pl353_smc_set_ecc_mode(enum pl353_smc_ecc_mode mode) 210 + { 211 + u32 reg; 212 + int ret = 0; 213 + 214 + switch (mode) { 215 + case PL353_SMC_ECCMODE_BYPASS: 216 + case PL353_SMC_ECCMODE_APB: 217 + case PL353_SMC_ECCMODE_MEM: 218 + 219 + reg = readl(pl353_smc_base + PL353_SMC_ECC_MEMCFG_OFFS); 220 + reg &= ~PL353_SMC_ECC_MEMCFG_MODE_MASK; 221 + reg |= mode << PL353_SMC_ECC_MEMCFG_MODE_SHIFT; 222 + writel(reg, pl353_smc_base + PL353_SMC_ECC_MEMCFG_OFFS); 223 + 224 + break; 225 + default: 226 + ret = -EINVAL; 227 + } 228 + 229 + return ret; 230 + } 231 + EXPORT_SYMBOL_GPL(pl353_smc_set_ecc_mode); 232 + 233 + /** 234 + * pl353_smc_set_ecc_pg_size - Set SMC ECC page size 235 + * @pg_sz: ECC page size 236 + * Return: 0 on success or negative errno. 237 + */ 238 + int pl353_smc_set_ecc_pg_size(unsigned int pg_sz) 239 + { 240 + u32 reg, sz; 241 + 242 + switch (pg_sz) { 243 + case 0: 244 + sz = 0; 245 + break; 246 + case SZ_512: 247 + sz = 1; 248 + break; 249 + case SZ_1K: 250 + sz = 2; 251 + break; 252 + case SZ_2K: 253 + sz = 3; 254 + break; 255 + default: 256 + return -EINVAL; 257 + } 258 + 259 + reg = readl(pl353_smc_base + PL353_SMC_ECC_MEMCFG_OFFS); 260 + reg &= ~PL353_SMC_ECC_MEMCFG_PGSIZE_MASK; 261 + reg |= sz; 262 + writel(reg, pl353_smc_base + PL353_SMC_ECC_MEMCFG_OFFS); 263 + 264 + return 0; 265 + } 266 + EXPORT_SYMBOL_GPL(pl353_smc_set_ecc_pg_size); 267 + 268 + static int __maybe_unused pl353_smc_suspend(struct device *dev) 269 + { 270 + struct pl353_smc_data *pl353_smc = dev_get_drvdata(dev); 271 + 272 + clk_disable(pl353_smc->memclk); 273 + clk_disable(pl353_smc->aclk); 274 + 275 + return 0; 276 + } 277 + 278 + static int __maybe_unused pl353_smc_resume(struct device *dev) 279 + { 280 + int ret; 281 + struct pl353_smc_data *pl353_smc = dev_get_drvdata(dev); 282 + 283 + ret = clk_enable(pl353_smc->aclk); 284 + if (ret) { 285 + dev_err(dev, "Cannot enable axi domain clock.\n"); 286 + return ret; 287 + } 288 + 289 + ret = clk_enable(pl353_smc->memclk); 290 + if (ret) { 291 + dev_err(dev, "Cannot enable memory clock.\n"); 292 + clk_disable(pl353_smc->aclk); 293 + return ret; 294 + } 295 + 296 + return ret; 297 + } 298 + 299 + static struct amba_driver pl353_smc_driver; 300 + 301 + static SIMPLE_DEV_PM_OPS(pl353_smc_dev_pm_ops, pl353_smc_suspend, 302 + pl353_smc_resume); 303 + 304 + /** 305 + * pl353_smc_init_nand_interface - Initialize the NAND interface 306 + * @adev: Pointer to the amba_device struct 307 + * @nand_node: Pointer to the pl353_nand device_node struct 308 + */ 309 + static void pl353_smc_init_nand_interface(struct amba_device *adev, 310 + struct device_node *nand_node) 311 + { 312 + unsigned long timeout; 313 + 314 + pl353_smc_set_buswidth(PL353_SMC_MEM_WIDTH_8); 315 + writel(PL353_SMC_CFG_CLR_INT_CLR_1, 316 + pl353_smc_base + PL353_SMC_CFG_CLR_OFFS); 317 + writel(PL353_SMC_DC_UPT_NAND_REGS, pl353_smc_base + 318 + PL353_SMC_DIRECT_CMD_OFFS); 319 + 320 + timeout = jiffies + PL353_NAND_ECC_BUSY_TIMEOUT; 321 + /* Wait till the ECC operation is complete */ 322 + do { 323 + if (pl353_smc_ecc_is_busy()) 324 + cpu_relax(); 325 + else 326 + break; 327 + } while (!time_after_eq(jiffies, timeout)); 328 + 329 + if (time_after_eq(jiffies, timeout)) 330 + return; 331 + 332 + writel(PL353_NAND_ECC_CMD1, 333 + pl353_smc_base + PL353_SMC_ECC_MEMCMD1_OFFS); 334 + writel(PL353_NAND_ECC_CMD2, 335 + pl353_smc_base + PL353_SMC_ECC_MEMCMD2_OFFS); 336 + } 337 + 338 + static const struct of_device_id pl353_smc_supported_children[] = { 339 + { 340 + .compatible = "cfi-flash" 341 + }, 342 + { 343 + .compatible = "arm,pl353-nand-r2p1", 344 + .data = pl353_smc_init_nand_interface 345 + }, 346 + {} 347 + }; 348 + 349 + static int pl353_smc_probe(struct amba_device *adev, const struct amba_id *id) 350 + { 351 + struct pl353_smc_data *pl353_smc; 352 + struct device_node *child; 353 + struct resource *res; 354 + int err; 355 + struct device_node *of_node = adev->dev.of_node; 356 + static void (*init)(struct amba_device *adev, 357 + struct device_node *nand_node); 358 + const struct of_device_id *match = NULL; 359 + 360 + pl353_smc = devm_kzalloc(&adev->dev, sizeof(*pl353_smc), GFP_KERNEL); 361 + if (!pl353_smc) 362 + return -ENOMEM; 363 + 364 + /* Get the NAND controller virtual address */ 365 + res = &adev->res; 366 + pl353_smc_base = devm_ioremap_resource(&adev->dev, res); 367 + if (IS_ERR(pl353_smc_base)) 368 + return PTR_ERR(pl353_smc_base); 369 + 370 + pl353_smc->aclk = devm_clk_get(&adev->dev, "apb_pclk"); 371 + if (IS_ERR(pl353_smc->aclk)) { 372 + dev_err(&adev->dev, "aclk clock not found.\n"); 373 + return PTR_ERR(pl353_smc->aclk); 374 + } 375 + 376 + pl353_smc->memclk = devm_clk_get(&adev->dev, "memclk"); 377 + if (IS_ERR(pl353_smc->memclk)) { 378 + dev_err(&adev->dev, "memclk clock not found.\n"); 379 + return PTR_ERR(pl353_smc->memclk); 380 + } 381 + 382 + err = clk_prepare_enable(pl353_smc->aclk); 383 + if (err) { 384 + dev_err(&adev->dev, "Unable to enable AXI clock.\n"); 385 + return err; 386 + } 387 + 388 + err = clk_prepare_enable(pl353_smc->memclk); 389 + if (err) { 390 + dev_err(&adev->dev, "Unable to enable memory clock.\n"); 391 + goto out_clk_dis_aper; 392 + } 393 + 394 + amba_set_drvdata(adev, pl353_smc); 395 + 396 + /* clear interrupts */ 397 + writel(PL353_SMC_CFG_CLR_DEFAULT_MASK, 398 + pl353_smc_base + PL353_SMC_CFG_CLR_OFFS); 399 + 400 + /* Find compatible children. Only a single child is supported */ 401 + for_each_available_child_of_node(of_node, child) { 402 + match = of_match_node(pl353_smc_supported_children, child); 403 + if (!match) { 404 + dev_warn(&adev->dev, "unsupported child node\n"); 405 + continue; 406 + } 407 + break; 408 + } 409 + if (!match) { 410 + dev_err(&adev->dev, "no matching children\n"); 411 + goto out_clk_disable; 412 + } 413 + 414 + init = match->data; 415 + if (init) 416 + init(adev, child); 417 + of_platform_device_create(child, NULL, &adev->dev); 418 + 419 + return 0; 420 + 421 + out_clk_disable: 422 + clk_disable_unprepare(pl353_smc->memclk); 423 + out_clk_dis_aper: 424 + clk_disable_unprepare(pl353_smc->aclk); 425 + 426 + return err; 427 + } 428 + 429 + static int pl353_smc_remove(struct amba_device *adev) 430 + { 431 + struct pl353_smc_data *pl353_smc = amba_get_drvdata(adev); 432 + 433 + clk_disable_unprepare(pl353_smc->memclk); 434 + clk_disable_unprepare(pl353_smc->aclk); 435 + 436 + return 0; 437 + } 438 + 439 + static const struct amba_id pl353_ids[] = { 440 + { 441 + .id = 0x00041353, 442 + .mask = 0x000fffff, 443 + }, 444 + { 0, 0 }, 445 + }; 446 + MODULE_DEVICE_TABLE(amba, pl353_ids); 447 + 448 + static struct amba_driver pl353_smc_driver = { 449 + .drv = { 450 + .owner = THIS_MODULE, 451 + .name = "pl353-smc", 452 + .pm = &pl353_smc_dev_pm_ops, 453 + }, 454 + .id_table = pl353_ids, 455 + .probe = pl353_smc_probe, 456 + .remove = pl353_smc_remove, 457 + }; 458 + 459 + module_amba_driver(pl353_smc_driver); 460 + 461 + MODULE_AUTHOR("Xilinx, Inc."); 462 + MODULE_DESCRIPTION("ARM PL353 SMC Driver"); 463 + MODULE_LICENSE("GPL");
+3
drivers/tee/optee/core.c
··· 631 631 632 632 optee_enable_shm_cache(optee); 633 633 634 + if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) 635 + pr_info("dynamic shared memory is enabled\n"); 636 + 634 637 pr_info("initialized driver\n"); 635 638 return optee; 636 639 err:
+7 -6
drivers/tee/optee/supp.c
··· 19 19 struct optee_supp_req { 20 20 struct list_head link; 21 21 22 - bool busy; 22 + bool in_queue; 23 23 u32 func; 24 24 u32 ret; 25 25 size_t num_params; ··· 54 54 55 55 /* Abort all request retrieved by supplicant */ 56 56 idr_for_each_entry(&supp->idr, req, id) { 57 - req->busy = false; 58 57 idr_remove(&supp->idr, id); 59 58 req->ret = TEEC_ERROR_COMMUNICATION; 60 59 complete(&req->c); ··· 62 63 /* Abort all queued requests */ 63 64 list_for_each_entry_safe(req, req_tmp, &supp->reqs, link) { 64 65 list_del(&req->link); 66 + req->in_queue = false; 65 67 req->ret = TEEC_ERROR_COMMUNICATION; 66 68 complete(&req->c); 67 69 } ··· 103 103 /* Insert the request in the request list */ 104 104 mutex_lock(&supp->mutex); 105 105 list_add_tail(&req->link, &supp->reqs); 106 + req->in_queue = true; 106 107 mutex_unlock(&supp->mutex); 107 108 108 109 /* Tell an eventual waiter there's a new request */ ··· 131 130 * will serve all requests in a timely manner and 132 131 * interrupting then wouldn't make sense. 133 132 */ 134 - interruptable = !req->busy; 135 - if (!req->busy) 133 + if (req->in_queue) { 136 134 list_del(&req->link); 135 + req->in_queue = false; 136 + } 137 137 } 138 138 mutex_unlock(&supp->mutex); 139 139 ··· 178 176 return ERR_PTR(-ENOMEM); 179 177 180 178 list_del(&req->link); 181 - req->busy = true; 179 + req->in_queue = false; 182 180 183 181 return req; 184 182 } ··· 320 318 if ((num_params - nm) != req->num_params) 321 319 return ERR_PTR(-EINVAL); 322 320 323 - req->busy = false; 324 321 idr_remove(&supp->idr, id); 325 322 supp->req_id = -1; 326 323 *num_meta = nm;
+19
drivers/tty/serial/Kconfig
··· 1529 1529 Say 'Y' here if you wish to use Actions Semiconductor S500/S900 UART 1530 1530 as the system console. 1531 1531 1532 + config SERIAL_RDA 1533 + bool "RDA Micro serial port support" 1534 + depends on ARCH_RDA || COMPILE_TEST 1535 + select SERIAL_CORE 1536 + help 1537 + This driver is for RDA8810PL SoC's UART. 1538 + Say 'Y' here if you wish to use the on-board serial port. 1539 + Otherwise, say 'N'. 1540 + 1541 + config SERIAL_RDA_CONSOLE 1542 + bool "Console on RDA Micro serial port" 1543 + depends on SERIAL_RDA=y 1544 + select SERIAL_CORE_CONSOLE 1545 + select SERIAL_EARLYCON 1546 + default y 1547 + help 1548 + Say 'Y' here if you wish to use the RDA8810PL UART as the system 1549 + console. Only earlycon is implemented currently. 1550 + 1532 1551 endmenu 1533 1552 1534 1553 config SERIAL_MCTRL_GPIO
+1
drivers/tty/serial/Makefile
··· 89 89 obj-$(CONFIG_SERIAL_PIC32) += pic32_uart.o 90 90 obj-$(CONFIG_SERIAL_MPS2_UART) += mps2-uart.o 91 91 obj-$(CONFIG_SERIAL_OWL) += owl-uart.o 92 + obj-$(CONFIG_SERIAL_RDA) += rda-uart.o 92 93 93 94 # GPIOLIB helpers for modem control lines 94 95 obj-$(CONFIG_SERIAL_MCTRL_GPIO) += serial_mctrl_gpio.o
+831
drivers/tty/serial/rda-uart.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * RDA8810PL serial device driver 4 + * 5 + * Copyright RDA Microelectronics Company Limited 6 + * Copyright (c) 2017 Andreas Färber 7 + * Copyright (c) 2018 Manivannan Sadhasivam 8 + */ 9 + 10 + #include <linux/clk.h> 11 + #include <linux/console.h> 12 + #include <linux/delay.h> 13 + #include <linux/io.h> 14 + #include <linux/module.h> 15 + #include <linux/of.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/serial.h> 18 + #include <linux/serial_core.h> 19 + #include <linux/tty.h> 20 + #include <linux/tty_flip.h> 21 + 22 + #define RDA_UART_PORT_NUM 3 23 + #define RDA_UART_DEV_NAME "ttyRDA" 24 + 25 + #define RDA_UART_CTRL 0x00 26 + #define RDA_UART_STATUS 0x04 27 + #define RDA_UART_RXTX_BUFFER 0x08 28 + #define RDA_UART_IRQ_MASK 0x0c 29 + #define RDA_UART_IRQ_CAUSE 0x10 30 + #define RDA_UART_IRQ_TRIGGERS 0x14 31 + #define RDA_UART_CMD_SET 0x18 32 + #define RDA_UART_CMD_CLR 0x1c 33 + 34 + /* UART_CTRL Bits */ 35 + #define RDA_UART_ENABLE BIT(0) 36 + #define RDA_UART_DBITS_8 BIT(1) 37 + #define RDA_UART_TX_SBITS_2 BIT(2) 38 + #define RDA_UART_PARITY_EN BIT(3) 39 + #define RDA_UART_PARITY(x) (((x) & 0x3) << 4) 40 + #define RDA_UART_PARITY_ODD RDA_UART_PARITY(0) 41 + #define RDA_UART_PARITY_EVEN RDA_UART_PARITY(1) 42 + #define RDA_UART_PARITY_SPACE RDA_UART_PARITY(2) 43 + #define RDA_UART_PARITY_MARK RDA_UART_PARITY(3) 44 + #define RDA_UART_DIV_MODE BIT(20) 45 + #define RDA_UART_IRDA_EN BIT(21) 46 + #define RDA_UART_DMA_EN BIT(22) 47 + #define RDA_UART_FLOW_CNT_EN BIT(23) 48 + #define RDA_UART_LOOP_BACK_EN BIT(24) 49 + #define RDA_UART_RX_LOCK_ERR BIT(25) 50 + #define RDA_UART_RX_BREAK_LEN(x) (((x) & 0xf) << 28) 51 + 52 + /* UART_STATUS Bits */ 53 + #define RDA_UART_RX_FIFO(x) (((x) & 0x7f) << 0) 54 + #define RDA_UART_RX_FIFO_MASK (0x7f << 0) 55 + #define RDA_UART_TX_FIFO(x) (((x) & 0x1f) << 8) 56 + #define RDA_UART_TX_FIFO_MASK (0x1f << 8) 57 + #define RDA_UART_TX_ACTIVE BIT(14) 58 + #define RDA_UART_RX_ACTIVE BIT(15) 59 + #define RDA_UART_RX_OVERFLOW_ERR BIT(16) 60 + #define RDA_UART_TX_OVERFLOW_ERR BIT(17) 61 + #define RDA_UART_RX_PARITY_ERR BIT(18) 62 + #define RDA_UART_RX_FRAMING_ERR BIT(19) 63 + #define RDA_UART_RX_BREAK_INT BIT(20) 64 + #define RDA_UART_DCTS BIT(24) 65 + #define RDA_UART_CTS BIT(25) 66 + #define RDA_UART_DTR BIT(28) 67 + #define RDA_UART_CLK_ENABLED BIT(31) 68 + 69 + /* UART_RXTX_BUFFER Bits */ 70 + #define RDA_UART_RX_DATA(x) (((x) & 0xff) << 0) 71 + #define RDA_UART_TX_DATA(x) (((x) & 0xff) << 0) 72 + 73 + /* UART_IRQ_MASK Bits */ 74 + #define RDA_UART_TX_MODEM_STATUS BIT(0) 75 + #define RDA_UART_RX_DATA_AVAILABLE BIT(1) 76 + #define RDA_UART_TX_DATA_NEEDED BIT(2) 77 + #define RDA_UART_RX_TIMEOUT BIT(3) 78 + #define RDA_UART_RX_LINE_ERR BIT(4) 79 + #define RDA_UART_TX_DMA_DONE BIT(5) 80 + #define RDA_UART_RX_DMA_DONE BIT(6) 81 + #define RDA_UART_RX_DMA_TIMEOUT BIT(7) 82 + #define RDA_UART_DTR_RISE BIT(8) 83 + #define RDA_UART_DTR_FALL BIT(9) 84 + 85 + /* UART_IRQ_CAUSE Bits */ 86 + #define RDA_UART_TX_MODEM_STATUS_U BIT(16) 87 + #define RDA_UART_RX_DATA_AVAILABLE_U BIT(17) 88 + #define RDA_UART_TX_DATA_NEEDED_U BIT(18) 89 + #define RDA_UART_RX_TIMEOUT_U BIT(19) 90 + #define RDA_UART_RX_LINE_ERR_U BIT(20) 91 + #define RDA_UART_TX_DMA_DONE_U BIT(21) 92 + #define RDA_UART_RX_DMA_DONE_U BIT(22) 93 + #define RDA_UART_RX_DMA_TIMEOUT_U BIT(23) 94 + #define RDA_UART_DTR_RISE_U BIT(24) 95 + #define RDA_UART_DTR_FALL_U BIT(25) 96 + 97 + /* UART_TRIGGERS Bits */ 98 + #define RDA_UART_RX_TRIGGER(x) (((x) & 0x1f) << 0) 99 + #define RDA_UART_TX_TRIGGER(x) (((x) & 0xf) << 8) 100 + #define RDA_UART_AFC_LEVEL(x) (((x) & 0x1f) << 16) 101 + 102 + /* UART_CMD_SET Bits */ 103 + #define RDA_UART_RI BIT(0) 104 + #define RDA_UART_DCD BIT(1) 105 + #define RDA_UART_DSR BIT(2) 106 + #define RDA_UART_TX_BREAK_CONTROL BIT(3) 107 + #define RDA_UART_TX_FINISH_N_WAIT BIT(4) 108 + #define RDA_UART_RTS BIT(5) 109 + #define RDA_UART_RX_FIFO_RESET BIT(6) 110 + #define RDA_UART_TX_FIFO_RESET BIT(7) 111 + 112 + #define RDA_UART_TX_FIFO_SIZE 16 113 + 114 + static struct uart_driver rda_uart_driver; 115 + 116 + struct rda_uart_port { 117 + struct uart_port port; 118 + struct clk *clk; 119 + }; 120 + 121 + #define to_rda_uart_port(port) container_of(port, struct rda_uart_port, port) 122 + 123 + static struct rda_uart_port *rda_uart_ports[RDA_UART_PORT_NUM]; 124 + 125 + static inline void rda_uart_write(struct uart_port *port, u32 val, 126 + unsigned int off) 127 + { 128 + writel(val, port->membase + off); 129 + } 130 + 131 + static inline u32 rda_uart_read(struct uart_port *port, unsigned int off) 132 + { 133 + return readl(port->membase + off); 134 + } 135 + 136 + static unsigned int rda_uart_tx_empty(struct uart_port *port) 137 + { 138 + unsigned long flags; 139 + unsigned int ret; 140 + u32 val; 141 + 142 + spin_lock_irqsave(&port->lock, flags); 143 + 144 + val = rda_uart_read(port, RDA_UART_STATUS); 145 + ret = (val & RDA_UART_TX_FIFO_MASK) ? TIOCSER_TEMT : 0; 146 + 147 + spin_unlock_irqrestore(&port->lock, flags); 148 + 149 + return ret; 150 + } 151 + 152 + static unsigned int rda_uart_get_mctrl(struct uart_port *port) 153 + { 154 + unsigned int mctrl = 0; 155 + u32 cmd_set, status; 156 + 157 + cmd_set = rda_uart_read(port, RDA_UART_CMD_SET); 158 + status = rda_uart_read(port, RDA_UART_STATUS); 159 + if (cmd_set & RDA_UART_RTS) 160 + mctrl |= TIOCM_RTS; 161 + if (!(status & RDA_UART_CTS)) 162 + mctrl |= TIOCM_CTS; 163 + 164 + return mctrl; 165 + } 166 + 167 + static void rda_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) 168 + { 169 + u32 val; 170 + 171 + if (mctrl & TIOCM_RTS) { 172 + val = rda_uart_read(port, RDA_UART_CMD_SET); 173 + rda_uart_write(port, (val | RDA_UART_RTS), RDA_UART_CMD_SET); 174 + } else { 175 + /* Clear RTS to stop to receive. */ 176 + val = rda_uart_read(port, RDA_UART_CMD_CLR); 177 + rda_uart_write(port, (val | RDA_UART_RTS), RDA_UART_CMD_CLR); 178 + } 179 + 180 + val = rda_uart_read(port, RDA_UART_CTRL); 181 + 182 + if (mctrl & TIOCM_LOOP) 183 + val |= RDA_UART_LOOP_BACK_EN; 184 + else 185 + val &= ~RDA_UART_LOOP_BACK_EN; 186 + 187 + rda_uart_write(port, val, RDA_UART_CTRL); 188 + } 189 + 190 + static void rda_uart_stop_tx(struct uart_port *port) 191 + { 192 + u32 val; 193 + 194 + val = rda_uart_read(port, RDA_UART_IRQ_MASK); 195 + val &= ~RDA_UART_TX_DATA_NEEDED; 196 + rda_uart_write(port, val, RDA_UART_IRQ_MASK); 197 + 198 + val = rda_uart_read(port, RDA_UART_CMD_SET); 199 + val |= RDA_UART_TX_FIFO_RESET; 200 + rda_uart_write(port, val, RDA_UART_CMD_SET); 201 + } 202 + 203 + static void rda_uart_stop_rx(struct uart_port *port) 204 + { 205 + u32 val; 206 + 207 + val = rda_uart_read(port, RDA_UART_IRQ_MASK); 208 + val &= ~(RDA_UART_RX_DATA_AVAILABLE | RDA_UART_RX_TIMEOUT); 209 + rda_uart_write(port, val, RDA_UART_IRQ_MASK); 210 + 211 + /* Read Rx buffer before reset to avoid Rx timeout interrupt */ 212 + val = rda_uart_read(port, RDA_UART_RXTX_BUFFER); 213 + 214 + val = rda_uart_read(port, RDA_UART_CMD_SET); 215 + val |= RDA_UART_RX_FIFO_RESET; 216 + rda_uart_write(port, val, RDA_UART_CMD_SET); 217 + } 218 + 219 + static void rda_uart_start_tx(struct uart_port *port) 220 + { 221 + u32 val; 222 + 223 + if (uart_tx_stopped(port)) { 224 + rda_uart_stop_tx(port); 225 + return; 226 + } 227 + 228 + val = rda_uart_read(port, RDA_UART_IRQ_MASK); 229 + val |= RDA_UART_TX_DATA_NEEDED; 230 + rda_uart_write(port, val, RDA_UART_IRQ_MASK); 231 + } 232 + 233 + static void rda_uart_change_baudrate(struct rda_uart_port *rda_port, 234 + unsigned long baud) 235 + { 236 + clk_set_rate(rda_port->clk, baud * 8); 237 + } 238 + 239 + static void rda_uart_set_termios(struct uart_port *port, 240 + struct ktermios *termios, 241 + struct ktermios *old) 242 + { 243 + struct rda_uart_port *rda_port = to_rda_uart_port(port); 244 + unsigned long flags; 245 + unsigned int ctrl, cmd_set, cmd_clr, triggers; 246 + unsigned int baud; 247 + u32 irq_mask; 248 + 249 + spin_lock_irqsave(&port->lock, flags); 250 + 251 + baud = uart_get_baud_rate(port, termios, old, 9600, port->uartclk / 4); 252 + rda_uart_change_baudrate(rda_port, baud); 253 + 254 + ctrl = rda_uart_read(port, RDA_UART_CTRL); 255 + cmd_set = rda_uart_read(port, RDA_UART_CMD_SET); 256 + cmd_clr = rda_uart_read(port, RDA_UART_CMD_CLR); 257 + 258 + switch (termios->c_cflag & CSIZE) { 259 + case CS5: 260 + case CS6: 261 + dev_warn(port->dev, "bit size not supported, using 7 bits\n"); 262 + /* Fall through */ 263 + case CS7: 264 + ctrl &= ~RDA_UART_DBITS_8; 265 + break; 266 + default: 267 + ctrl |= RDA_UART_DBITS_8; 268 + break; 269 + } 270 + 271 + /* stop bits */ 272 + if (termios->c_cflag & CSTOPB) 273 + ctrl |= RDA_UART_TX_SBITS_2; 274 + else 275 + ctrl &= ~RDA_UART_TX_SBITS_2; 276 + 277 + /* parity check */ 278 + if (termios->c_cflag & PARENB) { 279 + ctrl |= RDA_UART_PARITY_EN; 280 + 281 + /* Mark or Space parity */ 282 + if (termios->c_cflag & CMSPAR) { 283 + if (termios->c_cflag & PARODD) 284 + ctrl |= RDA_UART_PARITY_MARK; 285 + else 286 + ctrl |= RDA_UART_PARITY_SPACE; 287 + } else if (termios->c_cflag & PARODD) { 288 + ctrl |= RDA_UART_PARITY_ODD; 289 + } else { 290 + ctrl |= RDA_UART_PARITY_EVEN; 291 + } 292 + } else { 293 + ctrl &= ~RDA_UART_PARITY_EN; 294 + } 295 + 296 + /* Hardware handshake (RTS/CTS) */ 297 + if (termios->c_cflag & CRTSCTS) { 298 + ctrl |= RDA_UART_FLOW_CNT_EN; 299 + cmd_set |= RDA_UART_RTS; 300 + } else { 301 + ctrl &= ~RDA_UART_FLOW_CNT_EN; 302 + cmd_clr |= RDA_UART_RTS; 303 + } 304 + 305 + ctrl |= RDA_UART_ENABLE; 306 + ctrl &= ~RDA_UART_DMA_EN; 307 + 308 + triggers = (RDA_UART_AFC_LEVEL(20) | RDA_UART_RX_TRIGGER(16)); 309 + irq_mask = rda_uart_read(port, RDA_UART_IRQ_MASK); 310 + rda_uart_write(port, 0, RDA_UART_IRQ_MASK); 311 + 312 + rda_uart_write(port, triggers, RDA_UART_IRQ_TRIGGERS); 313 + rda_uart_write(port, ctrl, RDA_UART_CTRL); 314 + rda_uart_write(port, cmd_set, RDA_UART_CMD_SET); 315 + rda_uart_write(port, cmd_clr, RDA_UART_CMD_CLR); 316 + 317 + rda_uart_write(port, irq_mask, RDA_UART_IRQ_MASK); 318 + 319 + /* Don't rewrite B0 */ 320 + if (tty_termios_baud_rate(termios)) 321 + tty_termios_encode_baud_rate(termios, baud, baud); 322 + 323 + /* update the per-port timeout */ 324 + uart_update_timeout(port, termios->c_cflag, baud); 325 + 326 + spin_unlock_irqrestore(&port->lock, flags); 327 + } 328 + 329 + static void rda_uart_send_chars(struct uart_port *port) 330 + { 331 + struct circ_buf *xmit = &port->state->xmit; 332 + unsigned int ch; 333 + u32 val; 334 + 335 + if (uart_tx_stopped(port)) 336 + return; 337 + 338 + if (port->x_char) { 339 + while (!(rda_uart_read(port, RDA_UART_STATUS) & 340 + RDA_UART_TX_FIFO_MASK)) 341 + cpu_relax(); 342 + 343 + rda_uart_write(port, port->x_char, RDA_UART_RXTX_BUFFER); 344 + port->icount.tx++; 345 + port->x_char = 0; 346 + } 347 + 348 + while (rda_uart_read(port, RDA_UART_STATUS) & RDA_UART_TX_FIFO_MASK) { 349 + if (uart_circ_empty(xmit)) 350 + break; 351 + 352 + ch = xmit->buf[xmit->tail]; 353 + rda_uart_write(port, ch, RDA_UART_RXTX_BUFFER); 354 + xmit->tail = (xmit->tail + 1) & (SERIAL_XMIT_SIZE - 1); 355 + port->icount.tx++; 356 + } 357 + 358 + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) 359 + uart_write_wakeup(port); 360 + 361 + if (!uart_circ_empty(xmit)) { 362 + /* Re-enable Tx FIFO interrupt */ 363 + val = rda_uart_read(port, RDA_UART_IRQ_MASK); 364 + val |= RDA_UART_TX_DATA_NEEDED; 365 + rda_uart_write(port, val, RDA_UART_IRQ_MASK); 366 + } 367 + } 368 + 369 + static void rda_uart_receive_chars(struct uart_port *port) 370 + { 371 + u32 status, val; 372 + 373 + status = rda_uart_read(port, RDA_UART_STATUS); 374 + while ((status & RDA_UART_RX_FIFO_MASK)) { 375 + char flag = TTY_NORMAL; 376 + 377 + if (status & RDA_UART_RX_PARITY_ERR) { 378 + port->icount.parity++; 379 + flag = TTY_PARITY; 380 + } 381 + 382 + if (status & RDA_UART_RX_FRAMING_ERR) { 383 + port->icount.frame++; 384 + flag = TTY_FRAME; 385 + } 386 + 387 + if (status & RDA_UART_RX_OVERFLOW_ERR) { 388 + port->icount.overrun++; 389 + flag = TTY_OVERRUN; 390 + } 391 + 392 + val = rda_uart_read(port, RDA_UART_RXTX_BUFFER); 393 + val &= 0xff; 394 + 395 + port->icount.rx++; 396 + tty_insert_flip_char(&port->state->port, val, flag); 397 + 398 + status = rda_uart_read(port, RDA_UART_STATUS); 399 + } 400 + 401 + spin_unlock(&port->lock); 402 + tty_flip_buffer_push(&port->state->port); 403 + spin_lock(&port->lock); 404 + } 405 + 406 + static irqreturn_t rda_interrupt(int irq, void *dev_id) 407 + { 408 + struct uart_port *port = dev_id; 409 + unsigned long flags; 410 + u32 val, irq_mask; 411 + 412 + spin_lock_irqsave(&port->lock, flags); 413 + 414 + /* Clear IRQ cause */ 415 + val = rda_uart_read(port, RDA_UART_IRQ_CAUSE); 416 + rda_uart_write(port, val, RDA_UART_IRQ_CAUSE); 417 + 418 + if (val & (RDA_UART_RX_DATA_AVAILABLE | RDA_UART_RX_TIMEOUT)) 419 + rda_uart_receive_chars(port); 420 + 421 + if (val & (RDA_UART_TX_DATA_NEEDED)) { 422 + irq_mask = rda_uart_read(port, RDA_UART_IRQ_MASK); 423 + irq_mask &= ~RDA_UART_TX_DATA_NEEDED; 424 + rda_uart_write(port, irq_mask, RDA_UART_IRQ_MASK); 425 + 426 + rda_uart_send_chars(port); 427 + } 428 + 429 + spin_unlock_irqrestore(&port->lock, flags); 430 + 431 + return IRQ_HANDLED; 432 + } 433 + 434 + static int rda_uart_startup(struct uart_port *port) 435 + { 436 + unsigned long flags; 437 + int ret; 438 + u32 val; 439 + 440 + spin_lock_irqsave(&port->lock, flags); 441 + rda_uart_write(port, 0, RDA_UART_IRQ_MASK); 442 + spin_unlock_irqrestore(&port->lock, flags); 443 + 444 + ret = request_irq(port->irq, rda_interrupt, IRQF_NO_SUSPEND, 445 + "rda-uart", port); 446 + if (ret) 447 + return ret; 448 + 449 + spin_lock_irqsave(&port->lock, flags); 450 + 451 + val = rda_uart_read(port, RDA_UART_CTRL); 452 + val |= RDA_UART_ENABLE; 453 + rda_uart_write(port, val, RDA_UART_CTRL); 454 + 455 + /* enable rx interrupt */ 456 + val = rda_uart_read(port, RDA_UART_IRQ_MASK); 457 + val |= (RDA_UART_RX_DATA_AVAILABLE | RDA_UART_RX_TIMEOUT); 458 + rda_uart_write(port, val, RDA_UART_IRQ_MASK); 459 + 460 + spin_unlock_irqrestore(&port->lock, flags); 461 + 462 + return 0; 463 + } 464 + 465 + static void rda_uart_shutdown(struct uart_port *port) 466 + { 467 + unsigned long flags; 468 + u32 val; 469 + 470 + spin_lock_irqsave(&port->lock, flags); 471 + 472 + rda_uart_stop_tx(port); 473 + rda_uart_stop_rx(port); 474 + 475 + val = rda_uart_read(port, RDA_UART_CTRL); 476 + val &= ~RDA_UART_ENABLE; 477 + rda_uart_write(port, val, RDA_UART_CTRL); 478 + 479 + spin_unlock_irqrestore(&port->lock, flags); 480 + } 481 + 482 + static const char *rda_uart_type(struct uart_port *port) 483 + { 484 + return (port->type == PORT_RDA) ? "rda-uart" : NULL; 485 + } 486 + 487 + static int rda_uart_request_port(struct uart_port *port) 488 + { 489 + struct platform_device *pdev = to_platform_device(port->dev); 490 + struct resource *res; 491 + 492 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 493 + if (!res) 494 + return -ENXIO; 495 + 496 + if (!devm_request_mem_region(port->dev, port->mapbase, 497 + resource_size(res), dev_name(port->dev))) 498 + return -EBUSY; 499 + 500 + if (port->flags & UPF_IOREMAP) { 501 + port->membase = devm_ioremap_nocache(port->dev, port->mapbase, 502 + resource_size(res)); 503 + if (!port->membase) 504 + return -EBUSY; 505 + } 506 + 507 + return 0; 508 + } 509 + 510 + static void rda_uart_config_port(struct uart_port *port, int flags) 511 + { 512 + unsigned long irq_flags; 513 + 514 + if (flags & UART_CONFIG_TYPE) { 515 + port->type = PORT_RDA; 516 + rda_uart_request_port(port); 517 + } 518 + 519 + spin_lock_irqsave(&port->lock, irq_flags); 520 + 521 + /* Clear mask, so no surprise interrupts. */ 522 + rda_uart_write(port, 0, RDA_UART_IRQ_MASK); 523 + 524 + /* Clear status register */ 525 + rda_uart_write(port, 0, RDA_UART_STATUS); 526 + 527 + spin_unlock_irqrestore(&port->lock, irq_flags); 528 + } 529 + 530 + static void rda_uart_release_port(struct uart_port *port) 531 + { 532 + struct platform_device *pdev = to_platform_device(port->dev); 533 + struct resource *res; 534 + 535 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 536 + if (!res) 537 + return; 538 + 539 + if (port->flags & UPF_IOREMAP) { 540 + devm_release_mem_region(port->dev, port->mapbase, 541 + resource_size(res)); 542 + devm_iounmap(port->dev, port->membase); 543 + port->membase = NULL; 544 + } 545 + } 546 + 547 + static int rda_uart_verify_port(struct uart_port *port, 548 + struct serial_struct *ser) 549 + { 550 + if (port->type != PORT_RDA) 551 + return -EINVAL; 552 + 553 + if (port->irq != ser->irq) 554 + return -EINVAL; 555 + 556 + return 0; 557 + } 558 + 559 + static const struct uart_ops rda_uart_ops = { 560 + .tx_empty = rda_uart_tx_empty, 561 + .get_mctrl = rda_uart_get_mctrl, 562 + .set_mctrl = rda_uart_set_mctrl, 563 + .start_tx = rda_uart_start_tx, 564 + .stop_tx = rda_uart_stop_tx, 565 + .stop_rx = rda_uart_stop_rx, 566 + .startup = rda_uart_startup, 567 + .shutdown = rda_uart_shutdown, 568 + .set_termios = rda_uart_set_termios, 569 + .type = rda_uart_type, 570 + .request_port = rda_uart_request_port, 571 + .release_port = rda_uart_release_port, 572 + .config_port = rda_uart_config_port, 573 + .verify_port = rda_uart_verify_port, 574 + }; 575 + 576 + #ifdef CONFIG_SERIAL_RDA_CONSOLE 577 + 578 + static void rda_console_putchar(struct uart_port *port, int ch) 579 + { 580 + if (!port->membase) 581 + return; 582 + 583 + while (!(rda_uart_read(port, RDA_UART_STATUS) & RDA_UART_TX_FIFO_MASK)) 584 + cpu_relax(); 585 + 586 + rda_uart_write(port, ch, RDA_UART_RXTX_BUFFER); 587 + } 588 + 589 + static void rda_uart_port_write(struct uart_port *port, const char *s, 590 + u_int count) 591 + { 592 + u32 old_irq_mask; 593 + unsigned long flags; 594 + int locked; 595 + 596 + local_irq_save(flags); 597 + 598 + if (port->sysrq) { 599 + locked = 0; 600 + } else if (oops_in_progress) { 601 + locked = spin_trylock(&port->lock); 602 + } else { 603 + spin_lock(&port->lock); 604 + locked = 1; 605 + } 606 + 607 + old_irq_mask = rda_uart_read(port, RDA_UART_IRQ_MASK); 608 + rda_uart_write(port, 0, RDA_UART_IRQ_MASK); 609 + 610 + uart_console_write(port, s, count, rda_console_putchar); 611 + 612 + /* wait until all contents have been sent out */ 613 + while (!(rda_uart_read(port, RDA_UART_STATUS) & RDA_UART_TX_FIFO_MASK)) 614 + cpu_relax(); 615 + 616 + rda_uart_write(port, old_irq_mask, RDA_UART_IRQ_MASK); 617 + 618 + if (locked) 619 + spin_unlock(&port->lock); 620 + 621 + local_irq_restore(flags); 622 + } 623 + 624 + static void rda_uart_console_write(struct console *co, const char *s, 625 + u_int count) 626 + { 627 + struct rda_uart_port *rda_port; 628 + 629 + rda_port = rda_uart_ports[co->index]; 630 + if (!rda_port) 631 + return; 632 + 633 + rda_uart_port_write(&rda_port->port, s, count); 634 + } 635 + 636 + static int rda_uart_console_setup(struct console *co, char *options) 637 + { 638 + struct rda_uart_port *rda_port; 639 + int baud = 921600; 640 + int bits = 8; 641 + int parity = 'n'; 642 + int flow = 'n'; 643 + 644 + if (co->index < 0 || co->index >= RDA_UART_PORT_NUM) 645 + return -EINVAL; 646 + 647 + rda_port = rda_uart_ports[co->index]; 648 + if (!rda_port || !rda_port->port.membase) 649 + return -ENODEV; 650 + 651 + if (options) 652 + uart_parse_options(options, &baud, &parity, &bits, &flow); 653 + 654 + return uart_set_options(&rda_port->port, co, baud, parity, bits, flow); 655 + } 656 + 657 + static struct console rda_uart_console = { 658 + .name = RDA_UART_DEV_NAME, 659 + .write = rda_uart_console_write, 660 + .device = uart_console_device, 661 + .setup = rda_uart_console_setup, 662 + .flags = CON_PRINTBUFFER, 663 + .index = -1, 664 + .data = &rda_uart_driver, 665 + }; 666 + 667 + static int __init rda_uart_console_init(void) 668 + { 669 + register_console(&rda_uart_console); 670 + 671 + return 0; 672 + } 673 + console_initcall(rda_uart_console_init); 674 + 675 + static void rda_uart_early_console_write(struct console *co, 676 + const char *s, 677 + u_int count) 678 + { 679 + struct earlycon_device *dev = co->data; 680 + 681 + rda_uart_port_write(&dev->port, s, count); 682 + } 683 + 684 + static int __init 685 + rda_uart_early_console_setup(struct earlycon_device *device, const char *opt) 686 + { 687 + if (!device->port.membase) 688 + return -ENODEV; 689 + 690 + device->con->write = rda_uart_early_console_write; 691 + 692 + return 0; 693 + } 694 + 695 + OF_EARLYCON_DECLARE(rda, "rda,8810pl-uart", 696 + rda_uart_early_console_setup); 697 + 698 + #define RDA_UART_CONSOLE (&rda_uart_console) 699 + #else 700 + #define RDA_UART_CONSOLE NULL 701 + #endif /* CONFIG_SERIAL_RDA_CONSOLE */ 702 + 703 + static struct uart_driver rda_uart_driver = { 704 + .owner = THIS_MODULE, 705 + .driver_name = "rda-uart", 706 + .dev_name = RDA_UART_DEV_NAME, 707 + .nr = RDA_UART_PORT_NUM, 708 + .cons = RDA_UART_CONSOLE, 709 + }; 710 + 711 + static const struct of_device_id rda_uart_dt_matches[] = { 712 + { .compatible = "rda,8810pl-uart" }, 713 + { } 714 + }; 715 + MODULE_DEVICE_TABLE(of, rda_uart_dt_matches); 716 + 717 + static int rda_uart_probe(struct platform_device *pdev) 718 + { 719 + struct resource *res_mem; 720 + struct rda_uart_port *rda_port; 721 + int ret, irq; 722 + 723 + if (pdev->dev.of_node) 724 + pdev->id = of_alias_get_id(pdev->dev.of_node, "serial"); 725 + 726 + if (pdev->id < 0 || pdev->id >= RDA_UART_PORT_NUM) { 727 + dev_err(&pdev->dev, "id %d out of range\n", pdev->id); 728 + return -EINVAL; 729 + } 730 + 731 + res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 732 + if (!res_mem) { 733 + dev_err(&pdev->dev, "could not get mem\n"); 734 + return -ENODEV; 735 + } 736 + 737 + irq = platform_get_irq(pdev, 0); 738 + if (irq < 0) { 739 + dev_err(&pdev->dev, "could not get irq\n"); 740 + return irq; 741 + } 742 + 743 + if (rda_uart_ports[pdev->id]) { 744 + dev_err(&pdev->dev, "port %d already allocated\n", pdev->id); 745 + return -EBUSY; 746 + } 747 + 748 + rda_port = devm_kzalloc(&pdev->dev, sizeof(*rda_port), GFP_KERNEL); 749 + if (!rda_port) 750 + return -ENOMEM; 751 + 752 + rda_port->clk = devm_clk_get(&pdev->dev, NULL); 753 + if (IS_ERR(rda_port->clk)) { 754 + dev_err(&pdev->dev, "could not get clk\n"); 755 + return PTR_ERR(rda_port->clk); 756 + } 757 + 758 + rda_port->port.dev = &pdev->dev; 759 + rda_port->port.regshift = 0; 760 + rda_port->port.line = pdev->id; 761 + rda_port->port.type = PORT_RDA; 762 + rda_port->port.iotype = UPIO_MEM; 763 + rda_port->port.mapbase = res_mem->start; 764 + rda_port->port.irq = irq; 765 + rda_port->port.uartclk = clk_get_rate(rda_port->clk); 766 + if (rda_port->port.uartclk == 0) { 767 + dev_err(&pdev->dev, "clock rate is zero\n"); 768 + return -EINVAL; 769 + } 770 + rda_port->port.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | 771 + UPF_LOW_LATENCY; 772 + rda_port->port.x_char = 0; 773 + rda_port->port.fifosize = RDA_UART_TX_FIFO_SIZE; 774 + rda_port->port.ops = &rda_uart_ops; 775 + 776 + rda_uart_ports[pdev->id] = rda_port; 777 + platform_set_drvdata(pdev, rda_port); 778 + 779 + ret = uart_add_one_port(&rda_uart_driver, &rda_port->port); 780 + if (ret) 781 + rda_uart_ports[pdev->id] = NULL; 782 + 783 + return ret; 784 + } 785 + 786 + static int rda_uart_remove(struct platform_device *pdev) 787 + { 788 + struct rda_uart_port *rda_port = platform_get_drvdata(pdev); 789 + 790 + uart_remove_one_port(&rda_uart_driver, &rda_port->port); 791 + rda_uart_ports[pdev->id] = NULL; 792 + 793 + return 0; 794 + } 795 + 796 + static struct platform_driver rda_uart_platform_driver = { 797 + .probe = rda_uart_probe, 798 + .remove = rda_uart_remove, 799 + .driver = { 800 + .name = "rda-uart", 801 + .of_match_table = rda_uart_dt_matches, 802 + }, 803 + }; 804 + 805 + static int __init rda_uart_init(void) 806 + { 807 + int ret; 808 + 809 + ret = uart_register_driver(&rda_uart_driver); 810 + if (ret) 811 + return ret; 812 + 813 + ret = platform_driver_register(&rda_uart_platform_driver); 814 + if (ret) 815 + uart_unregister_driver(&rda_uart_driver); 816 + 817 + return ret; 818 + } 819 + 820 + static void __init rda_uart_exit(void) 821 + { 822 + platform_driver_unregister(&rda_uart_platform_driver); 823 + uart_unregister_driver(&rda_uart_driver); 824 + } 825 + 826 + module_init(rda_uart_init); 827 + module_exit(rda_uart_exit); 828 + 829 + MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>"); 830 + MODULE_DESCRIPTION("RDA8810PL serial device driver"); 831 + MODULE_LICENSE("GPL");
+30
include/linux/pl353-smc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * ARM PL353 SMC Driver Header 4 + * 5 + * Copyright (C) 2012 - 2018 Xilinx, Inc 6 + */ 7 + 8 + #ifndef __LINUX_PL353_SMC_H 9 + #define __LINUX_PL353_SMC_H 10 + 11 + enum pl353_smc_ecc_mode { 12 + PL353_SMC_ECCMODE_BYPASS = 0, 13 + PL353_SMC_ECCMODE_APB = 1, 14 + PL353_SMC_ECCMODE_MEM = 2 15 + }; 16 + 17 + enum pl353_smc_mem_width { 18 + PL353_SMC_MEM_WIDTH_8 = 0, 19 + PL353_SMC_MEM_WIDTH_16 = 1 20 + }; 21 + 22 + u32 pl353_smc_get_ecc_val(int ecc_reg); 23 + bool pl353_smc_ecc_is_busy(void); 24 + int pl353_smc_get_nand_int_status_raw(void); 25 + void pl353_smc_clr_nand_int(void); 26 + int pl353_smc_set_ecc_mode(enum pl353_smc_ecc_mode mode); 27 + int pl353_smc_set_ecc_pg_size(unsigned int pg_sz); 28 + int pl353_smc_set_buswidth(unsigned int bw); 29 + void pl353_smc_set_cycles(u32 timings[]); 30 + #endif
+3
include/linux/qcom_scm.h
··· 67 67 extern int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val); 68 68 extern int qcom_scm_io_writel(phys_addr_t addr, unsigned int val); 69 69 #else 70 + 71 + #include <linux/errno.h> 72 + 70 73 static inline 71 74 int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus) 72 75 {
+3
include/uapi/linux/serial_core.h
··· 281 281 /* MediaTek BTIF */ 282 282 #define PORT_MTK_BTIF 117 283 283 284 + /* RDA UART */ 285 + #define PORT_RDA 118 286 + 284 287 #endif /* _UAPILINUX_SERIAL_CORE_H */