0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/bitfield.h>
0011
0012 #include "chip.h"
0013 #include "port.h"
0014
0015
0016
0017
0018 int mv88e6xxx_port_hidden_write(struct mv88e6xxx_chip *chip, int block,
0019 int port, int reg, u16 val)
0020 {
0021 u16 ctrl;
0022 int err;
0023
0024 err = mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_DATA_PORT,
0025 MV88E6XXX_PORT_RESERVED_1A, val);
0026 if (err)
0027 return err;
0028
0029 ctrl = MV88E6XXX_PORT_RESERVED_1A_BUSY |
0030 MV88E6XXX_PORT_RESERVED_1A_WRITE |
0031 block << MV88E6XXX_PORT_RESERVED_1A_BLOCK_SHIFT |
0032 port << MV88E6XXX_PORT_RESERVED_1A_PORT_SHIFT |
0033 reg;
0034
0035 return mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
0036 MV88E6XXX_PORT_RESERVED_1A, ctrl);
0037 }
0038
0039 int mv88e6xxx_port_hidden_wait(struct mv88e6xxx_chip *chip)
0040 {
0041 int bit = __bf_shf(MV88E6XXX_PORT_RESERVED_1A_BUSY);
0042
0043 return mv88e6xxx_port_wait_bit(chip,
0044 MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
0045 MV88E6XXX_PORT_RESERVED_1A, bit, 0);
0046 }
0047
0048 int mv88e6xxx_port_hidden_read(struct mv88e6xxx_chip *chip, int block, int port,
0049 int reg, u16 *val)
0050 {
0051 u16 ctrl;
0052 int err;
0053
0054 ctrl = MV88E6XXX_PORT_RESERVED_1A_BUSY |
0055 MV88E6XXX_PORT_RESERVED_1A_READ |
0056 block << MV88E6XXX_PORT_RESERVED_1A_BLOCK_SHIFT |
0057 port << MV88E6XXX_PORT_RESERVED_1A_PORT_SHIFT |
0058 reg;
0059
0060 err = mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
0061 MV88E6XXX_PORT_RESERVED_1A, ctrl);
0062 if (err)
0063 return err;
0064
0065 err = mv88e6xxx_port_hidden_wait(chip);
0066 if (err)
0067 return err;
0068
0069 return mv88e6xxx_port_read(chip, MV88E6XXX_PORT_RESERVED_1A_DATA_PORT,
0070 MV88E6XXX_PORT_RESERVED_1A, val);
0071 }