2010-10-05 18:55:21 +04:00
/*
* Support for rfkill through the OLPC XO - 1 laptop embedded controller
*
* Copyright ( C ) 2010 One Laptop per Child
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# include <linux/module.h>
# include <linux/platform_device.h>
# include <linux/rfkill.h>
2012-07-11 12:16:29 +04:00
# include <linux/olpc-ec.h>
2010-10-05 18:55:21 +04:00
2012-04-18 21:08:21 +04:00
static bool card_blocked ;
2010-10-05 18:55:21 +04:00
static int rfkill_set_block ( void * data , bool blocked )
{
unsigned char cmd ;
2012-04-18 21:08:21 +04:00
int r ;
if ( blocked = = card_blocked )
return 0 ;
2010-10-05 18:55:21 +04:00
if ( blocked )
cmd = EC_WLAN_ENTER_RESET ;
else
cmd = EC_WLAN_LEAVE_RESET ;
2012-04-18 21:08:21 +04:00
r = olpc_ec_cmd ( cmd , NULL , 0 , NULL , 0 ) ;
if ( r = = 0 )
card_blocked = blocked ;
return r ;
2010-10-05 18:55:21 +04:00
}
static const struct rfkill_ops rfkill_ops = {
. set_block = rfkill_set_block ,
} ;
2012-12-22 01:18:33 +04:00
static int xo1_rfkill_probe ( struct platform_device * pdev )
2010-10-05 18:55:21 +04:00
{
struct rfkill * rfk ;
int r ;
rfk = rfkill_alloc ( pdev - > name , & pdev - > dev , RFKILL_TYPE_WLAN ,
& rfkill_ops , NULL ) ;
if ( ! rfk )
return - ENOMEM ;
r = rfkill_register ( rfk ) ;
if ( r ) {
rfkill_destroy ( rfk ) ;
return r ;
}
platform_set_drvdata ( pdev , rfk ) ;
return 0 ;
}
2012-12-22 01:18:33 +04:00
static int xo1_rfkill_remove ( struct platform_device * pdev )
2010-10-05 18:55:21 +04:00
{
struct rfkill * rfk = platform_get_drvdata ( pdev ) ;
rfkill_unregister ( rfk ) ;
rfkill_destroy ( rfk ) ;
return 0 ;
}
static struct platform_driver xo1_rfkill_driver = {
. driver = {
. name = " xo1-rfkill " ,
} ,
. probe = xo1_rfkill_probe ,
2012-12-22 01:18:33 +04:00
. remove = xo1_rfkill_remove ,
2010-10-05 18:55:21 +04:00
} ;
2011-11-26 08:14:37 +04:00
module_platform_driver ( xo1_rfkill_driver ) ;
2010-10-05 18:55:21 +04:00
MODULE_AUTHOR ( " Daniel Drake <dsd@laptop.org> " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS ( " platform:xo1-rfkill " ) ;