diff options
| -rw-r--r-- | drivers/misc/ti-st/st_kim.c | 12 | ||||
| -rw-r--r-- | drivers/misc/ti-st/st_ll.c | 19 | ||||
| -rw-r--r-- | include/linux/ti_wilink_st.h | 27 |
3 files changed, 57 insertions, 1 deletions
diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c index 38fd2f04c07e..6884dd1c997b 100644 --- a/drivers/misc/ti-st/st_kim.c +++ b/drivers/misc/ti-st/st_kim.c | |||
| @@ -434,11 +434,17 @@ long st_kim_start(void *kim_data) | |||
| 434 | { | 434 | { |
| 435 | long err = 0; | 435 | long err = 0; |
| 436 | long retry = POR_RETRY_COUNT; | 436 | long retry = POR_RETRY_COUNT; |
| 437 | struct ti_st_plat_data *pdata; | ||
| 437 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; | 438 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; |
| 438 | 439 | ||
| 439 | pr_info(" %s", __func__); | 440 | pr_info(" %s", __func__); |
| 441 | pdata = kim_gdata->kim_pdev->dev.platform_data; | ||
| 440 | 442 | ||
| 441 | do { | 443 | do { |
| 444 | /* platform specific enabling code here */ | ||
| 445 | if (pdata->chip_enable) | ||
| 446 | pdata->chip_enable(kim_gdata); | ||
| 447 | |||
| 442 | /* Configure BT nShutdown to HIGH state */ | 448 | /* Configure BT nShutdown to HIGH state */ |
| 443 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); | 449 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); |
| 444 | mdelay(5); /* FIXME: a proper toggle */ | 450 | mdelay(5); /* FIXME: a proper toggle */ |
| @@ -489,6 +495,8 @@ long st_kim_stop(void *kim_data) | |||
| 489 | { | 495 | { |
| 490 | long err = 0; | 496 | long err = 0; |
| 491 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; | 497 | struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data; |
| 498 | struct ti_st_plat_data *pdata = | ||
| 499 | kim_gdata->kim_pdev->dev.platform_data; | ||
| 492 | 500 | ||
| 493 | INIT_COMPLETION(kim_gdata->ldisc_installed); | 501 | INIT_COMPLETION(kim_gdata->ldisc_installed); |
| 494 | 502 | ||
| @@ -515,6 +523,10 @@ long st_kim_stop(void *kim_data) | |||
| 515 | gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH); | 523 | gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH); |
| 516 | mdelay(1); | 524 | mdelay(1); |
| 517 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); | 525 | gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); |
| 526 | |||
| 527 | /* platform specific disable */ | ||
| 528 | if (pdata->chip_disable) | ||
| 529 | pdata->chip_disable(kim_gdata); | ||
| 518 | return err; | 530 | return err; |
| 519 | } | 531 | } |
| 520 | 532 | ||
diff --git a/drivers/misc/ti-st/st_ll.c b/drivers/misc/ti-st/st_ll.c index 3f2495138855..1ff460a8e9c7 100644 --- a/drivers/misc/ti-st/st_ll.c +++ b/drivers/misc/ti-st/st_ll.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #define pr_fmt(fmt) "(stll) :" fmt | 22 | #define pr_fmt(fmt) "(stll) :" fmt |
| 23 | #include <linux/skbuff.h> | 23 | #include <linux/skbuff.h> |
| 24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| 25 | #include <linux/platform_device.h> | ||
| 25 | #include <linux/ti_wilink_st.h> | 26 | #include <linux/ti_wilink_st.h> |
| 26 | 27 | ||
| 27 | /**********************************************************************/ | 28 | /**********************************************************************/ |
| @@ -37,6 +38,9 @@ static void send_ll_cmd(struct st_data_s *st_data, | |||
| 37 | 38 | ||
| 38 | static void ll_device_want_to_sleep(struct st_data_s *st_data) | 39 | static void ll_device_want_to_sleep(struct st_data_s *st_data) |
| 39 | { | 40 | { |
| 41 | struct kim_data_s *kim_data; | ||
| 42 | struct ti_st_plat_data *pdata; | ||
| 43 | |||
| 40 | pr_debug("%s", __func__); | 44 | pr_debug("%s", __func__); |
| 41 | /* sanity check */ | 45 | /* sanity check */ |
| 42 | if (st_data->ll_state != ST_LL_AWAKE) | 46 | if (st_data->ll_state != ST_LL_AWAKE) |
| @@ -46,10 +50,19 @@ static void ll_device_want_to_sleep(struct st_data_s *st_data) | |||
| 46 | send_ll_cmd(st_data, LL_SLEEP_ACK); | 50 | send_ll_cmd(st_data, LL_SLEEP_ACK); |
| 47 | /* update state */ | 51 | /* update state */ |
| 48 | st_data->ll_state = ST_LL_ASLEEP; | 52 | st_data->ll_state = ST_LL_ASLEEP; |
| 53 | |||
| 54 | /* communicate to platform about chip asleep */ | ||
| 55 | kim_data = st_data->kim_data; | ||
| 56 | pdata = kim_data->kim_pdev->dev.platform_data; | ||
| 57 | if (pdata->chip_asleep) | ||
| 58 | pdata->chip_asleep(NULL); | ||
| 49 | } | 59 | } |
| 50 | 60 | ||
| 51 | static void ll_device_want_to_wakeup(struct st_data_s *st_data) | 61 | static void ll_device_want_to_wakeup(struct st_data_s *st_data) |
| 52 | { | 62 | { |
| 63 | struct kim_data_s *kim_data; | ||
| 64 | struct ti_st_plat_data *pdata; | ||
| 65 | |||
| 53 | /* diff actions in diff states */ | 66 | /* diff actions in diff states */ |
| 54 | switch (st_data->ll_state) { | 67 | switch (st_data->ll_state) { |
| 55 | case ST_LL_ASLEEP: | 68 | case ST_LL_ASLEEP: |
| @@ -70,6 +83,12 @@ static void ll_device_want_to_wakeup(struct st_data_s *st_data) | |||
| 70 | } | 83 | } |
| 71 | /* update state */ | 84 | /* update state */ |
| 72 | st_data->ll_state = ST_LL_AWAKE; | 85 | st_data->ll_state = ST_LL_AWAKE; |
| 86 | |||
| 87 | /* communicate to platform about chip wakeup */ | ||
| 88 | kim_data = st_data->kim_data; | ||
| 89 | pdata = kim_data->kim_pdev->dev.platform_data; | ||
| 90 | if (pdata->chip_asleep) | ||
| 91 | pdata->chip_awake(NULL); | ||
| 73 | } | 92 | } |
| 74 | 93 | ||
| 75 | /**********************************************************************/ | 94 | /**********************************************************************/ |
diff --git a/include/linux/ti_wilink_st.h b/include/linux/ti_wilink_st.h index b004e557caa9..2ef4385da6bf 100644 --- a/include/linux/ti_wilink_st.h +++ b/include/linux/ti_wilink_st.h | |||
| @@ -410,7 +410,28 @@ struct gps_event_hdr { | |||
| 410 | u16 plen; | 410 | u16 plen; |
| 411 | } __attribute__ ((packed)); | 411 | } __attribute__ ((packed)); |
| 412 | 412 | ||
| 413 | /* platform data */ | 413 | /** |
| 414 | * struct ti_st_plat_data - platform data shared between ST driver and | ||
| 415 | * platform specific board file which adds the ST device. | ||
| 416 | * @nshutdown_gpio: Host's GPIO line to which chip's BT_EN is connected. | ||
| 417 | * @dev_name: The UART/TTY name to which chip is interfaced. (eg: /dev/ttyS1) | ||
| 418 | * @flow_cntrl: Should always be 1, since UART's CTS/RTS is used for PM | ||
| 419 | * purposes. | ||
| 420 | * @baud_rate: The baud rate supported by the Host UART controller, this will | ||
| 421 | * be shared across with the chip via a HCI VS command from User-Space Init | ||
| 422 | * Mgr application. | ||
| 423 | * @suspend: | ||
| 424 | * @resume: legacy PM routines hooked to platform specific board file, so as | ||
| 425 | * to take chip-host interface specific action. | ||
| 426 | * @chip_enable: | ||
| 427 | * @chip_disable: Platform/Interface specific mux mode setting, GPIO | ||
| 428 | * configuring, Host side PM disabling etc.. can be done here. | ||
| 429 | * @chip_asleep: | ||
| 430 | * @chip_awake: Chip specific deep sleep states is communicated to Host | ||
| 431 | * specific board-xx.c to take actions such as cut UART clocks when chip | ||
| 432 | * asleep or run host faster when chip awake etc.. | ||
| 433 | * | ||
| 434 | */ | ||
| 414 | struct ti_st_plat_data { | 435 | struct ti_st_plat_data { |
| 415 | long nshutdown_gpio; | 436 | long nshutdown_gpio; |
| 416 | unsigned char dev_name[UART_DEV_NAME_LEN]; /* uart name */ | 437 | unsigned char dev_name[UART_DEV_NAME_LEN]; /* uart name */ |
| @@ -418,6 +439,10 @@ struct ti_st_plat_data { | |||
| 418 | unsigned long baud_rate; | 439 | unsigned long baud_rate; |
| 419 | int (*suspend)(struct platform_device *, pm_message_t); | 440 | int (*suspend)(struct platform_device *, pm_message_t); |
| 420 | int (*resume)(struct platform_device *); | 441 | int (*resume)(struct platform_device *); |
| 442 | int (*chip_enable) (struct kim_data_s *); | ||
| 443 | int (*chip_disable) (struct kim_data_s *); | ||
| 444 | int (*chip_asleep) (struct kim_data_s *); | ||
| 445 | int (*chip_awake) (struct kim_data_s *); | ||
| 421 | }; | 446 | }; |
| 422 | 447 | ||
| 423 | #endif /* TI_WILINK_ST_H */ | 448 | #endif /* TI_WILINK_ST_H */ |
