2013-01-14 23:35:22 +04:00
/*
* HCI based Driver for Inside Secure microread NFC Chip
*
* Copyright ( C ) 2013 Intel Corporation . All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the
* Free Software Foundation , Inc . ,
* 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*/
2013-04-05 23:27:39 +04:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2013-01-14 23:35:22 +04:00
# include <linux/module.h>
2013-04-15 13:19:20 +04:00
# include <linux/mod_devicetable.h>
2013-01-14 23:35:22 +04:00
# include <linux/nfc.h>
# include <net/nfc/hci.h>
# include <net/nfc/llc.h>
2013-04-15 13:19:20 +04:00
# include "../mei_phy.h"
2013-01-14 23:35:22 +04:00
# include "microread.h"
# define MICROREAD_DRIVER_NAME "microread"
2013-03-28 13:39:28 +04:00
static int microread_mei_probe ( struct mei_cl_device * device ,
const struct mei_cl_device_id * id )
2013-01-14 23:35:22 +04:00
{
2013-04-15 13:19:20 +04:00
struct nfc_mei_phy * phy ;
2013-01-14 23:35:22 +04:00
int r ;
pr_info ( " Probing NFC microread \n " ) ;
2013-04-15 13:19:20 +04:00
phy = nfc_mei_phy_alloc ( device ) ;
2013-01-14 23:35:22 +04:00
if ( ! phy ) {
pr_err ( " Cannot allocate memory for microread mei phy. \n " ) ;
return - ENOMEM ;
}
r = microread_probe ( phy , & mei_phy_ops , LLC_NOP_NAME ,
MEI_NFC_HEADER_SIZE , 0 , MEI_NFC_MAX_HCI_PAYLOAD ,
& phy - > hdev ) ;
2013-05-01 01:48:50 +04:00
if ( r < 0 ) {
nfc_mei_phy_free ( phy ) ;
2013-01-14 23:35:22 +04:00
2013-05-01 01:48:50 +04:00
return r ;
}
2013-01-14 23:35:22 +04:00
2013-05-01 01:48:50 +04:00
return 0 ;
2013-01-14 23:35:22 +04:00
}
2013-03-28 13:39:28 +04:00
static int microread_mei_remove ( struct mei_cl_device * device )
2013-01-14 23:35:22 +04:00
{
2013-04-15 13:19:20 +04:00
struct nfc_mei_phy * phy = mei_cl_get_drvdata ( device ) ;
2013-01-14 23:35:22 +04:00
microread_remove ( phy - > hdev ) ;
2013-04-15 13:19:20 +04:00
nfc_mei_phy_free ( phy ) ;
2013-01-14 23:35:22 +04:00
return 0 ;
}
2013-03-28 13:39:28 +04:00
static struct mei_cl_device_id microread_mei_tbl [ ] = {
{ MICROREAD_DRIVER_NAME } ,
2013-02-11 13:30:04 +04:00
/* required last entry */
{ }
} ;
MODULE_DEVICE_TABLE ( mei , microread_mei_tbl ) ;
2013-03-28 13:39:28 +04:00
static struct mei_cl_driver microread_driver = {
2013-02-11 13:30:04 +04:00
. id_table = microread_mei_tbl ,
. name = MICROREAD_DRIVER_NAME ,
2013-01-14 23:35:22 +04:00
. probe = microread_mei_probe ,
. remove = microread_mei_remove ,
} ;
static int microread_mei_init ( void )
{
int r ;
pr_debug ( DRIVER_DESC " : %s \n " , __func__ ) ;
2013-03-28 13:39:28 +04:00
r = mei_cl_driver_register ( & microread_driver ) ;
2013-01-14 23:35:22 +04:00
if ( r ) {
pr_err ( MICROREAD_DRIVER_NAME " : driver registration failed \n " ) ;
return r ;
}
return 0 ;
}
static void microread_mei_exit ( void )
{
2013-03-28 13:39:28 +04:00
mei_cl_driver_unregister ( & microread_driver ) ;
2013-01-14 23:35:22 +04:00
}
module_init ( microread_mei_init ) ;
module_exit ( microread_mei_exit ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( DRIVER_DESC ) ;