Hi Yinbo,
thanks for the new patch, it's starting to look really good!
The main point with offsets in the match data is very nice.
On Wed, Aug 23, 2023 at 5:34 AM Yinbo Zhu <zhuyinbo@xxxxxxxxxxx> wrote:
This patch was to add loongson 2k0500, 2k2000 and 3a5000 gpio chip(...)
driver support.
Signed-off-by: Yinbo Zhu <zhuyinbo@xxxxxxxxxxx>
static int loongson_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
{
+ unsigned int u;
struct platform_device *pdev = to_platform_device(chip->parent);
+ struct loongson_gpio_chip *lgpio = to_loongson_gpio_chip(chip);
+
+ if (lgpio->chip_data->mode == BIT_CTRL_MODE) {
+ u = readl(lgpio->reg_base + lgpio->chip_data->inten_offset + offset / 32 * 4);
+ u |= BIT(offset % 32);
+ writel(u, lgpio->reg_base + lgpio->chip_data->inten_offset + offset / 32 * 4);
This offset / 32 * 4 is really hard to read.
What about
/* Get the register index from offset then multiply by bytes per register */
(offset / 32) * 4
lgpio->reg_base = reg_base;
+ if (device_property_read_u32(dev, "ngpios", &ngpios) || !ngpios)
+ return -EINVAL;
+
+ ret = DIV_ROUND_UP(ngpios, 8);
+ switch (ret) {
+ case 1 ... 2:
+ io_width = ret;
+ break;
+ case 3 ... 4:
+ io_width = 0x4;
+ break;
+ case 5 ... 8:
+ io_width = 0x8;
+ break;
+ default:
+ dev_err(dev, "unsupported io width\n");
+ return -EINVAL;
+ }
Is it really a good idea to infer the register width from ngpios?
What about just putting this into the struct loongson_gpio_chip_data
as well? Certainly it will be fixed for a certain device.