1*56f86e39SMasahiro Yamada /* 2*56f86e39SMasahiro Yamada * arch/arm/mach-kirkwood/mpp.c 3*56f86e39SMasahiro Yamada * 4*56f86e39SMasahiro Yamada * MPP functions for Marvell Kirkwood SoCs 5*56f86e39SMasahiro Yamada * Referenced from Linux kernel source 6*56f86e39SMasahiro Yamada * 7*56f86e39SMasahiro Yamada * This file is licensed under the terms of the GNU General Public 8*56f86e39SMasahiro Yamada * License version 2. This program is licensed "as is" without any 9*56f86e39SMasahiro Yamada * warranty of any kind, whether express or implied. 10*56f86e39SMasahiro Yamada */ 11*56f86e39SMasahiro Yamada 12*56f86e39SMasahiro Yamada #include <common.h> 13*56f86e39SMasahiro Yamada #include <asm/io.h> 14*56f86e39SMasahiro Yamada #include <asm/arch/cpu.h> 15*56f86e39SMasahiro Yamada #include <asm/arch/soc.h> 16*56f86e39SMasahiro Yamada #include <asm/arch/mpp.h> 17*56f86e39SMasahiro Yamada kirkwood_variant(void)18*56f86e39SMasahiro Yamadastatic u32 kirkwood_variant(void) 19*56f86e39SMasahiro Yamada { 20*56f86e39SMasahiro Yamada switch (readl(KW_REG_DEVICE_ID) & 0x03) { 21*56f86e39SMasahiro Yamada case 1: 22*56f86e39SMasahiro Yamada return MPP_F6192_MASK; 23*56f86e39SMasahiro Yamada case 2: 24*56f86e39SMasahiro Yamada return MPP_F6281_MASK; 25*56f86e39SMasahiro Yamada default: 26*56f86e39SMasahiro Yamada debug("MPP setup: unknown kirkwood variant\n"); 27*56f86e39SMasahiro Yamada return 0; 28*56f86e39SMasahiro Yamada } 29*56f86e39SMasahiro Yamada } 30*56f86e39SMasahiro Yamada 31*56f86e39SMasahiro Yamada #define MPP_CTRL(i) (KW_MPP_BASE + (i* 4)) 32*56f86e39SMasahiro Yamada #define MPP_NR_REGS (1 + MPP_MAX/8) 33*56f86e39SMasahiro Yamada kirkwood_mpp_conf(const u32 * mpp_list,u32 * mpp_save)34*56f86e39SMasahiro Yamadavoid kirkwood_mpp_conf(const u32 *mpp_list, u32 *mpp_save) 35*56f86e39SMasahiro Yamada { 36*56f86e39SMasahiro Yamada u32 mpp_ctrl[MPP_NR_REGS]; 37*56f86e39SMasahiro Yamada unsigned int variant_mask; 38*56f86e39SMasahiro Yamada int i; 39*56f86e39SMasahiro Yamada 40*56f86e39SMasahiro Yamada variant_mask = kirkwood_variant(); 41*56f86e39SMasahiro Yamada if (!variant_mask) 42*56f86e39SMasahiro Yamada return; 43*56f86e39SMasahiro Yamada 44*56f86e39SMasahiro Yamada debug( "initial MPP regs:"); 45*56f86e39SMasahiro Yamada for (i = 0; i < MPP_NR_REGS; i++) { 46*56f86e39SMasahiro Yamada mpp_ctrl[i] = readl(MPP_CTRL(i)); 47*56f86e39SMasahiro Yamada debug(" %08x", mpp_ctrl[i]); 48*56f86e39SMasahiro Yamada } 49*56f86e39SMasahiro Yamada debug("\n"); 50*56f86e39SMasahiro Yamada 51*56f86e39SMasahiro Yamada 52*56f86e39SMasahiro Yamada while (*mpp_list) { 53*56f86e39SMasahiro Yamada unsigned int num = MPP_NUM(*mpp_list); 54*56f86e39SMasahiro Yamada unsigned int sel = MPP_SEL(*mpp_list); 55*56f86e39SMasahiro Yamada unsigned int sel_save; 56*56f86e39SMasahiro Yamada int shift; 57*56f86e39SMasahiro Yamada 58*56f86e39SMasahiro Yamada if (num > MPP_MAX) { 59*56f86e39SMasahiro Yamada debug("kirkwood_mpp_conf: invalid MPP " 60*56f86e39SMasahiro Yamada "number (%u)\n", num); 61*56f86e39SMasahiro Yamada continue; 62*56f86e39SMasahiro Yamada } 63*56f86e39SMasahiro Yamada if (!(*mpp_list & variant_mask)) { 64*56f86e39SMasahiro Yamada debug("kirkwood_mpp_conf: requested MPP%u config " 65*56f86e39SMasahiro Yamada "unavailable on this hardware\n", num); 66*56f86e39SMasahiro Yamada continue; 67*56f86e39SMasahiro Yamada } 68*56f86e39SMasahiro Yamada 69*56f86e39SMasahiro Yamada shift = (num & 7) << 2; 70*56f86e39SMasahiro Yamada 71*56f86e39SMasahiro Yamada if (mpp_save) { 72*56f86e39SMasahiro Yamada sel_save = (mpp_ctrl[num / 8] >> shift) & 0xf; 73*56f86e39SMasahiro Yamada *mpp_save = num | (sel_save << 8) | variant_mask; 74*56f86e39SMasahiro Yamada mpp_save++; 75*56f86e39SMasahiro Yamada } 76*56f86e39SMasahiro Yamada 77*56f86e39SMasahiro Yamada mpp_ctrl[num / 8] &= ~(0xf << shift); 78*56f86e39SMasahiro Yamada mpp_ctrl[num / 8] |= sel << shift; 79*56f86e39SMasahiro Yamada 80*56f86e39SMasahiro Yamada mpp_list++; 81*56f86e39SMasahiro Yamada } 82*56f86e39SMasahiro Yamada 83*56f86e39SMasahiro Yamada debug(" final MPP regs:"); 84*56f86e39SMasahiro Yamada for (i = 0; i < MPP_NR_REGS; i++) { 85*56f86e39SMasahiro Yamada writel(mpp_ctrl[i], MPP_CTRL(i)); 86*56f86e39SMasahiro Yamada debug(" %08x", mpp_ctrl[i]); 87*56f86e39SMasahiro Yamada } 88*56f86e39SMasahiro Yamada debug("\n"); 89*56f86e39SMasahiro Yamada 90*56f86e39SMasahiro Yamada } 91