| .. | .. |
|---|
| 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; |
|---|