2019-03-12 00:10:42 +02:00
// SPDX-License-Identifier: GPL-2.0
2013-01-14 20:35:22 +01:00
/*
2019-03-12 00:10:42 +02:00
* Copyright ( C ) 2013 Intel Corporation . All rights reserved .
2013-01-14 20:35:22 +01:00
*
2019-03-12 00:10:42 +02:00
* HCI based Driver for Inside Secure microread NFC Chip
2013-01-14 20:35:22 +01:00
*/
2013-04-05 12:27:39 -07:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2013-01-14 20:35:22 +01:00
# include <linux/module.h>
2013-04-15 11:19:20 +02:00
# include <linux/mod_devicetable.h>
2013-01-14 20:35:22 +01:00
# include <linux/nfc.h>
# include <net/nfc/llc.h>
2013-04-15 11:19:20 +02:00
# include "../mei_phy.h"
2013-01-14 20:35:22 +01:00
# include "microread.h"
# define MICROREAD_DRIVER_NAME "microread"
2015-09-10 10:18:04 +03:00
static int microread_mei_probe ( struct mei_cl_device * cldev ,
2013-03-28 10:39:28 +01:00
const struct mei_cl_device_id * id )
2013-01-14 20:35:22 +01:00
{
2013-04-15 11:19:20 +02:00
struct nfc_mei_phy * phy ;
2013-01-14 20:35:22 +01:00
int r ;
2015-09-10 10:18:04 +03:00
phy = nfc_mei_phy_alloc ( cldev ) ;
2021-09-13 15:20:34 +02:00
if ( ! phy )
2013-01-14 20:35:22 +01:00
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-04-30 23:48:50 +02:00
if ( r < 0 ) {
nfc_mei_phy_free ( phy ) ;
2013-01-14 20:35:22 +01:00
2013-04-30 23:48:50 +02:00
return r ;
}
2013-01-14 20:35:22 +01:00
2013-04-30 23:48:50 +02:00
return 0 ;
2013-01-14 20:35:22 +01:00
}
2021-02-08 08:37:05 +01:00
static void microread_mei_remove ( struct mei_cl_device * cldev )
2013-01-14 20:35:22 +01:00
{
2015-09-10 10:18:05 +03:00
struct nfc_mei_phy * phy = mei_cldev_get_drvdata ( cldev ) ;
2013-01-14 20:35:22 +01:00
microread_remove ( phy - > hdev ) ;
2013-04-15 11:19:20 +02:00
nfc_mei_phy_free ( phy ) ;
2013-01-14 20:35:22 +01:00
}
2013-03-28 10:39:28 +01:00
static struct mei_cl_device_id microread_mei_tbl [ ] = {
2015-09-10 10:18:01 +03:00
{ MICROREAD_DRIVER_NAME , MEI_NFC_UUID , MEI_CL_VERSION_ANY } ,
2013-02-11 10:30:04 +01:00
/* required last entry */
{ }
} ;
MODULE_DEVICE_TABLE ( mei , microread_mei_tbl ) ;
2013-03-28 10:39:28 +01:00
static struct mei_cl_driver microread_driver = {
2013-02-11 10:30:04 +01:00
. id_table = microread_mei_tbl ,
. name = MICROREAD_DRIVER_NAME ,
2013-01-14 20:35:22 +01:00
. probe = microread_mei_probe ,
. remove = microread_mei_remove ,
} ;
2016-10-19 16:33:29 +03:00
module_mei_cl_driver ( microread_driver ) ;
2013-01-14 20:35:22 +01:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( DRIVER_DESC ) ;