Lines Matching refs:wcnss
35 #define WCNSS_FIRMWARE_NAME "wcnss.mdt"
157 struct qcom_wcnss *wcnss = rproc->priv;
160 ret = qcom_mdt_load(wcnss->dev, fw, rproc->firmware, WCNSS_PAS_ID,
161 wcnss->mem_region, wcnss->mem_phys,
162 wcnss->mem_size, &wcnss->mem_reloc);
166 qcom_pil_info_store("wcnss", wcnss->mem_phys, wcnss->mem_size);
171 static void wcnss_indicate_nv_download(struct qcom_wcnss *wcnss)
176 val = readl(wcnss->spare_out);
178 writel(val, wcnss->spare_out);
181 static void wcnss_configure_iris(struct qcom_wcnss *wcnss)
186 writel(0, wcnss->pmu_cfg);
189 writel(val, wcnss->pmu_cfg);
193 if (wcnss->use_48mhz_xo)
197 writel(val, wcnss->pmu_cfg);
201 writel(val, wcnss->pmu_cfg);
204 while (readl(wcnss->pmu_cfg) & WCNSS_PMU_IRIS_RESET_STS)
209 writel(val, wcnss->pmu_cfg);
213 writel(val, wcnss->pmu_cfg);
216 while (readl(wcnss->pmu_cfg) & WCNSS_PMU_IRIS_XO_CFG_STS)
222 writel(val, wcnss->pmu_cfg);
230 struct qcom_wcnss *wcnss = rproc->priv;
233 mutex_lock(&wcnss->iris_lock);
234 if (!wcnss->iris) {
235 dev_err(wcnss->dev, "no iris registered\n");
240 for (i = 0; i < wcnss->num_pds; i++) {
241 dev_pm_genpd_set_performance_state(wcnss->pds[i], INT_MAX);
242 ret = pm_runtime_get_sync(wcnss->pds[i]);
244 pm_runtime_put_noidle(wcnss->pds[i]);
249 ret = regulator_bulk_enable(wcnss->num_vregs, wcnss->vregs);
253 ret = qcom_iris_enable(wcnss->iris);
257 wcnss_indicate_nv_download(wcnss);
258 wcnss_configure_iris(wcnss);
262 dev_err(wcnss->dev,
267 ret = wait_for_completion_timeout(&wcnss->start_done,
269 if (wcnss->ready_irq > 0 && ret == 0) {
271 dev_err(wcnss->dev, "start timed out\n");
280 qcom_iris_disable(wcnss->iris);
282 regulator_bulk_disable(wcnss->num_vregs, wcnss->vregs);
285 pm_runtime_put(wcnss->pds[i]);
286 dev_pm_genpd_set_performance_state(wcnss->pds[i], 0);
289 mutex_unlock(&wcnss->iris_lock);
296 struct qcom_wcnss *wcnss = rproc->priv;
299 if (wcnss->state) {
300 qcom_smem_state_update_bits(wcnss->state,
301 BIT(wcnss->stop_bit),
302 BIT(wcnss->stop_bit));
304 ret = wait_for_completion_timeout(&wcnss->stop_done,
307 dev_err(wcnss->dev, "timed out on wait\n");
309 qcom_smem_state_update_bits(wcnss->state,
310 BIT(wcnss->stop_bit),
316 dev_err(wcnss->dev, "failed to shutdown: %d\n", ret);
323 struct qcom_wcnss *wcnss = rproc->priv;
326 offset = da - wcnss->mem_reloc;
327 if (offset < 0 || offset + len > wcnss->mem_size)
330 return wcnss->mem_region + offset;
343 struct qcom_wcnss *wcnss = dev;
345 rproc_report_crash(wcnss->rproc, RPROC_WATCHDOG);
352 struct qcom_wcnss *wcnss = dev;
358 dev_err(wcnss->dev, "fatal error received: %s\n", msg);
360 rproc_report_crash(wcnss->rproc, RPROC_FATAL_ERROR);
367 struct qcom_wcnss *wcnss = dev;
369 complete(&wcnss->start_done);
390 struct qcom_wcnss *wcnss = dev;
392 complete(&wcnss->stop_done);
397 static int wcnss_init_pds(struct qcom_wcnss *wcnss,
406 wcnss->pds[i] = dev_pm_domain_attach_by_name(wcnss->dev, pd_names[i]);
407 if (IS_ERR_OR_NULL(wcnss->pds[i])) {
408 ret = PTR_ERR(wcnss->pds[i]) ? : -ENODATA;
410 dev_pm_domain_detach(wcnss->pds[i], false);
414 wcnss->num_pds = i;
419 static void wcnss_release_pds(struct qcom_wcnss *wcnss)
423 for (i = 0; i < wcnss->num_pds; i++)
424 dev_pm_domain_detach(wcnss->pds[i], false);
427 static int wcnss_init_regulators(struct qcom_wcnss *wcnss,
440 if (wcnss->num_pds)
445 bulk = devm_kcalloc(wcnss->dev,
454 ret = devm_regulator_bulk_get(wcnss->dev, num_vregs, bulk);
468 wcnss->vregs = bulk;
469 wcnss->num_vregs = num_vregs;
474 static int wcnss_request_irq(struct qcom_wcnss *wcnss,
497 "wcnss", wcnss);
507 static int wcnss_alloc_memory_region(struct qcom_wcnss *wcnss)
512 node = of_parse_phandle(wcnss->dev->of_node, "memory-region", 0);
518 dev_err(wcnss->dev, "unable to resolve memory-region\n");
522 wcnss->mem_phys = wcnss->mem_reloc = rmem->base;
523 wcnss->mem_size = rmem->size;
524 wcnss->mem_region = devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size);
525 if (!wcnss->mem_region) {
526 dev_err(wcnss->dev, "unable to map memory region: %pa+%zx\n",
527 &rmem->base, wcnss->mem_size);
538 struct qcom_wcnss *wcnss;
559 fw_name, sizeof(*wcnss));
566 wcnss = rproc->priv;
567 wcnss->dev = &pdev->dev;
568 wcnss->rproc = rproc;
569 platform_set_drvdata(pdev, wcnss);
571 init_completion(&wcnss->start_done);
572 init_completion(&wcnss->stop_done);
574 mutex_init(&wcnss->iris_lock);
582 ret = wcnss_alloc_memory_region(wcnss);
586 wcnss->pmu_cfg = mmio + data->pmu_offset;
587 wcnss->spare_out = mmio + data->spare_offset;
593 ret = wcnss_init_pds(wcnss, data->pd_names);
597 ret = wcnss_init_regulators(wcnss, data->vregs, data->num_vregs,
602 ret = wcnss_request_irq(wcnss, pdev, "wdog", false, wcnss_wdog_interrupt);
605 wcnss->wdog_irq = ret;
607 ret = wcnss_request_irq(wcnss, pdev, "fatal", false, wcnss_fatal_interrupt);
610 wcnss->fatal_irq = ret;
612 ret = wcnss_request_irq(wcnss, pdev, "ready", true, wcnss_ready_interrupt);
615 wcnss->ready_irq = ret;
617 ret = wcnss_request_irq(wcnss, pdev, "handover", true, wcnss_handover_interrupt);
620 wcnss->handover_irq = ret;
622 ret = wcnss_request_irq(wcnss, pdev, "stop-ack", true, wcnss_stop_ack_interrupt);
625 wcnss->stop_ack_irq = ret;
627 if (wcnss->stop_ack_irq) {
628 wcnss->state = devm_qcom_smem_state_get(&pdev->dev, "stop",
629 &wcnss->stop_bit);
630 if (IS_ERR(wcnss->state)) {
631 ret = PTR_ERR(wcnss->state);
636 qcom_add_smd_subdev(rproc, &wcnss->smd_subdev);
637 wcnss->sysmon = qcom_add_sysmon_subdev(rproc, "wcnss", WCNSS_SSCTL_ID);
638 if (IS_ERR(wcnss->sysmon)) {
639 ret = PTR_ERR(wcnss->sysmon);
643 wcnss->iris = qcom_iris_probe(&pdev->dev, &wcnss->use_48mhz_xo);
644 if (IS_ERR(wcnss->iris)) {
645 ret = PTR_ERR(wcnss->iris);
656 qcom_iris_remove(wcnss->iris);
658 wcnss_release_pds(wcnss);
667 struct qcom_wcnss *wcnss = platform_get_drvdata(pdev);
669 qcom_iris_remove(wcnss->iris);
671 rproc_del(wcnss->rproc);
673 qcom_remove_sysmon_subdev(wcnss->sysmon);
674 qcom_remove_smd_subdev(wcnss->rproc, &wcnss->smd_subdev);
675 wcnss_release_pds(wcnss);
676 rproc_free(wcnss->rproc);
692 .name = "qcom-wcnss-pil",