[PATCH] nfc: pn544: make the regulator more flexible

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Since different platform may have different regulator for NFC chip.
Make it more flexible to fit all these need.

Change-Id: I6f3f2db0092a7e76628b17ef1ce1ca2138b80a14
Signed-off-by: Neil Zhang <zhangwm@xxxxxxxxxxx>
---
 drivers/nfc/pn544.c       |   41 ++++++++++++++++++++++-------------------
 include/linux/nfc/pn544.h |    3 +++
 2 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/drivers/nfc/pn544.c b/drivers/nfc/pn544.c
index 88bc484..5e8d100 100644
--- a/drivers/nfc/pn544.c
+++ b/drivers/nfc/pn544.c
@@ -61,6 +61,7 @@ struct pn544_info {
 	struct miscdevice miscdev;
 	struct i2c_client *i2c_dev;
 	struct regulator_bulk_data regs[3];
+	unsigned int	regs_num;
 
 	enum pn544_state state;
 	wait_queue_head_t read_wait;
@@ -76,10 +77,6 @@ struct pn544_info {
 	unsigned int offset;    /* offset in rbuf */
 };
 
-static const char reg_vdd_io[]	= "Vdd_IO";
-static const char reg_vbat[]	= "VBat";
-static const char reg_vsim[]	= "VSim";
-
 /* sysfs interface */
 static ssize_t pn544_test(struct device *dev,
 			  struct device_attribute *attr, char *buf)
@@ -98,7 +95,7 @@ static int pn544_enable(struct pn544_info *info, int mode)
 
 	int r;
 
-	r = regulator_bulk_enable(ARRAY_SIZE(info->regs), info->regs);
+	r = regulator_bulk_enable(info->regs_num, info->regs);
 	if (r < 0)
 		return r;
 
@@ -138,7 +135,7 @@ static void pn544_disable(struct pn544_info *info)
 	msleep(PN544_RESETVEN_TIME);
 
 	info->read_irq = PN544_NONE;
-	regulator_bulk_disable(ARRAY_SIZE(info->regs), info->regs);
+	regulator_bulk_disable(info->regs_num, info->regs);
 }
 
 static int check_crc(u8 *buf, int buflen)
@@ -760,10 +757,17 @@ static int __devinit pn544_probe(struct i2c_client *client,
 	struct pn544_info *info;
 	struct pn544_nfc_platform_data *pdata;
 	int r = 0;
+	int i = 0;
 
 	dev_dbg(&client->dev, "%s\n", __func__);
 	dev_dbg(&client->dev, "IRQ: %d\n", client->irq);
 
+	pdata = client->dev.platform_data;
+	if (!pdata) {
+		dev_err(&client->dev, "No platform data\n");
+		return -EINVAL;
+	}
+
 	/* private data allocation */
 	info = kzalloc(sizeof(struct pn544_info), GFP_KERNEL);
 	if (!info) {
@@ -782,11 +786,16 @@ static int __devinit pn544_probe(struct i2c_client *client,
 		goto err_buf_alloc;
 	}
 
-	info->regs[0].supply = reg_vdd_io;
-	info->regs[1].supply = reg_vbat;
-	info->regs[2].supply = reg_vsim;
-	r = regulator_bulk_get(&client->dev, ARRAY_SIZE(info->regs),
-				 info->regs);
+	info->regs_num = pdata->regulator_num;
+	if (info->regs_num > 3) {
+		dev_warn(&client->dev, "the regulator should less than 3.\n");
+		info->regs_num = 3;
+	}
+
+	for (i = 0; i < info->regs_num; i++)
+		info->regs[i].supply = pdata->regulator_name[i];
+
+	r = regulator_bulk_get(&client->dev, info->regs_num, info->regs);
 	if (r < 0)
 		goto err_buf_alloc;
 
@@ -797,12 +806,6 @@ static int __devinit pn544_probe(struct i2c_client *client,
 	mutex_init(&info->mutex);
 	init_waitqueue_head(&info->read_wait);
 	i2c_set_clientdata(client, info);
-	pdata = client->dev.platform_data;
-	if (!pdata) {
-		dev_err(&client->dev, "No platform data\n");
-		r = -EINVAL;
-		goto err_reg;
-	}
 
 	if (!pdata->request_resources) {
 		dev_err(&client->dev, "request_resources() missing\n");
@@ -857,7 +860,7 @@ err_res:
 	if (pdata->free_resources)
 		pdata->free_resources();
 err_reg:
-	regulator_bulk_free(ARRAY_SIZE(info->regs), info->regs);
+	regulator_bulk_free(info->regs_num, info->regs);
 err_buf_alloc:
 	if (info->rbuf)
 		kfree(info->rbuf);
@@ -894,7 +897,7 @@ static __devexit int pn544_remove(struct i2c_client *client)
 	if (pdata->free_resources)
 		pdata->free_resources();
 
-	regulator_bulk_free(ARRAY_SIZE(info->regs), info->regs);
+	regulator_bulk_free(info->regs_num, info->regs);
 	kfree(info->rbuf);
 	kfree(info->wbuf);
 	kfree(info);
diff --git a/include/linux/nfc/pn544.h b/include/linux/nfc/pn544.h
index cd1a76f..35c529e 100644
--- a/include/linux/nfc/pn544.h
+++ b/include/linux/nfc/pn544.h
@@ -100,6 +100,9 @@ struct pn544_nfc_platform_data {
 	void (*enable) (int fw);
 	int (*test) (void);
 	void (*disable) (void);
+
+	unsigned int	regulator_num;
+	char		**regulator_name;
 };
 #endif /* __KERNEL__ */
 
-- 
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux