cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rfkill.h (11008B)


      1/*
      2 * Copyright (C) 2006 - 2007 Ivo van Doorn
      3 * Copyright (C) 2007 Dmitry Torokhov
      4 * Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
      5 *
      6 * Permission to use, copy, modify, and/or distribute this software for any
      7 * purpose with or without fee is hereby granted, provided that the above
      8 * copyright notice and this permission notice appear in all copies.
      9 *
     10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     17 */
     18#ifndef __RFKILL_H
     19#define __RFKILL_H
     20
     21#include <uapi/linux/rfkill.h>
     22
     23/* don't allow anyone to use these in the kernel */
     24enum rfkill_user_states {
     25	RFKILL_USER_STATE_SOFT_BLOCKED	= RFKILL_STATE_SOFT_BLOCKED,
     26	RFKILL_USER_STATE_UNBLOCKED	= RFKILL_STATE_UNBLOCKED,
     27	RFKILL_USER_STATE_HARD_BLOCKED	= RFKILL_STATE_HARD_BLOCKED,
     28};
     29#undef RFKILL_STATE_SOFT_BLOCKED
     30#undef RFKILL_STATE_UNBLOCKED
     31#undef RFKILL_STATE_HARD_BLOCKED
     32
     33#include <linux/kernel.h>
     34#include <linux/list.h>
     35#include <linux/mutex.h>
     36#include <linux/leds.h>
     37#include <linux/err.h>
     38
     39struct device;
     40/* this is opaque */
     41struct rfkill;
     42
     43/**
     44 * struct rfkill_ops - rfkill driver methods
     45 *
     46 * @poll: poll the rfkill block state(s) -- only assign this method
     47 *	when you need polling. When called, simply call one of the
     48 *	rfkill_set{,_hw,_sw}_state family of functions. If the hw
     49 *	is getting unblocked you need to take into account the return
     50 *	value of those functions to make sure the software block is
     51 *	properly used.
     52 * @query: query the rfkill block state(s) and call exactly one of the
     53 *	rfkill_set{,_hw,_sw}_state family of functions. Assign this
     54 *	method if input events can cause hardware state changes to make
     55 *	the rfkill core query your driver before setting a requested
     56 *	block.
     57 * @set_block: turn the transmitter on (blocked == false) or off
     58 *	(blocked == true) -- ignore and return 0 when hard blocked.
     59 *	This callback must be assigned.
     60 */
     61struct rfkill_ops {
     62	void	(*poll)(struct rfkill *rfkill, void *data);
     63	void	(*query)(struct rfkill *rfkill, void *data);
     64	int	(*set_block)(void *data, bool blocked);
     65};
     66
     67#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
     68/**
     69 * rfkill_alloc - Allocate rfkill structure
     70 * @name: name of the struct -- the string is not copied internally
     71 * @parent: device that has rf switch on it
     72 * @type: type of the switch (RFKILL_TYPE_*)
     73 * @ops: rfkill methods
     74 * @ops_data: data passed to each method
     75 *
     76 * This function should be called by the transmitter driver to allocate an
     77 * rfkill structure. Returns %NULL on failure.
     78 */
     79struct rfkill * __must_check rfkill_alloc(const char *name,
     80					  struct device *parent,
     81					  const enum rfkill_type type,
     82					  const struct rfkill_ops *ops,
     83					  void *ops_data);
     84
     85/**
     86 * rfkill_register - Register a rfkill structure.
     87 * @rfkill: rfkill structure to be registered
     88 *
     89 * This function should be called by the transmitter driver to register
     90 * the rfkill structure. Before calling this function the driver needs
     91 * to be ready to service method calls from rfkill.
     92 *
     93 * If rfkill_init_sw_state() is not called before registration,
     94 * set_block() will be called to initialize the software blocked state
     95 * to a default value.
     96 *
     97 * If the hardware blocked state is not set before registration,
     98 * it is assumed to be unblocked.
     99 */
    100int __must_check rfkill_register(struct rfkill *rfkill);
    101
    102/**
    103 * rfkill_pause_polling(struct rfkill *rfkill)
    104 *
    105 * Pause polling -- say transmitter is off for other reasons.
    106 * NOTE: not necessary for suspend/resume -- in that case the
    107 * core stops polling anyway (but will also correctly handle
    108 * the case of polling having been paused before suspend.)
    109 */
    110void rfkill_pause_polling(struct rfkill *rfkill);
    111
    112/**
    113 * rfkill_resume_polling(struct rfkill *rfkill)
    114 *
    115 * Resume polling
    116 * NOTE: not necessary for suspend/resume -- in that case the
    117 * core stops polling anyway
    118 */
    119void rfkill_resume_polling(struct rfkill *rfkill);
    120
    121
    122/**
    123 * rfkill_unregister - Unregister a rfkill structure.
    124 * @rfkill: rfkill structure to be unregistered
    125 *
    126 * This function should be called by the network driver during device
    127 * teardown to destroy rfkill structure. Until it returns, the driver
    128 * needs to be able to service method calls.
    129 */
    130void rfkill_unregister(struct rfkill *rfkill);
    131
    132/**
    133 * rfkill_destroy - Free rfkill structure
    134 * @rfkill: rfkill structure to be destroyed
    135 *
    136 * Destroys the rfkill structure.
    137 */
    138void rfkill_destroy(struct rfkill *rfkill);
    139
    140/**
    141 * rfkill_set_hw_state_reason - Set the internal rfkill hardware block state
    142 *	with a reason
    143 * @rfkill: pointer to the rfkill class to modify.
    144 * @blocked: the current hardware block state to set
    145 * @reason: one of &enum rfkill_hard_block_reasons
    146 *
    147 * Prefer to use rfkill_set_hw_state if you don't need any special reason.
    148 */
    149bool rfkill_set_hw_state_reason(struct rfkill *rfkill,
    150				bool blocked, unsigned long reason);
    151/**
    152 * rfkill_set_hw_state - Set the internal rfkill hardware block state
    153 * @rfkill: pointer to the rfkill class to modify.
    154 * @blocked: the current hardware block state to set
    155 *
    156 * rfkill drivers that get events when the hard-blocked state changes
    157 * use this function to notify the rfkill core (and through that also
    158 * userspace) of the current state.  They should also use this after
    159 * resume if the state could have changed.
    160 *
    161 * You need not (but may) call this function if poll_state is assigned.
    162 *
    163 * This function can be called in any context, even from within rfkill
    164 * callbacks.
    165 *
    166 * The function returns the combined block state (true if transmitter
    167 * should be blocked) so that drivers need not keep track of the soft
    168 * block state -- which they might not be able to.
    169 */
    170static inline bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked)
    171{
    172	return rfkill_set_hw_state_reason(rfkill, blocked,
    173					  RFKILL_HARD_BLOCK_SIGNAL);
    174}
    175
    176/**
    177 * rfkill_set_sw_state - Set the internal rfkill software block state
    178 * @rfkill: pointer to the rfkill class to modify.
    179 * @blocked: the current software block state to set
    180 *
    181 * rfkill drivers that get events when the soft-blocked state changes
    182 * (yes, some platforms directly act on input but allow changing again)
    183 * use this function to notify the rfkill core (and through that also
    184 * userspace) of the current state.
    185 *
    186 * Drivers should also call this function after resume if the state has
    187 * been changed by the user.  This only makes sense for "persistent"
    188 * devices (see rfkill_init_sw_state()).
    189 *
    190 * This function can be called in any context, even from within rfkill
    191 * callbacks.
    192 *
    193 * The function returns the combined block state (true if transmitter
    194 * should be blocked).
    195 */
    196bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked);
    197
    198/**
    199 * rfkill_init_sw_state - Initialize persistent software block state
    200 * @rfkill: pointer to the rfkill class to modify.
    201 * @blocked: the current software block state to set
    202 *
    203 * rfkill drivers that preserve their software block state over power off
    204 * use this function to notify the rfkill core (and through that also
    205 * userspace) of their initial state.  It should only be used before
    206 * registration.
    207 *
    208 * In addition, it marks the device as "persistent", an attribute which
    209 * can be read by userspace.  Persistent devices are expected to preserve
    210 * their own state when suspended.
    211 */
    212void rfkill_init_sw_state(struct rfkill *rfkill, bool blocked);
    213
    214/**
    215 * rfkill_set_states - Set the internal rfkill block states
    216 * @rfkill: pointer to the rfkill class to modify.
    217 * @sw: the current software block state to set
    218 * @hw: the current hardware block state to set
    219 *
    220 * This function can be called in any context, even from within rfkill
    221 * callbacks.
    222 */
    223void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw);
    224
    225/**
    226 * rfkill_blocked - Query rfkill block state
    227 *
    228 * @rfkill: rfkill struct to query
    229 */
    230bool rfkill_blocked(struct rfkill *rfkill);
    231
    232/**
    233 * rfkill_soft_blocked - Query soft rfkill block state
    234 *
    235 * @rfkill: rfkill struct to query
    236 */
    237bool rfkill_soft_blocked(struct rfkill *rfkill);
    238
    239/**
    240 * rfkill_find_type - Helper for finding rfkill type by name
    241 * @name: the name of the type
    242 *
    243 * Returns enum rfkill_type that corresponds to the name.
    244 */
    245enum rfkill_type rfkill_find_type(const char *name);
    246
    247#else /* !RFKILL */
    248static inline struct rfkill * __must_check
    249rfkill_alloc(const char *name,
    250	     struct device *parent,
    251	     const enum rfkill_type type,
    252	     const struct rfkill_ops *ops,
    253	     void *ops_data)
    254{
    255	return ERR_PTR(-ENODEV);
    256}
    257
    258static inline int __must_check rfkill_register(struct rfkill *rfkill)
    259{
    260	if (rfkill == ERR_PTR(-ENODEV))
    261		return 0;
    262	return -EINVAL;
    263}
    264
    265static inline void rfkill_pause_polling(struct rfkill *rfkill)
    266{
    267}
    268
    269static inline void rfkill_resume_polling(struct rfkill *rfkill)
    270{
    271}
    272
    273static inline void rfkill_unregister(struct rfkill *rfkill)
    274{
    275}
    276
    277static inline void rfkill_destroy(struct rfkill *rfkill)
    278{
    279}
    280
    281static inline bool rfkill_set_hw_state_reason(struct rfkill *rfkill,
    282					      bool blocked,
    283					      unsigned long reason)
    284{
    285	return blocked;
    286}
    287
    288static inline bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked)
    289{
    290	return blocked;
    291}
    292
    293static inline bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked)
    294{
    295	return blocked;
    296}
    297
    298static inline void rfkill_init_sw_state(struct rfkill *rfkill, bool blocked)
    299{
    300}
    301
    302static inline void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw)
    303{
    304}
    305
    306static inline bool rfkill_blocked(struct rfkill *rfkill)
    307{
    308	return false;
    309}
    310
    311static inline bool rfkill_soft_blocked(struct rfkill *rfkill)
    312{
    313	return false;
    314}
    315
    316static inline enum rfkill_type rfkill_find_type(const char *name)
    317{
    318	return RFKILL_TYPE_ALL;
    319}
    320
    321#endif /* RFKILL || RFKILL_MODULE */
    322
    323
    324#ifdef CONFIG_RFKILL_LEDS
    325/**
    326 * rfkill_get_led_trigger_name - Get the LED trigger name for the button's LED.
    327 * This function might return a NULL pointer if registering of the
    328 * LED trigger failed. Use this as "default_trigger" for the LED.
    329 */
    330const char *rfkill_get_led_trigger_name(struct rfkill *rfkill);
    331
    332/**
    333 * rfkill_set_led_trigger_name - Set the LED trigger name
    334 * @rfkill: rfkill struct
    335 * @name: LED trigger name
    336 *
    337 * This function sets the LED trigger name of the radio LED
    338 * trigger that rfkill creates. It is optional, but if called
    339 * must be called before rfkill_register() to be effective.
    340 */
    341void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name);
    342#else
    343static inline const char *rfkill_get_led_trigger_name(struct rfkill *rfkill)
    344{
    345	return NULL;
    346}
    347
    348static inline void
    349rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name)
    350{
    351}
    352#endif
    353
    354#endif /* RFKILL_H */