Skip to content

Commit

Permalink
net: rfkill: add rfkill_find_type function
Browse files Browse the repository at this point in the history
Helper for finding the type based on name. Useful if the
type needs to be determined based on device property.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
[modify rfkill_types array and BUILD_BUG_ON to not cause errors]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Heikki Krogerus authored and Johannes Berg committed Feb 24, 2016
1 parent 7837a77 commit 648b50d
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 28 deletions.
15 changes: 15 additions & 0 deletions include/linux/rfkill.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,15 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw);
* @rfkill: rfkill struct to query
*/
bool rfkill_blocked(struct rfkill *rfkill);

/**
* rfkill_find_type - Helpper for finding rfkill type by name
* @name: the name of the type
*
* Returns enum rfkill_type that conrresponds the name.
*/
enum rfkill_type rfkill_find_type(const char *name);

#else /* !RFKILL */
static inline struct rfkill * __must_check
rfkill_alloc(const char *name,
Expand Down Expand Up @@ -269,6 +278,12 @@ static inline bool rfkill_blocked(struct rfkill *rfkill)
{
return false;
}

static inline enum rfkill_type rfkill_find_type(const char *name)
{
return RFKILL_TYPE_ALL;
}

#endif /* RFKILL || RFKILL_MODULE */


Expand Down
58 changes: 30 additions & 28 deletions net/rfkill/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,34 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw)
}
EXPORT_SYMBOL(rfkill_set_states);

static const char * const rfkill_types[] = {
NULL, /* RFKILL_TYPE_ALL */
"wlan",
"bluetooth",
"ultrawideband",
"wimax",
"wwan",
"gps",
"fm",
"nfc",
};

enum rfkill_type rfkill_find_type(const char *name)
{
int i;

BUILD_BUG_ON(ARRAY_SIZE(rfkill_types) != NUM_RFKILL_TYPES);

if (!name)
return RFKILL_TYPE_ALL;

for (i = 1; i < NUM_RFKILL_TYPES; i++)
if (!strcmp(name, rfkill_types[i]))
return i;
return RFKILL_TYPE_ALL;
}
EXPORT_SYMBOL(rfkill_find_type);

static ssize_t name_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
Expand All @@ -581,38 +609,12 @@ static ssize_t name_show(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR_RO(name);

static const char *rfkill_get_type_str(enum rfkill_type type)
{
BUILD_BUG_ON(NUM_RFKILL_TYPES != RFKILL_TYPE_NFC + 1);

switch (type) {
case RFKILL_TYPE_WLAN:
return "wlan";
case RFKILL_TYPE_BLUETOOTH:
return "bluetooth";
case RFKILL_TYPE_UWB:
return "ultrawideband";
case RFKILL_TYPE_WIMAX:
return "wimax";
case RFKILL_TYPE_WWAN:
return "wwan";
case RFKILL_TYPE_GPS:
return "gps";
case RFKILL_TYPE_FM:
return "fm";
case RFKILL_TYPE_NFC:
return "nfc";
default:
BUG();
}
}

static ssize_t type_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct rfkill *rfkill = to_rfkill(dev);

return sprintf(buf, "%s\n", rfkill_get_type_str(rfkill->type));
return sprintf(buf, "%s\n", rfkill_types[rfkill->type]);
}
static DEVICE_ATTR_RO(type);

Expand Down Expand Up @@ -750,7 +752,7 @@ static int rfkill_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
if (error)
return error;
error = add_uevent_var(env, "RFKILL_TYPE=%s",
rfkill_get_type_str(rfkill->type));
rfkill_types[rfkill->type]);
if (error)
return error;
spin_lock_irqsave(&rfkill->lock, flags);
Expand Down

0 comments on commit 648b50d

Please sign in to comment.