cmt_speech.c (34212B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * cmt_speech.c - HSI CMT speech driver 4 * 5 * Copyright (C) 2008,2009,2010 Nokia Corporation. All rights reserved. 6 * 7 * Contact: Kai Vehmanen <kai.vehmanen@nokia.com> 8 * Original author: Peter Ujfalusi <peter.ujfalusi@nokia.com> 9 */ 10 11#include <linux/errno.h> 12#include <linux/module.h> 13#include <linux/types.h> 14#include <linux/init.h> 15#include <linux/device.h> 16#include <linux/miscdevice.h> 17#include <linux/mm.h> 18#include <linux/slab.h> 19#include <linux/fs.h> 20#include <linux/poll.h> 21#include <linux/sched/signal.h> 22#include <linux/ioctl.h> 23#include <linux/uaccess.h> 24#include <linux/pm_qos.h> 25#include <linux/hsi/hsi.h> 26#include <linux/hsi/ssi_protocol.h> 27#include <linux/hsi/cs-protocol.h> 28 29#define CS_MMAP_SIZE PAGE_SIZE 30 31struct char_queue { 32 struct list_head list; 33 u32 msg; 34}; 35 36struct cs_char { 37 unsigned int opened; 38 struct hsi_client *cl; 39 struct cs_hsi_iface *hi; 40 struct list_head chardev_queue; 41 struct list_head dataind_queue; 42 int dataind_pending; 43 /* mmap things */ 44 unsigned long mmap_base; 45 unsigned long mmap_size; 46 spinlock_t lock; 47 struct fasync_struct *async_queue; 48 wait_queue_head_t wait; 49 /* hsi channel ids */ 50 int channel_id_cmd; 51 int channel_id_data; 52}; 53 54#define SSI_CHANNEL_STATE_READING 1 55#define SSI_CHANNEL_STATE_WRITING (1 << 1) 56#define SSI_CHANNEL_STATE_POLL (1 << 2) 57#define SSI_CHANNEL_STATE_ERROR (1 << 3) 58 59#define TARGET_MASK 0xf000000 60#define TARGET_REMOTE (1 << CS_DOMAIN_SHIFT) 61#define TARGET_LOCAL 0 62 63/* Number of pre-allocated commands buffers */ 64#define CS_MAX_CMDS 4 65 66/* 67 * During data transfers, transactions must be handled 68 * within 20ms (fixed value in cmtspeech HSI protocol) 69 */ 70#define CS_QOS_LATENCY_FOR_DATA_USEC 20000 71 72/* Timeout to wait for pending HSI transfers to complete */ 73#define CS_HSI_TRANSFER_TIMEOUT_MS 500 74 75 76#define RX_PTR_BOUNDARY_SHIFT 8 77#define RX_PTR_MAX_SHIFT (RX_PTR_BOUNDARY_SHIFT + \ 78 CS_MAX_BUFFERS_SHIFT) 79struct cs_hsi_iface { 80 struct hsi_client *cl; 81 struct hsi_client *master; 82 83 unsigned int iface_state; 84 unsigned int wakeline_state; 85 unsigned int control_state; 86 unsigned int data_state; 87 88 /* state exposed to application */ 89 struct cs_mmap_config_block *mmap_cfg; 90 91 unsigned long mmap_base; 92 unsigned long mmap_size; 93 94 unsigned int rx_slot; 95 unsigned int tx_slot; 96 97 /* note: for security reasons, we do not trust the contents of 98 * mmap_cfg, but instead duplicate the variables here */ 99 unsigned int buf_size; 100 unsigned int rx_bufs; 101 unsigned int tx_bufs; 102 unsigned int rx_ptr_boundary; 103 unsigned int rx_offsets[CS_MAX_BUFFERS]; 104 unsigned int tx_offsets[CS_MAX_BUFFERS]; 105 106 /* size of aligned memory blocks */ 107 unsigned int slot_size; 108 unsigned int flags; 109 110 struct list_head cmdqueue; 111 112 struct hsi_msg *data_rx_msg; 113 struct hsi_msg *data_tx_msg; 114 wait_queue_head_t datawait; 115 116 struct pm_qos_request pm_qos_req; 117 118 spinlock_t lock; 119}; 120 121static struct cs_char cs_char_data; 122 123static void cs_hsi_read_on_control(struct cs_hsi_iface *hi); 124static void cs_hsi_read_on_data(struct cs_hsi_iface *hi); 125 126static inline void rx_ptr_shift_too_big(void) 127{ 128 BUILD_BUG_ON((1LLU << RX_PTR_MAX_SHIFT) > UINT_MAX); 129} 130 131static void cs_notify(u32 message, struct list_head *head) 132{ 133 struct char_queue *entry; 134 135 spin_lock(&cs_char_data.lock); 136 137 if (!cs_char_data.opened) { 138 spin_unlock(&cs_char_data.lock); 139 goto out; 140 } 141 142 entry = kmalloc(sizeof(*entry), GFP_ATOMIC); 143 if (!entry) { 144 dev_err(&cs_char_data.cl->device, 145 "Can't allocate new entry for the queue.\n"); 146 spin_unlock(&cs_char_data.lock); 147 goto out; 148 } 149 150 entry->msg = message; 151 list_add_tail(&entry->list, head); 152 153 spin_unlock(&cs_char_data.lock); 154 155 wake_up_interruptible(&cs_char_data.wait); 156 kill_fasync(&cs_char_data.async_queue, SIGIO, POLL_IN); 157 158out: 159 return; 160} 161 162static u32 cs_pop_entry(struct list_head *head) 163{ 164 struct char_queue *entry; 165 u32 data; 166 167 entry = list_entry(head->next, struct char_queue, list); 168 data = entry->msg; 169 list_del(&entry->list); 170 kfree(entry); 171 172 return data; 173} 174 175static void cs_notify_control(u32 message) 176{ 177 cs_notify(message, &cs_char_data.chardev_queue); 178} 179 180static void cs_notify_data(u32 message, int maxlength) 181{ 182 cs_notify(message, &cs_char_data.dataind_queue); 183 184 spin_lock(&cs_char_data.lock); 185 cs_char_data.dataind_pending++; 186 while (cs_char_data.dataind_pending > maxlength && 187 !list_empty(&cs_char_data.dataind_queue)) { 188 dev_dbg(&cs_char_data.cl->device, "data notification " 189 "queue overrun (%u entries)\n", cs_char_data.dataind_pending); 190 191 cs_pop_entry(&cs_char_data.dataind_queue); 192 cs_char_data.dataind_pending--; 193 } 194 spin_unlock(&cs_char_data.lock); 195} 196 197static inline void cs_set_cmd(struct hsi_msg *msg, u32 cmd) 198{ 199 u32 *data = sg_virt(msg->sgt.sgl); 200 *data = cmd; 201} 202 203static inline u32 cs_get_cmd(struct hsi_msg *msg) 204{ 205 u32 *data = sg_virt(msg->sgt.sgl); 206 return *data; 207} 208 209static void cs_release_cmd(struct hsi_msg *msg) 210{ 211 struct cs_hsi_iface *hi = msg->context; 212 213 list_add_tail(&msg->link, &hi->cmdqueue); 214} 215 216static void cs_cmd_destructor(struct hsi_msg *msg) 217{ 218 struct cs_hsi_iface *hi = msg->context; 219 220 spin_lock(&hi->lock); 221 222 dev_dbg(&cs_char_data.cl->device, "control cmd destructor\n"); 223 224 if (hi->iface_state != CS_STATE_CLOSED) 225 dev_err(&hi->cl->device, "Cmd flushed while driver active\n"); 226 227 if (msg->ttype == HSI_MSG_READ) 228 hi->control_state &= 229 ~(SSI_CHANNEL_STATE_POLL | SSI_CHANNEL_STATE_READING); 230 else if (msg->ttype == HSI_MSG_WRITE && 231 hi->control_state & SSI_CHANNEL_STATE_WRITING) 232 hi->control_state &= ~SSI_CHANNEL_STATE_WRITING; 233 234 cs_release_cmd(msg); 235 236 spin_unlock(&hi->lock); 237} 238 239static struct hsi_msg *cs_claim_cmd(struct cs_hsi_iface* ssi) 240{ 241 struct hsi_msg *msg; 242 243 BUG_ON(list_empty(&ssi->cmdqueue)); 244 245 msg = list_first_entry(&ssi->cmdqueue, struct hsi_msg, link); 246 list_del(&msg->link); 247 msg->destructor = cs_cmd_destructor; 248 249 return msg; 250} 251 252static void cs_free_cmds(struct cs_hsi_iface *ssi) 253{ 254 struct hsi_msg *msg, *tmp; 255 256 list_for_each_entry_safe(msg, tmp, &ssi->cmdqueue, link) { 257 list_del(&msg->link); 258 msg->destructor = NULL; 259 kfree(sg_virt(msg->sgt.sgl)); 260 hsi_free_msg(msg); 261 } 262} 263 264static int cs_alloc_cmds(struct cs_hsi_iface *hi) 265{ 266 struct hsi_msg *msg; 267 u32 *buf; 268 unsigned int i; 269 270 INIT_LIST_HEAD(&hi->cmdqueue); 271 272 for (i = 0; i < CS_MAX_CMDS; i++) { 273 msg = hsi_alloc_msg(1, GFP_KERNEL); 274 if (!msg) 275 goto out; 276 buf = kmalloc(sizeof(*buf), GFP_KERNEL); 277 if (!buf) { 278 hsi_free_msg(msg); 279 goto out; 280 } 281 sg_init_one(msg->sgt.sgl, buf, sizeof(*buf)); 282 msg->channel = cs_char_data.channel_id_cmd; 283 msg->context = hi; 284 list_add_tail(&msg->link, &hi->cmdqueue); 285 } 286 287 return 0; 288 289out: 290 cs_free_cmds(hi); 291 return -ENOMEM; 292} 293 294static void cs_hsi_data_destructor(struct hsi_msg *msg) 295{ 296 struct cs_hsi_iface *hi = msg->context; 297 const char *dir = (msg->ttype == HSI_MSG_READ) ? "TX" : "RX"; 298 299 dev_dbg(&cs_char_data.cl->device, "Freeing data %s message\n", dir); 300 301 spin_lock(&hi->lock); 302 if (hi->iface_state != CS_STATE_CLOSED) 303 dev_err(&cs_char_data.cl->device, 304 "Data %s flush while device active\n", dir); 305 if (msg->ttype == HSI_MSG_READ) 306 hi->data_state &= 307 ~(SSI_CHANNEL_STATE_POLL | SSI_CHANNEL_STATE_READING); 308 else 309 hi->data_state &= ~SSI_CHANNEL_STATE_WRITING; 310 311 msg->status = HSI_STATUS_COMPLETED; 312 if (unlikely(waitqueue_active(&hi->datawait))) 313 wake_up_interruptible(&hi->datawait); 314 315 spin_unlock(&hi->lock); 316} 317 318static int cs_hsi_alloc_data(struct cs_hsi_iface *hi) 319{ 320 struct hsi_msg *txmsg, *rxmsg; 321 int res = 0; 322 323 rxmsg = hsi_alloc_msg(1, GFP_KERNEL); 324 if (!rxmsg) { 325 res = -ENOMEM; 326 goto out1; 327 } 328 rxmsg->channel = cs_char_data.channel_id_data; 329 rxmsg->destructor = cs_hsi_data_destructor; 330 rxmsg->context = hi; 331 332 txmsg = hsi_alloc_msg(1, GFP_KERNEL); 333 if (!txmsg) { 334 res = -ENOMEM; 335 goto out2; 336 } 337 txmsg->channel = cs_char_data.channel_id_data; 338 txmsg->destructor = cs_hsi_data_destructor; 339 txmsg->context = hi; 340 341 hi->data_rx_msg = rxmsg; 342 hi->data_tx_msg = txmsg; 343 344 return 0; 345 346out2: 347 hsi_free_msg(rxmsg); 348out1: 349 return res; 350} 351 352static void cs_hsi_free_data_msg(struct hsi_msg *msg) 353{ 354 WARN_ON(msg->status != HSI_STATUS_COMPLETED && 355 msg->status != HSI_STATUS_ERROR); 356 hsi_free_msg(msg); 357} 358 359static void cs_hsi_free_data(struct cs_hsi_iface *hi) 360{ 361 cs_hsi_free_data_msg(hi->data_rx_msg); 362 cs_hsi_free_data_msg(hi->data_tx_msg); 363} 364 365static inline void __cs_hsi_error_pre(struct cs_hsi_iface *hi, 366 struct hsi_msg *msg, const char *info, 367 unsigned int *state) 368{ 369 spin_lock(&hi->lock); 370 dev_err(&hi->cl->device, "HSI %s error, msg %d, state %u\n", 371 info, msg->status, *state); 372} 373 374static inline void __cs_hsi_error_post(struct cs_hsi_iface *hi) 375{ 376 spin_unlock(&hi->lock); 377} 378 379static inline void __cs_hsi_error_read_bits(unsigned int *state) 380{ 381 *state |= SSI_CHANNEL_STATE_ERROR; 382 *state &= ~(SSI_CHANNEL_STATE_READING | SSI_CHANNEL_STATE_POLL); 383} 384 385static inline void __cs_hsi_error_write_bits(unsigned int *state) 386{ 387 *state |= SSI_CHANNEL_STATE_ERROR; 388 *state &= ~SSI_CHANNEL_STATE_WRITING; 389} 390 391static void cs_hsi_control_read_error(struct cs_hsi_iface *hi, 392 struct hsi_msg *msg) 393{ 394 __cs_hsi_error_pre(hi, msg, "control read", &hi->control_state); 395 cs_release_cmd(msg); 396 __cs_hsi_error_read_bits(&hi->control_state); 397 __cs_hsi_error_post(hi); 398} 399 400static void cs_hsi_control_write_error(struct cs_hsi_iface *hi, 401 struct hsi_msg *msg) 402{ 403 __cs_hsi_error_pre(hi, msg, "control write", &hi->control_state); 404 cs_release_cmd(msg); 405 __cs_hsi_error_write_bits(&hi->control_state); 406 __cs_hsi_error_post(hi); 407 408} 409 410static void cs_hsi_data_read_error(struct cs_hsi_iface *hi, struct hsi_msg *msg) 411{ 412 __cs_hsi_error_pre(hi, msg, "data read", &hi->data_state); 413 __cs_hsi_error_read_bits(&hi->data_state); 414 __cs_hsi_error_post(hi); 415} 416 417static void cs_hsi_data_write_error(struct cs_hsi_iface *hi, 418 struct hsi_msg *msg) 419{ 420 __cs_hsi_error_pre(hi, msg, "data write", &hi->data_state); 421 __cs_hsi_error_write_bits(&hi->data_state); 422 __cs_hsi_error_post(hi); 423} 424 425static void cs_hsi_read_on_control_complete(struct hsi_msg *msg) 426{ 427 u32 cmd = cs_get_cmd(msg); 428 struct cs_hsi_iface *hi = msg->context; 429 430 spin_lock(&hi->lock); 431 hi->control_state &= ~SSI_CHANNEL_STATE_READING; 432 if (msg->status == HSI_STATUS_ERROR) { 433 dev_err(&hi->cl->device, "Control RX error detected\n"); 434 spin_unlock(&hi->lock); 435 cs_hsi_control_read_error(hi, msg); 436 goto out; 437 } 438 dev_dbg(&hi->cl->device, "Read on control: %08X\n", cmd); 439 cs_release_cmd(msg); 440 if (hi->flags & CS_FEAT_TSTAMP_RX_CTRL) { 441 struct timespec64 tspec; 442 struct cs_timestamp *tstamp = 443 &hi->mmap_cfg->tstamp_rx_ctrl; 444 445 ktime_get_ts64(&tspec); 446 447 tstamp->tv_sec = (__u32) tspec.tv_sec; 448 tstamp->tv_nsec = (__u32) tspec.tv_nsec; 449 } 450 spin_unlock(&hi->lock); 451 452 cs_notify_control(cmd); 453 454out: 455 cs_hsi_read_on_control(hi); 456} 457 458static void cs_hsi_peek_on_control_complete(struct hsi_msg *msg) 459{ 460 struct cs_hsi_iface *hi = msg->context; 461 int ret; 462 463 if (msg->status == HSI_STATUS_ERROR) { 464 dev_err(&hi->cl->device, "Control peek RX error detected\n"); 465 cs_hsi_control_read_error(hi, msg); 466 return; 467 } 468 469 WARN_ON(!(hi->control_state & SSI_CHANNEL_STATE_READING)); 470 471 dev_dbg(&hi->cl->device, "Peek on control complete, reading\n"); 472 msg->sgt.nents = 1; 473 msg->complete = cs_hsi_read_on_control_complete; 474 ret = hsi_async_read(hi->cl, msg); 475 if (ret) 476 cs_hsi_control_read_error(hi, msg); 477} 478 479static void cs_hsi_read_on_control(struct cs_hsi_iface *hi) 480{ 481 struct hsi_msg *msg; 482 int ret; 483 484 spin_lock(&hi->lock); 485 if (hi->control_state & SSI_CHANNEL_STATE_READING) { 486 dev_err(&hi->cl->device, "Control read already pending (%d)\n", 487 hi->control_state); 488 spin_unlock(&hi->lock); 489 return; 490 } 491 if (hi->control_state & SSI_CHANNEL_STATE_ERROR) { 492 dev_err(&hi->cl->device, "Control read error (%d)\n", 493 hi->control_state); 494 spin_unlock(&hi->lock); 495 return; 496 } 497 hi->control_state |= SSI_CHANNEL_STATE_READING; 498 dev_dbg(&hi->cl->device, "Issuing RX on control\n"); 499 msg = cs_claim_cmd(hi); 500 spin_unlock(&hi->lock); 501 502 msg->sgt.nents = 0; 503 msg->complete = cs_hsi_peek_on_control_complete; 504 ret = hsi_async_read(hi->cl, msg); 505 if (ret) 506 cs_hsi_control_read_error(hi, msg); 507} 508 509static void cs_hsi_write_on_control_complete(struct hsi_msg *msg) 510{ 511 struct cs_hsi_iface *hi = msg->context; 512 if (msg->status == HSI_STATUS_COMPLETED) { 513 spin_lock(&hi->lock); 514 hi->control_state &= ~SSI_CHANNEL_STATE_WRITING; 515 cs_release_cmd(msg); 516 spin_unlock(&hi->lock); 517 } else if (msg->status == HSI_STATUS_ERROR) { 518 cs_hsi_control_write_error(hi, msg); 519 } else { 520 dev_err(&hi->cl->device, 521 "unexpected status in control write callback %d\n", 522 msg->status); 523 } 524} 525 526static int cs_hsi_write_on_control(struct cs_hsi_iface *hi, u32 message) 527{ 528 struct hsi_msg *msg; 529 int ret; 530 531 spin_lock(&hi->lock); 532 if (hi->control_state & SSI_CHANNEL_STATE_ERROR) { 533 spin_unlock(&hi->lock); 534 return -EIO; 535 } 536 if (hi->control_state & SSI_CHANNEL_STATE_WRITING) { 537 dev_err(&hi->cl->device, 538 "Write still pending on control channel.\n"); 539 spin_unlock(&hi->lock); 540 return -EBUSY; 541 } 542 hi->control_state |= SSI_CHANNEL_STATE_WRITING; 543 msg = cs_claim_cmd(hi); 544 spin_unlock(&hi->lock); 545 546 cs_set_cmd(msg, message); 547 msg->sgt.nents = 1; 548 msg->complete = cs_hsi_write_on_control_complete; 549 dev_dbg(&hi->cl->device, 550 "Sending control message %08X\n", message); 551 ret = hsi_async_write(hi->cl, msg); 552 if (ret) { 553 dev_err(&hi->cl->device, 554 "async_write failed with %d\n", ret); 555 cs_hsi_control_write_error(hi, msg); 556 } 557 558 /* 559 * Make sure control read is always pending when issuing 560 * new control writes. This is needed as the controller 561 * may flush our messages if e.g. the peer device reboots 562 * unexpectedly (and we cannot directly resubmit a new read from 563 * the message destructor; see cs_cmd_destructor()). 564 */ 565 if (!(hi->control_state & SSI_CHANNEL_STATE_READING)) { 566 dev_err(&hi->cl->device, "Restarting control reads\n"); 567 cs_hsi_read_on_control(hi); 568 } 569 570 return 0; 571} 572 573static void cs_hsi_read_on_data_complete(struct hsi_msg *msg) 574{ 575 struct cs_hsi_iface *hi = msg->context; 576 u32 payload; 577 578 if (unlikely(msg->status == HSI_STATUS_ERROR)) { 579 cs_hsi_data_read_error(hi, msg); 580 return; 581 } 582 583 spin_lock(&hi->lock); 584 WARN_ON(!(hi->data_state & SSI_CHANNEL_STATE_READING)); 585 hi->data_state &= ~SSI_CHANNEL_STATE_READING; 586 payload = CS_RX_DATA_RECEIVED; 587 payload |= hi->rx_slot; 588 hi->rx_slot++; 589 hi->rx_slot %= hi->rx_ptr_boundary; 590 /* expose current rx ptr in mmap area */ 591 hi->mmap_cfg->rx_ptr = hi->rx_slot; 592 if (unlikely(waitqueue_active(&hi->datawait))) 593 wake_up_interruptible(&hi->datawait); 594 spin_unlock(&hi->lock); 595 596 cs_notify_data(payload, hi->rx_bufs); 597 cs_hsi_read_on_data(hi); 598} 599 600static void cs_hsi_peek_on_data_complete(struct hsi_msg *msg) 601{ 602 struct cs_hsi_iface *hi = msg->context; 603 u32 *address; 604 int ret; 605 606 if (unlikely(msg->status == HSI_STATUS_ERROR)) { 607 cs_hsi_data_read_error(hi, msg); 608 return; 609 } 610 if (unlikely(hi->iface_state != CS_STATE_CONFIGURED)) { 611 dev_err(&hi->cl->device, "Data received in invalid state\n"); 612 cs_hsi_data_read_error(hi, msg); 613 return; 614 } 615 616 spin_lock(&hi->lock); 617 WARN_ON(!(hi->data_state & SSI_CHANNEL_STATE_POLL)); 618 hi->data_state &= ~SSI_CHANNEL_STATE_POLL; 619 hi->data_state |= SSI_CHANNEL_STATE_READING; 620 spin_unlock(&hi->lock); 621 622 address = (u32 *)(hi->mmap_base + 623 hi->rx_offsets[hi->rx_slot % hi->rx_bufs]); 624 sg_init_one(msg->sgt.sgl, address, hi->buf_size); 625 msg->sgt.nents = 1; 626 msg->complete = cs_hsi_read_on_data_complete; 627 ret = hsi_async_read(hi->cl, msg); 628 if (ret) 629 cs_hsi_data_read_error(hi, msg); 630} 631 632/* 633 * Read/write transaction is ongoing. Returns false if in 634 * SSI_CHANNEL_STATE_POLL state. 635 */ 636static inline int cs_state_xfer_active(unsigned int state) 637{ 638 return (state & SSI_CHANNEL_STATE_WRITING) || 639 (state & SSI_CHANNEL_STATE_READING); 640} 641 642/* 643 * No pending read/writes 644 */ 645static inline int cs_state_idle(unsigned int state) 646{ 647 return !(state & ~SSI_CHANNEL_STATE_ERROR); 648} 649 650static void cs_hsi_read_on_data(struct cs_hsi_iface *hi) 651{ 652 struct hsi_msg *rxmsg; 653 int ret; 654 655 spin_lock(&hi->lock); 656 if (hi->data_state & 657 (SSI_CHANNEL_STATE_READING | SSI_CHANNEL_STATE_POLL)) { 658 dev_dbg(&hi->cl->device, "Data read already pending (%u)\n", 659 hi->data_state); 660 spin_unlock(&hi->lock); 661 return; 662 } 663 hi->data_state |= SSI_CHANNEL_STATE_POLL; 664 spin_unlock(&hi->lock); 665 666 rxmsg = hi->data_rx_msg; 667 sg_init_one(rxmsg->sgt.sgl, (void *)hi->mmap_base, 0); 668 rxmsg->sgt.nents = 0; 669 rxmsg->complete = cs_hsi_peek_on_data_complete; 670 671 ret = hsi_async_read(hi->cl, rxmsg); 672 if (ret) 673 cs_hsi_data_read_error(hi, rxmsg); 674} 675 676static void cs_hsi_write_on_data_complete(struct hsi_msg *msg) 677{ 678 struct cs_hsi_iface *hi = msg->context; 679 680 if (msg->status == HSI_STATUS_COMPLETED) { 681 spin_lock(&hi->lock); 682 hi->data_state &= ~SSI_CHANNEL_STATE_WRITING; 683 if (unlikely(waitqueue_active(&hi->datawait))) 684 wake_up_interruptible(&hi->datawait); 685 spin_unlock(&hi->lock); 686 } else { 687 cs_hsi_data_write_error(hi, msg); 688 } 689} 690 691static int cs_hsi_write_on_data(struct cs_hsi_iface *hi, unsigned int slot) 692{ 693 u32 *address; 694 struct hsi_msg *txmsg; 695 int ret; 696 697 spin_lock(&hi->lock); 698 if (hi->iface_state != CS_STATE_CONFIGURED) { 699 dev_err(&hi->cl->device, "Not configured, aborting\n"); 700 ret = -EINVAL; 701 goto error; 702 } 703 if (hi->data_state & SSI_CHANNEL_STATE_ERROR) { 704 dev_err(&hi->cl->device, "HSI error, aborting\n"); 705 ret = -EIO; 706 goto error; 707 } 708 if (hi->data_state & SSI_CHANNEL_STATE_WRITING) { 709 dev_err(&hi->cl->device, "Write pending on data channel.\n"); 710 ret = -EBUSY; 711 goto error; 712 } 713 hi->data_state |= SSI_CHANNEL_STATE_WRITING; 714 spin_unlock(&hi->lock); 715 716 hi->tx_slot = slot; 717 address = (u32 *)(hi->mmap_base + hi->tx_offsets[hi->tx_slot]); 718 txmsg = hi->data_tx_msg; 719 sg_init_one(txmsg->sgt.sgl, address, hi->buf_size); 720 txmsg->complete = cs_hsi_write_on_data_complete; 721 ret = hsi_async_write(hi->cl, txmsg); 722 if (ret) 723 cs_hsi_data_write_error(hi, txmsg); 724 725 return ret; 726 727error: 728 spin_unlock(&hi->lock); 729 if (ret == -EIO) 730 cs_hsi_data_write_error(hi, hi->data_tx_msg); 731 732 return ret; 733} 734 735static unsigned int cs_hsi_get_state(struct cs_hsi_iface *hi) 736{ 737 return hi->iface_state; 738} 739 740static int cs_hsi_command(struct cs_hsi_iface *hi, u32 cmd) 741{ 742 int ret = 0; 743 744 local_bh_disable(); 745 switch (cmd & TARGET_MASK) { 746 case TARGET_REMOTE: 747 ret = cs_hsi_write_on_control(hi, cmd); 748 break; 749 case TARGET_LOCAL: 750 if ((cmd & CS_CMD_MASK) == CS_TX_DATA_READY) 751 ret = cs_hsi_write_on_data(hi, cmd & CS_PARAM_MASK); 752 else 753 ret = -EINVAL; 754 break; 755 default: 756 ret = -EINVAL; 757 break; 758 } 759 local_bh_enable(); 760 761 return ret; 762} 763 764static void cs_hsi_set_wakeline(struct cs_hsi_iface *hi, bool new_state) 765{ 766 int change = 0; 767 768 spin_lock_bh(&hi->lock); 769 if (hi->wakeline_state != new_state) { 770 hi->wakeline_state = new_state; 771 change = 1; 772 dev_dbg(&hi->cl->device, "setting wake line to %d (%p)\n", 773 new_state, hi->cl); 774 } 775 spin_unlock_bh(&hi->lock); 776 777 if (change) { 778 if (new_state) 779 ssip_slave_start_tx(hi->master); 780 else 781 ssip_slave_stop_tx(hi->master); 782 } 783 784 dev_dbg(&hi->cl->device, "wake line set to %d (%p)\n", 785 new_state, hi->cl); 786} 787 788static void set_buffer_sizes(struct cs_hsi_iface *hi, int rx_bufs, int tx_bufs) 789{ 790 hi->rx_bufs = rx_bufs; 791 hi->tx_bufs = tx_bufs; 792 hi->mmap_cfg->rx_bufs = rx_bufs; 793 hi->mmap_cfg->tx_bufs = tx_bufs; 794 795 if (hi->flags & CS_FEAT_ROLLING_RX_COUNTER) { 796 /* 797 * For more robust overrun detection, let the rx 798 * pointer run in range 0..'boundary-1'. Boundary 799 * is a multiple of rx_bufs, and limited in max size 800 * by RX_PTR_MAX_SHIFT to allow for fast ptr-diff 801 * calculation. 802 */ 803 hi->rx_ptr_boundary = (rx_bufs << RX_PTR_BOUNDARY_SHIFT); 804 hi->mmap_cfg->rx_ptr_boundary = hi->rx_ptr_boundary; 805 } else { 806 hi->rx_ptr_boundary = hi->rx_bufs; 807 } 808} 809 810static int check_buf_params(struct cs_hsi_iface *hi, 811 const struct cs_buffer_config *buf_cfg) 812{ 813 size_t buf_size_aligned = L1_CACHE_ALIGN(buf_cfg->buf_size) * 814 (buf_cfg->rx_bufs + buf_cfg->tx_bufs); 815 size_t ctrl_size_aligned = L1_CACHE_ALIGN(sizeof(*hi->mmap_cfg)); 816 int r = 0; 817 818 if (buf_cfg->rx_bufs > CS_MAX_BUFFERS || 819 buf_cfg->tx_bufs > CS_MAX_BUFFERS) { 820 r = -EINVAL; 821 } else if ((buf_size_aligned + ctrl_size_aligned) >= hi->mmap_size) { 822 dev_err(&hi->cl->device, "No space for the requested buffer " 823 "configuration\n"); 824 r = -ENOBUFS; 825 } 826 827 return r; 828} 829 830/* 831 * Block until pending data transfers have completed. 832 */ 833static int cs_hsi_data_sync(struct cs_hsi_iface *hi) 834{ 835 int r = 0; 836 837 spin_lock_bh(&hi->lock); 838 839 if (!cs_state_xfer_active(hi->data_state)) { 840 dev_dbg(&hi->cl->device, "hsi_data_sync break, idle\n"); 841 goto out; 842 } 843 844 for (;;) { 845 int s; 846 DEFINE_WAIT(wait); 847 if (!cs_state_xfer_active(hi->data_state)) 848 goto out; 849 if (signal_pending(current)) { 850 r = -ERESTARTSYS; 851 goto out; 852 } 853 /* 854 * prepare_to_wait must be called with hi->lock held 855 * so that callbacks can check for waitqueue_active() 856 */ 857 prepare_to_wait(&hi->datawait, &wait, TASK_INTERRUPTIBLE); 858 spin_unlock_bh(&hi->lock); 859 s = schedule_timeout( 860 msecs_to_jiffies(CS_HSI_TRANSFER_TIMEOUT_MS)); 861 spin_lock_bh(&hi->lock); 862 finish_wait(&hi->datawait, &wait); 863 if (!s) { 864 dev_dbg(&hi->cl->device, 865 "hsi_data_sync timeout after %d ms\n", 866 CS_HSI_TRANSFER_TIMEOUT_MS); 867 r = -EIO; 868 goto out; 869 } 870 } 871 872out: 873 spin_unlock_bh(&hi->lock); 874 dev_dbg(&hi->cl->device, "hsi_data_sync done with res %d\n", r); 875 876 return r; 877} 878 879static void cs_hsi_data_enable(struct cs_hsi_iface *hi, 880 struct cs_buffer_config *buf_cfg) 881{ 882 unsigned int data_start, i; 883 884 BUG_ON(hi->buf_size == 0); 885 886 set_buffer_sizes(hi, buf_cfg->rx_bufs, buf_cfg->tx_bufs); 887 888 hi->slot_size = L1_CACHE_ALIGN(hi->buf_size); 889 dev_dbg(&hi->cl->device, 890 "setting slot size to %u, buf size %u, align %u\n", 891 hi->slot_size, hi->buf_size, L1_CACHE_BYTES); 892 893 data_start = L1_CACHE_ALIGN(sizeof(*hi->mmap_cfg)); 894 dev_dbg(&hi->cl->device, 895 "setting data start at %u, cfg block %u, align %u\n", 896 data_start, sizeof(*hi->mmap_cfg), L1_CACHE_BYTES); 897 898 for (i = 0; i < hi->mmap_cfg->rx_bufs; i++) { 899 hi->rx_offsets[i] = data_start + i * hi->slot_size; 900 hi->mmap_cfg->rx_offsets[i] = hi->rx_offsets[i]; 901 dev_dbg(&hi->cl->device, "DL buf #%u at %u\n", 902 i, hi->rx_offsets[i]); 903 } 904 for (i = 0; i < hi->mmap_cfg->tx_bufs; i++) { 905 hi->tx_offsets[i] = data_start + 906 (i + hi->mmap_cfg->rx_bufs) * hi->slot_size; 907 hi->mmap_cfg->tx_offsets[i] = hi->tx_offsets[i]; 908 dev_dbg(&hi->cl->device, "UL buf #%u at %u\n", 909 i, hi->rx_offsets[i]); 910 } 911 912 hi->iface_state = CS_STATE_CONFIGURED; 913} 914 915static void cs_hsi_data_disable(struct cs_hsi_iface *hi, int old_state) 916{ 917 if (old_state == CS_STATE_CONFIGURED) { 918 dev_dbg(&hi->cl->device, 919 "closing data channel with slot size 0\n"); 920 hi->iface_state = CS_STATE_OPENED; 921 } 922} 923 924static int cs_hsi_buf_config(struct cs_hsi_iface *hi, 925 struct cs_buffer_config *buf_cfg) 926{ 927 int r = 0; 928 unsigned int old_state = hi->iface_state; 929 930 spin_lock_bh(&hi->lock); 931 /* Prevent new transactions during buffer reconfig */ 932 if (old_state == CS_STATE_CONFIGURED) 933 hi->iface_state = CS_STATE_OPENED; 934 spin_unlock_bh(&hi->lock); 935 936 /* 937 * make sure that no non-zero data reads are ongoing before 938 * proceeding to change the buffer layout 939 */ 940 r = cs_hsi_data_sync(hi); 941 if (r < 0) 942 return r; 943 944 WARN_ON(cs_state_xfer_active(hi->data_state)); 945 946 spin_lock_bh(&hi->lock); 947 r = check_buf_params(hi, buf_cfg); 948 if (r < 0) 949 goto error; 950 951 hi->buf_size = buf_cfg->buf_size; 952 hi->mmap_cfg->buf_size = hi->buf_size; 953 hi->flags = buf_cfg->flags; 954 955 hi->rx_slot = 0; 956 hi->tx_slot = 0; 957 hi->slot_size = 0; 958 959 if (hi->buf_size) 960 cs_hsi_data_enable(hi, buf_cfg); 961 else 962 cs_hsi_data_disable(hi, old_state); 963 964 spin_unlock_bh(&hi->lock); 965 966 if (old_state != hi->iface_state) { 967 if (hi->iface_state == CS_STATE_CONFIGURED) { 968 cpu_latency_qos_add_request(&hi->pm_qos_req, 969 CS_QOS_LATENCY_FOR_DATA_USEC); 970 local_bh_disable(); 971 cs_hsi_read_on_data(hi); 972 local_bh_enable(); 973 } else if (old_state == CS_STATE_CONFIGURED) { 974 cpu_latency_qos_remove_request(&hi->pm_qos_req); 975 } 976 } 977 return r; 978 979error: 980 spin_unlock_bh(&hi->lock); 981 return r; 982} 983 984static int cs_hsi_start(struct cs_hsi_iface **hi, struct hsi_client *cl, 985 unsigned long mmap_base, unsigned long mmap_size) 986{ 987 int err = 0; 988 struct cs_hsi_iface *hsi_if = kzalloc(sizeof(*hsi_if), GFP_KERNEL); 989 990 dev_dbg(&cl->device, "cs_hsi_start\n"); 991 992 if (!hsi_if) { 993 err = -ENOMEM; 994 goto leave0; 995 } 996 spin_lock_init(&hsi_if->lock); 997 hsi_if->cl = cl; 998 hsi_if->iface_state = CS_STATE_CLOSED; 999 hsi_if->mmap_cfg = (struct cs_mmap_config_block *)mmap_base; 1000 hsi_if->mmap_base = mmap_base; 1001 hsi_if->mmap_size = mmap_size; 1002 memset(hsi_if->mmap_cfg, 0, sizeof(*hsi_if->mmap_cfg)); 1003 init_waitqueue_head(&hsi_if->datawait); 1004 err = cs_alloc_cmds(hsi_if); 1005 if (err < 0) { 1006 dev_err(&cl->device, "Unable to alloc HSI messages\n"); 1007 goto leave1; 1008 } 1009 err = cs_hsi_alloc_data(hsi_if); 1010 if (err < 0) { 1011 dev_err(&cl->device, "Unable to alloc HSI messages for data\n"); 1012 goto leave2; 1013 } 1014 err = hsi_claim_port(cl, 1); 1015 if (err < 0) { 1016 dev_err(&cl->device, 1017 "Could not open, HSI port already claimed\n"); 1018 goto leave3; 1019 } 1020 hsi_if->master = ssip_slave_get_master(cl); 1021 if (IS_ERR(hsi_if->master)) { 1022 err = PTR_ERR(hsi_if->master); 1023 dev_err(&cl->device, "Could not get HSI master client\n"); 1024 goto leave4; 1025 } 1026 if (!ssip_slave_running(hsi_if->master)) { 1027 err = -ENODEV; 1028 dev_err(&cl->device, 1029 "HSI port not initialized\n"); 1030 goto leave4; 1031 } 1032 1033 hsi_if->iface_state = CS_STATE_OPENED; 1034 local_bh_disable(); 1035 cs_hsi_read_on_control(hsi_if); 1036 local_bh_enable(); 1037 1038 dev_dbg(&cl->device, "cs_hsi_start...done\n"); 1039 1040 BUG_ON(!hi); 1041 *hi = hsi_if; 1042 1043 return 0; 1044 1045leave4: 1046 hsi_release_port(cl); 1047leave3: 1048 cs_hsi_free_data(hsi_if); 1049leave2: 1050 cs_free_cmds(hsi_if); 1051leave1: 1052 kfree(hsi_if); 1053leave0: 1054 dev_dbg(&cl->device, "cs_hsi_start...done/error\n\n"); 1055 1056 return err; 1057} 1058 1059static void cs_hsi_stop(struct cs_hsi_iface *hi) 1060{ 1061 dev_dbg(&hi->cl->device, "cs_hsi_stop\n"); 1062 cs_hsi_set_wakeline(hi, 0); 1063 ssip_slave_put_master(hi->master); 1064 1065 /* hsi_release_port() needs to be called with CS_STATE_CLOSED */ 1066 hi->iface_state = CS_STATE_CLOSED; 1067 hsi_release_port(hi->cl); 1068 1069 /* 1070 * hsi_release_port() should flush out all the pending 1071 * messages, so cs_state_idle() should be true for both 1072 * control and data channels. 1073 */ 1074 WARN_ON(!cs_state_idle(hi->control_state)); 1075 WARN_ON(!cs_state_idle(hi->data_state)); 1076 1077 if (cpu_latency_qos_request_active(&hi->pm_qos_req)) 1078 cpu_latency_qos_remove_request(&hi->pm_qos_req); 1079 1080 spin_lock_bh(&hi->lock); 1081 cs_hsi_free_data(hi); 1082 cs_free_cmds(hi); 1083 spin_unlock_bh(&hi->lock); 1084 kfree(hi); 1085} 1086 1087static vm_fault_t cs_char_vma_fault(struct vm_fault *vmf) 1088{ 1089 struct cs_char *csdata = vmf->vma->vm_private_data; 1090 struct page *page; 1091 1092 page = virt_to_page(csdata->mmap_base); 1093 get_page(page); 1094 vmf->page = page; 1095 1096 return 0; 1097} 1098 1099static const struct vm_operations_struct cs_char_vm_ops = { 1100 .fault = cs_char_vma_fault, 1101}; 1102 1103static int cs_char_fasync(int fd, struct file *file, int on) 1104{ 1105 struct cs_char *csdata = file->private_data; 1106 1107 if (fasync_helper(fd, file, on, &csdata->async_queue) < 0) 1108 return -EIO; 1109 1110 return 0; 1111} 1112 1113static __poll_t cs_char_poll(struct file *file, poll_table *wait) 1114{ 1115 struct cs_char *csdata = file->private_data; 1116 __poll_t ret = 0; 1117 1118 poll_wait(file, &cs_char_data.wait, wait); 1119 spin_lock_bh(&csdata->lock); 1120 if (!list_empty(&csdata->chardev_queue)) 1121 ret = EPOLLIN | EPOLLRDNORM; 1122 else if (!list_empty(&csdata->dataind_queue)) 1123 ret = EPOLLIN | EPOLLRDNORM; 1124 spin_unlock_bh(&csdata->lock); 1125 1126 return ret; 1127} 1128 1129static ssize_t cs_char_read(struct file *file, char __user *buf, size_t count, 1130 loff_t *unused) 1131{ 1132 struct cs_char *csdata = file->private_data; 1133 u32 data; 1134 ssize_t retval; 1135 1136 if (count < sizeof(data)) 1137 return -EINVAL; 1138 1139 for (;;) { 1140 DEFINE_WAIT(wait); 1141 1142 spin_lock_bh(&csdata->lock); 1143 if (!list_empty(&csdata->chardev_queue)) { 1144 data = cs_pop_entry(&csdata->chardev_queue); 1145 } else if (!list_empty(&csdata->dataind_queue)) { 1146 data = cs_pop_entry(&csdata->dataind_queue); 1147 csdata->dataind_pending--; 1148 } else { 1149 data = 0; 1150 } 1151 spin_unlock_bh(&csdata->lock); 1152 1153 if (data) 1154 break; 1155 if (file->f_flags & O_NONBLOCK) { 1156 retval = -EAGAIN; 1157 goto out; 1158 } else if (signal_pending(current)) { 1159 retval = -ERESTARTSYS; 1160 goto out; 1161 } 1162 prepare_to_wait_exclusive(&csdata->wait, &wait, 1163 TASK_INTERRUPTIBLE); 1164 schedule(); 1165 finish_wait(&csdata->wait, &wait); 1166 } 1167 1168 retval = put_user(data, (u32 __user *)buf); 1169 if (!retval) 1170 retval = sizeof(data); 1171 1172out: 1173 return retval; 1174} 1175 1176static ssize_t cs_char_write(struct file *file, const char __user *buf, 1177 size_t count, loff_t *unused) 1178{ 1179 struct cs_char *csdata = file->private_data; 1180 u32 data; 1181 int err; 1182 ssize_t retval; 1183 1184 if (count < sizeof(data)) 1185 return -EINVAL; 1186 1187 if (get_user(data, (u32 __user *)buf)) 1188 retval = -EFAULT; 1189 else 1190 retval = count; 1191 1192 err = cs_hsi_command(csdata->hi, data); 1193 if (err < 0) 1194 retval = err; 1195 1196 return retval; 1197} 1198 1199static long cs_char_ioctl(struct file *file, unsigned int cmd, 1200 unsigned long arg) 1201{ 1202 struct cs_char *csdata = file->private_data; 1203 int r = 0; 1204 1205 switch (cmd) { 1206 case CS_GET_STATE: { 1207 unsigned int state; 1208 1209 state = cs_hsi_get_state(csdata->hi); 1210 if (copy_to_user((void __user *)arg, &state, sizeof(state))) 1211 r = -EFAULT; 1212 1213 break; 1214 } 1215 case CS_SET_WAKELINE: { 1216 unsigned int state; 1217 1218 if (copy_from_user(&state, (void __user *)arg, sizeof(state))) { 1219 r = -EFAULT; 1220 break; 1221 } 1222 1223 if (state > 1) { 1224 r = -EINVAL; 1225 break; 1226 } 1227 1228 cs_hsi_set_wakeline(csdata->hi, !!state); 1229 1230 break; 1231 } 1232 case CS_GET_IF_VERSION: { 1233 unsigned int ifver = CS_IF_VERSION; 1234 1235 if (copy_to_user((void __user *)arg, &ifver, sizeof(ifver))) 1236 r = -EFAULT; 1237 1238 break; 1239 } 1240 case CS_CONFIG_BUFS: { 1241 struct cs_buffer_config buf_cfg; 1242 1243 if (copy_from_user(&buf_cfg, (void __user *)arg, 1244 sizeof(buf_cfg))) 1245 r = -EFAULT; 1246 else 1247 r = cs_hsi_buf_config(csdata->hi, &buf_cfg); 1248 1249 break; 1250 } 1251 default: 1252 r = -ENOTTY; 1253 break; 1254 } 1255 1256 return r; 1257} 1258 1259static int cs_char_mmap(struct file *file, struct vm_area_struct *vma) 1260{ 1261 if (vma->vm_end < vma->vm_start) 1262 return -EINVAL; 1263 1264 if (vma_pages(vma) != 1) 1265 return -EINVAL; 1266 1267 vma->vm_flags |= VM_IO | VM_DONTDUMP | VM_DONTEXPAND; 1268 vma->vm_ops = &cs_char_vm_ops; 1269 vma->vm_private_data = file->private_data; 1270 1271 return 0; 1272} 1273 1274static int cs_char_open(struct inode *unused, struct file *file) 1275{ 1276 int ret = 0; 1277 unsigned long p; 1278 1279 spin_lock_bh(&cs_char_data.lock); 1280 if (cs_char_data.opened) { 1281 ret = -EBUSY; 1282 spin_unlock_bh(&cs_char_data.lock); 1283 goto out1; 1284 } 1285 cs_char_data.opened = 1; 1286 cs_char_data.dataind_pending = 0; 1287 spin_unlock_bh(&cs_char_data.lock); 1288 1289 p = get_zeroed_page(GFP_KERNEL); 1290 if (!p) { 1291 ret = -ENOMEM; 1292 goto out2; 1293 } 1294 1295 ret = cs_hsi_start(&cs_char_data.hi, cs_char_data.cl, p, CS_MMAP_SIZE); 1296 if (ret) { 1297 dev_err(&cs_char_data.cl->device, "Unable to initialize HSI\n"); 1298 goto out3; 1299 } 1300 1301 /* these are only used in release so lock not needed */ 1302 cs_char_data.mmap_base = p; 1303 cs_char_data.mmap_size = CS_MMAP_SIZE; 1304 1305 file->private_data = &cs_char_data; 1306 1307 return 0; 1308 1309out3: 1310 free_page(p); 1311out2: 1312 spin_lock_bh(&cs_char_data.lock); 1313 cs_char_data.opened = 0; 1314 spin_unlock_bh(&cs_char_data.lock); 1315out1: 1316 return ret; 1317} 1318 1319static void cs_free_char_queue(struct list_head *head) 1320{ 1321 struct char_queue *entry; 1322 struct list_head *cursor, *next; 1323 1324 if (!list_empty(head)) { 1325 list_for_each_safe(cursor, next, head) { 1326 entry = list_entry(cursor, struct char_queue, list); 1327 list_del(&entry->list); 1328 kfree(entry); 1329 } 1330 } 1331 1332} 1333 1334static int cs_char_release(struct inode *unused, struct file *file) 1335{ 1336 struct cs_char *csdata = file->private_data; 1337 1338 cs_hsi_stop(csdata->hi); 1339 spin_lock_bh(&csdata->lock); 1340 csdata->hi = NULL; 1341 free_page(csdata->mmap_base); 1342 cs_free_char_queue(&csdata->chardev_queue); 1343 cs_free_char_queue(&csdata->dataind_queue); 1344 csdata->opened = 0; 1345 spin_unlock_bh(&csdata->lock); 1346 1347 return 0; 1348} 1349 1350static const struct file_operations cs_char_fops = { 1351 .owner = THIS_MODULE, 1352 .read = cs_char_read, 1353 .write = cs_char_write, 1354 .poll = cs_char_poll, 1355 .unlocked_ioctl = cs_char_ioctl, 1356 .mmap = cs_char_mmap, 1357 .open = cs_char_open, 1358 .release = cs_char_release, 1359 .fasync = cs_char_fasync, 1360}; 1361 1362static struct miscdevice cs_char_miscdev = { 1363 .minor = MISC_DYNAMIC_MINOR, 1364 .name = "cmt_speech", 1365 .fops = &cs_char_fops 1366}; 1367 1368static int cs_hsi_client_probe(struct device *dev) 1369{ 1370 int err = 0; 1371 struct hsi_client *cl = to_hsi_client(dev); 1372 1373 dev_dbg(dev, "hsi_client_probe\n"); 1374 init_waitqueue_head(&cs_char_data.wait); 1375 spin_lock_init(&cs_char_data.lock); 1376 cs_char_data.opened = 0; 1377 cs_char_data.cl = cl; 1378 cs_char_data.hi = NULL; 1379 INIT_LIST_HEAD(&cs_char_data.chardev_queue); 1380 INIT_LIST_HEAD(&cs_char_data.dataind_queue); 1381 1382 cs_char_data.channel_id_cmd = hsi_get_channel_id_by_name(cl, 1383 "speech-control"); 1384 if (cs_char_data.channel_id_cmd < 0) { 1385 err = cs_char_data.channel_id_cmd; 1386 dev_err(dev, "Could not get cmd channel (%d)\n", err); 1387 return err; 1388 } 1389 1390 cs_char_data.channel_id_data = hsi_get_channel_id_by_name(cl, 1391 "speech-data"); 1392 if (cs_char_data.channel_id_data < 0) { 1393 err = cs_char_data.channel_id_data; 1394 dev_err(dev, "Could not get data channel (%d)\n", err); 1395 return err; 1396 } 1397 1398 err = misc_register(&cs_char_miscdev); 1399 if (err) 1400 dev_err(dev, "Failed to register: %d\n", err); 1401 1402 return err; 1403} 1404 1405static int cs_hsi_client_remove(struct device *dev) 1406{ 1407 struct cs_hsi_iface *hi; 1408 1409 dev_dbg(dev, "hsi_client_remove\n"); 1410 misc_deregister(&cs_char_miscdev); 1411 spin_lock_bh(&cs_char_data.lock); 1412 hi = cs_char_data.hi; 1413 cs_char_data.hi = NULL; 1414 spin_unlock_bh(&cs_char_data.lock); 1415 if (hi) 1416 cs_hsi_stop(hi); 1417 1418 return 0; 1419} 1420 1421static struct hsi_client_driver cs_hsi_driver = { 1422 .driver = { 1423 .name = "cmt-speech", 1424 .owner = THIS_MODULE, 1425 .probe = cs_hsi_client_probe, 1426 .remove = cs_hsi_client_remove, 1427 }, 1428}; 1429 1430static int __init cs_char_init(void) 1431{ 1432 pr_info("CMT speech driver added\n"); 1433 return hsi_register_client_driver(&cs_hsi_driver); 1434} 1435module_init(cs_char_init); 1436 1437static void __exit cs_char_exit(void) 1438{ 1439 hsi_unregister_client_driver(&cs_hsi_driver); 1440 pr_info("CMT speech driver removed\n"); 1441} 1442module_exit(cs_char_exit); 1443 1444MODULE_ALIAS("hsi:cmt-speech"); 1445MODULE_AUTHOR("Kai Vehmanen <kai.vehmanen@nokia.com>"); 1446MODULE_AUTHOR("Peter Ujfalusi <peter.ujfalusi@nokia.com>"); 1447MODULE_DESCRIPTION("CMT speech driver"); 1448MODULE_LICENSE("GPL v2");