Lines Matching refs:rfkill

49 struct rfkill {  struct
79 #define to_rfkill(d) container_of(d, struct rfkill, dev) argument
129 static void rfkill_led_trigger_event(struct rfkill *rfkill) in rfkill_led_trigger_event() argument
133 if (!rfkill->registered) in rfkill_led_trigger_event()
136 trigger = &rfkill->led_trigger; in rfkill_led_trigger_event()
138 if (rfkill->state & RFKILL_BLOCK_ANY) in rfkill_led_trigger_event()
146 struct rfkill *rfkill; in rfkill_led_trigger_activate() local
148 rfkill = container_of(led->trigger, struct rfkill, led_trigger); in rfkill_led_trigger_activate()
150 rfkill_led_trigger_event(rfkill); in rfkill_led_trigger_activate()
155 const char *rfkill_get_led_trigger_name(struct rfkill *rfkill) in rfkill_get_led_trigger_name() argument
157 return rfkill->led_trigger.name; in rfkill_get_led_trigger_name()
161 void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name) in rfkill_set_led_trigger_name() argument
163 BUG_ON(!rfkill); in rfkill_set_led_trigger_name()
165 rfkill->ledtrigname = name; in rfkill_set_led_trigger_name()
169 static int rfkill_led_trigger_register(struct rfkill *rfkill) in rfkill_led_trigger_register() argument
171 rfkill->led_trigger.name = rfkill->ledtrigname in rfkill_led_trigger_register()
172 ? : dev_name(&rfkill->dev); in rfkill_led_trigger_register()
173 rfkill->led_trigger.activate = rfkill_led_trigger_activate; in rfkill_led_trigger_register()
174 return led_trigger_register(&rfkill->led_trigger); in rfkill_led_trigger_register()
177 static void rfkill_led_trigger_unregister(struct rfkill *rfkill) in rfkill_led_trigger_unregister() argument
179 led_trigger_unregister(&rfkill->led_trigger); in rfkill_led_trigger_unregister()
189 struct rfkill *rfkill; in rfkill_global_led_trigger_worker() local
192 list_for_each_entry(rfkill, &rfkill_list, node) { in rfkill_global_led_trigger_worker()
193 if (!(rfkill->state & RFKILL_BLOCK_ANY)) { in rfkill_global_led_trigger_worker()
240 static void rfkill_led_trigger_event(struct rfkill *rfkill) in rfkill_led_trigger_event() argument
244 static inline int rfkill_led_trigger_register(struct rfkill *rfkill) in rfkill_led_trigger_register() argument
249 static inline void rfkill_led_trigger_unregister(struct rfkill *rfkill) in rfkill_led_trigger_unregister() argument
267 static void rfkill_fill_event(struct rfkill_event *ev, struct rfkill *rfkill, in rfkill_fill_event() argument
272 ev->idx = rfkill->idx; in rfkill_fill_event()
273 ev->type = rfkill->type; in rfkill_fill_event()
276 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_fill_event()
277 ev->hard = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_fill_event()
278 ev->soft = !!(rfkill->state & (RFKILL_BLOCK_SW | in rfkill_fill_event()
280 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_fill_event()
283 static void rfkill_send_events(struct rfkill *rfkill, enum rfkill_operation op) in rfkill_send_events() argument
292 rfkill_fill_event(&ev->ev, rfkill, op); in rfkill_send_events()
300 static void rfkill_event(struct rfkill *rfkill) in rfkill_event() argument
302 if (!rfkill->registered) in rfkill_event()
305 kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE); in rfkill_event()
308 rfkill_send_events(rfkill, RFKILL_OP_CHANGE); in rfkill_event()
320 static void rfkill_set_block(struct rfkill *rfkill, bool blocked) in rfkill_set_block() argument
326 if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP)) in rfkill_set_block()
334 if (rfkill->ops->query) in rfkill_set_block()
335 rfkill->ops->query(rfkill, rfkill->data); in rfkill_set_block()
337 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_block()
338 prev = rfkill->state & RFKILL_BLOCK_SW; in rfkill_set_block()
341 rfkill->state |= RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
343 rfkill->state &= ~RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
346 rfkill->state |= RFKILL_BLOCK_SW; in rfkill_set_block()
348 rfkill->state &= ~RFKILL_BLOCK_SW; in rfkill_set_block()
350 rfkill->state |= RFKILL_BLOCK_SW_SETCALL; in rfkill_set_block()
351 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_block()
353 err = rfkill->ops->set_block(rfkill->data, blocked); in rfkill_set_block()
355 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_block()
362 if (rfkill->state & RFKILL_BLOCK_SW_PREV) in rfkill_set_block()
363 rfkill->state |= RFKILL_BLOCK_SW; in rfkill_set_block()
365 rfkill->state &= ~RFKILL_BLOCK_SW; in rfkill_set_block()
367 rfkill->state &= ~RFKILL_BLOCK_SW_SETCALL; in rfkill_set_block()
368 rfkill->state &= ~RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
369 curr = rfkill->state & RFKILL_BLOCK_SW; in rfkill_set_block()
370 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_block()
372 rfkill_led_trigger_event(rfkill); in rfkill_set_block()
376 rfkill_event(rfkill); in rfkill_set_block()
407 struct rfkill *rfkill; in __rfkill_switch_all() local
410 list_for_each_entry(rfkill, &rfkill_list, node) { in __rfkill_switch_all()
411 if (rfkill->type != type && type != RFKILL_TYPE_ALL) in __rfkill_switch_all()
414 rfkill_set_block(rfkill, blocked); in __rfkill_switch_all()
452 struct rfkill *rfkill; in rfkill_epo() local
461 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_epo()
462 rfkill_set_block(rfkill, true); in rfkill_epo()
537 bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) in rfkill_set_hw_state() argument
542 BUG_ON(!rfkill); in rfkill_set_hw_state()
544 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_hw_state()
545 prev = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_hw_state()
547 rfkill->state |= RFKILL_BLOCK_HW; in rfkill_set_hw_state()
549 rfkill->state &= ~RFKILL_BLOCK_HW; in rfkill_set_hw_state()
550 ret = !!(rfkill->state & RFKILL_BLOCK_ANY); in rfkill_set_hw_state()
551 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_hw_state()
553 rfkill_led_trigger_event(rfkill); in rfkill_set_hw_state()
556 if (rfkill->registered && prev != blocked) in rfkill_set_hw_state()
557 schedule_work(&rfkill->uevent_work); in rfkill_set_hw_state()
563 static void __rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) in __rfkill_set_sw_state() argument
568 if (rfkill->state & RFKILL_BLOCK_SW_SETCALL) in __rfkill_set_sw_state()
572 rfkill->state |= bit; in __rfkill_set_sw_state()
574 rfkill->state &= ~bit; in __rfkill_set_sw_state()
577 bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) in rfkill_set_sw_state() argument
582 BUG_ON(!rfkill); in rfkill_set_sw_state()
584 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_sw_state()
585 prev = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_set_sw_state()
586 __rfkill_set_sw_state(rfkill, blocked); in rfkill_set_sw_state()
587 hwblock = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_sw_state()
589 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_sw_state()
591 if (!rfkill->registered) in rfkill_set_sw_state()
595 schedule_work(&rfkill->uevent_work); in rfkill_set_sw_state()
597 rfkill_led_trigger_event(rfkill); in rfkill_set_sw_state()
604 void rfkill_init_sw_state(struct rfkill *rfkill, bool blocked) in rfkill_init_sw_state() argument
608 BUG_ON(!rfkill); in rfkill_init_sw_state()
609 BUG_ON(rfkill->registered); in rfkill_init_sw_state()
611 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_init_sw_state()
612 __rfkill_set_sw_state(rfkill, blocked); in rfkill_init_sw_state()
613 rfkill->persistent = true; in rfkill_init_sw_state()
614 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_init_sw_state()
618 void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) in rfkill_set_states() argument
623 BUG_ON(!rfkill); in rfkill_set_states()
625 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_states()
631 swprev = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_set_states()
632 hwprev = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_states()
633 __rfkill_set_sw_state(rfkill, sw); in rfkill_set_states()
635 rfkill->state |= RFKILL_BLOCK_HW; in rfkill_set_states()
637 rfkill->state &= ~RFKILL_BLOCK_HW; in rfkill_set_states()
639 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_states()
641 if (!rfkill->registered) { in rfkill_set_states()
642 rfkill->persistent = true; in rfkill_set_states()
645 schedule_work(&rfkill->uevent_work); in rfkill_set_states()
647 rfkill_led_trigger_event(rfkill); in rfkill_set_states()
684 struct rfkill *rfkill = to_rfkill(dev); in name_show() local
686 return sprintf(buf, "%s\n", rfkill->name); in name_show()
693 struct rfkill *rfkill = to_rfkill(dev); in type_show() local
695 return sprintf(buf, "%s\n", rfkill_types[rfkill->type]); in type_show()
702 struct rfkill *rfkill = to_rfkill(dev); in index_show() local
704 return sprintf(buf, "%d\n", rfkill->idx); in index_show()
711 struct rfkill *rfkill = to_rfkill(dev); in persistent_show() local
713 return sprintf(buf, "%d\n", rfkill->persistent); in persistent_show()
720 struct rfkill *rfkill = to_rfkill(dev); in hard_show() local
722 return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_HW) ? 1 : 0 ); in hard_show()
729 struct rfkill *rfkill = to_rfkill(dev); in soft_show() local
731 return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_SW) ? 1 : 0 ); in soft_show()
737 struct rfkill *rfkill = to_rfkill(dev); in soft_store() local
752 rfkill_set_block(rfkill, state); in soft_store()
772 struct rfkill *rfkill = to_rfkill(dev); in state_show() local
774 return sprintf(buf, "%d\n", user_state_from_blocked(rfkill->state)); in state_show()
780 struct rfkill *rfkill = to_rfkill(dev); in state_store() local
796 rfkill_set_block(rfkill, state == RFKILL_USER_STATE_SOFT_BLOCKED); in state_store()
817 struct rfkill *rfkill = to_rfkill(dev); in rfkill_release() local
819 kfree(rfkill); in rfkill_release()
824 struct rfkill *rfkill = to_rfkill(dev); in rfkill_dev_uevent() local
829 error = add_uevent_var(env, "RFKILL_NAME=%s", rfkill->name); in rfkill_dev_uevent()
833 rfkill_types[rfkill->type]); in rfkill_dev_uevent()
836 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_dev_uevent()
837 state = rfkill->state; in rfkill_dev_uevent()
838 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_dev_uevent()
844 void rfkill_pause_polling(struct rfkill *rfkill) in rfkill_pause_polling() argument
846 BUG_ON(!rfkill); in rfkill_pause_polling()
848 if (!rfkill->ops->poll) in rfkill_pause_polling()
851 rfkill->polling_paused = true; in rfkill_pause_polling()
852 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_pause_polling()
856 void rfkill_resume_polling(struct rfkill *rfkill) in rfkill_resume_polling() argument
858 BUG_ON(!rfkill); in rfkill_resume_polling()
860 if (!rfkill->ops->poll) in rfkill_resume_polling()
863 rfkill->polling_paused = false; in rfkill_resume_polling()
865 if (rfkill->suspended) in rfkill_resume_polling()
869 &rfkill->poll_work, 0); in rfkill_resume_polling()
876 struct rfkill *rfkill = to_rfkill(dev); in rfkill_suspend() local
878 rfkill->suspended = true; in rfkill_suspend()
879 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_suspend()
886 struct rfkill *rfkill = to_rfkill(dev); in rfkill_resume() local
889 rfkill->suspended = false; in rfkill_resume()
891 if (!rfkill->persistent) { in rfkill_resume()
892 cur = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_resume()
893 rfkill_set_block(rfkill, cur); in rfkill_resume()
896 if (rfkill->ops->poll && !rfkill->polling_paused) in rfkill_resume()
898 &rfkill->poll_work, 0); in rfkill_resume()
917 bool rfkill_blocked(struct rfkill *rfkill) in rfkill_blocked() argument
922 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_blocked()
923 state = rfkill->state; in rfkill_blocked()
924 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_blocked()
931 struct rfkill * __must_check rfkill_alloc(const char *name, in rfkill_alloc()
937 struct rfkill *rfkill; in rfkill_alloc() local
952 rfkill = kzalloc(sizeof(*rfkill) + strlen(name) + 1, GFP_KERNEL); in rfkill_alloc()
953 if (!rfkill) in rfkill_alloc()
956 spin_lock_init(&rfkill->lock); in rfkill_alloc()
957 INIT_LIST_HEAD(&rfkill->node); in rfkill_alloc()
958 rfkill->type = type; in rfkill_alloc()
959 strcpy(rfkill->name, name); in rfkill_alloc()
960 rfkill->ops = ops; in rfkill_alloc()
961 rfkill->data = ops_data; in rfkill_alloc()
963 dev = &rfkill->dev; in rfkill_alloc()
968 return rfkill; in rfkill_alloc()
974 struct rfkill *rfkill; in rfkill_poll() local
976 rfkill = container_of(work, struct rfkill, poll_work.work); in rfkill_poll()
983 rfkill->ops->poll(rfkill, rfkill->data); in rfkill_poll()
986 &rfkill->poll_work, in rfkill_poll()
992 struct rfkill *rfkill; in rfkill_uevent_work() local
994 rfkill = container_of(work, struct rfkill, uevent_work); in rfkill_uevent_work()
997 rfkill_event(rfkill); in rfkill_uevent_work()
1003 struct rfkill *rfkill; in rfkill_sync_work() local
1006 rfkill = container_of(work, struct rfkill, sync_work); in rfkill_sync_work()
1009 cur = rfkill_global_states[rfkill->type].cur; in rfkill_sync_work()
1010 rfkill_set_block(rfkill, cur); in rfkill_sync_work()
1014 int __must_check rfkill_register(struct rfkill *rfkill) in rfkill_register() argument
1017 struct device *dev = &rfkill->dev; in rfkill_register()
1020 BUG_ON(!rfkill); in rfkill_register()
1024 if (rfkill->registered) { in rfkill_register()
1029 rfkill->idx = rfkill_no; in rfkill_register()
1033 list_add_tail(&rfkill->node, &rfkill_list); in rfkill_register()
1039 error = rfkill_led_trigger_register(rfkill); in rfkill_register()
1043 rfkill->registered = true; in rfkill_register()
1045 INIT_DELAYED_WORK(&rfkill->poll_work, rfkill_poll); in rfkill_register()
1046 INIT_WORK(&rfkill->uevent_work, rfkill_uevent_work); in rfkill_register()
1047 INIT_WORK(&rfkill->sync_work, rfkill_sync_work); in rfkill_register()
1049 if (rfkill->ops->poll) in rfkill_register()
1051 &rfkill->poll_work, in rfkill_register()
1054 if (!rfkill->persistent || rfkill_epo_lock_active) { in rfkill_register()
1055 schedule_work(&rfkill->sync_work); in rfkill_register()
1058 bool soft_blocked = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_register()
1061 __rfkill_switch_all(rfkill->type, soft_blocked); in rfkill_register()
1066 rfkill_send_events(rfkill, RFKILL_OP_ADD); in rfkill_register()
1072 device_del(&rfkill->dev); in rfkill_register()
1074 list_del_init(&rfkill->node); in rfkill_register()
1081 void rfkill_unregister(struct rfkill *rfkill) in rfkill_unregister() argument
1083 BUG_ON(!rfkill); in rfkill_unregister()
1085 if (rfkill->ops->poll) in rfkill_unregister()
1086 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_unregister()
1088 cancel_work_sync(&rfkill->uevent_work); in rfkill_unregister()
1089 cancel_work_sync(&rfkill->sync_work); in rfkill_unregister()
1091 rfkill->registered = false; in rfkill_unregister()
1093 device_del(&rfkill->dev); in rfkill_unregister()
1096 rfkill_send_events(rfkill, RFKILL_OP_DEL); in rfkill_unregister()
1097 list_del_init(&rfkill->node); in rfkill_unregister()
1101 rfkill_led_trigger_unregister(rfkill); in rfkill_unregister()
1105 void rfkill_destroy(struct rfkill *rfkill) in rfkill_destroy() argument
1107 if (rfkill) in rfkill_destroy()
1108 put_device(&rfkill->dev); in rfkill_destroy()
1115 struct rfkill *rfkill; in rfkill_fop_open() local
1133 list_for_each_entry(rfkill, &rfkill_list, node) { in rfkill_fop_open()
1137 rfkill_fill_event(&ev->ev, rfkill, RFKILL_OP_ADD); in rfkill_fop_open()
1218 struct rfkill *rfkill; in rfkill_fop_write() local
1243 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_fop_write()
1244 if (rfkill->type == ev.type || in rfkill_fop_write()
1246 rfkill_set_block(rfkill, ev.soft); in rfkill_fop_write()
1250 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_fop_write()
1251 if (rfkill->idx == ev.idx && in rfkill_fop_write()
1252 (rfkill->type == ev.type || in rfkill_fop_write()
1254 rfkill_set_block(rfkill, ev.soft); in rfkill_fop_write()