Skip to content
Snippets Groups Projects
Commit 31ff0968 authored by Robert Chiras's avatar Robert Chiras Committed by Jason Liu
Browse files

MLK-20181-10: Improve the axi clock usage


Currently, the enable of the axi clock return status is ignored, causing
issues when the enable fails then we try to disable it. Therefore, it is
better to check the return status and disable it only when enable
succeeded.
Also, remove the helper functions around clk_axi, since we can directly
use the clk API function for enable/disable the clock. Those functions
are already checking for NULL clk and returning 0 if that's the case.

Signed-off-by: default avatarRobert Chiras <robert.chiras@nxp.com&gt;i>
Acked-by: default avatarLeonard Crestez <leonard.crestez@nxp.com>
parent b6a4f30d
No related merge requests found
...@@ -418,7 +418,7 @@ void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb) ...@@ -418,7 +418,7 @@ void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb)
if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ) if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ)
request_bus_freq(BUS_FREQ_HIGH); request_bus_freq(BUS_FREQ_HIGH);
mxsfb_enable_axi_clk(mxsfb); clk_prepare_enable(mxsfb->clk_axi);
writel(0, mxsfb->base + LCDC_CTRL); writel(0, mxsfb->base + LCDC_CTRL);
mxsfb_crtc_mode_set_nofb(mxsfb); mxsfb_crtc_mode_set_nofb(mxsfb);
...@@ -435,7 +435,7 @@ void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb) ...@@ -435,7 +435,7 @@ void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb)
void mxsfb_crtc_disable(struct mxsfb_drm_private *mxsfb) void mxsfb_crtc_disable(struct mxsfb_drm_private *mxsfb)
{ {
mxsfb_disable_controller(mxsfb); mxsfb_disable_controller(mxsfb);
mxsfb_disable_axi_clk(mxsfb); clk_disable_unprepare(mxsfb->clk_axi);
if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ) if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ)
release_bus_freq(BUS_FREQ_HIGH); release_bus_freq(BUS_FREQ_HIGH);
...@@ -466,9 +466,9 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb, ...@@ -466,9 +466,9 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb,
paddr = mxsfb_get_fb_paddr(mxsfb); paddr = mxsfb_get_fb_paddr(mxsfb);
if (paddr) { if (paddr) {
mxsfb_enable_axi_clk(mxsfb); clk_prepare_enable(mxsfb->clk_axi);
writel(paddr, mxsfb->base + mxsfb->devdata->next_buf); writel(paddr, mxsfb->base + mxsfb->devdata->next_buf);
mxsfb_disable_axi_clk(mxsfb); clk_disable_unprepare(mxsfb->clk_axi);
} }
if (!fb || !old_fb) if (!fb || !old_fb)
......
...@@ -103,18 +103,6 @@ drm_pipe_to_mxsfb_drm_private(struct drm_simple_display_pipe *pipe) ...@@ -103,18 +103,6 @@ drm_pipe_to_mxsfb_drm_private(struct drm_simple_display_pipe *pipe)
return container_of(pipe, struct mxsfb_drm_private, pipe); return container_of(pipe, struct mxsfb_drm_private, pipe);
} }
void mxsfb_enable_axi_clk(struct mxsfb_drm_private *mxsfb)
{
if (mxsfb->clk_axi)
clk_prepare_enable(mxsfb->clk_axi);
}
void mxsfb_disable_axi_clk(struct mxsfb_drm_private *mxsfb)
{
if (mxsfb->clk_axi)
clk_disable_unprepare(mxsfb->clk_axi);
}
/** /**
* mxsfb_atomic_helper_check - validate state object * mxsfb_atomic_helper_check - validate state object
* @dev: DRM device * @dev: DRM device
...@@ -415,25 +403,31 @@ static void mxsfb_lastclose(struct drm_device *drm) ...@@ -415,25 +403,31 @@ static void mxsfb_lastclose(struct drm_device *drm)
static int mxsfb_enable_vblank(struct drm_device *drm, unsigned int crtc) static int mxsfb_enable_vblank(struct drm_device *drm, unsigned int crtc)
{ {
struct mxsfb_drm_private *mxsfb = drm->dev_private; struct mxsfb_drm_private *mxsfb = drm->dev_private;
int ret = 0;
ret = clk_prepare_enable(mxsfb->clk_axi);
if (ret)
return ret;
/* Clear and enable VBLANK IRQ */ /* Clear and enable VBLANK IRQ */
mxsfb_enable_axi_clk(mxsfb);
writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR); writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR);
writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_SET); writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_SET);
mxsfb_disable_axi_clk(mxsfb); clk_disable_unprepare(mxsfb->clk_axi);
return 0; return ret;
} }
static void mxsfb_disable_vblank(struct drm_device *drm, unsigned int crtc) static void mxsfb_disable_vblank(struct drm_device *drm, unsigned int crtc)
{ {
struct mxsfb_drm_private *mxsfb = drm->dev_private; struct mxsfb_drm_private *mxsfb = drm->dev_private;
if (clk_prepare_enable(mxsfb->clk_axi))
return;
/* Disable and clear VBLANK IRQ */ /* Disable and clear VBLANK IRQ */
mxsfb_enable_axi_clk(mxsfb);
writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_CLR); writel(CTRL1_CUR_FRAME_DONE_IRQ_EN, mxsfb->base + LCDC_CTRL1 + REG_CLR);
writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR); writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR);
mxsfb_disable_axi_clk(mxsfb); clk_disable_unprepare(mxsfb->clk_axi);
} }
static void mxsfb_irq_preinstall(struct drm_device *drm) static void mxsfb_irq_preinstall(struct drm_device *drm)
...@@ -447,7 +441,7 @@ static irqreturn_t mxsfb_irq_handler(int irq, void *data) ...@@ -447,7 +441,7 @@ static irqreturn_t mxsfb_irq_handler(int irq, void *data)
struct mxsfb_drm_private *mxsfb = drm->dev_private; struct mxsfb_drm_private *mxsfb = drm->dev_private;
u32 reg; u32 reg;
mxsfb_enable_axi_clk(mxsfb); clk_prepare_enable(mxsfb->clk_axi);
reg = readl(mxsfb->base + LCDC_CTRL1); reg = readl(mxsfb->base + LCDC_CTRL1);
...@@ -456,7 +450,7 @@ static irqreturn_t mxsfb_irq_handler(int irq, void *data) ...@@ -456,7 +450,7 @@ static irqreturn_t mxsfb_irq_handler(int irq, void *data)
writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR); writel(CTRL1_CUR_FRAME_DONE_IRQ, mxsfb->base + LCDC_CTRL1 + REG_CLR);
mxsfb_disable_axi_clk(mxsfb); clk_disable_unprepare(mxsfb->clk_axi);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -48,9 +48,6 @@ struct mxsfb_drm_private { ...@@ -48,9 +48,6 @@ struct mxsfb_drm_private {
int mxsfb_setup_crtc(struct drm_device *dev); int mxsfb_setup_crtc(struct drm_device *dev);
int mxsfb_create_output(struct drm_device *dev); int mxsfb_create_output(struct drm_device *dev);
void mxsfb_enable_axi_clk(struct mxsfb_drm_private *mxsfb);
void mxsfb_disable_axi_clk(struct mxsfb_drm_private *mxsfb);
void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb); void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb);
void mxsfb_crtc_disable(struct mxsfb_drm_private *mxsfb); void mxsfb_crtc_disable(struct mxsfb_drm_private *mxsfb);
void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb, void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment