tja110x.h 9.44 KB
/*
 * Copyright 2017 NXP
 *
 * 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.
 *
 */

#ifndef _NXP_PHY_H
#define _NXP_PHY_H

 /* PHY IDs */
#define NXP_PHY_ID_TJA1100        (0x0180DC40U)
#define NXP_PHY_ID_TJA1101        (0x0180DD00U)
#define NXP_PHY_ID_TJA1102P0      (0x0180DC80U)
#define NXP_PHY_ID_TJA1102P1      (0x00000000U)
#define NXP_PHY_ID_TJA1102S       (0x0180DC90U) /* only P0 is available */

/* masks out the revision number */
#define NXP_PHY_ID_MASK           (0xFFFFFFF0U)

#endif /* _NXP_PHY_H */

/* NXP specific registers */

/* extended_control register (TJA1100 and TJA1102) */
#define MII_ECTRL                 (0x11U)
/* configuration_1 register (TJA1100 and TJA1102) */
#define MII_CFG1                  (0x12U)
/* configuration_2 register (TJA1100 and TJA1102) */
#define MII_CFG2                  (0x13U)
/* symbol_error_counter register (TJA1100 and TJA1102) */
#define MII_SYMERRCNT             (0x14U)
/* interrupt_source_flag register (TJA1100 and TJA1102) */
#define MII_INTSRC                (0x15U)
/* interrupt_mask register (TJA1100 and TJA1102) */
#define MII_INTMASK               (0x16U)
/* communication_status register (TJA1100 and TJA1102) */
#define MII_COMMSTAT              (0x17U)
/* general_status register (TJA1100 and TJA1102) */
#define MII_GENSTAT               (0x18U)
/* external_status register (TJA1100 and TJA1102) */
#define MII_EXTERNAL_STATUS       (0x19U)
/* link_fail_counter register (TJA1100 and TJA1102) */
#define MII_LINK_FAIL_COUNTER     (0x1AU)
/* common_configuration register (only TJA1102) */
#define MII_COMMCFG               (0x1BU)
/* configuration_3 register (only TJA1102) */
#define MII_CONFIGURATION_3       (0x1CU)

/* extended_control register */
#define ECTRL_LINK_CONTROL        BIT(15)
#define ECTRL_POWER_MODE          (0x00007800U)
#define ECTRL_SLAVE_JITTER_TEST   BIT(10)
#define ECTRL_TRAINING_RESTART    BIT(9)
#define ECTRL_TEST_MODE           (0x000001C0U)
#define ECTRL_CABLE_TEST          BIT(5)
#define ECTRL_LOOPBACK_MODE       (0x00000018U)
#define ECTRL_CONFIG_EN           BIT(2)
#define ECTRL_WAKE_REQUEST        BIT(0)
#define CABLE_TEST_TIMEOUT        1U /* cable test takes <= 1*100us */

/* register values of the different power modes */
#define POWER_MODE_NOCHANGE       (0x00000000U)
#define POWER_MODE_NORMAL         (0x00001800U)
#define POWER_MODE_SLEEPREQUEST   (0x00005800U)
#define POWER_MODE_STANDBY        (0x00006000U)
#define POWER_MODE_SILENT         (0x00004800U)
#define POWER_MODE_SLEEP          (0x00005000U)

/* timeouts for different power mode transitions */
#define POWER_MODE_TIMEOUT        200U
#define SLEEP_REQUEST_TO          160U /* 16ms = 160*100us */

/* duration necessary for a reliable wake up of the link partner (in us) */
#define TJA100_WAKE_REQUEST_TIMEOUT_US     5000U
#define TJA102_WAKE_REQUEST_TIMEOUT_US     1300U

