Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09b03419 authored by Haojian Zhuang's avatar Haojian Zhuang Committed by Samuel Ortiz
Browse files

mfd: Append additional read write on 88pm860x



Append the additional read/write operation on 88pm860x for accessing
test page in 88PM860x.

Signed-off-by: default avatarHaojian Zhuang <haojian.zhuang@marvell.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent c9f560b3
Loading
Loading
Loading
Loading
+103 −0
Original line number Diff line number Diff line
@@ -126,6 +126,109 @@ out:
}
EXPORT_SYMBOL(pm860x_set_bits);

int pm860x_page_reg_read(struct i2c_client *i2c, int reg)
{
	struct pm860x_chip *chip = i2c_get_clientdata(i2c);
	unsigned char zero = 0;
	unsigned char data;
	int ret;

	mutex_lock(&chip->io_lock);
	pm860x_write_device(i2c, 0xFA, 0, &zero);
	pm860x_write_device(i2c, 0xFB, 0, &zero);
	pm860x_write_device(i2c, 0xFF, 0, &zero);
	ret = pm860x_read_device(i2c, reg, 1, &data);
	if (ret >= 0)
		ret = (int)data;
	pm860x_write_device(i2c, 0xFE, 0, &zero);
	pm860x_write_device(i2c, 0xFC, 0, &zero);
	mutex_unlock(&chip->io_lock);
	return ret;
}
EXPORT_SYMBOL(pm860x_page_reg_read);

int pm860x_page_reg_write(struct i2c_client *i2c, int reg,
			  unsigned char data)
{
	struct pm860x_chip *chip = i2c_get_clientdata(i2c);
	unsigned char zero;
	int ret;

	mutex_lock(&chip->io_lock);
	pm860x_write_device(i2c, 0xFA, 0, &zero);
	pm860x_write_device(i2c, 0xFB, 0, &zero);
	pm860x_write_device(i2c, 0xFF, 0, &zero);
	ret = pm860x_write_device(i2c, reg, 1, &data);
	pm860x_write_device(i2c, 0xFE, 0, &zero);
	pm860x_write_device(i2c, 0xFC, 0, &zero);
	mutex_unlock(&chip->io_lock);
	return ret;
}
EXPORT_SYMBOL(pm860x_page_reg_write);

int pm860x_page_bulk_read(struct i2c_client *i2c, int reg,
			  int count, unsigned char *buf)
{
	struct pm860x_chip *chip = i2c_get_clientdata(i2c);
	unsigned char zero = 0;
	int ret;

	mutex_lock(&chip->io_lock);
	pm860x_write_device(i2c, 0xFA, 0, &zero);
	pm860x_write_device(i2c, 0xFB, 0, &zero);
	pm860x_write_device(i2c, 0xFF, 0, &zero);
	ret = pm860x_read_device(i2c, reg, count, buf);
	pm860x_write_device(i2c, 0xFE, 0, &zero);
	pm860x_write_device(i2c, 0xFC, 0, &zero);
	mutex_unlock(&chip->io_lock);
	return ret;
}
EXPORT_SYMBOL(pm860x_page_bulk_read);

int pm860x_page_bulk_write(struct i2c_client *i2c, int reg,
			   int count, unsigned char *buf)
{
	struct pm860x_chip *chip = i2c_get_clientdata(i2c);
	unsigned char zero = 0;
	int ret;

	mutex_lock(&chip->io_lock);
	pm860x_write_device(i2c, 0xFA, 0, &zero);
	pm860x_write_device(i2c, 0xFB, 0, &zero);
	pm860x_write_device(i2c, 0xFF, 0, &zero);
	ret = pm860x_write_device(i2c, reg, count, buf);
	pm860x_write_device(i2c, 0xFE, 0, &zero);
	pm860x_write_device(i2c, 0xFC, 0, &zero);
	mutex_unlock(&chip->io_lock);
	return ret;
}
EXPORT_SYMBOL(pm860x_page_bulk_write);

int pm860x_page_set_bits(struct i2c_client *i2c, int reg,
			 unsigned char mask, unsigned char data)
{
	struct pm860x_chip *chip = i2c_get_clientdata(i2c);
	unsigned char zero;
	unsigned char value;
	int ret;

	mutex_lock(&chip->io_lock);
	pm860x_write_device(i2c, 0xFA, 0, &zero);
	pm860x_write_device(i2c, 0xFB, 0, &zero);
	pm860x_write_device(i2c, 0xFF, 0, &zero);
	ret = pm860x_read_device(i2c, reg, 1, &value);
	if (ret < 0)
		goto out;
	value &= ~mask;
	value |= data;
	ret = pm860x_write_device(i2c, reg, 1, &value);
out:
	pm860x_write_device(i2c, 0xFE, 0, &zero);
	pm860x_write_device(i2c, 0xFC, 0, &zero);
	mutex_unlock(&chip->io_lock);
	return ret;
}
EXPORT_SYMBOL(pm860x_page_set_bits);

static const struct i2c_device_id pm860x_id_table[] = {
	{ "88PM860x", 0 },
+8 −0
Original line number Diff line number Diff line
@@ -368,6 +368,14 @@ extern int pm860x_bulk_read(struct i2c_client *, int, int, unsigned char *);
extern int pm860x_bulk_write(struct i2c_client *, int, int, unsigned char *);
extern int pm860x_set_bits(struct i2c_client *, int, unsigned char,
			   unsigned char);
extern int pm860x_page_reg_read(struct i2c_client *, int);
extern int pm860x_page_reg_write(struct i2c_client *, int, unsigned char);
extern int pm860x_page_bulk_read(struct i2c_client *, int, int,
				 unsigned char *);
extern int pm860x_page_bulk_write(struct i2c_client *, int, int,
				  unsigned char *);
extern int pm860x_page_set_bits(struct i2c_client *, int, unsigned char,
				unsigned char);

extern int pm860x_device_init(struct pm860x_chip *chip,
			      struct pm860x_platform_data *pdata) __devinit ;