• Home
  • Raw
  • Download

Lines Matching +full:fw +full:- +full:cfg +full:- +full:mmio

1 // SPDX-License-Identifier: GPL-2.0-only
7 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
138 mutex_lock(&wcnss->iris_lock); in qcom_wcnss_assign_iris()
140 wcnss->iris = iris; in qcom_wcnss_assign_iris()
141 wcnss->use_48mhz_xo = use_48mhz_xo; in qcom_wcnss_assign_iris()
143 mutex_unlock(&wcnss->iris_lock); in qcom_wcnss_assign_iris()
146 static int wcnss_load(struct rproc *rproc, const struct firmware *fw) in wcnss_load() argument
148 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv; in wcnss_load()
151 ret = qcom_mdt_load(wcnss->dev, fw, rproc->firmware, WCNSS_PAS_ID, in wcnss_load()
152 wcnss->mem_region, wcnss->mem_phys, in wcnss_load()
153 wcnss->mem_size, &wcnss->mem_reloc); in wcnss_load()
157 qcom_pil_info_store("wcnss", wcnss->mem_phys, wcnss->mem_size); in wcnss_load()
167 val = readl(wcnss->spare_out); in wcnss_indicate_nv_download()
169 writel(val, wcnss->spare_out); in wcnss_indicate_nv_download()
176 /* Clear PMU cfg register */ in wcnss_configure_iris()
177 writel(0, wcnss->pmu_cfg); in wcnss_configure_iris()
180 writel(val, wcnss->pmu_cfg); in wcnss_configure_iris()
184 if (wcnss->use_48mhz_xo) in wcnss_configure_iris()
188 writel(val, wcnss->pmu_cfg); in wcnss_configure_iris()
192 writel(val, wcnss->pmu_cfg); in wcnss_configure_iris()
195 while (readl(wcnss->pmu_cfg) & WCNSS_PMU_IRIS_RESET_STS) in wcnss_configure_iris()
200 writel(val, wcnss->pmu_cfg); in wcnss_configure_iris()
204 writel(val, wcnss->pmu_cfg); in wcnss_configure_iris()
207 while (readl(wcnss->pmu_cfg) & WCNSS_PMU_IRIS_XO_CFG_STS) in wcnss_configure_iris()
213 writel(val, wcnss->pmu_cfg); in wcnss_configure_iris()
221 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv; in wcnss_start()
224 mutex_lock(&wcnss->iris_lock); in wcnss_start()
225 if (!wcnss->iris) { in wcnss_start()
226 dev_err(wcnss->dev, "no iris registered\n"); in wcnss_start()
227 ret = -EINVAL; in wcnss_start()
231 ret = regulator_bulk_enable(wcnss->num_vregs, wcnss->vregs); in wcnss_start()
235 ret = qcom_iris_enable(wcnss->iris); in wcnss_start()
244 dev_err(wcnss->dev, in wcnss_start()
249 ret = wait_for_completion_timeout(&wcnss->start_done, in wcnss_start()
251 if (wcnss->ready_irq > 0 && ret == 0) { in wcnss_start()
253 dev_err(wcnss->dev, "start timed out\n"); in wcnss_start()
255 ret = -ETIMEDOUT; in wcnss_start()
262 qcom_iris_disable(wcnss->iris); in wcnss_start()
264 regulator_bulk_disable(wcnss->num_vregs, wcnss->vregs); in wcnss_start()
266 mutex_unlock(&wcnss->iris_lock); in wcnss_start()
273 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv; in wcnss_stop()
276 if (wcnss->state) { in wcnss_stop()
277 qcom_smem_state_update_bits(wcnss->state, in wcnss_stop()
278 BIT(wcnss->stop_bit), in wcnss_stop()
279 BIT(wcnss->stop_bit)); in wcnss_stop()
281 ret = wait_for_completion_timeout(&wcnss->stop_done, in wcnss_stop()
284 dev_err(wcnss->dev, "timed out on wait\n"); in wcnss_stop()
286 qcom_smem_state_update_bits(wcnss->state, in wcnss_stop()
287 BIT(wcnss->stop_bit), in wcnss_stop()
293 dev_err(wcnss->dev, "failed to shutdown: %d\n", ret); in wcnss_stop()
300 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv; in wcnss_da_to_va()
303 offset = da - wcnss->mem_reloc; in wcnss_da_to_va()
304 if (offset < 0 || offset + len > wcnss->mem_size) in wcnss_da_to_va()
307 return wcnss->mem_region + offset; in wcnss_da_to_va()
322 rproc_report_crash(wcnss->rproc, RPROC_WATCHDOG); in wcnss_wdog_interrupt()
335 dev_err(wcnss->dev, "fatal error received: %s\n", msg); in wcnss_fatal_interrupt()
337 rproc_report_crash(wcnss->rproc, RPROC_FATAL_ERROR); in wcnss_fatal_interrupt()
346 complete(&wcnss->start_done); in wcnss_ready_interrupt()
369 complete(&wcnss->stop_done); in wcnss_stop_ack_interrupt()
382 bulk = devm_kcalloc(wcnss->dev, in wcnss_init_regulators()
386 return -ENOMEM; in wcnss_init_regulators()
391 ret = devm_regulator_bulk_get(wcnss->dev, num_vregs, bulk); in wcnss_init_regulators()
405 wcnss->vregs = bulk; in wcnss_init_regulators()
406 wcnss->num_vregs = num_vregs; in wcnss_init_regulators()
422 dev_dbg(&pdev->dev, "no %s IRQ defined, ignoring\n", name); in wcnss_request_irq()
425 dev_err(&pdev->dev, "no %s IRQ defined\n", name); in wcnss_request_irq()
431 ret = devm_request_threaded_irq(&pdev->dev, ret, in wcnss_request_irq()
436 dev_err(&pdev->dev, "request %s IRQ failed\n", name); in wcnss_request_irq()
450 node = of_parse_phandle(wcnss->dev->of_node, "memory-region", 0); in wcnss_alloc_memory_region()
452 dev_err(wcnss->dev, "no memory-region specified\n"); in wcnss_alloc_memory_region()
453 return -EINVAL; in wcnss_alloc_memory_region()
461 wcnss->mem_phys = wcnss->mem_reloc = r.start; in wcnss_alloc_memory_region()
462 wcnss->mem_size = resource_size(&r); in wcnss_alloc_memory_region()
463 wcnss->mem_region = devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size); in wcnss_alloc_memory_region()
464 if (!wcnss->mem_region) { in wcnss_alloc_memory_region()
465 dev_err(wcnss->dev, "unable to map memory region: %pa+%zx\n", in wcnss_alloc_memory_region()
466 &r.start, wcnss->mem_size); in wcnss_alloc_memory_region()
467 return -EBUSY; in wcnss_alloc_memory_region()
479 void __iomem *mmio; in wcnss_probe() local
482 data = of_device_get_match_data(&pdev->dev); in wcnss_probe()
485 return -EPROBE_DEFER; in wcnss_probe()
488 dev_err(&pdev->dev, "PAS is not available for WCNSS\n"); in wcnss_probe()
489 return -ENXIO; in wcnss_probe()
492 rproc = rproc_alloc(&pdev->dev, pdev->name, &wcnss_ops, in wcnss_probe()
495 dev_err(&pdev->dev, "unable to allocate remoteproc\n"); in wcnss_probe()
496 return -ENOMEM; in wcnss_probe()
500 wcnss = (struct qcom_wcnss *)rproc->priv; in wcnss_probe()
501 wcnss->dev = &pdev->dev; in wcnss_probe()
502 wcnss->rproc = rproc; in wcnss_probe()
505 init_completion(&wcnss->start_done); in wcnss_probe()
506 init_completion(&wcnss->stop_done); in wcnss_probe()
508 mutex_init(&wcnss->iris_lock); in wcnss_probe()
511 mmio = devm_ioremap_resource(&pdev->dev, res); in wcnss_probe()
512 if (IS_ERR(mmio)) { in wcnss_probe()
513 ret = PTR_ERR(mmio); in wcnss_probe()
521 wcnss->pmu_cfg = mmio + data->pmu_offset; in wcnss_probe()
522 wcnss->spare_out = mmio + data->spare_offset; in wcnss_probe()
524 ret = wcnss_init_regulators(wcnss, data->vregs, data->num_vregs); in wcnss_probe()
531 wcnss->wdog_irq = ret; in wcnss_probe()
536 wcnss->fatal_irq = ret; in wcnss_probe()
541 wcnss->ready_irq = ret; in wcnss_probe()
546 wcnss->handover_irq = ret; in wcnss_probe()
548 ret = wcnss_request_irq(wcnss, pdev, "stop-ack", true, wcnss_stop_ack_interrupt); in wcnss_probe()
551 wcnss->stop_ack_irq = ret; in wcnss_probe()
553 if (wcnss->stop_ack_irq) { in wcnss_probe()
554 wcnss->state = qcom_smem_state_get(&pdev->dev, "stop", in wcnss_probe()
555 &wcnss->stop_bit); in wcnss_probe()
556 if (IS_ERR(wcnss->state)) { in wcnss_probe()
557 ret = PTR_ERR(wcnss->state); in wcnss_probe()
562 qcom_add_smd_subdev(rproc, &wcnss->smd_subdev); in wcnss_probe()
563 wcnss->sysmon = qcom_add_sysmon_subdev(rproc, "wcnss", WCNSS_SSCTL_ID); in wcnss_probe()
564 if (IS_ERR(wcnss->sysmon)) { in wcnss_probe()
565 ret = PTR_ERR(wcnss->sysmon); in wcnss_probe()
573 return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); in wcnss_probe()
585 of_platform_depopulate(&pdev->dev); in wcnss_remove()
587 qcom_smem_state_put(wcnss->state); in wcnss_remove()
588 rproc_del(wcnss->rproc); in wcnss_remove()
590 qcom_remove_sysmon_subdev(wcnss->sysmon); in wcnss_remove()
591 qcom_remove_smd_subdev(wcnss->rproc, &wcnss->smd_subdev); in wcnss_remove()
592 rproc_free(wcnss->rproc); in wcnss_remove()
598 { .compatible = "qcom,riva-pil", &riva_data },
599 { .compatible = "qcom,pronto-v1-pil", &pronto_v1_data },
600 { .compatible = "qcom,pronto-v2-pil", &pronto_v2_data },
609 .name = "qcom-wcnss-pil",