13335786aSStefan Roese /* 23335786aSStefan Roese * Copyright (C) 2015-2016 Marvell International Ltd. 33335786aSStefan Roese * 43335786aSStefan Roese * SPDX-License-Identifier: GPL-2.0+ 53335786aSStefan Roese */ 63335786aSStefan Roese 73335786aSStefan Roese #ifndef _COMPHY_H_ 83335786aSStefan Roese #define _COMPHY_H_ 93335786aSStefan Roese 103335786aSStefan Roese #include <dt-bindings/comphy/comphy_data.h> 113335786aSStefan Roese #include <fdtdec.h> 123335786aSStefan Roese 133335786aSStefan Roese #if defined(DEBUG) 143335786aSStefan Roese #define debug_enter() printf("----> Enter %s\n", __func__); 153335786aSStefan Roese #define debug_exit() printf("<---- Exit %s\n", __func__); 163335786aSStefan Roese #else 173335786aSStefan Roese #define debug_enter() 183335786aSStefan Roese #define debug_exit() 193335786aSStefan Roese #endif 203335786aSStefan Roese 213335786aSStefan Roese /* COMPHY registers */ 223335786aSStefan Roese #define COMMON_PHY_CFG1_REG 0x0 233335786aSStefan Roese #define COMMON_PHY_CFG1_PWR_UP_OFFSET 1 243335786aSStefan Roese #define COMMON_PHY_CFG1_PWR_UP_MASK \ 253335786aSStefan Roese (0x1 << COMMON_PHY_CFG1_PWR_UP_OFFSET) 263335786aSStefan Roese #define COMMON_PHY_CFG1_PIPE_SELECT_OFFSET 2 273335786aSStefan Roese #define COMMON_PHY_CFG1_PIPE_SELECT_MASK \ 283335786aSStefan Roese (0x1 << COMMON_PHY_CFG1_PIPE_SELECT_OFFSET) 293335786aSStefan Roese #define COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET 13 303335786aSStefan Roese #define COMMON_PHY_CFG1_PWR_ON_RESET_MASK \ 313335786aSStefan Roese (0x1 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET) 323335786aSStefan Roese #define COMMON_PHY_CFG1_CORE_RSTN_OFFSET 14 333335786aSStefan Roese #define COMMON_PHY_CFG1_CORE_RSTN_MASK \ 343335786aSStefan Roese (0x1 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET) 353335786aSStefan Roese #define COMMON_PHY_PHY_MODE_OFFSET 15 363335786aSStefan Roese #define COMMON_PHY_PHY_MODE_MASK \ 373335786aSStefan Roese (0x1 << COMMON_PHY_PHY_MODE_OFFSET) 383335786aSStefan Roese 393335786aSStefan Roese #define COMMON_PHY_CFG6_REG 0x14 403335786aSStefan Roese #define COMMON_PHY_CFG6_IF_40_SEL_OFFSET 18 413335786aSStefan Roese #define COMMON_PHY_CFG6_IF_40_SEL_MASK \ 423335786aSStefan Roese (0x1 << COMMON_PHY_CFG6_IF_40_SEL_OFFSET) 433335786aSStefan Roese 443335786aSStefan Roese #define COMMON_SELECTOR_PHY_OFFSET 0x140 453335786aSStefan Roese #define COMMON_SELECTOR_PIPE_OFFSET 0x144 463335786aSStefan Roese 473335786aSStefan Roese #define COMMON_PHY_SD_CTRL1 0x148 483335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_COMPHY_0_4_PORT_OFFSET 0 493335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_COMPHY_0_4_PORT_MASK 0xFFFF 503335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_PCIE_X4_EN_OFFSET 24 513335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_PCIE_X4_EN_MASK \ 523335786aSStefan Roese (0x1 << COMMON_PHY_SD_CTRL1_PCIE_X4_EN_OFFSET) 533335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_PCIE_X2_EN_OFFSET 25 543335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_PCIE_X2_EN_MASK \ 553335786aSStefan Roese (0x1 << COMMON_PHY_SD_CTRL1_PCIE_X2_EN_OFFSET) 563335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_RXAUI1_OFFSET 26 573335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_RXAUI1_MASK \ 583335786aSStefan Roese (0x1 << COMMON_PHY_SD_CTRL1_RXAUI1_OFFSET) 593335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_RXAUI0_OFFSET 27 603335786aSStefan Roese #define COMMON_PHY_SD_CTRL1_RXAUI0_MASK \ 613335786aSStefan Roese (0x1 << COMMON_PHY_SD_CTRL1_RXAUI0_OFFSET) 623335786aSStefan Roese 63c0132f60SStefan Roese /* ToDo: Get this address via DT */ 64c0132f60SStefan Roese #define MVEBU_CP0_REGS_BASE 0xF2000000UL 65c0132f60SStefan Roese 663335786aSStefan Roese #define DFX_DEV_GEN_CTRL12 (MVEBU_CP0_REGS_BASE + 0x400280) 673335786aSStefan Roese #define DFX_DEV_GEN_PCIE_CLK_SRC_OFFSET 7 683335786aSStefan Roese #define DFX_DEV_GEN_PCIE_CLK_SRC_MASK \ 693335786aSStefan Roese (0x3 << DFX_DEV_GEN_PCIE_CLK_SRC_OFFSET) 703335786aSStefan Roese 713335786aSStefan Roese #define MAX_LANE_OPTIONS 10 72*e8c3156eSStefan Roese #define MAX_UTMI_PHY_COUNT 3 733335786aSStefan Roese 743335786aSStefan Roese struct comphy_mux_options { 753335786aSStefan Roese u32 type; 763335786aSStefan Roese u32 mux_value; 773335786aSStefan Roese }; 783335786aSStefan Roese 793335786aSStefan Roese struct comphy_mux_data { 803335786aSStefan Roese u32 max_lane_values; 813335786aSStefan Roese struct comphy_mux_options mux_values[MAX_LANE_OPTIONS]; 823335786aSStefan Roese }; 833335786aSStefan Roese 843335786aSStefan Roese struct comphy_map { 853335786aSStefan Roese u32 type; 863335786aSStefan Roese u32 speed; 873335786aSStefan Roese u32 invert; 883335786aSStefan Roese bool clk_src; 893335786aSStefan Roese }; 903335786aSStefan Roese 913335786aSStefan Roese struct chip_serdes_phy_config { 923335786aSStefan Roese struct comphy_mux_data *mux_data; 933335786aSStefan Roese int (*ptr_comphy_chip_init)(struct chip_serdes_phy_config *, 943335786aSStefan Roese struct comphy_map *); 953335786aSStefan Roese void __iomem *comphy_base_addr; 963335786aSStefan Roese void __iomem *hpipe3_base_addr; 973335786aSStefan Roese u32 comphy_lanes_count; 983335786aSStefan Roese u32 comphy_mux_bitcount; 993335786aSStefan Roese u32 comphy_index; 1003335786aSStefan Roese }; 1013335786aSStefan Roese 1023335786aSStefan Roese /* Register helper functions */ 1033335786aSStefan Roese void reg_set(void __iomem *addr, u32 data, u32 mask); 1043335786aSStefan Roese void reg_set_silent(void __iomem *addr, u32 data, u32 mask); 1053335786aSStefan Roese void reg_set16(void __iomem *addr, u16 data, u16 mask); 1063335786aSStefan Roese void reg_set_silent16(void __iomem *addr, u16 data, u16 mask); 1073335786aSStefan Roese 1083335786aSStefan Roese /* SoC specific init functions */ 1093335786aSStefan Roese #ifdef CONFIG_ARMADA_3700 1103335786aSStefan Roese int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg, 1113335786aSStefan Roese struct comphy_map *serdes_map); 1123335786aSStefan Roese #else 1133335786aSStefan Roese static inline int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg, 1143335786aSStefan Roese struct comphy_map *serdes_map) 1153335786aSStefan Roese { 1163335786aSStefan Roese /* 1173335786aSStefan Roese * This function should never be called in this configuration, so 1183335786aSStefan Roese * lets return an error here. 1193335786aSStefan Roese */ 1203335786aSStefan Roese return -1; 1213335786aSStefan Roese } 1223335786aSStefan Roese #endif 123c0132f60SStefan Roese 124c0132f60SStefan Roese #ifdef CONFIG_ARMADA_8K 1253335786aSStefan Roese int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, 1263335786aSStefan Roese struct comphy_map *serdes_map); 127c0132f60SStefan Roese #else 128c0132f60SStefan Roese static inline int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, 129c0132f60SStefan Roese struct comphy_map *serdes_map) 130c0132f60SStefan Roese { 131c0132f60SStefan Roese /* 132c0132f60SStefan Roese * This function should never be called in this configuration, so 133c0132f60SStefan Roese * lets return an error here. 134c0132f60SStefan Roese */ 135c0132f60SStefan Roese return -1; 136c0132f60SStefan Roese } 137c0132f60SStefan Roese #endif 1383335786aSStefan Roese 1393335786aSStefan Roese void comphy_dedicated_phys_init(void); 1403335786aSStefan Roese 1413335786aSStefan Roese /* MUX function */ 1423335786aSStefan Roese void comphy_mux_init(struct chip_serdes_phy_config *ptr_chip_cfg, 1433335786aSStefan Roese struct comphy_map *comphy_map_data, 1443335786aSStefan Roese void __iomem *selector_base); 1453335786aSStefan Roese 1463335786aSStefan Roese void comphy_pcie_config_set(u32 comphy_max_count, 1473335786aSStefan Roese struct comphy_map *serdes_map); 1483335786aSStefan Roese void comphy_pcie_config_detect(u32 comphy_max_count, 1493335786aSStefan Roese struct comphy_map *serdes_map); 1503335786aSStefan Roese void comphy_pcie_unit_general_config(u32 pex_index); 1513335786aSStefan Roese 1523335786aSStefan Roese #endif /* _COMPHY_H_ */ 1533335786aSStefan Roese 154