1 /* 2 * Shared Transport Line discipline driver Core 3 * Init Manager module responsible for GPIO control 4 * and firmware download 5 * Copyright (C) 2009-2010 Texas Instruments 6 * Author: Pavan Savoy <pavan_savoy@ti.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 * 21 */ 22 23 #define pr_fmt(fmt) "(stk) :" fmt 24 #include <linux/platform_device.h> 25 #include <linux/jiffies.h> 26 #include <linux/firmware.h> 27 #include <linux/delay.h> 28 #include <linux/wait.h> 29 #include <linux/gpio.h> 30 #include <linux/debugfs.h> 31 #include <linux/seq_file.h> 32 #include <linux/sched.h> 33 #include <linux/sysfs.h> 34 #include <linux/tty.h> 35 36 #include <linux/skbuff.h> 37 #include <linux/ti_wilink_st.h> 38 #include <linux/module.h> 39 40 #define MAX_ST_DEVICES 3 /* Imagine 1 on each UART for now */ 41 static struct platform_device *st_kim_devices[MAX_ST_DEVICES]; 42 43 /**********************************************************************/ 44 /* internal functions */ 45 46 /** 47 * st_get_plat_device - 48 * function which returns the reference to the platform device 49 * requested by id. As of now only 1 such device exists (id=0) 50 * the context requesting for reference can get the id to be 51 * requested by a. The protocol driver which is registering or 52 * b. the tty device which is opened. 53 */ 54 static struct platform_device *st_get_plat_device(int id) 55 { 56 return st_kim_devices[id]; 57 } 58 59 /** 60 * validate_firmware_response - 61 * function to return whether the firmware response was proper 62 * in case of error don't complete so that waiting for proper 63 * response times out 64 */ 65 static void validate_firmware_response(struct kim_data_s *kim_gdata) 66 { 67 struct sk_buff *skb = kim_gdata->rx_skb; 68 if (!skb) 69 return; 70 71 /* these magic numbers are the position in the response buffer which 72 * allows us to distinguish whether the response is for the read 73 * version info. command 74 */ 75 if (skb->data[2] == 0x01 && skb->data[3] == 0x01 && 76 skb->data[4] == 0x10 && skb->data[5] == 0x00) { 77 /* fw version response */ 78 memcpy(kim_gdata->resp_buffer, 79 kim_gdata->rx_skb->data, 80 kim_gdata->rx_skb->len); 81 complete_all(&kim_gdata->kim_rcvd); 82 kim_gdata->rx_state = ST_W4_PACKET_TYPE; 83 kim_gdata->rx_skb = NULL; 84 kim_gdata->rx_count = 0; 85 } else if (unlikely(skb->data[5] != 0)) { 86 pr_err("no proper response during fw download"); 87 pr_err("data6 %x", skb->data[5]); 88 kfree_skb(skb); 89 return; /* keep waiting for the proper response */ 90 } 91 /* becos of all the script being downloaded */ 92 complete_all(&kim_gdata->kim_rcvd); 93 kfree_skb(skb); 94 } 95 96 /* check for data len received inside kim_int_recv 97 * most often hit the last case to update state to waiting for data 98 */ 99 static inline int kim_check_data_len(struct kim_data_s *kim_gdata, int len) 100 { 101 register int room = skb_tailroom(kim_gdata->rx_skb); 102 103 pr_debug("len %d room %d", len, room); 104 105 if (!len) { 106 validate_firmware_response(kim_gdata); 107 } else if (len > room) { 108 /* Received packet's payload length is larger. 109 * We can't accommodate it in created skb. 110 */ 111 pr_err("Data length is too large len %d room %d", len, 112 room); 113 kfree_skb(kim_gdata->rx_skb); 114 } else { 115 /* Packet header has non-zero payload length and 116 * we have enough space in created skb. Lets read 117 * payload data */ 118 kim_gdata->rx_state = ST_W4_DATA; 119 kim_gdata->rx_count = len; 120 return len; 121 } 122 123 /* Change ST LL state to continue to process next 124 * packet */ 125 kim_gdata->rx_state = ST_W4_PACKET_TYPE; 126 kim_gdata->rx_skb = NULL; 127 kim_gdata->rx_count = 0; 128 129 return 0; 130 } 131 132 /** 133 * kim_int_recv - receive function called during firmware download 134 * firmware download responses on different UART drivers 135 * have been observed to come in bursts of different 136 * tty_receive and hence the logic 137 */ 138 static void kim_int_recv(struct kim_data_s *kim_gdata, 139 const unsigned char *data, long count) 140 { 141 const unsigned char *ptr; 142 int len = 0, type = 0; 143 unsigned char *plen; 144 145 pr_debug("%s", __func__); 146 /* Decode received bytes here */ 147 ptr = data; 148 if (unlikely(ptr == NULL)) { 149 pr_err(" received null from TTY "); 150 return; 151 } 152 153 while (count) { 154 if (kim_gdata->rx_count) { 155 len = min_t(unsigned int, kim_gdata->rx_count, count); 156 memcpy(skb_put(kim_gdata->rx_skb, len), ptr, len); 157 kim_gdata->rx_count -= len; 158 count -= len; 159 ptr += len; 160 161 if (kim_gdata->rx_count) 162 continue; 163 164 /* Check ST RX state machine , where are we? */ 165 switch (kim_gdata->rx_state) { 166 /* Waiting for complete packet ? */ 167 case ST_W4_DATA: 168 pr_debug("Complete pkt received"); 169 validate_firmware_response(kim_gdata); 170 kim_gdata->rx_state = ST_W4_PACKET_TYPE; 171 kim_gdata->rx_skb = NULL; 172 continue; 173 /* Waiting for Bluetooth event header ? */ 174 case ST_W4_HEADER: 175 plen = 176 (unsigned char *)&kim_gdata->rx_skb->data[1]; 177 pr_debug("event hdr: plen 0x%02x\n", *plen); 178 kim_check_data_len(kim_gdata, *plen); 179 continue; 180 } /* end of switch */ 181 } /* end of if rx_state */ 182 switch (*ptr) { 183 /* Bluetooth event packet? */ 184 case 0x04: 185 kim_gdata->rx_state = ST_W4_HEADER; 186 kim_gdata->rx_count = 2; 187 type = *ptr; 188 break; 189 default: 190 pr_info("unknown packet"); 191 ptr++; 192 count--; 193 continue; 194 } 195 ptr++; 196 count--; 197 kim_gdata->rx_skb = 198 alloc_skb(1024+8, GFP_ATOMIC); 199 if (!kim_gdata->rx_skb) { 200 pr_err("can't allocate mem for new packet"); 201 kim_gdata->rx_state = ST_W4_PACKET_TYPE; 202 kim_gdata->rx_count = 0; 203 return; 204 } 205 skb_reserve(kim_gdata->rx_skb, 8); 206 kim_gdata->rx_skb->cb[0] = 4; 207 kim_gdata->rx_skb->cb[1] = 0; 208 209 } 210 return; 211 } 212 213 static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name) 214 { 215 unsigned short version = 0, chip = 0, min_ver = 0, maj_ver = 0; 216 const char read_ver_cmd[] = { 0x01, 0x01, 0x10, 0x00 }; 217 long timeout; 218 219 pr_debug("%s", __func__); 220 221 reinit_completion(&kim_gdata->kim_rcvd); 222 if (4 != st_int_write(kim_gdata->core_data, read_ver_cmd, 4)) { 223 pr_err("kim: couldn't write 4 bytes"); 224 return -EIO; 225 } 226 227 timeout = wait_for_completion_interruptible_timeout( 228 &kim_gdata->kim_rcvd, msecs_to_jiffies(CMD_RESP_TIME)); 229 if (timeout <= 0) { 230 pr_err(" waiting for ver info- timed out or received signal"); 231 return timeout ? -ERESTARTSYS : -ETIMEDOUT; 232 } 233 reinit_completion(&kim_gdata->kim_rcvd); 234 /* the positions 12 & 13 in the response buffer provide with the 235 * chip, major & minor numbers 236 */ 237 238 version = 239 MAKEWORD(kim_gdata->resp_buffer[12], 240 kim_gdata->resp_buffer[13]); 241 chip = (version & 0x7C00) >> 10; 242 min_ver = (version & 0x007F); 243 maj_ver = (version & 0x0380) >> 7; 244 245 if (version & 0x8000) 246 maj_ver |= 0x0008; 247 248 sprintf(bts_scr_name, "ti-connectivity/TIInit_%d.%d.%d.bts", 249 chip, maj_ver, min_ver); 250 251 /* to be accessed later via sysfs entry */ 252 kim_gdata->version.full = version; 253 kim_gdata->version.chip = chip; 254 kim_gdata->version.maj_ver = maj_ver; 255 kim_gdata->version.min_ver = min_ver; 256 257 pr_info("%s", bts_scr_name); 258 return 0; 259 } 260 261 static void skip_change_remote_baud(unsigned char **ptr, long *len) 262 { 263 unsigned char *nxt_action, *cur_action; 264 cur_action = *ptr; 265 266 nxt_action = cur_action + sizeof(struct bts_action) + 267 ((struct bts_action *) cur_action)->size; 268 269 if (((struct bts_action *) nxt_action)->type != ACTION_WAIT_EVENT) { 270 pr_err("invalid action after change remote baud command"); 271 } else { 272 *ptr = *ptr + sizeof(struct bts_action) + 273 ((struct bts_action *)cur_action)->size; 274 *len = *len - (sizeof(struct bts_action) + 275 ((struct bts_action *)cur_action)->size); 276 /* warn user on not commenting these in firmware */ 277 pr_warn("skipping the wait event of change remote baud"); 278 } 279 } 280 281 /** 282 * download_firmware - 283 * internal function which parses through the .bts firmware 284 * script file intreprets SEND, DELAY actions only as of now 285 */ 286 static long download_firmware(struct kim_data_s *kim_gdata) 287 { 288 long err = 0; 289 long len = 0; 290 unsigned char *ptr = NULL; 291 unsigned char *action_ptr = NULL; 292 unsigned char bts_scr_name[40] = { 0 }; /* 40 char long bts scr name? */ 293 int wr_room_space; 294 int cmd_size; 295 unsigned long timeout; 296 297 err = read_local_version(kim_gdata, bts_scr_name); 298 if (err != 0) { 299 pr_err("kim: failed to read local ver"); 300 return err; 301 } 302 err = 303 request_firmware(&kim_gdata->fw_entry, bts_scr_name, 304 &kim_gdata->kim_pdev->dev); 305 if (unlikely((err != 0) || (kim_gdata->fw_entry->data == NULL) || 306 (kim_gdata->fw_entry->size == 0))) { 307 pr_err(" request_firmware failed(errno %ld) for %s", err, 308 bts_scr_name); 309 return -EINVAL; 310 } 311 ptr = (void *)kim_gdata->fw_entry->data; 312 len = kim_gdata->fw_entry->size; 313 /* bts_header to remove out magic number and 314 * version 315 */ 316 ptr += sizeof(struct bts_header); 317 len -= sizeof(struct bts_header); 318 319 while (len > 0 && ptr) { 320 pr_debug(" action size %d, type %d ", 321 ((struct bts_action *)ptr)->size, 322 ((struct bts_action *)ptr)->type); 323 324 switch (((struct bts_action *)ptr)->type) { 325 case ACTION_SEND_COMMAND: /* action send */ 326 pr_debug("S"); 327 action_ptr = &(((struct bts_action *)ptr)->data[0]); 328 if (unlikely 329 (((struct hci_command *)action_ptr)->opcode == 330 0xFF36)) { 331 /* ignore remote change 332 * baud rate HCI VS command */ 333 pr_warn("change remote baud" 334 " rate command in firmware"); 335 skip_change_remote_baud(&ptr, &len); 336 break; 337 } 338 /* 339 * Make sure we have enough free space in uart 340 * tx buffer to write current firmware command 341 */ 342 cmd_size = ((struct bts_action *)ptr)->size; 343 timeout = jiffies + msecs_to_jiffies(CMD_WR_TIME); 344 do { 345 wr_room_space = 346 st_get_uart_wr_room(kim_gdata->core_data); 347 if (wr_room_space < 0) { 348 pr_err("Unable to get free " 349 "space info from uart tx buffer"); 350 release_firmware(kim_gdata->fw_entry); 351 return wr_room_space; 352 } 353 mdelay(1); /* wait 1ms before checking room */ 354 } while ((wr_room_space < cmd_size) && 355 time_before(jiffies, timeout)); 356 357 /* Timeout happened ? */ 358 if (time_after_eq(jiffies, timeout)) { 359 pr_err("Timeout while waiting for free " 360 "free space in uart tx buffer"); 361 release_firmware(kim_gdata->fw_entry); 362 return -ETIMEDOUT; 363 } 364 /* reinit completion before sending for the 365 * relevant wait 366 */ 367 reinit_completion(&kim_gdata->kim_rcvd); 368 369 /* 370 * Free space found in uart buffer, call st_int_write 371 * to send current firmware command to the uart tx 372 * buffer. 373 */ 374 err = st_int_write(kim_gdata->core_data, 375 ((struct bts_action_send *)action_ptr)->data, 376 ((struct bts_action *)ptr)->size); 377 if (unlikely(err < 0)) { 378 release_firmware(kim_gdata->fw_entry); 379 return err; 380 } 381 /* 382 * Check number of bytes written to the uart tx buffer 383 * and requested command write size 384 */ 385 if (err != cmd_size) { 386 pr_err("Number of bytes written to uart " 387 "tx buffer are not matching with " 388 "requested cmd write size"); 389 release_firmware(kim_gdata->fw_entry); 390 return -EIO; 391 } 392 break; 393 case ACTION_WAIT_EVENT: /* wait */ 394 pr_debug("W"); 395 err = wait_for_completion_interruptible_timeout( 396 &kim_gdata->kim_rcvd, 397 msecs_to_jiffies(CMD_RESP_TIME)); 398 if (err <= 0) { 399 pr_err("response timeout/signaled during fw download "); 400 /* timed out */ 401 release_firmware(kim_gdata->fw_entry); 402 return err ? -ERESTARTSYS : -ETIMEDOUT; 403 } 404 reinit_completion(&kim_gdata->kim_rcvd); 405 break; 406 case ACTION_DELAY: /* sleep */ 407 pr_info("sleep command in scr"); 408 action_ptr = &(((struct bts_action *)ptr)->data[0]); 409 mdelay(((struct bts_action_delay *)action_ptr)->msec); 410 break; 411 } 412 len = 413 len - (sizeof(struct bts_action) + 414 ((struct bts_action *)ptr)->size); 415 ptr = 416 ptr + sizeof(struct bts_action) + 417 ((struct bts_action *)ptr)->size; 418 } 419 /* fw download complete */ 420 release_firmware(kim_gdata->fw_entry); 421 return 0; 422 } 423 424 /**********************************************************************/ 425 /* functions called from ST core */ 426 /* called from ST Core, when REG_IN_PROGRESS (registration in progress) 427 * can be because of 428 * 1. response to read local version 429 * 2. during send/recv's of firmware download 430 */ 431 void st_kim_recv(void *disc_data, const unsigned char *data, long count) 432 { 433 struct st_data_s *st_gdata = (struct st_data_s *)disc_data; 434 struct kim_data_s *kim_gdata = st_gdata->kim_data; 435 436 /* proceed to gather all data and distinguish read fw version response 437 * from other fw responses when data gathering is complete 438 */ 439 kim_int_recv(kim_gdata, data, count); 440 return; 441 } 442 443 /* to signal completion of line discipline installation 444 * called from ST Core, upon tty_open 445 */ 446 void st_kim_complete(void *kim_data) 447 { 448 struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; 449 complete(&kim_gdata->ldisc_installed); 450 } 451 452 /** 453 * st_kim_start - called from ST Core upon 1st registration 454 * This involves toggling the chip enable gpio, reading 455 * the firmware version from chip, forming the fw file name 456 * based on the chip version, requesting the fw, parsing it 457 * and perform download(send/recv). 458 */ 459 long st_kim_start(void *kim_data) 460 { 461 long err = 0; 462 long retry = POR_RETRY_COUNT; 463 struct ti_st_plat_data *pdata; 464 struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; 465 466 pr_info(" %s", __func__); 467 pdata = kim_gdata->kim_pdev->dev.platform_data; 468 469 do { 470 /* platform specific enabling code here */ 471 if (pdata->chip_enable) 472 pdata->chip_enable(kim_gdata); 473 474 /* Configure BT nShutdown to HIGH state */ 475 gpio_set_value_cansleep(kim_gdata->nshutdown, GPIO_LOW); 476 mdelay(5); /* FIXME: a proper toggle */ 477 gpio_set_value_cansleep(kim_gdata->nshutdown, GPIO_HIGH); 478 mdelay(100); 479 /* re-initialize the completion */ 480 reinit_completion(&kim_gdata->ldisc_installed); 481 /* send notification to UIM */ 482 kim_gdata->ldisc_install = 1; 483 pr_info("ldisc_install = 1"); 484 sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, 485 NULL, "install"); 486 /* wait for ldisc to be installed */ 487 err = wait_for_completion_interruptible_timeout( 488 &kim_gdata->ldisc_installed, msecs_to_jiffies(LDISC_TIME)); 489 if (!err) { 490 /* ldisc installation timeout, 491 * flush uart, power cycle BT_EN */ 492 pr_err("ldisc installation timeout"); 493 err = st_kim_stop(kim_gdata); 494 continue; 495 } else { 496 /* ldisc installed now */ 497 pr_info("line discipline installed"); 498 err = download_firmware(kim_gdata); 499 if (err != 0) { 500 /* ldisc installed but fw download failed, 501 * flush uart & power cycle BT_EN */ 502 pr_err("download firmware failed"); 503 err = st_kim_stop(kim_gdata); 504 continue; 505 } else { /* on success don't retry */ 506 break; 507 } 508 } 509 } while (retry--); 510 return err; 511 } 512 513 /** 514 * st_kim_stop - stop communication with chip. 515 * This can be called from ST Core/KIM, on the- 516 * (a) last un-register when chip need not be powered there-after, 517 * (b) upon failure to either install ldisc or download firmware. 518 * The function is responsible to (a) notify UIM about un-installation, 519 * (b) flush UART if the ldisc was installed. 520 * (c) reset BT_EN - pull down nshutdown at the end. 521 * (d) invoke platform's chip disabling routine. 522 */ 523 long st_kim_stop(void *kim_data) 524 { 525 long err = 0; 526 struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; 527 struct ti_st_plat_data *pdata = 528 kim_gdata->kim_pdev->dev.platform_data; 529 struct tty_struct *tty = kim_gdata->core_data->tty; 530 531 reinit_completion(&kim_gdata->ldisc_installed); 532 533 if (tty) { /* can be called before ldisc is installed */ 534 /* Flush any pending characters in the driver and discipline. */ 535 tty_ldisc_flush(tty); 536 tty_driver_flush_buffer(tty); 537 } 538 539 /* send uninstall notification to UIM */ 540 pr_info("ldisc_install = 0"); 541 kim_gdata->ldisc_install = 0; 542 sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, NULL, "install"); 543 544 /* wait for ldisc to be un-installed */ 545 err = wait_for_completion_interruptible_timeout( 546 &kim_gdata->ldisc_installed, msecs_to_jiffies(LDISC_TIME)); 547 if (!err) { /* timeout */ 548 pr_err(" timed out waiting for ldisc to be un-installed"); 549 err = -ETIMEDOUT; 550 } 551 552 /* By default configure BT nShutdown to LOW state */ 553 gpio_set_value_cansleep(kim_gdata->nshutdown, GPIO_LOW); 554 mdelay(1); 555 gpio_set_value_cansleep(kim_gdata->nshutdown, GPIO_HIGH); 556 mdelay(1); 557 gpio_set_value_cansleep(kim_gdata->nshutdown, GPIO_LOW); 558 559 /* platform specific disable */ 560 if (pdata->chip_disable) 561 pdata->chip_disable(kim_gdata); 562 return err; 563 } 564 565 /**********************************************************************/ 566 /* functions called from subsystems */ 567 /* called when debugfs entry is read from */ 568 569 static int show_version(struct seq_file *s, void *unused) 570 { 571 struct kim_data_s *kim_gdata = (struct kim_data_s *)s->private; 572 seq_printf(s, "%04X %d.%d.%d\n", kim_gdata->version.full, 573 kim_gdata->version.chip, kim_gdata->version.maj_ver, 574 kim_gdata->version.min_ver); 575 return 0; 576 } 577 578 static int show_list(struct seq_file *s, void *unused) 579 { 580 struct kim_data_s *kim_gdata = (struct kim_data_s *)s->private; 581 kim_st_list_protocols(kim_gdata->core_data, s); 582 return 0; 583 } 584 585 static ssize_t show_install(struct device *dev, 586 struct device_attribute *attr, char *buf) 587 { 588 struct kim_data_s *kim_data = dev_get_drvdata(dev); 589 return sprintf(buf, "%d\n", kim_data->ldisc_install); 590 } 591 592 #ifdef DEBUG 593 static ssize_t store_dev_name(struct device *dev, 594 struct device_attribute *attr, const char *buf, size_t count) 595 { 596 struct kim_data_s *kim_data = dev_get_drvdata(dev); 597 pr_debug("storing dev name >%s<", buf); 598 strncpy(kim_data->dev_name, buf, count); 599 pr_debug("stored dev name >%s<", kim_data->dev_name); 600 return count; 601 } 602 603 static ssize_t store_baud_rate(struct device *dev, 604 struct device_attribute *attr, const char *buf, size_t count) 605 { 606 struct kim_data_s *kim_data = dev_get_drvdata(dev); 607 pr_debug("storing baud rate >%s<", buf); 608 sscanf(buf, "%ld", &kim_data->baud_rate); 609 pr_debug("stored baud rate >%ld<", kim_data->baud_rate); 610 return count; 611 } 612 #endif /* if DEBUG */ 613 614 static ssize_t show_dev_name(struct device *dev, 615 struct device_attribute *attr, char *buf) 616 { 617 struct kim_data_s *kim_data = dev_get_drvdata(dev); 618 return sprintf(buf, "%s\n", kim_data->dev_name); 619 } 620 621 static ssize_t show_baud_rate(struct device *dev, 622 struct device_attribute *attr, char *buf) 623 { 624 struct kim_data_s *kim_data = dev_get_drvdata(dev); 625 return sprintf(buf, "%d\n", kim_data->baud_rate); 626 } 627 628 static ssize_t show_flow_cntrl(struct device *dev, 629 struct device_attribute *attr, char *buf) 630 { 631 struct kim_data_s *kim_data = dev_get_drvdata(dev); 632 return sprintf(buf, "%d\n", kim_data->flow_cntrl); 633 } 634 635 /* structures specific for sysfs entries */ 636 static struct kobj_attribute ldisc_install = 637 __ATTR(install, 0444, (void *)show_install, NULL); 638 639 static struct kobj_attribute uart_dev_name = 640 #ifdef DEBUG /* TODO: move this to debug-fs if possible */ 641 __ATTR(dev_name, 0644, (void *)show_dev_name, (void *)store_dev_name); 642 #else 643 __ATTR(dev_name, 0444, (void *)show_dev_name, NULL); 644 #endif 645 646 static struct kobj_attribute uart_baud_rate = 647 #ifdef DEBUG /* TODO: move to debugfs */ 648 __ATTR(baud_rate, 0644, (void *)show_baud_rate, (void *)store_baud_rate); 649 #else 650 __ATTR(baud_rate, 0444, (void *)show_baud_rate, NULL); 651 #endif 652 653 static struct kobj_attribute uart_flow_cntrl = 654 __ATTR(flow_cntrl, 0444, (void *)show_flow_cntrl, NULL); 655 656 static struct attribute *uim_attrs[] = { 657 &ldisc_install.attr, 658 &uart_dev_name.attr, 659 &uart_baud_rate.attr, 660 &uart_flow_cntrl.attr, 661 NULL, 662 }; 663 664 static struct attribute_group uim_attr_grp = { 665 .attrs = uim_attrs, 666 }; 667 668 /** 669 * st_kim_ref - reference the core's data 670 * This references the per-ST platform device in the arch/xx/ 671 * board-xx.c file. 672 * This would enable multiple such platform devices to exist 673 * on a given platform 674 */ 675 void st_kim_ref(struct st_data_s **core_data, int id) 676 { 677 struct platform_device *pdev; 678 struct kim_data_s *kim_gdata; 679 /* get kim_gdata reference from platform device */ 680 pdev = st_get_plat_device(id); 681 if (!pdev) 682 goto err; 683 kim_gdata = platform_get_drvdata(pdev); 684 if (!kim_gdata) 685 goto err; 686 687 *core_data = kim_gdata->core_data; 688 return; 689 err: 690 *core_data = NULL; 691 } 692 693 static int kim_version_open(struct inode *i, struct file *f) 694 { 695 return single_open(f, show_version, i->i_private); 696 } 697 698 static int kim_list_open(struct inode *i, struct file *f) 699 { 700 return single_open(f, show_list, i->i_private); 701 } 702 703 static const struct file_operations version_debugfs_fops = { 704 /* version info */ 705 .open = kim_version_open, 706 .read = seq_read, 707 .llseek = seq_lseek, 708 .release = single_release, 709 }; 710 static const struct file_operations list_debugfs_fops = { 711 /* protocols info */ 712 .open = kim_list_open, 713 .read = seq_read, 714 .llseek = seq_lseek, 715 .release = single_release, 716 }; 717 718 /**********************************************************************/ 719 /* functions called from platform device driver subsystem 720 * need to have a relevant platform device entry in the platform's 721 * board-*.c file 722 */ 723 724 static struct dentry *kim_debugfs_dir; 725 static int kim_probe(struct platform_device *pdev) 726 { 727 struct kim_data_s *kim_gdata; 728 struct ti_st_plat_data *pdata = pdev->dev.platform_data; 729 int err; 730 731 if ((pdev->id != -1) && (pdev->id < MAX_ST_DEVICES)) { 732 /* multiple devices could exist */ 733 st_kim_devices[pdev->id] = pdev; 734 } else { 735 /* platform's sure about existence of 1 device */ 736 st_kim_devices[0] = pdev; 737 } 738 739 kim_gdata = kzalloc(sizeof(struct kim_data_s), GFP_ATOMIC); 740 if (!kim_gdata) { 741 pr_err("no mem to allocate"); 742 return -ENOMEM; 743 } 744 platform_set_drvdata(pdev, kim_gdata); 745 746 err = st_core_init(&kim_gdata->core_data); 747 if (err != 0) { 748 pr_err(" ST core init failed"); 749 err = -EIO; 750 goto err_core_init; 751 } 752 /* refer to itself */ 753 kim_gdata->core_data->kim_data = kim_gdata; 754 755 /* Claim the chip enable nShutdown gpio from the system */ 756 kim_gdata->nshutdown = pdata->nshutdown_gpio; 757 err = gpio_request(kim_gdata->nshutdown, "kim"); 758 if (unlikely(err)) { 759 pr_err(" gpio %d request failed ", kim_gdata->nshutdown); 760 return err; 761 } 762 763 /* Configure nShutdown GPIO as output=0 */ 764 err = gpio_direction_output(kim_gdata->nshutdown, 0); 765 if (unlikely(err)) { 766 pr_err(" unable to configure gpio %d", kim_gdata->nshutdown); 767 return err; 768 } 769 /* get reference of pdev for request_firmware 770 */ 771 kim_gdata->kim_pdev = pdev; 772 init_completion(&kim_gdata->kim_rcvd); 773 init_completion(&kim_gdata->ldisc_installed); 774 775 err = sysfs_create_group(&pdev->dev.kobj, &uim_attr_grp); 776 if (err) { 777 pr_err("failed to create sysfs entries"); 778 goto err_sysfs_group; 779 } 780 781 /* copying platform data */ 782 strncpy(kim_gdata->dev_name, pdata->dev_name, UART_DEV_NAME_LEN); 783 kim_gdata->flow_cntrl = pdata->flow_cntrl; 784 kim_gdata->baud_rate = pdata->baud_rate; 785 pr_info("sysfs entries created\n"); 786 787 kim_debugfs_dir = debugfs_create_dir("ti-st", NULL); 788 if (!kim_debugfs_dir) { 789 pr_err(" debugfs entries creation failed "); 790 return 0; 791 } 792 793 debugfs_create_file("version", S_IRUGO, kim_debugfs_dir, 794 kim_gdata, &version_debugfs_fops); 795 debugfs_create_file("protocols", S_IRUGO, kim_debugfs_dir, 796 kim_gdata, &list_debugfs_fops); 797 return 0; 798 799 err_sysfs_group: 800 st_core_exit(kim_gdata->core_data); 801 802 err_core_init: 803 kfree(kim_gdata); 804 805 return err; 806 } 807 808 static int kim_remove(struct platform_device *pdev) 809 { 810 /* free the GPIOs requested */ 811 struct ti_st_plat_data *pdata = pdev->dev.platform_data; 812 struct kim_data_s *kim_gdata; 813 814 kim_gdata = platform_get_drvdata(pdev); 815 816 /* Free the Bluetooth/FM/GPIO 817 * nShutdown gpio from the system 818 */ 819 gpio_free(pdata->nshutdown_gpio); 820 pr_info("nshutdown GPIO Freed"); 821 822 debugfs_remove_recursive(kim_debugfs_dir); 823 sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp); 824 pr_info("sysfs entries removed"); 825 826 kim_gdata->kim_pdev = NULL; 827 st_core_exit(kim_gdata->core_data); 828 829 kfree(kim_gdata); 830 kim_gdata = NULL; 831 return 0; 832 } 833 834 static int kim_suspend(struct platform_device *pdev, pm_message_t state) 835 { 836 struct ti_st_plat_data *pdata = pdev->dev.platform_data; 837 838 if (pdata->suspend) 839 return pdata->suspend(pdev, state); 840 841 return 0; 842 } 843 844 static int kim_resume(struct platform_device *pdev) 845 { 846 struct ti_st_plat_data *pdata = pdev->dev.platform_data; 847 848 if (pdata->resume) 849 return pdata->resume(pdev); 850 851 return 0; 852 } 853 854 /**********************************************************************/ 855 /* entry point for ST KIM module, called in from ST Core */ 856 static struct platform_driver kim_platform_driver = { 857 .probe = kim_probe, 858 .remove = kim_remove, 859 .suspend = kim_suspend, 860 .resume = kim_resume, 861 .driver = { 862 .name = "kim", 863 }, 864 }; 865 866 module_platform_driver(kim_platform_driver); 867 868 MODULE_AUTHOR("Pavan Savoy <pavan_savoy@ti.com>"); 869 MODULE_DESCRIPTION("Shared Transport Driver for TI BT/FM/GPS combo chips "); 870 MODULE_LICENSE("GPL"); 871