Lines Matching +full:gpio +full:- +full:range
2 * Pinmuxed GPIO support for SuperH.
23 if (enum_id < r->begin) in enum_in_range()
26 if (enum_id > r->end) in enum_in_range()
74 pos = dr->reg_width - (in_pos + 1); in gpio_read_bit()
77 dr->reg + offset, pos, dr->reg_width); in gpio_read_bit()
79 return (gpio_read_raw_reg(dr->mapped_reg + offset, in gpio_read_bit()
80 dr->reg_width) >> pos) & 1; in gpio_read_bit()
88 pos = dr->reg_width - (in_pos + 1); in gpio_write_bit()
92 dr->reg, !!value, pos, dr->reg_width); in gpio_write_bit()
95 __set_bit(pos, &dr->reg_shadow); in gpio_write_bit()
97 __clear_bit(pos, &dr->reg_shadow); in gpio_write_bit()
99 gpio_write_raw_reg(dr->mapped_reg, dr->reg_width, dr->reg_shadow); in gpio_write_bit()
115 *mapped_regp = pfc_phys_to_virt(gpioc, crp->reg); in config_reg_helper()
117 if (crp->field_width) { in config_reg_helper()
118 *maskp = (1 << crp->field_width) - 1; in config_reg_helper()
119 *posp = crp->reg_width - ((in_pos + 1) * crp->field_width); in config_reg_helper()
121 *maskp = (1 << crp->var_field_width[in_pos]) - 1; in config_reg_helper()
122 *posp = crp->reg_width; in config_reg_helper()
124 *posp -= crp->var_field_width[k]; in config_reg_helper()
140 crp->reg, field, crp->reg_width, crp->field_width); in read_config_reg()
142 return (gpio_read_raw_reg(mapped_reg, crp->reg_width) >> pos) & mask; in read_config_reg()
156 crp->reg, value, field, crp->reg_width, crp->field_width); in write_config_reg()
161 data = gpio_read_raw_reg(mapped_reg, crp->reg_width); in write_config_reg()
165 if (gpioc->unlock_reg) in write_config_reg()
166 gpio_write_raw_reg(pfc_phys_to_virt(gpioc, gpioc->unlock_reg), in write_config_reg()
169 gpio_write_raw_reg(mapped_reg, crp->reg_width, data); in write_config_reg()
172 static int setup_data_reg(struct pinmux_info *gpioc, unsigned gpio) in setup_data_reg() argument
174 struct pinmux_gpio *gpiop = &gpioc->gpios[gpio]; in setup_data_reg()
178 if (!enum_in_range(gpiop->enum_id, &gpioc->data)) in setup_data_reg()
179 return -1; in setup_data_reg()
183 data_reg = gpioc->data_regs + k; in setup_data_reg()
185 if (!data_reg->reg_width) in setup_data_reg()
188 data_reg->mapped_reg = pfc_phys_to_virt(gpioc, data_reg->reg); in setup_data_reg()
190 for (n = 0; n < data_reg->reg_width; n++) { in setup_data_reg()
191 if (data_reg->enum_ids[n] == gpiop->enum_id) { in setup_data_reg()
192 gpiop->flags &= ~PINMUX_FLAG_DREG; in setup_data_reg()
193 gpiop->flags |= (k << PINMUX_FLAG_DREG_SHIFT); in setup_data_reg()
194 gpiop->flags &= ~PINMUX_FLAG_DBIT; in setup_data_reg()
195 gpiop->flags |= (n << PINMUX_FLAG_DBIT_SHIFT); in setup_data_reg()
204 return -1; in setup_data_reg()
212 for (k = gpioc->first_gpio; k <= gpioc->last_gpio; k++) in setup_data_regs()
217 drp = gpioc->data_regs + k; in setup_data_regs()
219 if (!drp->reg_width) in setup_data_regs()
222 drp->reg_shadow = gpio_read_raw_reg(drp->mapped_reg, in setup_data_regs()
223 drp->reg_width); in setup_data_regs()
228 static int get_data_reg(struct pinmux_info *gpioc, unsigned gpio, in get_data_reg() argument
231 struct pinmux_gpio *gpiop = &gpioc->gpios[gpio]; in get_data_reg()
234 if (!enum_in_range(gpiop->enum_id, &gpioc->data)) in get_data_reg()
235 return -1; in get_data_reg()
237 k = (gpiop->flags & PINMUX_FLAG_DREG) >> PINMUX_FLAG_DREG_SHIFT; in get_data_reg()
238 n = (gpiop->flags & PINMUX_FLAG_DBIT) >> PINMUX_FLAG_DBIT_SHIFT; in get_data_reg()
239 *drp = gpioc->data_regs + k; in get_data_reg()
255 config_reg = gpioc->cfg_regs + k; in get_config_reg()
257 r_width = config_reg->reg_width; in get_config_reg()
258 f_width = config_reg->field_width; in get_config_reg()
269 curr_width = config_reg->var_field_width[m]; in get_config_reg()
273 if (config_reg->enum_ids[pos + n] == enum_id) { in get_config_reg()
277 *cntp = &config_reg->cnt[m]; in get_config_reg()
287 return -1; in get_config_reg()
290 static int get_gpio_enum_id(struct pinmux_info *gpioc, unsigned gpio, in get_gpio_enum_id() argument
293 pinmux_enum_t enum_id = gpioc->gpios[gpio].enum_id; in get_gpio_enum_id()
294 pinmux_enum_t *data = gpioc->gpio_data; in get_gpio_enum_id()
297 if (!enum_in_range(enum_id, &gpioc->data)) { in get_gpio_enum_id()
298 if (!enum_in_range(enum_id, &gpioc->mark)) { in get_gpio_enum_id()
299 debug("non data/mark enum_id for gpio %d\n", gpio); in get_gpio_enum_id()
300 return -1; in get_gpio_enum_id()
309 for (k = 0; k < gpioc->gpio_data_size; k++) { in get_gpio_enum_id()
316 debug("cannot locate data/mark enum_id for gpio %d\n", gpio); in get_gpio_enum_id()
317 return -1; in get_gpio_enum_id()
322 static int pinmux_config_gpio(struct pinmux_info *gpioc, unsigned gpio, in pinmux_config_gpio() argument
327 struct pinmux_range *range; in pinmux_config_gpio() local
334 range = NULL; in pinmux_config_gpio()
338 range = &gpioc->output; in pinmux_config_gpio()
342 range = &gpioc->input; in pinmux_config_gpio()
346 range = &gpioc->input_pu; in pinmux_config_gpio()
350 range = &gpioc->input_pd; in pinmux_config_gpio()
362 pos = get_gpio_enum_id(gpioc, gpio, pos, &enum_id); in pinmux_config_gpio()
370 in_range = enum_in_range(enum_id, &gpioc->function); in pinmux_config_gpio()
373 if (range) { in pinmux_config_gpio()
375 * other range exists, so this pin is in pinmux_config_gpio()
376 * a regular GPIO pin that now is being in pinmux_config_gpio()
380 * and the enums that match the other range. in pinmux_config_gpio()
382 in_range = enum_in_range(enum_id, range); in pinmux_config_gpio()
386 * input-only or output-only pins without in pinmux_config_gpio()
389 if (in_range && enum_id == range->force) in pinmux_config_gpio()
393 * no other range exists, so this pin in pinmux_config_gpio()
424 *cntp = *cntp - 1; in pinmux_config_gpio()
431 return -1; in pinmux_config_gpio()
447 ret = -1; in sh_gpio_request()
452 if ((gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE) != PINMUX_TYPE_NONE) in sh_gpio_request()
474 gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; in sh_gpio_request()
475 gpioc->gpios[offset].flags |= pinmux_type; in sh_gpio_request()
489 pinmux_type = gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE; in sh_gpio_free()
491 gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; in sh_gpio_free()
492 gpioc->gpios[offset].flags |= PINMUX_TYPE_NONE; in sh_gpio_free()
496 unsigned gpio, int new_pinmux_type) in pinmux_direction() argument
499 int ret = -1; in pinmux_direction()
504 pinmux_type = gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE; in pinmux_direction()
513 pinmux_config_gpio(gpioc, gpio, pinmux_type, GPIO_CFG_FREE); in pinmux_direction()
519 if (pinmux_config_gpio(gpioc, gpio, in pinmux_direction()
524 if (pinmux_config_gpio(gpioc, gpio, in pinmux_direction()
529 gpioc->gpios[gpio].flags &= ~PINMUX_FLAG_TYPE; in pinmux_direction()
530 gpioc->gpios[gpio].flags |= new_pinmux_type; in pinmux_direction()
543 unsigned gpio, int value) in sh_gpio_set_value() argument
548 if (!gpioc || get_data_reg(gpioc, gpio, &dr, &bit) != 0) in sh_gpio_set_value()
560 static int sh_gpio_get_value(struct pinmux_info *gpioc, unsigned gpio) in sh_gpio_get_value() argument
565 if (!gpioc || get_data_reg(gpioc, gpio, &dr, &bit) != 0) in sh_gpio_get_value()
566 return -1; in sh_gpio_get_value()
568 if ((gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE) == PINMUX_TYPE_INPUT) in sh_gpio_get_value()
589 debug("%s deregistering\n", pip->name); in register_pinmux()
597 debug("%s deregistering\n", pip->name); in unregister_pinmux()
599 return -1; in unregister_pinmux()
605 int gpio_request(unsigned gpio, const char *label) in gpio_request() argument
607 sh_gpio_request(gpio); in gpio_request()
611 int gpio_free(unsigned gpio) in gpio_free() argument
613 sh_gpio_free(gpio); in gpio_free()
617 int gpio_direction_input(unsigned gpio) in gpio_direction_input() argument
619 return sh_gpio_direction_input(gpio); in gpio_direction_input()
622 int gpio_direction_output(unsigned gpio, int value) in gpio_direction_output() argument
624 return sh_gpio_direction_output(gpio, value); in gpio_direction_output()
627 void gpio_set_value(unsigned gpio, int value) in gpio_set_value() argument
629 sh_gpio_set(gpio, value); in gpio_set_value()
632 int gpio_get_value(unsigned gpio) in gpio_get_value() argument
634 return sh_gpio_get(gpio); in gpio_get_value()