Skip to content

Commit

Permalink
staging: drm/imx: make waiting for idle channel optional
Browse files Browse the repository at this point in the history
Currently we wait for a channel until it's idle before actually
disabling it. This is not needed for all channels though, so make
waiting for idle a separate function and call it where necessary.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Sascha Hauer authored and Greg Kroah-Hartman committed Oct 11, 2013
1 parent 0b18641 commit fb822a3
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 9 deletions.
1 change: 1 addition & 0 deletions drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ void ipu_idmac_put(struct ipuv3_channel *);

int ipu_idmac_enable_channel(struct ipuv3_channel *channel);
int ipu_idmac_disable_channel(struct ipuv3_channel *channel);
int ipu_idmac_wait_busy(struct ipuv3_channel *channel, int ms);

void ipu_idmac_set_double_buffer(struct ipuv3_channel *channel,
bool doublebuffer);
Expand Down
23 changes: 14 additions & 9 deletions drivers/staging/imx-drm/ipu-v3/ipu-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -698,24 +698,29 @@ int ipu_idmac_enable_channel(struct ipuv3_channel *channel)
}
EXPORT_SYMBOL_GPL(ipu_idmac_enable_channel);

int ipu_idmac_disable_channel(struct ipuv3_channel *channel)
int ipu_idmac_wait_busy(struct ipuv3_channel *channel, int ms)
{
struct ipu_soc *ipu = channel->ipu;
u32 val;
unsigned long flags;
unsigned long timeout;

timeout = jiffies + msecs_to_jiffies(50);
timeout = jiffies + msecs_to_jiffies(ms);
while (ipu_idmac_read(ipu, IDMAC_CHA_BUSY(channel->num)) &
idma_mask(channel->num)) {
if (time_after(jiffies, timeout)) {
dev_warn(ipu->dev, "disabling busy idmac channel %d\n",
channel->num);
break;
}
if (time_after(jiffies, timeout))
return -ETIMEDOUT;
cpu_relax();
}

return 0;
}
EXPORT_SYMBOL_GPL(ipu_idmac_wait_busy);

int ipu_idmac_disable_channel(struct ipuv3_channel *channel)
{
struct ipu_soc *ipu = channel->ipu;
u32 val;
unsigned long flags;

spin_lock_irqsave(&ipu->lock, flags);

/* Disable DMA channel(s) */
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/imx-drm/ipuv3-crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ static void ipu_fb_disable(struct ipu_crtc *ipu_crtc)
if (ipu_crtc->dp)
ipu_dp_disable_channel(ipu_crtc->dp);
ipu_dc_disable_channel(ipu_crtc->dc);
ipu_idmac_wait_busy(ipu_crtc->ipu_ch, 50);
ipu_idmac_disable_channel(ipu_crtc->ipu_ch);
ipu_dmfc_disable_channel(ipu_crtc->dmfc);
ipu_di_disable(ipu_crtc->di);
Expand Down

0 comments on commit fb822a3

Please sign in to comment.