1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Linux RFKILL support for RTL8187 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2009 Herton Ronaldo Krzesinski <herton@mandriva.com.br> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Based on the RFKILL handling in the r8187 driver, which is: 8*4882a593Smuzhiyun * Copyright (c) Realtek Semiconductor Corp. All rights reserved. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Thanks to Realtek for their support! 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/types.h> 14*4882a593Smuzhiyun #include <linux/usb.h> 15*4882a593Smuzhiyun #include <net/mac80211.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include "rtl8187.h" 18*4882a593Smuzhiyun #include "rfkill.h" 19*4882a593Smuzhiyun rtl8187_is_radio_enabled(struct rtl8187_priv * priv)20*4882a593Smuzhiyunstatic bool rtl8187_is_radio_enabled(struct rtl8187_priv *priv) 21*4882a593Smuzhiyun { 22*4882a593Smuzhiyun u8 gpio; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun gpio = rtl818x_ioread8(priv, &priv->map->GPIO0); 25*4882a593Smuzhiyun rtl818x_iowrite8(priv, &priv->map->GPIO0, gpio & ~priv->rfkill_mask); 26*4882a593Smuzhiyun gpio = rtl818x_ioread8(priv, &priv->map->GPIO1); 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun return gpio & priv->rfkill_mask; 29*4882a593Smuzhiyun } 30*4882a593Smuzhiyun rtl8187_rfkill_init(struct ieee80211_hw * hw)31*4882a593Smuzhiyunvoid rtl8187_rfkill_init(struct ieee80211_hw *hw) 32*4882a593Smuzhiyun { 33*4882a593Smuzhiyun struct rtl8187_priv *priv = hw->priv; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun priv->rfkill_off = rtl8187_is_radio_enabled(priv); 36*4882a593Smuzhiyun printk(KERN_INFO "rtl8187: wireless switch is %s\n", 37*4882a593Smuzhiyun priv->rfkill_off ? "on" : "off"); 38*4882a593Smuzhiyun wiphy_rfkill_set_hw_state(hw->wiphy, !priv->rfkill_off); 39*4882a593Smuzhiyun wiphy_rfkill_start_polling(hw->wiphy); 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun rtl8187_rfkill_poll(struct ieee80211_hw * hw)42*4882a593Smuzhiyunvoid rtl8187_rfkill_poll(struct ieee80211_hw *hw) 43*4882a593Smuzhiyun { 44*4882a593Smuzhiyun bool enabled; 45*4882a593Smuzhiyun struct rtl8187_priv *priv = hw->priv; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun mutex_lock(&priv->conf_mutex); 48*4882a593Smuzhiyun enabled = rtl8187_is_radio_enabled(priv); 49*4882a593Smuzhiyun if (unlikely(enabled != priv->rfkill_off)) { 50*4882a593Smuzhiyun priv->rfkill_off = enabled; 51*4882a593Smuzhiyun printk(KERN_INFO "rtl8187: wireless radio switch turned %s\n", 52*4882a593Smuzhiyun enabled ? "on" : "off"); 53*4882a593Smuzhiyun wiphy_rfkill_set_hw_state(hw->wiphy, !enabled); 54*4882a593Smuzhiyun } 55*4882a593Smuzhiyun mutex_unlock(&priv->conf_mutex); 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun rtl8187_rfkill_exit(struct ieee80211_hw * hw)58*4882a593Smuzhiyunvoid rtl8187_rfkill_exit(struct ieee80211_hw *hw) 59*4882a593Smuzhiyun { 60*4882a593Smuzhiyun wiphy_rfkill_stop_polling(hw->wiphy); 61*4882a593Smuzhiyun } 62