Compare commits

...

2 Commits

Author SHA1 Message Date
f87f0f95b2 update 2026-01-27 15:12:08 +08:00
0552fe6f15 1 add jlsei PHY driver
2 change deconfig
2026-01-27 15:10:46 +08:00
8 changed files with 4409 additions and 44 deletions

View File

@ -66,8 +66,6 @@ CONFIG_CPUFREQ_DT=y
CONFIG_ARM_ROCKCHIP_CPUFREQ=y
CONFIG_ARM_SCMI_PROTOCOL=y
CONFIG_ROCKCHIP_SIP=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_CRYPTO_SHA1_ARM64_CE=y
CONFIG_CRYPTO_SHA2_ARM64_CE=y
CONFIG_CRYPTO_GHASH_ARM64_CE=y
@ -81,10 +79,8 @@ CONFIG_BLK_DEV_THROTTLING=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_CMDLINE_PARTITION=y
# CONFIG_COMPACTION is not set
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
CONFIG_CMA=y
CONFIG_CMA_INACTIVE=y
CONFIG_ZSMALLOC=y
CONFIG_NET=y
CONFIG_PACKET=y
@ -227,7 +223,6 @@ CONFIG_AQTION=m
# CONFIG_NET_VENDOR_QLOGIC is not set
# CONFIG_NET_VENDOR_QUALCOMM is not set
# CONFIG_NET_VENDOR_RDC is not set
CONFIG_R8168=y
CONFIG_R8169=y
# CONFIG_NET_VENDOR_RENESAS is not set
# CONFIG_NET_VENDOR_ROCKER is not set
@ -244,8 +239,20 @@ CONFIG_STMMAC_ETH=y
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not set
CONFIG_ROCKCHIP_PHY=y
CONFIG_USB_RTL8150=y
CONFIG_USB_RTL8152=y
CONFIG_JLSEMI_PHY=y
CONFIG_PPP=y
CONFIG_PPP_BSDCOMP=y
CONFIG_PPP_DEFLATE=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
CONFIG_SLIP=y
CONFIG_SLIP_COMPRESSED=y
CONFIG_USB_RTL8150=m
CONFIG_USB_RTL8152=m
CONFIG_USB_USBNET=y
CONFIG_USB_NET_QMI_WWAN=y
CONFIG_WL_ROCKCHIP=y
@ -253,7 +260,6 @@ CONFIG_WIFI_BUILD_MODULE=y
CONFIG_AP6XXX=m
CONFIG_BCMDHD_PCIE=y
CONFIG_RTL8821CU=m
CONFIG_VIRT_WIFI=m
CONFIG_INPUT_FF_MEMLESS=y
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_ADC=y
@ -269,8 +275,6 @@ CONFIG_TOUCHSCREEN_GSL3673=y
CONFIG_TOUCHSCREEN_GT1X=y
CONFIG_TOUCHSCREEN_ELAN=y
CONFIG_TOUCHSCREEN_USB_COMPOSITE=y
CONFIG_TOUCHSCREEN_GT9XXX=y
CONFIG_TOUCHSCREEN_HX83102=y
CONFIG_ROCKCHIP_REMOTECTL=y
CONFIG_ROCKCHIP_REMOTECTL_PWM=y
CONFIG_INPUT_MISC=y
@ -332,18 +336,11 @@ CONFIG_REGULATOR=y
CONFIG_REGULATOR_DEBUG=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_FIXED_VOLTAGE_FIREFLY=y
CONFIG_REGULATOR_ACT8865=y
CONFIG_REGULATOR_FAN53555=y
CONFIG_REGULATOR_GPIO=y
CONFIG_REGULATOR_LP8752=y
CONFIG_REGULATOR_MP8865=y
CONFIG_REGULATOR_PWM=y
CONFIG_REGULATOR_RK806=y
CONFIG_REGULATOR_RK808=y
CONFIG_REGULATOR_RK860X=y
CONFIG_REGULATOR_TPS65132=y
CONFIG_REGULATOR_TPS6586X=y
CONFIG_REGULATOR_XZ3216=y
CONFIG_MEDIA_SUPPORT=y
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_VIDEO_CLASS=y
@ -490,21 +487,21 @@ CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_HCD_PCI is not set
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_ACM=y
CONFIG_USB_STORAGE=m
CONFIG_USB_UAS=m
CONFIG_USB_STORAGE=y
CONFIG_USB_UAS=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC2=y
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_CH341=y
CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_FTDI_SIO=y
CONFIG_USB_SERIAL_KEYSPAN=y
CONFIG_USB_SERIAL_PL2303=y
CONFIG_USB_SERIAL_OTI6858=y
CONFIG_USB_SERIAL_QUALCOMM=y
CONFIG_USB_SERIAL_SIERRAWIRELESS=y
CONFIG_USB_SERIAL_OPTION=y
CONFIG_USB_SERIAL_CH341=m
CONFIG_USB_SERIAL_CP210X=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_KEYSPAN=m
CONFIG_USB_SERIAL_PL2303=m
CONFIG_USB_SERIAL_OTI6858=m
CONFIG_USB_SERIAL_QUALCOMM=m
CONFIG_USB_SERIAL_SIERRAWIRELESS=m
CONFIG_USB_SERIAL_OPTION=m
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_DEBUG_FILES=y
CONFIG_USB_GADGET_VBUS_DRAW=500
@ -557,28 +554,15 @@ CONFIG_VHOST_NET=m
CONFIG_VHOST_VDPA=y
CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y
CONFIG_STAGING=y
CONFIG_FIQ_DEBUGGER=y
CONFIG_FIQ_DEBUGGER_NO_SLEEP=y
CONFIG_FIQ_DEBUGGER_CONSOLE=y
CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y
CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y
CONFIG_RK_CONSOLE_THREAD=y
CONFIG_COMMON_CLK_RK808=y
CONFIG_COMMON_CLK_SCMI=y
CONFIG_COMMON_CLK_PWM=y
CONFIG_MAILBOX=y
CONFIG_IOMMU_LIMIT_IOVA_ALIGNMENT=y
CONFIG_IOMMU_IOVA_ALIGNMENT=4
CONFIG_IOMMU_DEFAULT_PASSTHROUGH=y
CONFIG_ROCKCHIP_IOMMU=y
CONFIG_ARM_SMMU_V3=y
CONFIG_VIRTIO_IOMMU=y
CONFIG_RPMSG_VIRTIO=y
CONFIG_CPU_PX30=y
CONFIG_CPU_RK1808=y
CONFIG_CPU_RK3328=y
CONFIG_CPU_RK3399=y
CONFIG_CPU_RK3568=y
CONFIG_CPU_RK3588=y
CONFIG_ROCKCHIP_CPUINFO=y
CONFIG_ROCKCHIP_GRF=y
@ -592,6 +576,12 @@ CONFIG_ROCKCHIP_SYSTEM_MONITOR=y
CONFIG_ROCKCHIP_VENDOR_STORAGE=y
CONFIG_ROCKCHIP_MMC_VENDOR_STORAGE=y
CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y
CONFIG_FIQ_DEBUGGER=y
CONFIG_FIQ_DEBUGGER_NO_SLEEP=y
CONFIG_FIQ_DEBUGGER_CONSOLE=y
CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y
CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y
CONFIG_RK_CONSOLE_THREAD=y
CONFIG_ROCKCHIP_DEBUG=y
CONFIG_PM_DEVFREQ=y
CONFIG_DEVFREQ_GOV_PERFORMANCE=y
@ -631,6 +621,9 @@ CONFIG_ROCKCHIP_OTP=y
CONFIG_TEE=y
CONFIG_OPTEE=y
CONFIG_RK_HEADSET=y
CONFIG_ROCKCHIP_RKNPU=y
CONFIG_EBF_MODULE=y
CONFIG_EBF_DHT11=m
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
@ -647,6 +640,7 @@ CONFIG_ZISOFS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=936
CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
CONFIG_EXFAT_FS=y
CONFIG_NTFS_FS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
@ -701,7 +695,6 @@ CONFIG_DEBUG_INFO=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0
CONFIG_SCHEDSTATS=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_CREDENTIALS=y
CONFIG_RCU_CPU_STALL_TIMEOUT=60
CONFIG_FUNCTION_TRACER=y

View File

@ -311,6 +311,11 @@ config VITESSE_PHY
tristate "Vitesse PHYs"
help
Currently supports the vsc8244
config JLSEMI_PHY
tristate "JLSemi PHYs"
help
Currently supports the JLSemi PHYs.
config XILINX_GMII2RGMII
tristate "Xilinx GMII2RGMII converter driver"

View File

