static int cpm2_set_irq_type(struct irq_data *d, unsigned int flow_type)
 {
        unsigned int src = virq_to_hw(d->irq);
-       struct irq_desc *desc = irq_to_desc(d->irq);
        unsigned int vold, vnew, edibit;
 
        /* Port C interrupts are either IRQ_TYPE_EDGE_FALLING or
                        goto err_sense;
        }
 
-       desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
-       desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
-       if (flow_type & IRQ_TYPE_LEVEL_LOW)  {
-               desc->status |= IRQ_LEVEL;
-               desc->handle_irq = handle_level_irq;
-       } else
-               desc->handle_irq = handle_edge_irq;
+       irqd_set_trigger_type(d, flow_type);
+       if (flow_type & IRQ_TYPE_LEVEL_LOW)
+               __set_irq_handler_unlocked(d->irq, handle_level_irq);
+       else
+               __set_irq_handler_unlocked(d->irq, handle_edge_irq);
 
        /* internal IRQ senses are LEVEL_LOW
         * EXT IRQ and Port C IRQ senses are programmable
                if (src >= CPM2_IRQ_PORTC15 && src <= CPM2_IRQ_PORTC0)
                        edibit = (31 - (CPM2_IRQ_PORTC0 - src));
                else
-                       return (flow_type & IRQ_TYPE_LEVEL_LOW) ? 0 : -EINVAL;
+                       return (flow_type & IRQ_TYPE_LEVEL_LOW) ?
+                               IRQ_SET_MASK_OK_NOCOPY : -EINVAL;
 
        vold = in_be32(&cpm2_intctl->ic_siexr);
 
 
        if (vold != vnew)
                out_be32(&cpm2_intctl->ic_siexr, vnew);
-       return 0;
+       return IRQ_SET_MASK_OK_NOCOPY;
 
 err_sense:
        pr_err("CPM2 PIC: sense type 0x%x not supported\n", flow_type);