blob: bb78372aa9e5e59dbeb9dac9cdb05f44b6a8a9e9 [file] [log] [blame]
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
2 *
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);
1294
1295 if (!swrm) {
1296 pr_err("%s: Invalid handle to swr controller\n",
1297 __func__);
1298 return ret;
1299 }
1300
1301 pm_runtime_get_sync(&swrm->pdev->dev);
1302 for (i = 1; i < (mstr->num_dev + 1); i++) {
1303 id = ((u64)(swrm->read(swrm->handle,
1304 SWRM_ENUMERATOR_SLAVE_DEV_ID_2(i))) << 32);
1305 id |= swrm->read(swrm->handle,
1306 SWRM_ENUMERATOR_SLAVE_DEV_ID_1(i));
1307 if ((id & SWR_DEV_ID_MASK) == dev_id) {
1308 if (swrm_get_device_status(swrm, i) == 0x01) {
1309 *dev_num = i;
1310 ret = 0;
1311 } else {
1312 dev_err(swrm->dev, "%s: device is not ready\n",
1313 __func__);
1314 }
1315 goto found;
1316 }
1317 }
1318 dev_err(swrm->dev, "%s: device id 0x%llx does not match with 0x%llx\n",
1319 __func__, id, dev_id);
1320found:
1321 pm_runtime_mark_last_busy(&swrm->pdev->dev);
1322 pm_runtime_put_autosuspend(&swrm->pdev->dev);
1323 return ret;
1324}
1325static int swrm_master_init(struct swr_mstr_ctrl *swrm)
1326{
1327 int ret = 0;
1328 u32 val;
1329 u8 row_ctrl = SWR_MAX_ROW;
1330 u8 col_ctrl = SWR_MIN_COL;
1331 u8 ssp_period = 1;
1332 u8 retry_cmd_num = 3;
1333 u32 reg[SWRM_MAX_INIT_REG];
1334 u32 value[SWRM_MAX_INIT_REG];
1335 int len = 0;
1336
1337 /* Clear Rows and Cols */
1338 val = ((row_ctrl << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) |
1339 (col_ctrl << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) |
1340 (ssp_period << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT));
1341
1342 reg[len] = SWRM_MCP_FRAME_CTRL_BANK_ADDR(0);
1343 value[len++] = val;
1344
1345 /* Set Auto enumeration flag */
1346 reg[len] = SWRM_ENUMERATOR_CFG_ADDR;
1347 value[len++] = 1;
1348
1349 /* Mask soundwire interrupts */
1350 reg[len] = SWRM_INTERRUPT_MASK_ADDR;
1351 value[len++] = 0x1FFFD;
1352
1353 /* Configure No pings */
1354 val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR);
1355 val &= ~SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK;
1356 val |= (0x1f << SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT);
1357 reg[len] = SWRM_MCP_CFG_ADDR;
1358 value[len++] = val;
1359
1360 /* Configure number of retries of a read/write cmd */
1361 val = (retry_cmd_num << SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT);
1362 reg[len] = SWRM_CMD_FIFO_CFG_ADDR;
1363 value[len++] = val;
1364
1365 /* Set IRQ to PULSE */
1366 reg[len] = SWRM_COMP_CFG_ADDR;
1367 value[len++] = 0x02;
1368
1369 reg[len] = SWRM_COMP_CFG_ADDR;
1370 value[len++] = 0x03;
1371
1372 reg[len] = SWRM_INTERRUPT_CLEAR;
1373 value[len++] = 0x08;
1374
1375 swrm->bulk_write(swrm->handle, reg, value, len);
1376
1377 return ret;
1378}
1379
1380static int swrm_probe(struct platform_device *pdev)
1381{
1382 struct swr_mstr_ctrl *swrm;
1383 struct swr_ctrl_platform_data *pdata;
1384 int ret;
1385
1386 /* Allocate soundwire master driver structure */
1387 swrm = kzalloc(sizeof(struct swr_mstr_ctrl), GFP_KERNEL);
1388 if (!swrm) {
1389 ret = -ENOMEM;
1390 goto err_memory_fail;
1391 }
1392 swrm->dev = &pdev->dev;
1393 swrm->pdev = pdev;
1394 platform_set_drvdata(pdev, swrm);
1395 swr_set_ctrl_data(&swrm->master, swrm);
1396 pdata = dev_get_platdata(&pdev->dev);
1397 if (!pdata) {
1398 dev_err(&pdev->dev, "%s: pdata from parent is NULL\n",
1399 __func__);
1400 ret = -EINVAL;
1401 goto err_pdata_fail;
1402 }
1403 swrm->handle = (void *)pdata->handle;
1404 if (!swrm->handle) {
1405 dev_err(&pdev->dev, "%s: swrm->handle is NULL\n",
1406 __func__);
1407 ret = -EINVAL;
1408 goto err_pdata_fail;
1409 }
1410 swrm->read = pdata->read;
1411 if (!swrm->read) {
1412 dev_err(&pdev->dev, "%s: swrm->read is NULL\n",
1413 __func__);
1414 ret = -EINVAL;
1415 goto err_pdata_fail;
1416 }
1417 swrm->write = pdata->write;
1418 if (!swrm->write) {
1419 dev_err(&pdev->dev, "%s: swrm->write is NULL\n",
1420 __func__);
1421 ret = -EINVAL;
1422 goto err_pdata_fail;
1423 }
1424 swrm->bulk_write = pdata->bulk_write;
1425 if (!swrm->bulk_write) {
1426 dev_err(&pdev->dev, "%s: swrm->bulk_write is NULL\n",
1427 __func__);
1428 ret = -EINVAL;
1429 goto err_pdata_fail;
1430 }
1431 swrm->clk = pdata->clk;
1432 if (!swrm->clk) {
1433 dev_err(&pdev->dev, "%s: swrm->clk is NULL\n",
1434 __func__);
1435 ret = -EINVAL;
1436 goto err_pdata_fail;
1437 }
1438 swrm->reg_irq = pdata->reg_irq;
1439 if (!swrm->reg_irq) {
1440 dev_err(&pdev->dev, "%s: swrm->reg_irq is NULL\n",
1441 __func__);
1442 ret = -EINVAL;
1443 goto err_pdata_fail;
1444 }
1445 swrm->master.read = swrm_read;
1446 swrm->master.write = swrm_write;
1447 swrm->master.bulk_write = swrm_bulk_write;
1448 swrm->master.get_logical_dev_num = swrm_get_logical_dev_num;
1449 swrm->master.connect_port = swrm_connect_port;
1450 swrm->master.disconnect_port = swrm_disconnect_port;
1451 swrm->master.slvdev_datapath_control = swrm_slvdev_datapath_control;
1452 swrm->master.remove_from_group = swrm_remove_from_group;
1453 swrm->master.dev.parent = &pdev->dev;
1454 swrm->master.dev.of_node = pdev->dev.of_node;
1455 swrm->master.num_port = 0;
1456 swrm->num_enum_slaves = 0;
1457 swrm->rcmd_id = 0;
1458 swrm->wcmd_id = 0;
1459 swrm->slave_status = 0;
1460 swrm->num_rx_chs = 0;
Laxminath Kasam8f7ccc22017-08-28 17:35:04 +05301461 swrm->clk_ref_count = 0;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301462 swrm->state = SWR_MSTR_RESUME;
1463 init_completion(&swrm->reset);
1464 init_completion(&swrm->broadcast);
1465 mutex_init(&swrm->mlock);
1466 INIT_LIST_HEAD(&swrm->mport_list);
1467 mutex_init(&swrm->reslock);
1468
1469 ret = swrm->reg_irq(swrm->handle, swr_mstr_interrupt, swrm,
1470 SWR_IRQ_REGISTER);
1471 if (ret) {
1472 dev_err(&pdev->dev, "%s: IRQ register failed ret %d\n",
1473 __func__, ret);
1474 goto err_irq_fail;
1475 }
1476
1477 ret = swr_register_master(&swrm->master);
1478 if (ret) {
1479 dev_err(&pdev->dev, "%s: error adding swr master\n", __func__);
1480 goto err_mstr_fail;
1481 }
1482
1483 /* Add devices registered with board-info as the
1484 * controller will be up now
1485 */
1486 swr_master_add_boarddevices(&swrm->master);
1487 mutex_lock(&swrm->mlock);
1488 swrm_clk_request(swrm, true);
1489 ret = swrm_master_init(swrm);
1490 if (ret < 0) {
1491 dev_err(&pdev->dev,
1492 "%s: Error in master Initializaiton, err %d\n",
1493 __func__, ret);
1494 mutex_unlock(&swrm->mlock);
1495 goto err_mstr_fail;
1496 }
1497 swrm->version = swrm->read(swrm->handle, SWRM_COMP_HW_VERSION);
1498
1499 mutex_unlock(&swrm->mlock);
1500
1501 if (pdev->dev.of_node)
1502 of_register_swr_devices(&swrm->master);
1503
1504 dbgswrm = swrm;
1505 debugfs_swrm_dent = debugfs_create_dir(dev_name(&pdev->dev), 0);
1506 if (!IS_ERR(debugfs_swrm_dent)) {
1507 debugfs_peek = debugfs_create_file("swrm_peek",
1508 S_IFREG | 0444, debugfs_swrm_dent,
1509 (void *) "swrm_peek", &swrm_debug_ops);
1510
1511 debugfs_poke = debugfs_create_file("swrm_poke",
1512 S_IFREG | 0444, debugfs_swrm_dent,
1513 (void *) "swrm_poke", &swrm_debug_ops);
1514
1515 debugfs_reg_dump = debugfs_create_file("swrm_reg_dump",
1516 S_IFREG | 0444, debugfs_swrm_dent,
1517 (void *) "swrm_reg_dump",
1518 &swrm_debug_ops);
1519 }
1520 pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer);
1521 pm_runtime_use_autosuspend(&pdev->dev);
1522 pm_runtime_set_active(&pdev->dev);
1523 pm_runtime_enable(&pdev->dev);
1524 pm_runtime_mark_last_busy(&pdev->dev);
1525
1526 return 0;
1527err_mstr_fail:
1528 swrm->reg_irq(swrm->handle, swr_mstr_interrupt,
1529 swrm, SWR_IRQ_FREE);
1530err_irq_fail:
1531err_pdata_fail:
1532 kfree(swrm);
1533err_memory_fail:
1534 return ret;
1535}
1536
1537static int swrm_remove(struct platform_device *pdev)
1538{
1539 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1540
1541 swrm->reg_irq(swrm->handle, swr_mstr_interrupt,
1542 swrm, SWR_IRQ_FREE);
1543 if (swrm->mstr_port) {
1544 kfree(swrm->mstr_port->port);
1545 swrm->mstr_port->port = NULL;
1546 kfree(swrm->mstr_port);
1547 swrm->mstr_port = NULL;
1548 }
1549 pm_runtime_disable(&pdev->dev);
1550 pm_runtime_set_suspended(&pdev->dev);
1551 swr_unregister_master(&swrm->master);
1552 mutex_destroy(&swrm->mlock);
1553 mutex_destroy(&swrm->reslock);
1554 kfree(swrm);
1555 return 0;
1556}
1557
1558static int swrm_clk_pause(struct swr_mstr_ctrl *swrm)
1559{
1560 u32 val;
1561
1562 dev_dbg(swrm->dev, "%s: state: %d\n", __func__, swrm->state);
1563 swrm->write(swrm->handle, SWRM_INTERRUPT_MASK_ADDR, 0x1FDFD);
1564 val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR);
1565 val |= SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK;
1566 swrm->write(swrm->handle, SWRM_MCP_CFG_ADDR, val);
1567 swrm->state = SWR_MSTR_PAUSE;
1568
1569 return 0;
1570}
1571
1572#ifdef CONFIG_PM
1573static int swrm_runtime_resume(struct device *dev)
1574{
1575 struct platform_device *pdev = to_platform_device(dev);
1576 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1577 int ret = 0;
1578 struct swr_master *mstr = &swrm->master;
1579 struct swr_device *swr_dev;
1580
1581 dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
1582 __func__, swrm->state);
1583 mutex_lock(&swrm->reslock);
1584 if ((swrm->state == SWR_MSTR_PAUSE) ||
1585 (swrm->state == SWR_MSTR_DOWN)) {
1586 if (swrm->state == SWR_MSTR_DOWN) {
1587 if (swrm_clk_request(swrm, true))
1588 goto exit;
1589 }
1590 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1591 ret = swr_device_up(swr_dev);
1592 if (ret) {
1593 dev_err(dev,
1594 "%s: failed to wakeup swr dev %d\n",
1595 __func__, swr_dev->dev_num);
1596 swrm_clk_request(swrm, false);
1597 goto exit;
1598 }
1599 }
1600 swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01);
1601 swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01);
1602 swrm_master_init(swrm);
1603 }
1604exit:
1605 pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer);
1606 mutex_unlock(&swrm->reslock);
1607 return ret;
1608}
1609
1610static int swrm_runtime_suspend(struct device *dev)
1611{
1612 struct platform_device *pdev = to_platform_device(dev);
1613 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1614 int ret = 0;
1615 struct swr_master *mstr = &swrm->master;
1616 struct swr_device *swr_dev;
1617
1618 dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n",
1619 __func__, swrm->state);
1620 mutex_lock(&swrm->reslock);
1621 if ((swrm->state == SWR_MSTR_RESUME) ||
1622 (swrm->state == SWR_MSTR_UP)) {
1623 if (swrm_is_port_en(&swrm->master)) {
1624 dev_dbg(dev, "%s ports are enabled\n", __func__);
1625 ret = -EBUSY;
1626 goto exit;
1627 }
1628 swrm_clk_pause(swrm);
1629 swrm->write(swrm->handle, SWRM_COMP_CFG_ADDR, 0x00);
1630 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1631 ret = swr_device_down(swr_dev);
1632 if (ret) {
1633 dev_err(dev,
1634 "%s: failed to shutdown swr dev %d\n",
1635 __func__, swr_dev->dev_num);
1636 goto exit;
1637 }
1638 }
1639 swrm_clk_request(swrm, false);
1640 }
1641exit:
1642 mutex_unlock(&swrm->reslock);
1643 return ret;
1644}
1645#endif /* CONFIG_PM */
1646
1647static int swrm_device_down(struct device *dev)
1648{
1649 struct platform_device *pdev = to_platform_device(dev);
1650 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1651 int ret = 0;
1652 struct swr_master *mstr = &swrm->master;
1653 struct swr_device *swr_dev;
1654
1655 dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state);
1656 mutex_lock(&swrm->reslock);
1657 if ((swrm->state == SWR_MSTR_RESUME) ||
1658 (swrm->state == SWR_MSTR_UP)) {
1659 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1660 ret = swr_device_down(swr_dev);
1661 if (ret)
1662 dev_err(dev,
1663 "%s: failed to shutdown swr dev %d\n",
1664 __func__, swr_dev->dev_num);
1665 }
1666 dev_dbg(dev, "%s: Shutting down SWRM\n", __func__);
1667 pm_runtime_disable(dev);
1668 pm_runtime_set_suspended(dev);
1669 pm_runtime_enable(dev);
1670 swrm_clk_request(swrm, false);
1671 }
1672 mutex_unlock(&swrm->reslock);
1673 return ret;
1674}
1675
1676/**
1677 * swrm_wcd_notify - parent device can notify to soundwire master through
1678 * this function
1679 * @pdev: pointer to platform device structure
1680 * @id: command id from parent to the soundwire master
1681 * @data: data from parent device to soundwire master
1682 */
1683int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
1684{
1685 struct swr_mstr_ctrl *swrm;
1686 int ret = 0;
1687 struct swr_master *mstr;
1688 struct swr_device *swr_dev;
1689
1690 if (!pdev) {
1691 pr_err("%s: pdev is NULL\n", __func__);
1692 return -EINVAL;
1693 }
1694 swrm = platform_get_drvdata(pdev);
1695 if (!swrm) {
1696 dev_err(&pdev->dev, "%s: swrm is NULL\n", __func__);
1697 return -EINVAL;
1698 }
1699 mstr = &swrm->master;
1700
1701 switch (id) {
1702 case SWR_CH_MAP:
1703 if (!data) {
1704 dev_err(swrm->dev, "%s: data is NULL\n", __func__);
1705 ret = -EINVAL;
1706 } else {
1707 ret = swrm_set_ch_map(swrm, data);
1708 }
1709 break;
1710 case SWR_DEVICE_DOWN:
1711 dev_dbg(swrm->dev, "%s: swr master down called\n", __func__);
1712 mutex_lock(&swrm->mlock);
1713 if ((swrm->state == SWR_MSTR_PAUSE) ||
1714 (swrm->state == SWR_MSTR_DOWN))
1715 dev_dbg(swrm->dev, "%s: SWR master is already Down: %d\n",
1716 __func__, swrm->state);
1717 else
1718 swrm_device_down(&pdev->dev);
1719 mutex_unlock(&swrm->mlock);
1720 break;
1721 case SWR_DEVICE_UP:
1722 dev_dbg(swrm->dev, "%s: swr master up called\n", __func__);
1723 mutex_lock(&swrm->mlock);
1724 mutex_lock(&swrm->reslock);
1725 if ((swrm->state == SWR_MSTR_RESUME) ||
1726 (swrm->state == SWR_MSTR_UP)) {
1727 dev_dbg(swrm->dev, "%s: SWR master is already UP: %d\n",
1728 __func__, swrm->state);
1729 } else {
1730 pm_runtime_mark_last_busy(&pdev->dev);
1731 mutex_unlock(&swrm->reslock);
1732 pm_runtime_get_sync(&pdev->dev);
1733 mutex_lock(&swrm->reslock);
1734 list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
1735 ret = swr_reset_device(swr_dev);
1736 if (ret) {
1737 dev_err(swrm->dev,
1738 "%s: failed to reset swr device %d\n",
1739 __func__, swr_dev->dev_num);
1740 swrm_clk_request(swrm, false);
1741 }
1742 }
1743 pm_runtime_mark_last_busy(&pdev->dev);
1744 pm_runtime_put_autosuspend(&pdev->dev);
1745 }
1746 mutex_unlock(&swrm->reslock);
1747 mutex_unlock(&swrm->mlock);
1748 break;
1749 case SWR_SET_NUM_RX_CH:
1750 if (!data) {
1751 dev_err(swrm->dev, "%s: data is NULL\n", __func__);
1752 ret = -EINVAL;
1753 } else {
1754 mutex_lock(&swrm->mlock);
1755 swrm->num_rx_chs = *(int *)data;
1756 if ((swrm->num_rx_chs > 1) && !swrm->num_cfg_devs) {
1757 list_for_each_entry(swr_dev, &mstr->devices,
1758 dev_list) {
1759 ret = swr_set_device_group(swr_dev,
1760 SWR_BROADCAST);
1761 if (ret)
1762 dev_err(swrm->dev,
1763 "%s: set num ch failed\n",
1764 __func__);
1765 }
1766 } else {
1767 list_for_each_entry(swr_dev, &mstr->devices,
1768 dev_list) {
1769 ret = swr_set_device_group(swr_dev,
1770 SWR_GROUP_NONE);
1771 if (ret)
1772 dev_err(swrm->dev,
1773 "%s: set num ch failed\n",
1774 __func__);
1775 }
1776 }
1777 mutex_unlock(&swrm->mlock);
1778 }
1779 break;
1780 default:
1781 dev_err(swrm->dev, "%s: swr master unknown id %d\n",
1782 __func__, id);
1783 break;
1784 }
1785 return ret;
1786}
1787EXPORT_SYMBOL(swrm_wcd_notify);
1788
1789#ifdef CONFIG_PM_SLEEP
1790static int swrm_suspend(struct device *dev)
1791{
1792 int ret = -EBUSY;
1793 struct platform_device *pdev = to_platform_device(dev);
1794 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1795
1796 dev_dbg(dev, "%s: system suspend, state: %d\n", __func__, swrm->state);
1797 if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) {
1798 ret = swrm_runtime_suspend(dev);
1799 if (!ret) {
1800 /*
1801 * Synchronize runtime-pm and system-pm states:
1802 * At this point, we are already suspended. If
1803 * runtime-pm still thinks its active, then
1804 * make sure its status is in sync with HW
1805 * status. The three below calls let the
1806 * runtime-pm know that we are suspended
1807 * already without re-invoking the suspend
1808 * callback
1809 */
1810 pm_runtime_disable(dev);
1811 pm_runtime_set_suspended(dev);
1812 pm_runtime_enable(dev);
1813 }
1814 }
1815 if (ret == -EBUSY) {
1816 /*
1817 * There is a possibility that some audio stream is active
1818 * during suspend. We dont want to return suspend failure in
1819 * that case so that display and relevant components can still
1820 * go to suspend.
1821 * If there is some other error, then it should be passed-on
1822 * to system level suspend
1823 */
1824 ret = 0;
1825 }
1826 return ret;
1827}
1828
1829static int swrm_resume(struct device *dev)
1830{
1831 int ret = 0;
1832 struct platform_device *pdev = to_platform_device(dev);
1833 struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
1834
1835 dev_dbg(dev, "%s: system resume, state: %d\n", __func__, swrm->state);
1836 if (!pm_runtime_enabled(dev) || !pm_runtime_suspend(dev)) {
1837 ret = swrm_runtime_resume(dev);
1838 if (!ret) {
1839 pm_runtime_mark_last_busy(dev);
1840 pm_request_autosuspend(dev);
1841 }
1842 }
1843 return ret;
1844}
1845#endif /* CONFIG_PM_SLEEP */
1846
1847static const struct dev_pm_ops swrm_dev_pm_ops = {
1848 SET_SYSTEM_SLEEP_PM_OPS(
1849 swrm_suspend,
1850 swrm_resume
1851 )
1852 SET_RUNTIME_PM_OPS(
1853 swrm_runtime_suspend,
1854 swrm_runtime_resume,
1855 NULL
1856 )
1857};
1858
1859static const struct of_device_id swrm_dt_match[] = {
1860 {
1861 .compatible = "qcom,swr-wcd",
1862 },
1863 {}
1864};
1865
1866static struct platform_driver swr_mstr_driver = {
1867 .probe = swrm_probe,
1868 .remove = swrm_remove,
1869 .driver = {
1870 .name = SWR_WCD_NAME,
1871 .owner = THIS_MODULE,
1872 .pm = &swrm_dev_pm_ops,
1873 .of_match_table = swrm_dt_match,
1874 },
1875};
1876
1877static int __init swrm_init(void)
1878{
1879 return platform_driver_register(&swr_mstr_driver);
1880}
1881subsys_initcall(swrm_init);
1882
1883static void __exit swrm_exit(void)
1884{
1885 platform_driver_unregister(&swr_mstr_driver);
1886}
1887module_exit(swrm_exit);
1888
1889
1890MODULE_LICENSE("GPL v2");
1891MODULE_DESCRIPTION("WCD SoundWire Controller");
1892MODULE_ALIAS("platform:swr-wcd");