diff options
Diffstat (limited to 'drivers/net/dsa/sja1105/sja1105_spi.c')
| -rw-r--r-- | drivers/net/dsa/sja1105/sja1105_spi.c | 282 | 
1 files changed, 282 insertions, 0 deletions
| diff --git a/drivers/net/dsa/sja1105/sja1105_spi.c b/drivers/net/dsa/sja1105/sja1105_spi.c index 786c16a77e46..54ecb5565761 100644 --- a/drivers/net/dsa/sja1105/sja1105_spi.c +++ b/drivers/net/dsa/sja1105/sja1105_spi.c @@ -193,6 +193,16 @@ static int sja1105pqrs_reset_cmd(struct dsa_switch *ds)  	return sja1105_xfer_u32(priv, SPI_WRITE, regs->rgu, &cold_reset, NULL);  } +static int sja1110_reset_cmd(struct dsa_switch *ds) +{ +	struct sja1105_private *priv = ds->priv; +	const struct sja1105_regs *regs = priv->info->regs; +	u32 switch_reset = BIT(20); + +	/* Switch core reset */ +	return sja1105_xfer_u32(priv, SPI_WRITE, regs->rgu, &switch_reset, NULL); +} +  int sja1105_inhibit_tx(const struct sja1105_private *priv,  		       unsigned long port_bitmap, bool tx_inhibited)  { @@ -426,6 +436,8 @@ static struct sja1105_regs sja1105et_regs = {  	.ptpclkval = 0x18, /* Spans 0x18 to 0x19 */  	.ptpclkrate = 0x1A,  	.ptpclkcorp = 0x1D, +	.mdio_100base_tx = SJA1105_RSV_ADDR, +	.mdio_100base_t1 = SJA1105_RSV_ADDR,  };  static struct sja1105_regs sja1105pqrs_regs = { @@ -463,6 +475,92 @@ static struct sja1105_regs sja1105pqrs_regs = {  	.ptpclkrate = 0x1B,  	.ptpclkcorp = 0x1E,  	.ptpsyncts = 0x1F, +	.mdio_100base_tx = SJA1105_RSV_ADDR, +	.mdio_100base_t1 = SJA1105_RSV_ADDR, +}; + +static struct sja1105_regs sja1110_regs = { +	.device_id = SJA1110_SPI_ADDR(0x0), +	.prod_id = SJA1110_ACU_ADDR(0xf00), +	.status = SJA1110_SPI_ADDR(0x4), +	.port_control = SJA1110_SPI_ADDR(0x50), /* actually INHIB_TX */ +	.vl_status = 0x10000, +	.config = 0x020000, +	.rgu = SJA1110_RGU_ADDR(0x100), /* Reset Control Register 0 */ +	/* Ports 2 and 3 are capable of xMII, but there isn't anything to +	 * configure in the CGU/ACU for them. +	 */ +	.pad_mii_tx = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR}, +	.pad_mii_rx = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR}, +	.pad_mii_id = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1110_ACU_ADDR(0x18), SJA1110_ACU_ADDR(0x28), +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR}, +	.rmii_pll1 = SJA1105_RSV_ADDR, +	.cgu_idiv = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		     SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		     SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		     SJA1105_RSV_ADDR, SJA1105_RSV_ADDR}, +	.stats[MAC] = {0x200, 0x202, 0x204, 0x206, 0x208, 0x20a, +		       0x20c, 0x20e, 0x210, 0x212, 0x214}, +	.stats[HL1] = {0x400, 0x410, 0x420, 0x430, 0x440, 0x450, +		       0x460, 0x470, 0x480, 0x490, 0x4a0}, +	.stats[HL2] = {0x600, 0x610, 0x620, 0x630, 0x640, 0x650, +		       0x660, 0x670, 0x680, 0x690, 0x6a0}, +	.stats[ETHER] = {0x1400, 0x1418, 0x1430, 0x1448, 0x1460, 0x1478, +			 0x1490, 0x14a8, 0x14c0, 0x14d8, 0x14f0}, +	.mii_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR}, +	.mii_rx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +		       SJA1105_RSV_ADDR, SJA1105_RSV_ADDR}, +	.mii_ext_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			   SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			   SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			   SJA1105_RSV_ADDR, SJA1105_RSV_ADDR}, +	.mii_ext_rx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			   SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			   SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			   SJA1105_RSV_ADDR, SJA1105_RSV_ADDR}, +	.rgmii_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			 SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			 SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			 SJA1105_RSV_ADDR, SJA1105_RSV_ADDR}, +	.rmii_ref_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			 SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			 SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			 SJA1105_RSV_ADDR, SJA1105_RSV_ADDR}, +	.rmii_ext_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			    SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			    SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			    SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			    SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, +			    SJA1105_RSV_ADDR}, +	.ptpschtm = SJA1110_SPI_ADDR(0x54), +	.ptppinst = SJA1110_SPI_ADDR(0x5c), +	.ptppindur = SJA1110_SPI_ADDR(0x64), +	.ptp_control = SJA1110_SPI_ADDR(0x68), +	.ptpclkval = SJA1110_SPI_ADDR(0x6c), +	.ptpclkrate = SJA1110_SPI_ADDR(0x74), +	.ptpclkcorp = SJA1110_SPI_ADDR(0x80), +	.ptpsyncts = SJA1110_SPI_ADDR(0x84), +	.mdio_100base_tx = 0x1c2400, +	.mdio_100base_t1 = 0x1c1000,  };  const struct sja1105_info sja1105e_info = { @@ -475,6 +573,7 @@ const struct sja1105_info sja1105e_info = {  	.ptp_ts_bits		= 24,  	.ptpegr_ts_bytes	= 4,  	.max_frame_mem		= SJA1105_MAX_FRAME_MEMORY, +	.num_ports		= SJA1105_NUM_PORTS,  	.num_cbs_shapers	= SJA1105ET_MAX_CBS_COUNT,  	.reset_cmd		= sja1105et_reset_cmd,  	.fdb_add_cmd		= sja1105et_fdb_add, @@ -505,6 +604,7 @@ const struct sja1105_info sja1105t_info = {  	.ptp_ts_bits		= 24,  	.ptpegr_ts_bytes	= 4,  	.max_frame_mem		= SJA1105_MAX_FRAME_MEMORY, +	.num_ports		= SJA1105_NUM_PORTS,  	.num_cbs_shapers	= SJA1105ET_MAX_CBS_COUNT,  	.reset_cmd		= sja1105et_reset_cmd,  	.fdb_add_cmd		= sja1105et_fdb_add, @@ -535,6 +635,7 @@ const struct sja1105_info sja1105p_info = {  	.ptp_ts_bits		= 32,  	.ptpegr_ts_bytes	= 8,  	.max_frame_mem		= SJA1105_MAX_FRAME_MEMORY, +	.num_ports		= SJA1105_NUM_PORTS,  	.num_cbs_shapers	= SJA1105PQRS_MAX_CBS_COUNT,  	.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,  	.reset_cmd		= sja1105pqrs_reset_cmd, @@ -566,6 +667,7 @@ const struct sja1105_info sja1105q_info = {  	.ptp_ts_bits		= 32,  	.ptpegr_ts_bytes	= 8,  	.max_frame_mem		= SJA1105_MAX_FRAME_MEMORY, +	.num_ports		= SJA1105_NUM_PORTS,  	.num_cbs_shapers	= SJA1105PQRS_MAX_CBS_COUNT,  	.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,  	.reset_cmd		= sja1105pqrs_reset_cmd, @@ -597,6 +699,7 @@ const struct sja1105_info sja1105r_info = {  	.ptp_ts_bits		= 32,  	.ptpegr_ts_bytes	= 8,  	.max_frame_mem		= SJA1105_MAX_FRAME_MEMORY, +	.num_ports		= SJA1105_NUM_PORTS,  	.num_cbs_shapers	= SJA1105PQRS_MAX_CBS_COUNT,  	.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,  	.reset_cmd		= sja1105pqrs_reset_cmd, @@ -630,6 +733,7 @@ const struct sja1105_info sja1105s_info = {  	.ptp_ts_bits		= 32,  	.ptpegr_ts_bytes	= 8,  	.max_frame_mem		= SJA1105_MAX_FRAME_MEMORY, +	.num_ports		= SJA1105_NUM_PORTS,  	.num_cbs_shapers	= SJA1105PQRS_MAX_CBS_COUNT,  	.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,  	.reset_cmd		= sja1105pqrs_reset_cmd, @@ -650,3 +754,181 @@ const struct sja1105_info sja1105s_info = {  	.supports_sgmii		= {false, false, false, false, true},  	.name			= "SJA1105S",  }; + +const struct sja1105_info sja1110a_info = { +	.device_id		= SJA1110_DEVICE_ID, +	.part_no		= SJA1110A_PART_NO, +	.static_ops		= sja1110_table_ops, +	.dyn_ops		= sja1110_dyn_ops, +	.regs			= &sja1110_regs, +	.qinq_tpid		= ETH_P_8021AD, +	.can_limit_mcast_flood	= true, +	.ptp_ts_bits		= 32, +	.ptpegr_ts_bytes	= 8, +	.max_frame_mem		= SJA1110_MAX_FRAME_MEMORY, +	.num_ports		= SJA1110_NUM_PORTS, +	.num_cbs_shapers	= SJA1110_MAX_CBS_COUNT, +	.setup_rgmii_delay	= sja1110_setup_rgmii_delay, +	.reset_cmd		= sja1110_reset_cmd, +	.fdb_add_cmd		= sja1105pqrs_fdb_add, +	.fdb_del_cmd		= sja1105pqrs_fdb_del, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing, +	.clocking_setup		= sja1110_clocking_setup, +	.port_speed		= { +		[SJA1105_SPEED_AUTO] = 0, +		[SJA1105_SPEED_10MBPS] = 4, +		[SJA1105_SPEED_100MBPS] = 3, +		[SJA1105_SPEED_1000MBPS] = 2, +		[SJA1105_SPEED_2500MBPS] = 1, +	}, +	.supports_mii		= {true, true, true, true, false, +				   true, true, true, true, true, true}, +	.supports_rmii		= {false, false, true, true, false, +				   false, false, false, false, false, false}, +	.supports_rgmii		= {false, false, true, true, false, +				   false, false, false, false, false, false}, +	.supports_sgmii		= {false, true, true, true, true, +				   false, false, false, false, false, false}, +	.supports_2500basex	= {false, false, false, true, true, +				   false, false, false, false, false, false}, +	.internal_phy		= {SJA1105_NO_PHY, SJA1105_PHY_BASE_TX, +				   SJA1105_NO_PHY, SJA1105_NO_PHY, +				   SJA1105_NO_PHY, SJA1105_PHY_BASE_T1, +				   SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1, +				   SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1, +				   SJA1105_PHY_BASE_T1}, +	.name			= "SJA1110A", +}; + +const struct sja1105_info sja1110b_info = { +	.device_id		= SJA1110_DEVICE_ID, +	.part_no		= SJA1110B_PART_NO, +	.static_ops		= sja1110_table_ops, +	.dyn_ops		= sja1110_dyn_ops, +	.regs			= &sja1110_regs, +	.qinq_tpid		= ETH_P_8021AD, +	.can_limit_mcast_flood	= true, +	.ptp_ts_bits		= 32, +	.ptpegr_ts_bytes	= 8, +	.max_frame_mem		= SJA1110_MAX_FRAME_MEMORY, +	.num_ports		= SJA1110_NUM_PORTS, +	.num_cbs_shapers	= SJA1110_MAX_CBS_COUNT, +	.setup_rgmii_delay	= sja1110_setup_rgmii_delay, +	.reset_cmd		= sja1110_reset_cmd, +	.fdb_add_cmd		= sja1105pqrs_fdb_add, +	.fdb_del_cmd		= sja1105pqrs_fdb_del, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing, +	.clocking_setup		= sja1110_clocking_setup, +	.port_speed		= { +		[SJA1105_SPEED_AUTO] = 0, +		[SJA1105_SPEED_10MBPS] = 4, +		[SJA1105_SPEED_100MBPS] = 3, +		[SJA1105_SPEED_1000MBPS] = 2, +		[SJA1105_SPEED_2500MBPS] = 1, +	}, +	.supports_mii		= {true, true, true, true, false, +				   true, true, true, true, true, false}, +	.supports_rmii		= {false, false, true, true, false, +				   false, false, false, false, false, false}, +	.supports_rgmii		= {false, false, true, true, false, +				   false, false, false, false, false, false}, +	.supports_sgmii		= {false, false, false, true, true, +				   false, false, false, false, false, false}, +	.supports_2500basex	= {false, false, false, true, true, +				   false, false, false, false, false, false}, +	.internal_phy		= {SJA1105_NO_PHY, SJA1105_PHY_BASE_TX, +				   SJA1105_NO_PHY, SJA1105_NO_PHY, +				   SJA1105_NO_PHY, SJA1105_PHY_BASE_T1, +				   SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1, +				   SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1, +				   SJA1105_NO_PHY}, +	.name			= "SJA1110B", +}; + +const struct sja1105_info sja1110c_info = { +	.device_id		= SJA1110_DEVICE_ID, +	.part_no		= SJA1110C_PART_NO, +	.static_ops		= sja1110_table_ops, +	.dyn_ops		= sja1110_dyn_ops, +	.regs			= &sja1110_regs, +	.qinq_tpid		= ETH_P_8021AD, +	.can_limit_mcast_flood	= true, +	.ptp_ts_bits		= 32, +	.ptpegr_ts_bytes	= 8, +	.max_frame_mem		= SJA1110_MAX_FRAME_MEMORY, +	.num_ports		= SJA1110_NUM_PORTS, +	.num_cbs_shapers	= SJA1110_MAX_CBS_COUNT, +	.setup_rgmii_delay	= sja1110_setup_rgmii_delay, +	.reset_cmd		= sja1110_reset_cmd, +	.fdb_add_cmd		= sja1105pqrs_fdb_add, +	.fdb_del_cmd		= sja1105pqrs_fdb_del, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing, +	.clocking_setup		= sja1110_clocking_setup, +	.port_speed		= { +		[SJA1105_SPEED_AUTO] = 0, +		[SJA1105_SPEED_10MBPS] = 4, +		[SJA1105_SPEED_100MBPS] = 3, +		[SJA1105_SPEED_1000MBPS] = 2, +		[SJA1105_SPEED_2500MBPS] = 1, +	}, +	.supports_mii		= {true, true, true, true, false, +				   true, true, true, false, false, false}, +	.supports_rmii		= {false, false, true, true, false, +				   false, false, false, false, false, false}, +	.supports_rgmii		= {false, false, true, true, false, +				   false, false, false, false, false, false}, +	.supports_sgmii		= {false, false, false, false, true, +				   false, false, false, false, false, false}, +	.supports_2500basex	= {false, false, false, false, true, +				   false, false, false, false, false, false}, +	.internal_phy		= {SJA1105_NO_PHY, SJA1105_PHY_BASE_TX, +				   SJA1105_NO_PHY, SJA1105_NO_PHY, +				   SJA1105_NO_PHY, SJA1105_PHY_BASE_T1, +				   SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1, +				   SJA1105_NO_PHY, SJA1105_NO_PHY, +				   SJA1105_NO_PHY}, +	.name			= "SJA1110C", +}; + +const struct sja1105_info sja1110d_info = { +	.device_id		= SJA1110_DEVICE_ID, +	.part_no		= SJA1110D_PART_NO, +	.static_ops		= sja1110_table_ops, +	.dyn_ops		= sja1110_dyn_ops, +	.regs			= &sja1110_regs, +	.qinq_tpid		= ETH_P_8021AD, +	.can_limit_mcast_flood	= true, +	.ptp_ts_bits		= 32, +	.ptpegr_ts_bytes	= 8, +	.max_frame_mem		= SJA1110_MAX_FRAME_MEMORY, +	.num_ports		= SJA1110_NUM_PORTS, +	.num_cbs_shapers	= SJA1110_MAX_CBS_COUNT, +	.setup_rgmii_delay	= sja1110_setup_rgmii_delay, +	.reset_cmd		= sja1110_reset_cmd, +	.fdb_add_cmd		= sja1105pqrs_fdb_add, +	.fdb_del_cmd		= sja1105pqrs_fdb_del, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing, +	.clocking_setup		= sja1110_clocking_setup, +	.port_speed		= { +		[SJA1105_SPEED_AUTO] = 0, +		[SJA1105_SPEED_10MBPS] = 4, +		[SJA1105_SPEED_100MBPS] = 3, +		[SJA1105_SPEED_1000MBPS] = 2, +		[SJA1105_SPEED_2500MBPS] = 1, +	}, +	.supports_mii		= {true, false, true, false, false, +				   true, true, true, false, false, false}, +	.supports_rmii		= {false, false, true, false, false, +				   false, false, false, false, false, false}, +	.supports_rgmii		= {false, false, true, false, false, +				   false, false, false, false, false, false}, +	.supports_sgmii		= {false, true, true, true, true, +				   false, false, false, false, false, false}, +	.internal_phy		= {SJA1105_NO_PHY, SJA1105_NO_PHY, +				   SJA1105_NO_PHY, SJA1105_NO_PHY, +				   SJA1105_NO_PHY, SJA1105_PHY_BASE_T1, +				   SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1, +				   SJA1105_NO_PHY, SJA1105_NO_PHY, +				   SJA1105_NO_PHY}, +	.name			= "SJA1110D", +}; |