diff options
Diffstat (limited to 'drivers/platform/x86/xo1-rfkill.c')
| -rw-r--r-- | drivers/platform/x86/xo1-rfkill.c | 33 | 
1 files changed, 16 insertions, 17 deletions
diff --git a/drivers/platform/x86/xo1-rfkill.c b/drivers/platform/x86/xo1-rfkill.c index e549eeeda12..4bd17248dfc 100644 --- a/drivers/platform/x86/xo1-rfkill.c +++ b/drivers/platform/x86/xo1-rfkill.c @@ -12,25 +12,35 @@  #include <linux/module.h>  #include <linux/platform_device.h>  #include <linux/rfkill.h> +#include <linux/olpc-ec.h> -#include <asm/olpc.h> +static bool card_blocked;  static int rfkill_set_block(void *data, bool blocked)  {  	unsigned char cmd; +	int r; + +	if (blocked == card_blocked) +		return 0; +  	if (blocked)  		cmd = EC_WLAN_ENTER_RESET;  	else  		cmd = EC_WLAN_LEAVE_RESET; -	return olpc_ec_cmd(cmd, NULL, 0, NULL, 0); +	r = olpc_ec_cmd(cmd, NULL, 0, NULL, 0); +	if (r == 0) +		card_blocked = blocked; + +	return r;  }  static const struct rfkill_ops rfkill_ops = {  	.set_block = rfkill_set_block,  }; -static int __devinit xo1_rfkill_probe(struct platform_device *pdev) +static int xo1_rfkill_probe(struct platform_device *pdev)  {  	struct rfkill *rfk;  	int r; @@ -50,7 +60,7 @@ static int __devinit xo1_rfkill_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit xo1_rfkill_remove(struct platform_device *pdev) +static int xo1_rfkill_remove(struct platform_device *pdev)  {  	struct rfkill *rfk = platform_get_drvdata(pdev);  	rfkill_unregister(rfk); @@ -64,22 +74,11 @@ static struct platform_driver xo1_rfkill_driver = {  		.owner = THIS_MODULE,  	},  	.probe		= xo1_rfkill_probe, -	.remove		= __devexit_p(xo1_rfkill_remove), +	.remove		= xo1_rfkill_remove,  }; -static int __init xo1_rfkill_init(void) -{ -	return platform_driver_register(&xo1_rfkill_driver); -} - -static void __exit xo1_rfkill_exit(void) -{ -	platform_driver_unregister(&xo1_rfkill_driver); -} +module_platform_driver(xo1_rfkill_driver);  MODULE_AUTHOR("Daniel Drake <dsd@laptop.org>");  MODULE_LICENSE("GPL");  MODULE_ALIAS("platform:xo1-rfkill"); - -module_init(xo1_rfkill_init); -module_exit(xo1_rfkill_exit);  | 
