| #include <stdint.h> |
| |
| #include "common.h" |
| |
| #include "Galois_memmap.h" |
| #include "global.h" |
| #include "pinmux.h" |
| #include "lgpl_printf.h" |
| |
| #define BITS_PER_PIN 3 |
| #define PINS_PER_REG 10 |
| |
| static int pinmux_write_internal(unsigned int baseaddr, unsigned int index, unsigned int value) |
| { |
| unsigned int addr, field, pinmux; |
| |
| addr = baseaddr + ((index / PINS_PER_REG) << 2); |
| field = (index % PINS_PER_REG) * BITS_PER_PIN; |
| |
| pinmux = readl(addr); // read current pinmux |
| |
| pinmux &= ~(0x7 << field); |
| pinmux |= (value << field); |
| |
| writel(pinmux, addr); |
| return 0; |
| } |
| |
| int pinmux_write(int index, unsigned int value) |
| { |
| unsigned int addr = 0; |
| |
| if((index >= SOC_PINMUX_INDEX_START) && (index < SOC_PINMUX_INDEX_MAX)) { |
| //SOC |
| addr = MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_pinMuxCntlBus; |
| return pinmux_write_internal(addr, (index - SOC_PINMUX_INDEX_START), value); |
| } |
| |
| return -1; |
| } |
| |
| void pinmux_display(void) |
| { |
| unsigned int i = 0; |
| unsigned int baseaddr = MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_pinMuxCntlBus; |
| //total 7 registers |
| for(i = 0; i < 7; i++) |
| lgpl_printf("Pinmux reg %d: 0x%08x = 0x%08x\n", i, baseaddr + i*4, readl(baseaddr + i*4)); |
| } |