• Home
  • Raw
  • Download

Lines Matching full:rfkill

15 #include <linux/rfkill.h>
25 #include "rfkill.h"
37 struct rfkill { struct
67 #define to_rfkill(d) container_of(d, struct rfkill, dev) argument
92 * the rfkill struct under their own lock, and take this lock during
93 * rfkill method calls -- which will cause an AB-BA deadlock situation.
102 static LIST_HEAD(rfkill_fds); /* list of open fds of /dev/rfkill */
117 static void rfkill_led_trigger_event(struct rfkill *rfkill) in rfkill_led_trigger_event() argument
121 if (!rfkill->registered) in rfkill_led_trigger_event()
124 trigger = &rfkill->led_trigger; in rfkill_led_trigger_event()
126 if (rfkill->state & RFKILL_BLOCK_ANY) in rfkill_led_trigger_event()
134 struct rfkill *rfkill; in rfkill_led_trigger_activate() local
136 rfkill = container_of(led->trigger, struct rfkill, led_trigger); in rfkill_led_trigger_activate()
138 rfkill_led_trigger_event(rfkill); in rfkill_led_trigger_activate()
143 const char *rfkill_get_led_trigger_name(struct rfkill *rfkill) in rfkill_get_led_trigger_name() argument
145 return rfkill->led_trigger.name; in rfkill_get_led_trigger_name()
149 void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name) in rfkill_set_led_trigger_name() argument
151 BUG_ON(!rfkill); in rfkill_set_led_trigger_name()
153 rfkill->ledtrigname = name; in rfkill_set_led_trigger_name()
157 static int rfkill_led_trigger_register(struct rfkill *rfkill) in rfkill_led_trigger_register() argument
159 rfkill->led_trigger.name = rfkill->ledtrigname in rfkill_led_trigger_register()
160 ? : dev_name(&rfkill->dev); in rfkill_led_trigger_register()
161 rfkill->led_trigger.activate = rfkill_led_trigger_activate; in rfkill_led_trigger_register()
162 return led_trigger_register(&rfkill->led_trigger); in rfkill_led_trigger_register()
165 static void rfkill_led_trigger_unregister(struct rfkill *rfkill) in rfkill_led_trigger_unregister() argument
167 led_trigger_unregister(&rfkill->led_trigger); in rfkill_led_trigger_unregister()
177 struct rfkill *rfkill; in rfkill_global_led_trigger_worker() local
180 list_for_each_entry(rfkill, &rfkill_list, node) { in rfkill_global_led_trigger_worker()
181 if (!(rfkill->state & RFKILL_BLOCK_ANY)) { in rfkill_global_led_trigger_worker()
205 rfkill_any_led_trigger.name = "rfkill-any"; in rfkill_global_led_trigger_register()
210 rfkill_none_led_trigger.name = "rfkill-none"; in rfkill_global_led_trigger_register()
228 static void rfkill_led_trigger_event(struct rfkill *rfkill) in rfkill_led_trigger_event() argument
232 static inline int rfkill_led_trigger_register(struct rfkill *rfkill) in rfkill_led_trigger_register() argument
237 static inline void rfkill_led_trigger_unregister(struct rfkill *rfkill) in rfkill_led_trigger_unregister() argument
255 static void rfkill_fill_event(struct rfkill_event *ev, struct rfkill *rfkill, in rfkill_fill_event() argument
260 ev->idx = rfkill->idx; in rfkill_fill_event()
261 ev->type = rfkill->type; in rfkill_fill_event()
264 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_fill_event()
265 ev->hard = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_fill_event()
266 ev->soft = !!(rfkill->state & (RFKILL_BLOCK_SW | in rfkill_fill_event()
268 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_fill_event()
271 static void rfkill_send_events(struct rfkill *rfkill, enum rfkill_operation op) in rfkill_send_events() argument
280 rfkill_fill_event(&ev->ev, rfkill, op); in rfkill_send_events()
288 static void rfkill_event(struct rfkill *rfkill) in rfkill_event() argument
290 if (!rfkill->registered) in rfkill_event()
293 kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE); in rfkill_event()
295 /* also send event to /dev/rfkill */ in rfkill_event()
296 rfkill_send_events(rfkill, RFKILL_OP_CHANGE); in rfkill_event()
302 * @rfkill: the rfkill struct to use
308 static void rfkill_set_block(struct rfkill *rfkill, bool blocked) in rfkill_set_block() argument
314 if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP)) in rfkill_set_block()
322 if (rfkill->ops->query) in rfkill_set_block()
323 rfkill->ops->query(rfkill, rfkill->data); in rfkill_set_block()
325 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_block()
326 prev = rfkill->state & RFKILL_BLOCK_SW; in rfkill_set_block()
329 rfkill->state |= RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
331 rfkill->state &= ~RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
334 rfkill->state |= RFKILL_BLOCK_SW; in rfkill_set_block()
336 rfkill->state &= ~RFKILL_BLOCK_SW; in rfkill_set_block()
338 rfkill->state |= RFKILL_BLOCK_SW_SETCALL; in rfkill_set_block()
339 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_block()
341 err = rfkill->ops->set_block(rfkill->data, blocked); in rfkill_set_block()
343 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_block()
350 if (rfkill->state & RFKILL_BLOCK_SW_PREV) in rfkill_set_block()
351 rfkill->state |= RFKILL_BLOCK_SW; in rfkill_set_block()
353 rfkill->state &= ~RFKILL_BLOCK_SW; in rfkill_set_block()
355 rfkill->state &= ~RFKILL_BLOCK_SW_SETCALL; in rfkill_set_block()
356 rfkill->state &= ~RFKILL_BLOCK_SW_PREV; in rfkill_set_block()
357 curr = rfkill->state & RFKILL_BLOCK_SW; in rfkill_set_block()
358 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_block()
360 rfkill_led_trigger_event(rfkill); in rfkill_set_block()
364 rfkill_event(rfkill); in rfkill_set_block()
395 struct rfkill *rfkill; in __rfkill_switch_all() local
398 list_for_each_entry(rfkill, &rfkill_list, node) { in __rfkill_switch_all()
399 if (rfkill->type != type && type != RFKILL_TYPE_ALL) in __rfkill_switch_all()
402 rfkill_set_block(rfkill, blocked); in __rfkill_switch_all()
432 * This kicks all non-suspended rfkill devices to RFKILL_STATE_SOFT_BLOCKED,
433 * ignoring everything in its path but rfkill_global_mutex and rfkill->mutex.
440 struct rfkill *rfkill; in rfkill_epo() local
449 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_epo()
450 rfkill_set_block(rfkill, true); in rfkill_epo()
485 * Used by rfkill-input manually unlock state changes, when
525 bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) in rfkill_set_hw_state() argument
530 BUG_ON(!rfkill); in rfkill_set_hw_state()
532 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_hw_state()
533 prev = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_hw_state()
535 rfkill->state |= RFKILL_BLOCK_HW; in rfkill_set_hw_state()
537 rfkill->state &= ~RFKILL_BLOCK_HW; in rfkill_set_hw_state()
538 ret = !!(rfkill->state & RFKILL_BLOCK_ANY); in rfkill_set_hw_state()
539 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_hw_state()
541 rfkill_led_trigger_event(rfkill); in rfkill_set_hw_state()
544 if (rfkill->registered && prev != blocked) in rfkill_set_hw_state()
545 schedule_work(&rfkill->uevent_work); in rfkill_set_hw_state()
551 static void __rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) in __rfkill_set_sw_state() argument
556 if (rfkill->state & RFKILL_BLOCK_SW_SETCALL) in __rfkill_set_sw_state()
560 rfkill->state |= bit; in __rfkill_set_sw_state()
562 rfkill->state &= ~bit; in __rfkill_set_sw_state()
565 bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) in rfkill_set_sw_state() argument
570 BUG_ON(!rfkill); in rfkill_set_sw_state()
572 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_sw_state()
573 prev = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_set_sw_state()
574 __rfkill_set_sw_state(rfkill, blocked); in rfkill_set_sw_state()
575 hwblock = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_sw_state()
577 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_sw_state()
579 if (!rfkill->registered) in rfkill_set_sw_state()
583 schedule_work(&rfkill->uevent_work); in rfkill_set_sw_state()
585 rfkill_led_trigger_event(rfkill); in rfkill_set_sw_state()
592 void rfkill_init_sw_state(struct rfkill *rfkill, bool blocked) in rfkill_init_sw_state() argument
596 BUG_ON(!rfkill); in rfkill_init_sw_state()
597 BUG_ON(rfkill->registered); in rfkill_init_sw_state()
599 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_init_sw_state()
600 __rfkill_set_sw_state(rfkill, blocked); in rfkill_init_sw_state()
601 rfkill->persistent = true; in rfkill_init_sw_state()
602 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_init_sw_state()
606 void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) in rfkill_set_states() argument
611 BUG_ON(!rfkill); in rfkill_set_states()
613 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_set_states()
619 swprev = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_set_states()
620 hwprev = !!(rfkill->state & RFKILL_BLOCK_HW); in rfkill_set_states()
621 __rfkill_set_sw_state(rfkill, sw); in rfkill_set_states()
623 rfkill->state |= RFKILL_BLOCK_HW; in rfkill_set_states()
625 rfkill->state &= ~RFKILL_BLOCK_HW; in rfkill_set_states()
627 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_set_states()
629 if (!rfkill->registered) { in rfkill_set_states()
630 rfkill->persistent = true; in rfkill_set_states()
633 schedule_work(&rfkill->uevent_work); in rfkill_set_states()
635 rfkill_led_trigger_event(rfkill); in rfkill_set_states()
672 struct rfkill *rfkill = to_rfkill(dev); in name_show() local
674 return sprintf(buf, "%s\n", rfkill->name); in name_show()
681 struct rfkill *rfkill = to_rfkill(dev); in type_show() local
683 return sprintf(buf, "%s\n", rfkill_types[rfkill->type]); in type_show()
690 struct rfkill *rfkill = to_rfkill(dev); in index_show() local
692 return sprintf(buf, "%d\n", rfkill->idx); in index_show()
699 struct rfkill *rfkill = to_rfkill(dev); in persistent_show() local
701 return sprintf(buf, "%d\n", rfkill->persistent); in persistent_show()
708 struct rfkill *rfkill = to_rfkill(dev); in hard_show() local
710 return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_HW) ? 1 : 0 ); in hard_show()
717 struct rfkill *rfkill = to_rfkill(dev); in soft_show() local
719 return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_SW) ? 1 : 0 ); in soft_show()
725 struct rfkill *rfkill = to_rfkill(dev); in soft_store() local
740 rfkill_set_block(rfkill, state); in soft_store()
760 struct rfkill *rfkill = to_rfkill(dev); in state_show() local
762 return sprintf(buf, "%d\n", user_state_from_blocked(rfkill->state)); in state_show()
768 struct rfkill *rfkill = to_rfkill(dev); in state_store() local
784 rfkill_set_block(rfkill, state == RFKILL_USER_STATE_SOFT_BLOCKED); in state_store()
805 struct rfkill *rfkill = to_rfkill(dev); in rfkill_release() local
807 kfree(rfkill); in rfkill_release()
812 struct rfkill *rfkill = to_rfkill(dev); in rfkill_dev_uevent() local
817 error = add_uevent_var(env, "RFKILL_NAME=%s", rfkill->name); in rfkill_dev_uevent()
821 rfkill_types[rfkill->type]); in rfkill_dev_uevent()
824 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_dev_uevent()
825 state = rfkill->state; in rfkill_dev_uevent()
826 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_dev_uevent()
832 void rfkill_pause_polling(struct rfkill *rfkill) in rfkill_pause_polling() argument
834 BUG_ON(!rfkill); in rfkill_pause_polling()
836 if (!rfkill->ops->poll) in rfkill_pause_polling()
839 rfkill->polling_paused = true; in rfkill_pause_polling()
840 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_pause_polling()
844 void rfkill_resume_polling(struct rfkill *rfkill) in rfkill_resume_polling() argument
846 BUG_ON(!rfkill); in rfkill_resume_polling()
848 if (!rfkill->ops->poll) in rfkill_resume_polling()
851 rfkill->polling_paused = false; in rfkill_resume_polling()
853 if (rfkill->suspended) in rfkill_resume_polling()
857 &rfkill->poll_work, 0); in rfkill_resume_polling()
864 struct rfkill *rfkill = to_rfkill(dev); in rfkill_suspend() local
866 rfkill->suspended = true; in rfkill_suspend()
867 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_suspend()
874 struct rfkill *rfkill = to_rfkill(dev); in rfkill_resume() local
877 rfkill->suspended = false; in rfkill_resume()
879 if (!rfkill->registered) in rfkill_resume()
882 if (!rfkill->persistent) { in rfkill_resume()
883 cur = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_resume()
884 rfkill_set_block(rfkill, cur); in rfkill_resume()
887 if (rfkill->ops->poll && !rfkill->polling_paused) in rfkill_resume()
889 &rfkill->poll_work, 0); in rfkill_resume()
901 .name = "rfkill",
908 bool rfkill_blocked(struct rfkill *rfkill) in rfkill_blocked() argument
913 spin_lock_irqsave(&rfkill->lock, flags); in rfkill_blocked()
914 state = rfkill->state; in rfkill_blocked()
915 spin_unlock_irqrestore(&rfkill->lock, flags); in rfkill_blocked()
922 struct rfkill * __must_check rfkill_alloc(const char *name, in rfkill_alloc()
928 struct rfkill *rfkill; in rfkill_alloc() local
943 rfkill = kzalloc(sizeof(*rfkill) + strlen(name) + 1, GFP_KERNEL); in rfkill_alloc()
944 if (!rfkill) in rfkill_alloc()
947 spin_lock_init(&rfkill->lock); in rfkill_alloc()
948 INIT_LIST_HEAD(&rfkill->node); in rfkill_alloc()
949 rfkill->type = type; in rfkill_alloc()
950 strcpy(rfkill->name, name); in rfkill_alloc()
951 rfkill->ops = ops; in rfkill_alloc()
952 rfkill->data = ops_data; in rfkill_alloc()
954 dev = &rfkill->dev; in rfkill_alloc()
959 return rfkill; in rfkill_alloc()
965 struct rfkill *rfkill; in rfkill_poll() local
967 rfkill = container_of(work, struct rfkill, poll_work.work); in rfkill_poll()
974 rfkill->ops->poll(rfkill, rfkill->data); in rfkill_poll()
977 &rfkill->poll_work, in rfkill_poll()
983 struct rfkill *rfkill; in rfkill_uevent_work() local
985 rfkill = container_of(work, struct rfkill, uevent_work); in rfkill_uevent_work()
988 rfkill_event(rfkill); in rfkill_uevent_work()
994 struct rfkill *rfkill; in rfkill_sync_work() local
997 rfkill = container_of(work, struct rfkill, sync_work); in rfkill_sync_work()
1000 cur = rfkill_global_states[rfkill->type].cur; in rfkill_sync_work()
1001 rfkill_set_block(rfkill, cur); in rfkill_sync_work()
1005 int __must_check rfkill_register(struct rfkill *rfkill) in rfkill_register() argument
1011 if (!rfkill) in rfkill_register()
1014 dev = &rfkill->dev; in rfkill_register()
1018 if (rfkill->registered) { in rfkill_register()
1023 rfkill->idx = rfkill_no; in rfkill_register()
1024 dev_set_name(dev, "rfkill%lu", rfkill_no); in rfkill_register()
1027 list_add_tail(&rfkill->node, &rfkill_list); in rfkill_register()
1033 error = rfkill_led_trigger_register(rfkill); in rfkill_register()
1037 rfkill->registered = true; in rfkill_register()
1039 INIT_DELAYED_WORK(&rfkill->poll_work, rfkill_poll); in rfkill_register()
1040 INIT_WORK(&rfkill->uevent_work, rfkill_uevent_work); in rfkill_register()
1041 INIT_WORK(&rfkill->sync_work, rfkill_sync_work); in rfkill_register()
1043 if (rfkill->ops->poll) in rfkill_register()
1045 &rfkill->poll_work, in rfkill_register()
1048 if (!rfkill->persistent || rfkill_epo_lock_active) { in rfkill_register()
1049 schedule_work(&rfkill->sync_work); in rfkill_register()
1052 bool soft_blocked = !!(rfkill->state & RFKILL_BLOCK_SW); in rfkill_register()
1055 __rfkill_switch_all(rfkill->type, soft_blocked); in rfkill_register()
1060 rfkill_send_events(rfkill, RFKILL_OP_ADD); in rfkill_register()
1066 device_del(&rfkill->dev); in rfkill_register()
1068 list_del_init(&rfkill->node); in rfkill_register()
1075 void rfkill_unregister(struct rfkill *rfkill) in rfkill_unregister() argument
1077 BUG_ON(!rfkill); in rfkill_unregister()
1079 if (rfkill->ops->poll) in rfkill_unregister()
1080 cancel_delayed_work_sync(&rfkill->poll_work); in rfkill_unregister()
1082 cancel_work_sync(&rfkill->uevent_work); in rfkill_unregister()
1083 cancel_work_sync(&rfkill->sync_work); in rfkill_unregister()
1085 rfkill->registered = false; in rfkill_unregister()
1087 device_del(&rfkill->dev); in rfkill_unregister()
1090 rfkill_send_events(rfkill, RFKILL_OP_DEL); in rfkill_unregister()
1091 list_del_init(&rfkill->node); in rfkill_unregister()
1095 rfkill_led_trigger_unregister(rfkill); in rfkill_unregister()
1099 void rfkill_destroy(struct rfkill *rfkill) in rfkill_destroy() argument
1101 if (rfkill) in rfkill_destroy()
1102 put_device(&rfkill->dev); in rfkill_destroy()
1109 struct rfkill *rfkill; in rfkill_fop_open() local
1127 list_for_each_entry(rfkill, &rfkill_list, node) { in rfkill_fop_open()
1131 rfkill_fill_event(&ev->ev, rfkill, RFKILL_OP_ADD); in rfkill_fop_open()
1212 struct rfkill *rfkill; in rfkill_fop_write() local
1237 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_fop_write()
1238 if (rfkill->type == ev.type || in rfkill_fop_write()
1240 rfkill_set_block(rfkill, ev.soft); in rfkill_fop_write()
1244 list_for_each_entry(rfkill, &rfkill_list, node) in rfkill_fop_write()
1245 if (rfkill->idx == ev.idx && in rfkill_fop_write()
1246 (rfkill->type == ev.type || in rfkill_fop_write()
1248 rfkill_set_block(rfkill, ev.soft); in rfkill_fop_write()
1277 printk(KERN_DEBUG "rfkill: input handler enabled\n"); in rfkill_fop_release()
1301 printk(KERN_DEBUG "rfkill: input handler disabled\n"); in rfkill_fop_ioctl()
1325 #define RFKILL_NAME "rfkill"