From 3cc6e64906729599ce9e17d152475bf14bedceea Mon Sep 17 00:00:00 2001 From: Sven Schnelle Date: Thu, 26 Nov 2015 10:11:46 +0100 Subject: [PATCH] bcwc_pcie: load set file according to sensor id --- bcwc_drv.c | 10 +++++---- bcwc_drv.h | 2 ++ bcwc_isp.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- bcwc_isp.h | 13 +++++++++++- 4 files changed, 79 insertions(+), 7 deletions(-) diff --git a/bcwc_drv.c b/bcwc_drv.c index d1612fc..110e183 100644 --- a/bcwc_drv.c +++ b/bcwc_drv.c @@ -401,9 +401,6 @@ static int bcwc_firmware_start(struct bcwc_private *dev_priv) return ret; ret = bcwc_isp_cmd_print_enable(dev_priv, 1); - if (ret) - return ret; - ret = bcwc_isp_cmd_set_loadfile(dev_priv); if (ret) return ret; @@ -411,7 +408,12 @@ static int bcwc_firmware_start(struct bcwc_private *dev_priv) if (ret) return ret; - return bcwc_isp_cmd_channel_info(dev_priv); + ret = bcwc_isp_cmd_channel_info(dev_priv); + if (ret) + return ret; + + return bcwc_isp_cmd_set_loadfile(dev_priv); + } static int bcwc_pci_probe(struct pci_dev *pdev, diff --git a/bcwc_drv.h b/bcwc_drv.h index 5f7b2a7..01869dc 100644 --- a/bcwc_drv.h +++ b/bcwc_drv.h @@ -122,6 +122,8 @@ struct bcwc_private { /* camera config */ int sensor_count; + int sensor_id0; + int sensor_id1; struct bcwc_fmt fmt; diff --git a/bcwc_isp.c b/bcwc_isp.c index 1f5ab3e..3d4b729 100644 --- a/bcwc_isp.c +++ b/bcwc_isp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "bcwc_drv.h" #include "bcwc_hw.h" #include "bcwc_reg.h" @@ -145,7 +146,7 @@ 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); + ret = request_firmware(&fw, "bcwc/firmware.bin", &dev_priv->pdev->dev); if (ret) return ret; @@ -441,13 +442,66 @@ int bcwc_isp_cmd_set_loadfile(struct bcwc_private *dev_priv) struct isp_cmd_set_loadfile cmd; struct isp_mem_obj *file; const struct firmware *fw; + const char *filename = NULL; + const char *vendor, *board; int ret = 0; pr_debug("set loadfile\n"); + vendor = dmi_get_system_info(DMI_BOARD_VENDOR); + board = dmi_get_system_info(DMI_BOARD_NAME); + memset(&cmd, 0, sizeof(cmd)); - ret = request_firmware(&fw, "fthd_set.bin", &dev_priv->pdev->dev); + switch(dev_priv->sensor_id1) { + case 0x164: + filename = "bcwc/8221_01XX.dat"; + break; + case 0x190: + filename = "bcwc/1222_01XX.dat"; + break; + case 0x8830: + filename = "bcwc/9112_01XX.dat"; + break; + case 0x9770: + if (vendor && board && !strcmp(vendor, "Apple Inc.") && + !strncmp(board, "MacBookAir", sizeof("MacBookAir")-1)) { + filename = "bcwc/1771_01XX.dat"; + break; + } + + switch(dev_priv->sensor_id0) { + case 4: + filename = "bcwc/1874_01XX.dat"; + break; + default: + filename = "bcwc/1871_01XX.dat"; + break; + } + break; + case 0x9774: + switch(dev_priv->sensor_id0) { + case 4: + filename = "bcwc/1674_01XX.dat"; + break; + case 5: + filename = "bcwc/1675_01XX.dat"; + break; + default: + filename = "bcwc/1671_01XX.dat"; + break; + } + break; + default: + break; + + } + if (!filename) { + pr_err("no set file for sensorid %04x %04x found\n", + dev_priv->sensor_id0, dev_priv->sensor_id1); + return -EINVAL; + } + ret = request_firmware(&fw, filename, &dev_priv->pdev->dev); if (ret) return ret; @@ -477,6 +531,7 @@ int bcwc_isp_cmd_channel_info(struct bcwc_private *dev_priv) len = sizeof(cmd); ret = bcwc_isp_cmd(dev_priv, CISP_CMD_CH_INFO_GET, &cmd, sizeof(cmd), &len); print_hex_dump_bytes("CHINFO ", DUMP_PREFIX_OFFSET, &cmd, sizeof(cmd)); + pr_debug("sensor id: %04x %04x\n", cmd.sensorid0, cmd.sensorid1); pr_debug("sensor count: %d\n", cmd.sensor_count); pr_debug("camera module serial number string: %s\n", cmd.camera_module_serial_number); pr_debug("sensor serial number: %02X%02X%02X%02X%02X%02X%02X%02X\n", @@ -484,6 +539,8 @@ int bcwc_isp_cmd_channel_info(struct bcwc_private *dev_priv) cmd.sensor_serial_number[2], cmd.sensor_serial_number[3], cmd.sensor_serial_number[4], cmd.sensor_serial_number[5], cmd.sensor_serial_number[6], cmd.sensor_serial_number[7]); + dev_priv->sensor_id0 = cmd.sensorid0; + dev_priv->sensor_id1 = cmd.sensorid1; dev_priv->sensor_count = cmd.sensor_count; return ret; } diff --git a/bcwc_isp.h b/bcwc_isp.h index 2282df5..08e2e72 100644 --- a/bcwc_isp.h +++ b/bcwc_isp.h @@ -497,7 +497,18 @@ struct isp_cmd_set_loadfile { } __attribute__((packed)); struct isp_cmd_channel_info { - u8 unknown[88]; + u32 field_0; + u32 field_4; + u32 field_8; + u32 field_c; + u16 sensorid0; /* field 10 */ + u16 field_12; + u32 field_14; + u16 sensorid1; /* field 18 */ + u16 field_1a; + u32 field_1c; + u32 field_20; + u8 unknown[52]; u32 sensor_count; u8 unknown2[40]; u8 sensor_serial_number[8];