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