Lines Matching +full:chip +full:- +full:enable +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0+
24 /* global chip registers */
132 unsigned long gpios; member
145 return -EBUSY; in winbond_sio_enter()
149 * in order for chip to enter the "Extended Function Mode" 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)
229 * @enablereg: port enable bit register number
230 * @enablebit: index of a port enable bit
232 * @outputppbit: index of a push-pull output driver mode bit
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()
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()
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()
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()
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,
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()
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()
590 unsigned int chip; in winbond_gpio_check_chip() local
596 chip = winbond_sio_reg_read(base, WB_SIO_REG_CHIP_MSB) << 8; in winbond_gpio_check_chip()
597 chip |= winbond_sio_reg_read(base, WB_SIO_REG_CHIP_LSB); in winbond_gpio_check_chip()
599 pr_notice("chip ID at %lx is %.4x\n", base, chip); in winbond_gpio_check_chip()
601 if ((chip & WB_SIO_CHIP_ID_W83627UHG_MASK) != in winbond_gpio_check_chip()
603 pr_err("not an our chip\n"); in winbond_gpio_check_chip()
604 ret = -ENODEV; in winbond_gpio_check_chip()
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()
634 * if the 'base' module parameter is unset probe two chip default in winbond_gpio_imatch()
641 if (ret != -ENODEV && ret != -EBUSY) in winbond_gpio_imatch()
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)");
699 /* This parameter sets which GPIO devices (ports) we enable */
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.");
725 "enable changing value of GPIO2.0 bit (Power LED), default no.");
729 "enable changing value of GPIO2.1 bit (BEEP), default no.");