Commit 96d62ae2 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

[media] omap3isp: Configure HS/VS interrupt source before enabling interrupts

This needs to be performed before enabling interrupts as the sensor
might be free-running and the ISP default setting (HS edge) would put an
unnecessary burden on the CPU.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: default avatarSakari Ailus <sakari.ailus@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent be9a1b98
...@@ -252,13 +252,18 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel) ...@@ -252,13 +252,18 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
} }
/* /*
* isp_power_settings - Sysconfig settings, for Power Management. * isp_core_init - ISP core settings
* @isp: OMAP3 ISP device * @isp: OMAP3 ISP device
* @idle: Consider idle state. * @idle: Consider idle state.
* *
* Sets the power settings for the ISP, and SBL bus. * Set the power settings for the ISP and SBL bus and cConfigure the HS/VS
* interrupt source.
*
* We need to configure the HS/VS interrupt source before interrupts get
* enabled, as the sensor might be free-running and the ISP default setting
* (HS edge) would put an unnecessary burden on the CPU.
*/ */
static void isp_power_settings(struct isp_device *isp, int idle) static void isp_core_init(struct isp_device *isp, int idle)
{ {
isp_reg_writel(isp, isp_reg_writel(isp,
((idle ? ISP_SYSCONFIG_MIDLEMODE_SMARTSTANDBY : ((idle ? ISP_SYSCONFIG_MIDLEMODE_SMARTSTANDBY :
...@@ -268,9 +273,10 @@ static void isp_power_settings(struct isp_device *isp, int idle) ...@@ -268,9 +273,10 @@ static void isp_power_settings(struct isp_device *isp, int idle)
ISP_SYSCONFIG_AUTOIDLE : 0), ISP_SYSCONFIG_AUTOIDLE : 0),
OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG); OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG);
if (isp->autoidle) isp_reg_writel(isp,
isp_reg_writel(isp, ISPCTRL_SBL_AUTOIDLE, OMAP3_ISP_IOMEM_MAIN, (isp->autoidle ? ISPCTRL_SBL_AUTOIDLE : 0) |
ISP_CTRL); ISPCTRL_SYNC_DETECT_VSRISE,
OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
} }
/* /*
...@@ -323,9 +329,6 @@ void omap3isp_configure_bridge(struct isp_device *isp, ...@@ -323,9 +329,6 @@ void omap3isp_configure_bridge(struct isp_device *isp,
ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK; ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK;
ispctrl_val &= ~ISPCTRL_SYNC_DETECT_MASK;
ispctrl_val |= ISPCTRL_SYNC_DETECT_VSRISE;
isp_reg_writel(isp, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); isp_reg_writel(isp, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
} }
...@@ -1443,7 +1446,7 @@ static int isp_get_clocks(struct isp_device *isp) ...@@ -1443,7 +1446,7 @@ static int isp_get_clocks(struct isp_device *isp)
* *
* Return a pointer to the ISP device structure, or NULL if an error occurred. * Return a pointer to the ISP device structure, or NULL if an error occurred.
*/ */
struct isp_device *omap3isp_get(struct isp_device *isp) static struct isp_device *__omap3isp_get(struct isp_device *isp, bool irq)
{ {
struct isp_device *__isp = isp; struct isp_device *__isp = isp;
...@@ -1462,10 +1465,9 @@ struct isp_device *omap3isp_get(struct isp_device *isp) ...@@ -1462,10 +1465,9 @@ struct isp_device *omap3isp_get(struct isp_device *isp)
/* We don't want to restore context before saving it! */ /* We don't want to restore context before saving it! */
if (isp->has_context) if (isp->has_context)
isp_restore_ctx(isp); isp_restore_ctx(isp);
else
isp->has_context = 1;
isp_enable_interrupts(isp); if (irq)
isp_enable_interrupts(isp);
out: out:
if (__isp != NULL) if (__isp != NULL)
...@@ -1475,6 +1477,11 @@ struct isp_device *omap3isp_get(struct isp_device *isp) ...@@ -1475,6 +1477,11 @@ struct isp_device *omap3isp_get(struct isp_device *isp)
return __isp; return __isp;
} }
struct isp_device *omap3isp_get(struct isp_device *isp)
{
return __omap3isp_get(isp, true);
}
/* /*
* omap3isp_put - Release the ISP * omap3isp_put - Release the ISP
* *
...@@ -1490,8 +1497,10 @@ void omap3isp_put(struct isp_device *isp) ...@@ -1490,8 +1497,10 @@ void omap3isp_put(struct isp_device *isp)
BUG_ON(isp->ref_count == 0); BUG_ON(isp->ref_count == 0);
if (--isp->ref_count == 0) { if (--isp->ref_count == 0) {
isp_disable_interrupts(isp); isp_disable_interrupts(isp);
if (isp->domain) if (isp->domain) {
isp_save_ctx(isp); isp_save_ctx(isp);
isp->has_context = 1;
}
/* Reset the ISP if an entity has failed to stop. This is the /* Reset the ISP if an entity has failed to stop. This is the
* only way to recover from such conditions. * only way to recover from such conditions.
*/ */
...@@ -1975,7 +1984,7 @@ static int __devexit isp_remove(struct platform_device *pdev) ...@@ -1975,7 +1984,7 @@ static int __devexit isp_remove(struct platform_device *pdev)
isp_unregister_entities(isp); isp_unregister_entities(isp);
isp_cleanup_modules(isp); isp_cleanup_modules(isp);
omap3isp_get(isp); __omap3isp_get(isp, false);
iommu_detach_device(isp->domain, &pdev->dev); iommu_detach_device(isp->domain, &pdev->dev);
iommu_domain_free(isp->domain); iommu_domain_free(isp->domain);
isp->domain = NULL; isp->domain = NULL;
...@@ -2093,7 +2102,7 @@ static int __devinit isp_probe(struct platform_device *pdev) ...@@ -2093,7 +2102,7 @@ static int __devinit isp_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto error; goto error;
if (omap3isp_get(isp) == NULL) if (__omap3isp_get(isp, false) == NULL)
goto error; goto error;
ret = isp_reset(isp); ret = isp_reset(isp);
...@@ -2160,7 +2169,7 @@ static int __devinit isp_probe(struct platform_device *pdev) ...@@ -2160,7 +2169,7 @@ static int __devinit isp_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto error_modules; goto error_modules;
isp_power_settings(isp, 1); isp_core_init(isp, 1);
omap3isp_put(isp); omap3isp_put(isp);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment