1 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
2 /*
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5 */
6 #ifndef ATH12K_AHB_H
7 #define ATH12K_AHB_H
8
9 #include <linux/clk.h>
10 #include <linux/remoteproc/qcom_rproc.h>
11 #include <linux/platform_device.h>
12 #include "core.h"
13
14 #define ATH12K_AHB_RECOVERY_TIMEOUT (3 * HZ)
15
16 #define ATH12K_AHB_SMP2P_SMEM_MSG GENMASK(15, 0)
17 #define ATH12K_AHB_SMP2P_SMEM_SEQ_NO GENMASK(31, 16)
18 #define ATH12K_AHB_SMP2P_SMEM_VALUE_MASK 0xFFFFFFFF
19 #define ATH12K_PCI_CE_WAKE_IRQ 2
20 #define ATH12K_PCI_IRQ_CE0_OFFSET 3
21 #define ATH12K_ROOTPD_READY_TIMEOUT (5 * HZ)
22 #define ATH12K_RPROC_AFTER_POWERUP QCOM_SSR_AFTER_POWERUP
23 #define ATH12K_AHB_FW_PREFIX "q6_fw"
24 #define ATH12K_AHB_FW_SUFFIX ".mdt"
25 #define ATH12K_AHB_FW2 "iu_fw.mdt"
26 #define ATH12K_AHB_UPD_SWID 0x12
27 #define ATH12K_USERPD_SPAWN_TIMEOUT (5 * HZ)
28 #define ATH12K_USERPD_READY_TIMEOUT (10 * HZ)
29 #define ATH12K_USERPD_STOP_TIMEOUT (5 * HZ)
30 #define ATH12K_USERPD_ID_MASK GENMASK(9, 8)
31 #define ATH12K_USERPD_FW_NAME_LEN 35
32
33 enum ath12k_ahb_smp2p_msg_id {
34 ATH12K_AHB_POWER_SAVE_ENTER = 1,
35 ATH12K_AHB_POWER_SAVE_EXIT,
36 };
37
38 enum ath12k_ahb_userpd_irq {
39 ATH12K_USERPD_SPAWN_IRQ,
40 ATH12K_USERPD_READY_IRQ,
41 ATH12K_USERPD_STOP_ACK_IRQ,
42 ATH12K_USERPD_MAX_IRQ,
43 };
44
45 struct ath12k_base;
46
47 struct ath12k_ahb_device_family_ops {
48 int (*probe)(struct platform_device *pdev);
49 int (*arch_init)(struct ath12k_base *ab);
50 void (*arch_deinit)(struct ath12k_base *ab);
51 };
52
53 struct ath12k_ahb {
54 struct ath12k_base *ab;
55 struct rproc *tgt_rproc;
56 struct clk *xo_clk;
57 struct completion rootpd_ready;
58 struct notifier_block root_pd_nb;
59 void *root_pd_notifier;
60 struct qcom_smem_state *spawn_state;
61 struct qcom_smem_state *stop_state;
62 struct completion userpd_spawned;
63 struct completion userpd_ready;
64 struct completion userpd_stopped;
65 u32 userpd_id;
66 u32 spawn_bit;
67 u32 stop_bit;
68 int userpd_irq_num[ATH12K_USERPD_MAX_IRQ];
69 const struct ath12k_ahb_ops *ahb_ops;
70 const struct ath12k_ahb_device_family_ops *device_family_ops;
71 };
72
73 struct ath12k_ahb_driver {
74 const char *name;
75 const struct of_device_id *id_table;
76 struct ath12k_ahb_device_family_ops ops;
77 struct platform_driver driver;
78 };
79
ath12k_ab_to_ahb(struct ath12k_base * ab)80 static inline struct ath12k_ahb *ath12k_ab_to_ahb(struct ath12k_base *ab)
81 {
82 return (struct ath12k_ahb *)ab->drv_priv;
83 }
84
85 int ath12k_ahb_register_driver(const enum ath12k_device_family device_id,
86 struct ath12k_ahb_driver *driver);
87 void ath12k_ahb_unregister_driver(const enum ath12k_device_family device_id);
88
89 #endif
90