On Thursday, May 11, 2023 8:39 PM, Andrew Lunn wrote: > > +static int txgbe_gpio_set_type(struct irq_data *d, unsigned int type) > > +{ > > + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); > > + irq_hw_number_t hwirq = irqd_to_hwirq(d); > > + struct wx *wx = gpiochip_get_data(gc); > > + u32 level, polarity; > > + > > + level = rd32(wx, WX_GPIO_INTTYPE_LEVEL); > > + polarity = rd32(wx, WX_GPIO_POLARITY); > > + > > + switch (type) { > > + case IRQ_TYPE_EDGE_BOTH: > > + level |= BIT(hwirq); > > + break; > > + case IRQ_TYPE_EDGE_RISING: > > + level |= BIT(hwirq); > > + polarity |= BIT(hwirq); > > + break; > > + case IRQ_TYPE_EDGE_FALLING: > > + level |= BIT(hwirq); > > + polarity &= ~BIT(hwirq); > > + break; > > + case IRQ_TYPE_LEVEL_HIGH: > > + level &= ~BIT(hwirq); > > + polarity |= BIT(hwirq); > > + break; > > + case IRQ_TYPE_LEVEL_LOW: > > + level &= ~BIT(hwirq); > > + polarity &= ~BIT(hwirq); > > + break; > > + } > > You have two configuration bits, level and polarity, yet handle 5 different types? > > > + wr32m(wx, WX_GPIO_INTEN, BIT(hwirq), BIT(hwirq)); > > + wr32(wx, WX_GPIO_INTTYPE_LEVEL, level); > > + if (type != IRQ_TYPE_EDGE_BOTH) > > + wr32(wx, WX_GPIO_POLARITY, polarity); > > If we are interested in both edges, then polarity is meaningless. So i can > understand not writing it. But how does the hardware know polarity should not > be used? I will add toggle trigger to set polarity in both edges, to solve the hysteretic interrupts problem that has been bothering me.