/* * Copyright (C) 2015 Pengutronix, Uwe Kleine-König <kernel@pengutronix.de> * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2 as published by the * Free Software Foundation. */ #include <stdlib.h> #include <stdint.h> #include <stdio.h> #include <dt/dt.h> #define IMX_NO_PAD_CTL 0x80000000 /* no pin config need */ #define IMX_PAD_SION 0x40000000 /* set SION */ #define IOMUXC_CONFIG_SION (1 << 4) struct padinfo { const char *padname; off_t swmux_regoffset; uint32_t swmux_reset_default; uint32_t swmux_writeable_mask; off_t swpad_regoffset; uint32_t swpad_reset_default; uint32_t swpad_writeable_mask; }; struct socinfo { const struct padinfo *padinfo; size_t size_padinfo; }; static const struct padinfo imx25_iomux_padinfo[] = { { .padname = "A10", .swmux_regoffset = 0x008, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = -1, }, { .padname = "A13", .swmux_regoffset = 0x00c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x22c, .swpad_reset_default = 0x80, .swpad_writeable_mask = 0x80, }, { .padname = "A14", .swmux_regoffset = 0x010, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x230, .swpad_reset_default = 0x80, .swpad_writeable_mask = 0x80, }, { .padname = "A15", .swmux_regoffset = 0x014, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x234, .swpad_reset_default = 0x80, .swpad_writeable_mask = 0x80, }, { .padname = "A16", .swmux_regoffset = 0x018, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "A17", .swmux_regoffset = 0x01c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x238, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "A18", .swmux_regoffset = 0x020, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x23c, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "A19", .swmux_regoffset = 0x024, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x240, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "A20", .swmux_regoffset = 0x028, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x244, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "A21", .swmux_regoffset = 0x02c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x248, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "A22", .swmux_regoffset = 0x030, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "A23", .swmux_regoffset = 0x034, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x24c, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "A24", .swmux_regoffset = 0x038, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x250, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "A25", .swmux_regoffset = 0x03c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x254, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "EB0", .swmux_regoffset = 0x040, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x258, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "EB1", .swmux_regoffset = 0x044, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x25c, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "OE", .swmux_regoffset = 0x048, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x260, .swpad_reset_default = 0x00, .swpad_writeable_mask = 0x80, }, { .padname = "CS0", .swmux_regoffset = 0x04c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = -1, }, { .padname = "CS1", .swmux_regoffset = 0x050, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = -1, }, { .padname = "CS4", .swmux_regoffset = 0x054, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x264, .swpad_reset_default = 0x2001, .swpad_writeable_mask = 0x20b1, }, { .padname = "CS5", .swmux_regoffset = 0x058, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x268, .swpad_reset_default = 0x2001, .swpad_writeable_mask = 0x21b1, }, { .padname = "NF_CE0", .swmux_regoffset = 0x05c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x26c, .swpad_reset_default = 0x0001, .swpad_writeable_mask = 0x81, }, { .padname = "ECB", .swmux_regoffset = 0x060, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x270, .swpad_reset_default = 0x2e80, .swpad_writeable_mask = 0x2180, }, { .padname = "LBA", .swmux_regoffset = 0x064, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x274, .swpad_reset_default = 0x0000, .swpad_writeable_mask = 0x80, }, { .padname = "BCLK", .swmux_regoffset = 0x068, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = -1, }, { .padname = "RW", .swmux_regoffset = 0x06c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x278, .swpad_reset_default = 0x0000, .swpad_writeable_mask = 0x80, }, { .padname = "NFWE_B", .swmux_regoffset = 0x070, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "NFRE_B", .swmux_regoffset = 0x074, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "NFALE", .swmux_regoffset = 0x078, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "NFCLE", .swmux_regoffset = 0x07c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "NFWP_B", .swmux_regoffset = 0x080, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "NFRB", .swmux_regoffset = 0x084, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x27c, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x80, }, { .padname = "D15", .swmux_regoffset = 0x088, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x280, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x01f1, }, { .padname = "D14", .swmux_regoffset = 0x08c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x284, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x01f1, }, { .padname = "D13", .swmux_regoffset = 0x090, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x288, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x01f1, }, { .padname = "D12", .swmux_regoffset = 0x094, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x28c, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x01f1, }, { .padname = "D11", .swmux_regoffset = 0x098, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x290, /* * specified as 0xa1 in IMX25RM; IMX25CEC says * "100 kOhm Pull-Up" which would correspond to 0xe1. */ .swpad_reset_default = 0x0021, .swpad_writeable_mask = 0x00f1, }, { .padname = "D10", .swmux_regoffset = 0x09c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x294, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x01f1, }, { .padname = "D9", .swmux_regoffset = 0x0a0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x298, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x00f1, }, { .padname = "D8", .swmux_regoffset = 0x0a4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x29c, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x01f1, }, { .padname = "D7", .swmux_regoffset = 0x0a8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2a0, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x0040, }, { .padname = "D6", .swmux_regoffset = 0x0ac, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2a4, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x0040, }, { .padname = "D5", .swmux_regoffset = 0x0b0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2a8, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x0040, }, { .padname = "D4", .swmux_regoffset = 0x0b4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2ac, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x0040, }, { .padname = "D3", .swmux_regoffset = 0x0b8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2b0, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x0040, }, { .padname = "D2", .swmux_regoffset = 0x0bc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2b4, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x0040, }, { .padname = "D1", .swmux_regoffset = 0x0c0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2b8, .swpad_reset_default = 0x0000, .swpad_writeable_mask = 0x0040, }, { .padname = "D0", .swmux_regoffset = 0x0c4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = 0x2bc, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x0040, }, { .padname = "LD0", .swmux_regoffset = 0x0c8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2c0, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f0, }, { .padname = "LD1", .swmux_regoffset = 0x0cc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2c4, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f0, }, { .padname = "LD2", .swmux_regoffset = 0x0d0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2c8, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD3", .swmux_regoffset = 0x0d4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2cc, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f0, }, { .padname = "LD4", .swmux_regoffset = 0x0d8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2d0, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD5", .swmux_regoffset = 0x0dc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2d4, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD6", .swmux_regoffset = 0x0e0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2d8, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD7", .swmux_regoffset = 0x0e4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2dc, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD8", .swmux_regoffset = 0x0e8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2e0, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD9", .swmux_regoffset = 0x0ec, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2e4, .swpad_reset_default = 0x0160, .swpad_writeable_mask = 0x01f1, }, { .padname = "LD10", .swmux_regoffset = 0x0f0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2e8, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD11", .swmux_regoffset = 0x0f4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2ec, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "LD12", .swmux_regoffset = 0x0f8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2f0, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f9, }, { .padname = "LD13", .swmux_regoffset = 0x0fc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2f4, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f9, }, { .padname = "LD14", .swmux_regoffset = 0x100, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2f8, .swpad_reset_default = 0x0020, .swpad_writeable_mask = 0x00b8, }, { .padname = "LD15", .swmux_regoffset = 0x104, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x2fc, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f8, }, { .padname = "HSYNC", .swmux_regoffset = 0x108, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x300, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f9, }, { .padname = "VSYNC", .swmux_regoffset = 0x10c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x304, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f9, }, { .padname = "LSCLK", .swmux_regoffset = 0x110, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x308, .swpad_reset_default = 0x0061, .swpad_writeable_mask = 0x00f1, }, { .padname = "OE_ACD", .swmux_regoffset = 0x114, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x30c, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "CONTRAST", .swmux_regoffset = 0x118, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x310, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f0, }, { .padname = "PWM", .swmux_regoffset = 0x11c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x314, .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x00f6, }, { .padname = "CSI_D2", .swmux_regoffset = 0x120, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x318, .swpad_reset_default = 0x00a1, .swpad_writeable_mask = 0x00f1, }, { .padname = "CSI_D3", .swmux_regoffset = 0x124, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x31c, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00f1, }, { .padname = "CSI_D4", .swmux_regoffset = 0x128, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x320, .swpad_reset_default = 0x01a1, .swpad_writeable_mask = 0x01f1, }, { .padname = "CSI_D5", .swmux_regoffset = 0x12c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x324, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00f1, }, { .padname = "CSI_D6", .swmux_regoffset = 0x130, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x328, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00f9, }, { .padname = "CSI_D7", .swmux_regoffset = 0x134, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x32c, .swpad_reset_default = 0x01a0, .swpad_writeable_mask = 0x01f9, }, { .padname = "CSI_D8", .swmux_regoffset = 0x138, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x330, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00f9, }, { .padname = "CSI_D9", .swmux_regoffset = 0x13c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x334, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00f9, }, { .padname = "CSI_MCLK", .swmux_regoffset = 0x140, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x338, .swpad_reset_default = 0x0061, .swpad_writeable_mask = 0x00f1, }, { .padname = "CSI_VSYNC", .swmux_regoffset = 0x144, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x33c, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00f1, }, { .padname = "CSI_HSYNC", .swmux_regoffset = 0x148, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x340, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00f1, }, { .padname = "CSI_PIXCLK", .swmux_regoffset = 0x14c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x344, .swpad_reset_default = 0x01a0, .swpad_writeable_mask = 0x01f1, }, { .padname = "I2C1_CLK", .swmux_regoffset = 0x150, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x348, .swpad_reset_default = 0x00e8, .swpad_writeable_mask = 0x00be, }, { .padname = "I2C1_DAT", .swmux_regoffset = 0x154, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x34c, .swpad_reset_default = 0x00e8, .swpad_writeable_mask = 0x00be, }, { .padname = "CSPI1_MOSI", .swmux_regoffset = 0x158, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x350, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00b1, }, { .padname = "CSPI1_MISO", .swmux_regoffset = 0x15c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x354, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00b1, }, { .padname = "CSPI1_SS0", .swmux_regoffset = 0x160, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x358, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00f1, }, { .padname = "CSPI1_SS1", .swmux_regoffset = 0x164, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x35c, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00b9, }, { .padname = "CSPI1_SCLK", .swmux_regoffset = 0x168, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x360, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00b1, }, { .padname = "CSPI1_RDY", .swmux_regoffset = 0x16c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x364, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00b1, }, { .padname = "UART1_RXD", .swmux_regoffset = 0x170, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x368, .swpad_reset_default = 0x00a0, .swpad_writeable_mask = 0x00b0, }, { .padname = "UART1_TXD", .swmux_regoffset = 0x174, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x36c, .swpad_reset_default = 0x0020, .swpad_writeable_mask = 0x00b0, }, { .padname = "UART1_RTS", .swmux_regoffset = 0x178, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x370, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00f0, }, { .padname = "UART1_CTS", .swmux_regoffset = 0x17c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x374, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f0, }, { .padname = "UART2_RXD", .swmux_regoffset = 0x180, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x378, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00f0, }, { .padname = "UART2_TXD", .swmux_regoffset = 0x184, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x37c, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "UART2_RTS", .swmux_regoffset = 0x188, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x380, .swpad_reset_default = 0x00e1, .swpad_writeable_mask = 0x00f1, }, { .padname = "UART2_CTS", .swmux_regoffset = 0x18c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x384, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "SD1_CMD", .swmux_regoffset = 0x190, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x388, .swpad_reset_default = 0x00d1, .swpad_writeable_mask = 0x00f1, }, { .padname = "SD1_CLK", .swmux_regoffset = 0x194, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x38c, .swpad_reset_default = 0x00d1, .swpad_writeable_mask = 0x01f1, }, { .padname = "SD1_DATA0", .swmux_regoffset = 0x198, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x390, .swpad_reset_default = 0x00d1, .swpad_writeable_mask = 0x00f1, }, { .padname = "SD1_DATA1", .swmux_regoffset = 0x19c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x394, .swpad_reset_default = 0x00d1, .swpad_writeable_mask = 0x00f1, }, { .padname = "SD1_DATA2", .swmux_regoffset = 0x1a0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x398, .swpad_reset_default = 0x00d1, .swpad_writeable_mask = 0x00f1, }, { .padname = "SD1_DATA3", .swmux_regoffset = 0x1a4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x39c, .swpad_reset_default = 0x00d1, .swpad_writeable_mask = 0x00f1, }, { .padname = "KPP_ROW0", .swmux_regoffset = 0x1a8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3a0, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00b8, }, { .padname = "KPP_ROW1", .swmux_regoffset = 0x1ac, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3a4, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00b8, }, { .padname = "KPP_ROW2", .swmux_regoffset = 0x1b0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3a8, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00f8, }, { .padname = "KPP_ROW3", .swmux_regoffset = 0x1b4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3ac, .swpad_reset_default = 0x00e0, .swpad_writeable_mask = 0x00f8, }, { .padname = "KPP_COL0", .swmux_regoffset = 0x1b8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3b0, .swpad_reset_default = 0x00e8, .swpad_writeable_mask = 0x00b8, }, { .padname = "KPP_COL1", .swmux_regoffset = 0x1bc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3b4, .swpad_reset_default = 0x00e8, .swpad_writeable_mask = 0x00b8, }, { .padname = "KPP_COL2", .swmux_regoffset = 0x1c0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3b8, .swpad_reset_default = 0x00e8, .swpad_writeable_mask = 0x00b8, }, { .padname = "KPP_COL3", .swmux_regoffset = 0x1c4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3bc, .swpad_reset_default = 0x00e8, .swpad_writeable_mask = 0x00b8, }, { .padname = "FEC_MDC", .swmux_regoffset = 0x1c8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3c0, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "FEC_MDIO", .swmux_regoffset = 0x1cc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3c4, .swpad_reset_default = 0x01f0, .swpad_writeable_mask = 0x01f1, }, { .padname = "FEC_TDATA0", .swmux_regoffset = 0x1d0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3c8, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "FEC_TDATA1", .swmux_regoffset = 0x1d4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3cc, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f1, }, { .padname = "FEC_TX_EN", .swmux_regoffset = 0x1d8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3d0, .swpad_reset_default = 0x0060, .swpad_writeable_mask = 0x00f9, }, { .padname = "FEC_RDATA0", .swmux_regoffset = 0x1dc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3d4, .swpad_reset_default = 0x00c1, .swpad_writeable_mask = 0x00f9, }, { .padname = "FEC_RDATA1", .swmux_regoffset = 0x1e0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3d8, .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x00f9, }, { .padname = "FEC_RX_DV", .swmux_regoffset = 0x1e4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3dc, .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x00f9, }, { .padname = "FEC_TX_CLK", .swmux_regoffset = 0x1e8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3e0, .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x01f1, }, { .padname = "RTCK", .swmux_regoffset = 0x1ec, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3e4, .swpad_reset_default = 0x0062, .swpad_writeable_mask = 0x00ff, }, { .padname = "TDO", .swpad_regoffset = 0x3e8, .swpad_reset_default = 0x0002, .swpad_writeable_mask = 0x0006, }, { .padname = "DE_B", .swmux_regoffset = 0x1f0, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3ec, .swpad_reset_default = 0x00d0, .swpad_writeable_mask = 0x0006, }, { .padname = "GPIO_A", .swmux_regoffset = 0x1f4, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3f0, /* IMX25CE: no configuration after reset */ .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x00fe, }, { .padname = "GPIO_B", .swmux_regoffset = 0x1f8, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3f4, .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x00fe, }, { .padname = "GPIO_C", .swmux_regoffset = 0x1fc, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3f8, .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x00fe, }, { .padname = "GPIO_D", .swmux_regoffset = 0x200, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x3fc, .swpad_reset_default = 0x0020, .swpad_writeable_mask = 0x00be, }, { .padname = "GPIO_E", .swmux_regoffset = 0x204, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x400, .swpad_reset_default = 0x00e8, .swpad_writeable_mask = 0x00be, }, { .padname = "GPIO_F", .swmux_regoffset = 0x208, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x404, .swpad_reset_default = 0x0020, .swpad_writeable_mask = 0x00b6, }, { .padname = "EXT_ARMCLK", .swmux_regoffset = 0x20c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "UPLL_BYPCLK", .swmux_regoffset = 0x210, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = -1, }, { .padname = "VSTBY_REQ", .swmux_regoffset = 0x214, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x408, .swpad_reset_default = 0x0000, .swpad_writeable_mask = 0x0086, }, { .padname = "VSTBY_ACK", .swmux_regoffset = 0x218, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x40c, .swpad_reset_default = 0x0080, .swpad_writeable_mask = 0x00b6, }, { .padname = "POWER_FAIL", .swmux_regoffset = 0x21c, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x410, .swpad_reset_default = 0x00c0, .swpad_writeable_mask = 0x00b6, }, { .padname = "CLKO", .swmux_regoffset = 0x220, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000017, .swpad_regoffset = 0x414, .swpad_reset_default = 0x0004, .swpad_writeable_mask = 0x0006, }, { .padname = "BOOT_MODE0", .swmux_regoffset = 0x224, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = -1, }, { .padname = "BOOT_MODE1", .swmux_regoffset = 0x228, .swmux_reset_default = 0x00000000, .swmux_writeable_mask = 0x00000007, .swpad_regoffset = -1, }, }; static const struct socinfo imx25_socinfo = { .padinfo = imx25_iomux_padinfo, .size_padinfo = ARRAY_SIZE(imx25_iomux_padinfo), }; static const struct padinfo *find_padinfo(off_t swmux_regoffset, const struct socinfo *socinfo) { size_t i; for (i = 0; i < socinfo->size_padinfo; ++i) { if (socinfo->padinfo[i].swmux_regoffset == swmux_regoffset) return &socinfo->padinfo[i]; } return NULL; } static int parse_function(struct device_node *funcnode, const struct socinfo *socinfo) { const __be32 *list; int size, i; list = of_get_property(funcnode, "fsl,pins", &size); if (!list) { fprintf(stderr, "no fsl,pins property in node %s\n", funcnode->full_name); return -EINVAL; } if (!size || size % 24) { fprintf(stderr, "fsl,pins invalid in node %s\n", funcnode->full_name); return -EINVAL; } for (i = 0; i < size / 24; ++i) { uint32_t mux_reg = be32_to_cpu(*list++); off_t conf_reg; uint32_t mux_mode; uint32_t input_reg; uint32_t input_val; uint32_t config; const struct padinfo *padinfo; conf_reg = be32_to_cpu(*list++); if (!conf_reg) conf_reg = -1; input_reg = be32_to_cpu(*list++); (void)input_reg; mux_mode = be32_to_cpu(*list++); input_val = be32_to_cpu(*list++); (void)input_val; config = be32_to_cpu(*list++); if (config & IMX_PAD_SION) mux_mode |= IOMUXC_CONFIG_SION; config = config & ~IMX_PAD_SION; /* sanity checks */ padinfo = find_padinfo(mux_reg, socinfo); if (!padinfo) { fprintf(stderr, "unknown pad (muxreg: %lx)\n", (unsigned long)mux_reg); continue; } if (conf_reg != padinfo->swpad_regoffset) printf("E: wrong offset for SW_PAD register (%s)\n", padinfo->padname); if (conf_reg == (uint32_t)-1) { if (config != 0 && config != 0x80000000) printf("E: config value without config register (%s)\n", padinfo->padname); } else { if (config == 0x80000000) { printf("S: explicitly use 0x%08x as config value for %s\n", padinfo->swpad_reset_default & padinfo->swpad_writeable_mask, padinfo->padname); } else if (config & ~padinfo->swpad_writeable_mask) { printf("E: config value specified for reserved bit (%s)\n", padinfo->padname); } } } return 0; } struct iomux_id_t { const char *compatible; const struct socinfo *socinfo; }; static const struct iomux_id_t iomux_id[] = { { .compatible = "fsl,imx25-iomuxc", .socinfo = &imx25_socinfo, }, }; int main(int argc, const char *argv[]) { void *fdt; struct device_node *root, *np; size_t i; if (argc < 2) { fprintf(stderr, "No filename given\n"); return EXIT_FAILURE; } fdt = read_file(argv[1], NULL); if (!fdt) { fprintf(stderr, "failed to read dtb\n"); return EXIT_FAILURE; } root = of_unflatten_dtb(fdt); if (IS_ERR(root)) { fprintf(stderr, "failed to unflatten device tree (%ld)\n", PTR_ERR(root)); return EXIT_FAILURE; } of_set_root_node(root); for (i = 0; i < ARRAY_SIZE(iomux_id); ++i) { for_each_compatible_node(np, NULL, iomux_id[i].compatible) { struct device_node *npc; pr_debug("Found iomuxc %s\n", np->full_name); for_each_child_of_node(np, npc) { if (of_property_read_bool(npc, "fsl,pins")) { pr_debug("Found function node %s\n", npc->full_name); parse_function(npc, iomux_id[i].socinfo); } else { struct device_node *npcc; for_each_child_of_node(npc, npcc) parse_function(npcc, iomux_id[i].socinfo); } } } } return EXIT_SUCCESS; }