1 /* 2 * I2C Link Layer for ST NCI NFC controller familly based Driver 3 * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 19 20 #include <linux/module.h> 21 #include <linux/i2c.h> 22 #include <linux/gpio/consumer.h> 23 #include <linux/acpi.h> 24 #include <linux/interrupt.h> 25 #include <linux/delay.h> 26 #include <linux/nfc.h> 27 #include <linux/of.h> 28 29 #include "st-nci.h" 30 31 #define DRIVER_DESC "NCI NFC driver for ST_NCI" 32 33 /* ndlc header */ 34 #define ST_NCI_FRAME_HEADROOM 1 35 #define ST_NCI_FRAME_TAILROOM 0 36 37 #define ST_NCI_I2C_MIN_SIZE 4 /* PCB(1) + NCI Packet header(3) */ 38 #define ST_NCI_I2C_MAX_SIZE 250 /* req 4.2.1 */ 39 40 #define ST_NCI_DRIVER_NAME "st_nci" 41 #define ST_NCI_I2C_DRIVER_NAME "st_nci_i2c" 42 43 struct st_nci_i2c_phy { 44 struct i2c_client *i2c_dev; 45 struct llt_ndlc *ndlc; 46 47 bool irq_active; 48 49 struct gpio_desc *gpiod_reset; 50 51 struct st_nci_se_status se_status; 52 }; 53 54 static int st_nci_i2c_enable(void *phy_id) 55 { 56 struct st_nci_i2c_phy *phy = phy_id; 57 58 gpiod_set_value(phy->gpiod_reset, 0); 59 usleep_range(10000, 15000); 60 gpiod_set_value(phy->gpiod_reset, 1); 61 usleep_range(80000, 85000); 62 63 if (phy->ndlc->powered == 0 && phy->irq_active == 0) { 64 enable_irq(phy->i2c_dev->irq); 65 phy->irq_active = true; 66 } 67 68 return 0; 69 } 70 71 static void st_nci_i2c_disable(void *phy_id) 72 { 73 struct st_nci_i2c_phy *phy = phy_id; 74 75 disable_irq_nosync(phy->i2c_dev->irq); 76 phy->irq_active = false; 77 } 78 79 /* 80 * Writing a frame must not return the number of written bytes. 81 * It must return either zero for success, or <0 for error. 82 * In addition, it must not alter the skb 83 */ 84 static int st_nci_i2c_write(void *phy_id, struct sk_buff *skb) 85 { 86 int r = -1; 87 struct st_nci_i2c_phy *phy = phy_id; 88 struct i2c_client *client = phy->i2c_dev; 89 90 if (phy->ndlc->hard_fault != 0) 91 return phy->ndlc->hard_fault; 92 93 r = i2c_master_send(client, skb->data, skb->len); 94 if (r < 0) { /* Retry, chip was in standby */ 95 usleep_range(1000, 4000); 96 r = i2c_master_send(client, skb->data, skb->len); 97 } 98 99 if (r >= 0) { 100 if (r != skb->len) 101 r = -EREMOTEIO; 102 else 103 r = 0; 104 } 105 106 return r; 107 } 108 109 /* 110 * Reads an ndlc frame and returns it in a newly allocated sk_buff. 111 * returns: 112 * 0 : if received frame is complete 113 * -EREMOTEIO : i2c read error (fatal) 114 * -EBADMSG : frame was incorrect and discarded 115 * -ENOMEM : cannot allocate skb, frame dropped 116 */ 117 static int st_nci_i2c_read(struct st_nci_i2c_phy *phy, 118 struct sk_buff **skb) 119 { 120 int r; 121 u8 len; 122 u8 buf[ST_NCI_I2C_MAX_SIZE]; 123 struct i2c_client *client = phy->i2c_dev; 124 125 r = i2c_master_recv(client, buf, ST_NCI_I2C_MIN_SIZE); 126 if (r < 0) { /* Retry, chip was in standby */ 127 usleep_range(1000, 4000); 128 r = i2c_master_recv(client, buf, ST_NCI_I2C_MIN_SIZE); 129 } 130 131 if (r != ST_NCI_I2C_MIN_SIZE) 132 return -EREMOTEIO; 133 134 len = be16_to_cpu(*(__be16 *) (buf + 2)); 135 if (len > ST_NCI_I2C_MAX_SIZE) { 136 nfc_err(&client->dev, "invalid frame len\n"); 137 return -EBADMSG; 138 } 139 140 *skb = alloc_skb(ST_NCI_I2C_MIN_SIZE + len, GFP_KERNEL); 141 if (*skb == NULL) 142 return -ENOMEM; 143 144 skb_reserve(*skb, ST_NCI_I2C_MIN_SIZE); 145 skb_put(*skb, ST_NCI_I2C_MIN_SIZE); 146 memcpy((*skb)->data, buf, ST_NCI_I2C_MIN_SIZE); 147 148 if (!len) 149 return 0; 150 151 r = i2c_master_recv(client, buf, len); 152 if (r != len) { 153 kfree_skb(*skb); 154 return -EREMOTEIO; 155 } 156 157 skb_put(*skb, len); 158 memcpy((*skb)->data + ST_NCI_I2C_MIN_SIZE, buf, len); 159 160 return 0; 161 } 162 163 /* 164 * Reads an ndlc frame from the chip. 165 * 166 * On ST_NCI, IRQ goes in idle state when read starts. 167 */ 168 static irqreturn_t st_nci_irq_thread_fn(int irq, void *phy_id) 169 { 170 struct st_nci_i2c_phy *phy = phy_id; 171 struct i2c_client *client; 172 struct sk_buff *skb = NULL; 173 int r; 174 175 if (!phy || !phy->ndlc || irq != phy->i2c_dev->irq) { 176 WARN_ON_ONCE(1); 177 return IRQ_NONE; 178 } 179 180 client = phy->i2c_dev; 181 dev_dbg(&client->dev, "IRQ\n"); 182 183 if (phy->ndlc->hard_fault) 184 return IRQ_HANDLED; 185 186 if (!phy->ndlc->powered) { 187 st_nci_i2c_disable(phy); 188 return IRQ_HANDLED; 189 } 190 191 r = st_nci_i2c_read(phy, &skb); 192 if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG) 193 return IRQ_HANDLED; 194 195 ndlc_recv(phy->ndlc, skb); 196 197 return IRQ_HANDLED; 198 } 199 200 static struct nfc_phy_ops i2c_phy_ops = { 201 .write = st_nci_i2c_write, 202 .enable = st_nci_i2c_enable, 203 .disable = st_nci_i2c_disable, 204 }; 205 206 static const struct acpi_gpio_params reset_gpios = { 1, 0, false }; 207 208 static const struct acpi_gpio_mapping acpi_st_nci_gpios[] = { 209 { "reset-gpios", &reset_gpios, 1 }, 210 {}, 211 }; 212 213 static int st_nci_i2c_probe(struct i2c_client *client, 214 const struct i2c_device_id *id) 215 { 216 struct device *dev = &client->dev; 217 struct st_nci_i2c_phy *phy; 218 int r; 219 220 dev_dbg(&client->dev, "%s\n", __func__); 221 dev_dbg(&client->dev, "IRQ: %d\n", client->irq); 222 223 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 224 nfc_err(&client->dev, "Need I2C_FUNC_I2C\n"); 225 return -ENODEV; 226 } 227 228 phy = devm_kzalloc(dev, sizeof(struct st_nci_i2c_phy), GFP_KERNEL); 229 if (!phy) 230 return -ENOMEM; 231 232 phy->i2c_dev = client; 233 234 i2c_set_clientdata(client, phy); 235 236 r = devm_acpi_dev_add_driver_gpios(dev, acpi_st_nci_gpios); 237 if (r) 238 dev_dbg(dev, "Unable to add GPIO mapping table\n"); 239 240 /* Get RESET GPIO */ 241 phy->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); 242 if (IS_ERR(phy->gpiod_reset)) { 243 nfc_err(dev, "Unable to get RESET GPIO\n"); 244 return -ENODEV; 245 } 246 247 phy->se_status.is_ese_present = 248 device_property_read_bool(dev, "ese-present"); 249 phy->se_status.is_uicc_present = 250 device_property_read_bool(dev, "uicc-present"); 251 252 r = ndlc_probe(phy, &i2c_phy_ops, &client->dev, 253 ST_NCI_FRAME_HEADROOM, ST_NCI_FRAME_TAILROOM, 254 &phy->ndlc, &phy->se_status); 255 if (r < 0) { 256 nfc_err(&client->dev, "Unable to register ndlc layer\n"); 257 return r; 258 } 259 260 phy->irq_active = true; 261 r = devm_request_threaded_irq(&client->dev, client->irq, NULL, 262 st_nci_irq_thread_fn, 263 IRQF_ONESHOT, 264 ST_NCI_DRIVER_NAME, phy); 265 if (r < 0) 266 nfc_err(&client->dev, "Unable to register IRQ handler\n"); 267 268 return r; 269 } 270 271 static int st_nci_i2c_remove(struct i2c_client *client) 272 { 273 struct st_nci_i2c_phy *phy = i2c_get_clientdata(client); 274 275 dev_dbg(&client->dev, "%s\n", __func__); 276 277 ndlc_remove(phy->ndlc); 278 279 return 0; 280 } 281 282 static struct i2c_device_id st_nci_i2c_id_table[] = { 283 {ST_NCI_DRIVER_NAME, 0}, 284 {} 285 }; 286 MODULE_DEVICE_TABLE(i2c, st_nci_i2c_id_table); 287 288 static const struct acpi_device_id st_nci_i2c_acpi_match[] = { 289 {"SMO2101"}, 290 {"SMO2102"}, 291 {} 292 }; 293 MODULE_DEVICE_TABLE(acpi, st_nci_i2c_acpi_match); 294 295 static const struct of_device_id of_st_nci_i2c_match[] = { 296 { .compatible = "st,st21nfcb-i2c", }, 297 { .compatible = "st,st21nfcb_i2c", }, 298 { .compatible = "st,st21nfcc-i2c", }, 299 {} 300 }; 301 MODULE_DEVICE_TABLE(of, of_st_nci_i2c_match); 302 303 static struct i2c_driver st_nci_i2c_driver = { 304 .driver = { 305 .name = ST_NCI_I2C_DRIVER_NAME, 306 .of_match_table = of_match_ptr(of_st_nci_i2c_match), 307 .acpi_match_table = ACPI_PTR(st_nci_i2c_acpi_match), 308 }, 309 .probe = st_nci_i2c_probe, 310 .id_table = st_nci_i2c_id_table, 311 .remove = st_nci_i2c_remove, 312 }; 313 module_i2c_driver(st_nci_i2c_driver); 314 315 MODULE_LICENSE("GPL"); 316 MODULE_DESCRIPTION(DRIVER_DESC); 317