提交 ed06aeef 编写于 作者: C Christophe Ricard 提交者: Samuel Ortiz

nfc: st-nci: Rename st21nfcb to st-nci

STMicroelectronics NFC NCI chips family is extending
with the new ST21NFCC using the AMS AS39230 RF booster.
The st21nfcb driver is relevant for this solution and
might be with future products.
Signed-off-by: NChristophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: NSamuel Ortiz <sameo@linux.intel.com>
上级 2df7f8c6
* STMicroelectronics SAS. ST21NFCB NFC Controller * STMicroelectronics SAS. ST NCI NFC Controller
Required properties: Required properties:
- compatible: Should be "st,st21nfcb-i2c". - compatible: Should be "st,st21nfcb-i2c" or "st,st21nfcc-i2c".
- clock-frequency: I²C work frequency. - clock-frequency: I²C work frequency.
- reg: address on the bus - reg: address on the bus
- interrupt-parent: phandle for the interrupt gpio controller - interrupt-parent: phandle for the interrupt gpio controller
......
...@@ -72,6 +72,6 @@ source "drivers/nfc/pn544/Kconfig" ...@@ -72,6 +72,6 @@ source "drivers/nfc/pn544/Kconfig"
source "drivers/nfc/microread/Kconfig" source "drivers/nfc/microread/Kconfig"
source "drivers/nfc/nfcmrvl/Kconfig" source "drivers/nfc/nfcmrvl/Kconfig"
source "drivers/nfc/st21nfca/Kconfig" source "drivers/nfc/st21nfca/Kconfig"
source "drivers/nfc/st21nfcb/Kconfig" source "drivers/nfc/st-nci/Kconfig"
source "drivers/nfc/nxp-nci/Kconfig" source "drivers/nfc/nxp-nci/Kconfig"
endmenu endmenu
...@@ -12,5 +12,5 @@ obj-$(CONFIG_NFC_PORT100) += port100.o ...@@ -12,5 +12,5 @@ obj-$(CONFIG_NFC_PORT100) += port100.o
obj-$(CONFIG_NFC_MRVL) += nfcmrvl/ obj-$(CONFIG_NFC_MRVL) += nfcmrvl/
obj-$(CONFIG_NFC_TRF7970A) += trf7970a.o obj-$(CONFIG_NFC_TRF7970A) += trf7970a.o
obj-$(CONFIG_NFC_ST21NFCA) += st21nfca/ obj-$(CONFIG_NFC_ST21NFCA) += st21nfca/
obj-$(CONFIG_NFC_ST21NFCB) += st21nfcb/ obj-$(CONFIG_NFC_ST_NCI) += st-nci/
obj-$(CONFIG_NFC_NXP_NCI) += nxp-nci/ obj-$(CONFIG_NFC_NXP_NCI) += nxp-nci/
config NFC_ST21NFCB config NFC_ST_NCI
tristate "STMicroelectronics ST21NFCB NFC driver" tristate "STMicroelectronics ST NCI NFC driver"
depends on NFC_NCI depends on NFC_NCI
default n default n
---help--- ---help---
STMicroelectronics ST21NFCB core driver. It implements the chipset STMicroelectronics NFC NCI chips core driver. It implements the chipset
NCI logic and hooks into the NFC kernel APIs. Physical layers will NCI logic and hooks into the NFC kernel APIs. Physical layers will
register against it. register against it.
To compile this driver as a module, choose m here. The module will To compile this driver as a module, choose m here. The module will
be called st21nfcb. be called st-nci.
Say N if unsure. Say N if unsure.
config NFC_ST21NFCB_I2C config NFC_ST_NCI_I2C
tristate "NFC ST21NFCB i2c support" tristate "NFC ST NCI i2c support"
depends on NFC_ST21NFCB && I2C depends on NFC_ST_NCI && I2C
---help--- ---help---
This module adds support for the STMicroelectronics st21nfcb i2c interface. This module adds support for an I2C interface to the
STMicroelectronics NFC NCI chips familly.
Select this if your platform is using the i2c bus. Select this if your platform is using the i2c bus.
If you choose to build a module, it'll be called st21nfcb_i2c. If you choose to build a module, it'll be called st-nci_i2c.
Say N if unsure. Say N if unsure.
#
# Makefile for ST21NFCB NCI based NFC driver
#
st-nci-objs = ndlc.o core.o st-nci_se.o
obj-$(CONFIG_NFC_ST_NCI) += st-nci.o
st-nci_i2c-objs = i2c.o
obj-$(CONFIG_NFC_ST_NCI_I2C) += st-nci_i2c.o
/* /*
* NCI based Driver for STMicroelectronics NFC Chip * NCI based Driver for STMicroelectronics NFC Chip
* *
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved. * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -23,73 +23,73 @@ ...@@ -23,73 +23,73 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/delay.h> #include <linux/delay.h>
#include "st21nfcb.h" #include "st-nci.h"
#include "st21nfcb_se.h" #include "st-nci_se.h"
#define DRIVER_DESC "NCI NFC driver for ST21NFCB" #define DRIVER_DESC "NCI NFC driver for ST_NCI"
#define ST21NFCB_NCI1_X_PROPRIETARY_ISO15693 0x83 #define ST_NCI1_X_PROPRIETARY_ISO15693 0x83
static int st21nfcb_nci_init(struct nci_dev *ndev) static int st_nci_init(struct nci_dev *ndev)
{ {
struct nci_mode_set_cmd cmd; struct nci_mode_set_cmd cmd;
cmd.cmd_type = ST21NFCB_NCI_SET_NFC_MODE; cmd.cmd_type = ST_NCI_SET_NFC_MODE;
cmd.mode = 1; cmd.mode = 1;
return nci_prop_cmd(ndev, ST21NFCB_NCI_CORE_PROP, return nci_prop_cmd(ndev, ST_NCI_CORE_PROP,
sizeof(struct nci_mode_set_cmd), (__u8 *)&cmd); sizeof(struct nci_mode_set_cmd), (__u8 *)&cmd);
} }
static int st21nfcb_nci_open(struct nci_dev *ndev) static int st_nci_open(struct nci_dev *ndev)
{ {
struct st21nfcb_nci_info *info = nci_get_drvdata(ndev); struct st_nci_info *info = nci_get_drvdata(ndev);
int r; int r;
if (test_and_set_bit(ST21NFCB_NCI_RUNNING, &info->flags)) if (test_and_set_bit(ST_NCI_RUNNING, &info->flags))
return 0; return 0;
r = ndlc_open(info->ndlc); r = ndlc_open(info->ndlc);
if (r) if (r)
clear_bit(ST21NFCB_NCI_RUNNING, &info->flags); clear_bit(ST_NCI_RUNNING, &info->flags);
return r; return r;
} }
static int st21nfcb_nci_close(struct nci_dev *ndev) static int st_nci_close(struct nci_dev *ndev)
{ {
struct st21nfcb_nci_info *info = nci_get_drvdata(ndev); struct st_nci_info *info = nci_get_drvdata(ndev);
if (!test_bit(ST21NFCB_NCI_RUNNING, &info->flags)) if (!test_bit(ST_NCI_RUNNING, &info->flags))
return 0; return 0;
ndlc_close(info->ndlc); ndlc_close(info->ndlc);
clear_bit(ST21NFCB_NCI_RUNNING, &info->flags); clear_bit(ST_NCI_RUNNING, &info->flags);
return 0; return 0;
} }
static int st21nfcb_nci_send(struct nci_dev *ndev, struct sk_buff *skb) static int st_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
{ {
struct st21nfcb_nci_info *info = nci_get_drvdata(ndev); struct st_nci_info *info = nci_get_drvdata(ndev);
skb->dev = (void *)ndev; skb->dev = (void *)ndev;
if (!test_bit(ST21NFCB_NCI_RUNNING, &info->flags)) if (!test_bit(ST_NCI_RUNNING, &info->flags))
return -EBUSY; return -EBUSY;
return ndlc_send(info->ndlc, skb); return ndlc_send(info->ndlc, skb);
} }
static __u32 st21nfcb_nci_get_rfprotocol(struct nci_dev *ndev, static __u32 st_nci_get_rfprotocol(struct nci_dev *ndev,
__u8 rf_protocol) __u8 rf_protocol)
{ {
return rf_protocol == ST21NFCB_NCI1_X_PROPRIETARY_ISO15693 ? return rf_protocol == ST_NCI1_X_PROPRIETARY_ISO15693 ?
NFC_PROTO_ISO15693_MASK : 0; NFC_PROTO_ISO15693_MASK : 0;
} }
static int st21nfcb_nci_prop_rsp_packet(struct nci_dev *ndev, static int st_nci_prop_rsp_packet(struct nci_dev *ndev,
struct sk_buff *skb) struct sk_buff *skb)
{ {
__u8 status = skb->data[0]; __u8 status = skb->data[0];
...@@ -98,40 +98,40 @@ static int st21nfcb_nci_prop_rsp_packet(struct nci_dev *ndev, ...@@ -98,40 +98,40 @@ static int st21nfcb_nci_prop_rsp_packet(struct nci_dev *ndev,
return 0; return 0;
} }
static struct nci_prop_ops st21nfcb_nci_prop_ops[] = { static struct nci_prop_ops st_nci_prop_ops[] = {
{ {
.opcode = nci_opcode_pack(NCI_GID_PROPRIETARY, .opcode = nci_opcode_pack(NCI_GID_PROPRIETARY,
ST21NFCB_NCI_CORE_PROP), ST_NCI_CORE_PROP),
.rsp = st21nfcb_nci_prop_rsp_packet, .rsp = st_nci_prop_rsp_packet,
}, },
}; };
static struct nci_ops st21nfcb_nci_ops = { static struct nci_ops st_nci_ops = {
.init = st21nfcb_nci_init, .init = st_nci_init,
.open = st21nfcb_nci_open, .open = st_nci_open,
.close = st21nfcb_nci_close, .close = st_nci_close,
.send = st21nfcb_nci_send, .send = st_nci_send,
.get_rfprotocol = st21nfcb_nci_get_rfprotocol, .get_rfprotocol = st_nci_get_rfprotocol,
.discover_se = st21nfcb_nci_discover_se, .discover_se = st_nci_discover_se,
.enable_se = st21nfcb_nci_enable_se, .enable_se = st_nci_enable_se,
.disable_se = st21nfcb_nci_disable_se, .disable_se = st_nci_disable_se,
.se_io = st21nfcb_nci_se_io, .se_io = st_nci_se_io,
.hci_load_session = st21nfcb_hci_load_session, .hci_load_session = st_nci_hci_load_session,
.hci_event_received = st21nfcb_hci_event_received, .hci_event_received = st_nci_hci_event_received,
.hci_cmd_received = st21nfcb_hci_cmd_received, .hci_cmd_received = st_nci_hci_cmd_received,
.prop_ops = st21nfcb_nci_prop_ops, .prop_ops = st_nci_prop_ops,
.n_prop_ops = ARRAY_SIZE(st21nfcb_nci_prop_ops), .n_prop_ops = ARRAY_SIZE(st_nci_prop_ops),
}; };
int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom, int st_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
int phy_tailroom) int phy_tailroom)
{ {
struct st21nfcb_nci_info *info; struct st_nci_info *info;
int r; int r;
u32 protocols; u32 protocols;
info = devm_kzalloc(ndlc->dev, info = devm_kzalloc(ndlc->dev,
sizeof(struct st21nfcb_nci_info), GFP_KERNEL); sizeof(struct st_nci_info), GFP_KERNEL);
if (!info) if (!info)
return -ENOMEM; return -ENOMEM;
...@@ -143,7 +143,7 @@ int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom, ...@@ -143,7 +143,7 @@ int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
| NFC_PROTO_ISO15693_MASK | NFC_PROTO_ISO15693_MASK
| NFC_PROTO_NFC_DEP_MASK; | NFC_PROTO_NFC_DEP_MASK;
ndlc->ndev = nci_allocate_device(&st21nfcb_nci_ops, protocols, ndlc->ndev = nci_allocate_device(&st_nci_ops, protocols,
phy_headroom, phy_tailroom); phy_headroom, phy_tailroom);
if (!ndlc->ndev) { if (!ndlc->ndev) {
pr_err("Cannot allocate nfc ndev\n"); pr_err("Cannot allocate nfc ndev\n");
...@@ -160,20 +160,20 @@ int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom, ...@@ -160,20 +160,20 @@ int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
return r; return r;
} }
return st21nfcb_se_init(ndlc->ndev); return st_nci_se_init(ndlc->ndev);
} }
EXPORT_SYMBOL_GPL(st21nfcb_nci_probe); EXPORT_SYMBOL_GPL(st_nci_probe);
void st21nfcb_nci_remove(struct nci_dev *ndev) void st_nci_remove(struct nci_dev *ndev)
{ {
struct st21nfcb_nci_info *info = nci_get_drvdata(ndev); struct st_nci_info *info = nci_get_drvdata(ndev);
ndlc_close(info->ndlc); ndlc_close(info->ndlc);
nci_unregister_device(ndev); nci_unregister_device(ndev);
nci_free_device(ndev); nci_free_device(ndev);
} }
EXPORT_SYMBOL_GPL(st21nfcb_nci_remove); EXPORT_SYMBOL_GPL(st_nci_remove);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION(DRIVER_DESC); MODULE_DESCRIPTION(DRIVER_DESC);
/* /*
* I2C Link Layer for ST21NFCB NCI based Driver * I2C Link Layer for ST NCI NFC controller familly based Driver
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved. * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/nfc.h> #include <linux/nfc.h>
#include <linux/platform_data/st21nfcb.h> #include <linux/platform_data/st_nci.h>
#include "ndlc.h" #include "ndlc.h"
...@@ -35,18 +35,18 @@ ...@@ -35,18 +35,18 @@
#define ST21NFCB_FRAME_HEADROOM 1 #define ST21NFCB_FRAME_HEADROOM 1
#define ST21NFCB_FRAME_TAILROOM 0 #define ST21NFCB_FRAME_TAILROOM 0
#define ST21NFCB_NCI_I2C_MIN_SIZE 4 /* PCB(1) + NCI Packet header(3) */ #define ST_NCI_I2C_MIN_SIZE 4 /* PCB(1) + NCI Packet header(3) */
#define ST21NFCB_NCI_I2C_MAX_SIZE 250 /* req 4.2.1 */ #define ST_NCI_I2C_MAX_SIZE 250 /* req 4.2.1 */
#define ST21NFCB_NCI_I2C_DRIVER_NAME "st21nfcb_nci_i2c" #define ST_NCI_I2C_DRIVER_NAME "st_nci_i2c"
static struct i2c_device_id st21nfcb_nci_i2c_id_table[] = { static struct i2c_device_id st_nci_i2c_id_table[] = {
{ST21NFCB_NCI_DRIVER_NAME, 0}, {ST_NCI_DRIVER_NAME, 0},
{} {}
}; };
MODULE_DEVICE_TABLE(i2c, st21nfcb_nci_i2c_id_table); MODULE_DEVICE_TABLE(i2c, st_nci_i2c_id_table);
struct st21nfcb_i2c_phy { struct st_nci_i2c_phy {
struct i2c_client *i2c_dev; struct i2c_client *i2c_dev;
struct llt_ndlc *ndlc; struct llt_ndlc *ndlc;
...@@ -61,9 +61,9 @@ do { \ ...@@ -61,9 +61,9 @@ do { \
16, 1, (skb)->data, (skb)->len, 0); \ 16, 1, (skb)->data, (skb)->len, 0); \
} while (0) } while (0)
static int st21nfcb_nci_i2c_enable(void *phy_id) static int st_nci_i2c_enable(void *phy_id)
{ {
struct st21nfcb_i2c_phy *phy = phy_id; struct st_nci_i2c_phy *phy = phy_id;
gpio_set_value(phy->gpio_reset, 0); gpio_set_value(phy->gpio_reset, 0);
usleep_range(10000, 15000); usleep_range(10000, 15000);
...@@ -76,9 +76,9 @@ static int st21nfcb_nci_i2c_enable(void *phy_id) ...@@ -76,9 +76,9 @@ static int st21nfcb_nci_i2c_enable(void *phy_id)
return 0; return 0;
} }
static void st21nfcb_nci_i2c_disable(void *phy_id) static void st_nci_i2c_disable(void *phy_id)
{ {
struct st21nfcb_i2c_phy *phy = phy_id; struct st_nci_i2c_phy *phy = phy_id;
disable_irq_nosync(phy->i2c_dev->irq); disable_irq_nosync(phy->i2c_dev->irq);
} }
...@@ -88,13 +88,13 @@ static void st21nfcb_nci_i2c_disable(void *phy_id) ...@@ -88,13 +88,13 @@ static void st21nfcb_nci_i2c_disable(void *phy_id)
* It must return either zero for success, or <0 for error. * It must return either zero for success, or <0 for error.
* In addition, it must not alter the skb * In addition, it must not alter the skb
*/ */
static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb) static int st_nci_i2c_write(void *phy_id, struct sk_buff *skb)
{ {
int r = -1; int r = -1;
struct st21nfcb_i2c_phy *phy = phy_id; struct st_nci_i2c_phy *phy = phy_id;
struct i2c_client *client = phy->i2c_dev; struct i2c_client *client = phy->i2c_dev;
I2C_DUMP_SKB("st21nfcb_nci_i2c_write", skb); I2C_DUMP_SKB("st_nci_i2c_write", skb);
if (phy->ndlc->hard_fault != 0) if (phy->ndlc->hard_fault != 0)
return phy->ndlc->hard_fault; return phy->ndlc->hard_fault;
...@@ -124,40 +124,40 @@ static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb) ...@@ -124,40 +124,40 @@ static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb)
* at end of read) * at end of read)
* -EREMOTEIO : i2c read error (fatal) * -EREMOTEIO : i2c read error (fatal)
* -EBADMSG : frame was incorrect and discarded * -EBADMSG : frame was incorrect and discarded
* (value returned from st21nfcb_nci_i2c_repack) * (value returned from st_nci_i2c_repack)
* -EIO : if no ST21NFCB_SOF_EOF is found after reaching * -EIO : if no ST21NFCB_SOF_EOF is found after reaching
* the read length end sequence * the read length end sequence
*/ */
static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy, static int st_nci_i2c_read(struct st_nci_i2c_phy *phy,
struct sk_buff **skb) struct sk_buff **skb)
{ {
int r; int r;
u8 len; u8 len;
u8 buf[ST21NFCB_NCI_I2C_MAX_SIZE]; u8 buf[ST_NCI_I2C_MAX_SIZE];
struct i2c_client *client = phy->i2c_dev; struct i2c_client *client = phy->i2c_dev;
r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE); r = i2c_master_recv(client, buf, ST_NCI_I2C_MIN_SIZE);
if (r < 0) { /* Retry, chip was in standby */ if (r < 0) { /* Retry, chip was in standby */
usleep_range(1000, 4000); usleep_range(1000, 4000);
r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE); r = i2c_master_recv(client, buf, ST_NCI_I2C_MIN_SIZE);
} }
if (r != ST21NFCB_NCI_I2C_MIN_SIZE) if (r != ST_NCI_I2C_MIN_SIZE)
return -EREMOTEIO; return -EREMOTEIO;
len = be16_to_cpu(*(__be16 *) (buf + 2)); len = be16_to_cpu(*(__be16 *) (buf + 2));
if (len > ST21NFCB_NCI_I2C_MAX_SIZE) { if (len > ST_NCI_I2C_MAX_SIZE) {
nfc_err(&client->dev, "invalid frame len\n"); nfc_err(&client->dev, "invalid frame len\n");
return -EBADMSG; return -EBADMSG;
} }
*skb = alloc_skb(ST21NFCB_NCI_I2C_MIN_SIZE + len, GFP_KERNEL); *skb = alloc_skb(ST_NCI_I2C_MIN_SIZE + len, GFP_KERNEL);
if (*skb == NULL) if (*skb == NULL)
return -ENOMEM; return -ENOMEM;
skb_reserve(*skb, ST21NFCB_NCI_I2C_MIN_SIZE); skb_reserve(*skb, ST_NCI_I2C_MIN_SIZE);
skb_put(*skb, ST21NFCB_NCI_I2C_MIN_SIZE); skb_put(*skb, ST_NCI_I2C_MIN_SIZE);
memcpy((*skb)->data, buf, ST21NFCB_NCI_I2C_MIN_SIZE); memcpy((*skb)->data, buf, ST_NCI_I2C_MIN_SIZE);
if (!len) if (!len)
return 0; return 0;
...@@ -169,7 +169,7 @@ static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy, ...@@ -169,7 +169,7 @@ static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy,
} }
skb_put(*skb, len); skb_put(*skb, len);
memcpy((*skb)->data + ST21NFCB_NCI_I2C_MIN_SIZE, buf, len); memcpy((*skb)->data + ST_NCI_I2C_MIN_SIZE, buf, len);
I2C_DUMP_SKB("i2c frame read", *skb); I2C_DUMP_SKB("i2c frame read", *skb);
...@@ -181,9 +181,9 @@ static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy, ...@@ -181,9 +181,9 @@ static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy,
* *
* On ST21NFCB, IRQ goes in idle state when read starts. * On ST21NFCB, IRQ goes in idle state when read starts.
*/ */
static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id) static irqreturn_t st_nci_irq_thread_fn(int irq, void *phy_id)
{ {
struct st21nfcb_i2c_phy *phy = phy_id; struct st_nci_i2c_phy *phy = phy_id;
struct i2c_client *client; struct i2c_client *client;
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
int r; int r;
...@@ -200,11 +200,11 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id) ...@@ -200,11 +200,11 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
return IRQ_HANDLED; return IRQ_HANDLED;
if (!phy->ndlc->powered) { if (!phy->ndlc->powered) {
st21nfcb_nci_i2c_disable(phy); st_nci_i2c_disable(phy);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
r = st21nfcb_nci_i2c_read(phy, &skb); r = st_nci_i2c_read(phy, &skb);
if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG) if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG)
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -214,15 +214,15 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id) ...@@ -214,15 +214,15 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
} }
static struct nfc_phy_ops i2c_phy_ops = { static struct nfc_phy_ops i2c_phy_ops = {
.write = st21nfcb_nci_i2c_write, .write = st_nci_i2c_write,
.enable = st21nfcb_nci_i2c_enable, .enable = st_nci_i2c_enable,
.disable = st21nfcb_nci_i2c_disable, .disable = st_nci_i2c_disable,
}; };
#ifdef CONFIG_OF #ifdef CONFIG_OF
static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client) static int st_nci_i2c_of_request_resources(struct i2c_client *client)
{ {
struct st21nfcb_i2c_phy *phy = i2c_get_clientdata(client); struct st_nci_i2c_phy *phy = i2c_get_clientdata(client);
struct device_node *pp; struct device_node *pp;
int gpio; int gpio;
int r; int r;
...@@ -253,16 +253,16 @@ static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client) ...@@ -253,16 +253,16 @@ static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client)
return 0; return 0;
} }
#else #else
static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client) static int st_nci_i2c_of_request_resources(struct i2c_client *client)
{ {
return -ENODEV; return -ENODEV;
} }
#endif #endif
static int st21nfcb_nci_i2c_request_resources(struct i2c_client *client) static int st_nci_i2c_request_resources(struct i2c_client *client)
{ {
struct st21nfcb_nfc_platform_data *pdata; struct st_nci_nfc_platform_data *pdata;
struct st21nfcb_i2c_phy *phy = i2c_get_clientdata(client); struct st_nci_i2c_phy *phy = i2c_get_clientdata(client);
int r; int r;
pdata = client->dev.platform_data; pdata = client->dev.platform_data;
...@@ -285,11 +285,11 @@ static int st21nfcb_nci_i2c_request_resources(struct i2c_client *client) ...@@ -285,11 +285,11 @@ static int st21nfcb_nci_i2c_request_resources(struct i2c_client *client)
return 0; return 0;
} }
static int st21nfcb_nci_i2c_probe(struct i2c_client *client, static int st_nci_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct st21nfcb_i2c_phy *phy; struct st_nci_i2c_phy *phy;
struct st21nfcb_nfc_platform_data *pdata; struct st_nci_nfc_platform_data *pdata;
int r; int r;
dev_dbg(&client->dev, "%s\n", __func__); dev_dbg(&client->dev, "%s\n", __func__);
...@@ -300,7 +300,7 @@ static int st21nfcb_nci_i2c_probe(struct i2c_client *client, ...@@ -300,7 +300,7 @@ static int st21nfcb_nci_i2c_probe(struct i2c_client *client,
return -ENODEV; return -ENODEV;
} }
phy = devm_kzalloc(&client->dev, sizeof(struct st21nfcb_i2c_phy), phy = devm_kzalloc(&client->dev, sizeof(struct st_nci_i2c_phy),
GFP_KERNEL); GFP_KERNEL);
if (!phy) if (!phy)
return -ENOMEM; return -ENOMEM;
...@@ -311,13 +311,13 @@ static int st21nfcb_nci_i2c_probe(struct i2c_client *client, ...@@ -311,13 +311,13 @@ static int st21nfcb_nci_i2c_probe(struct i2c_client *client,
pdata = client->dev.platform_data; pdata = client->dev.platform_data;
if (!pdata && client->dev.of_node) { if (!pdata && client->dev.of_node) {
r = st21nfcb_nci_i2c_of_request_resources(client); r = st_nci_i2c_of_request_resources(client);
if (r) { if (r) {
nfc_err(&client->dev, "No platform data\n"); nfc_err(&client->dev, "No platform data\n");
return r; return r;
} }
} else if (pdata) { } else if (pdata) {
r = st21nfcb_nci_i2c_request_resources(client); r = st_nci_i2c_request_resources(client);
if (r) { if (r) {
nfc_err(&client->dev, nfc_err(&client->dev,
"Cannot get platform resources\n"); "Cannot get platform resources\n");
...@@ -338,18 +338,18 @@ static int st21nfcb_nci_i2c_probe(struct i2c_client *client, ...@@ -338,18 +338,18 @@ static int st21nfcb_nci_i2c_probe(struct i2c_client *client,
} }
r = devm_request_threaded_irq(&client->dev, client->irq, NULL, r = devm_request_threaded_irq(&client->dev, client->irq, NULL,
st21nfcb_nci_irq_thread_fn, st_nci_irq_thread_fn,
phy->irq_polarity | IRQF_ONESHOT, phy->irq_polarity | IRQF_ONESHOT,
ST21NFCB_NCI_DRIVER_NAME, phy); ST_NCI_DRIVER_NAME, phy);
if (r < 0) if (r < 0)
nfc_err(&client->dev, "Unable to register IRQ handler\n"); nfc_err(&client->dev, "Unable to register IRQ handler\n");
return r; return r;
} }
static int st21nfcb_nci_i2c_remove(struct i2c_client *client) static int st_nci_i2c_remove(struct i2c_client *client)
{ {
struct st21nfcb_i2c_phy *phy = i2c_get_clientdata(client); struct st_nci_i2c_phy *phy = i2c_get_clientdata(client);
dev_dbg(&client->dev, "%s\n", __func__); dev_dbg(&client->dev, "%s\n", __func__);
...@@ -359,26 +359,27 @@ static int st21nfcb_nci_i2c_remove(struct i2c_client *client) ...@@ -359,26 +359,27 @@ static int st21nfcb_nci_i2c_remove(struct i2c_client *client)
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
static const struct of_device_id of_st21nfcb_i2c_match[] = { static const struct of_device_id of_st_nci_i2c_match[] = {
{ .compatible = "st,st21nfcb-i2c", }, { .compatible = "st,st21nfcb-i2c", },
{ .compatible = "st,st21nfcb_i2c", }, { .compatible = "st,st21nfcb_i2c", },
{ .compatible = "st,st21nfcc-i2c", },
{} {}
}; };
MODULE_DEVICE_TABLE(of, of_st21nfcb_i2c_match); MODULE_DEVICE_TABLE(of, of_st_nci_i2c_match);
#endif #endif
static struct i2c_driver st21nfcb_nci_i2c_driver = { static struct i2c_driver st_nci_i2c_driver = {
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = ST21NFCB_NCI_I2C_DRIVER_NAME, .name = ST_NCI_I2C_DRIVER_NAME,
.of_match_table = of_match_ptr(of_st21nfcb_i2c_match), .of_match_table = of_match_ptr(of_st_nci_i2c_match),
}, },
.probe = st21nfcb_nci_i2c_probe, .probe = st_nci_i2c_probe,
.id_table = st21nfcb_nci_i2c_id_table, .id_table = st_nci_i2c_id_table,
.remove = st21nfcb_nci_i2c_remove, .remove = st_nci_i2c_remove,
}; };
module_i2c_driver(st21nfcb_nci_i2c_driver); module_i2c_driver(st_nci_i2c_driver);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION(DRIVER_DESC); MODULE_DESCRIPTION(DRIVER_DESC);
/* /*
* Low Level Transport (NDLC) Driver for STMicroelectronics NFC Chip * Low Level Transport (NDLC) Driver for STMicroelectronics NFC Chip
* *
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved. * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include <net/nfc/nci_core.h> #include <net/nfc/nci_core.h>
#include "ndlc.h" #include "ndlc.h"
#include "st21nfcb.h" #include "st-nci.h"
#define NDLC_TIMER_T1 100 #define NDLC_TIMER_T1 100
#define NDLC_TIMER_T1_WAIT 400 #define NDLC_TIMER_T1_WAIT 400
...@@ -68,13 +68,13 @@ void ndlc_close(struct llt_ndlc *ndlc) ...@@ -68,13 +68,13 @@ void ndlc_close(struct llt_ndlc *ndlc)
{ {
struct nci_mode_set_cmd cmd; struct nci_mode_set_cmd cmd;
cmd.cmd_type = ST21NFCB_NCI_SET_NFC_MODE; cmd.cmd_type = ST_NCI_SET_NFC_MODE;
cmd.mode = 0; cmd.mode = 0;
/* toggle reset pin */ /* toggle reset pin */
ndlc->ops->enable(ndlc->phy_id); ndlc->ops->enable(ndlc->phy_id);
nci_prop_cmd(ndlc->ndev, ST21NFCB_NCI_CORE_PROP, nci_prop_cmd(ndlc->ndev, ST_NCI_CORE_PROP,
sizeof(struct nci_mode_set_cmd), (__u8 *)&cmd); sizeof(struct nci_mode_set_cmd), (__u8 *)&cmd);
ndlc->powered = 0; ndlc->powered = 0;
...@@ -293,13 +293,13 @@ int ndlc_probe(void *phy_id, struct nfc_phy_ops *phy_ops, struct device *dev, ...@@ -293,13 +293,13 @@ int ndlc_probe(void *phy_id, struct nfc_phy_ops *phy_ops, struct device *dev,
INIT_WORK(&ndlc->sm_work, llt_ndlc_sm_work); INIT_WORK(&ndlc->sm_work, llt_ndlc_sm_work);
return st21nfcb_nci_probe(ndlc, phy_headroom, phy_tailroom); return st_nci_probe(ndlc, phy_headroom, phy_tailroom);
} }
EXPORT_SYMBOL(ndlc_probe); EXPORT_SYMBOL(ndlc_probe);
void ndlc_remove(struct llt_ndlc *ndlc) void ndlc_remove(struct llt_ndlc *ndlc)
{ {
st21nfcb_nci_remove(ndlc->ndev); st_nci_remove(ndlc->ndev);
/* cancel timers */ /* cancel timers */
del_timer_sync(&ndlc->t1_timer); del_timer_sync(&ndlc->t1_timer);
......
/* /*
* NCI based Driver for STMicroelectronics NFC Chip * NCI based Driver for STMicroelectronics NFC Chip
* *
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved. * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -43,7 +43,7 @@ struct llt_ndlc { ...@@ -43,7 +43,7 @@ struct llt_ndlc {
struct device *dev; struct device *dev;
/* /*
* < 0 if hardware error occured * < 0 if hardware error occurred
* and prevents normal operation. * and prevents normal operation.
*/ */
int hard_fault; int hard_fault;
......
...@@ -16,17 +16,17 @@ ...@@ -16,17 +16,17 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __LOCAL_ST21NFCB_H_ #ifndef __LOCAL_ST_NCI_H_
#define __LOCAL_ST21NFCB_H_ #define __LOCAL_ST_NCI_H_
#include "st21nfcb_se.h" #include "st-nci_se.h"
#include "ndlc.h" #include "ndlc.h"
/* Define private flags: */ /* Define private flags: */
#define ST21NFCB_NCI_RUNNING 1 #define ST_NCI_RUNNING 1
#define ST21NFCB_NCI_CORE_PROP 0x01 #define ST_NCI_CORE_PROP 0x01
#define ST21NFCB_NCI_SET_NFC_MODE 0x02 #define ST_NCI_SET_NFC_MODE 0x02
struct nci_mode_set_cmd { struct nci_mode_set_cmd {
u8 cmd_type; u8 cmd_type;
...@@ -37,14 +37,14 @@ struct nci_mode_set_rsp { ...@@ -37,14 +37,14 @@ struct nci_mode_set_rsp {
u8 status; u8 status;
} __packed; } __packed;
struct st21nfcb_nci_info { struct st_nci_info {
struct llt_ndlc *ndlc; struct llt_ndlc *ndlc;
unsigned long flags; unsigned long flags;
struct st21nfcb_se_info se_info; struct st_nci_se_info se_info;
}; };
void st21nfcb_nci_remove(struct nci_dev *ndev); void st_nci_remove(struct nci_dev *ndev);
int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom, int st_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
int phy_tailroom); int phy_tailroom);
#endif /* __LOCAL_ST21NFCB_H_ */ #endif /* __LOCAL_ST_NCI_H_ */
/* /*
* NCI based Driver for STMicroelectronics NFC Chip * Secure Element Driver for STMicroelectronics NFC NCI Chip
* *
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved. * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -15,18 +15,18 @@ ...@@ -15,18 +15,18 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __LOCAL_ST21NFCB_SE_H_ #ifndef __LOCAL_ST_NCI_SE_H_
#define __LOCAL_ST21NFCB_SE_H_ #define __LOCAL_ST_NCI_SE_H_
/* /*
* ref ISO7816-3 chap 8.1. the initial character TS is followed by a * ref ISO7816-3 chap 8.1. the initial character TS is followed by a
* sequence of at most 32 characters. * sequence of at most 32 characters.
*/ */
#define ST21NFCB_ESE_MAX_LENGTH 33 #define ST_NCI_ESE_MAX_LENGTH 33
#define ST21NFCB_HCI_HOST_ID_ESE 0xc0 #define ST_NCI_HCI_HOST_ID_ESE 0xc0
struct st21nfcb_se_info { struct st_nci_se_info {
u8 atr[ST21NFCB_ESE_MAX_LENGTH]; u8 atr[ST_NCI_ESE_MAX_LENGTH];
struct completion req_completion; struct completion req_completion;
struct timer_list bwi_timer; struct timer_list bwi_timer;
...@@ -42,20 +42,20 @@ struct st21nfcb_se_info { ...@@ -42,20 +42,20 @@ struct st21nfcb_se_info {
void *cb_context; void *cb_context;
}; };
int st21nfcb_se_init(struct nci_dev *ndev); int st_nci_se_init(struct nci_dev *ndev);
void st21nfcb_se_deinit(struct nci_dev *ndev); void st_nci_se_deinit(struct nci_dev *ndev);
int st21nfcb_nci_discover_se(struct nci_dev *ndev); int st_nci_discover_se(struct nci_dev *ndev);
int st21nfcb_nci_enable_se(struct nci_dev *ndev, u32 se_idx); int st_nci_enable_se(struct nci_dev *ndev, u32 se_idx);
int st21nfcb_nci_disable_se(struct nci_dev *ndev, u32 se_idx); int st_nci_disable_se(struct nci_dev *ndev, u32 se_idx);
int st21nfcb_nci_se_io(struct nci_dev *ndev, u32 se_idx, int st_nci_se_io(struct nci_dev *ndev, u32 se_idx,
u8 *apdu, size_t apdu_length, u8 *apdu, size_t apdu_length,
se_io_cb_t cb, void *cb_context); se_io_cb_t cb, void *cb_context);
int st21nfcb_hci_load_session(struct nci_dev *ndev); int st_nci_hci_load_session(struct nci_dev *ndev);
void st21nfcb_hci_event_received(struct nci_dev *ndev, u8 pipe, void st_nci_hci_event_received(struct nci_dev *ndev, u8 pipe,
u8 event, struct sk_buff *skb); u8 event, struct sk_buff *skb);
void st21nfcb_hci_cmd_received(struct nci_dev *ndev, u8 pipe, u8 cmd, void st_nci_hci_cmd_received(struct nci_dev *ndev, u8 pipe, u8 cmd,
struct sk_buff *skb); struct sk_buff *skb);
#endif /* __LOCAL_ST21NFCB_NCI_H_ */ #endif /* __LOCAL_ST_NCI_SE_H_ */
#
# Makefile for ST21NFCB NCI based NFC driver
#
st21nfcb_nci-objs = ndlc.o st21nfcb.o st21nfcb_se.o
obj-$(CONFIG_NFC_ST21NFCB) += st21nfcb_nci.o
st21nfcb_i2c-objs = i2c.o
obj-$(CONFIG_NFC_ST21NFCB_I2C) += st21nfcb_i2c.o
/* /*
* Driver include for the ST21NFCB NFC chip. * Driver include for ST NCI NFC chip family.
* *
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved. * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -16,14 +16,14 @@ ...@@ -16,14 +16,14 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef _ST21NFCB_NCI_H_ #ifndef _ST_NCI_H_
#define _ST21NFCB_NCI_H_ #define _ST_NCI_H_
#define ST21NFCB_NCI_DRIVER_NAME "st21nfcb_nci" #define ST_NCI_DRIVER_NAME "st_nci"
struct st21nfcb_nfc_platform_data { struct st_nci_nfc_platform_data {
unsigned int gpio_reset; unsigned int gpio_reset;
unsigned int irq_polarity; unsigned int irq_polarity;
}; };
#endif /* _ST21NFCB_NCI_H_ */ #endif /* _ST_NCI_H_ */
/*
* Driver include for ST NCI NFC chip family.
*
* Copyright (C) 2014-2015 STMicroelectronics SAS. 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef _ST_NCI_H_
#define _ST_NCI_H_
#define ST_NCI_DRIVER_NAME "st_nci"
struct st_nci_nfc_platform_data {
unsigned int gpio_reset;
unsigned int irq_polarity;
};
#endif /* _ST_NCI_H_ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册