| .. | .. |
|---|
| 1 | | -/* |
|---|
| 2 | | - * Copyright (C) 2017 Socionext Inc. |
|---|
| 3 | | - * Author: Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 6 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 7 | | - * published by the Free Software Foundation. |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 10 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 11 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 12 | | - * GNU General Public License for more details. |
|---|
| 13 | | - */ |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
|---|
| 2 | +// |
|---|
| 3 | +// Copyright (C) 2017 Socionext Inc. |
|---|
| 4 | +// Author: Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|
| 14 | 5 | |
|---|
| 15 | | -#include <linux/bitops.h> |
|---|
| 6 | +#include <linux/bits.h> |
|---|
| 16 | 7 | #include <linux/gpio/driver.h> |
|---|
| 17 | 8 | #include <linux/irq.h> |
|---|
| 18 | 9 | #include <linux/irqdomain.h> |
|---|
| .. | .. |
|---|
| 23 | 14 | #include <linux/platform_device.h> |
|---|
| 24 | 15 | #include <linux/spinlock.h> |
|---|
| 25 | 16 | #include <dt-bindings/gpio/uniphier-gpio.h> |
|---|
| 26 | | - |
|---|
| 27 | | -#define UNIPHIER_GPIO_BANK_MASK \ |
|---|
| 28 | | - GENMASK((UNIPHIER_GPIO_LINES_PER_BANK) - 1, 0) |
|---|
| 29 | 17 | |
|---|
| 30 | 18 | #define UNIPHIER_GPIO_IRQ_MAX_NUM 24 |
|---|
| 31 | 19 | |
|---|
| .. | .. |
|---|
| 42 | 30 | struct irq_domain *domain; |
|---|
| 43 | 31 | void __iomem *regs; |
|---|
| 44 | 32 | spinlock_t lock; |
|---|
| 45 | | - u32 saved_vals[0]; |
|---|
| 33 | + u32 saved_vals[]; |
|---|
| 46 | 34 | }; |
|---|
| 47 | 35 | |
|---|
| 48 | 36 | static unsigned int uniphier_gpio_bank_to_reg(unsigned int bank) |
|---|
| .. | .. |
|---|
| 122 | 110 | static int uniphier_gpio_get_direction(struct gpio_chip *chip, |
|---|
| 123 | 111 | unsigned int offset) |
|---|
| 124 | 112 | { |
|---|
| 125 | | - return uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR); |
|---|
| 113 | + if (uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR)) |
|---|
| 114 | + return GPIO_LINE_DIRECTION_IN; |
|---|
| 115 | + |
|---|
| 116 | + return GPIO_LINE_DIRECTION_OUT; |
|---|
| 126 | 117 | } |
|---|
| 127 | 118 | |
|---|
| 128 | 119 | static int uniphier_gpio_direction_input(struct gpio_chip *chip, |
|---|
| .. | .. |
|---|
| 156 | 147 | static void uniphier_gpio_set_multiple(struct gpio_chip *chip, |
|---|
| 157 | 148 | unsigned long *mask, unsigned long *bits) |
|---|
| 158 | 149 | { |
|---|
| 159 | | - unsigned int bank, shift, bank_mask, bank_bits; |
|---|
| 160 | | - int i; |
|---|
| 150 | + unsigned long i, bank, bank_mask, bank_bits; |
|---|
| 161 | 151 | |
|---|
| 162 | | - for (i = 0; i < chip->ngpio; i += UNIPHIER_GPIO_LINES_PER_BANK) { |
|---|
| 152 | + for_each_set_clump8(i, bank_mask, mask, chip->ngpio) { |
|---|
| 163 | 153 | bank = i / UNIPHIER_GPIO_LINES_PER_BANK; |
|---|
| 164 | | - shift = i % BITS_PER_LONG; |
|---|
| 165 | | - bank_mask = (mask[BIT_WORD(i)] >> shift) & |
|---|
| 166 | | - UNIPHIER_GPIO_BANK_MASK; |
|---|
| 167 | | - bank_bits = bits[BIT_WORD(i)] >> shift; |
|---|
| 154 | + bank_bits = bitmap_get_value8(bits, i); |
|---|
| 168 | 155 | |
|---|
| 169 | 156 | uniphier_gpio_bank_write(chip, bank, UNIPHIER_GPIO_PORT_DATA, |
|---|
| 170 | 157 | bank_mask, bank_bits); |
|---|
| .. | .. |
|---|
| 355 | 342 | struct uniphier_gpio_priv *priv; |
|---|
| 356 | 343 | struct gpio_chip *chip; |
|---|
| 357 | 344 | struct irq_chip *irq_chip; |
|---|
| 358 | | - struct resource *regs; |
|---|
| 359 | 345 | unsigned int nregs; |
|---|
| 360 | 346 | u32 ngpios; |
|---|
| 361 | 347 | int ret; |
|---|
| .. | .. |
|---|
| 379 | 365 | if (!priv) |
|---|
| 380 | 366 | return -ENOMEM; |
|---|
| 381 | 367 | |
|---|
| 382 | | - regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 383 | | - priv->regs = devm_ioremap_resource(dev, regs); |
|---|
| 368 | + priv->regs = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 384 | 369 | if (IS_ERR(priv->regs)) |
|---|
| 385 | 370 | return PTR_ERR(priv->regs); |
|---|
| 386 | 371 | |
|---|