09.02.2022 12:53, Sascha Hauer пишет:
> +static irqreturn_t vop2_isr(int irq, void *data)
> +{
> +     struct vop2 *vop2 = data;
> +     const struct vop2_data *vop2_data = vop2->data;
> +     uint32_t axi_irqs[VOP2_SYS_AXI_BUS_NUM];
> +     int ret = IRQ_NONE;
> +     int i;
> +
> +     /*
> +      * The irq is shared with the iommu. If the runtime-pm state of the
> +      * vop2-device is disabled the irq has to be targeted at the iommu.
> +      */
> +     if (!pm_runtime_get_if_in_use(vop2->dev))
> +             return IRQ_NONE;
> +
> +     for (i = 0; i < vop2_data->nr_vps; i++) {
> +             struct vop2_video_port *vp = &vop2->vps[i];
> +             struct drm_crtc *crtc = &vp->crtc;
> +             uint32_t irqs;
> +
> +             irqs = vop2_readl(vop2, RK3568_VP_INT_STATUS(vp->id));
> +             vop2_writel(vop2, RK3568_VP_INT_CLR(vp->id), irqs << 16 | irqs);
> +
> +             if (irqs & VP_INT_DSP_HOLD_VALID) {
> +                     complete(&vp->dsp_hold_completion);
> +                     ret = IRQ_HANDLED;
> +             }
> +
> +             if (irqs & VP_INT_FS_FIELD) {
> +                     unsigned long flags;
> +
> +                     drm_crtc_handle_vblank(crtc);
> +                     spin_lock_irqsave(&crtc->dev->event_lock, flags);

IRQ is disabled inside of ISR(), no need to save/restore the flags.

Reply via email to