|
27 | 27 | #include <linux/soundwire/sdw.h> |
28 | 28 | #include <linux/soundwire/sdw_registers.h> |
29 | 29 | #include <linux/soundwire/sdw_type.h> |
| 30 | +#include <linux/pci.h> |
30 | 31 | #include <sound/sdca_function.h> |
31 | 32 | #include <sound/sdw.h> |
32 | 33 | #include <sound/soc.h> |
@@ -1172,19 +1173,42 @@ static const struct dev_pm_ops tas2783_sdca_pm = { |
1172 | 1173 | RUNTIME_PM_OPS(tas2783_sdca_dev_suspend, tas2783_sdca_dev_resume, NULL) |
1173 | 1174 | }; |
1174 | 1175 |
|
| 1176 | +static struct pci_dev *tas_get_hwid(struct sdw_slave *peripheral) |
| 1177 | +{ |
| 1178 | + struct device *dev = &peripheral->dev; |
| 1179 | + |
| 1180 | + for (; dev; dev = dev->parent) |
| 1181 | + if (dev->bus == &pci_bus_type) |
| 1182 | + return to_pci_dev(dev); |
| 1183 | + |
| 1184 | + return NULL; |
| 1185 | +} |
| 1186 | + |
1175 | 1187 | static s32 tas_io_init(struct device *dev, struct sdw_slave *slave) |
1176 | 1188 | { |
| 1189 | + struct pci_dev *pci; |
| 1190 | + struct sdw_bus *bus; |
1177 | 1191 | struct tas2783_prv *tas_dev = dev_get_drvdata(dev); |
1178 | 1192 | s32 ret; |
1179 | 1193 | u8 unique_id = tas_dev->sdw_peripheral->id.unique_id; |
1180 | 1194 |
|
1181 | 1195 | if (tas_dev->hw_init) |
1182 | 1196 | return 0; |
1183 | 1197 |
|
| 1198 | + pci = tas_get_hwid(slave); |
| 1199 | + if (!pci) { |
| 1200 | + dev_err(dev, "pci device id can't be read"); |
| 1201 | + return -EINVAL; |
| 1202 | + } |
| 1203 | + |
| 1204 | + bus = slave->bus; |
1184 | 1205 | tas_dev->fw_dl_task_done = false; |
1185 | 1206 | tas_dev->fw_dl_success = false; |
| 1207 | + |
| 1208 | + /* subsystem_id-link_id-unique_id */ |
1186 | 1209 | scnprintf(tas_dev->rca_binaryname, sizeof(tas_dev->rca_binaryname), |
1187 | | - "tas2783-%01x.bin", unique_id); |
| 1210 | + "%04X-%1X-%1X.bin", pci->subsystem_device, bus->link_id, |
| 1211 | + unique_id); |
1188 | 1212 |
|
1189 | 1213 | ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT, |
1190 | 1214 | tas_dev->rca_binaryname, tas_dev->dev, |
|
0 commit comments