• Home
  • Raw
  • Download

Lines Matching refs:rfkill

37 struct rfkill {  struct
68 #define to_rfkill(d) container_of(d, struct rfkill, dev) argument
119 static void rfkill_led_trigger_event(struct rfkill *rfkill) in rfkill_led_trigger_event() argument
123 if (!rfkill->registered) in rfkill_led_trigger_event()
126 trigger = &rfkill->led_trigger; in rfkill_led_trigger_event()
128 if (rfkill->state & RFKILL_BLOCK_ANY) in rfkill_led_trigger_event()
136 struct rfkill *rfkill; in rfkill_led_trigger_activate() local
138 rfkill = container_of(led->trigger, struct rfkill, led_trigger); in rfkill_led_trigger_activate()
140 rfkill_led_trigger_event(rfkill); in rfkill_led_trigger_activate()
145 const char *rfkill_get_led_trigger_name(struct rfkill *rfkill) in rfkill_get_led_trigger_name() argument
147 return rfkill->led_trigger.name; in rfkill_get_led_trigger_name()
151 void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name) in rfkill_set_led_trigger_name() argument
153 BUG_ON(!rfkill); in rfkill_set_led_trigger_name()
155 rfkill->ledtrigname = name; in rfkill_set_led_trigger_name()
159 static int rfkill_led_trigger_register(struct rfkill *rfkill) in rfkill_led_trigger_register() argument
161 rfkill->led_trigger.name = rfkill->ledtrigname in rfkill_led_trigger_register()
162 ? : dev_name(&rfkill->dev); in rfkill_led_trigger_register()
163 rfkill->led_trigger.activate = rfkill_led_trigger_activate; in rfkill_led_trigger_register()
164 return led_trigger_register(&rfkill->led_trigger); in rfkill_led_trigger_register()
167 static void rfkill_led_trigger_unregister(struct rfkill *rfkill) in rfkill_led_trigger_unregister() argument
169 led_trigger_unregister(&rfkill->led_trigger); in rfkill_led_trigger_unregister()
179 struct rfkill *rfkill; in rfkill_global_led_trigger_worker() local
182 list_for_each_entry(rfkill, &rfkill_list, node) { in rfkill_global_led_trigger_worker()
183 if (!(rfkill->state & RFKILL_BLOCK_ANY)) { in rfkill_global_led_trigger_worker()
230 static void rfkill_led_trigger_event(struct rfkill *rfkill) in rfkill_led_trigger_event() argument
234 static inline int rfkill_led_trigger_register(struct rfkill *rfkill) in rfkill_led_trigger_register() argument
239 static inline void rfkill_led_trigger_unregister(struct rfkill *rfkill) in rfkill_led_trigger_unregister() argument
258 struct rfkill *rfkill, in rfkill_fill_event() argument
263 ev->idx = rfkill->idx; in rfkill_fill_event()
264 ev->type = rfkill->type; in rfkill_fill_event()
267 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_fill_event()
268 ev->hard = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_fill_event()
269 ev->soft = !!(rfkill->state & (RFKILL_BLOCK_SW | in rfkill_fill_event()
271 ev->hard_block_reasons = rfkill->hard_block_reasons; in rfkill_fill_event()
272 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_fill_event()
275 static void rfkill_send_events(struct rfkill *rfkill, enum rfkill_operation op) in rfkill_send_events() argument
284 rfkill_fill_event(&ev->ev, rfkill, op); in rfkill_send_events()
292 static void rfkill_event(struct rfkill *rfkill) in rfkill_event() argument
294 if (!rfkill->registered) in rfkill_event()
297 kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE); in rfkill_event()
300 rfkill_send_events(rfkill, RFKILL_OP_CHANGE); in rfkill_event()
312 static void rfkill_set_block(struct rfkill *rfkill, bool blocked) in rfkill_set_block() argument
318 if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP)) in rfkill_set_block()
326 if (rfkill->ops->query) in rfkill_set_block()
327 rfkill->ops->query(rfkill, rfkill->data); in rfkill_set_block()
329 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_block()
330 prev = rfkill->state & RFKILL_BLOCK_SW; in rfkill_set_block()
333 rfkill->state |= RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
335 rfkill->state &= ~RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
338 rfkill->state |= RFKILL_BLOCK_SW; in rfkill_set_block()
340 rfkill->state &= ~RFKILL_BLOCK_SW; in rfkill_set_block()
342 rfkill->state |= RFKILL_BLOCK_SW_SETCALL; in rfkill_set_block()
343 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_block()
345 err = rfkill->ops->set_block(rfkill->data, blocked); in rfkill_set_block()
347 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_block()
354 if (rfkill->state & RFKILL_BLOCK_SW_PREV) in rfkill_set_block()
355 rfkill->state |= RFKILL_BLOCK_SW; in rfkill_set_block()
357 rfkill->state &= ~RFKILL_BLOCK_SW; in rfkill_set_block()
359 rfkill->state &= ~RFKILL_BLOCK_SW_SETCALL; in rfkill_set_block()
360 rfkill->state &= ~RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
361 curr = rfkill->state & RFKILL_BLOCK_SW; in rfkill_set_block()
362 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_block()
364 rfkill_led_trigger_event(rfkill); in rfkill_set_block()
368 rfkill_event(rfkill); in rfkill_set_block()
399 struct rfkill *rfkill; in __rfkill_switch_all() local
402 list_for_each_entry(rfkill, &rfkill_list, node) { in __rfkill_switch_all()
403 if (rfkill->type != type && type != RFKILL_TYPE_ALL) in __rfkill_switch_all()
406 rfkill_set_block(rfkill, blocked); in __rfkill_switch_all()
444 struct rfkill *rfkill; in rfkill_epo() local
453 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_epo()
454 rfkill_set_block(rfkill, true); in rfkill_epo()
529 bool rfkill_set_hw_state_reason(struct rfkill *rfkill, in rfkill_set_hw_state_reason() argument
535 BUG_ON(!rfkill); in rfkill_set_hw_state_reason()
542 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_hw_state_reason()
543 prev = !!(rfkill->hard_block_reasons & reason); in rfkill_set_hw_state_reason()
545 rfkill->state |= RFKILL_BLOCK_HW; in rfkill_set_hw_state_reason()
546 rfkill->hard_block_reasons |= reason; in rfkill_set_hw_state_reason()
548 rfkill->hard_block_reasons &= ~reason; in rfkill_set_hw_state_reason()
549 if (!rfkill->hard_block_reasons) in rfkill_set_hw_state_reason()
550 rfkill->state &= ~RFKILL_BLOCK_HW; in rfkill_set_hw_state_reason()
552 ret = !!(rfkill->state & RFKILL_BLOCK_ANY); in rfkill_set_hw_state_reason()
553 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_hw_state_reason()
555 rfkill_led_trigger_event(rfkill); in rfkill_set_hw_state_reason()
558 if (rfkill->registered && prev != blocked) in rfkill_set_hw_state_reason()
559 schedule_work(&rfkill->uevent_work); in rfkill_set_hw_state_reason()
565 static void __rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) in __rfkill_set_sw_state() argument
570 if (rfkill->state & RFKILL_BLOCK_SW_SETCALL) in __rfkill_set_sw_state()
574 rfkill->state |= bit; in __rfkill_set_sw_state()
576 rfkill->state &= ~bit; in __rfkill_set_sw_state()
579 bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) in rfkill_set_sw_state() argument
584 BUG_ON(!rfkill); in rfkill_set_sw_state()
586 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_sw_state()
587 prev = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_set_sw_state()
588 __rfkill_set_sw_state(rfkill, blocked); in rfkill_set_sw_state()
589 hwblock = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_sw_state()
591 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_sw_state()
593 if (!rfkill->registered) in rfkill_set_sw_state()
597 schedule_work(&rfkill->uevent_work); in rfkill_set_sw_state()
599 rfkill_led_trigger_event(rfkill); in rfkill_set_sw_state()
606 void rfkill_init_sw_state(struct rfkill *rfkill, bool blocked) in rfkill_init_sw_state() argument
610 BUG_ON(!rfkill); in rfkill_init_sw_state()
611 BUG_ON(rfkill->registered); in rfkill_init_sw_state()
613 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_init_sw_state()
614 __rfkill_set_sw_state(rfkill, blocked); in rfkill_init_sw_state()
615 rfkill->persistent = true; in rfkill_init_sw_state()
616 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_init_sw_state()
620 void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) in rfkill_set_states() argument
625 BUG_ON(!rfkill); in rfkill_set_states()
627 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_states()
633 swprev = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_set_states()
634 hwprev = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_states()
635 __rfkill_set_sw_state(rfkill, sw); in rfkill_set_states()
637 rfkill->state |= RFKILL_BLOCK_HW; in rfkill_set_states()
639 rfkill->state &= ~RFKILL_BLOCK_HW; in rfkill_set_states()
641 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_states()
643 if (!rfkill->registered) { in rfkill_set_states()
644 rfkill->persistent = true; in rfkill_set_states()
647 schedule_work(&rfkill->uevent_work); in rfkill_set_states()
649 rfkill_led_trigger_event(rfkill); in rfkill_set_states()
686 struct rfkill *rfkill = to_rfkill(dev); in name_show() local
688 return sprintf(buf, "%s\n", rfkill->name); in name_show()
695 struct rfkill *rfkill = to_rfkill(dev); in type_show() local
697 return sprintf(buf, "%s\n", rfkill_types[rfkill->type]); in type_show()
704 struct rfkill *rfkill = to_rfkill(dev); in index_show() local
706 return sprintf(buf, "%d\n", rfkill->idx); in index_show()
713 struct rfkill *rfkill = to_rfkill(dev); in persistent_show() local
715 return sprintf(buf, "%d\n", rfkill->persistent); in persistent_show()
722 struct rfkill *rfkill = to_rfkill(dev); in hard_show() local
724 return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_HW) ? 1 : 0 ); in hard_show()
731 struct rfkill *rfkill = to_rfkill(dev); in soft_show() local
733 return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_SW) ? 1 : 0 ); in soft_show()
739 struct rfkill *rfkill = to_rfkill(dev); in soft_store() local
754 rfkill_set_block(rfkill, state); in soft_store()
765 struct rfkill *rfkill = to_rfkill(dev); in hard_block_reasons_show() local
767 return sprintf(buf, "0x%lx\n", rfkill->hard_block_reasons); in hard_block_reasons_show()
784 struct rfkill *rfkill = to_rfkill(dev); in state_show() local
786 return sprintf(buf, "%d\n", user_state_from_blocked(rfkill->state)); in state_show()
792 struct rfkill *rfkill = to_rfkill(dev); in state_store() local
808 rfkill_set_block(rfkill, state == RFKILL_USER_STATE_SOFT_BLOCKED); in state_store()
830 struct rfkill *rfkill = to_rfkill(dev); in rfkill_release() local
832 kfree(rfkill); in rfkill_release()
837 struct rfkill *rfkill = to_rfkill(dev); in rfkill_dev_uevent() local
843 error = add_uevent_var(env, "RFKILL_NAME=%s", rfkill->name); in rfkill_dev_uevent()
847 rfkill_types[rfkill->type]); in rfkill_dev_uevent()
850 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_dev_uevent()
851 state = rfkill->state; in rfkill_dev_uevent()
852 reasons = rfkill->hard_block_reasons; in rfkill_dev_uevent()
853 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_dev_uevent()
861 void rfkill_pause_polling(struct rfkill *rfkill) in rfkill_pause_polling() argument
863 BUG_ON(!rfkill); in rfkill_pause_polling()
865 if (!rfkill->ops->poll) in rfkill_pause_polling()
868 rfkill->polling_paused = true; in rfkill_pause_polling()
869 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_pause_polling()
873 void rfkill_resume_polling(struct rfkill *rfkill) in rfkill_resume_polling() argument
875 BUG_ON(!rfkill); in rfkill_resume_polling()
877 if (!rfkill->ops->poll) in rfkill_resume_polling()
880 rfkill->polling_paused = false; in rfkill_resume_polling()
882 if (rfkill->suspended) in rfkill_resume_polling()
886 &rfkill->poll_work, 0); in rfkill_resume_polling()
893 struct rfkill *rfkill = to_rfkill(dev); in rfkill_suspend() local
895 rfkill->suspended = true; in rfkill_suspend()
896 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_suspend()
903 struct rfkill *rfkill = to_rfkill(dev); in rfkill_resume() local
906 rfkill->suspended = false; in rfkill_resume()
908 if (!rfkill->registered) in rfkill_resume()
911 if (!rfkill->persistent) { in rfkill_resume()
912 cur = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_resume()
913 rfkill_set_block(rfkill, cur); in rfkill_resume()
916 if (rfkill->ops->poll && !rfkill->polling_paused) in rfkill_resume()
918 &rfkill->poll_work, 0); in rfkill_resume()
937 bool rfkill_blocked(struct rfkill *rfkill) in rfkill_blocked() argument
942 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_blocked()
943 state = rfkill->state; in rfkill_blocked()
944 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_blocked()
951 struct rfkill * __must_check rfkill_alloc(const char *name, in rfkill_alloc()
957 struct rfkill *rfkill; in rfkill_alloc() local
972 rfkill = kzalloc(sizeof(*rfkill) + strlen(name) + 1, GFP_KERNEL); in rfkill_alloc()
973 if (!rfkill) in rfkill_alloc()
976 spin_lock_init(&rfkill->lock); in rfkill_alloc()
977 INIT_LIST_HEAD(&rfkill->node); in rfkill_alloc()
978 rfkill->type = type; in rfkill_alloc()
979 strcpy(rfkill->name, name); in rfkill_alloc()
980 rfkill->ops = ops; in rfkill_alloc()
981 rfkill->data = ops_data; in rfkill_alloc()
983 dev = &rfkill->dev; in rfkill_alloc()
988 return rfkill; in rfkill_alloc()
994 struct rfkill *rfkill; in rfkill_poll() local
996 rfkill = container_of(work, struct rfkill, poll_work.work); in rfkill_poll()
1003 rfkill->ops->poll(rfkill, rfkill->data); in rfkill_poll()
1006 &rfkill->poll_work, in rfkill_poll()
1012 struct rfkill *rfkill; in rfkill_uevent_work() local
1014 rfkill = container_of(work, struct rfkill, uevent_work); in rfkill_uevent_work()
1017 rfkill_event(rfkill); in rfkill_uevent_work()
1023 struct rfkill *rfkill; in rfkill_sync_work() local
1026 rfkill = container_of(work, struct rfkill, sync_work); in rfkill_sync_work()
1029 cur = rfkill_global_states[rfkill->type].cur; in rfkill_sync_work()
1030 rfkill_set_block(rfkill, cur); in rfkill_sync_work()
1034 int __must_check rfkill_register(struct rfkill *rfkill) in rfkill_register() argument
1040 if (!rfkill) in rfkill_register()
1043 dev = &rfkill->dev; in rfkill_register()
1047 if (rfkill->registered) { in rfkill_register()
1052 rfkill->idx = rfkill_no; in rfkill_register()
1056 list_add_tail(&rfkill->node, &rfkill_list); in rfkill_register()
1062 error = rfkill_led_trigger_register(rfkill); in rfkill_register()
1066 rfkill->registered = true; in rfkill_register()
1068 INIT_DELAYED_WORK(&rfkill->poll_work, rfkill_poll); in rfkill_register()
1069 INIT_WORK(&rfkill->uevent_work, rfkill_uevent_work); in rfkill_register()
1070 INIT_WORK(&rfkill->sync_work, rfkill_sync_work); in rfkill_register()
1072 if (rfkill->ops->poll) in rfkill_register()
1074 &rfkill->poll_work, in rfkill_register()
1077 if (!rfkill->persistent || rfkill_epo_lock_active) { in rfkill_register()
1078 schedule_work(&rfkill->sync_work); in rfkill_register()
1081 bool soft_blocked = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_register()
1084 __rfkill_switch_all(rfkill->type, soft_blocked); in rfkill_register()
1089 rfkill_send_events(rfkill, RFKILL_OP_ADD); in rfkill_register()
1095 device_del(&rfkill->dev); in rfkill_register()
1097 list_del_init(&rfkill->node); in rfkill_register()
1104 void rfkill_unregister(struct rfkill *rfkill) in rfkill_unregister() argument
1106 BUG_ON(!rfkill); in rfkill_unregister()
1108 if (rfkill->ops->poll) in rfkill_unregister()
1109 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_unregister()
1111 cancel_work_sync(&rfkill->uevent_work); in rfkill_unregister()
1112 cancel_work_sync(&rfkill->sync_work); in rfkill_unregister()
1114 rfkill->registered = false; in rfkill_unregister()
1116 device_del(&rfkill->dev); in rfkill_unregister()
1119 rfkill_send_events(rfkill, RFKILL_OP_DEL); in rfkill_unregister()
1120 list_del_init(&rfkill->node); in rfkill_unregister()
1124 rfkill_led_trigger_unregister(rfkill); in rfkill_unregister()
1128 void rfkill_destroy(struct rfkill *rfkill) in rfkill_destroy() argument
1130 if (rfkill) in rfkill_destroy()
1131 put_device(&rfkill->dev); in rfkill_destroy()
1138 struct rfkill *rfkill; in rfkill_fop_open() local
1158 list_for_each_entry(rfkill, &rfkill_list, node) { in rfkill_fop_open()
1162 rfkill_fill_event(&ev->ev, rfkill, RFKILL_OP_ADD); in rfkill_fop_open()
1245 struct rfkill *rfkill; in rfkill_fop_write() local
1271 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_fop_write()
1272 if (rfkill->type == ev.type || in rfkill_fop_write()
1274 rfkill_set_block(rfkill, ev.soft); in rfkill_fop_write()
1278 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_fop_write()
1279 if (rfkill->idx == ev.idx && in rfkill_fop_write()
1280 (rfkill->type == ev.type || in rfkill_fop_write()
1282 rfkill_set_block(rfkill, ev.soft); in rfkill_fop_write()