162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Joshua Henderson <joshua.henderson@microchip.com> 462306a36Sopenharmony_ci * Copyright (C) 2015 Microchip Technology Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#include <asm/io.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "early_pin.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define PPS_BASE 0x1f800000 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* Input PPS Registers */ 1362306a36Sopenharmony_ci#define INT1R 0x1404 1462306a36Sopenharmony_ci#define INT2R 0x1408 1562306a36Sopenharmony_ci#define INT3R 0x140C 1662306a36Sopenharmony_ci#define INT4R 0x1410 1762306a36Sopenharmony_ci#define T2CKR 0x1418 1862306a36Sopenharmony_ci#define T3CKR 0x141C 1962306a36Sopenharmony_ci#define T4CKR 0x1420 2062306a36Sopenharmony_ci#define T5CKR 0x1424 2162306a36Sopenharmony_ci#define T6CKR 0x1428 2262306a36Sopenharmony_ci#define T7CKR 0x142C 2362306a36Sopenharmony_ci#define T8CKR 0x1430 2462306a36Sopenharmony_ci#define T9CKR 0x1434 2562306a36Sopenharmony_ci#define IC1R 0x1438 2662306a36Sopenharmony_ci#define IC2R 0x143C 2762306a36Sopenharmony_ci#define IC3R 0x1440 2862306a36Sopenharmony_ci#define IC4R 0x1444 2962306a36Sopenharmony_ci#define IC5R 0x1448 3062306a36Sopenharmony_ci#define IC6R 0x144C 3162306a36Sopenharmony_ci#define IC7R 0x1450 3262306a36Sopenharmony_ci#define IC8R 0x1454 3362306a36Sopenharmony_ci#define IC9R 0x1458 3462306a36Sopenharmony_ci#define OCFAR 0x1460 3562306a36Sopenharmony_ci#define U1RXR 0x1468 3662306a36Sopenharmony_ci#define U1CTSR 0x146C 3762306a36Sopenharmony_ci#define U2RXR 0x1470 3862306a36Sopenharmony_ci#define U2CTSR 0x1474 3962306a36Sopenharmony_ci#define U3RXR 0x1478 4062306a36Sopenharmony_ci#define U3CTSR 0x147C 4162306a36Sopenharmony_ci#define U4RXR 0x1480 4262306a36Sopenharmony_ci#define U4CTSR 0x1484 4362306a36Sopenharmony_ci#define U5RXR 0x1488 4462306a36Sopenharmony_ci#define U5CTSR 0x148C 4562306a36Sopenharmony_ci#define U6RXR 0x1490 4662306a36Sopenharmony_ci#define U6CTSR 0x1494 4762306a36Sopenharmony_ci#define SDI1R 0x149C 4862306a36Sopenharmony_ci#define SS1R 0x14A0 4962306a36Sopenharmony_ci#define SDI2R 0x14A8 5062306a36Sopenharmony_ci#define SS2R 0x14AC 5162306a36Sopenharmony_ci#define SDI3R 0x14B4 5262306a36Sopenharmony_ci#define SS3R 0x14B8 5362306a36Sopenharmony_ci#define SDI4R 0x14C0 5462306a36Sopenharmony_ci#define SS4R 0x14C4 5562306a36Sopenharmony_ci#define SDI5R 0x14CC 5662306a36Sopenharmony_ci#define SS5R 0x14D0 5762306a36Sopenharmony_ci#define SDI6R 0x14D8 5862306a36Sopenharmony_ci#define SS6R 0x14DC 5962306a36Sopenharmony_ci#define C1RXR 0x14E0 6062306a36Sopenharmony_ci#define C2RXR 0x14E4 6162306a36Sopenharmony_ci#define REFCLKI1R 0x14E8 6262306a36Sopenharmony_ci#define REFCLKI3R 0x14F0 6362306a36Sopenharmony_ci#define REFCLKI4R 0x14F4 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic const struct 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci int function; 6862306a36Sopenharmony_ci int reg; 6962306a36Sopenharmony_ci} input_pin_reg[] = { 7062306a36Sopenharmony_ci { IN_FUNC_INT3, INT3R }, 7162306a36Sopenharmony_ci { IN_FUNC_T2CK, T2CKR }, 7262306a36Sopenharmony_ci { IN_FUNC_T6CK, T6CKR }, 7362306a36Sopenharmony_ci { IN_FUNC_IC3, IC3R }, 7462306a36Sopenharmony_ci { IN_FUNC_IC7, IC7R }, 7562306a36Sopenharmony_ci { IN_FUNC_U1RX, U1RXR }, 7662306a36Sopenharmony_ci { IN_FUNC_U2CTS, U2CTSR }, 7762306a36Sopenharmony_ci { IN_FUNC_U5RX, U5RXR }, 7862306a36Sopenharmony_ci { IN_FUNC_U6CTS, U6CTSR }, 7962306a36Sopenharmony_ci { IN_FUNC_SDI1, SDI1R }, 8062306a36Sopenharmony_ci { IN_FUNC_SDI3, SDI3R }, 8162306a36Sopenharmony_ci { IN_FUNC_SDI5, SDI5R }, 8262306a36Sopenharmony_ci { IN_FUNC_SS6, SS6R }, 8362306a36Sopenharmony_ci { IN_FUNC_REFCLKI1, REFCLKI1R }, 8462306a36Sopenharmony_ci { IN_FUNC_INT4, INT4R }, 8562306a36Sopenharmony_ci { IN_FUNC_T5CK, T5CKR }, 8662306a36Sopenharmony_ci { IN_FUNC_T7CK, T7CKR }, 8762306a36Sopenharmony_ci { IN_FUNC_IC4, IC4R }, 8862306a36Sopenharmony_ci { IN_FUNC_IC8, IC8R }, 8962306a36Sopenharmony_ci { IN_FUNC_U3RX, U3RXR }, 9062306a36Sopenharmony_ci { IN_FUNC_U4CTS, U4CTSR }, 9162306a36Sopenharmony_ci { IN_FUNC_SDI2, SDI2R }, 9262306a36Sopenharmony_ci { IN_FUNC_SDI4, SDI4R }, 9362306a36Sopenharmony_ci { IN_FUNC_C1RX, C1RXR }, 9462306a36Sopenharmony_ci { IN_FUNC_REFCLKI4, REFCLKI4R }, 9562306a36Sopenharmony_ci { IN_FUNC_INT2, INT2R }, 9662306a36Sopenharmony_ci { IN_FUNC_T3CK, T3CKR }, 9762306a36Sopenharmony_ci { IN_FUNC_T8CK, T8CKR }, 9862306a36Sopenharmony_ci { IN_FUNC_IC2, IC2R }, 9962306a36Sopenharmony_ci { IN_FUNC_IC5, IC5R }, 10062306a36Sopenharmony_ci { IN_FUNC_IC9, IC9R }, 10162306a36Sopenharmony_ci { IN_FUNC_U1CTS, U1CTSR }, 10262306a36Sopenharmony_ci { IN_FUNC_U2RX, U2RXR }, 10362306a36Sopenharmony_ci { IN_FUNC_U5CTS, U5CTSR }, 10462306a36Sopenharmony_ci { IN_FUNC_SS1, SS1R }, 10562306a36Sopenharmony_ci { IN_FUNC_SS3, SS3R }, 10662306a36Sopenharmony_ci { IN_FUNC_SS4, SS4R }, 10762306a36Sopenharmony_ci { IN_FUNC_SS5, SS5R }, 10862306a36Sopenharmony_ci { IN_FUNC_C2RX, C2RXR }, 10962306a36Sopenharmony_ci { IN_FUNC_INT1, INT1R }, 11062306a36Sopenharmony_ci { IN_FUNC_T4CK, T4CKR }, 11162306a36Sopenharmony_ci { IN_FUNC_T9CK, T9CKR }, 11262306a36Sopenharmony_ci { IN_FUNC_IC1, IC1R }, 11362306a36Sopenharmony_ci { IN_FUNC_IC6, IC6R }, 11462306a36Sopenharmony_ci { IN_FUNC_U3CTS, U3CTSR }, 11562306a36Sopenharmony_ci { IN_FUNC_U4RX, U4RXR }, 11662306a36Sopenharmony_ci { IN_FUNC_U6RX, U6RXR }, 11762306a36Sopenharmony_ci { IN_FUNC_SS2, SS2R }, 11862306a36Sopenharmony_ci { IN_FUNC_SDI6, SDI6R }, 11962306a36Sopenharmony_ci { IN_FUNC_OCFA, OCFAR }, 12062306a36Sopenharmony_ci { IN_FUNC_REFCLKI3, REFCLKI3R }, 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_civoid pic32_pps_input(int function, int pin) 12462306a36Sopenharmony_ci{ 12562306a36Sopenharmony_ci void __iomem *pps_base = ioremap(PPS_BASE, 0xF4); 12662306a36Sopenharmony_ci int i; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(input_pin_reg); i++) { 12962306a36Sopenharmony_ci if (input_pin_reg[i].function == function) { 13062306a36Sopenharmony_ci __raw_writel(pin, pps_base + input_pin_reg[i].reg); 13162306a36Sopenharmony_ci return; 13262306a36Sopenharmony_ci } 13362306a36Sopenharmony_ci } 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci iounmap(pps_base); 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* Output PPS Registers */ 13962306a36Sopenharmony_ci#define RPA14R 0x1538 14062306a36Sopenharmony_ci#define RPA15R 0x153C 14162306a36Sopenharmony_ci#define RPB0R 0x1540 14262306a36Sopenharmony_ci#define RPB1R 0x1544 14362306a36Sopenharmony_ci#define RPB2R 0x1548 14462306a36Sopenharmony_ci#define RPB3R 0x154C 14562306a36Sopenharmony_ci#define RPB5R 0x1554 14662306a36Sopenharmony_ci#define RPB6R 0x1558 14762306a36Sopenharmony_ci#define RPB7R 0x155C 14862306a36Sopenharmony_ci#define RPB8R 0x1560 14962306a36Sopenharmony_ci#define RPB9R 0x1564 15062306a36Sopenharmony_ci#define RPB10R 0x1568 15162306a36Sopenharmony_ci#define RPB14R 0x1578 15262306a36Sopenharmony_ci#define RPB15R 0x157C 15362306a36Sopenharmony_ci#define RPC1R 0x1584 15462306a36Sopenharmony_ci#define RPC2R 0x1588 15562306a36Sopenharmony_ci#define RPC3R 0x158C 15662306a36Sopenharmony_ci#define RPC4R 0x1590 15762306a36Sopenharmony_ci#define RPC13R 0x15B4 15862306a36Sopenharmony_ci#define RPC14R 0x15B8 15962306a36Sopenharmony_ci#define RPD0R 0x15C0 16062306a36Sopenharmony_ci#define RPD1R 0x15C4 16162306a36Sopenharmony_ci#define RPD2R 0x15C8 16262306a36Sopenharmony_ci#define RPD3R 0x15CC 16362306a36Sopenharmony_ci#define RPD4R 0x15D0 16462306a36Sopenharmony_ci#define RPD5R 0x15D4 16562306a36Sopenharmony_ci#define RPD6R 0x15D8 16662306a36Sopenharmony_ci#define RPD7R 0x15DC 16762306a36Sopenharmony_ci#define RPD9R 0x15E4 16862306a36Sopenharmony_ci#define RPD10R 0x15E8 16962306a36Sopenharmony_ci#define RPD11R 0x15EC 17062306a36Sopenharmony_ci#define RPD12R 0x15F0 17162306a36Sopenharmony_ci#define RPD14R 0x15F8 17262306a36Sopenharmony_ci#define RPD15R 0x15FC 17362306a36Sopenharmony_ci#define RPE3R 0x160C 17462306a36Sopenharmony_ci#define RPE5R 0x1614 17562306a36Sopenharmony_ci#define RPE8R 0x1620 17662306a36Sopenharmony_ci#define RPE9R 0x1624 17762306a36Sopenharmony_ci#define RPF0R 0x1640 17862306a36Sopenharmony_ci#define RPF1R 0x1644 17962306a36Sopenharmony_ci#define RPF2R 0x1648 18062306a36Sopenharmony_ci#define RPF3R 0x164C 18162306a36Sopenharmony_ci#define RPF4R 0x1650 18262306a36Sopenharmony_ci#define RPF5R 0x1654 18362306a36Sopenharmony_ci#define RPF8R 0x1660 18462306a36Sopenharmony_ci#define RPF12R 0x1670 18562306a36Sopenharmony_ci#define RPF13R 0x1674 18662306a36Sopenharmony_ci#define RPG0R 0x1680 18762306a36Sopenharmony_ci#define RPG1R 0x1684 18862306a36Sopenharmony_ci#define RPG6R 0x1698 18962306a36Sopenharmony_ci#define RPG7R 0x169C 19062306a36Sopenharmony_ci#define RPG8R 0x16A0 19162306a36Sopenharmony_ci#define RPG9R 0x16A4 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistatic const struct 19462306a36Sopenharmony_ci{ 19562306a36Sopenharmony_ci int pin; 19662306a36Sopenharmony_ci int reg; 19762306a36Sopenharmony_ci} output_pin_reg[] = { 19862306a36Sopenharmony_ci { OUT_RPD2, RPD2R }, 19962306a36Sopenharmony_ci { OUT_RPG8, RPG8R }, 20062306a36Sopenharmony_ci { OUT_RPF4, RPF4R }, 20162306a36Sopenharmony_ci { OUT_RPD10, RPD10R }, 20262306a36Sopenharmony_ci { OUT_RPF1, RPF1R }, 20362306a36Sopenharmony_ci { OUT_RPB9, RPB9R }, 20462306a36Sopenharmony_ci { OUT_RPB10, RPB10R }, 20562306a36Sopenharmony_ci { OUT_RPC14, RPC14R }, 20662306a36Sopenharmony_ci { OUT_RPB5, RPB5R }, 20762306a36Sopenharmony_ci { OUT_RPC1, RPC1R }, 20862306a36Sopenharmony_ci { OUT_RPD14, RPD14R }, 20962306a36Sopenharmony_ci { OUT_RPG1, RPG1R }, 21062306a36Sopenharmony_ci { OUT_RPA14, RPA14R }, 21162306a36Sopenharmony_ci { OUT_RPD6, RPD6R }, 21262306a36Sopenharmony_ci { OUT_RPD3, RPD3R }, 21362306a36Sopenharmony_ci { OUT_RPG7, RPG7R }, 21462306a36Sopenharmony_ci { OUT_RPF5, RPF5R }, 21562306a36Sopenharmony_ci { OUT_RPD11, RPD11R }, 21662306a36Sopenharmony_ci { OUT_RPF0, RPF0R }, 21762306a36Sopenharmony_ci { OUT_RPB1, RPB1R }, 21862306a36Sopenharmony_ci { OUT_RPE5, RPE5R }, 21962306a36Sopenharmony_ci { OUT_RPC13, RPC13R }, 22062306a36Sopenharmony_ci { OUT_RPB3, RPB3R }, 22162306a36Sopenharmony_ci { OUT_RPC4, RPC4R }, 22262306a36Sopenharmony_ci { OUT_RPD15, RPD15R }, 22362306a36Sopenharmony_ci { OUT_RPG0, RPG0R }, 22462306a36Sopenharmony_ci { OUT_RPA15, RPA15R }, 22562306a36Sopenharmony_ci { OUT_RPD7, RPD7R }, 22662306a36Sopenharmony_ci { OUT_RPD9, RPD9R }, 22762306a36Sopenharmony_ci { OUT_RPG6, RPG6R }, 22862306a36Sopenharmony_ci { OUT_RPB8, RPB8R }, 22962306a36Sopenharmony_ci { OUT_RPB15, RPB15R }, 23062306a36Sopenharmony_ci { OUT_RPD4, RPD4R }, 23162306a36Sopenharmony_ci { OUT_RPB0, RPB0R }, 23262306a36Sopenharmony_ci { OUT_RPE3, RPE3R }, 23362306a36Sopenharmony_ci { OUT_RPB7, RPB7R }, 23462306a36Sopenharmony_ci { OUT_RPF12, RPF12R }, 23562306a36Sopenharmony_ci { OUT_RPD12, RPD12R }, 23662306a36Sopenharmony_ci { OUT_RPF8, RPF8R }, 23762306a36Sopenharmony_ci { OUT_RPC3, RPC3R }, 23862306a36Sopenharmony_ci { OUT_RPE9, RPE9R }, 23962306a36Sopenharmony_ci { OUT_RPD1, RPD1R }, 24062306a36Sopenharmony_ci { OUT_RPG9, RPG9R }, 24162306a36Sopenharmony_ci { OUT_RPB14, RPB14R }, 24262306a36Sopenharmony_ci { OUT_RPD0, RPD0R }, 24362306a36Sopenharmony_ci { OUT_RPB6, RPB6R }, 24462306a36Sopenharmony_ci { OUT_RPD5, RPD5R }, 24562306a36Sopenharmony_ci { OUT_RPB2, RPB2R }, 24662306a36Sopenharmony_ci { OUT_RPF3, RPF3R }, 24762306a36Sopenharmony_ci { OUT_RPF13, RPF13R }, 24862306a36Sopenharmony_ci { OUT_RPC2, RPC2R }, 24962306a36Sopenharmony_ci { OUT_RPE8, RPE8R }, 25062306a36Sopenharmony_ci { OUT_RPF2, RPF2R }, 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_civoid pic32_pps_output(int function, int pin) 25462306a36Sopenharmony_ci{ 25562306a36Sopenharmony_ci void __iomem *pps_base = ioremap(PPS_BASE, 0x170); 25662306a36Sopenharmony_ci int i; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(output_pin_reg); i++) { 25962306a36Sopenharmony_ci if (output_pin_reg[i].pin == pin) { 26062306a36Sopenharmony_ci __raw_writel(function, 26162306a36Sopenharmony_ci pps_base + output_pin_reg[i].reg); 26262306a36Sopenharmony_ci return; 26362306a36Sopenharmony_ci } 26462306a36Sopenharmony_ci } 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci iounmap(pps_base); 26762306a36Sopenharmony_ci} 268