blob: 8c47546dad3e0a9a9e67e0e5a7eace7f5fc646a2 [file] [log] [blame]
developere5e687d2023-08-08 16:05:33 +08001// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) 2023 MediaTek Inc. All Rights Reserved.
4 *
5 * Author: Ren-Ting Wang <ren-ting.wang@mediatek.com>
6 */
7
8#include <linux/of.h>
9#include <linux/err.h>
10#include <linux/device.h>
11#include <linux/module.h>
12#include <linux/of_platform.h>
13#include <linux/platform_device.h>
14
15#include "ctrl.h"
16#include "firmware.h"
17#include "hpdma.h"
18#include "hwspinlock.h"
19#include "internal.h"
20#include "mbox.h"
21#include "mcu.h"
22#include "netsys.h"
23#include "net-event.h"
24#include "ser.h"
25#include "tdma.h"
26#include "trm-mcu.h"
27#include "trm.h"
28#include "tunnel.h"
29#include "wdt.h"
30
31struct device *tops_dev;
32
33static int mtk_tops_post_init(struct platform_device *pdev)
34{
35 int ret = 0;
36
37 /* kick core */
38 ret = mtk_tops_mcu_bring_up(pdev);
39 if (ret) {
40 TOPS_ERR("mcu post init failed: %d\n", ret);
41 return ret;
42 }
43
44 /* offload tunnel protocol initialization */
45 ret = mtk_tops_tnl_offload_proto_setup(pdev);
46 if (ret) {
47 TOPS_ERR("tnl offload protocol init failed: %d\n", ret);
48 goto err_mcu_tear_down;
49 }
50
51 ret = mtk_tops_netevent_register(pdev);
52 if (ret) {
53 TOPS_ERR("netevent register fail: %d\n", ret);
54 goto err_offload_proto_tear_down;
55 }
56
57 /* create sysfs file */
58 ret = mtk_tops_ctrl_init(pdev);
59 if (ret) {
60 TOPS_ERR("ctrl init failed: %d\n", ret);
61 goto err_netevent_unregister;
62 }
63
64 ret = mtk_tops_ser_init(pdev);
65 if (ret) {
66 TOPS_ERR("ser init failed: %d\n", ret);
67 goto err_ctrl_deinit;
68 }
69
70 ret = mtk_tops_wdt_init(pdev);
71 if (ret) {
72 TOPS_ERR("wdt init failed: %d\n", ret);
73 goto err_ser_deinit;
74 }
75
76 return ret;
77
78err_ser_deinit:
79 mtk_tops_ser_deinit(pdev);
80
81err_ctrl_deinit:
82 mtk_tops_ctrl_deinit(pdev);
83
84err_netevent_unregister:
85 mtk_tops_netevent_unregister(pdev);
86
87err_offload_proto_tear_down:
88 mtk_tops_tnl_offload_proto_teardown(pdev);
89
90err_mcu_tear_down:
91 mtk_tops_mcu_tear_down(pdev);
92
93 return ret;
94}
95
96static int mtk_tops_probe(struct platform_device *pdev)
97{
98 int ret = 0;
99
100 tops_dev = &pdev->dev;
101
102 ret = mtk_tops_hwspinlock_init(pdev);
103 if (ret) {
104 TOPS_ERR("hwspinlock init failed: %d\n", ret);
105 return ret;
106 }
107
108 ret = mtk_tops_fw_init(pdev);
109 if (ret) {
110 TOPS_ERR("firmware init failed: %d\n", ret);
111 return ret;
112 }
113
114 ret = mtk_tops_mcu_init(pdev);
115 if (ret) {
116 TOPS_ERR("mcu init failed: %d\n", ret);
117 return ret;
118 }
119
120 ret = mtk_tops_netsys_init(pdev);
121 if (ret) {
122 TOPS_ERR("netsys init failed: %d\n", ret);
123 goto err_mcu_deinit;
124 }
125
126 ret = mtk_tops_tdma_init(pdev);
127 if (ret) {
128 TOPS_ERR("tdma init failed: %d\n", ret);
129 goto err_netsys_deinit;
130 }
131
132 ret = mtk_tops_tnl_offload_init(pdev);
133 if (ret) {
134 TOPS_ERR("tunnel table init failed: %d\n", ret);
135 goto err_tdma_deinit;
136 }
137
138 ret = mtk_tops_post_init(pdev);
139 if (ret)
140 goto err_tnl_offload_deinit;
141
142 TOPS_ERR("init done\n");
143 return ret;
144
145err_tnl_offload_deinit:
146 mtk_tops_tnl_offload_deinit(pdev);
147
148err_tdma_deinit:
149 mtk_tops_tdma_deinit(pdev);
150
151err_netsys_deinit:
152 mtk_tops_netsys_deinit(pdev);
153
154err_mcu_deinit:
155 mtk_tops_mcu_deinit(pdev);
156
157 return ret;
158}
159
160static int mtk_tops_remove(struct platform_device *pdev)
161{
162 mtk_tops_wdt_deinit(pdev);
163
164 mtk_tops_ser_deinit(pdev);
165
166 mtk_tops_ctrl_deinit(pdev);
167
168 mtk_tops_netevent_unregister(pdev);
169
170 mtk_tops_tnl_offload_proto_teardown(pdev);
171
172 mtk_tops_mcu_tear_down(pdev);
173
174 mtk_tops_tnl_offload_deinit(pdev);
175
176 mtk_tops_tdma_deinit(pdev);
177
178 mtk_tops_netsys_deinit(pdev);
179
180 mtk_tops_mcu_deinit(pdev);
181
182 return 0;
183}
184
185static const struct of_device_id tops_match[] = {
186 { .compatible = "mediatek,tops", },
187 { },
188};
189MODULE_DEVICE_TABLE(of, tops_match);
190
191static struct platform_driver mtk_tops_driver = {
192 .probe = mtk_tops_probe,
193 .remove = mtk_tops_remove,
194 .driver = {
195 .name = "mediatek,tops",
196 .owner = THIS_MODULE,
197 .of_match_table = tops_match,
198 },
199};
200
201static int __init mtk_tops_init(void)
202{
203 mtk_tops_mbox_init();
204
205 mtk_tops_hpdma_init();
206
207 mtk_tops_trm_init();
208
209 return platform_driver_register(&mtk_tops_driver);
210}
211
212static void __exit mtk_tops_exit(void)
213{
214 platform_driver_unregister(&mtk_tops_driver);
215
216 mtk_tops_trm_exit();
217
218 mtk_tops_hpdma_exit();
219
220 mtk_tops_mbox_exit();
221}
222
223module_init(mtk_tops_init);
224module_exit(mtk_tops_exit);
225
226MODULE_LICENSE("GPL v2");
227MODULE_DESCRIPTION("MediaTek TOPS Driver");
228MODULE_AUTHOR("Ren-Ting Wang <ren-ting.wang@mediatek.com>");