2 * Copyright (c) 2016-2017 Qualcomm Atheros, Inc. All rights reserved.
3 * Copyright (c) 2015 The Linux Foundation. All rights reserved.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include <linux/module.h>
19 #include <linux/of_device.h>
20 #include <linux/clk.h>
21 #include <linux/reset.h>
27 static const struct of_device_id ath10k_ahb_of_match[] = {
28 { .compatible = "qcom,ipq4019-wifi",
29 .data = (void *)ATH10K_HW_QCA4019
34 MODULE_DEVICE_TABLE(of, ath10k_ahb_of_match);
36 #define QCA4019_SRAM_ADDR 0x000C0000
37 #define QCA4019_SRAM_LEN 0x00040000 /* 256 kb */
39 static inline struct ath10k_ahb *ath10k_ahb_priv(struct ath10k *ar)
41 return &((struct ath10k_pci *)ar->drv_priv)->ahb[0];
44 static void ath10k_ahb_write32(struct ath10k *ar, u32 offset, u32 value)
46 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
48 iowrite32(value, ar_ahb->mem + offset);
51 static u32 ath10k_ahb_read32(struct ath10k *ar, u32 offset)
53 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
55 return ioread32(ar_ahb->mem + offset);
58 static u32 ath10k_ahb_gcc_read32(struct ath10k *ar, u32 offset)
60 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
62 return ioread32(ar_ahb->gcc_mem + offset);
65 static void ath10k_ahb_tcsr_write32(struct ath10k *ar, u32 offset, u32 value)
67 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
69 iowrite32(value, ar_ahb->tcsr_mem + offset);
72 static u32 ath10k_ahb_tcsr_read32(struct ath10k *ar, u32 offset)
74 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
76 return ioread32(ar_ahb->tcsr_mem + offset);
79 static u32 ath10k_ahb_soc_read32(struct ath10k *ar, u32 addr)
81 return ath10k_ahb_read32(ar, RTC_SOC_BASE_ADDRESS + addr);
84 static int ath10k_ahb_get_num_banks(struct ath10k *ar)
86 if (ar->hw_rev == ATH10K_HW_QCA4019)
89 ath10k_warn(ar, "unknown number of banks, assuming 1\n");
93 static int ath10k_ahb_clock_init(struct ath10k *ar)
95 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
98 dev = &ar_ahb->pdev->dev;
100 ar_ahb->cmd_clk = devm_clk_get(dev, "wifi_wcss_cmd");
101 if (IS_ERR_OR_NULL(ar_ahb->cmd_clk)) {
102 ath10k_err(ar, "failed to get cmd clk: %ld\n",
103 PTR_ERR(ar_ahb->cmd_clk));
104 return ar_ahb->cmd_clk ? PTR_ERR(ar_ahb->cmd_clk) : -ENODEV;
107 ar_ahb->ref_clk = devm_clk_get(dev, "wifi_wcss_ref");
108 if (IS_ERR_OR_NULL(ar_ahb->ref_clk)) {
109 ath10k_err(ar, "failed to get ref clk: %ld\n",
110 PTR_ERR(ar_ahb->ref_clk));
111 return ar_ahb->ref_clk ? PTR_ERR(ar_ahb->ref_clk) : -ENODEV;
114 ar_ahb->rtc_clk = devm_clk_get(dev, "wifi_wcss_rtc");
115 if (IS_ERR_OR_NULL(ar_ahb->rtc_clk)) {
116 ath10k_err(ar, "failed to get rtc clk: %ld\n",
117 PTR_ERR(ar_ahb->rtc_clk));
118 return ar_ahb->rtc_clk ? PTR_ERR(ar_ahb->rtc_clk) : -ENODEV;
124 static void ath10k_ahb_clock_deinit(struct ath10k *ar)
126 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
128 ar_ahb->cmd_clk = NULL;
129 ar_ahb->ref_clk = NULL;
130 ar_ahb->rtc_clk = NULL;
133 static int ath10k_ahb_clock_enable(struct ath10k *ar)
135 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
138 if (IS_ERR_OR_NULL(ar_ahb->cmd_clk) ||
139 IS_ERR_OR_NULL(ar_ahb->ref_clk) ||
140 IS_ERR_OR_NULL(ar_ahb->rtc_clk)) {
141 ath10k_err(ar, "clock(s) is/are not initialized\n");
146 ret = clk_prepare_enable(ar_ahb->cmd_clk);
148 ath10k_err(ar, "failed to enable cmd clk: %d\n", ret);
152 ret = clk_prepare_enable(ar_ahb->ref_clk);
154 ath10k_err(ar, "failed to enable ref clk: %d\n", ret);
155 goto err_cmd_clk_disable;
158 ret = clk_prepare_enable(ar_ahb->rtc_clk);
160 ath10k_err(ar, "failed to enable rtc clk: %d\n", ret);
161 goto err_ref_clk_disable;
167 clk_disable_unprepare(ar_ahb->ref_clk);
170 clk_disable_unprepare(ar_ahb->cmd_clk);
176 static void ath10k_ahb_clock_disable(struct ath10k *ar)
178 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
180 clk_disable_unprepare(ar_ahb->cmd_clk);
182 clk_disable_unprepare(ar_ahb->ref_clk);
184 clk_disable_unprepare(ar_ahb->rtc_clk);
187 static int ath10k_ahb_rst_ctrl_init(struct ath10k *ar)
189 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
192 dev = &ar_ahb->pdev->dev;
194 ar_ahb->core_cold_rst = devm_reset_control_get_exclusive(dev,
196 if (IS_ERR(ar_ahb->core_cold_rst)) {
197 ath10k_err(ar, "failed to get core cold rst ctrl: %ld\n",
198 PTR_ERR(ar_ahb->core_cold_rst));
199 return PTR_ERR(ar_ahb->core_cold_rst);
202 ar_ahb->radio_cold_rst = devm_reset_control_get_exclusive(dev,
204 if (IS_ERR(ar_ahb->radio_cold_rst)) {
205 ath10k_err(ar, "failed to get radio cold rst ctrl: %ld\n",
206 PTR_ERR(ar_ahb->radio_cold_rst));
207 return PTR_ERR(ar_ahb->radio_cold_rst);
210 ar_ahb->radio_warm_rst = devm_reset_control_get_exclusive(dev,
212 if (IS_ERR(ar_ahb->radio_warm_rst)) {
213 ath10k_err(ar, "failed to get radio warm rst ctrl: %ld\n",
214 PTR_ERR(ar_ahb->radio_warm_rst));
215 return PTR_ERR(ar_ahb->radio_warm_rst);
218 ar_ahb->radio_srif_rst = devm_reset_control_get_exclusive(dev,
220 if (IS_ERR(ar_ahb->radio_srif_rst)) {
221 ath10k_err(ar, "failed to get radio srif rst ctrl: %ld\n",
222 PTR_ERR(ar_ahb->radio_srif_rst));
223 return PTR_ERR(ar_ahb->radio_srif_rst);
226 ar_ahb->cpu_init_rst = devm_reset_control_get_exclusive(dev,
228 if (IS_ERR(ar_ahb->cpu_init_rst)) {
229 ath10k_err(ar, "failed to get cpu init rst ctrl: %ld\n",
230 PTR_ERR(ar_ahb->cpu_init_rst));
231 return PTR_ERR(ar_ahb->cpu_init_rst);
237 static void ath10k_ahb_rst_ctrl_deinit(struct ath10k *ar)
239 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
241 ar_ahb->core_cold_rst = NULL;
242 ar_ahb->radio_cold_rst = NULL;
243 ar_ahb->radio_warm_rst = NULL;
244 ar_ahb->radio_srif_rst = NULL;
245 ar_ahb->cpu_init_rst = NULL;
248 static int ath10k_ahb_release_reset(struct ath10k *ar)
250 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
253 if (IS_ERR_OR_NULL(ar_ahb->radio_cold_rst) ||
254 IS_ERR_OR_NULL(ar_ahb->radio_warm_rst) ||
255 IS_ERR_OR_NULL(ar_ahb->radio_srif_rst) ||
256 IS_ERR_OR_NULL(ar_ahb->cpu_init_rst)) {
257 ath10k_err(ar, "rst ctrl(s) is/are not initialized\n");
261 ret = reset_control_deassert(ar_ahb->radio_cold_rst);
263 ath10k_err(ar, "failed to deassert radio cold rst: %d\n", ret);
267 ret = reset_control_deassert(ar_ahb->radio_warm_rst);
269 ath10k_err(ar, "failed to deassert radio warm rst: %d\n", ret);
273 ret = reset_control_deassert(ar_ahb->radio_srif_rst);
275 ath10k_err(ar, "failed to deassert radio srif rst: %d\n", ret);
279 ret = reset_control_deassert(ar_ahb->cpu_init_rst);
281 ath10k_err(ar, "failed to deassert cpu init rst: %d\n", ret);
288 static void ath10k_ahb_halt_axi_bus(struct ath10k *ar, u32 haltreq_reg,
291 unsigned long timeout;
294 /* Issue halt axi bus request */
295 val = ath10k_ahb_tcsr_read32(ar, haltreq_reg);
296 val |= AHB_AXI_BUS_HALT_REQ;
297 ath10k_ahb_tcsr_write32(ar, haltreq_reg, val);
299 /* Wait for axi bus halted ack */
300 timeout = jiffies + msecs_to_jiffies(ATH10K_AHB_AXI_BUS_HALT_TIMEOUT);
302 val = ath10k_ahb_tcsr_read32(ar, haltack_reg);
303 if (val & AHB_AXI_BUS_HALT_ACK)
307 } while (time_before(jiffies, timeout));
309 if (!(val & AHB_AXI_BUS_HALT_ACK)) {
310 ath10k_err(ar, "failed to halt axi bus: %d\n", val);
314 ath10k_dbg(ar, ATH10K_DBG_AHB, "axi bus halted\n");
317 static void ath10k_ahb_halt_chip(struct ath10k *ar)
319 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
320 u32 core_id, glb_cfg_reg, haltreq_reg, haltack_reg;
324 if (IS_ERR_OR_NULL(ar_ahb->core_cold_rst) ||
325 IS_ERR_OR_NULL(ar_ahb->radio_cold_rst) ||
326 IS_ERR_OR_NULL(ar_ahb->radio_warm_rst) ||
327 IS_ERR_OR_NULL(ar_ahb->radio_srif_rst) ||
328 IS_ERR_OR_NULL(ar_ahb->cpu_init_rst)) {
329 ath10k_err(ar, "rst ctrl(s) is/are not initialized\n");
333 core_id = ath10k_ahb_read32(ar, ATH10K_AHB_WLAN_CORE_ID_REG);
337 glb_cfg_reg = ATH10K_AHB_TCSR_WIFI0_GLB_CFG;
338 haltreq_reg = ATH10K_AHB_TCSR_WCSS0_HALTREQ;
339 haltack_reg = ATH10K_AHB_TCSR_WCSS0_HALTACK;
342 glb_cfg_reg = ATH10K_AHB_TCSR_WIFI1_GLB_CFG;
343 haltreq_reg = ATH10K_AHB_TCSR_WCSS1_HALTREQ;
344 haltack_reg = ATH10K_AHB_TCSR_WCSS1_HALTACK;
347 ath10k_err(ar, "invalid core id %d found, skipping reset sequence\n",
352 ath10k_ahb_halt_axi_bus(ar, haltreq_reg, haltack_reg);
354 val = ath10k_ahb_tcsr_read32(ar, glb_cfg_reg);
355 val |= TCSR_WIFIX_GLB_CFG_DISABLE_CORE_CLK;
356 ath10k_ahb_tcsr_write32(ar, glb_cfg_reg, val);
358 ret = reset_control_assert(ar_ahb->core_cold_rst);
360 ath10k_err(ar, "failed to assert core cold rst: %d\n", ret);
363 ret = reset_control_assert(ar_ahb->radio_cold_rst);
365 ath10k_err(ar, "failed to assert radio cold rst: %d\n", ret);
368 ret = reset_control_assert(ar_ahb->radio_warm_rst);
370 ath10k_err(ar, "failed to assert radio warm rst: %d\n", ret);
373 ret = reset_control_assert(ar_ahb->radio_srif_rst);
375 ath10k_err(ar, "failed to assert radio srif rst: %d\n", ret);
378 ret = reset_control_assert(ar_ahb->cpu_init_rst);
380 ath10k_err(ar, "failed to assert cpu init rst: %d\n", ret);
383 /* Clear halt req and core clock disable req before
384 * deasserting wifi core reset.
386 val = ath10k_ahb_tcsr_read32(ar, haltreq_reg);
387 val &= ~AHB_AXI_BUS_HALT_REQ;
388 ath10k_ahb_tcsr_write32(ar, haltreq_reg, val);
390 val = ath10k_ahb_tcsr_read32(ar, glb_cfg_reg);
391 val &= ~TCSR_WIFIX_GLB_CFG_DISABLE_CORE_CLK;
392 ath10k_ahb_tcsr_write32(ar, glb_cfg_reg, val);
394 ret = reset_control_deassert(ar_ahb->core_cold_rst);
396 ath10k_err(ar, "failed to deassert core cold rst: %d\n", ret);
398 ath10k_dbg(ar, ATH10K_DBG_AHB, "core %d reset done\n", core_id);
401 static irqreturn_t ath10k_ahb_interrupt_handler(int irq, void *arg)
403 struct ath10k *ar = arg;
405 if (!ath10k_pci_irq_pending(ar))
408 ath10k_pci_disable_and_clear_legacy_irq(ar);
409 ath10k_pci_irq_msi_fw_mask(ar);
410 napi_schedule(&ar->napi);
415 static int ath10k_ahb_request_irq_legacy(struct ath10k *ar)
417 struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
418 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
421 ret = request_irq(ar_ahb->irq,
422 ath10k_ahb_interrupt_handler,
423 IRQF_SHARED, "ath10k_ahb", ar);
425 ath10k_warn(ar, "failed to request legacy irq %d: %d\n",
429 ar_pci->oper_irq_mode = ATH10K_PCI_IRQ_LEGACY;
434 static void ath10k_ahb_release_irq_legacy(struct ath10k *ar)
436 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
438 free_irq(ar_ahb->irq, ar);
441 static void ath10k_ahb_irq_disable(struct ath10k *ar)
443 ath10k_ce_disable_interrupts(ar);
444 ath10k_pci_disable_and_clear_legacy_irq(ar);
447 static int ath10k_ahb_resource_init(struct ath10k *ar)
449 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
450 struct platform_device *pdev;
451 struct resource *res;
456 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
458 ath10k_err(ar, "failed to get memory resource\n");
463 ar_ahb->mem = devm_ioremap_resource(&pdev->dev, res);
464 if (IS_ERR(ar_ahb->mem)) {
465 ath10k_err(ar, "mem ioremap error\n");
466 ret = PTR_ERR(ar_ahb->mem);
470 ar_ahb->mem_len = resource_size(res);
472 ar_ahb->gcc_mem = ioremap_nocache(ATH10K_GCC_REG_BASE,
473 ATH10K_GCC_REG_SIZE);
474 if (!ar_ahb->gcc_mem) {
475 ath10k_err(ar, "gcc mem ioremap error\n");
480 ar_ahb->tcsr_mem = ioremap_nocache(ATH10K_TCSR_REG_BASE,
481 ATH10K_TCSR_REG_SIZE);
482 if (!ar_ahb->tcsr_mem) {
483 ath10k_err(ar, "tcsr mem ioremap error\n");
485 goto err_gcc_mem_unmap;
488 ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
490 ath10k_err(ar, "failed to set 32-bit dma mask: %d\n", ret);
491 goto err_tcsr_mem_unmap;
494 ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
496 ath10k_err(ar, "failed to set 32-bit consistent dma: %d\n",
498 goto err_tcsr_mem_unmap;
501 ret = ath10k_ahb_clock_init(ar);
503 goto err_tcsr_mem_unmap;
505 ret = ath10k_ahb_rst_ctrl_init(ar);
507 goto err_clock_deinit;
509 ar_ahb->irq = platform_get_irq_byname(pdev, "legacy");
510 if (ar_ahb->irq < 0) {
511 ath10k_err(ar, "failed to get irq number: %d\n", ar_ahb->irq);
513 goto err_clock_deinit;
516 ath10k_dbg(ar, ATH10K_DBG_BOOT, "irq: %d\n", ar_ahb->irq);
518 ath10k_dbg(ar, ATH10K_DBG_BOOT, "mem: 0x%pK mem_len: %lu gcc mem: 0x%pK tcsr_mem: 0x%pK\n",
519 ar_ahb->mem, ar_ahb->mem_len,
520 ar_ahb->gcc_mem, ar_ahb->tcsr_mem);
524 ath10k_ahb_clock_deinit(ar);
527 iounmap(ar_ahb->tcsr_mem);
530 ar_ahb->tcsr_mem = NULL;
531 iounmap(ar_ahb->gcc_mem);
534 ar_ahb->gcc_mem = NULL;
535 devm_iounmap(&pdev->dev, ar_ahb->mem);
542 static void ath10k_ahb_resource_deinit(struct ath10k *ar)
544 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
547 dev = &ar_ahb->pdev->dev;
550 devm_iounmap(dev, ar_ahb->mem);
553 iounmap(ar_ahb->gcc_mem);
555 if (ar_ahb->tcsr_mem)
556 iounmap(ar_ahb->tcsr_mem);
559 ar_ahb->gcc_mem = NULL;
560 ar_ahb->tcsr_mem = NULL;
562 ath10k_ahb_clock_deinit(ar);
563 ath10k_ahb_rst_ctrl_deinit(ar);
566 static int ath10k_ahb_prepare_device(struct ath10k *ar)
571 ret = ath10k_ahb_clock_enable(ar);
573 ath10k_err(ar, "failed to enable clocks\n");
577 /* Clock for the target is supplied from outside of target (ie,
578 * external clock module controlled by the host). Target needs
579 * to know what frequency target cpu is configured which is needed
580 * for target internal use. Read target cpu frequency info from
581 * gcc register and write into target's scratch register where
582 * target expects this information.
584 val = ath10k_ahb_gcc_read32(ar, ATH10K_AHB_GCC_FEPLL_PLL_DIV);
585 ath10k_ahb_write32(ar, ATH10K_AHB_WIFI_SCRATCH_5_REG, val);
587 ret = ath10k_ahb_release_reset(ar);
589 goto err_clk_disable;
591 ath10k_ahb_irq_disable(ar);
593 ath10k_ahb_write32(ar, FW_INDICATOR_ADDRESS, FW_IND_HOST_READY);
595 ret = ath10k_pci_wait_for_target_init(ar);
602 ath10k_ahb_halt_chip(ar);
605 ath10k_ahb_clock_disable(ar);
610 static int ath10k_ahb_chip_reset(struct ath10k *ar)
614 ath10k_ahb_halt_chip(ar);
615 ath10k_ahb_clock_disable(ar);
617 ret = ath10k_ahb_prepare_device(ar);
624 static int ath10k_ahb_wake_target_cpu(struct ath10k *ar)
628 addr = SOC_CORE_BASE_ADDRESS | CORE_CTRL_ADDRESS;
629 val = ath10k_ahb_read32(ar, addr);
630 val |= ATH10K_AHB_CORE_CTRL_CPU_INTR_MASK;
631 ath10k_ahb_write32(ar, addr, val);
636 static int ath10k_ahb_hif_start(struct ath10k *ar)
638 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot ahb hif start\n");
640 napi_enable(&ar->napi);
641 ath10k_ce_enable_interrupts(ar);
642 ath10k_pci_enable_legacy_irq(ar);
644 ath10k_pci_rx_post(ar);
649 static void ath10k_ahb_hif_stop(struct ath10k *ar)
651 struct ath10k_ahb *ar_ahb = ath10k_ahb_priv(ar);
653 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot ahb hif stop\n");
655 ath10k_ahb_irq_disable(ar);
656 synchronize_irq(ar_ahb->irq);
658 napi_synchronize(&ar->napi);
659 napi_disable(&ar->napi);
661 ath10k_pci_flush(ar);
664 static int ath10k_ahb_hif_power_up(struct ath10k *ar,
665 enum ath10k_firmware_mode fw_mode)
669 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot ahb hif power up\n");
671 ret = ath10k_ahb_chip_reset(ar);
673 ath10k_err(ar, "failed to reset chip: %d\n", ret);
677 ret = ath10k_pci_init_pipes(ar);
679 ath10k_err(ar, "failed to initialize CE: %d\n", ret);
683 ret = ath10k_pci_init_config(ar);
685 ath10k_err(ar, "failed to setup init config: %d\n", ret);
689 ret = ath10k_ahb_wake_target_cpu(ar);
691 ath10k_err(ar, "could not wake up target CPU: %d\n", ret);
698 ath10k_pci_ce_deinit(ar);
703 static u32 ath10k_ahb_qca4019_targ_cpu_to_ce_addr(struct ath10k *ar, u32 addr)
705 u32 val = 0, region = addr & 0xfffff;
707 val = ath10k_pci_read32(ar, PCIE_BAR_REG_ADDRESS);
709 if (region >= QCA4019_SRAM_ADDR && region <=
710 (QCA4019_SRAM_ADDR + QCA4019_SRAM_LEN)) {
711 /* SRAM contents for QCA4019 can be directly accessed and
712 * no conversions are required
716 val |= 0x100000 | region;
722 static const struct ath10k_hif_ops ath10k_ahb_hif_ops = {
723 .tx_sg = ath10k_pci_hif_tx_sg,
724 .diag_read = ath10k_pci_hif_diag_read,
725 .diag_write = ath10k_pci_diag_write_mem,
726 .exchange_bmi_msg = ath10k_pci_hif_exchange_bmi_msg,
727 .start = ath10k_ahb_hif_start,
728 .stop = ath10k_ahb_hif_stop,
729 .map_service_to_pipe = ath10k_pci_hif_map_service_to_pipe,
730 .get_default_pipe = ath10k_pci_hif_get_default_pipe,
731 .send_complete_check = ath10k_pci_hif_send_complete_check,
732 .get_free_queue_number = ath10k_pci_hif_get_free_queue_number,
733 .power_up = ath10k_ahb_hif_power_up,
734 .power_down = ath10k_pci_hif_power_down,
735 .read32 = ath10k_ahb_read32,
736 .write32 = ath10k_ahb_write32,
739 static const struct ath10k_bus_ops ath10k_ahb_bus_ops = {
740 .read32 = ath10k_ahb_read32,
741 .write32 = ath10k_ahb_write32,
742 .get_num_banks = ath10k_ahb_get_num_banks,
745 static int ath10k_ahb_probe(struct platform_device *pdev)
748 struct ath10k_ahb *ar_ahb;
749 struct ath10k_pci *ar_pci;
750 const struct of_device_id *of_id;
751 enum ath10k_hw_rev hw_rev;
754 struct ath10k_bus_params bus_params;
756 of_id = of_match_device(ath10k_ahb_of_match, &pdev->dev);
758 dev_err(&pdev->dev, "failed to find matching device tree id\n");
762 hw_rev = (enum ath10k_hw_rev)of_id->data;
764 size = sizeof(*ar_pci) + sizeof(*ar_ahb);
765 ar = ath10k_core_create(size, &pdev->dev, ATH10K_BUS_AHB,
766 hw_rev, &ath10k_ahb_hif_ops);
768 dev_err(&pdev->dev, "failed to allocate core\n");
772 ath10k_dbg(ar, ATH10K_DBG_BOOT, "ahb probe\n");
774 ar_pci = ath10k_pci_priv(ar);
775 ar_ahb = ath10k_ahb_priv(ar);
778 platform_set_drvdata(pdev, ar);
780 ret = ath10k_ahb_resource_init(ar);
782 goto err_core_destroy;
785 ar_pci->mem = ar_ahb->mem;
786 ar_pci->mem_len = ar_ahb->mem_len;
788 ar_pci->ce.bus_ops = &ath10k_ahb_bus_ops;
789 ar_pci->targ_cpu_to_ce_addr = ath10k_ahb_qca4019_targ_cpu_to_ce_addr;
790 ar->ce_priv = &ar_pci->ce;
792 ret = ath10k_pci_setup_resource(ar);
794 ath10k_err(ar, "failed to setup resource: %d\n", ret);
795 goto err_resource_deinit;
798 ath10k_pci_init_napi(ar);
800 ret = ath10k_ahb_request_irq_legacy(ar);
804 ret = ath10k_ahb_prepare_device(ar);
808 ath10k_pci_ce_deinit(ar);
810 bus_params.dev_type = ATH10K_DEV_TYPE_LL;
811 bus_params.chip_id = ath10k_ahb_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
812 if (bus_params.chip_id == 0xffffffff) {
813 ath10k_err(ar, "failed to get chip id\n");
815 goto err_halt_device;
818 ret = ath10k_core_register(ar, &bus_params);
820 ath10k_err(ar, "failed to register driver core: %d\n", ret);
821 goto err_halt_device;
827 ath10k_ahb_halt_chip(ar);
828 ath10k_ahb_clock_disable(ar);
831 ath10k_ahb_release_irq_legacy(ar);
834 ath10k_pci_free_pipes(ar);
837 ath10k_ahb_resource_deinit(ar);
840 ath10k_core_destroy(ar);
841 platform_set_drvdata(pdev, NULL);
846 static int ath10k_ahb_remove(struct platform_device *pdev)
848 struct ath10k *ar = platform_get_drvdata(pdev);
849 struct ath10k_ahb *ar_ahb;
854 ar_ahb = ath10k_ahb_priv(ar);
859 ath10k_dbg(ar, ATH10K_DBG_AHB, "ahb remove\n");
861 ath10k_core_unregister(ar);
862 ath10k_ahb_irq_disable(ar);
863 ath10k_ahb_release_irq_legacy(ar);
864 ath10k_pci_release_resource(ar);
865 ath10k_ahb_halt_chip(ar);
866 ath10k_ahb_clock_disable(ar);
867 ath10k_ahb_resource_deinit(ar);
868 ath10k_core_destroy(ar);
870 platform_set_drvdata(pdev, NULL);
875 static struct platform_driver ath10k_ahb_driver = {
877 .name = "ath10k_ahb",
878 .of_match_table = ath10k_ahb_of_match,
880 .probe = ath10k_ahb_probe,
881 .remove = ath10k_ahb_remove,
884 int ath10k_ahb_init(void)
888 ret = platform_driver_register(&ath10k_ahb_driver);
890 printk(KERN_ERR "failed to register ath10k ahb driver: %d\n",
895 void ath10k_ahb_exit(void)
897 platform_driver_unregister(&ath10k_ahb_driver);