Ley Foon Tan | 7cdb912 | 2018-05-18 22:05:24 +0800 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | /* |
| 3 | * Copyright (C) 2016-2018 Intel Corporation <www.intel.com> |
| 4 | * |
| 5 | */ |
| 6 | |
| 7 | #include <common.h> |
| 8 | #include <errno.h> |
| 9 | #include <asm/io.h> |
| 10 | #include <asm/arch/handoff_s10.h> |
| 11 | |
| 12 | static void sysmgr_pinmux_handoff_read(void *handoff_address, |
| 13 | const u32 **table, |
| 14 | unsigned int *table_len) |
| 15 | { |
| 16 | unsigned int handoff_entry = (swab32(readl(handoff_address + |
| 17 | S10_HANDOFF_OFFSET_LENGTH)) - |
| 18 | S10_HANDOFF_OFFSET_DATA) / |
| 19 | sizeof(unsigned int); |
| 20 | unsigned int handoff_chunk[handoff_entry], temp, i; |
| 21 | |
| 22 | if (swab32(readl(S10_HANDOFF_MUX)) == S10_HANDOFF_MAGIC_MUX) { |
| 23 | /* using handoff from Quartus tools if exists */ |
| 24 | for (i = 0; i < handoff_entry; i++) { |
| 25 | temp = readl(handoff_address + |
| 26 | S10_HANDOFF_OFFSET_DATA + (i * 4)); |
| 27 | handoff_chunk[i] = swab32(temp); |
| 28 | } |
| 29 | *table = handoff_chunk; |
| 30 | *table_len = ARRAY_SIZE(handoff_chunk); |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | void sysmgr_pinmux_table_sel(const u32 **table, unsigned int *table_len) |
| 35 | { |
| 36 | sysmgr_pinmux_handoff_read((void *)S10_HANDOFF_MUX, table, |
| 37 | table_len); |
| 38 | } |
| 39 | |
| 40 | void sysmgr_pinmux_table_ctrl(const u32 **table, unsigned int *table_len) |
| 41 | { |
| 42 | sysmgr_pinmux_handoff_read((void *)S10_HANDOFF_IOCTL, table, |
| 43 | table_len); |
| 44 | } |
| 45 | |
| 46 | void sysmgr_pinmux_table_fpga(const u32 **table, unsigned int *table_len) |
| 47 | { |
| 48 | sysmgr_pinmux_handoff_read((void *)S10_HANDOFF_FPGA, table, |
| 49 | table_len); |
| 50 | } |
| 51 | |
| 52 | void sysmgr_pinmux_table_delay(const u32 **table, unsigned int *table_len) |
| 53 | { |
| 54 | sysmgr_pinmux_handoff_read((void *)S10_HANODFF_DELAY, table, |
| 55 | table_len); |
| 56 | } |