|
|
@@ -68,6 +68,12 @@ static DEFINE_MUTEX(knav_dev_lock);
|
|
|
idx < (kdev)->num_queues_in_use; \
|
|
|
idx++, inst = knav_queue_idx_to_inst(kdev, idx))
|
|
|
|
|
|
+/* All firmware file names end up here. List the firmware file names below.
|
|
|
+ * Newest followed by older ones. Search is done from start of the array
|
|
|
+ * until a firmware file is found.
|
|
|
+ */
|
|
|
+const char *knav_acc_firmwares[] = {"ks2_qmss_pdsp_acc48.bin"};
|
|
|
+
|
|
|
/**
|
|
|
* knav_queue_notify: qmss queue notfier call
|
|
|
*
|
|
|
@@ -1439,7 +1445,6 @@ static int knav_queue_init_pdsps(struct knav_device *kdev,
|
|
|
struct device *dev = kdev->dev;
|
|
|
struct knav_pdsp_info *pdsp;
|
|
|
struct device_node *child;
|
|
|
- int ret;
|
|
|
|
|
|
for_each_child_of_node(pdsps, child) {
|
|
|
pdsp = devm_kzalloc(dev, sizeof(*pdsp), GFP_KERNEL);
|
|
|
@@ -1448,17 +1453,6 @@ static int knav_queue_init_pdsps(struct knav_device *kdev,
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
pdsp->name = knav_queue_find_name(child);
|
|
|
- ret = of_property_read_string(child, "firmware",
|
|
|
- &pdsp->firmware);
|
|
|
- if (ret < 0 || !pdsp->firmware) {
|
|
|
- dev_err(dev, "unknown firmware for pdsp %s\n",
|
|
|
- pdsp->name);
|
|
|
- devm_kfree(dev, pdsp);
|
|
|
- continue;
|
|
|
- }
|
|
|
- dev_dbg(dev, "pdsp name %s fw name :%s\n", pdsp->name,
|
|
|
- pdsp->firmware);
|
|
|
-
|
|
|
pdsp->iram =
|
|
|
knav_queue_map_reg(kdev, child,
|
|
|
KNAV_QUEUE_PDSP_IRAM_REG_INDEX);
|
|
|
@@ -1489,9 +1483,9 @@ static int knav_queue_init_pdsps(struct knav_device *kdev,
|
|
|
}
|
|
|
of_property_read_u32(child, "id", &pdsp->id);
|
|
|
list_add_tail(&pdsp->list, &kdev->pdsps);
|
|
|
- dev_dbg(dev, "added pdsp %s: command %p, iram %p, regs %p, intd %p, firmware %s\n",
|
|
|
+ dev_dbg(dev, "added pdsp %s: command %p, iram %p, regs %p, intd %p\n",
|
|
|
pdsp->name, pdsp->command, pdsp->iram, pdsp->regs,
|
|
|
- pdsp->intd, pdsp->firmware);
|
|
|
+ pdsp->intd);
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -1518,14 +1512,29 @@ static int knav_queue_load_pdsp(struct knav_device *kdev,
|
|
|
{
|
|
|
int i, ret, fwlen;
|
|
|
const struct firmware *fw;
|
|
|
+ bool found = false;
|
|
|
u32 *fwdata;
|
|
|
|
|
|
- ret = request_firmware(&fw, pdsp->firmware, kdev->dev);
|
|
|
- if (ret) {
|
|
|
- dev_err(kdev->dev, "failed to get firmware %s for pdsp %s\n",
|
|
|
- pdsp->firmware, pdsp->name);
|
|
|
- return ret;
|
|
|
+ for (i = 0; i < ARRAY_SIZE(knav_acc_firmwares); i++) {
|
|
|
+ if (knav_acc_firmwares[i]) {
|
|
|
+ ret = request_firmware(&fw,
|
|
|
+ knav_acc_firmwares[i],
|
|
|
+ kdev->dev);
|
|
|
+ if (!ret) {
|
|
|
+ found = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!found) {
|
|
|
+ dev_err(kdev->dev, "failed to get firmware for pdsp\n");
|
|
|
+ return -ENODEV;
|
|
|
}
|
|
|
+
|
|
|
+ dev_info(kdev->dev, "firmware file %s downloaded for PDSP\n",
|
|
|
+ knav_acc_firmwares[i]);
|
|
|
+
|
|
|
writel_relaxed(pdsp->id + 1, pdsp->command + 0x18);
|
|
|
/* download the firmware */
|
|
|
fwdata = (u32 *)fw->data;
|