mfd: Append additional read write on 88pm860x
Append the additional read/write operation on 88pm860x for accessing test page in 88PM860x. Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
		
					parent
					
						
							
								c9f560b3d0
							
						
					
				
			
			
				commit
				
					
						09b034191a
					
				
			
		
					 2 changed files with 111 additions and 0 deletions
				
			
		| 
						 | 
					@ -126,6 +126,109 @@ out:
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(pm860x_set_bits);
 | 
					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[] = {
 | 
					static const struct i2c_device_id pm860x_id_table[] = {
 | 
				
			||||||
	{ "88PM860x", 0 },
 | 
						{ "88PM860x", 0 },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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_bulk_write(struct i2c_client *, int, int, unsigned char *);
 | 
				
			||||||
extern int pm860x_set_bits(struct i2c_client *, int, unsigned char,
 | 
					extern int pm860x_set_bits(struct i2c_client *, int, unsigned char,
 | 
				
			||||||
			   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,
 | 
					extern int pm860x_device_init(struct pm860x_chip *chip,
 | 
				
			||||||
			      struct pm860x_platform_data *pdata) __devinit ;
 | 
								      struct pm860x_platform_data *pdata) __devinit ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue