mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 22:05:24 +07:00
609070133a
This patch moves the functions operating on the hidden debug registers into it's own file, port_hidden.c. The functions prefix is renamed from mv88e6390_hidden_ to mv88e6xxx_port_hidden_, to be consistent with the rest of this driver. The macros are prefixed with MV88E6XXX_ prefix, and are changed not to use the BIT() macro nor bit shifts, since the rest of the port.h file does not use it. We also add the support for setting the Block Address field when operating hidden registers. Marvell's mdio examples for SERDES settings on Topaz use Block Address 0x7 when reading/writing hidden registers, and although the specification says that block must be set to 0xf, those settings are reachable only with Block Address 0x7. Signed-off-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Tested-by: Vivien Didelot <vivien.didelot@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
71 lines
1.9 KiB
C
71 lines
1.9 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Marvell 88E6xxx Switch Hidden Registers support
|
|
*
|
|
* Copyright (c) 2008 Marvell Semiconductor
|
|
*
|
|
* Copyright (c) 2019 Andrew Lunn <andrew@lunn.ch>
|
|
*/
|
|
|
|
#include <linux/bitfield.h>
|
|
|
|
#include "chip.h"
|
|
#include "port.h"
|
|
|
|
/* The mv88e6390 and mv88e6341 have some hidden registers used for debug and
|
|
* development. The errata also makes use of them.
|
|
*/
|
|
int mv88e6xxx_port_hidden_write(struct mv88e6xxx_chip *chip, int block,
|
|
int port, int reg, u16 val)
|
|
{
|
|
u16 ctrl;
|
|
int err;
|
|
|
|
err = mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_DATA_PORT,
|
|
MV88E6XXX_PORT_RESERVED_1A, val);
|
|
if (err)
|
|
return err;
|
|
|
|
ctrl = MV88E6XXX_PORT_RESERVED_1A_BUSY |
|
|
MV88E6XXX_PORT_RESERVED_1A_WRITE |
|
|
block << MV88E6XXX_PORT_RESERVED_1A_BLOCK_SHIFT |
|
|
port << MV88E6XXX_PORT_RESERVED_1A_PORT_SHIFT |
|
|
reg;
|
|
|
|
return mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
|
|
MV88E6XXX_PORT_RESERVED_1A, ctrl);
|
|
}
|
|
|
|
int mv88e6xxx_port_hidden_wait(struct mv88e6xxx_chip *chip)
|
|
{
|
|
int bit = __bf_shf(MV88E6XXX_PORT_RESERVED_1A_BUSY);
|
|
|
|
return mv88e6xxx_wait_bit(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
|
|
MV88E6XXX_PORT_RESERVED_1A, bit, 0);
|
|
}
|
|
|
|
int mv88e6xxx_port_hidden_read(struct mv88e6xxx_chip *chip, int block, int port,
|
|
int reg, u16 *val)
|
|
{
|
|
u16 ctrl;
|
|
int err;
|
|
|
|
ctrl = MV88E6XXX_PORT_RESERVED_1A_BUSY |
|
|
MV88E6XXX_PORT_RESERVED_1A_READ |
|
|
block << MV88E6XXX_PORT_RESERVED_1A_BLOCK_SHIFT |
|
|
port << MV88E6XXX_PORT_RESERVED_1A_PORT_SHIFT |
|
|
reg;
|
|
|
|
err = mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
|
|
MV88E6XXX_PORT_RESERVED_1A, ctrl);
|
|
if (err)
|
|
return err;
|
|
|
|
err = mv88e6xxx_port_hidden_wait(chip);
|
|
if (err)
|
|
return err;
|
|
|
|
return mv88e6xxx_port_read(chip, MV88E6XXX_PORT_RESERVED_1A_DATA_PORT,
|
|
MV88E6XXX_PORT_RESERVED_1A, val);
|
|
}
|