2019-03-12 00:10:42 +02:00
// SPDX-License-Identifier: GPL-2.0
2013-04-16 00:14:35 +02:00
/*
* Copyright ( C ) 2013 Intel Corporation . All rights reserved .
*
2019-03-12 00:10:42 +02:00
* HCI based Driver for NXP pn544 NFC Chip
2013-04-16 00:14:35 +02:00
*/
# include <linux/module.h>
# include <linux/mod_devicetable.h>
# include <linux/nfc.h>
# include <net/nfc/hci.h>
# include <net/nfc/llc.h>
# include "../mei_phy.h"
# include "pn544.h"
# define PN544_DRIVER_NAME "pn544"
2015-09-10 10:18:04 +03:00
static int pn544_mei_probe ( struct mei_cl_device * cldev ,
2013-04-16 00:14:35 +02:00
const struct mei_cl_device_id * id )
{
struct nfc_mei_phy * phy ;
int r ;
2015-09-10 10:18:04 +03:00
phy = nfc_mei_phy_alloc ( cldev ) ;
2021-09-13 15:20:28 +02:00
if ( ! phy )
2013-04-16 00:14:35 +02:00
return - ENOMEM ;
r = pn544_hci_probe ( phy , & mei_phy_ops , LLC_NOP_NAME ,
MEI_NFC_HEADER_SIZE , 0 , MEI_NFC_MAX_HCI_PAYLOAD ,
2013-07-19 14:58:39 +02:00
NULL , & phy - > hdev ) ;
2013-04-30 23:48:50 +02:00
if ( r < 0 ) {
nfc_mei_phy_free ( phy ) ;
2013-04-16 00:14:35 +02:00
2013-04-30 23:48:50 +02:00
return r ;
}
2013-04-16 00:14:35 +02:00
2013-04-30 23:48:50 +02:00
return 0 ;
2013-04-16 00:14:35 +02:00
}
2021-02-08 08:37:05 +01:00
static void pn544_mei_remove ( struct mei_cl_device * cldev )
2013-04-16 00:14:35 +02:00
{
2015-09-10 10:18:05 +03:00
struct nfc_mei_phy * phy = mei_cldev_get_drvdata ( cldev ) ;
2013-04-16 00:14:35 +02:00
pn544_hci_remove ( phy - > hdev ) ;
nfc_mei_phy_free ( phy ) ;
}
static struct mei_cl_device_id pn544_mei_tbl [ ] = {
2015-09-10 10:18:01 +03:00
{ PN544_DRIVER_NAME , MEI_NFC_UUID , MEI_CL_VERSION_ANY } ,
2013-04-16 00:14:35 +02:00
/* required last entry */
{ }
} ;
MODULE_DEVICE_TABLE ( mei , pn544_mei_tbl ) ;
static struct mei_cl_driver pn544_driver = {
. id_table = pn544_mei_tbl ,
. name = PN544_DRIVER_NAME ,
. probe = pn544_mei_probe ,
. remove = pn544_mei_remove ,
} ;
2016-10-19 16:33:29 +03:00
module_mei_cl_driver ( pn544_driver ) ;
2013-04-16 00:14:35 +02:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( DRIVER_DESC ) ;