static int pn547_remove(struct i2c_client *client) { struct pn547_dev *d = i2c_get_clientdata(client); pn547_dev_remove_sysfs_entries(client); free_irq(client->irq, d); i2c_set_clientdata(client, NULL); wake_lock_destroy(&d->wake_lock); pn547_gpio_release(d->pdata); kzfree(d->pdata); kzfree(d); return 0; }
static int pn547_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct pn547_dev *dev; struct pn547_i2c_platform_data *pdata; struct clk *nfc_clk = NULL; int ret = 0; pdata = kzalloc(sizeof(struct pn547_i2c_platform_data), GFP_KERNEL); if (!pdata) { dev_err(&client->dev, "failed to get allocate memory\n"); ret = -ENOMEM; goto probe_pdata; } ret = pn547_parse_dt(&client->dev, pdata); if (ret < 0) { dev_err(&client->dev, "failed to parse device tree: %d\n", ret); goto probe_parse_dt; } ret = board_nfc_parse_dt(&client->dev, pdata); if (ret < 0) { dev_err(&client->dev, "failed to parse device tree: %d\n", ret); goto probe_parse_dt; } if (pdata->dynamic_config) { ret = board_nfc_hw_lag_check(client, pdata); if (ret < 0) goto probe_hw_lag_check; } ret = pn547_gpio_request(&client->dev, pdata); if (ret) { dev_err(&client->dev, "failed to request gpio\n"); goto probe_gpio_request; } dev_dbg(&client->dev, "%s:\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "%s: i2c check failed\n", __func__); ret = -ENODEV; goto probe_i2c; } dev = kzalloc(sizeof(struct pn547_dev), GFP_KERNEL); if (!dev) { dev_err(&client->dev, "%s: no memory\n", __func__); ret = -ENOMEM; goto probe_mem; } dev->i2c_client = client; dev->dev = &client->dev; dev->pdata = pdata; init_waitqueue_head(&dev->wq); wake_lock_init(&dev->wake_lock, WAKE_LOCK_SUSPEND, "pn547"); i2c_set_clientdata(client, dev); dev->state = PN547_STATE_UNKNOWN; ret = request_threaded_irq(client->irq, NULL, pn547_dev_irq_handler, IRQF_TRIGGER_RISING | IRQF_ONESHOT, client->name, dev); if (IS_ERR_VALUE(ret)) { dev_err(&client->dev, "%s: irq request err %d\n", __func__, ret); goto probe_irq; } nfc_clk = clk_get(&client->dev, "nfc_clk"); if (IS_ERR(nfc_clk)) { dev_err(&client->dev, "Couldn't get nfc_clk\n"); goto probe_clk; } ret = clk_prepare_enable(nfc_clk); if (ret) { dev_err(&client->dev, "nfc_clk enable is failed\n"); goto probe_clk_enable; } ret = pn547_dev_create_sysfs_entries(dev->i2c_client); if (IS_ERR_VALUE(ret)) { dev_err(&client->dev, "%s: create sysfs entries err %d\n", __func__, ret); goto probe_sysfs; } return ret; probe_sysfs: free_irq(client->irq, dev); probe_clk_enable: clk_put(nfc_clk); probe_clk: probe_irq: i2c_set_clientdata(client, NULL); wake_lock_destroy(&dev->wake_lock); kzfree(dev); probe_mem: probe_i2c: pn547_gpio_release(pdata); probe_gpio_request: probe_hw_lag_check: probe_parse_dt: kzfree(pdata); probe_pdata: dev_err(&client->dev, "%s: err %d\n", __func__, ret); return ret; }
static int pn547_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = 0; int rc = 0; struct clk *nfc_clk = NULL; struct pn547_i2c_platform_data *platform_data; struct pn547_dev *pn547_dev; printk("### %s begin! \n",__func__); dev_info(&client->dev, "%s ++\n", __func__); platform_data = kzalloc(sizeof(struct pn547_i2c_platform_data), GFP_KERNEL); if (platform_data == NULL) { dev_err(&client->dev, "failed to allocate memory\n"); ret = -ENOMEM; goto err_platform_data; } printk("### %s 11 begin! \n",__func__); ret = pn547_parse_dt(&client->dev, platform_data); if (ret < 0) { dev_err(&client->dev, "failed to parse device tree: %d\n", ret); goto err_parse_dt; } printk("pn547 dev kobj_name=%s,init_name=%s,id=%d\n",client->dev.kobj.name,client->dev.init_name, client->dev.id); nfc_clk = clk_get(&client->dev, "nfc_pn547clk"); if (nfc_clk == NULL) { dev_err(&client->dev, "failed to get clk: %d\n", ret); goto err_parse_dt; } rc = clk_set_rate(nfc_clk,19200000); if(rc){ dev_err(&client->dev, "Clock set rate failed: %d\n",rc); } ret = clk_prepare_enable(nfc_clk); if (ret) { dev_err(&client->dev, "failed to enable clk: %d\n", ret); goto err_parse_dt; } ret = pn547_gpio_request(&client->dev, platform_data); if (ret) { dev_err(&client->dev, "failed to request gpio\n"); goto err_gpio_request; } dev_dbg(&client->dev, "%s:\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "%s: i2c check failed\n", __func__); ret = -ENODEV; goto err_i2c; } printk("### %s 22 begin! \n",__func__); pn547_dev = kzalloc(sizeof(*pn547_dev), GFP_KERNEL); if (pn547_dev == NULL) { dev_err(&client->dev, "failed to allocate memory for module data\n"); ret = -ENOMEM; goto err_exit; } client->irq = gpio_to_irq(platform_data->irq_gpio); pn547_dev->irq_gpio = platform_data->irq_gpio; pn547_dev->ven_gpio = platform_data->ven_gpio; pn547_dev->firm_gpio = platform_data->fwdl_en_gpio; pn547_dev->clk_req_gpio = platform_data->clk_req_gpio; pn547_dev->client = client; pn547_dev->dev = &client->dev; pn547_dev->do_reading = 0; /* Initialise mutex and work queue */ init_waitqueue_head(&pn547_dev->read_wq); mutex_init(&pn547_dev->read_mutex); spin_lock_init(&pn547_dev->irq_enabled_lock); wake_lock_init(&pn547_dev->wl,WAKE_LOCK_SUSPEND,"nfc_locker"); pn547_dev->pn547_device.minor = MISC_DYNAMIC_MINOR; pn547_dev->pn547_device.name = "pn544"; pn547_dev->pn547_device.fops = &pn547_dev_fops; printk("### %s 33 begin! \n",__func__); ret = misc_register(&pn547_dev->pn547_device); if (ret) { dev_err(&client->dev, "%s: misc_register err %d\n", __func__, ret); goto err_misc_register; } /* request irq. the irq is set whenever the chip has data available * for reading. it is cleared when all data has been read. */ dev_info(&client->dev, "%s : requesting IRQ %d\n", __func__, client->irq); pn547_dev->irq_enabled = true; ret = request_irq(client->irq, pn547_dev_irq_handler, IRQF_TRIGGER_RISING | IRQF_NO_SUSPEND | IRQF_ONESHOT, client->name, pn547_dev); if (ret) { dev_err(&client->dev, "request_irq failed\n"); goto err_request_irq_failed; } pn547_disable_irq(pn547_dev); i2c_set_clientdata(client, pn547_dev); return 0; err_request_irq_failed: misc_deregister(&pn547_dev->pn547_device); err_misc_register: mutex_destroy(&pn547_dev->read_mutex); kfree(pn547_dev); err_exit: err_i2c: pn547_gpio_release(platform_data); err_gpio_request: err_parse_dt: kfree(platform_data); err_platform_data: dev_err(&client->dev, "%s: err %d\n", __func__, ret); return ret; }