for (i = 0; i < pdata->num_channels; i++) {
ch = pdata->channels[i];
if (ch && ch->dev)
- nvhost_putchannel(ch);
+ nvhost_putchannel(ch, 1);
}
return 0;
}
atomic_inc(&ch->refcount);
}
-void nvhost_putchannel(struct nvhost_channel *ch)
+void nvhost_putchannel(struct nvhost_channel *ch, int cnt)
{
- if (!atomic_dec_if_positive(&ch->refcount))
- nvhost_channel_unmap(ch);
-}
-
+ int ref;
-void nvhost_putchannel_mult(struct nvhost_channel *ch, int cnt)
-{
- int i;
+ ref = atomic_sub_return(cnt, &ch->refcount);
- for (i = 0; i < cnt; i++)
- nvhost_putchannel(ch);
+ /* WARN on negative reference, with zero reference unmap channel*/
+ if (!ref)
+ nvhost_channel_unmap(ch);
+ else if (ref < 0)
+ WARN_ON(1);
}
int nvhost_channel_suspend(struct nvhost_channel *ch)