static void write_config_reg(struct pinmux_info *gpioc, struct pinmux_cfg_reg *crp, unsigned long field, unsigned long value) { void *mapped_reg; unsigned long mask, pos, data; config_reg_helper(gpioc, crp, field, &mapped_reg, &mask, &pos); debug("write_reg addr = %lx, value = %ld, field = %ld, " "r_width = %ld, f_width = %ld\n", crp->reg, value, field, crp->reg_width, crp->field_width); mask = ~(mask << pos); value = value << pos; data = gpio_read_raw_reg(mapped_reg, crp->reg_width); data &= mask; data |= value; if (gpioc->unlock_reg) gpio_write_raw_reg(pfc_phys_to_virt(gpioc, gpioc->unlock_reg), 32, ~data); gpio_write_raw_reg(mapped_reg, crp->reg_width, data); }
static void gpio_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos, unsigned long value) { unsigned long pos; pos = dr->reg_width - (in_pos + 1); pr_debug("write_bit addr = %lx, value = %ld, pos = %ld, " "r_width = %ld\n", dr->reg, !!value, pos, dr->reg_width); if (value) set_bit(pos, &dr->reg_shadow); else clear_bit(pos, &dr->reg_shadow); gpio_write_raw_reg(dr->reg, dr->reg_width, dr->reg_shadow); }