/* configuration_1 register */
#define CFG1_MASTER_SLAVE         BIT(15)
#define TJA1100_CFG1_AUTO_OP      BIT(14)
#define TJA1102_CFG1_FWDPHYLOC    BIT(14)
#define CFG1_LINK_LENGTH          (0x00003000U)
#define CFG1_REMWUPHY             BIT(11)
#define CFG1_LOCWUPHY             BIT(10)
#define CFG1_MII_MODE             (0x00000300U)
#define TJA1100_CFG1_MII_MODE_REFCLK_IN	0x100
#define CFG1_MII_DRIVER           BIT(7)
#define CFG1_SLEEP_CONFIRM        BIT(6)
#define TJA1100_CFG1_LED_MODE     (0x00000030U)
#define TJA1100_CFG1_LED_EN       BIT(3)
#define CFG1_FWDPHYREM            BIT(2)
#define CFG1_AUTO_PWD             BIT(1)
#define CFG1_LPS_ACTIVE           BIT(0)

/* configuration_2 register */
#define CFG2_PHYAD                (0x0000F800U)
#define CFG2_SNR_AVERAGING        (0x00000600U)
#define CFG2_SNR_WLIMIT           (0x000001C0U)
#define CFG2_SNR_FAILLIMIT        (0x00000038U)
#define CFG2_JUMBO_ENABLE         BIT(2)
#define CFG2_SLEEP_REQUEST_TO     (0x00000003U)

#define SLEEP_REQUEST_TO_16MS     (0x00000003U)

/* symbol_error_counter register */
#define SYMERRCNT_SYM_ERR_CNT     (0xFFFFFFFFU)

/* interrupt_source_flag register */
#define INTERRUPT_PWON                    BIT(15)
#define INTERRUPT_WAKEUP                  BIT(14)
#define INTERRUPT_WUR_RECEIVED            BIT(13)
#define INTERRUPT_LPS_RECEIVED            BIT(12)
#define INTERRUPT_PHY_INIT_FAIL           BIT(11)
#define INTERRUPT_LINK_STATUS_FAIL        BIT(10)
#define INTERRUPT_LINK_STATUS_UP          BIT(9)
#define INTERRUPT_SYM_ERR                 BIT(8)
#define INTERRUPT_TRAINING_FAILED         BIT(7)
#define INTERRUPT_SNR_WARNING             BIT(6)
#define INTERRUPT_CONTROL_ERROR           BIT(5)
#define INTERRUPT_TXEN_CLAMPED            BIT(4)
#define INTERRUPT_UV_ERR                  BIT(3)
#define INTERRUPT_UV_RECOVERY             BIT(2)
#define INTERRUPT_TEMP_ERROR              BIT(1)
#define INTERRUPT_SLEEP_ABORT             BIT(0)
#define INTERRUPT_NONE                    (0x00000000U)
#define INTERRUPT_ALL                     (0x0000FFFFU)

/* communication_status register */
#define COMMSTAT_LINK_UP                BIT(15)
#define COMMSTAT_TX_MODE                (0x00006000U)
#define COMMSTAT_LOC_RCVR_STATUS        BIT(12)
#define COMMSTAT_REM_RCVR_STATUS        BIT(11)
#define COMMSTAT_SCR_LOCKED             BIT(10)
#define COMMSTAT_SSD_ERROR              BIT(9)
#define COMMSTAT_ESD_ERROR              BIT(8)
#define COMMSTAT_SNR                    (0x000000E0U)
#define COMMSTAT_RECEIVE_ERROR          BIT(4)
#define COMMSTAT_TRANSMIT_ERROR         BIT(3)
#define COMMSTAT_PHY_STATE              (0x00000007U)

/* register category general_status */
#define GENSTAT_INT_STATUS        BIT(15)
#define GENSTAT_PLL_LOCKED        BIT(14)
#define GENSTAT_LOCAL_WU          BIT(13)
#define GENSTAT_REMOTE_WU         BIT(12)
#define GENSTAT_DATA_DET_WU       BIT(11)
#define GENSTAT_EN_STATUS         BIT(10)
#define GENSTAT_RESET_STATUS      BIT(9)
#define GENSTAT_LINKFAIL_CNT      (0x000000F8U)

/* common_configuration register */
#define COMMCFG_AUTO_OP           BIT(15)

/* External status register */
#define EXTSTAT_OPEN_DETECT       BIT(7)
#define EXTSTAT_SHORT_DETECT      BIT(8)

/*
 * Indicator for BRR support in ESTATUS register
 * and in phydev->supported member.
 * Not yet present in include/uapi/linux/mii.h and
 * include/uapi/linux/ethtool.h
 */
