diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-23 23:10:48 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-23 23:10:48 -0500 |
| commit | ae763db4ce0300ccd844435c93c6c06bb6549560 (patch) | |
| tree | 2c53aa658004e1fb473ff6f71e1db942a820850e /drivers | |
| parent | 6f48ea58dd039aa8627d378284031a8df8826dc9 (diff) | |
| parent | a7e2ca17039edb5f782be519eaf9d8ea500ba7cc (diff) | |
Merge tag 'char-misc-3.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull drivers/misc fix from Greg Kroah-Hartman:
"Here is a single revert for the ti-st misc driver, fixing problem that
was introduced in 3.7-rc1 that has been bothering people."
* tag 'char-misc-3.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
Revert "drivers/misc/ti-st: remove gpio handling"
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/misc/ti-st/st_kim.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c index 9ff942a346ed..83269f1d16e3 100644 --- a/drivers/misc/ti-st/st_kim.c +++ b/drivers/misc/ti-st/st_kim.c | |||
| @@ -468,6 +468,11 @@ long st_kim_start(void *kim_data) | |||
| 468 | if (pdata->chip_enable) | 468 | if (pdata->chip_enable) |
| 469 | pdata->chip_enable(kim_gdata); | 469 | pdata->chip_enable(kim_gdata); |
| 470 | 470 | ||
| 471 | /* Configure BT nShutdown to HIGH state */ | ||
| 472 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); | ||
| 473 | mdelay(5); /* FIXME: a proper toggle */ | ||
| 474 | gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH); | ||
| 475 | mdelay(100); | ||
| 471 | /* re-initialize the completion */ | 476 | /* re-initialize the completion */ |
| 472 | INIT_COMPLETION(kim_gdata->ldisc_installed); | 477 | INIT_COMPLETION(kim_gdata->ldisc_installed); |
| 473 | /* send notification to UIM */ | 478 | /* send notification to UIM */ |
| @@ -509,7 +514,8 @@ long st_kim_start(void *kim_data) | |||
| 509 | * (b) upon failure to either install ldisc or download firmware. | 514 | * (b) upon failure to either install ldisc or download firmware. |
| 510 | * The function is responsible to (a) notify UIM about un-installation, | 515 | * The function is responsible to (a) notify UIM about un-installation, |
| 511 | * (b) flush UART if the ldisc was installed. | 516 | * (b) flush UART if the ldisc was installed. |
| 512 | * (c) invoke platform's chip disabling routine. | 517 | * (c) reset BT_EN - pull down nshutdown at the end. |
| 518 | * (d) invoke platform's chip disabling routine. | ||
| 513 | */ | 519 | */ |
| 514 | long st_kim_stop(void *kim_data) | 520 | long st_kim_stop(void *kim_data) |
| 515 | { | 521 | { |
| @@ -541,6 +547,13 @@ long st_kim_stop(void *kim_data) | |||
| 541 | err = -ETIMEDOUT; | 547 | err = -ETIMEDOUT; |
| 542 | } | 548 | } |
| 543 | 549 | ||
| 550 | /* By default configure BT nShutdown to LOW state */ | ||
| 551 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); | ||
| 552 | mdelay(1); | ||
| 553 | gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH); | ||
| 554 | mdelay(1); | ||
| 555 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); | ||
| 556 | |||
| 544 | /* platform specific disable */ | 557 | /* platform specific disable */ |
| 545 | if (pdata->chip_disable) | 558 | if (pdata->chip_disable) |
| 546 | pdata->chip_disable(kim_gdata); | 559 | pdata->chip_disable(kim_gdata); |
| @@ -733,6 +746,20 @@ static int kim_probe(struct platform_device *pdev) | |||
| 733 | /* refer to itself */ | 746 | /* refer to itself */ |
| 734 | kim_gdata->core_data->kim_data = kim_gdata; | 747 | kim_gdata->core_data->kim_data = kim_gdata; |
| 735 | 748 | ||
| 749 | /* Claim the chip enable nShutdown gpio from the system */ | ||
| 750 | kim_gdata->nshutdown = pdata->nshutdown_gpio; | ||
| 751 | err = gpio_request(kim_gdata->nshutdown, "kim"); | ||
| 752 | if (unlikely(err)) { | ||
| 753 | pr_err(" gpio %ld request failed ", kim_gdata->nshutdown); | ||
| 754 | return err; | ||
| 755 | } | ||
| 756 | |||
| 757 | /* Configure nShutdown GPIO as output=0 */ | ||
| 758 | err = gpio_direction_output(kim_gdata->nshutdown, 0); | ||
| 759 | if (unlikely(err)) { | ||
| 760 | pr_err(" unable to configure gpio %ld", kim_gdata->nshutdown); | ||
| 761 | return err; | ||
| 762 | } | ||
| 736 | /* get reference of pdev for request_firmware | 763 | /* get reference of pdev for request_firmware |
| 737 | */ | 764 | */ |
| 738 | kim_gdata->kim_pdev = pdev; | 765 | kim_gdata->kim_pdev = pdev; |
| @@ -779,10 +806,18 @@ err_core_init: | |||
| 779 | 806 | ||
| 780 | static int kim_remove(struct platform_device *pdev) | 807 | static int kim_remove(struct platform_device *pdev) |
| 781 | { | 808 | { |
| 809 | /* free the GPIOs requested */ | ||
| 810 | struct ti_st_plat_data *pdata = pdev->dev.platform_data; | ||
| 782 | struct kim_data_s *kim_gdata; | 811 | struct kim_data_s *kim_gdata; |
| 783 | 812 | ||
| 784 | kim_gdata = dev_get_drvdata(&pdev->dev); | 813 | kim_gdata = dev_get_drvdata(&pdev->dev); |
| 785 | 814 | ||
| 815 | /* Free the Bluetooth/FM/GPIO | ||
| 816 | * nShutdown gpio from the system | ||
| 817 | */ | ||
| 818 | gpio_free(pdata->nshutdown_gpio); | ||
| 819 | pr_info("nshutdown GPIO Freed"); | ||
| 820 | |||
| 786 | debugfs_remove_recursive(kim_debugfs_dir); | 821 | debugfs_remove_recursive(kim_debugfs_dir); |
| 787 | sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp); | 822 | sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp); |
| 788 | pr_info("sysfs entries removed"); | 823 | pr_info("sysfs entries removed"); |
