162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Driver for the Conexant CX23885/7/8 PCIe bridge
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  AV device support routines - non-input, non-vl42_subdev routines
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *  Copyright (C) 2010  Andy Walls <awalls@md.metrocast.net>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "cx23885.h"
1162306a36Sopenharmony_ci#include "cx23885-av.h"
1262306a36Sopenharmony_ci#include "cx23885-video.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_civoid cx23885_av_work_handler(struct work_struct *work)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	struct cx23885_dev *dev =
1762306a36Sopenharmony_ci			   container_of(work, struct cx23885_dev, cx25840_work);
1862306a36Sopenharmony_ci	bool handled = false;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	v4l2_subdev_call(dev->sd_cx25840, core, interrupt_service_routine,
2162306a36Sopenharmony_ci			 PCI_MSK_AV_CORE, &handled);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	/* Getting here with the interrupt not handled
2462306a36Sopenharmony_ci	   then probbaly flatiron does have pending interrupts.
2562306a36Sopenharmony_ci	*/
2662306a36Sopenharmony_ci	if (!handled) {
2762306a36Sopenharmony_ci		/* clear left and right adc channel interrupt request flag */
2862306a36Sopenharmony_ci		cx23885_flatiron_write(dev, 0x1f,
2962306a36Sopenharmony_ci			cx23885_flatiron_read(dev, 0x1f) | 0x80);
3062306a36Sopenharmony_ci		cx23885_flatiron_write(dev, 0x23,
3162306a36Sopenharmony_ci			cx23885_flatiron_read(dev, 0x23) | 0x80);
3262306a36Sopenharmony_ci	}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	cx23885_irq_enable(dev, PCI_MSK_AV_CORE);
3562306a36Sopenharmony_ci}
36