Path: blob/master/arch/mips/pic32/pic32mzda/early_pin.c
26583 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* Joshua Henderson <[email protected]>3* Copyright (C) 2015 Microchip Technology Inc. All rights reserved.4*/5#include <asm/io.h>67#include "early_pin.h"89#define PPS_BASE 0x1f8000001011/* Input PPS Registers */12#define INT1R 0x140413#define INT2R 0x140814#define INT3R 0x140C15#define INT4R 0x141016#define T2CKR 0x141817#define T3CKR 0x141C18#define T4CKR 0x142019#define T5CKR 0x142420#define T6CKR 0x142821#define T7CKR 0x142C22#define T8CKR 0x143023#define T9CKR 0x143424#define IC1R 0x143825#define IC2R 0x143C26#define IC3R 0x144027#define IC4R 0x144428#define IC5R 0x144829#define IC6R 0x144C30#define IC7R 0x145031#define IC8R 0x145432#define IC9R 0x145833#define OCFAR 0x146034#define U1RXR 0x146835#define U1CTSR 0x146C36#define U2RXR 0x147037#define U2CTSR 0x147438#define U3RXR 0x147839#define U3CTSR 0x147C40#define U4RXR 0x148041#define U4CTSR 0x148442#define U5RXR 0x148843#define U5CTSR 0x148C44#define U6RXR 0x149045#define U6CTSR 0x149446#define SDI1R 0x149C47#define SS1R 0x14A048#define SDI2R 0x14A849#define SS2R 0x14AC50#define SDI3R 0x14B451#define SS3R 0x14B852#define SDI4R 0x14C053#define SS4R 0x14C454#define SDI5R 0x14CC55#define SS5R 0x14D056#define SDI6R 0x14D857#define SS6R 0x14DC58#define C1RXR 0x14E059#define C2RXR 0x14E460#define REFCLKI1R 0x14E861#define REFCLKI3R 0x14F062#define REFCLKI4R 0x14F46364static const struct65{66int function;67int reg;68} input_pin_reg[] = {69{ IN_FUNC_INT3, INT3R },70{ IN_FUNC_T2CK, T2CKR },71{ IN_FUNC_T6CK, T6CKR },72{ IN_FUNC_IC3, IC3R },73{ IN_FUNC_IC7, IC7R },74{ IN_FUNC_U1RX, U1RXR },75{ IN_FUNC_U2CTS, U2CTSR },76{ IN_FUNC_U5RX, U5RXR },77{ IN_FUNC_U6CTS, U6CTSR },78{ IN_FUNC_SDI1, SDI1R },79{ IN_FUNC_SDI3, SDI3R },80{ IN_FUNC_SDI5, SDI5R },81{ IN_FUNC_SS6, SS6R },82{ IN_FUNC_REFCLKI1, REFCLKI1R },83{ IN_FUNC_INT4, INT4R },84{ IN_FUNC_T5CK, T5CKR },85{ IN_FUNC_T7CK, T7CKR },86{ IN_FUNC_IC4, IC4R },87{ IN_FUNC_IC8, IC8R },88{ IN_FUNC_U3RX, U3RXR },89{ IN_FUNC_U4CTS, U4CTSR },90{ IN_FUNC_SDI2, SDI2R },91{ IN_FUNC_SDI4, SDI4R },92{ IN_FUNC_C1RX, C1RXR },93{ IN_FUNC_REFCLKI4, REFCLKI4R },94{ IN_FUNC_INT2, INT2R },95{ IN_FUNC_T3CK, T3CKR },96{ IN_FUNC_T8CK, T8CKR },97{ IN_FUNC_IC2, IC2R },98{ IN_FUNC_IC5, IC5R },99{ IN_FUNC_IC9, IC9R },100{ IN_FUNC_U1CTS, U1CTSR },101{ IN_FUNC_U2RX, U2RXR },102{ IN_FUNC_U5CTS, U5CTSR },103{ IN_FUNC_SS1, SS1R },104{ IN_FUNC_SS3, SS3R },105{ IN_FUNC_SS4, SS4R },106{ IN_FUNC_SS5, SS5R },107{ IN_FUNC_C2RX, C2RXR },108{ IN_FUNC_INT1, INT1R },109{ IN_FUNC_T4CK, T4CKR },110{ IN_FUNC_T9CK, T9CKR },111{ IN_FUNC_IC1, IC1R },112{ IN_FUNC_IC6, IC6R },113{ IN_FUNC_U3CTS, U3CTSR },114{ IN_FUNC_U4RX, U4RXR },115{ IN_FUNC_U6RX, U6RXR },116{ IN_FUNC_SS2, SS2R },117{ IN_FUNC_SDI6, SDI6R },118{ IN_FUNC_OCFA, OCFAR },119{ IN_FUNC_REFCLKI3, REFCLKI3R },120};121122void pic32_pps_input(int function, int pin)123{124void __iomem *pps_base = ioremap(PPS_BASE, 0xF4);125int i;126127for (i = 0; i < ARRAY_SIZE(input_pin_reg); i++) {128if (input_pin_reg[i].function == function) {129__raw_writel(pin, pps_base + input_pin_reg[i].reg);130return;131}132}133134iounmap(pps_base);135}136137/* Output PPS Registers */138#define RPA14R 0x1538139#define RPA15R 0x153C140#define RPB0R 0x1540141#define RPB1R 0x1544142#define RPB2R 0x1548143#define RPB3R 0x154C144#define RPB5R 0x1554145#define RPB6R 0x1558146#define RPB7R 0x155C147#define RPB8R 0x1560148#define RPB9R 0x1564149#define RPB10R 0x1568150#define RPB14R 0x1578151#define RPB15R 0x157C152#define RPC1R 0x1584153#define RPC2R 0x1588154#define RPC3R 0x158C155#define RPC4R 0x1590156#define RPC13R 0x15B4157#define RPC14R 0x15B8158#define RPD0R 0x15C0159#define RPD1R 0x15C4160#define RPD2R 0x15C8161#define RPD3R 0x15CC162#define RPD4R 0x15D0163#define RPD5R 0x15D4164#define RPD6R 0x15D8165#define RPD7R 0x15DC166#define RPD9R 0x15E4167#define RPD10R 0x15E8168#define RPD11R 0x15EC169#define RPD12R 0x15F0170#define RPD14R 0x15F8171#define RPD15R 0x15FC172#define RPE3R 0x160C173#define RPE5R 0x1614174#define RPE8R 0x1620175#define RPE9R 0x1624176#define RPF0R 0x1640177#define RPF1R 0x1644178#define RPF2R 0x1648179#define RPF3R 0x164C180#define RPF4R 0x1650181#define RPF5R 0x1654182#define RPF8R 0x1660183#define RPF12R 0x1670184#define RPF13R 0x1674185#define RPG0R 0x1680186#define RPG1R 0x1684187#define RPG6R 0x1698188#define RPG7R 0x169C189#define RPG8R 0x16A0190#define RPG9R 0x16A4191192static const struct193{194int pin;195int reg;196} output_pin_reg[] = {197{ OUT_RPD2, RPD2R },198{ OUT_RPG8, RPG8R },199{ OUT_RPF4, RPF4R },200{ OUT_RPD10, RPD10R },201{ OUT_RPF1, RPF1R },202{ OUT_RPB9, RPB9R },203{ OUT_RPB10, RPB10R },204{ OUT_RPC14, RPC14R },205{ OUT_RPB5, RPB5R },206{ OUT_RPC1, RPC1R },207{ OUT_RPD14, RPD14R },208{ OUT_RPG1, RPG1R },209{ OUT_RPA14, RPA14R },210{ OUT_RPD6, RPD6R },211{ OUT_RPD3, RPD3R },212{ OUT_RPG7, RPG7R },213{ OUT_RPF5, RPF5R },214{ OUT_RPD11, RPD11R },215{ OUT_RPF0, RPF0R },216{ OUT_RPB1, RPB1R },217{ OUT_RPE5, RPE5R },218{ OUT_RPC13, RPC13R },219{ OUT_RPB3, RPB3R },220{ OUT_RPC4, RPC4R },221{ OUT_RPD15, RPD15R },222{ OUT_RPG0, RPG0R },223{ OUT_RPA15, RPA15R },224{ OUT_RPD7, RPD7R },225{ OUT_RPD9, RPD9R },226{ OUT_RPG6, RPG6R },227{ OUT_RPB8, RPB8R },228{ OUT_RPB15, RPB15R },229{ OUT_RPD4, RPD4R },230{ OUT_RPB0, RPB0R },231{ OUT_RPE3, RPE3R },232{ OUT_RPB7, RPB7R },233{ OUT_RPF12, RPF12R },234{ OUT_RPD12, RPD12R },235{ OUT_RPF8, RPF8R },236{ OUT_RPC3, RPC3R },237{ OUT_RPE9, RPE9R },238{ OUT_RPD1, RPD1R },239{ OUT_RPG9, RPG9R },240{ OUT_RPB14, RPB14R },241{ OUT_RPD0, RPD0R },242{ OUT_RPB6, RPB6R },243{ OUT_RPD5, RPD5R },244{ OUT_RPB2, RPB2R },245{ OUT_RPF3, RPF3R },246{ OUT_RPF13, RPF13R },247{ OUT_RPC2, RPC2R },248{ OUT_RPE8, RPE8R },249{ OUT_RPF2, RPF2R },250};251252void pic32_pps_output(int function, int pin)253{254void __iomem *pps_base = ioremap(PPS_BASE, 0x170);255int i;256257for (i = 0; i < ARRAY_SIZE(output_pin_reg); i++) {258if (output_pin_reg[i].pin == pin) {259__raw_writel(function,260pps_base + output_pin_reg[i].reg);261return;262}263}264265iounmap(pps_base);266}267268269