Lines Matching +full:nr +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0-or-later
17 (c) 1999-2002 Gerd Knorr
23 (c) 2005-2006 Nickolay V. Shmyrev
61 #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
62 #define bgread(adr) readl(bg->mmio+(adr))
65 static int modparam_gpiobase = -1/* dynamic */;
67 MODULE_PARM_DESC(gpiobase, "The GPIO number base. -1 means dynamic, which is the default.");
70 static int bt8xxgpio_gpio_direction_input(struct gpio_chip *gpio, unsigned nr) in bt8xxgpio_gpio_direction_input() argument
75 guard(spinlock_irqsave)(&bg->lock); in bt8xxgpio_gpio_direction_input()
78 data &= ~(1 << nr); in bt8xxgpio_gpio_direction_input()
82 outen &= ~(1 << nr); in bt8xxgpio_gpio_direction_input()
88 static int bt8xxgpio_gpio_get(struct gpio_chip *gpio, unsigned nr) in bt8xxgpio_gpio_get() argument
93 guard(spinlock_irqsave)(&bg->lock); in bt8xxgpio_gpio_get()
97 return !!(val & (1 << nr)); in bt8xxgpio_gpio_get()
101 unsigned nr, int val) in bt8xxgpio_gpio_direction_output() argument
106 guard(spinlock_irqsave)(&bg->lock); in bt8xxgpio_gpio_direction_output()
109 outen |= (1 << nr); in bt8xxgpio_gpio_direction_output()
114 data |= (1 << nr); in bt8xxgpio_gpio_direction_output()
116 data &= ~(1 << nr); in bt8xxgpio_gpio_direction_output()
122 static int bt8xxgpio_gpio_set(struct gpio_chip *gpio, unsigned int nr, int val) in bt8xxgpio_gpio_set() argument
127 guard(spinlock_irqsave)(&bg->lock); in bt8xxgpio_gpio_set()
131 data |= (1 << nr); in bt8xxgpio_gpio_set()
133 data &= ~(1 << nr); in bt8xxgpio_gpio_set()
141 struct gpio_chip *c = &bg->gpio; in bt8xxgpio_gpio_setup()
143 c->label = dev_name(&bg->pdev->dev); in bt8xxgpio_gpio_setup()
144 c->owner = THIS_MODULE; in bt8xxgpio_gpio_setup()
145 c->direction_input = bt8xxgpio_gpio_direction_input; in bt8xxgpio_gpio_setup()
146 c->get = bt8xxgpio_gpio_get; in bt8xxgpio_gpio_setup()
147 c->direction_output = bt8xxgpio_gpio_direction_output; in bt8xxgpio_gpio_setup()
148 c->set = bt8xxgpio_gpio_set; in bt8xxgpio_gpio_setup()
149 c->dbg_show = NULL; in bt8xxgpio_gpio_setup()
150 c->base = modparam_gpiobase; in bt8xxgpio_gpio_setup()
151 c->ngpio = BT8XXGPIO_NR_GPIOS; in bt8xxgpio_gpio_setup()
152 c->can_sleep = false; in bt8xxgpio_gpio_setup()
161 bg = devm_kzalloc(&dev->dev, sizeof(struct bt8xxgpio), GFP_KERNEL); in bt8xxgpio_probe()
163 return -ENOMEM; in bt8xxgpio_probe()
165 bg->pdev = dev; in bt8xxgpio_probe()
166 spin_lock_init(&bg->lock); in bt8xxgpio_probe()
170 dev_err(&dev->dev, "can't enable device.\n"); in bt8xxgpio_probe()
173 if (!devm_request_mem_region(&dev->dev, pci_resource_start(dev, 0), in bt8xxgpio_probe()
176 dev_warn(&dev->dev, "can't request iomem (0x%llx).\n", in bt8xxgpio_probe()
178 err = -EBUSY; in bt8xxgpio_probe()
184 bg->mmio = devm_ioremap(&dev->dev, pci_resource_start(dev, 0), 0x1000); in bt8xxgpio_probe()
185 if (!bg->mmio) { in bt8xxgpio_probe()
186 dev_err(&dev->dev, "ioremap() failed\n"); in bt8xxgpio_probe()
187 err = -EIO; in bt8xxgpio_probe()
200 err = gpiochip_add_data(&bg->gpio, bg); in bt8xxgpio_probe()
202 dev_err(&dev->dev, "failed to register GPIOs\n"); in bt8xxgpio_probe()
218 gpiochip_remove(&bg->gpio); in bt8xxgpio_remove()
232 scoped_guard(spinlock_irqsave, &bg->lock) { in bt8xxgpio_suspend()
233 bg->saved_outen = bgread(BT848_GPIO_OUT_EN); in bt8xxgpio_suspend()
234 bg->saved_data = bgread(BT848_GPIO_DATA); in bt8xxgpio_suspend()
259 guard(spinlock_irqsave)(&bg->lock); in bt8xxgpio_resume()
264 bgwrite(bg->saved_outen, BT848_GPIO_OUT_EN); in bt8xxgpio_resume()
265 bgwrite(bg->saved_data & bg->saved_outen, in bt8xxgpio_resume()