/** * mv88e6xxx_g2_scratch_get_bit - get a bit * @chip: chip private data * @base_reg: base of scratch bits * @offset: index of bit within the register * @set: is bit set?
*/ staticint mv88e6xxx_g2_scratch_get_bit(struct mv88e6xxx_chip *chip, int base_reg, unsignedint offset, int *set)
{ int reg = base_reg + (offset / 8);
u8 mask = (1 << (offset & 0x7));
u8 val; int err;
err = mv88e6xxx_g2_scratch_read(chip, reg, &val); if (err) return err;
*set = !!(mask & val);
return 0;
}
/** * mv88e6xxx_g2_scratch_set_bit - set (or clear) a bit * @chip: chip private data * @base_reg: base of scratch bits * @offset: index of bit within the register * @set: should this bit be set? * * Helper function for dealing with the direction and data registers.
*/ staticint mv88e6xxx_g2_scratch_set_bit(struct mv88e6xxx_chip *chip, int base_reg, unsignedint offset, int set)
{ int reg = base_reg + (offset / 8);
u8 mask = (1 << (offset & 0x7));
u8 val; int err;
err = mv88e6xxx_g2_scratch_read(chip, reg, &val); if (err) return err;
/** * mv88e6352_g2_scratch_gpio_get_data - get data on gpio pin * @chip: chip private data * @pin: gpio index * * Return: 0 for low, 1 for high, negative error
*/ staticint mv88e6352_g2_scratch_gpio_get_data(struct mv88e6xxx_chip *chip, unsignedint pin)
{ int val = 0; int err;
err = mv88e6xxx_g2_scratch_get_bit(chip,
MV88E6352_G2_SCRATCH_GPIO_DATA0,
pin, &val); if (err) return err;
return val;
}
/** * mv88e6352_g2_scratch_gpio_set_data - set data on gpio pin * @chip: chip private data * @pin: gpio index * @value: value to set
*/ staticint mv88e6352_g2_scratch_gpio_set_data(struct mv88e6xxx_chip *chip, unsignedint pin, int value)
{
u8 mask = (1 << (pin & 0x7)); int offset = (pin / 8); int reg;
reg = MV88E6352_G2_SCRATCH_GPIO_DATA0 + offset;
if (value)
chip->gpio_data[offset] |= mask; else
chip->gpio_data[offset] &= ~mask;
/** * mv88e6352_g2_scratch_gpio_get_dir - get direction of gpio pin * @chip: chip private data * @pin: gpio index * * Return: 0 for output, 1 for input.
*/ staticint mv88e6352_g2_scratch_gpio_get_dir(struct mv88e6xxx_chip *chip, unsignedint pin)
{ int val = 0; int err;
err = mv88e6xxx_g2_scratch_get_bit(chip,
MV88E6352_G2_SCRATCH_GPIO_DIR0,
pin, &val); if (err) return err;
return val;
}
/** * mv88e6352_g2_scratch_gpio_set_dir - set direction of gpio pin * @chip: chip private data * @pin: gpio index * @input: should the gpio be an input, or an output?
*/ staticint mv88e6352_g2_scratch_gpio_set_dir(struct mv88e6xxx_chip *chip, unsignedint pin, bool input)
{ int value = (input ? MV88E6352_G2_SCRATCH_GPIO_DIR_IN :
MV88E6352_G2_SCRATCH_GPIO_DIR_OUT);
/** * mv88e6352_g2_scratch_gpio_get_pctl - get pin control setting * @chip: chip private data * @pin: gpio index * @func: function number * * Note that the function numbers themselves may vary by chipset.
*/ staticint mv88e6352_g2_scratch_gpio_get_pctl(struct mv88e6xxx_chip *chip, unsignedint pin, int *func)
{ int reg = MV88E6352_G2_SCRATCH_GPIO_PCTL0 + (pin / 2); int offset = (pin & 0x1) ? 4 : 0;
u8 mask = (0x7 << offset); int err;
u8 val;
err = mv88e6xxx_g2_scratch_read(chip, reg, &val); if (err) return err;
*func = (val & mask) >> offset;
return 0;
}
/** * mv88e6352_g2_scratch_gpio_set_pctl - set pin control setting * @chip: chip private data * @pin: gpio index * @func: function number
*/ staticint mv88e6352_g2_scratch_gpio_set_pctl(struct mv88e6xxx_chip *chip, unsignedint pin, int func)
{ int reg = MV88E6352_G2_SCRATCH_GPIO_PCTL0 + (pin / 2); int offset = (pin & 0x1) ? 4 : 0;
u8 mask = (0x7 << offset); int err;
u8 val;
err = mv88e6xxx_g2_scratch_read(chip, reg, &val); if (err) return err;
/** * mv88e6390_g2_scratch_gpio_set_smi - set gpio muxing for external smi * @chip: chip private data * @external: set mux for external smi, or free for gpio usage * * Some mv88e6xxx models have GPIO pins that may be configured as * an external SMI interface, or they may be made free for other * GPIO uses.
*/ int mv88e6390_g2_scratch_gpio_set_smi(struct mv88e6xxx_chip *chip, bool external)
{ int misc_cfg = MV88E6352_G2_SCRATCH_MISC_CFG; int config_data1 = MV88E6352_G2_SCRATCH_CONFIG_DATA1; int config_data2 = MV88E6352_G2_SCRATCH_CONFIG_DATA2; bool no_cpu;
u8 p0_mode; int err;
u8 val;
err = mv88e6xxx_g2_scratch_read(chip, config_data2, &val); if (err) return err;
p0_mode = val & MV88E6352_G2_SCRATCH_CONFIG_DATA2_P0_MODE_MASK;
if (p0_mode == 0x01 || p0_mode == 0x02) return -EBUSY;
err = mv88e6xxx_g2_scratch_read(chip, config_data1, &val); if (err) return err;
/** * mv88e6393x_g2_scratch_gpio_set_smi - set gpio muxing for external smi * @chip: chip private data * @external: set mux for external smi, or free for gpio usage * * MV88E6191X/6193X/6393X GPIO pins 9 and 10 can be configured as an * external SMI interface or as regular GPIO-s. * * They however have a different register layout then the existing * function.
*/
int mv88e6393x_g2_scratch_gpio_set_smi(struct mv88e6xxx_chip *chip, bool external)
{ int misc_cfg = MV88E6352_G2_SCRATCH_MISC_CFG; int err;
u8 val;
err = mv88e6xxx_g2_scratch_read(chip, misc_cfg, &val); if (err) return err;
if (external)
val &= ~MV88E6352_G2_SCRATCH_MISC_CFG_NORMALSMI; else
val |= MV88E6352_G2_SCRATCH_MISC_CFG_NORMALSMI;
/** * mv88e6352_g2_scratch_port_has_serdes - indicate if a port can have a serdes * @chip: chip private data * @port: port number to check for serdes * * Indicates whether the port may have a serdes attached according to the * pin strapping. Returns negative error number, 0 if the port is not * configured to have a serdes, and 1 if the port is configured to have a * serdes attached.
*/ int mv88e6352_g2_scratch_port_has_serdes(struct mv88e6xxx_chip *chip, int port)
{
u8 config3, p; int err;
err = mv88e6xxx_g2_scratch_read(chip, MV88E6352_G2_SCRATCH_CONFIG_DATA3,
&config3); if (err) return err;
if (config3 & MV88E6352_G2_SCRATCH_CONFIG_DATA3_S_SEL)
p = 5; else
p = 4;
return port == p;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.