#define ESTATUS_100T1_FULL        BIT(7)
#define SUPPORTED_100BASET1_FULL  BIT(27)
#define ADVERTISED_100BASET1_FULL BIT(27)

/* length of delay during one loop iteration in
 * wait_on_condition (in us)
 */
#define DELAY_LENGTH              100U

/* length of delay during two pollings (in ms) */
#define POLL_PAUSE              50U

/* possible test modes of the PHY */
enum test_mode {
	NO_TMODE = 1,
	TMODE1,
	TMODE2,
	TMODE3,
	TMODE4,
	TMODE5,
	TMODE6
};

 /* register values of the different test modes */
 #define ECTRL_NO_TMODE          (0x000000U) /* no test mode */
 #define ECTRL_TMODE1            (0x000040U)
 #define ECTRL_TMODE2            (0x000080U)
 #define ECTRL_TMODE3            (0x0000C0U)
 #define ECTRL_TMODE4            (0x000100U)
 #define ECTRL_TMODE5            (0x000140U)
 /* scrambler, descrambler bypassed */
 #define ECTRL_TMODE6            (0x000180U)

/* possible loopback modes of the PHY */
enum loopback_mode {
	NO_LMODE = 1,
	INTERNAL_LMODE,
	EXTERNAL_LMODE,
	REMOTE_LMODE
};

/* register values of the different loopback modes */
#define ECTRL_INTERNAL_LMODE    (0x000000U)
#define ECTRL_EXTERNAL_LMODE    (0x000008U)
#define ECTRL_REMOTE_LMODE      (0x000018U)

/* possible led modes of the PHY */
enum led_mode {
	NO_LED_MODE = 1,
	LINKUP_LED_MODE,
	FRAMEREC_LED_MODE,
	SYMERR_LED_MODE,
	CRSSIG_LED_MODE
};

/* register values of the different led modes */
#define CFG1_LED_LINKUP    (0x00000000U)
#define CFG1_LED_FRAMEREC  (0x00000010U)
#define CFG1_LED_SYMERR    (0x00000020U)
#define CFG1_LED_CRSSIG    (0x00000030U)

/* values written to sysfs nodes */
#define SYSFS_FWDPHYLOC    BIT(0)
#define SYSFS_REMWUPHY     BIT(1)
#define SYSFS_LOCWUPHY     BIT(2)
#define SYSFS_FWDPHYREM    BIT(3)

/* nxp specific data */
struct nxp_specific_data {
	int is_master;
	int is_poll_setup;
	int is_polling;

	u32 quirks;
};

/* register values of the different led modes */
#define SNR_CLASS_NONE	(0x00000000U)
#define SNR_CLASS_A	(0x00000040U)
#define SNR_CLASS_B	(0x00000080U)
#define SNR_CLASS_C	(0x000000C0U)
#define SNR_CLASS_D	(0x00000100U)
#define SNR_CLASS_E	(0x00000140U)
#define SNR_CLASS_F	(0x00000180U)
#define SNR_CLASS_G	(0x000001C0U)

/* Helper Function prototypes */
static int set_master_cfg(struct phy_device *phydev, int setMaster);
static int get_master_cfg(struct phy_device *phydev);
static int wait_on_condition(struct phy_device *phydev, int reg_addr,
			     int reg_mask, int cond, int timeout);
static void set_link_control(struct phy_device *phydev,
			     int enable_link_control);
static inline int phy_configure_bit(struct phy_device *phydev,
				    int reg_name, int bit_mask,
				    int bit_value);
static inline int phy_configure_bits(struct phy_device *phydev,
				     int reg_name, int bit_mask,
				     int bit_value);
static int nxp_resume(struct phy_device *phydev);
static int nxp_ack_interrupt(struct phy_device *phydev);
static void poll(struct work_struct *work);
static void setup_polling(struct phy_device *phydev);
static void start_polling(struct phy_device *phydev);
static void stop_polling(struct phy_device *phydev);

static struct attribute *nxp_sysfs_entries[];
static struct attribute_group nxp_attribute_group;