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;
}