Lines Matching refs:wcnss

34 #define WCNSS_FIRMWARE_NAME		"wcnss.mdt"
134 void qcom_wcnss_assign_iris(struct qcom_wcnss *wcnss,
138 mutex_lock(&wcnss->iris_lock);
140 wcnss->iris = iris;
141 wcnss->use_48mhz_xo = use_48mhz_xo;
143 mutex_unlock(&wcnss->iris_lock);
148 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv;
151 ret = qcom_mdt_load(wcnss->dev, fw, rproc->firmware, WCNSS_PAS_ID,
152 wcnss->mem_region, wcnss->mem_phys,
153 wcnss->mem_size, &wcnss->mem_reloc);
157 qcom_pil_info_store("wcnss", wcnss->mem_phys, wcnss->mem_size);
162 static void wcnss_indicate_nv_download(struct qcom_wcnss *wcnss)
167 val = readl(wcnss->spare_out);
169 writel(val, wcnss->spare_out);
172 static void wcnss_configure_iris(struct qcom_wcnss *wcnss)
177 writel(0, wcnss->pmu_cfg);
180 writel(val, wcnss->pmu_cfg);
184 if (wcnss->use_48mhz_xo)
188 writel(val, wcnss->pmu_cfg);
192 writel(val, wcnss->pmu_cfg);
195 while (readl(wcnss->pmu_cfg) & WCNSS_PMU_IRIS_RESET_STS)
200 writel(val, wcnss->pmu_cfg);
204 writel(val, wcnss->pmu_cfg);
207 while (readl(wcnss->pmu_cfg) & WCNSS_PMU_IRIS_XO_CFG_STS)
213 writel(val, wcnss->pmu_cfg);
221 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv;
224 mutex_lock(&wcnss->iris_lock);
225 if (!wcnss->iris) {
226 dev_err(wcnss->dev, "no iris registered\n");
231 ret = regulator_bulk_enable(wcnss->num_vregs, wcnss->vregs);
235 ret = qcom_iris_enable(wcnss->iris);
239 wcnss_indicate_nv_download(wcnss);
240 wcnss_configure_iris(wcnss);
244 dev_err(wcnss->dev,
249 ret = wait_for_completion_timeout(&wcnss->start_done,
251 if (wcnss->ready_irq > 0 && ret == 0) {
253 dev_err(wcnss->dev, "start timed out\n");
262 qcom_iris_disable(wcnss->iris);
264 regulator_bulk_disable(wcnss->num_vregs, wcnss->vregs);
266 mutex_unlock(&wcnss->iris_lock);
273 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv;
276 if (wcnss->state) {
277 qcom_smem_state_update_bits(wcnss->state,
278 BIT(wcnss->stop_bit),
279 BIT(wcnss->stop_bit));
281 ret = wait_for_completion_timeout(&wcnss->stop_done,
284 dev_err(wcnss->dev, "timed out on wait\n");
286 qcom_smem_state_update_bits(wcnss->state,
287 BIT(wcnss->stop_bit),
293 dev_err(wcnss->dev, "failed to shutdown: %d\n", ret);
300 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv;
303 offset = da - wcnss->mem_reloc;
304 if (offset < 0 || offset + len > wcnss->mem_size)
307 return wcnss->mem_region + offset;
320 struct qcom_wcnss *wcnss = dev;
322 rproc_report_crash(wcnss->rproc, RPROC_WATCHDOG);
329 struct qcom_wcnss *wcnss = dev;
335 dev_err(wcnss->dev, "fatal error received: %s\n", msg);
337 rproc_report_crash(wcnss->rproc, RPROC_FATAL_ERROR);
344 struct qcom_wcnss *wcnss = dev;
346 complete(&wcnss->start_done);
367 struct qcom_wcnss *wcnss = dev;
369 complete(&wcnss->stop_done);
374 static int wcnss_init_regulators(struct qcom_wcnss *wcnss,
382 bulk = devm_kcalloc(wcnss->dev,
391 ret = devm_regulator_bulk_get(wcnss->dev, num_vregs, bulk);
405 wcnss->vregs = bulk;
406 wcnss->num_vregs = num_vregs;
411 static int wcnss_request_irq(struct qcom_wcnss *wcnss,
434 "wcnss", wcnss);
444 static int wcnss_alloc_memory_region(struct qcom_wcnss *wcnss)
450 node = of_parse_phandle(wcnss->dev->of_node, "memory-region", 0);
452 dev_err(wcnss->dev, "no memory-region specified\n");
461 wcnss->mem_phys = wcnss->mem_reloc = r.start;
462 wcnss->mem_size = resource_size(&r);
463 wcnss->mem_region = devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size);
464 if (!wcnss->mem_region) {
465 dev_err(wcnss->dev, "unable to map memory region: %pa+%zx\n",
466 &r.start, wcnss->mem_size);
476 struct qcom_wcnss *wcnss;
493 WCNSS_FIRMWARE_NAME, sizeof(*wcnss));
500 wcnss = (struct qcom_wcnss *)rproc->priv;
501 wcnss->dev = &pdev->dev;
502 wcnss->rproc = rproc;
503 platform_set_drvdata(pdev, wcnss);
505 init_completion(&wcnss->start_done);
506 init_completion(&wcnss->stop_done);
508 mutex_init(&wcnss->iris_lock);
517 ret = wcnss_alloc_memory_region(wcnss);
521 wcnss->pmu_cfg = mmio + data->pmu_offset;
522 wcnss->spare_out = mmio + data->spare_offset;
524 ret = wcnss_init_regulators(wcnss, data->vregs, data->num_vregs);
528 ret = wcnss_request_irq(wcnss, pdev, "wdog", false, wcnss_wdog_interrupt);
531 wcnss->wdog_irq = ret;
533 ret = wcnss_request_irq(wcnss, pdev, "fatal", false, wcnss_fatal_interrupt);
536 wcnss->fatal_irq = ret;
538 ret = wcnss_request_irq(wcnss, pdev, "ready", true, wcnss_ready_interrupt);
541 wcnss->ready_irq = ret;
543 ret = wcnss_request_irq(wcnss, pdev, "handover", true, wcnss_handover_interrupt);
546 wcnss->handover_irq = ret;
548 ret = wcnss_request_irq(wcnss, pdev, "stop-ack", true, wcnss_stop_ack_interrupt);
551 wcnss->stop_ack_irq = ret;
553 if (wcnss->stop_ack_irq) {
554 wcnss->state = qcom_smem_state_get(&pdev->dev, "stop",
555 &wcnss->stop_bit);
556 if (IS_ERR(wcnss->state)) {
557 ret = PTR_ERR(wcnss->state);
562 qcom_add_smd_subdev(rproc, &wcnss->smd_subdev);
563 wcnss->sysmon = qcom_add_sysmon_subdev(rproc, "wcnss", WCNSS_SSCTL_ID);
564 if (IS_ERR(wcnss->sysmon)) {
565 ret = PTR_ERR(wcnss->sysmon);
583 struct qcom_wcnss *wcnss = platform_get_drvdata(pdev);
587 qcom_smem_state_put(wcnss->state);
588 rproc_del(wcnss->rproc);
590 qcom_remove_sysmon_subdev(wcnss->sysmon);
591 qcom_remove_smd_subdev(wcnss->rproc, &wcnss->smd_subdev);
592 rproc_free(wcnss->rproc);
609 .name = "qcom-wcnss-pil",