From ceb651f86a39d17b03a829c6b949cbac8fea34fb Mon Sep 17 00:00:00 2001 From: Patrik Jakobsson Date: Sun, 2 Aug 2015 14:31:07 +0200 Subject: [PATCH] isp: Load firmware and fix ISP boot Yay it's booting!!! Signed-off-by: Patrik Jakobsson --- isp.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/isp.c b/isp.c index c1425c1..0cd7193 100644 --- a/isp.c +++ b/isp.c @@ -12,6 +12,7 @@ #include #include +#include #include "bcwc_drv.h" #include "bcwc_hw.h" #include "bcwc_reg.h" @@ -62,12 +63,48 @@ out: return ret; } +static int isp_enable_sensor(struct bcwc_private *dev_priv) +{ + return 0; +} + +static int isp_load_firmware(struct bcwc_private *dev_priv) +{ + const struct firmware *fw; + int ret = 0; + + ret = request_firmware(&fw, "fthd.bin", &dev_priv->pdev->dev); + + if (fw == NULL) + return ret; + + memcpy(dev_priv->s2_mem, fw->data, fw->size); + + dev_info(&dev_priv->pdev->dev, "Loaded firmware (size: %lukb)\n", + fw->size / 1024); + + release_firmware(fw); + + return ret; +} + int isp_init(struct bcwc_private *dev_priv) { u32 num_channels, queue_size; u32 reg; int i, retries; + isp_load_firmware(dev_priv); + + isp_acpi_set_power(dev_priv, 1); + mdelay(20); + + /* OSX driver configures the PCI bus here but we ignore it */ + + pci_set_power_state(dev_priv->pdev, PCI_D0); + + isp_enable_sensor(dev_priv); + BCWC_ISP_REG_WRITE(0, ISP_IPC_NUM_CHAN); bcwc_hw_pci_post(dev_priv); @@ -112,10 +149,10 @@ int isp_init(struct bcwc_private *dev_priv) bcwc_hw_pci_post(dev_priv); for (retries = 0; retries < 1000; retries++) { - reg = BCWC_ISP_REG_READ(ISP_REG_40004); - if ((reg & 0xff) == 0xf0) + reg = BCWC_ISP_REG_READ(ISP_REG_41000); + if ((reg & 0xf0) > 0) break; - udelay(10); + mdelay(10); } if (retries >= 1000) { @@ -123,6 +160,9 @@ int isp_init(struct bcwc_private *dev_priv) return -EIO; } + dev_info(&dev_priv->pdev->dev, "ISP woke up after %dms\n", + (retries - 1) * 10); + BCWC_ISP_REG_WRITE(0xffffffff, ISP_REG_41024); num_channels = BCWC_ISP_REG_READ(ISP_IPC_NUM_CHAN) + 1; @@ -156,7 +196,6 @@ int isp_init(struct bcwc_private *dev_priv) return 0; } - int isp_uninit(struct bcwc_private *dev_priv) { return 0;