2019-06-01 10:08:59 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2016-01-13 18:15:39 -07:00
/*
* Joshua Henderson < joshua . henderson @ microchip . com >
* Copyright ( C ) 2015 Microchip Technology Inc . All rights reserved .
*/
# include <asm/io.h>
# include "early_pin.h"
# define PPS_BASE 0x1f800000
/* Input PPS Registers */
# define INT1R 0x1404
# define INT2R 0x1408
# define INT3R 0x140C
# define INT4R 0x1410
# define T2CKR 0x1418
# define T3CKR 0x141C
# define T4CKR 0x1420
# define T5CKR 0x1424
# define T6CKR 0x1428
# define T7CKR 0x142C
# define T8CKR 0x1430
# define T9CKR 0x1434
# define IC1R 0x1438
# define IC2R 0x143C
# define IC3R 0x1440
# define IC4R 0x1444
# define IC5R 0x1448
# define IC6R 0x144C
# define IC7R 0x1450
# define IC8R 0x1454
# define IC9R 0x1458
# define OCFAR 0x1460
# define U1RXR 0x1468
# define U1CTSR 0x146C
# define U2RXR 0x1470
# define U2CTSR 0x1474
# define U3RXR 0x1478
# define U3CTSR 0x147C
# define U4RXR 0x1480
# define U4CTSR 0x1484
# define U5RXR 0x1488
# define U5CTSR 0x148C
# define U6RXR 0x1490
# define U6CTSR 0x1494
# define SDI1R 0x149C
# define SS1R 0x14A0
# define SDI2R 0x14A8
# define SS2R 0x14AC
# define SDI3R 0x14B4
# define SS3R 0x14B8
# define SDI4R 0x14C0
# define SS4R 0x14C4
# define SDI5R 0x14CC
# define SS5R 0x14D0
# define SDI6R 0x14D8
# define SS6R 0x14DC
# define C1RXR 0x14E0
# define C2RXR 0x14E4
# define REFCLKI1R 0x14E8
# define REFCLKI3R 0x14F0
# define REFCLKI4R 0x14F4
static const struct
{
int function ;
int reg ;
} input_pin_reg [ ] = {
{ IN_FUNC_INT3 , INT3R } ,
{ IN_FUNC_T2CK , T2CKR } ,
{ IN_FUNC_T6CK , T6CKR } ,
{ IN_FUNC_IC3 , IC3R } ,
{ IN_FUNC_IC7 , IC7R } ,
{ IN_FUNC_U1RX , U1RXR } ,
{ IN_FUNC_U2CTS , U2CTSR } ,
{ IN_FUNC_U5RX , U5RXR } ,
{ IN_FUNC_U6CTS , U6CTSR } ,
{ IN_FUNC_SDI1 , SDI1R } ,
{ IN_FUNC_SDI3 , SDI3R } ,
{ IN_FUNC_SDI5 , SDI5R } ,
{ IN_FUNC_SS6 , SS6R } ,
{ IN_FUNC_REFCLKI1 , REFCLKI1R } ,
{ IN_FUNC_INT4 , INT4R } ,
{ IN_FUNC_T5CK , T5CKR } ,
{ IN_FUNC_T7CK , T7CKR } ,
{ IN_FUNC_IC4 , IC4R } ,
{ IN_FUNC_IC8 , IC8R } ,
{ IN_FUNC_U3RX , U3RXR } ,
{ IN_FUNC_U4CTS , U4CTSR } ,
{ IN_FUNC_SDI2 , SDI2R } ,
{ IN_FUNC_SDI4 , SDI4R } ,
{ IN_FUNC_C1RX , C1RXR } ,
{ IN_FUNC_REFCLKI4 , REFCLKI4R } ,
{ IN_FUNC_INT2 , INT2R } ,
{ IN_FUNC_T3CK , T3CKR } ,
{ IN_FUNC_T8CK , T8CKR } ,
{ IN_FUNC_IC2 , IC2R } ,
{ IN_FUNC_IC5 , IC5R } ,
{ IN_FUNC_IC9 , IC9R } ,
{ IN_FUNC_U1CTS , U1CTSR } ,
{ IN_FUNC_U2RX , U2RXR } ,
{ IN_FUNC_U5CTS , U5CTSR } ,
{ IN_FUNC_SS1 , SS1R } ,
{ IN_FUNC_SS3 , SS3R } ,
{ IN_FUNC_SS4 , SS4R } ,
{ IN_FUNC_SS5 , SS5R } ,
{ IN_FUNC_C2RX , C2RXR } ,
{ IN_FUNC_INT1 , INT1R } ,
{ IN_FUNC_T4CK , T4CKR } ,
{ IN_FUNC_T9CK , T9CKR } ,
{ IN_FUNC_IC1 , IC1R } ,
{ IN_FUNC_IC6 , IC6R } ,
{ IN_FUNC_U3CTS , U3CTSR } ,
{ IN_FUNC_U4RX , U4RXR } ,
{ IN_FUNC_U6RX , U6RXR } ,
{ IN_FUNC_SS2 , SS2R } ,
{ IN_FUNC_SDI6 , SDI6R } ,
{ IN_FUNC_OCFA , OCFAR } ,
{ IN_FUNC_REFCLKI3 , REFCLKI3R } ,
} ;
void pic32_pps_input ( int function , int pin )
{
2020-01-06 09:43:50 +01:00
void __iomem * pps_base = ioremap ( PPS_BASE , 0xF4 ) ;
2016-01-13 18:15:39 -07:00
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( input_pin_reg ) ; i + + ) {
if ( input_pin_reg [ i ] . function = = function ) {
__raw_writel ( pin , pps_base + input_pin_reg [ i ] . reg ) ;
return ;
}
}
iounmap ( pps_base ) ;
}
/* Output PPS Registers */
# define RPA14R 0x1538
# define RPA15R 0x153C
# define RPB0R 0x1540
# define RPB1R 0x1544
# define RPB2R 0x1548
# define RPB3R 0x154C
# define RPB5R 0x1554
# define RPB6R 0x1558
# define RPB7R 0x155C
# define RPB8R 0x1560
# define RPB9R 0x1564
# define RPB10R 0x1568
# define RPB14R 0x1578
# define RPB15R 0x157C
# define RPC1R 0x1584
# define RPC2R 0x1588
# define RPC3R 0x158C
# define RPC4R 0x1590
# define RPC13R 0x15B4
# define RPC14R 0x15B8
# define RPD0R 0x15C0
# define RPD1R 0x15C4
# define RPD2R 0x15C8
# define RPD3R 0x15CC
# define RPD4R 0x15D0
# define RPD5R 0x15D4
# define RPD6R 0x15D8
# define RPD7R 0x15DC
# define RPD9R 0x15E4
# define RPD10R 0x15E8
# define RPD11R 0x15EC
# define RPD12R 0x15F0
# define RPD14R 0x15F8
# define RPD15R 0x15FC
# define RPE3R 0x160C
# define RPE5R 0x1614
# define RPE8R 0x1620
# define RPE9R 0x1624
# define RPF0R 0x1640
# define RPF1R 0x1644
# define RPF2R 0x1648
# define RPF3R 0x164C
# define RPF4R 0x1650
# define RPF5R 0x1654
# define RPF8R 0x1660
# define RPF12R 0x1670
# define RPF13R 0x1674
# define RPG0R 0x1680
# define RPG1R 0x1684
# define RPG6R 0x1698
# define RPG7R 0x169C
# define RPG8R 0x16A0
# define RPG9R 0x16A4
static const struct
{
int pin ;
int reg ;
} output_pin_reg [ ] = {
{ OUT_RPD2 , RPD2R } ,
{ OUT_RPG8 , RPG8R } ,
{ OUT_RPF4 , RPF4R } ,
{ OUT_RPD10 , RPD10R } ,
{ OUT_RPF1 , RPF1R } ,
{ OUT_RPB9 , RPB9R } ,
{ OUT_RPB10 , RPB10R } ,
{ OUT_RPC14 , RPC14R } ,
{ OUT_RPB5 , RPB5R } ,
{ OUT_RPC1 , RPC1R } ,
{ OUT_RPD14 , RPD14R } ,
{ OUT_RPG1 , RPG1R } ,
{ OUT_RPA14 , RPA14R } ,
{ OUT_RPD6 , RPD6R } ,
{ OUT_RPD3 , RPD3R } ,
{ OUT_RPG7 , RPG7R } ,
{ OUT_RPF5 , RPF5R } ,
{ OUT_RPD11 , RPD11R } ,
{ OUT_RPF0 , RPF0R } ,
{ OUT_RPB1 , RPB1R } ,
{ OUT_RPE5 , RPE5R } ,
{ OUT_RPC13 , RPC13R } ,
{ OUT_RPB3 , RPB3R } ,
{ OUT_RPC4 , RPC4R } ,
{ OUT_RPD15 , RPD15R } ,
{ OUT_RPG0 , RPG0R } ,
{ OUT_RPA15 , RPA15R } ,
{ OUT_RPD7 , RPD7R } ,
{ OUT_RPD9 , RPD9R } ,
{ OUT_RPG6 , RPG6R } ,
{ OUT_RPB8 , RPB8R } ,
{ OUT_RPB15 , RPB15R } ,
{ OUT_RPD4 , RPD4R } ,
{ OUT_RPB0 , RPB0R } ,
{ OUT_RPE3 , RPE3R } ,
{ OUT_RPB7 , RPB7R } ,
{ OUT_RPF12 , RPF12R } ,
{ OUT_RPD12 , RPD12R } ,
{ OUT_RPF8 , RPF8R } ,
{ OUT_RPC3 , RPC3R } ,
{ OUT_RPE9 , RPE9R } ,
{ OUT_RPD1 , RPD1R } ,
{ OUT_RPG9 , RPG9R } ,
{ OUT_RPB14 , RPB14R } ,
{ OUT_RPD0 , RPD0R } ,
{ OUT_RPB6 , RPB6R } ,
{ OUT_RPD5 , RPD5R } ,
{ OUT_RPB2 , RPB2R } ,
{ OUT_RPF3 , RPF3R } ,
{ OUT_RPF13 , RPF13R } ,
{ OUT_RPC2 , RPC2R } ,
{ OUT_RPE8 , RPE8R } ,
{ OUT_RPF2 , RPF2R } ,
} ;
void pic32_pps_output ( int function , int pin )
{
2020-01-06 09:43:50 +01:00
void __iomem * pps_base = ioremap ( PPS_BASE , 0x170 ) ;
2016-01-13 18:15:39 -07:00
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( output_pin_reg ) ; i + + ) {
if ( output_pin_reg [ i ] . pin = = pin ) {
__raw_writel ( function ,
pps_base + output_pin_reg [ i ] . reg ) ;
return ;
}
}
iounmap ( pps_base ) ;
}