xref: /openbmc/linux/drivers/net/dsa/mv88e6xxx/serdes.h (revision efd1ba6a)
16d91782fSAndrew Lunn /*
26d91782fSAndrew Lunn  * Marvell 88E6xxx SERDES manipulation, via SMI bus
36d91782fSAndrew Lunn  *
46d91782fSAndrew Lunn  * Copyright (c) 2008 Marvell Semiconductor
56d91782fSAndrew Lunn  *
66d91782fSAndrew Lunn  * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
76d91782fSAndrew Lunn  *
86d91782fSAndrew Lunn  * This program is free software; you can redistribute it and/or modify
96d91782fSAndrew Lunn  * it under the terms of the GNU General Public License as published by
106d91782fSAndrew Lunn  * the Free Software Foundation; either version 2 of the License, or
116d91782fSAndrew Lunn  * (at your option) any later version.
126d91782fSAndrew Lunn  */
136d91782fSAndrew Lunn 
146d91782fSAndrew Lunn #ifndef _MV88E6XXX_SERDES_H
156d91782fSAndrew Lunn #define _MV88E6XXX_SERDES_H
166d91782fSAndrew Lunn 
174d5f2ba7SVivien Didelot #include "chip.h"
186d91782fSAndrew Lunn 
196d91782fSAndrew Lunn #define MV88E6352_ADDR_SERDES		0x0f
206d91782fSAndrew Lunn #define MV88E6352_SERDES_PAGE_FIBER	0x01
216d91782fSAndrew Lunn 
225bafeb6eSMarek Behún #define MV88E6341_ADDR_SERDES		0x15
235bafeb6eSMarek Behún 
246335e9f2SAndrew Lunn #define MV88E6390_PORT9_LANE0		0x09
256335e9f2SAndrew Lunn #define MV88E6390_PORT9_LANE1		0x12
266335e9f2SAndrew Lunn #define MV88E6390_PORT9_LANE2		0x13
276335e9f2SAndrew Lunn #define MV88E6390_PORT9_LANE3		0x14
286335e9f2SAndrew Lunn #define MV88E6390_PORT10_LANE0		0x0a
296335e9f2SAndrew Lunn #define MV88E6390_PORT10_LANE1		0x15
306335e9f2SAndrew Lunn #define MV88E6390_PORT10_LANE2		0x16
316335e9f2SAndrew Lunn #define MV88E6390_PORT10_LANE3		0x17
326335e9f2SAndrew Lunn 
336335e9f2SAndrew Lunn /* 10GBASE-R and 10GBASE-X4/X2 */
346335e9f2SAndrew Lunn #define MV88E6390_PCS_CONTROL_1		0x1000
356335e9f2SAndrew Lunn #define MV88E6390_PCS_CONTROL_1_RESET		BIT(15)
366335e9f2SAndrew Lunn #define MV88E6390_PCS_CONTROL_1_LOOPBACK	BIT(14)
376335e9f2SAndrew Lunn #define MV88E6390_PCS_CONTROL_1_SPEED		BIT(13)
386335e9f2SAndrew Lunn #define MV88E6390_PCS_CONTROL_1_PDOWN		BIT(11)
396335e9f2SAndrew Lunn 
406335e9f2SAndrew Lunn /* 1000BASE-X and SGMII */
416335e9f2SAndrew Lunn #define MV88E6390_SGMII_CONTROL		0x2000
426335e9f2SAndrew Lunn #define MV88E6390_SGMII_CONTROL_RESET		BIT(15)
436335e9f2SAndrew Lunn #define MV88E6390_SGMII_CONTROL_LOOPBACK	BIT(14)
446335e9f2SAndrew Lunn #define MV88E6390_SGMII_CONTROL_PDOWN		BIT(11)
45efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_STATUS		0x2001
46efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_STATUS_AN_DONE		BIT(5)
47efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_STATUS_REMOTE_FAULT	BIT(4)
48efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_STATUS_LINK		BIT(2)
49efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_ENABLE	0xa001
50efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_SPEED_CHANGE	BIT(14)
51efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_DUPLEX_CHANGE	BIT(13)
52efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_PAGE_RX		BIT(12)
53efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_AN_COMPLETE		BIT(11)
54efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_LINK_DOWN		BIT(10)
55efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_LINK_UP		BIT(9)
56efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_SYMBOL_ERROR	BIT(8)
57efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_FALSE_CARRIER	BIT(7)
58efd1ba6aSAndrew Lunn #define MV88E6390_SGMII_INT_STATUS	0xa002
596335e9f2SAndrew Lunn 
605bafeb6eSMarek Behún int mv88e6341_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
616d91782fSAndrew Lunn int mv88e6352_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
626335e9f2SAndrew Lunn int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
6307ffbd74SAndrew Lunn int mv88e6390x_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
64efd1ba6aSAndrew Lunn int mv88e6390_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port);
65efd1ba6aSAndrew Lunn void mv88e6390_serdes_irq_free(struct mv88e6xxx_chip *chip, int port);
66cda9f4aaSAndrew Lunn int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port);
6765f60e45SAndrew Lunn int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
68cda9f4aaSAndrew Lunn 				 int port, uint8_t *data);
6965f60e45SAndrew Lunn int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
70cda9f4aaSAndrew Lunn 			       uint64_t *data);
716d91782fSAndrew Lunn #endif
72