|  | /* | 
|  | * Xilinx Processor System Gigabit Ethernet controller (GEM) driver | 
|  | * | 
|  | * PHY management interface and related data | 
|  | * | 
|  | * Copyright (c) 2021, Weidmueller Interface GmbH & Co. KG | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #ifndef _ZEPHYR_DRIVERS_ETHERNET_PHY_XLNX_GEM_H_ | 
|  | #define _ZEPHYR_DRIVERS_ETHERNET_PHY_XLNX_GEM_H_ | 
|  |  | 
|  | #include <zephyr/kernel.h> | 
|  | #include <zephyr/types.h> | 
|  |  | 
|  | /* Event codes used to indicate a particular state change to the driver */ | 
|  | #define PHY_XLNX_GEM_EVENT_LINK_SPEED_CHANGED		(1 << 0) | 
|  | #define PHY_XLNX_GEM_EVENT_LINK_STATE_CHANGED		(1 << 1) | 
|  | #define PHY_XLNX_GEM_EVENT_AUTONEG_COMPLETE		(1 << 2) | 
|  |  | 
|  | /* PHY register addresses & constants that are not vendor-specific */ | 
|  | #define PHY_IDENTIFIER_1_REGISTER			2 | 
|  | #define PHY_IDENTIFIER_2_REGISTER			3 | 
|  |  | 
|  | /* PHY registers & constants -> Marvell Alaska specific */ | 
|  |  | 
|  | /* Marvell PHY ID bits [3..0] = revision -> discard during ID check */ | 
|  | #define PHY_MRVL_PHY_ID_MODEL_MASK			0xFFFFFFF0 | 
|  | #define PHY_MRVL_PHY_ID_MODEL_88E1111			0x01410CC0 | 
|  | #define PHY_MRVL_PHY_ID_MODEL_88E151X			0x01410DD0 | 
|  |  | 
|  | #define PHY_MRVL_BASE_REGISTERS_PAGE			0 | 
|  | #define PHY_MRVL_COPPER_CONTROL_REGISTER		0 | 
|  | #define PHY_MRVL_COPPER_STATUS_REGISTER			1 | 
|  | #define PHY_MRVL_COPPER_AUTONEG_ADV_REGISTER		4 | 
|  | #define PHY_MRVL_COPPER_LINK_PARTNER_ABILITY_REGISTER	5 | 
|  | #define PHY_MRVL_1000BASET_CONTROL_REGISTER		9 | 
|  | #define PHY_MRVL_COPPER_CONTROL_1_REGISTER		16 | 
|  | #define PHY_MRVL_COPPER_STATUS_1_REGISTER		17 | 
|  | #define PHY_MRVL_COPPER_INT_ENABLE_REGISTER		18 | 
|  | #define PHY_MRVL_COPPER_INT_STATUS_REGISTER		19 | 
|  | #define PHY_MRVL_COPPER_PAGE_SWITCH_REGISTER		22 | 
|  | #define PHY_MRVL_GENERAL_CONTROL_1_REGISTER		20 | 
|  | #define PHY_MRVL_GENERAL_CONTROL_1_PAGE			18 | 
|  |  | 
|  | #define PHY_MRVL_GENERAL_CONTROL_1_RESET_BIT		(1 << 15) | 
|  |  | 
|  | #define PHY_MRVL_COPPER_CONTROL_RESET_BIT		(1 << 15) | 
|  | #define PHY_MRVL_COPPER_CONTROL_AUTONEG_ENABLE_BIT	(1 << 12) | 
|  |  | 
|  | #define PHY_MRVL_ADV_1000BASET_FDX_BIT			(1 << 9) | 
|  | #define PHY_MRVL_ADV_1000BASET_HDX_BIT			(1 << 8) | 
|  | #define PHY_MRVL_ADV_100BASET_FDX_BIT			(1 << 8) | 
|  | #define PHY_MRVL_ADV_100BASET_HDX_BIT			(1 << 7) | 
|  | #define PHY_MRVL_ADV_10BASET_FDX_BIT			(1 << 6) | 
|  | #define PHY_MRVL_ADV_10BASET_HDX_BIT			(1 << 5) | 
|  | #define PHY_MRVL_ADV_SELECTOR_802_3			0x0001 | 
|  |  | 
|  | #define PHY_MRVL_MDIX_CONFIG_MASK			0x0003 | 
|  | #define PHY_MRVL_MDIX_CONFIG_SHIFT			5 | 
|  | #define PHY_MRVL_MDIX_AUTO_CROSSOVER_ENABLE		0x0003 | 
|  | #define PHY_MRVL_MODE_CONFIG_MASK			0x0003 | 
|  | #define PHY_MRVL_MODE_CONFIG_SHIFT			0 | 
|  |  | 
|  | #define PHY_MRVL_COPPER_SPEED_CHANGED_INT_BIT		(1 << 14) | 
|  | #define PHY_MRVL_COPPER_DUPLEX_CHANGED_INT_BIT		(1 << 13) | 
|  | #define PHY_MRVL_COPPER_AUTONEG_COMPLETED_INT_BIT	(1 << 11) | 
|  | #define PHY_MRVL_COPPER_LINK_STATUS_CHANGED_INT_BIT	(1 << 10) | 
|  | #define PHY_MRVL_COPPER_LINK_STATUS_BIT_SHIFT		5 | 
|  |  | 
|  | #define PHY_MRVL_LINK_SPEED_SHIFT			14 | 
|  | #define PHY_MRVL_LINK_SPEED_MASK			0x3 | 
|  | #define PHY_MRVL_LINK_SPEED_10MBIT			0 | 
|  | #define PHY_MRVL_LINK_SPEED_100MBIT			1 | 
|  | #define PHY_MRVL_LINK_SPEED_1GBIT			2 | 
|  |  | 
|  | /*TI TLK105 & DP83822*/ | 
|  |  | 
|  | /* TI PHY ID bits [3..0] = revision -> discard during ID check */ | 
|  | #define PHY_TI_PHY_ID_MODEL_MASK			0xFFFFFFF0 | 
|  | #define PHY_TI_PHY_ID_MODEL_DP83822			0x2000A240 | 
|  | #define PHY_TI_PHY_ID_MODEL_TLK105			0x2000A210 | 
|  |  | 
|  | #define PHY_TI_PHY_SPECIFIC_CONTROL_REGISTER		0x0010 | 
|  | #define PHY_TI_BASIC_MODE_CONTROL_REGISTER		0x0000 | 
|  | #define PHY_TI_BASIC_MODE_STATUS_REGISTER		0x0001 | 
|  | #define PHY_TI_AUTONEG_ADV_REGISTER			0x0004 | 
|  | #define PHY_TI_CONTROL_REGISTER_1			0x0009 | 
|  | #define PHY_TI_PHY_STATUS_REGISTER			0x0010 | 
|  | #define PHY_TI_MII_INTERRUPT_STATUS_REGISTER_1		0x0012 | 
|  | #define PHY_TI_LED_CONTROL_REGISTER			0x0018 | 
|  | #define PHY_TI_PHY_CONTROL_REGISTER			0x0019 | 
|  |  | 
|  | #define PHY_TI_BASIC_MODE_CONTROL_RESET_BIT		(1 << 15) | 
|  | #define PHY_TI_BASIC_MODE_CONTROL_AUTONEG_ENABLE_BIT	(1 << 12) | 
|  |  | 
|  | #define PHY_TI_BASIC_MODE_STATUS_LINK_STATUS_BIT	(1 << 2) | 
|  |  | 
|  | #define PHY_TI_LINK_STATUS_CHANGED_INT_BIT		(1 << 13) | 
|  | #define PHY_TI_SPEED_CHANGED_INT_BIT			(1 << 12) | 
|  | #define PHY_TI_DUPLEX_CHANGED_INT_BIT			(1 << 11) | 
|  | #define PHY_TI_AUTONEG_COMPLETED_INT_BIT		(1 << 10) | 
|  |  | 
|  | #define PHY_TI_ADV_SELECTOR_802_3			0x0001 | 
|  | #define PHY_TI_ADV_100BASET_FDX_BIT			(1 << 8) | 
|  | #define PHY_TI_ADV_100BASET_HDX_BIT			(1 << 7) | 
|  | #define PHY_TI_ADV_10BASET_FDX_BIT			(1 << 6) | 
|  | #define PHY_TI_ADV_10BASET_HDX_BIT			(1 << 5) | 
|  |  | 
|  | #define PHY_TI_CR1_ROBUST_AUTO_MDIX_BIT			(1 << 5) | 
|  |  | 
|  | #define PHY_TI_PHY_CONTROL_AUTO_MDIX_ENABLE_BIT		(1 << 15) | 
|  | #define PHY_TI_PHY_CONTROL_FORCE_MDIX_BIT		(1 << 14) | 
|  | #define PHY_TI_PHY_CONTROL_LED_CONFIG_LINK_ONLY_BIT	(1 << 5) | 
|  |  | 
|  | #define PHY_TI_LED_CONTROL_BLINK_RATE_SHIFT		9 | 
|  | #define PHY_TI_LED_CONTROL_BLINK_RATE_20HZ		0 | 
|  | #define PHY_TI_LED_CONTROL_BLINK_RATE_10HZ		1 | 
|  | #define PHY_TI_LED_CONTROL_BLINK_RATE_5HZ		2 | 
|  | #define PHY_TI_LED_CONTROL_BLINK_RATE_2HZ		3 | 
|  |  | 
|  | #define PHY_TI_PHY_STATUS_LINK_BIT			(1 << 0) | 
|  | #define PHY_TI_PHY_STATUS_SPEED_BIT			(1 << 1) | 
|  |  | 
|  | /** | 
|  | * @brief Vendor-specific PHY management function pointer table struct | 
|  | * | 
|  | * Contains the PHY management function pointers for a specific PHY | 
|  | * make or model. | 
|  | */ | 
|  | struct phy_xlnx_gem_api { | 
|  | void (*phy_reset_func)(const struct device *dev); | 
|  | void (*phy_configure_func)(const struct device *dev); | 
|  | uint16_t (*phy_poll_status_change_func)(const struct device *dev); | 
|  | uint8_t (*phy_poll_link_status_func)(const struct device *dev); | 
|  | enum eth_xlnx_link_speed (*phy_poll_link_speed_func)(const struct device *dev); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @brief Supported PHY list entry struct | 
|  | * | 
|  | * Contains the PHY management function pointers for a specific PHY | 
|  | * make or model. | 
|  | */ | 
|  | struct phy_xlnx_gem_supported_dev { | 
|  | uint32_t phy_id; | 
|  | uint32_t phy_id_mask; | 
|  | struct phy_xlnx_gem_api *api; | 
|  | const char *identifier; | 
|  | }; | 
|  |  | 
|  | /* PHY identification function -> generic, not vendor-specific */ | 
|  | int phy_xlnx_gem_detect(const struct device *dev); | 
|  |  | 
|  | #endif /* _ZEPHYR_DRIVERS_ETHERNET_PHY_XLNX_GEM_H_ */ |