static int rzg2l_irq_set_type(struct irq_data *d, unsigned int type)
 {
-       unsigned int hw_irq = irqd_to_hwirq(d) - IRQC_IRQ_START;
        struct rzg2l_irqc_priv *priv = irq_data_to_priv(d);
+       unsigned int hwirq = irqd_to_hwirq(d);
+       u32 iitseln = hwirq - IRQC_IRQ_START;
+       bool clear_irq_int = false;
        u16 sense, tmp;
 
        switch (type & IRQ_TYPE_SENSE_MASK) {
 
        case IRQ_TYPE_EDGE_FALLING:
                sense = IITSR_IITSEL_EDGE_FALLING;
+               clear_irq_int = true;
                break;
 
        case IRQ_TYPE_EDGE_RISING:
                sense = IITSR_IITSEL_EDGE_RISING;
+               clear_irq_int = true;
                break;
 
        case IRQ_TYPE_EDGE_BOTH:
                sense = IITSR_IITSEL_EDGE_BOTH;
+               clear_irq_int = true;
                break;
 
        default:
 
        raw_spin_lock(&priv->lock);
        tmp = readl_relaxed(priv->base + IITSR);
-       tmp &= ~IITSR_IITSEL_MASK(hw_irq);
-       tmp |= IITSR_IITSEL(hw_irq, sense);
+       tmp &= ~IITSR_IITSEL_MASK(iitseln);
+       tmp |= IITSR_IITSEL(iitseln, sense);
+       if (clear_irq_int)
+               rzg2l_clear_irq_int(priv, hwirq);
        writel_relaxed(tmp, priv->base + IITSR);
        raw_spin_unlock(&priv->lock);
 
        return 0;
 }
 
+static u32 rzg2l_disable_tint_and_set_tint_source(struct irq_data *d, struct rzg2l_irqc_priv *priv,
+                                                 u32 reg, u32 tssr_offset, u8 tssr_index)
+{
+       u32 tint = (u32)(uintptr_t)irq_data_get_irq_chip_data(d);
+       u32 tien = reg & (TIEN << TSSEL_SHIFT(tssr_offset));
+
+       /* Clear the relevant byte in reg */
+       reg &= ~(TSSEL_MASK << TSSEL_SHIFT(tssr_offset));
+       /* Set TINT and leave TIEN clear */
+       reg |= tint << TSSEL_SHIFT(tssr_offset);
+       writel_relaxed(reg, priv->base + TSSR(tssr_index));
+
+       return reg | tien;
+}
+
 static int rzg2l_tint_set_edge(struct irq_data *d, unsigned int type)
 {
        struct rzg2l_irqc_priv *priv = irq_data_to_priv(d);
        unsigned int hwirq = irqd_to_hwirq(d);
        u32 titseln = hwirq - IRQC_TINT_START;
+       u32 tssr_offset = TSSR_OFFSET(titseln);
+       u8 tssr_index = TSSR_INDEX(titseln);
        u8 index, sense;
-       u32 reg;
+       u32 reg, tssr;
 
        switch (type & IRQ_TYPE_SENSE_MASK) {
        case IRQ_TYPE_EDGE_RISING:
        }
 
        raw_spin_lock(&priv->lock);
+       tssr = readl_relaxed(priv->base + TSSR(tssr_index));
+       tssr = rzg2l_disable_tint_and_set_tint_source(d, priv, tssr, tssr_offset, tssr_index);
        reg = readl_relaxed(priv->base + TITSR(index));
        reg &= ~(IRQ_MASK << (titseln * TITSEL_WIDTH));
        reg |= sense << (titseln * TITSEL_WIDTH);
        writel_relaxed(reg, priv->base + TITSR(index));
+       rzg2l_clear_tint_int(priv, hwirq);
+       writel_relaxed(tssr, priv->base + TSSR(tssr_index));
        raw_spin_unlock(&priv->lock);
 
        return 0;