.. | .. |
---|
227 | 227 | { |
---|
228 | 228 | struct rfkill_rk_data *rfkill = g_rfkill; |
---|
229 | 229 | struct rfkill_rk_gpio *wake; |
---|
230 | | - bool ret; |
---|
231 | 230 | |
---|
232 | 231 | DBG("Enter %s\n", __func__); |
---|
233 | 232 | |
---|
.. | .. |
---|
242 | 241 | return; |
---|
243 | 242 | } |
---|
244 | 243 | |
---|
245 | | - ret = cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); |
---|
| 244 | + cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); |
---|
246 | 245 | |
---|
247 | 246 | rfkill_rk_sleep_bt_internal(rfkill, sleep); |
---|
248 | 247 | |
---|
.. | .. |
---|
271 | 270 | |
---|
272 | 271 | return 0; |
---|
273 | 272 | } |
---|
274 | | -static int proc_rk_set_power(void *data, bool blocked) |
---|
| 273 | + |
---|
| 274 | +static int rfkill_rk_set_power(void *data, bool blocked) |
---|
275 | 275 | { |
---|
276 | 276 | struct rfkill_rk_data *rfkill = data; |
---|
277 | 277 | struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; |
---|
.. | .. |
---|
313 | 313 | gpio_direction_output(poweron->io, |
---|
314 | 314 | poweron->enable); |
---|
315 | 315 | msleep(20); |
---|
316 | | - if (gpio_is_valid(wake_host->io)) |
---|
317 | | - gpio_direction_input(wake_host->io); |
---|
318 | 316 | } |
---|
319 | 317 | } |
---|
320 | 318 | |
---|
.. | .. |
---|
325 | 323 | msleep(20); |
---|
326 | 324 | gpio_direction_output(reset->io, reset->enable); |
---|
327 | 325 | } |
---|
| 326 | + } |
---|
| 327 | + |
---|
| 328 | + if (gpio_is_valid(wake_host->io)) { |
---|
| 329 | + LOG("%s: set bt wake_host input!\n", __func__); |
---|
| 330 | + gpio_direction_input(wake_host->io); |
---|
328 | 331 | } |
---|
329 | 332 | |
---|
330 | 333 | if (pinctrl && gpio_is_valid(rts->io)) { |
---|
.. | .. |
---|
375 | 378 | return 0; |
---|
376 | 379 | } |
---|
377 | 380 | |
---|
378 | | - |
---|
379 | | -static int rfkill_rk_set_power(void *data, bool blocked) |
---|
380 | | -{ |
---|
381 | | - struct rfkill_rk_data *rfkill = data; |
---|
382 | | - struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; |
---|
383 | | - struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio; |
---|
384 | | - struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio; |
---|
385 | | - struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio; |
---|
386 | | - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; |
---|
387 | | - int wifi_power = 0; |
---|
388 | | - bool toggle = false; |
---|
389 | | - |
---|
390 | | - DBG("Enter %s\n", __func__); |
---|
391 | | - |
---|
392 | | - DBG("Set blocked:%d\n", blocked); |
---|
393 | | - |
---|
394 | | - toggle = rfkill->pdata->power_toggle; |
---|
395 | | - |
---|
396 | | - if (toggle) { |
---|
397 | | - if (rfkill_get_wifi_power_state(&wifi_power)) { |
---|
398 | | - LOG("%s: cannot get wifi power state!\n", __func__); |
---|
399 | | - return -1; |
---|
400 | | - } |
---|
401 | | - } |
---|
402 | | - |
---|
403 | | - DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false"); |
---|
404 | | - |
---|
405 | | - if (!blocked) { |
---|
406 | | - if (toggle) { |
---|
407 | | - rfkill_set_wifi_bt_power(1); |
---|
408 | | - msleep(100); |
---|
409 | | - } |
---|
410 | | - |
---|
411 | | - rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup |
---|
412 | | - |
---|
413 | | - if (gpio_is_valid(wake_host->io)) { |
---|
414 | | - LOG("%s: set bt wake_host high!\n", __func__); |
---|
415 | | - gpio_direction_output(wake_host->io, 1); |
---|
416 | | - msleep(20); |
---|
417 | | - } |
---|
418 | | - |
---|
419 | | - if (gpio_is_valid(poweron->io)) { |
---|
420 | | - if (gpio_get_value(poweron->io) == !poweron->enable) { |
---|
421 | | - gpio_direction_output(poweron->io, |
---|
422 | | - !poweron->enable); |
---|
423 | | - msleep(20); |
---|
424 | | - gpio_direction_output(poweron->io, |
---|
425 | | - poweron->enable); |
---|
426 | | - msleep(20); |
---|
427 | | - if (gpio_is_valid(wake_host->io)) |
---|
428 | | - gpio_direction_input(wake_host->io); |
---|
429 | | - } |
---|
430 | | - } |
---|
431 | | - |
---|
432 | | - if (gpio_is_valid(reset->io)) { |
---|
433 | | - if (gpio_get_value(reset->io) == !reset->enable) { |
---|
434 | | - gpio_direction_output(reset->io, |
---|
435 | | - !reset->enable); |
---|
436 | | - msleep(20); |
---|
437 | | - gpio_direction_output(reset->io, reset->enable); |
---|
438 | | - } |
---|
439 | | - } |
---|
440 | | - |
---|
441 | | - if (pinctrl && gpio_is_valid(rts->io)) { |
---|
442 | | - pinctrl_select_state(pinctrl, rts->gpio_state); |
---|
443 | | - LOG("ENABLE UART_RTS\n"); |
---|
444 | | - gpio_direction_output(rts->io, rts->enable); |
---|
445 | | - msleep(100); |
---|
446 | | - LOG("DISABLE UART_RTS\n"); |
---|
447 | | - gpio_direction_output(rts->io, !rts->enable); |
---|
448 | | - pinctrl_select_state(pinctrl, rts->default_state); |
---|
449 | | - } |
---|
450 | | - |
---|
451 | | - bt_power_state = 1; |
---|
452 | | - LOG("bt turn on power\n"); |
---|
453 | | - rfkill_rk_setup_wake_irq(rfkill, 1); |
---|
454 | | - } else { |
---|
455 | | - if (gpio_is_valid(poweron->io)) { |
---|
456 | | - if (gpio_get_value(poweron->io) == poweron->enable) { |
---|
457 | | - gpio_direction_output(poweron->io, |
---|
458 | | - poweron->enable); |
---|
459 | | - msleep(20); |
---|
460 | | - } |
---|
461 | | - } |
---|
462 | | - |
---|
463 | | - bt_power_state = 0; |
---|
464 | | - LOG("bt shut off power\n"); |
---|
465 | | - if (gpio_is_valid(reset->io)) { |
---|
466 | | - if (gpio_get_value(reset->io) == reset->enable) { |
---|
467 | | - gpio_direction_output(reset->io, |
---|
468 | | - reset->enable); |
---|
469 | | - msleep(20); |
---|
470 | | - } |
---|
471 | | - } |
---|
472 | | - if (toggle) { |
---|
473 | | - if (!wifi_power) { |
---|
474 | | - LOG("%s: bt will set vbat to low\n", __func__); |
---|
475 | | - rfkill_set_wifi_bt_power(0); |
---|
476 | | - } else { |
---|
477 | | - LOG("%s: bt shouldn't control the vbat\n", __func__); |
---|
478 | | - } |
---|
479 | | - } |
---|
480 | | - } |
---|
481 | | - |
---|
482 | | - return 0; |
---|
483 | | -} |
---|
484 | | - |
---|
485 | 381 | static int rfkill_rk_pm_prepare(struct device *dev) |
---|
486 | 382 | { |
---|
487 | 383 | struct rfkill_rk_data *rfkill = g_rfkill; |
---|
488 | 384 | struct rfkill_rk_gpio *rts; |
---|
489 | 385 | struct rfkill_rk_irq *wake_host_irq; |
---|
490 | | - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; |
---|
491 | 386 | |
---|
492 | 387 | DBG("Enter %s\n", __func__); |
---|
493 | 388 | |
---|
.. | .. |
---|
498 | 393 | wake_host_irq = &rfkill->pdata->wake_host_irq; |
---|
499 | 394 | |
---|
500 | 395 | //To prevent uart to receive bt data when suspended |
---|
501 | | - if (pinctrl && gpio_is_valid(rts->io)) { |
---|
| 396 | + if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { |
---|
502 | 397 | DBG("Disable UART_RTS\n"); |
---|
503 | | - pinctrl_select_state(pinctrl, rts->gpio_state); |
---|
| 398 | + pinctrl_select_state(rfkill->pdata->pinctrl, rts->gpio_state); |
---|
504 | 399 | gpio_direction_output(rts->io, !rts->enable); |
---|
505 | 400 | } |
---|
506 | 401 | |
---|
.. | .. |
---|
516 | 411 | } |
---|
517 | 412 | |
---|
518 | 413 | #ifdef CONFIG_RFKILL_RESET |
---|
519 | | - rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); |
---|
| 414 | + rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
---|
| 415 | + rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
---|
| 416 | + rfkill_set_hw_state(rfkill->rfkill_dev, false); |
---|
520 | 417 | rfkill_rk_set_power(rfkill, BT_BLOCKED); |
---|
521 | 418 | #endif |
---|
522 | 419 | |
---|
.. | .. |
---|
528 | 425 | struct rfkill_rk_data *rfkill = g_rfkill; |
---|
529 | 426 | struct rfkill_rk_irq *wake_host_irq; |
---|
530 | 427 | struct rfkill_rk_gpio *rts; |
---|
531 | | - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; |
---|
532 | 428 | |
---|
533 | 429 | DBG("Enter %s\n", __func__); |
---|
534 | 430 | |
---|
.. | .. |
---|
544 | 440 | disable_irq_wake(wake_host_irq->irq); |
---|
545 | 441 | } |
---|
546 | 442 | |
---|
547 | | - if (pinctrl && gpio_is_valid(rts->io)) { |
---|
| 443 | + if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { |
---|
548 | 444 | DBG("Enable UART_RTS\n"); |
---|
549 | 445 | gpio_direction_output(rts->io, rts->enable); |
---|
550 | | - pinctrl_select_state(pinctrl, rts->default_state); |
---|
| 446 | + pinctrl_select_state(rfkill->pdata->pinctrl, rts->default_state); |
---|
551 | 447 | } |
---|
552 | 448 | } |
---|
553 | 449 | |
---|
.. | .. |
---|
594 | 490 | DBG("btwrite %c\n", b); |
---|
595 | 491 | /* HCI_DEV_WRITE */ |
---|
596 | 492 | if (b != '0') |
---|
597 | | - proc_rk_set_power(g_rfkill, 0); |
---|
| 493 | + rfkill_rk_sleep_bt(BT_WAKEUP); |
---|
598 | 494 | else |
---|
599 | | - proc_rk_set_power(g_rfkill, 1); |
---|
| 495 | + rfkill_rk_sleep_bt(BT_SLEEP); |
---|
600 | 496 | |
---|
601 | 497 | return count; |
---|
602 | 498 | } |
---|
.. | .. |
---|
688 | 584 | } |
---|
689 | 585 | #endif //CONFIG_OF |
---|
690 | 586 | |
---|
691 | | -static const struct file_operations bluesleep_lpm = { |
---|
692 | | - .owner = THIS_MODULE, |
---|
693 | | - .read = bluesleep_read_proc_lpm, |
---|
694 | | - .write = bluesleep_write_proc_lpm, |
---|
| 587 | +static const struct proc_ops bluesleep_lpm = { |
---|
| 588 | + .proc_read = bluesleep_read_proc_lpm, |
---|
| 589 | + .proc_write = bluesleep_write_proc_lpm, |
---|
695 | 590 | }; |
---|
696 | 591 | |
---|
697 | | -static const struct file_operations bluesleep_btwrite = { |
---|
698 | | - .owner = THIS_MODULE, |
---|
699 | | - .read = bluesleep_read_proc_btwrite, |
---|
700 | | - .write = bluesleep_write_proc_btwrite, |
---|
| 592 | +static const struct proc_ops bluesleep_btwrite = { |
---|
| 593 | + .proc_read = bluesleep_read_proc_btwrite, |
---|
| 594 | + .proc_write = bluesleep_write_proc_btwrite, |
---|
701 | 595 | }; |
---|
702 | 596 | |
---|
703 | 597 | static int rfkill_rk_probe(struct platform_device *pdev) |
---|
.. | .. |
---|
751 | 645 | } |
---|
752 | 646 | |
---|
753 | 647 | /* read/write proc entries */ |
---|
754 | | - ent = proc_create("lpm", 0, sleep_dir, &bluesleep_lpm); |
---|
| 648 | + ent = proc_create("lpm", 0444, sleep_dir, &bluesleep_lpm); |
---|
755 | 649 | if (!ent) { |
---|
756 | 650 | LOG("Unable to create /proc/%s/lpm entry", PROC_DIR); |
---|
757 | 651 | ret = -ENOMEM; |
---|
.. | .. |
---|
759 | 653 | } |
---|
760 | 654 | |
---|
761 | 655 | /* read/write proc entries */ |
---|
762 | | - ent = proc_create("btwrite", 0, sleep_dir, &bluesleep_btwrite); |
---|
| 656 | + ent = proc_create("btwrite", 0444, sleep_dir, &bluesleep_btwrite); |
---|
763 | 657 | if (!ent) { |
---|
764 | 658 | LOG("Unable to create /proc/%s/btwrite entry", PROC_DIR); |
---|
765 | 659 | ret = -ENOMEM; |
---|
.. | .. |
---|
801 | 695 | if (!rfkill->rfkill_dev) |
---|
802 | 696 | goto fail_alloc; |
---|
803 | 697 | |
---|
804 | | - rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); |
---|
| 698 | + rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
---|
| 699 | + rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
---|
| 700 | + rfkill_set_hw_state(rfkill->rfkill_dev, false); |
---|
805 | 701 | ret = rfkill_register(rfkill->rfkill_dev); |
---|
806 | 702 | if (ret < 0) |
---|
807 | 703 | goto fail_rfkill; |
---|