[PATCH v5 00/39] i.MX Media Driver
From: slongerbeam@gmail.com (Steve Longerbeam)
Date: 2017-03-12 20:39:50
Also in:
linux-devicetree, linux-media, lkml
On 03/12/2017 01:36 PM, Steve Longerbeam wrote:
On 03/12/2017 01:16 PM, Steve Longerbeam wrote:quoted
On 03/12/2017 12:44 PM, Steve Longerbeam wrote:quoted
On 03/12/2017 12:29 PM, Russell King - ARM Linux wrote:quoted
On Sun, Mar 12, 2017 at 12:21:45PM -0700, Steve Longerbeam wrote:quoted
There's actually nothing preventing userland from disabling a link multiple times, and imx_media_link_notify() complies, and so csi_s_power(OFF) gets called multiple times, and so that WARN_ON() in there is silly, I borrowed this from other MC driver examples, but it makes no sense to me, I'll remove it and prevent the power count from going negative.Hmm. So what happens if one of the CSI's links is enabled, and we disable a different link from the CSI several times? Doesn't that mean the power count will go to zero despite there being an enabled link?Yes, the CSI will be powered off even if it still has an enabled link. But one of its other links has been disabled, meaning the pipeline as a whole is disabled. So I think it makes sense to power down the CSI, the pipeline isn't usable at that point. And remember that the CSI does not allow both output pads to be enabled at the same time. If that were so then indeed there would be a problem, because it would mean there is another active pipeline that requires the CSI being powered on, but that's not the case. I think this is consistent with the other entities as well, but I will double check.At first I thought this could be a problem for one entity, the csi-2 receiver. It can enable all four of its output pads at once (if the input stream contains all 4 virtual channels, the csi-2 receiver must support demuxing all of them onto all 4 of its output pads). But after more review, this should not be an issue. If a csi-2 sink (a CSI or a CSI mux) link is disabled, the csi-2 receiver is no longer reachable from that sink, so attempts to disable the csi-2 via that path again is not possible. The other potential problem is disabling from the csi-2's own sink pad, but in that case the csi-2 no longer has a source, so again it makes sense to power off the csi-2 even if it has enabled output pads.But hold on, if my logic is correct, then why did the CSI power-off get reached in your case, multiple times? Yes I think there is a bug, link_notify() is not checking if the link has already been disabled. I will fix this. But I'm surprised media core's link_notify handling doesn't do this.
but it does:
int __media_entity_setup_link(struct media_link *link, u32 flags)
{
...
if (link->flags == flags)
return 0;
...
}
What the heck. Anyway, I'll track this down.
Steve
Steve