2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2010-10-05 15:55:21 +01:00
/*
* Support for rfkill through the OLPC XO - 1 laptop embedded controller
*
* Copyright ( C ) 2010 One Laptop per Child
*/
# include <linux/module.h>
# include <linux/platform_device.h>
# include <linux/rfkill.h>
2012-07-11 01:16:29 -07:00
# include <linux/olpc-ec.h>
2010-10-05 15:55:21 +01:00
2012-04-18 18:08:21 +01:00
static bool card_blocked ;
2010-10-05 15:55:21 +01:00
static int rfkill_set_block ( void * data , bool blocked )
{
unsigned char cmd ;
2012-04-18 18:08:21 +01:00
int r ;
if ( blocked = = card_blocked )
return 0 ;
2010-10-05 15:55:21 +01:00
if ( blocked )
cmd = EC_WLAN_ENTER_RESET ;
else
cmd = EC_WLAN_LEAVE_RESET ;
2012-04-18 18:08:21 +01:00
r = olpc_ec_cmd ( cmd , NULL , 0 , NULL , 0 ) ;
if ( r = = 0 )
card_blocked = blocked ;
return r ;
2010-10-05 15:55:21 +01:00
}
static const struct rfkill_ops rfkill_ops = {
. set_block = rfkill_set_block ,
} ;
2012-12-21 13:18:33 -08:00
static int xo1_rfkill_probe ( struct platform_device * pdev )
2010-10-05 15:55:21 +01: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-21 13:18:33 -08:00
static int xo1_rfkill_remove ( struct platform_device * pdev )
2010-10-05 15:55:21 +01: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-21 13:18:33 -08:00
. remove = xo1_rfkill_remove ,
2010-10-05 15:55:21 +01:00
} ;
2011-11-26 12:14:37 +08:00
module_platform_driver ( xo1_rfkill_driver ) ;
2010-10-05 15:55:21 +01:00
MODULE_AUTHOR ( " Daniel Drake <dsd@laptop.org> " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS ( " platform:xo1-rfkill " ) ;