isp: Load firmware and fix ISP boot

Yay it's booting!!!

Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
This commit is contained in:
Patrik Jakobsson
2015-08-02 14:31:07 +02:00
parent 4c233a7f5f
commit ceb651f86a

47
isp.c
View File

@@ -12,6 +12,7 @@
#include <linux/delay.h>
#include <linux/acpi.h>
#include <linux/firmware.h>
#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;