diff options
author | Jens Axboe <axboe@kernel.dk> | 2011-10-19 08:30:42 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2011-10-19 08:30:42 -0400 |
commit | 5c04b426f2e8b46cfc7969a35b2631063a3c646c (patch) | |
tree | 2d27d9f5d2fe5d5e8fbc01a467ec58bcb50235c1 /drivers/misc/ti-st/st_kim.c | |
parent | 499337bb6511e665a236a6a947f819d98ea340c6 (diff) | |
parent | 899e3ee404961a90b828ad527573aaaac39f0ab1 (diff) |
Merge branch 'v3.1-rc10' into for-3.2/core
Conflicts:
block/blk-core.c
include/linux/blkdev.h
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/misc/ti-st/st_kim.c')
-rw-r--r-- | drivers/misc/ti-st/st_kim.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c index 38fd2f04c07e..3a3580566dfc 100644 --- a/drivers/misc/ti-st/st_kim.c +++ b/drivers/misc/ti-st/st_kim.c | |||
@@ -68,6 +68,7 @@ void validate_firmware_response(struct kim_data_s *kim_gdata) | |||
68 | if (unlikely(skb->data[5] != 0)) { | 68 | if (unlikely(skb->data[5] != 0)) { |
69 | pr_err("no proper response during fw download"); | 69 | pr_err("no proper response during fw download"); |
70 | pr_err("data6 %x", skb->data[5]); | 70 | pr_err("data6 %x", skb->data[5]); |
71 | kfree_skb(skb); | ||
71 | return; /* keep waiting for the proper response */ | 72 | return; /* keep waiting for the proper response */ |
72 | } | 73 | } |
73 | /* becos of all the script being downloaded */ | 74 | /* becos of all the script being downloaded */ |
@@ -210,6 +211,7 @@ static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name) | |||
210 | pr_err(" waiting for ver info- timed out "); | 211 | pr_err(" waiting for ver info- timed out "); |
211 | return -ETIMEDOUT; | 212 | return -ETIMEDOUT; |
212 | } | 213 | } |
214 | INIT_COMPLETION(kim_gdata->kim_rcvd); | ||
213 | 215 | ||
214 | version = | 216 | version = |
215 | MAKEWORD(kim_gdata->resp_buffer[13], | 217 | MAKEWORD(kim_gdata->resp_buffer[13], |
@@ -298,6 +300,7 @@ static long download_firmware(struct kim_data_s *kim_gdata) | |||
298 | 300 | ||
299 | switch (((struct bts_action *)ptr)->type) { | 301 | switch (((struct bts_action *)ptr)->type) { |
300 | case ACTION_SEND_COMMAND: /* action send */ | 302 | case ACTION_SEND_COMMAND: /* action send */ |
303 | pr_debug("S"); | ||
301 | action_ptr = &(((struct bts_action *)ptr)->data[0]); | 304 | action_ptr = &(((struct bts_action *)ptr)->data[0]); |
302 | if (unlikely | 305 | if (unlikely |
303 | (((struct hci_command *)action_ptr)->opcode == | 306 | (((struct hci_command *)action_ptr)->opcode == |
@@ -335,6 +338,10 @@ static long download_firmware(struct kim_data_s *kim_gdata) | |||
335 | release_firmware(kim_gdata->fw_entry); | 338 | release_firmware(kim_gdata->fw_entry); |
336 | return -ETIMEDOUT; | 339 | return -ETIMEDOUT; |
337 | } | 340 | } |
341 | /* reinit completion before sending for the | ||
342 | * relevant wait | ||
343 | */ | ||
344 | INIT_COMPLETION(kim_gdata->kim_rcvd); | ||
338 | 345 | ||
339 | /* | 346 | /* |
340 | * Free space found in uart buffer, call st_int_write | 347 | * Free space found in uart buffer, call st_int_write |
@@ -361,6 +368,7 @@ static long download_firmware(struct kim_data_s *kim_gdata) | |||
361 | } | 368 | } |
362 | break; | 369 | break; |
363 | case ACTION_WAIT_EVENT: /* wait */ | 370 | case ACTION_WAIT_EVENT: /* wait */ |
371 | pr_debug("W"); | ||
364 | if (!wait_for_completion_timeout | 372 | if (!wait_for_completion_timeout |
365 | (&kim_gdata->kim_rcvd, | 373 | (&kim_gdata->kim_rcvd, |
366 | msecs_to_jiffies(CMD_RESP_TIME))) { | 374 | msecs_to_jiffies(CMD_RESP_TIME))) { |
@@ -434,11 +442,17 @@ long st_kim_start(void *kim_data) | |||
434 | { | 442 | { |
435 | long err = 0; | 443 | long err = 0; |
436 | long retry = POR_RETRY_COUNT; | 444 | long retry = POR_RETRY_COUNT; |
445 | struct ti_st_plat_data *pdata; | ||
437 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; | 446 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; |
438 | 447 | ||
439 | pr_info(" %s", __func__); | 448 | pr_info(" %s", __func__); |
449 | pdata = kim_gdata->kim_pdev->dev.platform_data; | ||
440 | 450 | ||
441 | do { | 451 | do { |
452 | /* platform specific enabling code here */ | ||
453 | if (pdata->chip_enable) | ||
454 | pdata->chip_enable(kim_gdata); | ||
455 | |||
442 | /* Configure BT nShutdown to HIGH state */ | 456 | /* Configure BT nShutdown to HIGH state */ |
443 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); | 457 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); |
444 | mdelay(5); /* FIXME: a proper toggle */ | 458 | mdelay(5); /* FIXME: a proper toggle */ |
@@ -460,6 +474,12 @@ long st_kim_start(void *kim_data) | |||
460 | pr_info("ldisc_install = 0"); | 474 | pr_info("ldisc_install = 0"); |
461 | sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, | 475 | sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, |
462 | NULL, "install"); | 476 | NULL, "install"); |
477 | /* the following wait is never going to be completed, | ||
478 | * since the ldisc was never installed, hence serving | ||
479 | * as a mdelay of LDISC_TIME msecs */ | ||
480 | err = wait_for_completion_timeout | ||
481 | (&kim_gdata->ldisc_installed, | ||
482 | msecs_to_jiffies(LDISC_TIME)); | ||
463 | err = -ETIMEDOUT; | 483 | err = -ETIMEDOUT; |
464 | continue; | 484 | continue; |
465 | } else { | 485 | } else { |
@@ -472,6 +492,13 @@ long st_kim_start(void *kim_data) | |||
472 | pr_info("ldisc_install = 0"); | 492 | pr_info("ldisc_install = 0"); |
473 | sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, | 493 | sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, |
474 | NULL, "install"); | 494 | NULL, "install"); |
495 | /* this wait might be completed, though in the | ||
496 | * tty_close() since the ldisc is already | ||
497 | * installed */ | ||
498 | err = wait_for_completion_timeout | ||
499 | (&kim_gdata->ldisc_installed, | ||
500 | msecs_to_jiffies(LDISC_TIME)); | ||
501 | err = -EINVAL; | ||
475 | continue; | 502 | continue; |
476 | } else { /* on success don't retry */ | 503 | } else { /* on success don't retry */ |
477 | break; | 504 | break; |
@@ -489,6 +516,8 @@ long st_kim_stop(void *kim_data) | |||
489 | { | 516 | { |
490 | long err = 0; | 517 | long err = 0; |
491 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; | 518 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; |
519 | struct ti_st_plat_data *pdata = | ||
520 | kim_gdata->kim_pdev->dev.platform_data; | ||
492 | 521 | ||
493 | INIT_COMPLETION(kim_gdata->ldisc_installed); | 522 | INIT_COMPLETION(kim_gdata->ldisc_installed); |
494 | 523 | ||
@@ -515,6 +544,10 @@ long st_kim_stop(void *kim_data) | |||
515 | gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH); | 544 | gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH); |
516 | mdelay(1); | 545 | mdelay(1); |
517 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); | 546 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); |
547 | |||
548 | /* platform specific disable */ | ||
549 | if (pdata->chip_disable) | ||
550 | pdata->chip_disable(kim_gdata); | ||
518 | return err; | 551 | return err; |
519 | } | 552 | } |
520 | 553 | ||