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.