diff --git a/bcwc_drv.c b/bcwc_drv.c index 8428b3b..2742457 100644 --- a/bcwc_drv.c +++ b/bcwc_drv.c @@ -87,6 +87,7 @@ static int bcwc_pci_reserve_mem(struct bcwc_private *dev_priv) static void bcwc_irq_work(struct work_struct *work) { + printk("BCWC interrupt\n"); } static irqreturn_t bcwc_irq_handler(int irq, void *arg) @@ -205,6 +206,7 @@ static void bcwc_pci_remove(struct pci_dev *pdev) dev_priv = pci_get_drvdata(pdev); + bcwc_hw_deinit(dev_priv); if (dev_priv) { isp_mem_destroy(dev_priv->firmware); bcwc_irq_disable(dev_priv); diff --git a/bcwc_hw.c b/bcwc_hw.c index 819bf56..fec8101 100644 --- a/bcwc_hw.c +++ b/bcwc_hw.c @@ -660,11 +660,13 @@ static int bcwc_hw_ddr_phy_save_regs(struct bcwc_private *dev_priv) static int bcwc_hw_irq_enable(struct bcwc_private *dev_priv) { + BCWC_ISP_REG_WRITE(0xf8, ISP_REG_41004); return 0; } static int bcwc_hw_irq_disable(struct bcwc_private *dev_priv) { + BCWC_ISP_REG_WRITE(0, ISP_REG_41004); return 0; } @@ -720,8 +722,18 @@ int bcwc_hw_init(struct bcwc_private *dev_priv) BCWC_ISP_REG_WRITE(0, ISP_REG_40004); - isp_init(dev_priv); + ret = isp_init(dev_priv); + if (ret) + goto out; + dev_info(&dev_priv->pdev->dev, "Enabling interrupts\n"); + bcwc_hw_irq_enable(dev_priv); out: return ret; } + +void bcwc_hw_deinit(struct bcwc_private *priv) +{ + dev_info(&priv->pdev->dev, "%s", __FUNCTION__); + bcwc_hw_irq_disable(priv); +} diff --git a/bcwc_hw.h b/bcwc_hw.h index f790192..36defa7 100644 --- a/bcwc_hw.h +++ b/bcwc_hw.h @@ -115,5 +115,5 @@ static inline void _BCWC_ISP_REG_WRITE(struct bcwc_private *dev_priv, u32 val, } extern int bcwc_hw_init(struct bcwc_private *dev_priv); - +extern void bcwc_hw_deinit(struct bcwc_private *priv); #endif diff --git a/bcwc_reg.h b/bcwc_reg.h index 2256a2e..8131ff6 100644 --- a/bcwc_reg.h +++ b/bcwc_reg.h @@ -160,6 +160,7 @@ #define ISP_REG_40004 0x40004 #define ISP_REG_40008 0x40008 #define ISP_REG_41000 0x41000 +#define ISP_REG_41004 0x41004 #define ISP_REG_41020 0x41020 #define ISP_REG_41024 0x41024