| .. | .. |
|---|
| 175 | 175 | rfkill->irq_req = 1; |
|---|
| 176 | 176 | LOG("** disable irq\n"); |
|---|
| 177 | 177 | disable_irq(irq->irq); |
|---|
| 178 | | - /*ret = disable_irq_wake(irq->irq);init irq wake is disabled,no need to disable*/ |
|---|
| 178 | + ret = enable_irq_wake(irq->irq); |
|---|
| 179 | + if (ret) |
|---|
| 180 | + goto fail3; |
|---|
| 179 | 181 | } |
|---|
| 180 | 182 | |
|---|
| 181 | 183 | return ret; |
|---|
| 182 | 184 | |
|---|
| 185 | +fail3: |
|---|
| 186 | + free_irq(irq->irq, rfkill); |
|---|
| 183 | 187 | fail2: |
|---|
| 184 | 188 | gpio_free(irq->gpio.io); |
|---|
| 185 | 189 | fail1: |
|---|
| .. | .. |
|---|
| 227 | 231 | { |
|---|
| 228 | 232 | struct rfkill_rk_data *rfkill = g_rfkill; |
|---|
| 229 | 233 | struct rfkill_rk_gpio *wake; |
|---|
| 230 | | - bool ret; |
|---|
| 231 | 234 | |
|---|
| 232 | 235 | DBG("Enter %s\n", __func__); |
|---|
| 233 | 236 | |
|---|
| .. | .. |
|---|
| 242 | 245 | return; |
|---|
| 243 | 246 | } |
|---|
| 244 | 247 | |
|---|
| 245 | | - ret = cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); |
|---|
| 248 | + cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); |
|---|
| 246 | 249 | |
|---|
| 247 | 250 | rfkill_rk_sleep_bt_internal(rfkill, sleep); |
|---|
| 248 | 251 | |
|---|
| .. | .. |
|---|
| 271 | 274 | |
|---|
| 272 | 275 | return 0; |
|---|
| 273 | 276 | } |
|---|
| 274 | | -static int proc_rk_set_power(void *data, bool blocked) |
|---|
| 275 | | -{ |
|---|
| 276 | | - struct rfkill_rk_data *rfkill = data; |
|---|
| 277 | | - struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; |
|---|
| 278 | | - struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio; |
|---|
| 279 | | - struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio; |
|---|
| 280 | | - struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio; |
|---|
| 281 | | - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; |
|---|
| 282 | | - int wifi_power = 0; |
|---|
| 283 | | - bool toggle = false; |
|---|
| 284 | | - |
|---|
| 285 | | - DBG("Enter %s\n", __func__); |
|---|
| 286 | | - |
|---|
| 287 | | - DBG("Set blocked:%d\n", blocked); |
|---|
| 288 | | - |
|---|
| 289 | | - toggle = rfkill->pdata->power_toggle; |
|---|
| 290 | | - |
|---|
| 291 | | - |
|---|
| 292 | | - DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false"); |
|---|
| 293 | | - |
|---|
| 294 | | - if (!blocked) { |
|---|
| 295 | | - if (toggle) { |
|---|
| 296 | | - rfkill_set_wifi_bt_power(1); |
|---|
| 297 | | - msleep(100); |
|---|
| 298 | | - } |
|---|
| 299 | | - |
|---|
| 300 | | - rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup |
|---|
| 301 | | - |
|---|
| 302 | | - if (gpio_is_valid(wake_host->io)) { |
|---|
| 303 | | - LOG("%s: set bt wake_host high!\n", __func__); |
|---|
| 304 | | - gpio_direction_output(wake_host->io, 1); |
|---|
| 305 | | - msleep(20); |
|---|
| 306 | | - } |
|---|
| 307 | | - |
|---|
| 308 | | - if (gpio_is_valid(poweron->io)) { |
|---|
| 309 | | - if (gpio_get_value(poweron->io) == !poweron->enable) { |
|---|
| 310 | | - gpio_direction_output(poweron->io, |
|---|
| 311 | | - !poweron->enable); |
|---|
| 312 | | - msleep(20); |
|---|
| 313 | | - gpio_direction_output(poweron->io, |
|---|
| 314 | | - poweron->enable); |
|---|
| 315 | | - msleep(20); |
|---|
| 316 | | - if (gpio_is_valid(wake_host->io)) |
|---|
| 317 | | - gpio_direction_input(wake_host->io); |
|---|
| 318 | | - } |
|---|
| 319 | | - } |
|---|
| 320 | | - |
|---|
| 321 | | - if (gpio_is_valid(reset->io)) { |
|---|
| 322 | | - if (gpio_get_value(reset->io) == !reset->enable) { |
|---|
| 323 | | - gpio_direction_output(reset->io, |
|---|
| 324 | | - !reset->enable); |
|---|
| 325 | | - msleep(20); |
|---|
| 326 | | - gpio_direction_output(reset->io, reset->enable); |
|---|
| 327 | | - } |
|---|
| 328 | | - } |
|---|
| 329 | | - |
|---|
| 330 | | - if (pinctrl && gpio_is_valid(rts->io)) { |
|---|
| 331 | | - pinctrl_select_state(pinctrl, rts->gpio_state); |
|---|
| 332 | | - LOG("ENABLE UART_RTS\n"); |
|---|
| 333 | | - gpio_direction_output(rts->io, rts->enable); |
|---|
| 334 | | - msleep(100); |
|---|
| 335 | | - LOG("DISABLE UART_RTS\n"); |
|---|
| 336 | | - gpio_direction_output(rts->io, !rts->enable); |
|---|
| 337 | | - pinctrl_select_state(pinctrl, rts->default_state); |
|---|
| 338 | | - } |
|---|
| 339 | | - |
|---|
| 340 | | - bt_power_state = 1; |
|---|
| 341 | | - LOG("bt turn on power\n"); |
|---|
| 342 | | - rfkill_rk_setup_wake_irq(rfkill, 1); |
|---|
| 343 | | - } else { |
|---|
| 344 | | - if (gpio_is_valid(poweron->io)) { |
|---|
| 345 | | - if (gpio_get_value(poweron->io) == poweron->enable) { |
|---|
| 346 | | - gpio_direction_output(poweron->io, |
|---|
| 347 | | - !poweron->enable); |
|---|
| 348 | | - msleep(20); |
|---|
| 349 | | - } |
|---|
| 350 | | - } |
|---|
| 351 | | - |
|---|
| 352 | | - bt_power_state = 0; |
|---|
| 353 | | - LOG("bt shut off power\n"); |
|---|
| 354 | | - if (gpio_is_valid(reset->io)) { |
|---|
| 355 | | - if (gpio_get_value(reset->io) == reset->enable) { |
|---|
| 356 | | - gpio_direction_output(reset->io, |
|---|
| 357 | | - !reset->enable); |
|---|
| 358 | | - msleep(20); |
|---|
| 359 | | - } |
|---|
| 360 | | - } |
|---|
| 361 | | - if (toggle) { |
|---|
| 362 | | - if (rfkill_get_wifi_power_state(&wifi_power)) { |
|---|
| 363 | | - LOG("%s: cannot get wifi power state!\n", __func__); |
|---|
| 364 | | - return -EPERM; |
|---|
| 365 | | - } |
|---|
| 366 | | - if (!wifi_power) { |
|---|
| 367 | | - LOG("%s: bt will set vbat to low\n", __func__); |
|---|
| 368 | | - rfkill_set_wifi_bt_power(0); |
|---|
| 369 | | - } else { |
|---|
| 370 | | - LOG("%s: bt shouldn't control the vbat\n", __func__); |
|---|
| 371 | | - } |
|---|
| 372 | | - } |
|---|
| 373 | | - } |
|---|
| 374 | | - |
|---|
| 375 | | - return 0; |
|---|
| 376 | | -} |
|---|
| 377 | | - |
|---|
| 378 | 277 | |
|---|
| 379 | 278 | static int rfkill_rk_set_power(void *data, bool blocked) |
|---|
| 380 | 279 | { |
|---|
| .. | .. |
|---|
| 455 | 354 | if (gpio_is_valid(poweron->io)) { |
|---|
| 456 | 355 | if (gpio_get_value(poweron->io) == poweron->enable) { |
|---|
| 457 | 356 | gpio_direction_output(poweron->io, |
|---|
| 458 | | - poweron->enable); |
|---|
| 357 | + !poweron->enable); |
|---|
| 459 | 358 | msleep(20); |
|---|
| 460 | 359 | } |
|---|
| 461 | 360 | } |
|---|
| .. | .. |
|---|
| 465 | 364 | if (gpio_is_valid(reset->io)) { |
|---|
| 466 | 365 | if (gpio_get_value(reset->io) == reset->enable) { |
|---|
| 467 | 366 | gpio_direction_output(reset->io, |
|---|
| 468 | | - reset->enable); |
|---|
| 367 | + !reset->enable); |
|---|
| 469 | 368 | msleep(20); |
|---|
| 470 | 369 | } |
|---|
| 471 | 370 | } |
|---|
| .. | .. |
|---|
| 487 | 386 | struct rfkill_rk_data *rfkill = g_rfkill; |
|---|
| 488 | 387 | struct rfkill_rk_gpio *rts; |
|---|
| 489 | 388 | struct rfkill_rk_irq *wake_host_irq; |
|---|
| 490 | | - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; |
|---|
| 491 | 389 | |
|---|
| 492 | 390 | DBG("Enter %s\n", __func__); |
|---|
| 493 | 391 | |
|---|
| .. | .. |
|---|
| 498 | 396 | wake_host_irq = &rfkill->pdata->wake_host_irq; |
|---|
| 499 | 397 | |
|---|
| 500 | 398 | //To prevent uart to receive bt data when suspended |
|---|
| 501 | | - if (pinctrl && gpio_is_valid(rts->io)) { |
|---|
| 399 | + if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { |
|---|
| 502 | 400 | DBG("Disable UART_RTS\n"); |
|---|
| 503 | | - pinctrl_select_state(pinctrl, rts->gpio_state); |
|---|
| 401 | + pinctrl_select_state(rfkill->pdata->pinctrl, rts->gpio_state); |
|---|
| 504 | 402 | gpio_direction_output(rts->io, !rts->enable); |
|---|
| 505 | 403 | } |
|---|
| 506 | 404 | |
|---|
| .. | .. |
|---|
| 512 | 410 | if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { |
|---|
| 513 | 411 | DBG("enable irq for bt wakeup host\n"); |
|---|
| 514 | 412 | enable_irq(wake_host_irq->irq); |
|---|
| 515 | | - enable_irq_wake(wake_host_irq->irq); |
|---|
| 516 | 413 | } |
|---|
| 517 | 414 | |
|---|
| 518 | 415 | #ifdef CONFIG_RFKILL_RESET |
|---|
| 519 | | - rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); |
|---|
| 416 | + rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
|---|
| 417 | + rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
|---|
| 418 | + rfkill_set_hw_state(rfkill->rfkill_dev, false); |
|---|
| 520 | 419 | rfkill_rk_set_power(rfkill, BT_BLOCKED); |
|---|
| 521 | 420 | #endif |
|---|
| 522 | 421 | |
|---|
| .. | .. |
|---|
| 528 | 427 | struct rfkill_rk_data *rfkill = g_rfkill; |
|---|
| 529 | 428 | struct rfkill_rk_irq *wake_host_irq; |
|---|
| 530 | 429 | struct rfkill_rk_gpio *rts; |
|---|
| 531 | | - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; |
|---|
| 532 | 430 | |
|---|
| 533 | 431 | DBG("Enter %s\n", __func__); |
|---|
| 534 | 432 | |
|---|
| .. | .. |
|---|
| 541 | 439 | if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { |
|---|
| 542 | 440 | LOG("** disable irq\n"); |
|---|
| 543 | 441 | disable_irq(wake_host_irq->irq); |
|---|
| 544 | | - disable_irq_wake(wake_host_irq->irq); |
|---|
| 545 | 442 | } |
|---|
| 546 | 443 | |
|---|
| 547 | | - if (pinctrl && gpio_is_valid(rts->io)) { |
|---|
| 444 | + if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { |
|---|
| 548 | 445 | DBG("Enable UART_RTS\n"); |
|---|
| 549 | 446 | gpio_direction_output(rts->io, rts->enable); |
|---|
| 550 | | - pinctrl_select_state(pinctrl, rts->default_state); |
|---|
| 447 | + pinctrl_select_state(rfkill->pdata->pinctrl, rts->default_state); |
|---|
| 551 | 448 | } |
|---|
| 552 | 449 | } |
|---|
| 553 | 450 | |
|---|
| .. | .. |
|---|
| 594 | 491 | DBG("btwrite %c\n", b); |
|---|
| 595 | 492 | /* HCI_DEV_WRITE */ |
|---|
| 596 | 493 | if (b != '0') |
|---|
| 597 | | - proc_rk_set_power(g_rfkill, 0); |
|---|
| 494 | + rfkill_rk_sleep_bt(BT_WAKEUP); |
|---|
| 598 | 495 | else |
|---|
| 599 | | - proc_rk_set_power(g_rfkill, 1); |
|---|
| 496 | + rfkill_rk_sleep_bt(BT_SLEEP); |
|---|
| 600 | 497 | |
|---|
| 601 | 498 | return count; |
|---|
| 602 | 499 | } |
|---|
| .. | .. |
|---|
| 688 | 585 | } |
|---|
| 689 | 586 | #endif //CONFIG_OF |
|---|
| 690 | 587 | |
|---|
| 691 | | -static const struct file_operations bluesleep_lpm = { |
|---|
| 692 | | - .owner = THIS_MODULE, |
|---|
| 693 | | - .read = bluesleep_read_proc_lpm, |
|---|
| 694 | | - .write = bluesleep_write_proc_lpm, |
|---|
| 588 | +static const struct proc_ops bluesleep_lpm = { |
|---|
| 589 | + .proc_read = bluesleep_read_proc_lpm, |
|---|
| 590 | + .proc_write = bluesleep_write_proc_lpm, |
|---|
| 695 | 591 | }; |
|---|
| 696 | 592 | |
|---|
| 697 | | -static const struct file_operations bluesleep_btwrite = { |
|---|
| 698 | | - .owner = THIS_MODULE, |
|---|
| 699 | | - .read = bluesleep_read_proc_btwrite, |
|---|
| 700 | | - .write = bluesleep_write_proc_btwrite, |
|---|
| 593 | +static const struct proc_ops bluesleep_btwrite = { |
|---|
| 594 | + .proc_read = bluesleep_read_proc_btwrite, |
|---|
| 595 | + .proc_write = bluesleep_write_proc_btwrite, |
|---|
| 701 | 596 | }; |
|---|
| 702 | 597 | |
|---|
| 703 | 598 | static int rfkill_rk_probe(struct platform_device *pdev) |
|---|
| .. | .. |
|---|
| 751 | 646 | } |
|---|
| 752 | 647 | |
|---|
| 753 | 648 | /* read/write proc entries */ |
|---|
| 754 | | - ent = proc_create("lpm", 0, sleep_dir, &bluesleep_lpm); |
|---|
| 649 | + ent = proc_create("lpm", 0444, sleep_dir, &bluesleep_lpm); |
|---|
| 755 | 650 | if (!ent) { |
|---|
| 756 | 651 | LOG("Unable to create /proc/%s/lpm entry", PROC_DIR); |
|---|
| 757 | 652 | ret = -ENOMEM; |
|---|
| .. | .. |
|---|
| 759 | 654 | } |
|---|
| 760 | 655 | |
|---|
| 761 | 656 | /* read/write proc entries */ |
|---|
| 762 | | - ent = proc_create("btwrite", 0, sleep_dir, &bluesleep_btwrite); |
|---|
| 657 | + ent = proc_create("btwrite", 0444, sleep_dir, &bluesleep_btwrite); |
|---|
| 763 | 658 | if (!ent) { |
|---|
| 764 | 659 | LOG("Unable to create /proc/%s/btwrite entry", PROC_DIR); |
|---|
| 765 | 660 | ret = -ENOMEM; |
|---|
| .. | .. |
|---|
| 801 | 696 | if (!rfkill->rfkill_dev) |
|---|
| 802 | 697 | goto fail_alloc; |
|---|
| 803 | 698 | |
|---|
| 804 | | - rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); |
|---|
| 699 | + rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
|---|
| 700 | + rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); |
|---|
| 701 | + rfkill_set_hw_state(rfkill->rfkill_dev, false); |
|---|
| 805 | 702 | ret = rfkill_register(rfkill->rfkill_dev); |
|---|
| 806 | 703 | if (ret < 0) |
|---|
| 807 | 704 | goto fail_rfkill; |
|---|