switch (stride) { case I8255_PORTA: return I8255_CONTROL_PORTA_DIRECTION; case I8255_PORTB: return I8255_CONTROL_PORTB_DIRECTION; case I8255_PORTC: /* Port C can be configured by nibble */ if (line >= 4) return I8255_CONTROL_PORTC_UPPER_DIRECTION; return I8255_CONTROL_PORTC_LOWER_DIRECTION; default: /* Should never reach this path */ return 0;
}
}
staticint i8255_ppi_init(struct regmap *const map, constunsignedint base)
{ int err;
/* Configure all ports to MODE 0 output mode */
err = regmap_write(map, base + I8255_CONTROL, I8255_CONTROL_MODE_SET); if (err) return err;
/* Initialize all GPIO to output 0 */
err = regmap_write(map, base + I8255_PORTA, 0x00); if (err) return err;
err = regmap_write(map, base + I8255_PORTB, 0x00); if (err) return err; return regmap_write(map, base + I8255_PORTC, 0x00);
}
switch (base) { case I8255_REG_DAT_BASE:
*reg = base + stride + ppi * 4;
*mask = BIT(line); return 0; case I8255_REG_DIR_IN_BASE:
*reg = base + ppi * 4;
*mask = i8255_direction_mask(ppi_offset); return 0; default: /* Should never reach this path */ return -EINVAL;
}
}
/** * devm_i8255_regmap_register - Register an i8255 GPIO controller * @dev: device that is registering this i8255 GPIO device * @config: configuration for i8255_regmap_config * * Registers an Intel 8255 Programmable Peripheral Interface GPIO controller. * Returns 0 on success and negative error number on failure.
*/ int devm_i8255_regmap_register(struct device *const dev, conststruct i8255_regmap_config *const config)
{ struct gpio_regmap_config gpio_config = {0}; unsignedlong i; int err;
if (!config->parent) return -EINVAL;
if (!config->map) return -EINVAL;
if (!config->num_ppi) return -EINVAL;
for (i = 0; i < config->num_ppi; i++) {
err = i8255_ppi_init(config->map, i * 4); if (err) return err;
}
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.