blob: 8ae22c2bf8e904a4c0593c4d09756689c227c8c9 [file] [log] [blame]
Laxminath Kasam468ece32017-11-28 12:40:22 +05301/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/irq.h>
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/slab.h>
17#include <linux/io.h>
18#include <linux/interrupt.h>
19#include <linux/platform_device.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053020#include <linux/delay.h>
21#include <linux/kthread.h>
22#include <linux/clk.h>
23#include <linux/pm_runtime.h>
24#include <linux/of.h>
25#include <linux/debugfs.h>
26#include <linux/uaccess.h>
Laxminath Kasam605b42f2017-08-01 22:02:15 +053027#include <soc/soundwire.h>
28#include <soc/swr-wcd.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053029#include "swrm_registers.h"
30#include "swr-wcd-ctrl.h"
31
32#define SWR_BROADCAST_CMD_ID 0x0F
33#define SWR_AUTO_SUSPEND_DELAY 3 /* delay in sec */
34#define SWR_DEV_ID_MASK 0xFFFFFFFF
35#define SWR_REG_VAL_PACK(data, dev, id, reg) \
36 ((reg) | ((id) << 16) | ((dev) << 20) | ((data) << 24))
37
38/* pm runtime auto suspend timer in msecs */
39static int auto_suspend_timer = SWR_AUTO_SUSPEND_DELAY * 1000;
40module_param(auto_suspend_timer, int, 0664);
41MODULE_PARM_DESC(auto_suspend_timer, "timer for auto suspend");
42
43static u8 mstr_ports[] = {100, 101, 102, 103, 104, 105, 106, 107};
44static u8 mstr_port_type[] = {SWR_DAC_PORT, SWR_COMP_PORT, SWR_BOOST_PORT,
45 SWR_DAC_PORT, SWR_COMP_PORT, SWR_BOOST_PORT,
46 SWR_VISENSE_PORT, SWR_VISENSE_PORT};
47
48struct usecase uc[] = {
49 {0, 0, 0}, /* UC0: no ports */
50 {1, 1, 2400}, /* UC1: Spkr */
51 {1, 4, 600}, /* UC2: Compander */
52 {1, 2, 300}, /* UC3: Smart Boost */
53 {1, 2, 1200}, /* UC4: VI Sense */
54 {4, 9, 4500}, /* UC5: Spkr + Comp + SB + VI */
55 {8, 18, 9000}, /* UC6: 2*(Spkr + Comp + SB + VI) */
56 {2, 2, 4800}, /* UC7: 2*Spkr */
57 {2, 5, 3000}, /* UC8: Spkr + Comp */
58 {4, 10, 6000}, /* UC9: 2*(Spkr + Comp) */
59 {3, 7, 3300}, /* UC10: Spkr + Comp + SB */
60 {6, 14, 6600}, /* UC11: 2*(Spkr + Comp + SB) */
61 {2, 3, 2700}, /* UC12: Spkr + SB */
62 {4, 6, 5400}, /* UC13: 2*(Spkr + SB) */
63 {3, 5, 3900}, /* UC14: Spkr + SB + VI */
64 {6, 10, 7800}, /* UC15: 2*(Spkr + SB + VI) */
65 {2, 3, 3600}, /* UC16: Spkr + VI */
66 {4, 6, 7200}, /* UC17: 2*(Spkr + VI) */
67 {3, 7, 4200}, /* UC18: Spkr + Comp + VI */
68 {6, 14, 8400}, /* UC19: 2*(Spkr + Comp + VI) */
69};
70#define MAX_USECASE ARRAY_SIZE(uc)
71
72struct port_params pp[MAX_USECASE][SWR_MSTR_PORT_LEN] = {
73 /* UC 0 */
74 {
75 {0, 0, 0},
76 },
77 /* UC 1 */
78 {
79 {7, 1, 0},
80 },
81 /* UC 2 */
82 {
83 {31, 2, 0},
84 },
85 /* UC 3 */
86 {
87 {63, 12, 31},
88 },
89 /* UC 4 */
90 {
91 {15, 7, 0},
92 },
93 /* UC 5 */
94 {
95 {7, 1, 0},
96 {31, 2, 0},
97 {63, 12, 31},
98 {15, 7, 0},
99 },
100 /* UC 6 */
101 {
102 {7, 1, 0},
103 {31, 2, 0},
104 {63, 12, 31},
105 {15, 7, 0},
106 {7, 6, 0},
107 {31, 18, 0},
108 {63, 13, 31},
109 {15, 10, 0},
110 },
111 /* UC 7 */
112 {
113 {7, 1, 0},
114 {7, 6, 0},
115
116 },
117 /* UC 8 */
118 {
119 {7, 1, 0},
120 {31, 2, 0},
121 },
122 /* UC 9 */
123 {
124 {7, 1, 0},
125 {31, 2, 0},
126 {7, 6, 0},
127 {31, 18, 0},
128 },
129 /* UC 10 */
130 {
131 {7, 1, 0},
132 {31, 2, 0},
133 {63, 12, 31},
134 },
135 /* UC 11 */
136 {
137 {7, 1, 0},
138 {31, 2, 0},
139 {63, 12, 31},
140 {7, 6, 0},
141 {31, 18, 0},
142 {63, 13, 31},
143 },
144 /* UC 12 */
145 {
146 {7, 1, 0},
147 {63, 12, 31},
148 },
149 /* UC 13 */
150 {
151 {7, 1, 0},
152 {63, 12, 31},
153 {7, 6, 0},
154 {63, 13, 31},
155 },
156 /* UC 14 */
157 {
158 {7, 1, 0},
159 {63, 12, 31},
160 {15, 7, 0},
161 },
162 /* UC 15 */
163 {
164 {7, 1, 0},
165 {63, 12, 31},
166 {15, 7, 0},
167 {7, 6, 0},
168 {63, 13, 31},
169 {15, 10, 0},
170 },
171 /* UC 16 */
172 {
173 {7, 1, 0},
174 {15, 7, 0},
175 },
176 /* UC 17 */
177 {
178 {7, 1, 0},
179 {15, 7, 0},
180 {7, 6, 0},
181 {15, 10, 0},
182 },
183 /* UC 18 */
184 {
185 {7, 1, 0},
186 {31, 2, 0},
187 {15, 7, 0},
188 },
189 /* UC 19 */
190 {
191 {7, 1, 0},
192 {31, 2, 0},
193 {15, 7, 0},
194 {7, 6, 0},
195 {31, 18, 0},
196 {15, 10, 0},
197 },
198};
199
200enum {
201 SWR_NOT_PRESENT, /* Device is detached/not present on the bus */
202 SWR_ATTACHED_OK, /* Device is attached */
203 SWR_ALERT, /* Device alters master for any interrupts */
204 SWR_RESERVED, /* Reserved */
205};
206
207#define SWRM_MAX_PORT_REG 40
208#define SWRM_MAX_INIT_REG 8
209
210#define SWR_MSTR_MAX_REG_ADDR 0x1740
211#define SWR_MSTR_START_REG_ADDR 0x00
212#define SWR_MSTR_MAX_BUF_LEN 32
213#define BYTES_PER_LINE 12
214#define SWR_MSTR_RD_BUF_LEN 8
215#define SWR_MSTR_WR_BUF_LEN 32
216
217static void swrm_copy_data_port_config(struct swr_master *master,
218 u8 inactive_bank);
219static struct swr_mstr_ctrl *dbgswrm;
220static struct dentry *debugfs_swrm_dent;
221static struct dentry *debugfs_peek;
222static struct dentry *debugfs_poke;
223static struct dentry *debugfs_reg_dump;
224static unsigned int read_data;
225
226
227static bool swrm_is_msm_variant(int val)
228{
229 return (val == SWRM_VERSION_1_3);
230}
231
232static int swrm_debug_open(struct inode *inode, struct file *file)
233{
234 file->private_data = inode->i_private;
235 return 0;
236}
237
238static int get_parameters(char *buf, u32 *param1, int num_of_par)
239{
240 char *token;
241 int base, cnt;
242
243 token = strsep(&buf, " ");
244 for (cnt = 0; cnt < num_of_par; cnt++) {
245 if (token) {
246 if ((token[1] == 'x') || (token[1] == 'X'))
247 base = 16;
248 else
249 base = 10;
250
251 if (kstrtou32(token, base, &param1[cnt]) != 0)
252 return -EINVAL;
253
254 token = strsep(&buf, " ");
255 } else
256 return -EINVAL;
257 }
258 return 0;
259}
260
261static ssize_t swrm_reg_show(char __user *ubuf, size_t count,
262 loff_t *ppos)
263{
264 int i, reg_val, len;
265 ssize_t total = 0;
266 char tmp_buf[SWR_MSTR_MAX_BUF_LEN];
267
268 if (!ubuf || !ppos)
269 return 0;
270
271 for (i = (((int) *ppos / BYTES_PER_LINE) + SWR_MSTR_START_REG_ADDR);
272 i <= SWR_MSTR_MAX_REG_ADDR; i += 4) {
273 reg_val = dbgswrm->read(dbgswrm->handle, i);
274 len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i, reg_val);
275 if ((total + len) >= count - 1)
276 break;
277 if (copy_to_user((ubuf + total), tmp_buf, len)) {
278 pr_err("%s: fail to copy reg dump\n", __func__);
279 total = -EFAULT;
280 goto copy_err;
281 }
282 *ppos += len;
283 total += len;
284 }
285
286copy_err:
287 return total;
288}
289
290static ssize_t swrm_debug_read(struct file *file, char __user *ubuf,
291 size_t count, loff_t *ppos)
292{
293 char lbuf[SWR_MSTR_RD_BUF_LEN];
294 char *access_str;
295 ssize_t ret_cnt;
296
297 if (!count || !file || !ppos || !ubuf)
298 return -EINVAL;
299
300 access_str = file->private_data;
301 if (*ppos < 0)
302 return -EINVAL;
303
304 if (!strcmp(access_str, "swrm_peek")) {
305 snprintf(lbuf, sizeof(lbuf), "0x%x\n", read_data);
306 ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf,
307 strnlen(lbuf, 7));
308 } else if (!strcmp(access_str, "swrm_reg_dump")) {
309 ret_cnt = swrm_reg_show(ubuf, count, ppos);
310 } else {
311 pr_err("%s: %s not permitted to read\n", __func__, access_str);
312 ret_cnt = -EPERM;
313 }
314 return ret_cnt;
315}
316
317static ssize_t swrm_debug_write(struct file *filp,
318 const char __user *ubuf, size_t cnt, loff_t *ppos)
319{
320 char lbuf[SWR_MSTR_WR_BUF_LEN];
321 int rc;
322 u32 param[5];
323 char *access_str;
324
325 if (!filp || !ppos || !ubuf)
326 return -EINVAL;
327
328 access_str = filp->private_data;
329 if (cnt > sizeof(lbuf) - 1)
330 return -EINVAL;
331
332 rc = copy_from_user(lbuf, ubuf, cnt);
333 if (rc)
334 return -EFAULT;
335
336 lbuf[cnt] = '\0';
337 if (!strcmp(access_str, "swrm_poke")) {
338 /* write */
339 rc = get_parameters(lbuf, param, 2);
340 if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) &&
341 (param[1] <= 0xFFFFFFFF) &&
342 (rc == 0))
343 rc = dbgswrm->write(dbgswrm->handle, param[0],
344 param[1]);
345 else
346 rc = -EINVAL;
347 } else if (!strcmp(access_str, "swrm_peek")) {
348 /* read */
349 rc = get_parameters(lbuf, param, 1);
350 if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && (rc == 0))
351 read_data = dbgswrm->read(dbgswrm->handle, param[0]);
352 else
353 rc = -EINVAL;
354 }
355 if (rc == 0)
356 rc = cnt;
357 else
358 pr_err("%s: rc = %d\n", __func__, rc);
359
360 return rc;
361}
362
363static const struct file_operations swrm_debug_ops = {
364 .open = swrm_debug_open,
365 .write = swrm_debug_write,
366 .read = swrm_debug_read,
367};
368
369static int swrm_set_ch_map(struct swr_mstr_ctrl *swrm, void *data)
370{
371 struct swr_mstr_port *pinfo = (struct swr_mstr_port *)data;
372
373 swrm->mstr_port = kzalloc(sizeof(struct swr_mstr_port), GFP_KERNEL);
374 if (swrm->mstr_port == NULL)
375 return -ENOMEM;
376 swrm->mstr_port->num_port = pinfo->num_port;
377 swrm->mstr_port->port = kzalloc((pinfo->num_port * sizeof(u8)),
378 GFP_KERNEL);
379 if (!swrm->mstr_port->port) {
380 kfree(swrm->mstr_port);
381 swrm->mstr_port = NULL;
382 return -ENOMEM;
383 }
384 memcpy(swrm->mstr_port->port, pinfo->port, pinfo->num_port);
385 return 0;
386}
387
388static bool swrm_is_port_en(struct swr_master *mstr)
389{
390 return !!(mstr->num_port);
391}
392
393static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable)
394{
395 if (!swrm->clk || !swrm->handle)
396 return -EINVAL;
397
398 if (enable) {
Laxminath Kasam8f7ccc22017-08-28 17:35:04 +0530399 swrm->clk_ref_count++;
400 if (swrm->clk_ref_count == 1) {
401 swrm->clk(swrm->handle, true);
402 swrm->state = SWR_MSTR_UP;
403 }
404 } else if (--swrm->clk_ref_count == 0) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530405 swrm->clk(swrm->handle, false);
406 swrm->state = SWR_MSTR_DOWN;
Laxminath Kasam8f7ccc22017-08-28 17:35:04 +0530407 } else if (swrm->clk_ref_count < 0) {
408 pr_err("%s: swrm clk count mismatch\n", __func__);
409 swrm->clk_ref_count = 0;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530410 }
411 return 0;
412}
413
414static int swrm_get_port_config(struct swr_master *master)
415{
416 u32 ch_rate = 0;
417 u32 num_ch = 0;
418 int i, uc_idx;
419 u32 portcount = 0;
420
421 for (i = 0; i < SWR_MSTR_PORT_LEN; i++) {
422 if (master->port[i].port_en) {
423 ch_rate += master->port[i].ch_rate;
424 num_ch += master->port[i].num_ch;
425 portcount++;
426 }
427 }
428 for (i = 0; i < ARRAY_SIZE(uc); i++) {
429 if ((uc[i].num_port == portcount) &&
430 (uc[i].num_ch == num_ch) &&
431 (uc[i].chrate == ch_rate)) {
432 uc_idx = i;
433 break;
434 }
435 }
436
437 if (i >= ARRAY_SIZE(uc)) {
438 dev_err(&master->dev,
439 "%s: usecase port:%d, num_ch:%d, chrate:%d not found\n",
440 __func__, master->num_port, num_ch, ch_rate);
441 return -EINVAL;
442 }
443 for (i = 0; i < SWR_MSTR_PORT_LEN; i++) {
444 if (master->port[i].port_en) {
445 master->port[i].sinterval = pp[uc_idx][i].si;
446 master->port[i].offset1 = pp[uc_idx][i].off1;
447 master->port[i].offset2 = pp[uc_idx][i].off2;
448 }
449 }
450 return 0;
451}
452
453static int swrm_get_master_port(u8 *mstr_port_id, u8 slv_port_id)
454{
455 int i;
456
457 for (i = 0; i < SWR_MSTR_PORT_LEN; i++) {
458 if (mstr_ports[i] == slv_port_id) {
459 *mstr_port_id = i;
460 return 0;
461 }
462 }
463 return -EINVAL;
464}
465
466static u32 swrm_get_packed_reg_val(u8 *cmd_id, u8 cmd_data,
467 u8 dev_addr, u16 reg_addr)
468{
469 u32 val;
470 u8 id = *cmd_id;
471
472 if (id != SWR_BROADCAST_CMD_ID) {
473 if (id < 14)
474 id += 1;
475 else
476 id = 0;
477 *cmd_id = id;
478 }
479 val = SWR_REG_VAL_PACK(cmd_data, dev_addr, id, reg_addr);
480
481 return val;
482}
483
484static int swrm_cmd_fifo_rd_cmd(struct swr_mstr_ctrl *swrm, int *cmd_data,
485 u8 dev_addr, u8 cmd_id, u16 reg_addr,
486 u32 len)
487{
488 u32 val;
489 int ret = 0;
490
491 val = swrm_get_packed_reg_val(&swrm->rcmd_id, len, dev_addr, reg_addr);
492 ret = swrm->write(swrm->handle, SWRM_CMD_FIFO_RD_CMD, val);
493 if (ret < 0) {
494 dev_err(swrm->dev, "%s: reg 0x%x write failed, err:%d\n",
495 __func__, val, ret);
496 goto err;
497 }
498 *cmd_data = swrm->read(swrm->handle, SWRM_CMD_FIFO_RD_FIFO_ADDR);
499 dev_dbg(swrm->dev,
500 "%s: reg: 0x%x, cmd_id: 0x%x, dev_id: 0x%x, cmd_data: 0x%x\n",
501 __func__, reg_addr, cmd_id, dev_addr, *cmd_data);
502err:
503 return ret;
504}
505
506static int swrm_cmd_fifo_wr_cmd(struct swr_mstr_ctrl *swrm, u8 cmd_data,
507 u8 dev_addr, u8 cmd_id, u16 reg_addr)
508{
509 u32 val;
510 int ret = 0;
511
512 if (!cmd_id)
513 val = swrm_get_packed_reg_val(&swrm->wcmd_id, cmd_data,
514 dev_addr, reg_addr);
515 else
516 val = swrm_get_packed_reg_val(&cmd_id, cmd_data,
517 dev_addr, reg_addr);
518
519 dev_dbg(swrm->dev,
520 "%s: reg: 0x%x, cmd_id: 0x%x, dev_id: 0x%x, cmd_data: 0x%x\n",
521 __func__, reg_addr, cmd_id, dev_addr, cmd_data);
522 ret = swrm->write(swrm->handle, SWRM_CMD_FIFO_WR_CMD, val);
523 if (ret < 0) {
524 dev_err(swrm->dev, "%s: reg 0x%x write failed, err:%d\n",
525 __func__, val, ret);
526 goto err;
527 }
528 if (cmd_id == 0xF) {
529 /*
530 * sleep for 10ms for MSM soundwire variant to allow broadcast
531 * command to complete.
532 */
533 if (swrm_is_msm_variant(swrm->version))
534 usleep_range(10000, 10100);
535 else
536 wait_for_completion_timeout(&swrm->broadcast,
537 (2 * HZ/10));
538 }
539err:
540 return ret;
541}
542
543static int swrm_read(struct swr_master *master, u8 dev_num, u16 reg_addr,
544 void *buf, u32 len)
545{
546 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
547 int ret = 0;
548 int val;
549 u8 *reg_val = (u8 *)buf;
550
551 if (!swrm) {
552 dev_err(&master->dev, "%s: swrm is NULL\n", __func__);
553 return -EINVAL;
554 }
555
556 if (dev_num)
557 ret = swrm_cmd_fifo_rd_cmd(swrm, &val, dev_num, 0, reg_addr,
558 len);
559 else
560 val = swrm->read(swrm->handle, reg_addr);
561
562 if (!ret)
563 *reg_val = (u8)val;
564
565 pm_runtime_mark_last_busy(&swrm->pdev->dev);
566
567 return ret;
568}
569
570static int swrm_write(struct swr_master *master, u8 dev_num, u16 reg_addr,
571 const void *buf)
572{
573 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
574 int ret = 0;
575 u8 reg_val = *(u8 *)buf;
576
577 if (!swrm) {
578 dev_err(&master->dev, "%s: swrm is NULL\n", __func__);
579 return -EINVAL;
580 }
581
582 if (dev_num)
583 ret = swrm_cmd_fifo_wr_cmd(swrm, reg_val, dev_num, 0, reg_addr);
584 else
585 ret = swrm->write(swrm->handle, reg_addr, reg_val);
586
587 pm_runtime_mark_last_busy(&swrm->pdev->dev);
588
589 return ret;
590}
591
592static int swrm_bulk_write(struct swr_master *master, u8 dev_num, void *reg,
593 const void *buf, size_t len)
594{
595 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
596 int ret = 0;
597 int i;
598 u32 *val;
599 u32 *swr_fifo_reg;
600
601 if (!swrm || !swrm->handle) {
602 dev_err(&master->dev, "%s: swrm is NULL\n", __func__);
603 return -EINVAL;
604 }
605 if (len <= 0)
606 return -EINVAL;
607
608 if (dev_num) {
609 swr_fifo_reg = kcalloc(len, sizeof(u32), GFP_KERNEL);
610 if (!swr_fifo_reg) {
611 ret = -ENOMEM;
612 goto err;
613 }
614 val = kcalloc(len, sizeof(u32), GFP_KERNEL);
615 if (!val) {
616 ret = -ENOMEM;
617 goto mem_fail;
618 }
619
620 for (i = 0; i < len; i++) {
621 val[i] = swrm_get_packed_reg_val(&swrm->wcmd_id,
622 ((u8 *)buf)[i],
623 dev_num,
624 ((u16 *)reg)[i]);
625 swr_fifo_reg[i] = SWRM_CMD_FIFO_WR_CMD;
626 }
627 ret = swrm->bulk_write(swrm->handle, swr_fifo_reg, val, len);
628 if (ret) {
629 dev_err(&master->dev, "%s: bulk write failed\n",
630 __func__);
631 ret = -EINVAL;
632 }
633 } else {
634 dev_err(&master->dev,
635 "%s: No support of Bulk write for master regs\n",
636 __func__);
637 ret = -EINVAL;
638 goto err;
639 }
640 kfree(val);
641mem_fail:
642 kfree(swr_fifo_reg);
643err:
644 pm_runtime_mark_last_busy(&swrm->pdev->dev);
645 return ret;
646}
647
648static u8 get_inactive_bank_num(struct swr_mstr_ctrl *swrm)
649{
650 return (swrm->read(swrm->handle, SWRM_MCP_STATUS) &
651 SWRM_MCP_STATUS_BANK_NUM_MASK) ? 0 : 1;
652}
653
654static void enable_bank_switch(struct swr_mstr_ctrl *swrm, u8 bank,
655 u8 row, u8 col)
656{
657 swrm_cmd_fifo_wr_cmd(swrm, ((row << 3) | col), 0xF, 0xF,
658 SWRS_SCP_FRAME_CTRL_BANK(bank));
659}
660
661static struct swr_port_info *swrm_get_port(struct swr_master *master,
662 u8 port_id)
663{
664 int i;
665 struct swr_port_info *port = NULL;
666
667 for (i = 0; i < SWR_MSTR_PORT_LEN; i++) {
668 port = &master->port[i];
669 if (port->port_id == port_id) {
670 dev_dbg(&master->dev, "%s: port_id: %d, index: %d\n",
671 __func__, port_id, i);
672 return port;
673 }
674 }
675
676 return NULL;
677}
678
679static struct swr_port_info *swrm_get_avail_port(struct swr_master *master)
680{
681 int i;
682 struct swr_port_info *port = NULL;
683
684 for (i = 0; i < SWR_MSTR_PORT_LEN; i++) {
685 port = &master->port[i];
686 if (port->port_en)
687 continue;
688
689 dev_dbg(&master->dev, "%s: port_id: %d, index: %d\n",
690 __func__, port->port_id, i);
691 return port;
692 }
693
694 return NULL;
695}
696
697static struct swr_port_info *swrm_get_enabled_port(struct swr_master *master,
698 u8 port_id)
699{
700 int i;
701 struct swr_port_info *port = NULL;
702
703 for (i = 0; i < SWR_MSTR_PORT_LEN; i++) {
704 port = &master->port[i];
705 if ((port->port_id == port_id) && (port->port_en == true))
706 break;
707 }
708 if (i == SWR_MSTR_PORT_LEN)
709 port = NULL;
710 return port;
711}
712
713static bool swrm_remove_from_group(struct swr_master *master)
714{
715 struct swr_device *swr_dev;
716 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
717 bool is_removed = false;
718
719 if (!swrm)
720 goto end;
721
722 mutex_lock(&swrm->mlock);
723 if ((swrm->num_rx_chs > 1) &&
724 (swrm->num_rx_chs == swrm->num_cfg_devs)) {
725 list_for_each_entry(swr_dev, &master->devices,
726 dev_list) {
727 swr_dev->group_id = SWR_GROUP_NONE;
728 master->gr_sid = 0;
729 }
730 is_removed = true;
731 }
732 mutex_unlock(&swrm->mlock);
733
734end:
735 return is_removed;
736}
737
738static void swrm_cleanup_disabled_data_ports(struct swr_master *master,
739 u8 bank)
740{
741 u32 value;
742 struct swr_port_info *port;
743 int i;
744 int port_type;
745 struct swrm_mports *mport, *mport_next = NULL;
746 int port_disable_cnt = 0;
747 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
748
749 if (!swrm) {
750 pr_err("%s: swrm is null\n", __func__);
751 return;
752 }
753
754 dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__,
755 master->num_port);
756
757 mport = list_first_entry_or_null(&swrm->mport_list,
758 struct swrm_mports,
759 list);
760 if (!mport) {
761 dev_err(swrm->dev, "%s: list is empty\n", __func__);
762 return;
763 }
764
765 for (i = 0; i < master->num_port; i++) {
766 port = swrm_get_port(master, mstr_ports[mport->id]);
767 if (!port || port->ch_en)
768 goto inc_loop;
769
770 port_disable_cnt++;
771 port_type = mstr_port_type[mport->id];
772 value = ((port->ch_en)
773 << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT);
774 value |= ((port->offset2)
775 << SWRM_DP_PORT_CTRL_OFFSET2_SHFT);
776 value |= ((port->offset1)
777 << SWRM_DP_PORT_CTRL_OFFSET1_SHFT);
778 value |= port->sinterval;
779
780 swrm->write(swrm->handle,
781 SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank),
782 value);
783 swrm_cmd_fifo_wr_cmd(swrm, 0x00, port->dev_id, 0x00,
784 SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank));
785
786 dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n",
787 __func__, mport->id,
788 (SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank)), value);
789
790inc_loop:
791 mport_next = list_next_entry(mport, list);
792 if (port && !port->ch_en) {
793 list_del(&mport->list);
794 kfree(mport);
795 }
796 if (!mport_next) {
797 dev_err(swrm->dev, "%s: end of list\n", __func__);
798 break;
799 }
800 mport = mport_next;
801 }
802 master->num_port -= port_disable_cnt;
803
804 dev_dbg(swrm->dev, "%s:disable ports: %d, active ports (rem): %d\n",
805 __func__, port_disable_cnt, master->num_port);
806}
807
808static void swrm_slvdev_datapath_control(struct swr_master *master,
809 bool enable)
810{
811 u8 bank;
812 u32 value, n_col;
813 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
814 int mask = (SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK |
815 SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK |
816 SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_BMSK);
817 u8 inactive_bank;
818
819 if (!swrm) {
820 pr_err("%s: swrm is null\n", __func__);
821 return;
822 }
823
824 bank = get_inactive_bank_num(swrm);
825
826 dev_dbg(swrm->dev, "%s: enable: %d, cfg_devs: %d\n",
827 __func__, enable, swrm->num_cfg_devs);
828
829 if (enable) {
830 /* set Row = 48 and col = 16 */
831 n_col = SWR_MAX_COL;
832 } else {
833 /*
834 * Do not change to 48x2 if number of channels configured
835 * as stereo and if disable datapath is called for the
836 * first slave device
837 */
838 if (swrm->num_cfg_devs > 0)
839 n_col = SWR_MAX_COL;
840 else
841 n_col = SWR_MIN_COL;
842
843 /*
844 * All ports are already disabled, no need to perform
845 * bank-switch and copy operation. This case can arise
846 * when speaker channels are enabled in stereo mode with
847 * BROADCAST and disabled in GROUP_NONE
848 */
849 if (master->num_port == 0)
850 return;
851 }
852
853 value = swrm->read(swrm->handle, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank));
854 value &= (~mask);
855 value |= ((0 << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) |
856 (n_col << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) |
857 (0 << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT));
858 swrm->write(swrm->handle, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value);
859
860 dev_dbg(swrm->dev, "%s: regaddr: 0x%x, value: 0x%x\n", __func__,
861 SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value);
862
863 enable_bank_switch(swrm, bank, SWR_MAX_ROW, n_col);
864
865 inactive_bank = bank ? 0 : 1;
866 if (enable)
867 swrm_copy_data_port_config(master, inactive_bank);
868 else
869 swrm_cleanup_disabled_data_ports(master, inactive_bank);
870
871 if (!swrm_is_port_en(master)) {
872 dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n",
873 __func__);
874 pm_runtime_mark_last_busy(&swrm->pdev->dev);
875 pm_runtime_put_autosuspend(&swrm->pdev->dev);
876 }
877}
878
879static void swrm_apply_port_config(struct swr_master *master)
880{
881 u8 bank;
882 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
883
884 if (!swrm) {
885 pr_err("%s: Invalid handle to swr controller\n",
886 __func__);
887 return;
888 }
889
890 bank = get_inactive_bank_num(swrm);
891 dev_dbg(swrm->dev, "%s: enter bank: %d master_ports: %d\n",
892 __func__, bank, master->num_port);
893
894
895 swrm_cmd_fifo_wr_cmd(swrm, 0x01, 0xF, 0x00,
896 SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(bank));
897
898 swrm_copy_data_port_config(master, bank);
899}
900
901static void swrm_copy_data_port_config(struct swr_master *master, u8 bank)
902{
903 u32 value;
904 struct swr_port_info *port;
905 int i;
906 int port_type;
907 struct swrm_mports *mport;
908 u32 reg[SWRM_MAX_PORT_REG];
909 u32 val[SWRM_MAX_PORT_REG];
910 int len = 0;
911 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
912
913 if (!swrm) {
914 pr_err("%s: swrm is null\n", __func__);
915 return;
916 }
917
918 dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__,
919 master->num_port);
920
921 mport = list_first_entry_or_null(&swrm->mport_list,
922 struct swrm_mports,
923 list);
924 if (!mport) {
925 dev_err(swrm->dev, "%s: list is empty\n", __func__);
926 return;
927 }
928 for (i = 0; i < master->num_port; i++) {
929
930 port = swrm_get_enabled_port(master, mstr_ports[mport->id]);
931 if (!port)
932 continue;
933 port_type = mstr_port_type[mport->id];
934 if (!port->dev_id || (port->dev_id > master->num_dev)) {
935 dev_dbg(swrm->dev, "%s: invalid device id = %d\n",
936 __func__, port->dev_id);
937 continue;
938 }
939 value = ((port->ch_en)
940 << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT);
941 value |= ((port->offset2)
942 << SWRM_DP_PORT_CTRL_OFFSET2_SHFT);
943 value |= ((port->offset1)
944 << SWRM_DP_PORT_CTRL_OFFSET1_SHFT);
945 value |= port->sinterval;
946
947 reg[len] = SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank);
948 val[len++] = value;
949
950 dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n",
951 __func__, mport->id,
952 (SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank)), value);
953
954 reg[len] = SWRM_CMD_FIFO_WR_CMD;
955 val[len++] = SWR_REG_VAL_PACK(port->ch_en, port->dev_id, 0x00,
956 SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank));
957
958 reg[len] = SWRM_CMD_FIFO_WR_CMD;
959 val[len++] = SWR_REG_VAL_PACK(port->sinterval,
960 port->dev_id, 0x00,
961 SWRS_DP_SAMPLE_CONTROL_1_BANK(port_type, bank));
962
963 reg[len] = SWRM_CMD_FIFO_WR_CMD;
964 val[len++] = SWR_REG_VAL_PACK(port->offset1,
965 port->dev_id, 0x00,
966 SWRS_DP_OFFSET_CONTROL_1_BANK(port_type, bank));
967
968 if (port_type != 0) {
969 reg[len] = SWRM_CMD_FIFO_WR_CMD;
970 val[len++] = SWR_REG_VAL_PACK(port->offset2,
971 port->dev_id, 0x00,
972 SWRS_DP_OFFSET_CONTROL_2_BANK(port_type,
973 bank));
974 }
975 mport = list_next_entry(mport, list);
976 if (!mport) {
977 dev_err(swrm->dev, "%s: end of list\n", __func__);
978 break;
979 }
980 }
981 swrm->bulk_write(swrm->handle, reg, val, len);
982}
983
984static int swrm_connect_port(struct swr_master *master,
985 struct swr_params *portinfo)
986{
987 int i;
988 struct swr_port_info *port;
989 int ret = 0;
990 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
991 struct swrm_mports *mport;
992 struct list_head *ptr, *next;
993
994 dev_dbg(&master->dev, "%s: enter\n", __func__);
995 if (!portinfo)
996 return -EINVAL;
997
998 if (!swrm) {
999 dev_err(&master->dev,
1000 "%s: Invalid handle to swr controller\n",
1001 __func__);
1002 return -EINVAL;
1003 }
1004
1005 mutex_lock(&swrm->mlock);
1006 if (!swrm_is_port_en(master))
1007 pm_runtime_get_sync(&swrm->pdev->dev);
1008
1009 for (i = 0; i < portinfo->num_port; i++) {
1010 mport = kzalloc(sizeof(struct swrm_mports), GFP_KERNEL);
1011 if (!mport) {
1012 ret = -ENOMEM;
1013 goto mem_fail;
1014 }
1015 ret = swrm_get_master_port(&mport->id,
1016 portinfo->port_id[i]);
1017 if (ret < 0) {
1018 dev_err(&master->dev,
1019 "%s: mstr portid for slv port %d not found\n",
1020 __func__, portinfo->port_id[i]);
1021 goto port_fail;
1022 }
1023 port = swrm_get_avail_port(master);
1024 if (!port) {
1025 dev_err(&master->dev,
1026 "%s: avail ports not found!\n", __func__);
1027 goto port_fail;
1028 }
1029 list_add(&mport->list, &swrm->mport_list);
1030 port->dev_id = portinfo->dev_id;
1031 port->port_id = portinfo->port_id[i];
1032 port->num_ch = portinfo->num_ch[i];
1033 port->ch_rate = portinfo->ch_rate[i];
1034 port->ch_en = portinfo->ch_en[i];
1035 port->port_en = true;
1036 dev_dbg(&master->dev,
1037 "%s: mstr port %d, slv port %d ch_rate %d num_ch %d\n",
1038 __func__, mport->id, port->port_id, port->ch_rate,
1039 port->num_ch);
1040 }
1041 master->num_port += portinfo->num_port;
1042 if (master->num_port >= SWR_MSTR_PORT_LEN)
1043 master->num_port = SWR_MSTR_PORT_LEN;
1044
1045 swrm_get_port_config(master);
1046 swr_port_response(master, portinfo->tid);
1047 swrm->num_cfg_devs += 1;
1048 dev_dbg(&master->dev, "%s: cfg_devs: %d, rx_chs: %d\n",
1049 __func__, swrm->num_cfg_devs, swrm->num_rx_chs);
1050 if (swrm->num_rx_chs > 1) {
1051 if (swrm->num_rx_chs == swrm->num_cfg_devs)
1052 swrm_apply_port_config(master);
1053 } else {
1054 swrm_apply_port_config(master);
1055 }
1056 mutex_unlock(&swrm->mlock);
1057 return 0;
1058
1059port_fail:
1060 kfree(mport);
1061mem_fail:
1062 list_for_each_safe(ptr, next, &swrm->mport_list) {
1063 mport = list_entry(ptr, struct swrm_mports, list);
1064 for (i = 0; i < portinfo->num_port; i++) {
1065 if (portinfo->port_id[i] == mstr_ports[mport->id]) {
1066 port = swrm_get_port(master,
1067 portinfo->port_id[i]);
1068 if (port)
1069 port->ch_en = false;
1070 list_del(&mport->list);
1071 kfree(mport);
1072 break;
1073 }
1074 }
1075 }
1076 mutex_unlock(&swrm->mlock);
1077 return ret;
1078}
1079
1080static int swrm_disconnect_port(struct swr_master *master,
1081 struct swr_params *portinfo)
1082{
1083 int i;
1084 struct swr_port_info *port;
1085 u8 bank;
1086 u32 value;
1087 int ret = 0;
1088 u8 mport_id = 0;
1089 int port_type = 0;
1090 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
1091
1092 if (!swrm) {
1093 dev_err(&master->dev,
1094 "%s: Invalid handle to swr controller\n",
1095 __func__);
1096 return -EINVAL;
1097 }
1098
1099 if (!portinfo) {
1100 dev_err(&master->dev, "%s: portinfo is NULL\n", __func__);
1101 return -EINVAL;
1102 }
1103 mutex_lock(&swrm->mlock);
1104 bank = get_inactive_bank_num(swrm);
1105 for (i = 0; i < portinfo->num_port; i++) {
1106 ret = swrm_get_master_port(&mport_id,
1107 portinfo->port_id[i]);
1108 if (ret < 0) {
1109 dev_err(&master->dev,
1110 "%s: mstr portid for slv port %d not found\n",
1111 __func__, portinfo->port_id[i]);
1112 mutex_unlock(&swrm->mlock);
1113 return -EINVAL;
1114 }
1115 port = swrm_get_enabled_port(master, portinfo->port_id[i]);
1116 if (!port) {
1117 dev_dbg(&master->dev, "%s: port %d already disabled\n",
1118 __func__, portinfo->port_id[i]);
1119 continue;
1120 }
1121 port_type = mstr_port_type[mport_id];
1122 port->dev_id = portinfo->dev_id;
1123 port->port_en = false;
1124 port->ch_en = 0;
1125 value = port->ch_en << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT;
1126 value |= (port->offset2 << SWRM_DP_PORT_CTRL_OFFSET2_SHFT);
1127 value |= (port->offset1 << SWRM_DP_PORT_CTRL_OFFSET1_SHFT);
1128 value |= port->sinterval;
1129
1130
1131 swrm->write(swrm->handle,
1132 SWRM_DP_PORT_CTRL_BANK((mport_id+1), bank),
1133 value);
1134 swrm_cmd_fifo_wr_cmd(swrm, 0x00, port->dev_id, 0x00,
1135 SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank));
1136 }
1137
1138 swr_port_response(master, portinfo->tid);
1139 swrm->num_cfg_devs -= 1;
1140 dev_dbg(&master->dev, "%s: cfg_devs: %d, rx_chs: %d, active ports: %d\n",
1141 __func__, swrm->num_cfg_devs, swrm->num_rx_chs,
1142 master->num_port);
1143 mutex_unlock(&swrm->mlock);
1144
1145 return 0;
1146}
1147
1148static int swrm_check_slave_change_status(struct swr_mstr_ctrl *swrm,
1149 int status, u8 *devnum)
1150{
1151 int i;
1152 int new_sts = status;
1153 int ret = SWR_NOT_PRESENT;
1154
1155 if (status != swrm->slave_status) {
1156 for (i = 0; i < (swrm->master.num_dev + 1); i++) {
1157 if ((status & SWRM_MCP_SLV_STATUS_MASK) !=
1158 (swrm->slave_status & SWRM_MCP_SLV_STATUS_MASK)) {
1159 ret = (status & SWRM_MCP_SLV_STATUS_MASK);
1160 *devnum = i;
1161 break;
1162 }
1163 status >>= 2;
1164 swrm->slave_status >>= 2;
1165 }
1166 swrm->slave_status = new_sts;
1167 }
1168 return ret;
1169}
1170
1171static irqreturn_t swr_mstr_interrupt(int irq, void *dev)
1172{
1173 struct swr_mstr_ctrl *swrm = dev;
1174 u32 value, intr_sts;
1175 int status, chg_sts, i;
1176 u8 devnum = 0;
1177 int ret = IRQ_HANDLED;
1178
Laxminath Kasam8f7ccc22017-08-28 17:35:04 +05301179 mutex_lock(&swrm->reslock);
1180 swrm_clk_request(swrm, true);
1181 mutex_unlock(&swrm->reslock);
1182
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301183 intr_sts = swrm->read(swrm->handle, SWRM_INTERRUPT_STATUS);
1184 intr_sts &= SWRM_INTERRUPT_STATUS_RMSK;
1185 for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
1186 value = intr_sts & (1 << i);
1187 if (!value)
1188 continue;
1189
1190 swrm->write(swrm->handle, SWRM_INTERRUPT_CLEAR, value);
1191 switch (value) {
1192 case SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ:
1193 dev_dbg(swrm->dev, "SWR slave pend irq\n");
1194 break;
1195 case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED:
1196 dev_dbg(swrm->dev, "SWR new slave attached\n");
1197 break;
1198 case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS:
1199 status = swrm->read(swrm->handle, SWRM_MCP_SLV_STATUS);
1200 if (status == swrm->slave_status) {
1201 dev_dbg(swrm->dev,
1202 "%s: No change in slave status: %d\n",
1203 __func__, status);
1204 break;
1205 }
1206 chg_sts = swrm_check_slave_change_status(swrm, status,
1207 &devnum);
1208 switch (chg_sts) {
1209 case SWR_NOT_PRESENT:
1210 dev_dbg(swrm->dev, "device %d got detached\n",
1211 devnum);
1212 break;
1213 case SWR_ATTACHED_OK:
1214 dev_dbg(swrm->dev, "device %d got attached\n",
1215 devnum);
1216 break;
1217 case SWR_ALERT:
1218 dev_dbg(swrm->dev,
1219 "device %d has pending interrupt\n",
1220 devnum);
1221 break;
1222 }
1223 break;
1224 case SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET:
1225 dev_err_ratelimited(swrm->dev, "SWR bus clash detected\n");
1226 break;
1227 case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW:
1228 dev_dbg(swrm->dev, "SWR read FIFO overflow\n");
1229 break;
1230 case SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW:
1231 dev_dbg(swrm->dev, "SWR read FIFO underflow\n");
1232 break;
1233 case SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW:
1234 dev_dbg(swrm->dev, "SWR write FIFO overflow\n");
1235 break;
1236 case SWRM_INTERRUPT_STATUS_CMD_ERROR:
1237 value = swrm->read(swrm->handle, SWRM_CMD_FIFO_STATUS);
1238 dev_err_ratelimited(swrm->dev,
1239 "SWR CMD error, fifo status 0x%x, flushing fifo\n",
1240 value);
1241 swrm->write(swrm->handle, SWRM_CMD_FIFO_CMD, 0x1);
1242 break;
1243 case SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION:
1244 dev_dbg(swrm->dev, "SWR Port collision detected\n");
1245 break;
1246 case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH:
1247 dev_dbg(swrm->dev, "SWR read enable valid mismatch\n");
1248 break;
1249 case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED:
1250 complete(&swrm->broadcast);
1251 dev_dbg(swrm->dev, "SWR cmd id finished\n");
1252 break;
1253 case SWRM_INTERRUPT_STATUS_NEW_SLAVE_AUTO_ENUM_FINISHED:
1254 break;
1255 case SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED:
1256 break;
1257 case SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL:
1258 break;
1259 case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED:
1260 complete(&swrm->reset);
1261 break;
1262 case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED:
1263 break;
1264 default:
1265 dev_err_ratelimited(swrm->dev, "SWR unknown interrupt\n");
1266 ret = IRQ_NONE;
1267 break;
1268 }
1269 }
Laxminath Kasam8f7ccc22017-08-28 17:35:04 +05301270
1271 mutex_lock(&swrm->reslock);
1272 swrm_clk_request(swrm, false);
1273 mutex_unlock(&swrm->reslock);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301274 return ret;
1275}
1276
1277static int swrm_get_device_status(struct swr_mstr_ctrl *swrm, u8 devnum)
1278{
1279 u32 val;
1280
1281 swrm->slave_status = swrm->read(swrm->handle, SWRM_MCP_SLV_STATUS);
1282 val = (swrm->slave_status >> (devnum * 2));
1283 val &= SWRM_MCP_SLV_STATUS_MASK;
1284 return val;
1285}
1286
1287static int swrm_get_logical_dev_num(struct swr_master *mstr, u64 dev_id,
1288 u8 *dev_num)
1289{
1290 int i;
1291 u64 id = 0;
1292 int ret = -EINVAL;
1293 struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr);
Vidyakumar Athota462a0ec2018-01-22 15:44:58 -08001294 struct swr_device *swr_dev;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301295
1296 if (!swrm) {
1297 pr_err("%s: Invalid handle to swr controller\n",
1298 __func__);
1299 return ret;
1300 }
1301
1302 pm_runtime_get_sync(&swrm->pdev->dev);
1303 for (i = 1; i < (mstr->num_dev + 1); i++) {
1304 id = ((u64)(swrm->read(swrm->handle,
1305 SWRM_ENUMERATOR_SLAVE_DEV_ID_2(i))) << 32);
1306 id |= swrm->read(swrm->handle,
1307 SWRM_ENUMERATOR_SLAVE_DEV_ID_1(i));
Vidyakumar Athota462a0ec2018-01-22 15:44:58 -08001308 /*
1309 * As pm_runtime_get_sync() brings all slaves out of reset
1310 * update logical device number for all slaves.
1311 */
1312 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1313 if (swr_dev->addr == (id & SWR_DEV_ID_MASK)) {
1314 u32 status = swrm_get_device_status(swrm, i);
1315
1316 if ((status == 0x01) || (status == 0x02)) {
1317 swr_dev->dev_num = i;
1318 if ((id & SWR_DEV_ID_MASK) == dev_id) {
1319 *dev_num = i;
1320 ret = 0;
1321 }
1322 dev_dbg(swrm->dev, "%s: devnum %d is assigned for dev addr %lx\n",
1323 __func__, i, swr_dev->addr);
1324 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301325 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301326 }
1327 }
Vidyakumar Athota462a0ec2018-01-22 15:44:58 -08001328 if (ret)
1329 dev_err(swrm->dev, "%s: device 0x%llx is not ready\n",
1330 __func__, dev_id);
1331
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301332 pm_runtime_mark_last_busy(&swrm->pdev->dev);
1333 pm_runtime_put_autosuspend(&swrm->pdev->dev);
1334 return ret;
1335}
1336static int swrm_master_init(struct swr_mstr_ctrl *swrm)
1337{
1338 int ret = 0;
1339 u32 val;
1340 u8 row_ctrl = SWR_MAX_ROW;
1341 u8 col_ctrl = SWR_MIN_COL;
1342 u8 ssp_period = 1;
1343 u8 retry_cmd_num = 3;
1344 u32 reg[SWRM_MAX_INIT_REG];
1345 u32 value[SWRM_MAX_INIT_REG];
1346 int len = 0;
1347
1348 /* Clear Rows and Cols */
1349 val = ((row_ctrl << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) |
1350 (col_ctrl << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) |
1351 (ssp_period << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT));
1352
1353 reg[len] = SWRM_MCP_FRAME_CTRL_BANK_ADDR(0);
1354 value[len++] = val;
1355
1356 /* Set Auto enumeration flag */
1357 reg[len] = SWRM_ENUMERATOR_CFG_ADDR;
1358 value[len++] = 1;
1359
1360 /* Mask soundwire interrupts */
1361 reg[len] = SWRM_INTERRUPT_MASK_ADDR;
1362 value[len++] = 0x1FFFD;
1363
1364 /* Configure No pings */
1365 val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR);
1366 val &= ~SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK;
1367 val |= (0x1f << SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT);
1368 reg[len] = SWRM_MCP_CFG_ADDR;
1369 value[len++] = val;
1370
1371 /* Configure number of retries of a read/write cmd */
1372 val = (retry_cmd_num << SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT);
1373 reg[len] = SWRM_CMD_FIFO_CFG_ADDR;
1374 value[len++] = val;
1375
1376 /* Set IRQ to PULSE */
1377 reg[len] = SWRM_COMP_CFG_ADDR;
1378 value[len++] = 0x02;
1379
1380 reg[len] = SWRM_COMP_CFG_ADDR;
1381 value[len++] = 0x03;
1382
1383 reg[len] = SWRM_INTERRUPT_CLEAR;
1384 value[len++] = 0x08;
1385
1386 swrm->bulk_write(swrm->handle, reg, value, len);
1387
1388 return ret;
1389}
1390
1391static int swrm_probe(struct platform_device *pdev)
1392{
1393 struct swr_mstr_ctrl *swrm;
1394 struct swr_ctrl_platform_data *pdata;
1395 int ret;
1396
1397 /* Allocate soundwire master driver structure */
1398 swrm = kzalloc(sizeof(struct swr_mstr_ctrl), GFP_KERNEL);
1399 if (!swrm) {
1400 ret = -ENOMEM;
1401 goto err_memory_fail;
1402 }
1403 swrm->dev = &pdev->dev;
1404 swrm->pdev = pdev;
1405 platform_set_drvdata(pdev, swrm);
1406 swr_set_ctrl_data(&swrm->master, swrm);
1407 pdata = dev_get_platdata(&pdev->dev);
1408 if (!pdata) {
1409 dev_err(&pdev->dev, "%s: pdata from parent is NULL\n",
1410 __func__);
1411 ret = -EINVAL;
1412 goto err_pdata_fail;
1413 }
1414 swrm->handle = (void *)pdata->handle;
1415 if (!swrm->handle) {
1416 dev_err(&pdev->dev, "%s: swrm->handle is NULL\n",
1417 __func__);
1418 ret = -EINVAL;
1419 goto err_pdata_fail;
1420 }
1421 swrm->read = pdata->read;
1422 if (!swrm->read) {
1423 dev_err(&pdev->dev, "%s: swrm->read is NULL\n",
1424 __func__);
1425 ret = -EINVAL;
1426 goto err_pdata_fail;
1427 }
1428 swrm->write = pdata->write;
1429 if (!swrm->write) {
1430 dev_err(&pdev->dev, "%s: swrm->write is NULL\n",
1431 __func__);
1432 ret = -EINVAL;
1433 goto err_pdata_fail;
1434 }
1435 swrm->bulk_write = pdata->bulk_write;
1436 if (!swrm->bulk_write) {
1437 dev_err(&pdev->dev, "%s: swrm->bulk_write is NULL\n",
1438 __func__);
1439 ret = -EINVAL;
1440 goto err_pdata_fail;
1441 }
1442 swrm->clk = pdata->clk;
1443 if (!swrm->clk) {
1444 dev_err(&pdev->dev, "%s: swrm->clk is NULL\n",
1445 __func__);
1446 ret = -EINVAL;
1447 goto err_pdata_fail;
1448 }
1449 swrm->reg_irq = pdata->reg_irq;
1450 if (!swrm->reg_irq) {
1451 dev_err(&pdev->dev, "%s: swrm->reg_irq is NULL\n",
1452 __func__);
1453 ret = -EINVAL;
1454 goto err_pdata_fail;
1455 }
1456 swrm->master.read = swrm_read;
1457 swrm->master.write = swrm_write;
1458 swrm->master.bulk_write = swrm_bulk_write;
1459 swrm->master.get_logical_dev_num = swrm_get_logical_dev_num;
1460 swrm->master.connect_port = swrm_connect_port;
1461 swrm->master.disconnect_port = swrm_disconnect_port;
1462 swrm->master.slvdev_datapath_control = swrm_slvdev_datapath_control;
1463 swrm->master.remove_from_group = swrm_remove_from_group;
1464 swrm->master.dev.parent = &pdev->dev;
1465 swrm->master.dev.of_node = pdev->dev.of_node;
1466 swrm->master.num_port = 0;
1467 swrm->num_enum_slaves = 0;
1468 swrm->rcmd_id = 0;
1469 swrm->wcmd_id = 0;
1470 swrm->slave_status = 0;
1471 swrm->num_rx_chs = 0;
Laxminath Kasam8f7ccc22017-08-28 17:35:04 +05301472 swrm->clk_ref_count = 0;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301473 swrm->state = SWR_MSTR_RESUME;
1474 init_completion(&swrm->reset);
1475 init_completion(&swrm->broadcast);
1476 mutex_init(&swrm->mlock);
1477 INIT_LIST_HEAD(&swrm->mport_list);
1478 mutex_init(&swrm->reslock);
1479
1480 ret = swrm->reg_irq(swrm->handle, swr_mstr_interrupt, swrm,
1481 SWR_IRQ_REGISTER);
1482 if (ret) {
1483 dev_err(&pdev->dev, "%s: IRQ register failed ret %d\n",
1484 __func__, ret);
1485 goto err_irq_fail;
1486 }
1487
1488 ret = swr_register_master(&swrm->master);
1489 if (ret) {
1490 dev_err(&pdev->dev, "%s: error adding swr master\n", __func__);
1491 goto err_mstr_fail;
1492 }
1493
1494 /* Add devices registered with board-info as the
1495 * controller will be up now
1496 */
1497 swr_master_add_boarddevices(&swrm->master);
1498 mutex_lock(&swrm->mlock);
1499 swrm_clk_request(swrm, true);
1500 ret = swrm_master_init(swrm);
1501 if (ret < 0) {
1502 dev_err(&pdev->dev,
1503 "%s: Error in master Initializaiton, err %d\n",
1504 __func__, ret);
1505 mutex_unlock(&swrm->mlock);
1506 goto err_mstr_fail;
1507 }
1508 swrm->version = swrm->read(swrm->handle, SWRM_COMP_HW_VERSION);
1509
1510 mutex_unlock(&swrm->mlock);
1511
1512 if (pdev->dev.of_node)
1513 of_register_swr_devices(&swrm->master);
1514
1515 dbgswrm = swrm;
1516 debugfs_swrm_dent = debugfs_create_dir(dev_name(&pdev->dev), 0);
1517 if (!IS_ERR(debugfs_swrm_dent)) {
1518 debugfs_peek = debugfs_create_file("swrm_peek",
1519 S_IFREG | 0444, debugfs_swrm_dent,
1520 (void *) "swrm_peek", &swrm_debug_ops);
1521
1522 debugfs_poke = debugfs_create_file("swrm_poke",
1523 S_IFREG | 0444, debugfs_swrm_dent,
1524 (void *) "swrm_poke", &swrm_debug_ops);
1525
1526 debugfs_reg_dump = debugfs_create_file("swrm_reg_dump",
1527 S_IFREG | 0444, debugfs_swrm_dent,
1528 (void *) "swrm_reg_dump",
1529 &swrm_debug_ops);
1530 }
1531 pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer);
1532 pm_runtime_use_autosuspend(&pdev->dev);
1533 pm_runtime_set_active(&pdev->dev);
1534 pm_runtime_enable(&pdev->dev);
1535 pm_runtime_mark_last_busy(&pdev->dev);
1536
1537 return 0;
1538err_mstr_fail:
1539 swrm->reg_irq(swrm->handle, swr_mstr_interrupt,
1540 swrm, SWR_IRQ_FREE);
1541err_irq_fail:
1542err_pdata_fail:
1543 kfree(swrm);
1544err_memory_fail:
1545 return ret;
1546}
1547
1548static int swrm_remove(struct platform_device *pdev)
1549{
1550 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1551
Laxminath Kasam468ece32017-11-28 12:40:22 +05301552 if (swrm->reg_irq)
1553 swrm->reg_irq(swrm->handle, swr_mstr_interrupt,
1554 swrm, SWR_IRQ_FREE);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301555 if (swrm->mstr_port) {
1556 kfree(swrm->mstr_port->port);
1557 swrm->mstr_port->port = NULL;
1558 kfree(swrm->mstr_port);
1559 swrm->mstr_port = NULL;
1560 }
1561 pm_runtime_disable(&pdev->dev);
1562 pm_runtime_set_suspended(&pdev->dev);
1563 swr_unregister_master(&swrm->master);
1564 mutex_destroy(&swrm->mlock);
1565 mutex_destroy(&swrm->reslock);
1566 kfree(swrm);
1567 return 0;
1568}
1569
1570static int swrm_clk_pause(struct swr_mstr_ctrl *swrm)
1571{
1572 u32 val;
1573
1574 dev_dbg(swrm->dev, "%s: state: %d\n", __func__, swrm->state);
1575 swrm->write(swrm->handle, SWRM_INTERRUPT_MASK_ADDR, 0x1FDFD);
1576 val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR);
1577 val |= SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK;
1578 swrm->write(swrm->handle, SWRM_MCP_CFG_ADDR, val);
1579 swrm->state = SWR_MSTR_PAUSE;
1580
1581 return 0;
1582}
1583
1584#ifdef CONFIG_PM
1585static int swrm_runtime_resume(struct device *dev)
1586{
1587 struct platform_device *pdev = to_platform_device(dev);
1588 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1589 int ret = 0;
1590 struct swr_master *mstr = &swrm->master;
1591 struct swr_device *swr_dev;
1592
1593 dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
1594 __func__, swrm->state);
1595 mutex_lock(&swrm->reslock);
1596 if ((swrm->state == SWR_MSTR_PAUSE) ||
1597 (swrm->state == SWR_MSTR_DOWN)) {
1598 if (swrm->state == SWR_MSTR_DOWN) {
1599 if (swrm_clk_request(swrm, true))
1600 goto exit;
1601 }
1602 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1603 ret = swr_device_up(swr_dev);
1604 if (ret) {
1605 dev_err(dev,
1606 "%s: failed to wakeup swr dev %d\n",
1607 __func__, swr_dev->dev_num);
1608 swrm_clk_request(swrm, false);
1609 goto exit;
1610 }
1611 }
1612 swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01);
1613 swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01);
1614 swrm_master_init(swrm);
1615 }
1616exit:
1617 pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer);
1618 mutex_unlock(&swrm->reslock);
1619 return ret;
1620}
1621
1622static int swrm_runtime_suspend(struct device *dev)
1623{
1624 struct platform_device *pdev = to_platform_device(dev);
1625 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1626 int ret = 0;
1627 struct swr_master *mstr = &swrm->master;
1628 struct swr_device *swr_dev;
1629
1630 dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n",
1631 __func__, swrm->state);
1632 mutex_lock(&swrm->reslock);
1633 if ((swrm->state == SWR_MSTR_RESUME) ||
1634 (swrm->state == SWR_MSTR_UP)) {
1635 if (swrm_is_port_en(&swrm->master)) {
1636 dev_dbg(dev, "%s ports are enabled\n", __func__);
1637 ret = -EBUSY;
1638 goto exit;
1639 }
1640 swrm_clk_pause(swrm);
1641 swrm->write(swrm->handle, SWRM_COMP_CFG_ADDR, 0x00);
1642 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1643 ret = swr_device_down(swr_dev);
1644 if (ret) {
1645 dev_err(dev,
1646 "%s: failed to shutdown swr dev %d\n",
1647 __func__, swr_dev->dev_num);
1648 goto exit;
1649 }
1650 }
1651 swrm_clk_request(swrm, false);
1652 }
1653exit:
1654 mutex_unlock(&swrm->reslock);
1655 return ret;
1656}
1657#endif /* CONFIG_PM */
1658
1659static int swrm_device_down(struct device *dev)
1660{
1661 struct platform_device *pdev = to_platform_device(dev);
1662 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1663 int ret = 0;
1664 struct swr_master *mstr = &swrm->master;
1665 struct swr_device *swr_dev;
1666
1667 dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state);
1668 mutex_lock(&swrm->reslock);
1669 if ((swrm->state == SWR_MSTR_RESUME) ||
1670 (swrm->state == SWR_MSTR_UP)) {
1671 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1672 ret = swr_device_down(swr_dev);
1673 if (ret)
1674 dev_err(dev,
1675 "%s: failed to shutdown swr dev %d\n",
1676 __func__, swr_dev->dev_num);
1677 }
1678 dev_dbg(dev, "%s: Shutting down SWRM\n", __func__);
1679 pm_runtime_disable(dev);
1680 pm_runtime_set_suspended(dev);
1681 pm_runtime_enable(dev);
1682 swrm_clk_request(swrm, false);
1683 }
1684 mutex_unlock(&swrm->reslock);
1685 return ret;
1686}
1687
1688/**
1689 * swrm_wcd_notify - parent device can notify to soundwire master through
1690 * this function
1691 * @pdev: pointer to platform device structure
1692 * @id: command id from parent to the soundwire master
1693 * @data: data from parent device to soundwire master
1694 */
1695int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
1696{
1697 struct swr_mstr_ctrl *swrm;
1698 int ret = 0;
1699 struct swr_master *mstr;
1700 struct swr_device *swr_dev;
1701
1702 if (!pdev) {
1703 pr_err("%s: pdev is NULL\n", __func__);
1704 return -EINVAL;
1705 }
1706 swrm = platform_get_drvdata(pdev);
1707 if (!swrm) {
1708 dev_err(&pdev->dev, "%s: swrm is NULL\n", __func__);
1709 return -EINVAL;
1710 }
1711 mstr = &swrm->master;
1712
1713 switch (id) {
1714 case SWR_CH_MAP:
1715 if (!data) {
1716 dev_err(swrm->dev, "%s: data is NULL\n", __func__);
1717 ret = -EINVAL;
1718 } else {
1719 ret = swrm_set_ch_map(swrm, data);
1720 }
1721 break;
1722 case SWR_DEVICE_DOWN:
1723 dev_dbg(swrm->dev, "%s: swr master down called\n", __func__);
1724 mutex_lock(&swrm->mlock);
1725 if ((swrm->state == SWR_MSTR_PAUSE) ||
1726 (swrm->state == SWR_MSTR_DOWN))
1727 dev_dbg(swrm->dev, "%s: SWR master is already Down: %d\n",
1728 __func__, swrm->state);
1729 else
1730 swrm_device_down(&pdev->dev);
1731 mutex_unlock(&swrm->mlock);
1732 break;
1733 case SWR_DEVICE_UP:
1734 dev_dbg(swrm->dev, "%s: swr master up called\n", __func__);
1735 mutex_lock(&swrm->mlock);
1736 mutex_lock(&swrm->reslock);
1737 if ((swrm->state == SWR_MSTR_RESUME) ||
1738 (swrm->state == SWR_MSTR_UP)) {
1739 dev_dbg(swrm->dev, "%s: SWR master is already UP: %d\n",
1740 __func__, swrm->state);
1741 } else {
1742 pm_runtime_mark_last_busy(&pdev->dev);
1743 mutex_unlock(&swrm->reslock);
1744 pm_runtime_get_sync(&pdev->dev);
1745 mutex_lock(&swrm->reslock);
1746 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1747 ret = swr_reset_device(swr_dev);
1748 if (ret) {
1749 dev_err(swrm->dev,
1750 "%s: failed to reset swr device %d\n",
1751 __func__, swr_dev->dev_num);
1752 swrm_clk_request(swrm, false);
1753 }
1754 }
1755 pm_runtime_mark_last_busy(&pdev->dev);
1756 pm_runtime_put_autosuspend(&pdev->dev);
1757 }
1758 mutex_unlock(&swrm->reslock);
1759 mutex_unlock(&swrm->mlock);
1760 break;
1761 case SWR_SET_NUM_RX_CH:
1762 if (!data) {
1763 dev_err(swrm->dev, "%s: data is NULL\n", __func__);
1764 ret = -EINVAL;
1765 } else {
1766 mutex_lock(&swrm->mlock);
1767 swrm->num_rx_chs = *(int *)data;
1768 if ((swrm->num_rx_chs > 1) && !swrm->num_cfg_devs) {
1769 list_for_each_entry(swr_dev, &mstr->devices,
1770 dev_list) {
1771 ret = swr_set_device_group(swr_dev,
1772 SWR_BROADCAST);
1773 if (ret)
1774 dev_err(swrm->dev,
1775 "%s: set num ch failed\n",
1776 __func__);
1777 }
1778 } else {
1779 list_for_each_entry(swr_dev, &mstr->devices,
1780 dev_list) {
1781 ret = swr_set_device_group(swr_dev,
1782 SWR_GROUP_NONE);
1783 if (ret)
1784 dev_err(swrm->dev,
1785 "%s: set num ch failed\n",
1786 __func__);
1787 }
1788 }
1789 mutex_unlock(&swrm->mlock);
1790 }
1791 break;
1792 default:
1793 dev_err(swrm->dev, "%s: swr master unknown id %d\n",
1794 __func__, id);
1795 break;
1796 }
1797 return ret;
1798}
1799EXPORT_SYMBOL(swrm_wcd_notify);
1800
1801#ifdef CONFIG_PM_SLEEP
1802static int swrm_suspend(struct device *dev)
1803{
1804 int ret = -EBUSY;
1805 struct platform_device *pdev = to_platform_device(dev);
1806 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1807
1808 dev_dbg(dev, "%s: system suspend, state: %d\n", __func__, swrm->state);
1809 if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) {
1810 ret = swrm_runtime_suspend(dev);
1811 if (!ret) {
1812 /*
1813 * Synchronize runtime-pm and system-pm states:
1814 * At this point, we are already suspended. If
1815 * runtime-pm still thinks its active, then
1816 * make sure its status is in sync with HW
1817 * status. The three below calls let the
1818 * runtime-pm know that we are suspended
1819 * already without re-invoking the suspend
1820 * callback
1821 */
1822 pm_runtime_disable(dev);
1823 pm_runtime_set_suspended(dev);
1824 pm_runtime_enable(dev);
1825 }
1826 }
1827 if (ret == -EBUSY) {
1828 /*
1829 * There is a possibility that some audio stream is active
1830 * during suspend. We dont want to return suspend failure in
1831 * that case so that display and relevant components can still
1832 * go to suspend.
1833 * If there is some other error, then it should be passed-on
1834 * to system level suspend
1835 */
1836 ret = 0;
1837 }
1838 return ret;
1839}
1840
1841static int swrm_resume(struct device *dev)
1842{
1843 int ret = 0;
1844 struct platform_device *pdev = to_platform_device(dev);
1845 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1846
1847 dev_dbg(dev, "%s: system resume, state: %d\n", __func__, swrm->state);
1848 if (!pm_runtime_enabled(dev) || !pm_runtime_suspend(dev)) {
1849 ret = swrm_runtime_resume(dev);
1850 if (!ret) {
1851 pm_runtime_mark_last_busy(dev);
1852 pm_request_autosuspend(dev);
1853 }
1854 }
1855 return ret;
1856}
1857#endif /* CONFIG_PM_SLEEP */
1858
1859static const struct dev_pm_ops swrm_dev_pm_ops = {
1860 SET_SYSTEM_SLEEP_PM_OPS(
1861 swrm_suspend,
1862 swrm_resume
1863 )
1864 SET_RUNTIME_PM_OPS(
1865 swrm_runtime_suspend,
1866 swrm_runtime_resume,
1867 NULL
1868 )
1869};
1870
1871static const struct of_device_id swrm_dt_match[] = {
1872 {
1873 .compatible = "qcom,swr-wcd",
1874 },
1875 {}
1876};
1877
1878static struct platform_driver swr_mstr_driver = {
1879 .probe = swrm_probe,
1880 .remove = swrm_remove,
1881 .driver = {
1882 .name = SWR_WCD_NAME,
1883 .owner = THIS_MODULE,
1884 .pm = &swrm_dev_pm_ops,
1885 .of_match_table = swrm_dt_match,
1886 },
1887};
1888
1889static int __init swrm_init(void)
1890{
1891 return platform_driver_register(&swr_mstr_driver);
1892}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +05301893module_init(swrm_init);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301894
1895static void __exit swrm_exit(void)
1896{
1897 platform_driver_unregister(&swr_mstr_driver);
1898}
1899module_exit(swrm_exit);
1900
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301901MODULE_LICENSE("GPL v2");
1902MODULE_DESCRIPTION("WCD SoundWire Controller");
1903MODULE_ALIAS("platform:swr-wcd");