Lines Matching +full:int +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0+
132 unsigned long gpios; member
142 static int winbond_sio_enter(unsigned long base) in winbond_sio_enter()
145 return -EBUSY; in winbond_sio_enter()
206 * struct winbond_gpio_port_conflict - possibly conflicting device information
209 * is located (or WB_SIO_DEV_NONE - don't select any
226 * struct winbond_gpio_info - information about a particular GPIO port (device)
232 * @outputppbit: index of a push-pull output driver mode bit
351 static bool winbond_gpio_get_info(unsigned int *gpio_num, in winbond_gpio_get_info()
357 for_each_set_bit(i, &params.gpios, BITS_PER_LONG) { in winbond_gpio_get_info()
361 *gpio_num -= 8; in winbond_gpio_get_info()
383 static int winbond_gpio_get(struct gpio_chip *gc, unsigned int offset) in winbond_gpio_get()
388 int ret; in winbond_gpio_get()
396 winbond_sio_select_logical(*base, info->dev); in winbond_gpio_get()
398 val = winbond_sio_reg_btest(*base, info->datareg, offset); in winbond_gpio_get()
399 if (winbond_sio_reg_btest(*base, info->invreg, offset)) in winbond_gpio_get()
407 static int winbond_gpio_direction_in(struct gpio_chip *gc, unsigned int offset) in winbond_gpio_direction_in()
411 int ret; in winbond_gpio_direction_in()
414 return -EACCES; in winbond_gpio_direction_in()
420 winbond_sio_select_logical(*base, info->dev); in winbond_gpio_direction_in()
422 winbond_sio_reg_bset(*base, info->ioreg, offset); in winbond_gpio_direction_in()
429 static int winbond_gpio_direction_out(struct gpio_chip *gc, in winbond_gpio_direction_out()
430 unsigned int offset, in winbond_gpio_direction_out()
431 int val) in winbond_gpio_direction_out()
435 int ret; in winbond_gpio_direction_out()
438 return -EACCES; in winbond_gpio_direction_out()
444 winbond_sio_select_logical(*base, info->dev); in winbond_gpio_direction_out()
446 winbond_sio_reg_bclear(*base, info->ioreg, offset); in winbond_gpio_direction_out()
448 if (winbond_sio_reg_btest(*base, info->invreg, offset)) in winbond_gpio_direction_out()
452 winbond_sio_reg_bset(*base, info->datareg, offset); in winbond_gpio_direction_out()
454 winbond_sio_reg_bclear(*base, info->datareg, offset); in winbond_gpio_direction_out()
461 static void winbond_gpio_set(struct gpio_chip *gc, unsigned int offset, in winbond_gpio_set()
462 int val) in winbond_gpio_set()
473 winbond_sio_select_logical(*base, info->dev); in winbond_gpio_set()
475 if (winbond_sio_reg_btest(*base, info->invreg, offset)) in winbond_gpio_set()
479 winbond_sio_reg_bset(*base, info->datareg, offset); in winbond_gpio_set()
481 winbond_sio_reg_bclear(*base, info->datareg, offset); in winbond_gpio_set()
487 .base = -1,
499 unsigned int val; in winbond_gpio_configure_port0_pins()
522 static bool winbond_gpio_configure_port(unsigned long base, unsigned int idx) in winbond_gpio_configure_port()
525 const struct winbond_gpio_port_conflict *conflict = &info->conflict; in winbond_gpio_configure_port()
528 if (conflict->name != NULL) { in winbond_gpio_configure_port()
529 if (conflict->dev != WB_SIO_DEV_NONE) in winbond_gpio_configure_port()
530 winbond_sio_select_logical(base, conflict->dev); in winbond_gpio_configure_port()
532 if (winbond_sio_reg_btest(base, conflict->testreg, in winbond_gpio_configure_port()
533 conflict->testbit)) { in winbond_gpio_configure_port()
534 if (conflict->warnonly) in winbond_gpio_configure_port()
536 idx + 1, conflict->name); in winbond_gpio_configure_port()
539 idx + 1, conflict->name); in winbond_gpio_configure_port()
551 winbond_sio_select_logical(base, info->dev); in winbond_gpio_configure_port()
553 winbond_sio_reg_bset(base, info->enablereg, info->enablebit); in winbond_gpio_configure_port()
556 winbond_sio_reg_bset(base, info->outputreg, in winbond_gpio_configure_port()
557 info->outputppbit); in winbond_gpio_configure_port()
559 winbond_sio_reg_bclear(base, info->outputreg, in winbond_gpio_configure_port()
560 info->outputppbit); in winbond_gpio_configure_port()
563 winbond_sio_reg_btest(base, info->outputreg, in winbond_gpio_configure_port()
564 info->outputppbit) ? in winbond_gpio_configure_port()
565 "push-pull" : in winbond_gpio_configure_port()
571 static int winbond_gpio_configure(unsigned long base) in winbond_gpio_configure()
575 for_each_set_bit(i, &params.gpios, BITS_PER_LONG) in winbond_gpio_configure()
577 __clear_bit(i, &params.gpios); in winbond_gpio_configure()
579 if (!params.gpios) { in winbond_gpio_configure()
580 pr_err("please use 'gpios' module parameter to select some active GPIO ports to enable\n"); in winbond_gpio_configure()
581 return -EINVAL; in winbond_gpio_configure()
587 static int winbond_gpio_check_chip(unsigned long base) in winbond_gpio_check_chip()
589 int ret; in winbond_gpio_check_chip()
590 unsigned int chip; in winbond_gpio_check_chip()
604 ret = -ENODEV; in winbond_gpio_check_chip()
612 static int winbond_gpio_imatch(struct device *dev, unsigned int id) in winbond_gpio_imatch()
615 int ret; in winbond_gpio_imatch()
617 gpios_rem = params.gpios & ~GENMASK(ARRAY_SIZE(winbond_gpio_infos) - 1, in winbond_gpio_imatch()
622 params.gpios &= ~gpios_rem; in winbond_gpio_imatch()
626 pr_err("some GPIO ports are set both to push-pull and open drain mode at the same time\n"); in winbond_gpio_imatch()
641 if (ret != -ENODEV && ret != -EBUSY) in winbond_gpio_imatch()
648 static int winbond_gpio_iprobe(struct device *dev, unsigned int id) in winbond_gpio_iprobe()
650 int ret; in winbond_gpio_iprobe()
653 return -EINVAL; in winbond_gpio_iprobe()
667 * Add 8 gpios for every GPIO port that was enabled in gpios in winbond_gpio_iprobe()
671 winbond_gpio_chip.ngpio = hweight_long(params.gpios) * 8; in winbond_gpio_iprobe()
677 if (params.gpios & BIT(5)) in winbond_gpio_iprobe()
678 winbond_gpio_chip.ngpio -= (8 - 5); in winbond_gpio_iprobe()
697 "I/O port base (when unset - probe chip default ones)");
700 module_param_named(gpios, params.gpios, ulong, 0444);
701 MODULE_PARM_DESC(gpios,
702 "bitmask of GPIO ports to enable (bit 0 - GPIO1, bit 1 - GPIO2, etc.");
706 * It can't be a one bitmask since we need three values per port: push-pull,
707 * open-drain and keep as-is (this is the default).
711 "bitmask of GPIO ports to set to push-pull mode (bit 0 - GPIO1, bit 1 - GPIO2, etc.");
715 "bitmask of GPIO ports to set to open drain mode (bit 0 - GPIO1, bit 1 - GPIO2, etc.");