@ -59,6 +59,8 @@ obj-$(CONFIG_DP83TC811_PHY) += dp83tc811.o
obj-$(CONFIG_FIXED_PHY) += fixed_phy.o
obj-$(CONFIG_ICPLUS_PHY) += icplus.o
obj-$(CONFIG_INTEL_XWAY_PHY) += intel-xway.o
jlsemiphy-objs := jlsemi.o jlsemi-core.o
obj-$(CONFIG_JLSEMI_PHY) += jlsemiphy.o
obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
obj-$(CONFIG_LXT_PHY) += lxt.o
obj-$(CONFIG_MARVELL_10G_PHY) += marvell10g.o

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,439 @@
/* SPDX-License-Identifier: GPL-2.0+
*
* Copyright (C) 2021 JLSemi Corporation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef _JLSEMI_CORE_H
#define _JLSEMI_CORE_H
#define JLSEMI_KERNEL_DEVICE_TREE_USE 1
#include <linux/phy.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/of.h>
#if (JLSEMI_KERNEL_DEVICE_TREE_USE)
#include <dt-bindings/phy/jlsemi-dt-phy.h>
#else
#include "jlsemi-dt-phy.h"
#endif
#define JL1XXX_PHY_ID 0x937c4023
#define JL2XXX_PHY_ID 0x937c4032
#define JLSEMI_PHY_ID_MASK 0xfffffff0
#define JL1XXX_PAGE0 0
#define JL1XXX_PAGE7 7
#define JL1XXX_INTR_REG 19
#define JL1XXX_INTR_LINK BIT(13)
#define JL1XXX_INTR_AN_ERR BIT(11)
#define JL1XXX_LED_REG 19
#define JL1XXX_LED_EN BIT(3)
#define JL1XXX_INTR_STATUS_REG 30
#define JL1XXX_PAGE7 7
#define JL1XXX_RMII_CTRL_REG 16
#define JL1XXX_RMII_OUT BIT(12)
#define JL1XXX_RMII_MODE BIT(3)
#define JL1XXX_PAGE129 129
#define JL1XXX_LED_MODE_REG 24
#define JL1XXX_MAC_ADDR0_REG 25
#define JL1XXX_MAC_ADDR1_REG 26
#define JL1XXX_MAC_ADDR2_REG 27
#define JL1XXX_WOL_CTRL_REG 28
#define JL1XXX_WOL_DIS BIT(15)
#define JL1XXX_WOL_CLEAR BIT(1)
#define JL1xxx_WOL_RECEIVE BIT(0)
#define ADDR8_HIGH_TO_LOW(n) ((n >> 4) | (n << 4))
#define JL1XXX_PAGE24 24
#define JL1XXX_REG24 24
#define JL1XXX_MDI_TX_BM_MASK 0x1c00
#define JL1XXX_MDI_TX_BM(n) (n << 10)
#define JL1XXX_MDI_TX_SRN BIT(0)
#define JL1XXX_PAGE7 7
#define JL1XXX_REG16 16
#define JL1XXX_RMII_MODE BIT(3)
#define JL1XXX_RMII_CLK_50M_INPUT BIT(12)
#define JL1XXX_RMII_TX_SKEW_MASK (0xf << 8)
#define JL1XXX_RMII_TX_SKEW(n) ((n << 8) & JL1XXX_RMII_TX_SKEW_MASK)
#define JL1XXX_RMII_RX_SKEW_MASK (0xf << 4)
#define JL1XXX_RMII_RX_SKEW(n) ((n << 4) & JL1XXX_RMII_RX_SKEW_MASK)
#define JL1XXX_RMII_CRS_DV BIT(2)
#define JL2XXX_PAGE0 0
#define JL2XXX_BMCR_REG 0x0000
#define JL2XXX_SOFT_RESET BIT(15)
#define JL2XXX_SPEED_LSB BIT(13)
#define JL2XXX_AUTONEG_EN BIT(12)
#define JL2XXX_SPEED_MSB BIT(6)
#define JL2XXX_DSFT_CTRL_REG 17
#define JL2XXX_DSFT_EN BIT(12)
#define JL2XXX_DSFT_SMART_EN BIT(13)
#define JL2XXX_DSFT_TWO_WIRE_EN BIT(14)
#define JL2XXX_DSFT_AN_ERR_EN BIT(15)
#define JL2XXX_DSFT_STL_MASK 0x03e0
#define JL2XXX_DSFT_STL_CNT(n) (((n << 5) & JL2XXX_DSFT_STL_MASK))
#define JL2XXX_DSFT_AN_MASK 0x001f
#define JL2XXX_DSFT_CNT_MAX 32
#define JL2XXX_PHY_INFO_REG 29
#define JL2XXX_PATCH_MASK 0xffff
#define JL2XXX_SW_MASK 0xffff
#define JL2XXX_AUTO_GAIN_DIS BIT(6)
#define JLSEMI_PAGE31 0x001f
#define JL2XXX_WOL_CTRL_PAGE 0x0012
#define JL2XXX_WOL_CTRL_REG 0x0015
#define JL2XXX_WOL_STAS_PAGE 0x1200
#define JL2XXX_WOL_STAS_REG 0x0010
#define JL2XXX_MAC_ADDR2_REG 0x0011
#define JL2XXX_MAC_ADDR1_REG 0x0012
#define JL2XXX_MAC_ADDR0_REG 0x0013
#define JL2XXX_WOL_EVENT BIT(1)
#define JL2XXX_WOL_POLARITY BIT(14)
#define JL2XXX_WOL_EN BIT(15)
#define JL2XXX_WOL_GLB_EN BIT(6)
#define JL2XXX_PAGE2626 2626
#define JL2XXX_INTR_CTRL_REG 18
#define JL2XXX_INTR_LINK_CHANGE BIT(4)
#define JL2XXX_INTR_AN_COMPLETE BIT(3)
#define JL2XXX_INTR_AN_PAGE BIT(2)
#define JL2XXX_INTR_AN_ERR BIT(0)
#define JL2XXX_PAGE2627 2627
#define JL2XXX_INTR_STATUS_REG 29
#define JL2XXX_CLK_CTRL_REG 25
#define JL2XXX_CLK_OUT_PIN BIT(0)
#define JL2XXX_CLK_SSC_EN BIT(3)
#define JL2XXX_CLK_125M_OUT BIT(11)
#define JL2XXXX_CLK_SRC BIT(12)
#define JL2XXX_PAGE158 158
#define JL2XXX_INTR_PIN_REG 16
#define JL2XXX_INTR_PIN_EN BIT(14)
#define JL2XXX_PAGE160 160
#define JL2XXX_PIN_EN_REG 21
#define JL2XXX_PIN_OUTPUT BIT(11)
#define JL2XXX_PAGE3336 3336
#define JL2XXX_RGMII_CTRL_REG 17
#define JL2XXX_PAGE18 18
#define JL2XXX_RXC_OUT_REG 21
#define JL2XXX_RXC_OUT BIT(14)
#define JL2XXX_WORK_MODE_REG 21
#define JL2XXX_WORK_MODE_MASK 0x7
#define JL2XXX_PAGE160 160
#define JL2XXX_REG25 25
#define JL2XXX_CPU_RESET BIT(3)
#define JL2XXX_PAGE173 173
#define JL2XXX_PATCH_REG 0x0010
#define JL2XXX_REG16 16
#define JL2XXX_REG17 17
#define JL2XXX_LOAD_GO 0
#define JL2XXX_LOAD_DATA0 0x3a01
#define JL2XXX_REG20 20
#define JL2XXX_REG21 21
#define JL2XXX_LPBK_MODE_MASK 0x6
#define JL2XXX_LPBK_PMD_MODE BIT(2)
#define JL2XXX_LPBK_EXT_MODE BIT(1)
#define JL2XXX_PAGE174 174
#define JL2XXX_REG29 29
#define JL2XXX_PAGE191 191
#define JL2XXX_RGMII_CFG BIT(3)
#define JL2XXX_PAGE258 258
#define JL2XXX_SLEW_RATE_CTRL_REG 23
#define JL2XXX_SLEW_RATE_EN BIT(12)
#define JL2XXX_SLEW_RATE_REF_CLK BIT(13)
#define JL2XXX_SLEW_RATE_SEL_CLK BIT(14)
#define JL2XXX_REG20 20
#define JL2XXX_SPEED1000_NO_AN (BIT(11) | BIT(10))
#define LED_PERIOD_MASK 0xff00
#define LEDPERIOD(n) ((n << 8) & LED_PERIOD_MASK)
#define LED_ON_MASK 0x00ff
#define LEDON(n) ((n << 0) & LED_ON_MASK)
#define ADVERTISE_FIBER_1000HALF 0x40
#define ADVERTISE_FIBER_1000FULL 0x20
/*************************************************************************/
struct jl_hw_stat {
const char *string;
u8 reg;
u16 page;
u16 mask;
u16 enable;
};
static const struct jl_hw_stat jl_phy[] = {
{
.string = "page0,reg0",
.enable = true,
.page = 0,
.reg = 0,
}, {
.string = "page0,reg1",
.enable = false,
.page = 0,
.reg = 1,
},
};
static const struct jl_hw_stat jl2xxx_hw_stats[] = {
{
.string = "phy_patch_version",
.reg = JL2XXX_PATCH_REG,
.page = JL2XXX_PAGE174,
.mask = JL2XXX_PATCH_MASK,
}, {
.string = "phy_software_version",
.reg = JL2XXX_PHY_INFO_REG,
.page = JL2XXX_PAGE0,
.mask = JL2XXX_SW_MASK,
},
};
struct jl_led_ctrl {
u32 enable; /* LED control enable */
u32 mode; /* LED work mode */
u32 global_period; /* LED global twinkle period */
u32 global_on; /* LED global twinkle hold on time */
u32 gpio_output; /* LED is used as gpio output */
u32 polarity; /* LED polarity */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_fld_ctrl {
u32 enable; /* Fast link down control enable */
u32 delay; /* Fast link down time */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_wol_ctrl {
u32 enable; /* Wake On LAN control enable */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_intr_ctrl {
u32 enable; /* Interrupt control enable */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_downshift_ctrl {
u32 enable; /* Downshift control enable */
u32 count; /* Downshift control count */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_rgmii_ctrl {
u32 enable; /* Rgmii control enable */
u32 rx_delay; /* Rgmii control rx delay */
u32 tx_delay; /* Rgmii control tx delay */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_patch_ctrl {
u32 enable; /* Patch control enable */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_clk_ctrl {
u32 enable; /* Clock 125M control enable */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_work_mode_ctrl {
u32 enable; /* Work mode control enable */
u32 mode; /* Work mode select mode */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_loopback_ctrl {
u32 enable; /* Loopback control enable */
u32 mode; /* Loopback select mode */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_mdi_ctrl {
u32 enable; /* Mdi control enable */
u32 rate; /* Mdi select Rate */
u32 amplitude; /* Mdi select amplitude */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_rmii_ctrl {
u32 enable; /* Rmii control enable */
u32 tx_timing; /* Rmii modify tx timing */
u32 rx_timing; /* Rmii modify rx timing */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_slew_rate_ctrl {
u32 enable; /* Slew rate control enable */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl_rxc_out_ctrl {
u32 enable; /* Rx clock out control enable */
bool ethtool; /* Whether the ethtool is supported */
};
struct jl1xxx_priv {
struct jl_led_ctrl led;
struct jl_wol_ctrl wol;
struct jl_intr_ctrl intr;
bool static_inited; /* Initialization flag */
struct jl_mdi_ctrl mdi;
struct jl_rmii_ctrl rmii;
};
struct jl2xxx_priv {
struct jl_led_ctrl led;
struct jl_fld_ctrl fld;
struct jl_wol_ctrl wol;
struct jl_intr_ctrl intr;
struct jl_downshift_ctrl downshift;
struct jl_rgmii_ctrl rgmii;
struct jl_patch_ctrl patch;
struct jl_clk_ctrl clk;
const struct jl_hw_stat *hw_stats;
bool static_inited; /* Initialization flag */
int nstats; /* Record for dynamic operation */
u64 *stats; /* Pointer for dynamic operation */
struct jl_work_mode_ctrl work_mode;
struct jl_loopback_ctrl lpbk;
struct jl_slew_rate_ctrl slew_rate;
struct jl_rxc_out_ctrl rxc_out;
};
/* macros to simplify debug checking */
#define JLSEMI_PHY_MSG(msg, args...) printk(msg, ## args)
/************************* JLSemi iteration code *************************/
struct device *jlsemi_get_mdio(struct phy_device *phydev);
int jl2xxx_downshift_dynamic_op_get(struct phy_device *phydev, u8 *data);
int jl2xxx_downshift_dynamic_op_set(struct phy_device *phydev, u8 cnt);
int jlsemi_read_paged(struct phy_device *phydev, int page, u32 regnum);
int jl2xxx_intr_ack_event(struct phy_device *phydev);
int jl2xxx_intr_static_op_set(struct phy_device *phydev);
int jl1xxx_intr_ack_event(struct phy_device *phydev);
int jl1xxx_intr_static_op_set(struct phy_device *phydev);
int jl2xxx_wol_dynamic_op_get(struct phy_device *phydev);
int jl2xxx_wol_dynamic_op_set(struct phy_device *phydev);
int jl1xxx_wol_dynamic_op_get(struct phy_device *phydev);
int jl1xxx_wol_dynamic_op_set(struct phy_device *phydev);
int jl2xxx_fld_dynamic_op_get(struct phy_device *phydev, u8 *msecs);
int jl2xxx_fld_dynamic_op_set(struct phy_device *phydev, const u8 *msecs);
int jl1xxx_operation_args_get(struct phy_device *phydev);
int jl1xxx_static_op_init(struct phy_device *phydev);
int jl2xxx_operation_args_get(struct phy_device *phydev);
int jl2xxx_static_op_init(struct phy_device *phydev);
int jlsemi_soft_reset(struct phy_device *phydev);
int jl2xxx_pre_init(struct phy_device *phydev,
u32 *init_data, u16 data_len,
u16 *patch_fw_versions, u16 versions_len,
u16 patch_version);
bool jl2xxx_read_fiber_status(struct phy_device *phydev);
int jl2xxx_config_aneg_fiber(struct phy_device *phydev);
/********************** Convenience function for phy **********************/
/* Notice: You should change page 0 when you When you call it after */
int jlsemi_write_page(struct phy_device *phydev, int page);
int jlsemi_read_page(struct phy_device *phydev);
int jlsemi_modify_paged_reg(struct phy_device *phydev,
int page, u32 regnum,
u16 mask, u16 set);
int jlsemi_set_bits(struct phy_device *phydev,
int page, u32 regnum, u16 val);
int jlsemi_clear_bits(struct phy_device *phydev,
int page, u32 regnum, u16 val);
int jlsemi_fetch_bit(struct phy_device *phydev,
int page, u32 regnum, u16 val);
int jlsemi_drivers_register(struct phy_driver *phydrvs, int size);
void jlsemi_drivers_unregister(struct phy_driver *phydrvs, int size);
/**
* module_jlsemi_driver() - Helper macro for registering PHY drivers
* @__phy_drivers: array of PHY drivers to register
*
* Helper macro for PHY drivers which do not do anything special in module
* init/exit. Each module may only use this macro once, and calling it
* replaces module_init() and module_exit().
*/
#if (KERNEL_VERSION(4, 0, 0) > LINUX_VERSION_CODE)
#define jlsemi_module_driver(__phy_drivers, __count) \
static int __init phy_module_init(void) \
{ \
return jlsemi_drivers_register(__phy_drivers, __count); \
} \
module_init(phy_module_init); \
static void __exit phy_module_exit(void) \
{ \
jlsemi_drivers_unregister(__phy_drivers, __count); \
} \
module_exit(phy_module_exit)
#define module_jlsemi_driver(__phy_drivers) \
jlsemi_module_driver(__phy_drivers, ARRAY_SIZE(__phy_drivers))
#else
#define module_jlsemi_driver(__phy_drivers) \
module_phy_driver(__phy_drivers)
#endif
#endif /* _JLSEMI_CORE_H */

View File

@ -0,0 +1,341 @@
/* SPDX-License-Identifier: GPL-2.0
*
* Device Tree constants for JLSemi PHY
*
* Author: Gangqiao Kuang
*
* Copyright (c) 2021 JLSemi Corporation
*/
#ifndef _DT_BINDINGS_JLSEMI_PHY_H
#define _DT_BINDINGS_JLSEMI_PHY_H
/**************************** Linux Version Compatible ********************/
#define JLSEMI_DEV_COMPATIBLE (KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE)
#define JL2XXX_GET_STRING (KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE)
#define JL2XXX_GET_STAT (KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE)
#define JL2XXX_PHY_TUNABLE (KERNEL_VERSION(5, 0, 0) <= LINUX_VERSION_CODE)
#define JLSEMI_PHY_WOL (KERNEL_VERSION(3, 10, 0) < LINUX_VERSION_CODE)
/*************************************************************************/
/**************************** JLSemi Debug *******************************/
#define JLSEMI_DEBUG_INFO 0
/*************************************************************************/
/************************* JLSemi Phy Init Reentrant *********************/
#define JLSEMI_PHY_NOT_REENTRANT false
/*************************************************************************/
/**************************** JL1XXX-LED *********************************/
/* PHY LED Modes Select */
#define JL1XXX_LED0_STRAP (1 << 0)
#define JL1XXX_LED0_EEE (1 << 1)
#define JL1XXX_LED0_100_ACTIVITY (1 << 2)
#define JL1XXX_LED0_10_ACTIVITY (1 << 3)
#define JL1XXX_LED0_100_LINK (1 << 4)
#define JL1XXX_LED0_10_LINK (1 << 5)
#define JL1XXX_LED1_STRAP (1 << 8)
#define JL1XXX_LED1_EEE (1 << 9)
#define JL1XXX_LED1_100_ACTIVITY (1 << 10)
#define JL1XXX_LED1_10_ACTIVITY (1 << 11)
#define JL1XXX_LED1_100_LINK (1 << 12)
#define JL1XXX_LED1_10_LINK (1 << 13)
/* PHY LED As Gpio Output Select */
#define JL1XXX_GPIO_LED0_OUT (1 << 2)
#define JL1XXX_GPIO_LED1_OUT (1 << 3)
#define JL1XXX_GPIO_LED0_EN (1 << 14)
#define JL1XXX_GPIO_LED1_EN (1 << 15)
/* PHY LED Control Enable Mask Select */
#define JL1XXX_LED_STATIC_OP_EN (1 << 0)
#define JL1XXX_LED_MODE_EN (1 << 1)
#define JL1XXX_LED_GLOABL_PERIOD_EN (1 << 2)
#define JL1XXX_LED_GLOBAL_ON_EN (1 << 3)
#define JL1XXX_LED_GPIO_OUT_EN (1 << 4)
//-----------------------------------------------------------------------//
/* PHY LED Control Enable Mask Config */
#define JL1XXX_LED_CTRL_EN (0)
/* PHY LED Modes Config */
#define JL1XXX_CFG_LED_MODE (JL1XXX_LED0_100_LINK | \
JL1XXX_LED0_10_LINK | \
JL1XXX_LED1_100_ACTIVITY | \
JL1XXX_LED1_10_ACTIVITY)
/* PHY LED As Gpio Output Config */
#define JL1XXX_CFG_GPIO (JL1XXX_GPIO_LED0_EN | \
JL1XXX_GPIO_LED0_OUT | \
JL1XXX_GPIO_LED1_EN | \
JL1XXX_GPIO_LED1_OUT)
/* PHY LED Global Period Config */
#define JL1XXX_GLOBAL_PERIOD_MS 0x10
/* PHY LED Global Hold On Config */
#define JL1XXX_GLOBAL_ON_MS 0x8
/**************************************************************************/
/****************************** JL1XXX-WOL ********************************/
/* PHY WOL Control Enable Mask Select */
#define JL1XXX_WOL_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY WOL Control Enable Mask Config */
#define JL1XXX_WOL_CTRL_EN (0)
/*************************************************************************/
/***************************** JL1XXX-INTR *******************************/
/* PHY Interrupt Control Enable Mask Select */
#define JL1XXX_INTR_STATIC_OP_EN (1 << 0)
#define JL1XXX_INTR_LINK_CHANGE_EN (1 << 1)
#define JL1XXX_INTR_AN_ERR_EN (1 << 2)
//-----------------------------------------------------------------------//
/* PHY Interrupt Irq Number Config */
#define JL1XXX_INTR_IRQ -1
/* PHY Interrupt Control Enable Mask Config */
#define JL1XXX_INTR_CTRL_EN (0)
/*************************************************************************/
/**************************** JL1XXX-MDI *********************************/
/* PHY MDI Control Mode Enable Mask Select */
#define JL1XXX_MDI_STATIC_OP_EN (1 << 0)
#define JL1XXX_MDI_RATE_EN (1 << 1)
#define JL1XXX_MDI_AMPLITUDE_EN (1 << 2)
/* PHY MDI Rate Select */
#define JL1XXX_MDI_RATE_STANDARD 0
#define JL1XXX_MDI_RATE_ACCELERATE 1
/* PHY MDI Amplitude Select */
#define JL1XXX_MDI_AMPLITUDE0 0
#define JL1XXX_MDI_AMPLITUDE1 1
#define JL1XXX_MDI_AMPLITUDE2 2
#define JL1XXX_MDI_AMPLITUDE3 3
#define JL1XXX_MDI_AMPLITUDE4 4
#define JL1XXX_MDI_AMPLITUDE5 5
#define JL1XXX_MDI_AMPLITUDE6 6
#define JL1XXX_MDI_AMPLITUDE7 7
//-----------------------------------------------------------------------//
/* PHY MDI Control Mode Enable Mask Config */
#define JL1XXX_MDI_CTRL_EN (0)
/* PHY MDI Rate Config */
#define JL1XXX_MDI_RATE JL1XXX_MDI_RATE_ACCELERATE
/* PHY MDI Amplitude Config */
#define JL1XXX_MDI_AMPLITUDE JL1XXX_MDI_AMPLITUDE4
/*************************************************************************/
/**************************** JL1XXX-RMII ********************************/
/* PHY RMII Control Mode Enable Mask Select */
#define JL1XXX_RMII_STATIC_OP_EN (1 << 0)
#define JL1XXX_RMII_MODE_EN (1 << 1)
#define JL1XXX_RMII_CLK_50M_INPUT_EN (1 << 2)
#define JL1XXX_RMII_TX_SKEW_EN (1 << 3)
#define JL1XXX_RMII_RX_SKEW_EN (1 << 4)
#define JL1XXX_RMII_CRS_DV_EN (1 << 5)
//-----------------------------------------------------------------------//
/* PHY RMII Control Mode Enable Mask Config */
#define JL1XXX_RMII_CTRL_EN (0)
/* PHY RMII Timing Config */
#define JL1XXX_RMII_TX_TIMING 0xf
#define JL1XXX_RMII_RX_TIMING 0xf
/*************************************************************************/
/**************************** JL2XXX-LED *********************************/
/* PHY LED Modes Select*/
#define JL2XXX_LED0_LINK10 (1 << 0)
#define JL2XXX_LED0_LINK100 (1 << 1)
#define JL2XXX_LED0_LINK1000 (1 << 3)
#define JL2XXX_LED0_ACTIVITY (1 << 4)
#define JL2XXX_LED1_LINK10 (1 << 5)
#define JL2XXX_LED1_LINK100 (1 << 6)
#define JL2XXX_LED1_LINK1000 (1 << 8)
#define JL2XXX_LED1_ACTIVITY (1 << 9)
#define JL2XXX_LED2_LINK10 (1 << 10)
#define JL2XXX_LED2_LINK100 (1 << 11)
#define JL2XXX_LED2_LINK1000 (1 << 13)
#define JL2XXX_LED2_ACTIVITY (1 << 14)
/* mode_A = 0 and mode_B = 1 default mode_A */
#define JL2XXX_LED_GLB_MODE_B (1 << 15)
/* PHY LED Polarity Select */
#define JL2XXX_LED0_POLARITY (1 << 12)
#define JL2XXX_LED1_POLARITY (1 << 11)
#define JL2XXX_LED2_POLARITY (1 << 10)
/* PHY LED Control Enable Mask Select */
#define JL2XXX_LED_STATIC_OP_EN (1 << 0)
#define JL2XXX_LED_MODE_EN (1 << 1)
#define JL2XXX_LED_GLOABL_PERIOD_EN (1 << 2)
#define JL2XXX_LED_GLOBAL_ON_EN (1 << 3)
#define JL2XXX_LED_POLARITY_EN (1 << 4)
//-----------------------------------------------------------------------//
/* PHY LED Control Enable Mask Config */
#define JL2XXX_LED_CTRL_EN (0)
/* PHY LED Modes Config */
#define JL2XXX_CFG_LED_MODE (JL2XXX_LED0_LINK10 | \
JL2XXX_LED0_ACTIVITY | \
JL2XXX_LED1_LINK100 | \
JL2XXX_LED1_ACTIVITY | \
JL2XXX_LED2_LINK1000 | \
JL2XXX_LED2_ACTIVITY)
/* PHY LED Polarity Config */
#define JL2XXX_LED_POLARITY (JL2XXX_LED0_POLARITY | \
JL2XXX_LED1_POLARITY | \
JL2XXX_LED2_POLARITY)
/* PHY LED Global Period Config */
#define JL2XXX_GLOBAL_PERIOD_MS 0x3
/* PHY LED Global Hold On Config */
#define JL2XXX_GLOBAL_ON_MS 0x2
/*************************************************************************/
/**************************** JL2XXX-FLD *********************************/
/* PHY Fast Link Down Control Enable Mask Select */
#define JL2XXX_FLD_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Fast Link Down Control Enable Mask Config */
#define JL2XXX_FLD_CTRL_EN (0)
/* PHY Fast Link Down Delay Config */
#define JL2XXX_FLD_DELAY 0
/*************************************************************************/
/**************************** JL2XXX-WOL *********************************/
/* PHY WOL Control Enable Mask Select */
#define JL2XXX_WOL_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY WOL Control Enable Mask Config */
#define JL2XXX_WOL_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-INTR ********************************/
/* PHY Interrupt Control Enable Mask Select */
#define JL2XXX_INTR_STATIC_OP_EN (1 << 0)
#define JL2XXX_INTR_LINK_CHANGE_EN (1 << 1)
#define JL2XXX_INTR_AN_ERR_EN (1 << 2)
#define JL2XXX_INTR_AN_COMPLETE_EN (1 << 3)
#define JL2XXX_INTR_AN_PAGE_RECE (1 << 4)
//-----------------------------------------------------------------------//
/* PHY Interrupt Irq Number Config */
#define JL2XXX_INTR_IRQ -1
/* PHY Interrupt Control Enable Mask Config */
#define JL2XXX_INTR_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-DSFT ********************************/
/* PHY Downshift Control Enable Mask */
#define JL2XXX_DSFT_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Downshift Control Enable Config */
#define JL2XXX_DSFT_CTRL_EN (0)
/* PHY Downshift Count Config */
#define JL2XXX_DSFT_AN_CNT 4
/*************************************************************************/
/**************************** JL2XXX-RGMII *******************************/
/* PHY RGMII Control Mode Enable Mask Select */
#define JL2XXX_RGMII_STATIC_OP_EN (1 << 0)
#define JL2XXX_RGMII_TX_DLY_EN (1 << 1)
#define JL2XXX_RGMII_RX_DLY_EN (1 << 2)
/* PHY RGMII DELAY BIT */
#define JL2XXX_RGMII_TX_DLY_2NS (1 << 8)
#define JL2XXX_RGMII_RX_DLY_2NS (1 << 9)
//-----------------------------------------------------------------------//
/* PHY RGMII Control Mode Enable Mask Config */
#define JL2XXX_RGMII_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-PATCH *******************************/
/* PHY Patch Control Mode Enable Mask Select */
#define JL2XXX_PATCH_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Patch Control Mode Enable Mask Config */
#define JL2XXX_PATCH_CTRL_EN (JL2XXX_PATCH_STATIC_OP_EN)
/*************************************************************************/
/**************************** JL2XXX-CLOCK *******************************/
/* PHY Clock Control Mode Enable Mask Select */
#define JL2XXX_CLK_STATIC_OP_EN (1 << 0)
#define JL2XXX_25M_CLK_OUT_EN (1 << 1)
#define JL2XXX_125M_CLK_OUT_EN (1 << 2)
#define JL2XXX_CLK_OUT_DIS (1 << 3)
//-----------------------------------------------------------------------//
/* PHY Clock Control Mode Enable Mask Config */
#define JL2XXX_CLK_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-WORK_MODE ***************************/
/* PHY Work Mode Control Mode Enable Mask Select */
#define JL2XXX_WORK_MODE_STATIC_OP_EN (1 << 0)
/* PHY Work Mode Select */
#define JL2XXX_UTP_RGMII_MODE 0
#define JL2XXX_FIBER_RGMII_MODE 1
#define JL2XXX_UTP_FIBER_RGMII_MODE 2
#define JL2XXX_UTP_SGMII_MODE 3
#define JL2XXX_PHY_SGMII_RGMII_MODE 4
#define JL2XXX_MAC_SGMII_RGMII_MODE 5
#define JL2XXX_UTP_FIBER_FORCE_MODE1 6
#define JL2XXX_UTP_FIBER_FORCE_MODE2 7
//-----------------------------------------------------------------------//
/* PHY Work Mode Control Mode Enable Mask Config */
#define JL2XXX_WORK_MODE_CTRL_EN (0)
/* PHY Work Mode Config */
#define JL2XXX_WORK_MODE_MODE JL2XXX_UTP_RGMII_MODE
/*************************************************************************/
/**************************** JL2XXX-LOOPBACK ****************************/
/* PHY Loopback Control Mode Enable Mask Select */
#define JL2XXX_LPBK_STATIC_OP_EN (1 << 0)
/* PHY Loopback Mode Select */
#define JL2XXX_LPBK_PCS_10M 0
#define JL2XXX_LPBK_PCS_100M 1
#define JL2XXX_LPBK_PCS_1000M 2
#define JL2XXX_LPBK_PMD_1000M 3
#define JL2XXX_LPBK_EXT_STUB_1000M 4
//-----------------------------------------------------------------------//
/* PHY Loopback Control Mode Enable Mask Config */
#define JL2XXX_LPBK_CTRL_EN (0)
/* PHY Loopback Mode Config */
#define JL2XXX_LPBK_MODE JL2XXX_LPBK_PCS_1000M
/*************************************************************************/
/**************************** JL2XXX-SLEW_RATE ****************************/
/* PHY Slew Rate Control Mode Enable Mask Select */
#define JL2XXX_SLEW_RATE_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Slew Rate Control Mode Enable Mask Config */
#define JL2XXX_SLEW_RATE_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-RXC_OUT *****************************/
/* PHY Rx Clock Out Control Mode Enable Mask Select */
#define JL2XXX_RXC_OUT_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Rx Clock Out Control Mode Enable Mask Config */
#define JL2XXX_RXC_OUT_CTRL_EN (0)
/*************************************************************************/
#endif

577
drivers/net/phy/jlsemi.c Normal file
View File

@ -0,0 +1,577 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* drivers/net/phy/jlsemi.c
*
* Driver for JLSemi PHYs
*
* Author: Gangqiao Kuang <gqkuang@jlsemi.com>
*
* Copyright (c) 2021 JingLue Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#include "jlsemi-core.h"
#include <linux/phy.h>
#include <linux/module.h>
#include <linux/netdevice.h>
#define DRIVER_VERSION "1.2.9"
#define DRIVER_NAME_100M "JL1xxx Fast Ethernet " DRIVER_VERSION
#define DRIVER_NAME_1000M "JL2xxx Gigabit Ethernet " DRIVER_VERSION
MODULE_DESCRIPTION("JLSemi PHY driver");
MODULE_AUTHOR("Gangqiao Kuang");
MODULE_LICENSE("GPL");
#if (JLSEMI_DEBUG_INFO)
static int jlsemi_phy_reg_print(struct phy_device *phydev)
{
int ret;
int i;
for (i = 0; i < ARRAY_SIZE(jl_phy); i++) {
if (jl_phy[i].enable) {
ret = jlsemi_read_paged(phydev, jl_phy[i].page,
jl_phy[i].reg);
JLSEMI_PHY_MSG("%s: 0x%x\n", jl_phy[i].string, ret);
if (ret < 0)
return ret;
}
}
return 0;
}
#endif
static int jl1xxx_probe(struct phy_device *phydev)
{
struct device *dev = jlsemi_get_mdio(phydev);
struct jl1xxx_priv *jl1xxx = NULL;
int err;
jl1xxx = devm_kzalloc(dev, sizeof(*jl1xxx), GFP_KERNEL);
if (!jl1xxx)
return -ENOMEM;
phydev->priv = jl1xxx;
#if (JLSEMI_KERNEL_DEVICE_TREE_USE)
if (!dev->of_node)
JLSEMI_PHY_MSG("%s: Find device node failed\n", __func__);
#endif
err = jl1xxx_operation_args_get(phydev);
if (err < 0)
return err;
if (jl1xxx->intr.enable & JL1XXX_INTR_STATIC_OP_EN)
phydev->irq = JL1XXX_INTR_IRQ;
jl1xxx->static_inited = false;
return 0;
}
static int jl1xxx_config_init(struct phy_device *phydev)
{
struct jl1xxx_priv *priv = phydev->priv;
int ret;
if (!priv->static_inited) {
#if (JLSEMI_DEBUG_INFO)
JLSEMI_PHY_MSG("jl1xxx_config_init_before:\n");
ret = jlsemi_phy_reg_print(phydev);
if (ret < 0)
return ret;
#endif
ret = jl1xxx_static_op_init(phydev);
if (ret < 0)
return ret;
#if (JLSEMI_DEBUG_INFO)
JLSEMI_PHY_MSG("jl1xxx_config_init_after:\n");
ret = jlsemi_phy_reg_print(phydev);
if (ret < 0)
return ret;
#endif
priv->static_inited = JLSEMI_PHY_NOT_REENTRANT;
}
return 0;
}
static int jl1xxx_ack_interrupt(struct phy_device *phydev)
{
int err;
err = jl1xxx_intr_ack_event(phydev);
if (err < 0)
return err;
return 0;
}
static int jl1xxx_config_intr(struct phy_device *phydev)
{
struct jl1xxx_priv *priv = phydev->priv;
int err;
if (priv->intr.enable & JL1XXX_INTR_STATIC_OP_EN) {
err = jl1xxx_ack_interrupt(phydev);
if (err < 0)
return err;
err = jl1xxx_intr_static_op_set(phydev);
if (err < 0)
return err;
}
return 0;
}
static int jl1xxx_read_status(struct phy_device *phydev)
{
struct jl1xxx_priv *priv = phydev->priv;
int err;
if (priv->intr.enable & JL1XXX_INTR_STATIC_OP_EN) {
err = jl1xxx_ack_interrupt(phydev);
if (err < 0)
return err;
}
return genphy_read_status(phydev);
}
static void jl1xxx_remove(struct phy_device *phydev)
{
struct device *dev = jlsemi_get_mdio(phydev);
struct jl1xxx_priv *priv = phydev->priv;
if (priv)
devm_kfree(dev, priv);
}
#if (JLSEMI_PHY_WOL)
static void jl1xxx_get_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{
struct jl1xxx_priv *priv = phydev->priv;
int wol_en;
if (priv->wol.ethtool) {
wol->supported = WAKE_MAGIC;
wol->wolopts = 0;
wol_en = jl1xxx_wol_dynamic_op_get(phydev);
if (!wol_en)
wol->wolopts |= WAKE_MAGIC;
}
}
static int jl1xxx_set_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{
struct jl1xxx_priv *priv = phydev->priv;
int err;
if (priv->wol.ethtool) {
if (wol->wolopts & WAKE_MAGIC) {
err = jl1xxx_wol_dynamic_op_set(phydev);
if (err < 0)
return err;
}
}
return 0;
}
#endif
static int jl1xxx_suspend(struct phy_device *phydev)
{
return genphy_suspend(phydev);
}
static int jl1xxx_resume(struct phy_device *phydev)
{
return genphy_resume(phydev);
}
static int jl2xxx_probe(struct phy_device *phydev)
{
struct device *dev = jlsemi_get_mdio(phydev);
struct jl2xxx_priv *jl2xxx = NULL;
int err;
jl2xxx = devm_kzalloc(dev, sizeof(*jl2xxx), GFP_KERNEL);
if (!jl2xxx)
return -ENOMEM;
phydev->priv = jl2xxx;
#if (JLSEMI_KERNEL_DEVICE_TREE_USE)
if (!dev->of_node)
JLSEMI_PHY_MSG("%s: Find device node failed\n", __func__);
#endif
err = jl2xxx_operation_args_get(phydev);
if (err < 0)
return err;
if (jl2xxx->intr.enable & JL2XXX_INTR_STATIC_OP_EN)
phydev->irq = JL2XXX_INTR_IRQ;
jl2xxx->static_inited = false;
jl2xxx->nstats = ARRAY_SIZE(jl2xxx_hw_stats);
jl2xxx->hw_stats = jl2xxx_hw_stats;
jl2xxx->stats = kcalloc(jl2xxx->nstats, sizeof(u64), GFP_KERNEL);
if (!jl2xxx->stats)
return -ENOMEM;
return 0;
}
static int jl2xxx_config_init(struct phy_device *phydev)
{
struct jl2xxx_priv *priv = phydev->priv;
int ret;
if (!priv->static_inited) {
#if (JLSEMI_DEBUG_INFO)
JLSEMI_PHY_MSG("jl2xxx_config_init_before:\n");
ret = jlsemi_phy_reg_print(phydev);
if (ret < 0)
return ret;
#endif
ret = jl2xxx_static_op_init(phydev);
if (ret < 0)
return ret;
#if (JLSEMI_DEBUG_INFO)
JLSEMI_PHY_MSG("jl2xxx_config_init_after:\n");
ret = jlsemi_phy_reg_print(phydev);
if (ret < 0)
return ret;
#endif
priv->static_inited = JLSEMI_PHY_NOT_REENTRANT;
}
return 0;
}
static int jl2xxx_ack_interrupt(struct phy_device *phydev)
{
int err;
err = jl2xxx_intr_ack_event(phydev);
if (err < 0)
return err;
return 0;
}
static int jl2xxx_config_intr(struct phy_device *phydev)
{
struct jl2xxx_priv *priv = phydev->priv;
int err;
if (priv->intr.enable & JL2XXX_INTR_STATIC_OP_EN) {
err = jl2xxx_ack_interrupt(phydev);
if (err < 0)
return err;
err = jl2xxx_intr_static_op_set(phydev);
if (err < 0)
return err;
}
return 0;
}
static int jl2xxx_read_status(struct phy_device *phydev)
{
struct jl2xxx_priv *priv = phydev->priv;
bool fiber_mode;
int err;
if (priv->intr.enable & JL2XXX_INTR_STATIC_OP_EN) {
err = jl2xxx_ack_interrupt(phydev);
if (err < 0)
return err;
}
fiber_mode = jl2xxx_read_fiber_status(phydev);
if (fiber_mode)
return 0;
return genphy_read_status(phydev);
}
static int jl1xxx_config_aneg(struct phy_device *phydev)
{
return genphy_config_aneg(phydev);
}
static int jl2xxx_config_aneg(struct phy_device *phydev)
{
u16 phy_mode;
int val;
val = jlsemi_read_paged(phydev, JL2XXX_PAGE18,
JL2XXX_WORK_MODE_REG);
phy_mode = val & JL2XXX_WORK_MODE_MASK;
if (phydev->interface == PHY_INTERFACE_MODE_SGMII)
return 0;
if ((phydev->interface != PHY_INTERFACE_MODE_SGMII) &&
((phy_mode == JL2XXX_FIBER_RGMII_MODE) ||
(phy_mode == JL2XXX_UTP_FIBER_RGMII_MODE)))
return jl2xxx_config_aneg_fiber(phydev);
return genphy_config_aneg(phydev);
}
static int jl2xxx_suspend(struct phy_device *phydev)
{
return genphy_suspend(phydev);
}
static int jl2xxx_resume(struct phy_device *phydev)
{
return genphy_resume(phydev);
}
#if (JLSEMI_PHY_WOL)
static void jl2xxx_get_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{
struct jl2xxx_priv *priv = phydev->priv;
int wol_en;
if (priv->wol.ethtool) {
wol->supported = WAKE_MAGIC;
wol->wolopts = 0;
wol_en = jl2xxx_wol_dynamic_op_get(phydev);
if (wol_en)
wol->wolopts |= WAKE_MAGIC;
}
}
static int jl2xxx_set_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{
struct jl2xxx_priv *priv = phydev->priv;
int err;
if (priv->wol.ethtool) {
if (wol->wolopts & WAKE_MAGIC) {
err = jl2xxx_wol_dynamic_op_set(phydev);
if (err < 0)
return err;
}
}
return 0;
}
#endif
#if (JL2XXX_PHY_TUNABLE)
static int jl2xxx_get_tunable(struct phy_device *phydev,
struct ethtool_tunable *tuna, void *data)
{
struct jl2xxx_priv *priv = phydev->priv;
switch (tuna->id) {
case ETHTOOL_PHY_FAST_LINK_DOWN:
if (priv->fld.ethtool)
return jl2xxx_fld_dynamic_op_get(phydev, data);
else
return 0;
case ETHTOOL_PHY_DOWNSHIFT:
if (priv->downshift.ethtool)
return jl2xxx_downshift_dynamic_op_get(phydev, data);
else
return 0;
default:
return -EOPNOTSUPP;
}
return 0;
}
static int jl2xxx_set_tunable(struct phy_device *phydev,
struct ethtool_tunable *tuna, const void *data)
{
struct jl2xxx_priv *priv = phydev->priv;
switch (tuna->id) {
case ETHTOOL_PHY_FAST_LINK_DOWN:
if (priv->fld.ethtool)
return jl2xxx_fld_dynamic_op_set(phydev, data);
else
return 0;
case ETHTOOL_PHY_DOWNSHIFT:
if (priv->downshift.ethtool)
return jl2xxx_downshift_dynamic_op_set(phydev,
*(const u8 *)data);
else
return 0;
default:
return -EOPNOTSUPP;
}
return 0;
}
#endif
#if (JL2XXX_GET_STAT)
static u64 get_stat(struct phy_device *phydev, int i)
{
struct jl2xxx_priv *priv = phydev->priv;
int val;
val = jlsemi_read_paged(phydev, priv->hw_stats[i].page,
priv->hw_stats[i].reg);
if (val < 0)
return U64_MAX;
val = val & priv->hw_stats[i].mask;
priv->stats[i] += val;
return priv->stats[i];
}
static void jl2xxx_get_stats(struct phy_device *phydev,
struct ethtool_stats *stats, u64 *data)
{
struct jl2xxx_priv *priv = phydev->priv;
int i;
if (!priv)
return;
for (i = 0; i < priv->nstats; i++)
data[i] = get_stat(phydev, i);
}
#endif
#if (JL2XXX_GET_STRING)
static void jl2xxx_get_strings(struct phy_device *phydev, u8 *data)
{
struct jl2xxx_priv *priv = phydev->priv;
int i;
if (!priv)
return;
for (i = 0; i < priv->nstats; i++)
strlcpy(data + i * ETH_GSTRING_LEN,
priv->hw_stats[i].string, ETH_GSTRING_LEN);
}
#endif
static void jl2xxx_remove(struct phy_device *phydev)
{
struct device *dev = jlsemi_get_mdio(phydev);
struct jl2xxx_priv *priv = phydev->priv;
kfree(priv->stats);
if (priv)
devm_kfree(dev, priv);
}
static inline int jlsemi_aneg_done(struct phy_device *phydev)
{
int retval = phy_read(phydev, MII_BMSR);
return (retval < 0) ? retval : (retval & BMSR_ANEGCOMPLETE);
}
static int jl2xxx_aneg_done(struct phy_device *phydev)
{
u16 phy_mode;
int val;
val = jlsemi_read_paged(phydev, JL2XXX_PAGE18,
JL2XXX_WORK_MODE_REG);
phy_mode = val & JL2XXX_WORK_MODE_MASK;
if (phydev->interface == PHY_INTERFACE_MODE_SGMII)
return 0;
// fiber not an complite
if ((phydev->interface != PHY_INTERFACE_MODE_SGMII) &&
((phy_mode == JL2XXX_FIBER_RGMII_MODE) ||
(phy_mode == JL2XXX_UTP_FIBER_RGMII_MODE)))
return BMSR_ANEGCOMPLETE;
return jlsemi_aneg_done(phydev);
}
static struct phy_driver jlsemi_drivers[] = {
{
.phy_id = JL1XXX_PHY_ID,
.phy_id_mask = JLSEMI_PHY_ID_MASK,
.name = DRIVER_NAME_100M,
/* PHY_BASIC_FEATURES */
.features = PHY_BASIC_FEATURES,
.probe = jl1xxx_probe,
.config_intr = jl1xxx_config_intr,
.read_status = jl1xxx_read_status,
.config_init = jl1xxx_config_init,
.config_aneg = jl1xxx_config_aneg,
.aneg_done = jlsemi_aneg_done,
.suspend = jl1xxx_suspend,
.resume = jl1xxx_resume,
.remove = jl1xxx_remove,
#if (JLSEMI_PHY_WOL)
.get_wol = jl1xxx_get_wol,
.set_wol = jl1xxx_set_wol,
#endif
},
{
.phy_id = JL2XXX_PHY_ID,
.phy_id_mask = JLSEMI_PHY_ID_MASK,
.name = DRIVER_NAME_1000M,
/* PHY_BASIC_FEATURES */
.features = PHY_GBIT_FEATURES,
.probe = jl2xxx_probe,
.config_intr = jl2xxx_config_intr,
.read_status = jl2xxx_read_status,
.config_init = jl2xxx_config_init,
.config_aneg = jl2xxx_config_aneg,
.aneg_done = jl2xxx_aneg_done,
.suspend = jl2xxx_suspend,
.resume = jl2xxx_resume,
.remove = jl2xxx_remove,
#if (JLSEMI_PHY_WOL)
.get_wol = jl2xxx_get_wol,
.set_wol = jl2xxx_set_wol,
#endif
#if (JL2XXX_PHY_TUNABLE)
.get_tunable = jl2xxx_get_tunable,
.set_tunable = jl2xxx_set_tunable,
#endif
#if (JL2XXX_GET_STAT)
.get_stats = jl2xxx_get_stats,
#endif
#if (JL2XXX_GET_STRING)
.get_strings = jl2xxx_get_strings,
#endif
},
};
module_jlsemi_driver(jlsemi_drivers);
static struct mdio_device_id __maybe_unused jlsemi_tbl[] = {
{JL1XXX_PHY_ID, JLSEMI_PHY_ID_MASK},
{JL2XXX_PHY_ID, JLSEMI_PHY_ID_MASK},
{ }
};
MODULE_DEVICE_TABLE(mdio, jlsemi_tbl);

View File

@ -0,0 +1,341 @@
/* SPDX-License-Identifier: GPL-2.0
*
* Device Tree constants for JLSemi PHY
*
* Author: Gangqiao Kuang
*
* Copyright (c) 2021 JLSemi Corporation
*/
#ifndef _DT_BINDINGS_JLSEMI_PHY_H
#define _DT_BINDINGS_JLSEMI_PHY_H
/**************************** Linux Version Compatible ********************/
#define JLSEMI_DEV_COMPATIBLE (KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE)
#define JL2XXX_GET_STRING (KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE)
#define JL2XXX_GET_STAT (KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE)
#define JL2XXX_PHY_TUNABLE (KERNEL_VERSION(5, 0, 0) <= LINUX_VERSION_CODE)
#define JLSEMI_PHY_WOL (KERNEL_VERSION(3, 10, 0) < LINUX_VERSION_CODE)
/*************************************************************************/
/**************************** JLSemi Debug *******************************/
#define JLSEMI_DEBUG_INFO 0
/*************************************************************************/
/************************* JLSemi Phy Init Reentrant *********************/
#define JLSEMI_PHY_NOT_REENTRANT false
/*************************************************************************/
/**************************** JL1XXX-LED *********************************/
/* PHY LED Modes Select */
#define JL1XXX_LED0_STRAP (1 << 0)
#define JL1XXX_LED0_EEE (1 << 1)
#define JL1XXX_LED0_100_ACTIVITY (1 << 2)
#define JL1XXX_LED0_10_ACTIVITY (1 << 3)
#define JL1XXX_LED0_100_LINK (1 << 4)
#define JL1XXX_LED0_10_LINK (1 << 5)
#define JL1XXX_LED1_STRAP (1 << 8)
#define JL1XXX_LED1_EEE (1 << 9)
#define JL1XXX_LED1_100_ACTIVITY (1 << 10)
#define JL1XXX_LED1_10_ACTIVITY (1 << 11)
#define JL1XXX_LED1_100_LINK (1 << 12)
#define JL1XXX_LED1_10_LINK (1 << 13)
/* PHY LED As Gpio Output Select */
#define JL1XXX_GPIO_LED0_OUT (1 << 2)
#define JL1XXX_GPIO_LED1_OUT (1 << 3)
#define JL1XXX_GPIO_LED0_EN (1 << 14)
#define JL1XXX_GPIO_LED1_EN (1 << 15)
/* PHY LED Control Enable Mask Select */
#define JL1XXX_LED_STATIC_OP_EN (1 << 0)
#define JL1XXX_LED_MODE_EN (1 << 1)
#define JL1XXX_LED_GLOABL_PERIOD_EN (1 << 2)
#define JL1XXX_LED_GLOBAL_ON_EN (1 << 3)
#define JL1XXX_LED_GPIO_OUT_EN (1 << 4)
//-----------------------------------------------------------------------//
/* PHY LED Control Enable Mask Config */
#define JL1XXX_LED_CTRL_EN (0)
/* PHY LED Modes Config */
#define JL1XXX_CFG_LED_MODE (JL1XXX_LED0_100_LINK | \
JL1XXX_LED0_10_LINK | \
JL1XXX_LED1_100_ACTIVITY | \
JL1XXX_LED1_10_ACTIVITY)
/* PHY LED As Gpio Output Config */
#define JL1XXX_CFG_GPIO (JL1XXX_GPIO_LED0_EN | \
JL1XXX_GPIO_LED0_OUT | \
JL1XXX_GPIO_LED1_EN | \
JL1XXX_GPIO_LED1_OUT)
/* PHY LED Global Period Config */
#define JL1XXX_GLOBAL_PERIOD_MS 0x10
/* PHY LED Global Hold On Config */
#define JL1XXX_GLOBAL_ON_MS 0x8
/**************************************************************************/
/****************************** JL1XXX-WOL ********************************/
/* PHY WOL Control Enable Mask Select */
#define JL1XXX_WOL_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY WOL Control Enable Mask Config */
#define JL1XXX_WOL_CTRL_EN (0)
/*************************************************************************/
/***************************** JL1XXX-INTR *******************************/
/* PHY Interrupt Control Enable Mask Select */
#define JL1XXX_INTR_STATIC_OP_EN (1 << 0)
#define JL1XXX_INTR_LINK_CHANGE_EN (1 << 1)
#define JL1XXX_INTR_AN_ERR_EN (1 << 2)
//-----------------------------------------------------------------------//
/* PHY Interrupt Irq Number Config */
#define JL1XXX_INTR_IRQ -1
/* PHY Interrupt Control Enable Mask Config */
#define JL1XXX_INTR_CTRL_EN (0)
/*************************************************************************/
/**************************** JL1XXX-MDI *********************************/
/* PHY MDI Control Mode Enable Mask Select */
#define JL1XXX_MDI_STATIC_OP_EN (1 << 0)
#define JL1XXX_MDI_RATE_EN (1 << 1)
#define JL1XXX_MDI_AMPLITUDE_EN (1 << 2)
/* PHY MDI Rate Select */
#define JL1XXX_MDI_RATE_STANDARD 0
#define JL1XXX_MDI_RATE_ACCELERATE 1
/* PHY MDI Amplitude Select */
#define JL1XXX_MDI_AMPLITUDE0 0
#define JL1XXX_MDI_AMPLITUDE1 1
#define JL1XXX_MDI_AMPLITUDE2 2
#define JL1XXX_MDI_AMPLITUDE3 3
#define JL1XXX_MDI_AMPLITUDE4 4
#define JL1XXX_MDI_AMPLITUDE5 5
#define JL1XXX_MDI_AMPLITUDE6 6
#define JL1XXX_MDI_AMPLITUDE7 7
//-----------------------------------------------------------------------//
/* PHY MDI Control Mode Enable Mask Config */
#define JL1XXX_MDI_CTRL_EN (0)
/* PHY MDI Rate Config */
#define JL1XXX_MDI_RATE JL1XXX_MDI_RATE_ACCELERATE
/* PHY MDI Amplitude Config */
#define JL1XXX_MDI_AMPLITUDE JL1XXX_MDI_AMPLITUDE4
/*************************************************************************/
/**************************** JL1XXX-RMII ********************************/
/* PHY RMII Control Mode Enable Mask Select */
#define JL1XXX_RMII_STATIC_OP_EN (1 << 0)
#define JL1XXX_RMII_MODE_EN (1 << 1)
#define JL1XXX_RMII_CLK_50M_INPUT_EN (1 << 2)
#define JL1XXX_RMII_TX_SKEW_EN (1 << 3)
#define JL1XXX_RMII_RX_SKEW_EN (1 << 4)
#define JL1XXX_RMII_CRS_DV_EN (1 << 5)
//-----------------------------------------------------------------------//
/* PHY RMII Control Mode Enable Mask Config */
#define JL1XXX_RMII_CTRL_EN (0)
/* PHY RMII Timing Config */
#define JL1XXX_RMII_TX_TIMING 0xf
#define JL1XXX_RMII_RX_TIMING 0xf
/*************************************************************************/
/**************************** JL2XXX-LED *********************************/
/* PHY LED Modes Select*/
#define JL2XXX_LED0_LINK10 (1 << 0)
#define JL2XXX_LED0_LINK100 (1 << 1)
#define JL2XXX_LED0_LINK1000 (1 << 3)
#define JL2XXX_LED0_ACTIVITY (1 << 4)
#define JL2XXX_LED1_LINK10 (1 << 5)
#define JL2XXX_LED1_LINK100 (1 << 6)
#define JL2XXX_LED1_LINK1000 (1 << 8)
#define JL2XXX_LED1_ACTIVITY (1 << 9)
#define JL2XXX_LED2_LINK10 (1 << 10)
#define JL2XXX_LED2_LINK100 (1 << 11)
#define JL2XXX_LED2_LINK1000 (1 << 13)
#define JL2XXX_LED2_ACTIVITY (1 << 14)
/* mode_A = 0 and mode_B = 1 default mode_A */
#define JL2XXX_LED_GLB_MODE_B (1 << 15)
/* PHY LED Polarity Select */
#define JL2XXX_LED0_POLARITY (1 << 12)
#define JL2XXX_LED1_POLARITY (1 << 11)
#define JL2XXX_LED2_POLARITY (1 << 10)
/* PHY LED Control Enable Mask Select */
#define JL2XXX_LED_STATIC_OP_EN (1 << 0)
#define JL2XXX_LED_MODE_EN (1 << 1)
#define JL2XXX_LED_GLOABL_PERIOD_EN (1 << 2)
#define JL2XXX_LED_GLOBAL_ON_EN (1 << 3)
#define JL2XXX_LED_POLARITY_EN (1 << 4)
//-----------------------------------------------------------------------//
/* PHY LED Control Enable Mask Config */
#define JL2XXX_LED_CTRL_EN (0)
/* PHY LED Modes Config */
#define JL2XXX_CFG_LED_MODE (JL2XXX_LED0_LINK10 | \
JL2XXX_LED0_ACTIVITY | \
JL2XXX_LED1_LINK100 | \
JL2XXX_LED1_ACTIVITY | \
JL2XXX_LED2_LINK1000 | \
JL2XXX_LED2_ACTIVITY)
/* PHY LED Polarity Config */
#define JL2XXX_LED_POLARITY (JL2XXX_LED0_POLARITY | \
JL2XXX_LED1_POLARITY | \
JL2XXX_LED2_POLARITY)
/* PHY LED Global Period Config */
#define JL2XXX_GLOBAL_PERIOD_MS 0x3
/* PHY LED Global Hold On Config */
#define JL2XXX_GLOBAL_ON_MS 0x2
/*************************************************************************/
/**************************** JL2XXX-FLD *********************************/
/* PHY Fast Link Down Control Enable Mask Select */
#define JL2XXX_FLD_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Fast Link Down Control Enable Mask Config */
#define JL2XXX_FLD_CTRL_EN (0)
/* PHY Fast Link Down Delay Config */
#define JL2XXX_FLD_DELAY 0
/*************************************************************************/
/**************************** JL2XXX-WOL *********************************/
/* PHY WOL Control Enable Mask Select */
#define JL2XXX_WOL_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY WOL Control Enable Mask Config */
#define JL2XXX_WOL_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-INTR ********************************/
/* PHY Interrupt Control Enable Mask Select */
#define JL2XXX_INTR_STATIC_OP_EN (1 << 0)
#define JL2XXX_INTR_LINK_CHANGE_EN (1 << 1)
#define JL2XXX_INTR_AN_ERR_EN (1 << 2)
#define JL2XXX_INTR_AN_COMPLETE_EN (1 << 3)
#define JL2XXX_INTR_AN_PAGE_RECE (1 << 4)
//-----------------------------------------------------------------------//
/* PHY Interrupt Irq Number Config */
#define JL2XXX_INTR_IRQ -1
/* PHY Interrupt Control Enable Mask Config */
#define JL2XXX_INTR_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-DSFT ********************************/
/* PHY Downshift Control Enable Mask */
#define JL2XXX_DSFT_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Downshift Control Enable Config */
#define JL2XXX_DSFT_CTRL_EN (0)
/* PHY Downshift Count Config */
#define JL2XXX_DSFT_AN_CNT 4
/*************************************************************************/
/**************************** JL2XXX-RGMII *******************************/
/* PHY RGMII Control Mode Enable Mask Select */
#define JL2XXX_RGMII_STATIC_OP_EN (1 << 0)
#define JL2XXX_RGMII_TX_DLY_EN (1 << 1)
#define JL2XXX_RGMII_RX_DLY_EN (1 << 2)
/* PHY RGMII DELAY BIT */
#define JL2XXX_RGMII_TX_DLY_2NS (1 << 8)
#define JL2XXX_RGMII_RX_DLY_2NS (1 << 9)
//-----------------------------------------------------------------------//
/* PHY RGMII Control Mode Enable Mask Config */
#define JL2XXX_RGMII_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-PATCH *******************************/
/* PHY Patch Control Mode Enable Mask Select */
#define JL2XXX_PATCH_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Patch Control Mode Enable Mask Config */
#define JL2XXX_PATCH_CTRL_EN (JL2XXX_PATCH_STATIC_OP_EN)
/*************************************************************************/
/**************************** JL2XXX-CLOCK *******************************/
/* PHY Clock Control Mode Enable Mask Select */
#define JL2XXX_CLK_STATIC_OP_EN (1 << 0)
#define JL2XXX_25M_CLK_OUT_EN (1 << 1)
#define JL2XXX_125M_CLK_OUT_EN (1 << 2)
#define JL2XXX_CLK_OUT_DIS (1 << 3)
//-----------------------------------------------------------------------//
/* PHY Clock Control Mode Enable Mask Config */
#define JL2XXX_CLK_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-WORK_MODE ***************************/
/* PHY Work Mode Control Mode Enable Mask Select */
#define JL2XXX_WORK_MODE_STATIC_OP_EN (1 << 0)
/* PHY Work Mode Select */
#define JL2XXX_UTP_RGMII_MODE 0
#define JL2XXX_FIBER_RGMII_MODE 1
#define JL2XXX_UTP_FIBER_RGMII_MODE 2
#define JL2XXX_UTP_SGMII_MODE 3
#define JL2XXX_PHY_SGMII_RGMII_MODE 4
#define JL2XXX_MAC_SGMII_RGMII_MODE 5
#define JL2XXX_UTP_FIBER_FORCE_MODE1 6
#define JL2XXX_UTP_FIBER_FORCE_MODE2 7
//-----------------------------------------------------------------------//
/* PHY Work Mode Control Mode Enable Mask Config */
#define JL2XXX_WORK_MODE_CTRL_EN (0)
/* PHY Work Mode Config */
#define JL2XXX_WORK_MODE_MODE JL2XXX_UTP_RGMII_MODE
/*************************************************************************/
/**************************** JL2XXX-LOOPBACK ****************************/
/* PHY Loopback Control Mode Enable Mask Select */
#define JL2XXX_LPBK_STATIC_OP_EN (1 << 0)
/* PHY Loopback Mode Select */
#define JL2XXX_LPBK_PCS_10M 0
#define JL2XXX_LPBK_PCS_100M 1
#define JL2XXX_LPBK_PCS_1000M 2
#define JL2XXX_LPBK_PMD_1000M 3
#define JL2XXX_LPBK_EXT_STUB_1000M 4
//-----------------------------------------------------------------------//
/* PHY Loopback Control Mode Enable Mask Config */
#define JL2XXX_LPBK_CTRL_EN (0)
/* PHY Loopback Mode Config */
#define JL2XXX_LPBK_MODE JL2XXX_LPBK_PCS_1000M
/*************************************************************************/
/**************************** JL2XXX-SLEW_RATE ****************************/
/* PHY Slew Rate Control Mode Enable Mask Select */
#define JL2XXX_SLEW_RATE_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Slew Rate Control Mode Enable Mask Config */
#define JL2XXX_SLEW_RATE_CTRL_EN (0)
/*************************************************************************/
/**************************** JL2XXX-RXC_OUT *****************************/
/* PHY Rx Clock Out Control Mode Enable Mask Select */
#define JL2XXX_RXC_OUT_STATIC_OP_EN (1 << 0)
//-----------------------------------------------------------------------//
/* PHY Rx Clock Out Control Mode Enable Mask Config */
#define JL2XXX_RXC_OUT_CTRL_EN (0)
/*************************************************************************/
#endif