[v2] rtc: ds1307: convert driver to regmap

Submitted by Heiner Kallweit on March 10, 2017, 5:52 p.m.

Details

Message ID 36fd14db-4bd7-dce5-b699-8b621af72f2a@gmail.com
State New
Headers show

Commit Message

Heiner Kallweit March 10, 2017, 5:52 p.m.
This patch converts the ds1307 driver to using regmap. It's a rather
big patch and I can test with DS3231 only. With this chip it's
working fine.

I'd appreciate if people with other supported hardware could test as
well.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
v2:
- rebased on top of latest rtc tree
---
 drivers/rtc/rtc-ds1307.c | 603 +++++++++++++++++------------------------------
 1 file changed, 221 insertions(+), 382 deletions(-)

Comments

Alexandre Belloni April 22, 2017, 1:50 p.m.
Hi,

On 10/03/2017 at 18:52:34 +0100, Heiner Kallweit wrote:
> This patch converts the ds1307 driver to using regmap. It's a rather
> big patch and I can test with DS3231 only. With this chip it's
> working fine.
> 
> I'd appreciate if people with other supported hardware could test as
> well.
> 

Just to let you know that I'll review and hopefully apply that patch
early in the next cycle so we can get as much testing as possible (let's
hope so).

> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> ---
> v2:
> - rebased on top of latest rtc tree
> ---
>  drivers/rtc/rtc-ds1307.c | 603 +++++++++++++++++------------------------------
>  1 file changed, 221 insertions(+), 382 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
> index f085b487..1d0a1535 100644
> --- a/drivers/rtc/rtc-ds1307.c
> +++ b/drivers/rtc/rtc-ds1307.c
> @@ -24,6 +24,7 @@
>  #include <linux/hwmon.h>
>  #include <linux/hwmon-sysfs.h>
>  #include <linux/clk-provider.h>
> +#include <linux/regmap.h>
>  
>  /*
>   * We can't determine type by probing, but if we expect pre-Linux code
> @@ -118,12 +119,11 @@ struct ds1307 {
>  	unsigned long		flags;
>  #define HAS_NVRAM	0		/* bit 0 == sysfs file active */
>  #define HAS_ALARM	1		/* bit 1 == irq claimed */
> -	struct i2c_client	*client;
> +	struct device		*dev;
> +	struct regmap		*regmap;
> +	const char		*name;
> +	int			irq;
>  	struct rtc_device	*rtc;
> -	s32 (*read_block_data)(const struct i2c_client *client, u8 command,
> -			       u8 length, u8 *values);
> -	s32 (*write_block_data)(const struct i2c_client *client, u8 command,
> -				u8 length, const u8 *values);
>  #ifdef CONFIG_COMMON_CLK
>  	struct clk_hw		clks[2];
>  #endif
> @@ -135,11 +135,11 @@ struct chip_desc {
>  	u16			nvram_size;
>  	u16			trickle_charger_reg;
>  	u8			trickle_charger_setup;
> -	u8			(*do_trickle_setup)(struct i2c_client *, uint32_t, bool);
> +	u8			(*do_trickle_setup)(struct ds1307 *, uint32_t,
> +						    bool);
>  };
>  
> -static u8 do_trickle_setup_ds1339(struct i2c_client *,
> -				  uint32_t ohms, bool diode);
> +static u8 do_trickle_setup_ds1339(struct ds1307 *, uint32_t ohms, bool diode);
>  
>  static struct chip_desc chips[last_ds_type] = {
>  	[ds_1307] = {
> @@ -272,136 +272,6 @@ static const struct acpi_device_id ds1307_acpi_ids[] = {
>  MODULE_DEVICE_TABLE(acpi, ds1307_acpi_ids);
>  #endif
>  
> -/*----------------------------------------------------------------------*/
> -
> -#define BLOCK_DATA_MAX_TRIES 10
> -
> -static s32 ds1307_read_block_data_once(const struct i2c_client *client,
> -				       u8 command, u8 length, u8 *values)
> -{
> -	s32 i, data;
> -
> -	for (i = 0; i < length; i++) {
> -		data = i2c_smbus_read_byte_data(client, command + i);
> -		if (data < 0)
> -			return data;
> -		values[i] = data;
> -	}
> -	return i;
> -}
> -
> -static s32 ds1307_read_block_data(const struct i2c_client *client, u8 command,
> -				  u8 length, u8 *values)
> -{
> -	u8 oldvalues[255];
> -	s32 ret;
> -	int tries = 0;
> -
> -	dev_dbg(&client->dev, "ds1307_read_block_data (length=%d)\n", length);
> -	ret = ds1307_read_block_data_once(client, command, length, values);
> -	if (ret < 0)
> -		return ret;
> -	do {
> -		if (++tries > BLOCK_DATA_MAX_TRIES) {
> -			dev_err(&client->dev,
> -				"ds1307_read_block_data failed\n");
> -			return -EIO;
> -		}
> -		memcpy(oldvalues, values, length);
> -		ret = ds1307_read_block_data_once(client, command, length,
> -						  values);
> -		if (ret < 0)
> -			return ret;
> -	} while (memcmp(oldvalues, values, length));
> -	return length;
> -}
> -
> -static s32 ds1307_write_block_data(const struct i2c_client *client, u8 command,
> -				   u8 length, const u8 *values)
> -{
> -	u8 currvalues[255];
> -	int tries = 0;
> -
> -	dev_dbg(&client->dev, "ds1307_write_block_data (length=%d)\n", length);
> -	do {
> -		s32 i, ret;
> -
> -		if (++tries > BLOCK_DATA_MAX_TRIES) {
> -			dev_err(&client->dev,
> -				"ds1307_write_block_data failed\n");
> -			return -EIO;
> -		}
> -		for (i = 0; i < length; i++) {
> -			ret = i2c_smbus_write_byte_data(client, command + i,
> -							values[i]);
> -			if (ret < 0)
> -				return ret;
> -		}
> -		ret = ds1307_read_block_data_once(client, command, length,
> -						  currvalues);
> -		if (ret < 0)
> -			return ret;
> -	} while (memcmp(currvalues, values, length));
> -	return length;
> -}
> -
> -/*----------------------------------------------------------------------*/
> -
> -/* These RTC devices are not designed to be connected to a SMbus adapter.
> -   SMbus limits block operations length to 32 bytes, whereas it's not
> -   limited on I2C buses. As a result, accesses may exceed 32 bytes;
> -   in that case, split them into smaller blocks */
> -
> -static s32 ds1307_native_smbus_write_block_data(const struct i2c_client *client,
> -				u8 command, u8 length, const u8 *values)
> -{
> -	u8 suboffset = 0;
> -
> -	if (length <= I2C_SMBUS_BLOCK_MAX) {
> -		s32 retval = i2c_smbus_write_i2c_block_data(client,
> -					command, length, values);
> -		if (retval < 0)
> -			return retval;
> -		return length;
> -	}
> -
> -	while (suboffset < length) {
> -		s32 retval = i2c_smbus_write_i2c_block_data(client,
> -				command + suboffset,
> -				min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
> -				values + suboffset);
> -		if (retval < 0)
> -			return retval;
> -
> -		suboffset += I2C_SMBUS_BLOCK_MAX;
> -	}
> -	return length;
> -}
> -
> -static s32 ds1307_native_smbus_read_block_data(const struct i2c_client *client,
> -				u8 command, u8 length, u8 *values)
> -{
> -	u8 suboffset = 0;
> -
> -	if (length <= I2C_SMBUS_BLOCK_MAX)
> -		return i2c_smbus_read_i2c_block_data(client,
> -					command, length, values);
> -
> -	while (suboffset < length) {
> -		s32 retval = i2c_smbus_read_i2c_block_data(client,
> -				command + suboffset,
> -				min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
> -				values + suboffset);
> -		if (retval < 0)
> -			return retval;
> -
> -		suboffset += I2C_SMBUS_BLOCK_MAX;
> -	}
> -	return length;
> -}
> -
> -/*----------------------------------------------------------------------*/
> -
>  /*
>   * The ds1337 and ds1339 both have two alarms, but we only use the first
>   * one (with a "seconds" field).  For ds1337 we expect nINTA is our alarm
> @@ -409,26 +279,25 @@ static s32 ds1307_native_smbus_read_block_data(const struct i2c_client *client,
>   */
>  static irqreturn_t ds1307_irq(int irq, void *dev_id)
>  {
> -	struct i2c_client	*client = dev_id;
> -	struct ds1307		*ds1307 = i2c_get_clientdata(client);
> +	struct ds1307		*ds1307 = dev_id;
>  	struct mutex		*lock = &ds1307->rtc->ops_lock;
> -	int			stat, control;
> +	int			stat, control, ret;
>  
>  	mutex_lock(lock);
> -	stat = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
> -	if (stat < 0)
> +	ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &stat);
> +	if (ret)
>  		goto out;
>  
>  	if (stat & DS1337_BIT_A1I) {
>  		stat &= ~DS1337_BIT_A1I;
> -		i2c_smbus_write_byte_data(client, DS1337_REG_STATUS, stat);
> +		regmap_write(ds1307->regmap, DS1337_REG_STATUS, stat);
>  
> -		control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
> -		if (control < 0)
> +		ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
> +		if (ret)
>  			goto out;
>  
>  		control &= ~DS1337_BIT_A1IE;
> -		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, control);
> +		regmap_write(ds1307->regmap, DS1337_REG_CONTROL, control);
>  
>  		rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
>  	}
> @@ -444,14 +313,13 @@ static irqreturn_t ds1307_irq(int irq, void *dev_id)
>  static int ds1307_get_time(struct device *dev, struct rtc_time *t)
>  {
>  	struct ds1307	*ds1307 = dev_get_drvdata(dev);
> -	int		tmp;
> +	int		tmp, ret;
>  
>  	/* read the RTC date and time registers all at once */
> -	tmp = ds1307->read_block_data(ds1307->client,
> -		ds1307->offset, 7, ds1307->regs);
> -	if (tmp != 7) {
> -		dev_err(dev, "%s error %d\n", "read", tmp);
> -		return -EIO;
> +	ret = regmap_bulk_read(ds1307->regmap, ds1307->offset, ds1307->regs, 7);
> +	if (ret) {
> +		dev_err(dev, "%s error %d\n", "read", ret);
> +		return ret;
>  	}
>  
>  	dev_dbg(dev, "%s: %7ph\n", "read", ds1307->regs);
> @@ -565,9 +433,8 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
>  
>  	dev_dbg(dev, "%s: %7ph\n", "write", buf);
>  
> -	result = ds1307->write_block_data(ds1307->client,
> -		ds1307->offset, 7, buf);
> -	if (result < 0) {
> +	result = regmap_bulk_write(ds1307->regmap, ds1307->offset, buf, 7);
> +	if (result) {
>  		dev_err(dev, "%s error %d\n", "write", result);
>  		return result;
>  	}
> @@ -576,19 +443,18 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
>  
>  static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
>  {
> -	struct i2c_client       *client = to_i2c_client(dev);
> -	struct ds1307		*ds1307 = i2c_get_clientdata(client);
> +	struct ds1307		*ds1307 = dev_get_drvdata(dev);
>  	int			ret;
>  
>  	if (!test_bit(HAS_ALARM, &ds1307->flags))
>  		return -EINVAL;
>  
>  	/* read all ALARM1, ALARM2, and status registers at once */
> -	ret = ds1307->read_block_data(client,
> -			DS1339_REG_ALARM1_SECS, 9, ds1307->regs);
> -	if (ret != 9) {
> +	ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS,
> +			       ds1307->regs, 9);
> +	if (ret) {
>  		dev_err(dev, "%s error %d\n", "alarm read", ret);
> -		return -EIO;
> +		return ret;
>  	}
>  
>  	dev_dbg(dev, "%s: %4ph, %3ph, %2ph\n", "alarm read",
> @@ -618,8 +484,7 @@ static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
>  
>  static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  {
> -	struct i2c_client	*client = to_i2c_client(dev);
> -	struct ds1307		*ds1307 = i2c_get_clientdata(client);
> +	struct ds1307		*ds1307 = dev_get_drvdata(dev);
>  	unsigned char		*buf = ds1307->regs;
>  	u8			control, status;
>  	int			ret;
> @@ -634,11 +499,10 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  		t->enabled, t->pending);
>  
>  	/* read current status of both alarms and the chip */
> -	ret = ds1307->read_block_data(client,
> -			DS1339_REG_ALARM1_SECS, 9, buf);
> -	if (ret != 9) {
> +	ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
> +	if (ret) {
>  		dev_err(dev, "%s error %d\n", "alarm write", ret);
> -		return -EIO;
> +		return ret;
>  	}
>  	control = ds1307->regs[7];
>  	status = ds1307->regs[8];
> @@ -661,9 +525,8 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  	buf[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
>  	buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
>  
> -	ret = ds1307->write_block_data(client,
> -			DS1339_REG_ALARM1_SECS, 9, buf);
> -	if (ret < 0) {
> +	ret = regmap_bulk_write(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
> +	if (ret) {
>  		dev_err(dev, "can't set alarm time\n");
>  		return ret;
>  	}
> @@ -672,7 +535,7 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  	if (t->enabled) {
>  		dev_dbg(dev, "alarm IRQ armed\n");
>  		buf[7] |= DS1337_BIT_A1IE;	/* only ALARM1 is used */
> -		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, buf[7]);
> +		regmap_write(ds1307->regmap, DS1337_REG_CONTROL, buf[7]);
>  	}
>  
>  	return 0;
> @@ -680,27 +543,22 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  
>  static int ds1307_alarm_irq_enable(struct device *dev, unsigned int enabled)
>  {
> -	struct i2c_client	*client = to_i2c_client(dev);
> -	struct ds1307		*ds1307 = i2c_get_clientdata(client);
> -	int			ret;
> +	struct ds1307		*ds1307 = dev_get_drvdata(dev);
> +	int			control, ret;
>  
>  	if (!test_bit(HAS_ALARM, &ds1307->flags))
>  		return -ENOTTY;
>  
> -	ret = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
> -	if (ret < 0)
> +	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
> +	if (ret)
>  		return ret;
>  
>  	if (enabled)
> -		ret |= DS1337_BIT_A1IE;
> +		control |= DS1337_BIT_A1IE;
>  	else
> -		ret &= ~DS1337_BIT_A1IE;
> -
> -	ret = i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, ret);
> -	if (ret < 0)
> -		return ret;
> +		control &= ~DS1337_BIT_A1IE;
>  
> -	return 0;
> +	return regmap_write(ds1307->regmap, DS1337_REG_CONTROL, control);
>  }
>  
>  static const struct rtc_class_ops ds13xx_rtc_ops = {
> @@ -737,31 +595,30 @@ static const struct rtc_class_ops ds13xx_rtc_ops = {
>  
>  static irqreturn_t mcp794xx_irq(int irq, void *dev_id)
>  {
> -	struct i2c_client       *client = dev_id;
> -	struct ds1307           *ds1307 = i2c_get_clientdata(client);
> +	struct ds1307           *ds1307 = dev_id;
>  	struct mutex            *lock = &ds1307->rtc->ops_lock;
>  	int reg, ret;
>  
>  	mutex_lock(lock);
>  
>  	/* Check and clear alarm 0 interrupt flag. */
> -	reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_ALARM0_CTRL);
> -	if (reg < 0)
> +	ret = regmap_read(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, &reg);
> +	if (ret)
>  		goto out;
>  	if (!(reg & MCP794XX_BIT_ALMX_IF))
>  		goto out;
>  	reg &= ~MCP794XX_BIT_ALMX_IF;
> -	ret = i2c_smbus_write_byte_data(client, MCP794XX_REG_ALARM0_CTRL, reg);
> -	if (ret < 0)
> +	ret = regmap_write(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, reg);
> +	if (ret)
>  		goto out;
>  
>  	/* Disable alarm 0. */
> -	reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_CONTROL);
> -	if (reg < 0)
> +	ret = regmap_read(ds1307->regmap, MCP794XX_REG_CONTROL, &reg);
> +	if (ret)
>  		goto out;
>  	reg &= ~MCP794XX_BIT_ALM0_EN;
> -	ret = i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, reg);
> -	if (ret < 0)
> +	ret = regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, reg);
> +	if (ret)
>  		goto out;
>  
>  	rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
> @@ -774,8 +631,7 @@ static irqreturn_t mcp794xx_irq(int irq, void *dev_id)
>  
>  static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
>  {
> -	struct i2c_client *client = to_i2c_client(dev);
> -	struct ds1307 *ds1307 = i2c_get_clientdata(client);
> +	struct ds1307 *ds1307 = dev_get_drvdata(dev);
>  	u8 *regs = ds1307->regs;
>  	int ret;
>  
> @@ -783,8 +639,8 @@ static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
>  		return -EINVAL;
>  
>  	/* Read control and alarm 0 registers. */
> -	ret = ds1307->read_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
> -	if (ret < 0)
> +	ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
> +	if (ret)
>  		return ret;
>  
>  	t->enabled = !!(regs[0] & MCP794XX_BIT_ALM0_EN);
> @@ -813,8 +669,7 @@ static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
>  
>  static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  {
> -	struct i2c_client *client = to_i2c_client(dev);
> -	struct ds1307 *ds1307 = i2c_get_clientdata(client);
> +	struct ds1307 *ds1307 = dev_get_drvdata(dev);
>  	unsigned char *regs = ds1307->regs;
>  	int ret;
>  
> @@ -828,8 +683,8 @@ static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  		t->enabled, t->pending);
>  
>  	/* Read control and alarm 0 registers. */
> -	ret = ds1307->read_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
> -	if (ret < 0)
> +	ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
> +	if (ret)
>  		return ret;
>  
>  	/* Set alarm 0, using 24-hour and day-of-month modes. */
> @@ -847,35 +702,34 @@ static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  	/* Disable interrupt. We will not enable until completely programmed */
>  	regs[0] &= ~MCP794XX_BIT_ALM0_EN;
>  
> -	ret = ds1307->write_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
> -	if (ret < 0)
> +	ret = regmap_bulk_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
> +	if (ret)
>  		return ret;
>  
>  	if (!t->enabled)
>  		return 0;
>  	regs[0] |= MCP794XX_BIT_ALM0_EN;
> -	return i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, regs[0]);
> +	return regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs[0]);
>  }
>  
>  static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled)
>  {
> -	struct i2c_client *client = to_i2c_client(dev);
> -	struct ds1307 *ds1307 = i2c_get_clientdata(client);
> -	int reg;
> +	struct ds1307 *ds1307 = dev_get_drvdata(dev);
> +	int reg, ret;
>  
>  	if (!test_bit(HAS_ALARM, &ds1307->flags))
>  		return -EINVAL;
>  
> -	reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_CONTROL);
> -	if (reg < 0)
> -		return reg;
> +	ret = regmap_read(ds1307->regmap, MCP794XX_REG_CONTROL, &reg);
> +	if (ret)
> +		return ret;
>  
>  	if (enabled)
>  		reg |= MCP794XX_BIT_ALM0_EN;
>  	else
>  		reg &= ~MCP794XX_BIT_ALM0_EN;
>  
> -	return i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, reg);
> +	return regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, reg);
>  }
>  
>  static const struct rtc_class_ops mcp794xx_rtc_ops = {
> @@ -893,17 +747,15 @@ ds1307_nvram_read(struct file *filp, struct kobject *kobj,
>  		struct bin_attribute *attr,
>  		char *buf, loff_t off, size_t count)
>  {
> -	struct i2c_client	*client;
>  	struct ds1307		*ds1307;
>  	int			result;
>  
> -	client = kobj_to_i2c_client(kobj);
> -	ds1307 = i2c_get_clientdata(client);
> +	ds1307 = dev_get_drvdata(kobj_to_dev(kobj));
>  
> -	result = ds1307->read_block_data(client, ds1307->nvram_offset + off,
> -								count, buf);
> -	if (result < 0)
> -		dev_err(&client->dev, "%s error %d\n", "nvram read", result);
> +	result = regmap_bulk_read(ds1307->regmap, ds1307->nvram_offset + off,
> +				  buf, count);
> +	if (result)
> +		dev_err(ds1307->dev, "%s error %d\n", "nvram read", result);
>  	return result;
>  }
>  
> @@ -912,17 +764,15 @@ ds1307_nvram_write(struct file *filp, struct kobject *kobj,
>  		struct bin_attribute *attr,
>  		char *buf, loff_t off, size_t count)
>  {
> -	struct i2c_client	*client;
>  	struct ds1307		*ds1307;
>  	int			result;
>  
> -	client = kobj_to_i2c_client(kobj);
> -	ds1307 = i2c_get_clientdata(client);
> +	ds1307 = dev_get_drvdata(kobj_to_dev(kobj));
>  
> -	result = ds1307->write_block_data(client, ds1307->nvram_offset + off,
> -								count, buf);
> -	if (result < 0) {
> -		dev_err(&client->dev, "%s error %d\n", "nvram write", result);
> +	result = regmap_bulk_write(ds1307->regmap, ds1307->nvram_offset + off,
> +				   buf, count);
> +	if (result) {
> +		dev_err(ds1307->dev, "%s error %d\n", "nvram write", result);
>  		return result;
>  	}
>  	return count;
> @@ -931,7 +781,7 @@ ds1307_nvram_write(struct file *filp, struct kobject *kobj,
>  
>  /*----------------------------------------------------------------------*/
>  
> -static u8 do_trickle_setup_ds1339(struct i2c_client *client,
> +static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307,
>  				  uint32_t ohms, bool diode)
>  {
>  	u8 setup = (diode) ? DS1307_TRICKLE_CHARGER_DIODE :
> @@ -948,14 +798,14 @@ static u8 do_trickle_setup_ds1339(struct i2c_client *client,
>  		setup |= DS1307_TRICKLE_CHARGER_4K_OHM;
>  		break;
>  	default:
> -		dev_warn(&client->dev,
> +		dev_warn(ds1307->dev,
>  			 "Unsupported ohm value %u in dt\n", ohms);
>  		return 0;
>  	}
>  	return setup;
>  }
>  
> -static void ds1307_trickle_init(struct i2c_client *client,
> +static void ds1307_trickle_init(struct ds1307 *ds1307,
>  				struct chip_desc *chip)
>  {
>  	uint32_t ohms = 0;
> @@ -963,11 +813,12 @@ static void ds1307_trickle_init(struct i2c_client *client,
>  
>  	if (!chip->do_trickle_setup)
>  		goto out;
> -	if (device_property_read_u32(&client->dev, "trickle-resistor-ohms", &ohms))
> +	if (device_property_read_u32(ds1307->dev, "trickle-resistor-ohms",
> +				     &ohms))
>  		goto out;
> -	if (device_property_read_bool(&client->dev, "trickle-diode-disable"))
> +	if (device_property_read_bool(ds1307->dev, "trickle-diode-disable"))
>  		diode = false;
> -	chip->trickle_charger_setup = chip->do_trickle_setup(client,
> +	chip->trickle_charger_setup = chip->do_trickle_setup(ds1307,
>  							     ohms, diode);
>  out:
>  	return;
> @@ -994,13 +845,10 @@ static int ds3231_hwmon_read_temp(struct device *dev, s32 *mC)
>  	s16 temp;
>  	int ret;
>  
> -	ret = ds1307->read_block_data(ds1307->client, DS3231_REG_TEMPERATURE,
> -					sizeof(temp_buf), temp_buf);
> -	if (ret < 0)
> +	ret = regmap_bulk_read(ds1307->regmap, DS3231_REG_TEMPERATURE,
> +			       temp_buf, sizeof(temp_buf));
> +	if (ret)
>  		return ret;
> -	if (ret != sizeof(temp_buf))
> -		return -EIO;
> -
>  	/*
>  	 * Temperature is represented as a 10-bit code with a resolution of
>  	 * 0.25 degree celsius and encoded in two's complement format.
> @@ -1040,12 +888,11 @@ static void ds1307_hwmon_register(struct ds1307 *ds1307)
>  	if (ds1307->type != ds_3231)
>  		return;
>  
> -	dev = devm_hwmon_device_register_with_groups(&ds1307->client->dev,
> -						ds1307->client->name,
> +	dev = devm_hwmon_device_register_with_groups(ds1307->dev, ds1307->name,
>  						ds1307, ds3231_hwmon_groups);
>  	if (IS_ERR(dev)) {
> -		dev_warn(&ds1307->client->dev,
> -			"unable to register hwmon device %ld\n", PTR_ERR(dev));
> +		dev_warn(ds1307->dev, "unable to register hwmon device %ld\n",
> +			 PTR_ERR(dev));
>  	}
>  }
>  
> @@ -1084,23 +931,20 @@ static int ds3231_clk_sqw_rates[] = {
>  
>  static int ds1337_write_control(struct ds1307 *ds1307, u8 mask, u8 value)
>  {
> -	struct i2c_client *client = ds1307->client;
>  	struct mutex *lock = &ds1307->rtc->ops_lock;
>  	int control;
>  	int ret;
>  
>  	mutex_lock(lock);
>  
> -	control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
> -	if (control < 0) {
> -		ret = control;
> +	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
> +	if (ret)
>  		goto out;
> -	}
>  
>  	control &= ~mask;
>  	control |= value;
>  
> -	ret = i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, control);
> +	ret = regmap_write(ds1307->regmap, DS1337_REG_CONTROL, control);
>  out:
>  	mutex_unlock(lock);
>  
> @@ -1111,12 +955,12 @@ static unsigned long ds3231_clk_sqw_recalc_rate(struct clk_hw *hw,
>  						unsigned long parent_rate)
>  {
>  	struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
> -	int control;
> +	int control, ret;
>  	int rate_sel = 0;
>  
> -	control = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_CONTROL);
> -	if (control < 0)
> -		return control;
> +	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
> +	if (ret)
> +		return ret;
>  	if (control & DS1337_BIT_RS1)
>  		rate_sel += 1;
>  	if (control & DS1337_BIT_RS2)
> @@ -1180,11 +1024,11 @@ static void ds3231_clk_sqw_unprepare(struct clk_hw *hw)
>  static int ds3231_clk_sqw_is_prepared(struct clk_hw *hw)
>  {
>  	struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
> -	int control;
> +	int control, ret;
>  
> -	control = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_CONTROL);
> -	if (control < 0)
> -		return control;
> +	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
> +	if (ret)
> +		return ret;
>  
>  	return !(control & DS1337_BIT_INTCN);
>  }
> @@ -1206,25 +1050,22 @@ static unsigned long ds3231_clk_32khz_recalc_rate(struct clk_hw *hw,
>  
>  static int ds3231_clk_32khz_control(struct ds1307 *ds1307, bool enable)
>  {
> -	struct i2c_client *client = ds1307->client;
>  	struct mutex *lock = &ds1307->rtc->ops_lock;
>  	int status;
>  	int ret;
>  
>  	mutex_lock(lock);
>  
> -	status = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
> -	if (status < 0) {
> -		ret = status;
> +	ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &status);
> +	if (ret)
>  		goto out;
> -	}
>  
>  	if (enable)
>  		status |= DS3231_BIT_EN32KHZ;
>  	else
>  		status &= ~DS3231_BIT_EN32KHZ;
>  
> -	ret = i2c_smbus_write_byte_data(client, DS1337_REG_STATUS, status);
> +	ret = regmap_write(ds1307->regmap, DS1337_REG_STATUS, status);
>  out:
>  	mutex_unlock(lock);
>  
> @@ -1248,11 +1089,11 @@ static void ds3231_clk_32khz_unprepare(struct clk_hw *hw)
>  static int ds3231_clk_32khz_is_prepared(struct clk_hw *hw)
>  {
>  	struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
> -	int status;
> +	int status, ret;
>  
> -	status = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_STATUS);
> -	if (status < 0)
> -		return status;
> +	ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &status);
> +	if (ret)
> +		return ret;
>  
>  	return !!(status & DS3231_BIT_EN32KHZ);
>  }
> @@ -1277,18 +1118,17 @@ static struct clk_init_data ds3231_clks_init[] = {
>  
>  static int ds3231_clks_register(struct ds1307 *ds1307)
>  {
> -	struct i2c_client *client = ds1307->client;
> -	struct device_node *node = client->dev.of_node;
> +	struct device_node *node = ds1307->dev->of_node;
>  	struct clk_onecell_data	*onecell;
>  	int i;
>  
> -	onecell = devm_kzalloc(&client->dev, sizeof(*onecell), GFP_KERNEL);
> +	onecell = devm_kzalloc(ds1307->dev, sizeof(*onecell), GFP_KERNEL);
>  	if (!onecell)
>  		return -ENOMEM;
>  
>  	onecell->clk_num = ARRAY_SIZE(ds3231_clks_init);
> -	onecell->clks = devm_kcalloc(&client->dev, onecell->clk_num,
> -					sizeof(onecell->clks[0]), GFP_KERNEL);
> +	onecell->clks = devm_kcalloc(ds1307->dev, onecell->clk_num,
> +				     sizeof(onecell->clks[0]), GFP_KERNEL);
>  	if (!onecell->clks)
>  		return -ENOMEM;
>  
> @@ -1307,8 +1147,8 @@ static int ds3231_clks_register(struct ds1307 *ds1307)
>  						&init.name);
>  		ds1307->clks[i].init = &init;
>  
> -		onecell->clks[i] = devm_clk_register(&client->dev,
> -							&ds1307->clks[i]);
> +		onecell->clks[i] = devm_clk_register(ds1307->dev,
> +						     &ds1307->clks[i]);
>  		if (IS_ERR(onecell->clks[i]))
>  			return PTR_ERR(onecell->clks[i]);
>  	}
> @@ -1330,8 +1170,8 @@ static void ds1307_clks_register(struct ds1307 *ds1307)
>  
>  	ret = ds3231_clks_register(ds1307);
>  	if (ret) {
> -		dev_warn(&ds1307->client->dev,
> -			"unable to register clock device %d\n", ret);
> +		dev_warn(ds1307->dev, "unable to register clock device %d\n",
> +			 ret);
>  	}
>  }
>  
> @@ -1343,6 +1183,12 @@ static void ds1307_clks_register(struct ds1307 *ds1307)
>  
>  #endif /* CONFIG_COMMON_CLK */
>  
> +static const struct regmap_config regmap_config = {
> +	.reg_bits = 8,
> +	.val_bits = 8,
> +	.max_register = 0x12,
> +};
> +
>  static int ds1307_probe(struct i2c_client *client,
>  			const struct i2c_device_id *id)
>  {
> @@ -1350,7 +1196,6 @@ static int ds1307_probe(struct i2c_client *client,
>  	int			err = -ENODEV;
>  	int			tmp, wday;
>  	struct chip_desc	*chip;
> -	struct i2c_adapter	*adapter = to_i2c_adapter(client->dev.parent);
>  	bool			want_irq = false;
>  	bool			ds1307_can_wakeup_device = false;
>  	unsigned char		*buf;
> @@ -1367,17 +1212,22 @@ static int ds1307_probe(struct i2c_client *client,
>  	};
>  	const struct rtc_class_ops *rtc_ops = &ds13xx_rtc_ops;
>  
> -	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)
> -	    && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK))
> -		return -EIO;
> -
>  	ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
>  	if (!ds1307)
>  		return -ENOMEM;
>  
> -	i2c_set_clientdata(client, ds1307);
> +	dev_set_drvdata(&client->dev, ds1307);
> +	ds1307->dev = &client->dev;
> +	ds1307->name = client->name;
> +	ds1307->irq = client->irq;
> +
> +	ds1307->regmap = devm_regmap_init_i2c(client, &regmap_config);
> +	if (IS_ERR(ds1307->regmap)) {
> +		dev_err(ds1307->dev, "regmap allocation failed\n");
> +		return PTR_ERR(ds1307->regmap);
> +	}
>  
> -	ds1307->client	= client;
> +	i2c_set_clientdata(client, ds1307);
>  
>  	if (client->dev.of_node) {
>  		ds1307->type = (enum ds_type)
> @@ -1390,7 +1240,7 @@ static int ds1307_probe(struct i2c_client *client,
>  		const struct acpi_device_id *acpi_id;
>  
>  		acpi_id = acpi_match_device(ACPI_PTR(ds1307_acpi_ids),
> -					    &client->dev);
> +					    ds1307->dev);
>  		if (!acpi_id)
>  			return -ENODEV;
>  		chip = &chips[acpi_id->driver_data];
> @@ -1398,27 +1248,21 @@ static int ds1307_probe(struct i2c_client *client,
>  	}
>  
>  	if (!pdata)
> -		ds1307_trickle_init(client, chip);
> +		ds1307_trickle_init(ds1307, chip);
>  	else if (pdata->trickle_charger_setup)
>  		chip->trickle_charger_setup = pdata->trickle_charger_setup;
>  
>  	if (chip->trickle_charger_setup && chip->trickle_charger_reg) {
> -		dev_dbg(&client->dev, "writing trickle charger info 0x%x to 0x%x\n",
> +		dev_dbg(ds1307->dev,
> +			"writing trickle charger info 0x%x to 0x%x\n",
>  		    DS13XX_TRICKLE_CHARGER_MAGIC | chip->trickle_charger_setup,
>  		    chip->trickle_charger_reg);
> -		i2c_smbus_write_byte_data(client, chip->trickle_charger_reg,
> +		regmap_write(ds1307->regmap, chip->trickle_charger_reg,
>  		    DS13XX_TRICKLE_CHARGER_MAGIC |
>  		    chip->trickle_charger_setup);
>  	}
>  
>  	buf = ds1307->regs;
> -	if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) {
> -		ds1307->read_block_data = ds1307_native_smbus_read_block_data;
> -		ds1307->write_block_data = ds1307_native_smbus_write_block_data;
> -	} else {
> -		ds1307->read_block_data = ds1307_read_block_data;
> -		ds1307->write_block_data = ds1307_write_block_data;
> -	}
>  
>  #ifdef CONFIG_OF
>  /*
> @@ -1444,11 +1288,10 @@ static int ds1307_probe(struct i2c_client *client,
>  	case ds_1339:
>  	case ds_3231:
>  		/* get registers that the "rtc" read below won't read... */
> -		tmp = ds1307->read_block_data(ds1307->client,
> -				DS1337_REG_CONTROL, 2, buf);
> -		if (tmp != 2) {
> -			dev_dbg(&client->dev, "read error %d\n", tmp);
> -			err = -EIO;
> +		err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
> +				       buf, 2);
> +		if (err) {
> +			dev_dbg(ds1307->dev, "read error %d\n", err);
>  			goto exit;
>  		}
>  
> @@ -1462,8 +1305,8 @@ static int ds1307_probe(struct i2c_client *client,
>  		 * For some variants, be sure alarms can trigger when we're
>  		 * running on Vbackup (BBSQI/BBSQW)
>  		 */
> -		if (chip->alarm && (ds1307->client->irq > 0 ||
> -						ds1307_can_wakeup_device)) {
> +		if (chip->alarm && (ds1307->irq > 0 ||
> +				    ds1307_can_wakeup_device)) {
>  			ds1307->regs[0] |= DS1337_BIT_INTCN
>  					| bbsqi_bitpos[ds1307->type];
>  			ds1307->regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE);
> @@ -1471,50 +1314,49 @@ static int ds1307_probe(struct i2c_client *client,
>  			want_irq = true;
>  		}
>  
> -		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL,
> -							ds1307->regs[0]);
> +		regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
> +			     ds1307->regs[0]);
>  
>  		/* oscillator fault?  clear flag, and warn */
>  		if (ds1307->regs[1] & DS1337_BIT_OSF) {
> -			i2c_smbus_write_byte_data(client, DS1337_REG_STATUS,
> -				ds1307->regs[1] & ~DS1337_BIT_OSF);
> -			dev_warn(&client->dev, "SET TIME!\n");
> +			regmap_write(ds1307->regmap, DS1337_REG_STATUS,
> +				     ds1307->regs[1] & ~DS1337_BIT_OSF);
> +			dev_warn(ds1307->dev, "SET TIME!\n");
>  		}
>  		break;
>  
>  	case rx_8025:
> -		tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
> -				RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
> -		if (tmp != 2) {
> -			dev_dbg(&client->dev, "read error %d\n", tmp);
> -			err = -EIO;
> +		err = regmap_bulk_read(ds1307->regmap,
> +				       RX8025_REG_CTRL1 << 4 | 0x08, buf, 2);
> +		if (err) {
> +			dev_dbg(ds1307->dev, "read error %d\n", err);
>  			goto exit;
>  		}
>  
>  		/* oscillator off?  turn it on, so clock can tick. */
>  		if (!(ds1307->regs[1] & RX8025_BIT_XST)) {
>  			ds1307->regs[1] |= RX8025_BIT_XST;
> -			i2c_smbus_write_byte_data(client,
> -						  RX8025_REG_CTRL2 << 4 | 0x08,
> -						  ds1307->regs[1]);
> -			dev_warn(&client->dev,
> +			regmap_write(ds1307->regmap,
> +				     RX8025_REG_CTRL2 << 4 | 0x08,
> +				     ds1307->regs[1]);
> +			dev_warn(ds1307->dev,
>  				 "oscillator stop detected - SET TIME!\n");
>  		}
>  
>  		if (ds1307->regs[1] & RX8025_BIT_PON) {
>  			ds1307->regs[1] &= ~RX8025_BIT_PON;
> -			i2c_smbus_write_byte_data(client,
> -						  RX8025_REG_CTRL2 << 4 | 0x08,
> -						  ds1307->regs[1]);
> -			dev_warn(&client->dev, "power-on detected\n");
> +			regmap_write(ds1307->regmap,
> +				     RX8025_REG_CTRL2 << 4 | 0x08,
> +				     ds1307->regs[1]);
> +			dev_warn(ds1307->dev, "power-on detected\n");
>  		}
>  
>  		if (ds1307->regs[1] & RX8025_BIT_VDET) {
>  			ds1307->regs[1] &= ~RX8025_BIT_VDET;
> -			i2c_smbus_write_byte_data(client,
> -						  RX8025_REG_CTRL2 << 4 | 0x08,
> -						  ds1307->regs[1]);
> -			dev_warn(&client->dev, "voltage drop detected\n");
> +			regmap_write(ds1307->regmap,
> +				     RX8025_REG_CTRL2 << 4 | 0x08,
> +				     ds1307->regs[1]);
> +			dev_warn(ds1307->dev, "voltage drop detected\n");
>  		}
>  
>  		/* make sure we are running in 24hour mode */
> @@ -1522,16 +1364,15 @@ static int ds1307_probe(struct i2c_client *client,
>  			u8 hour;
>  
>  			/* switch to 24 hour mode */
> -			i2c_smbus_write_byte_data(client,
> -						  RX8025_REG_CTRL1 << 4 | 0x08,
> -						  ds1307->regs[0] |
> -						  RX8025_BIT_2412);
> -
> -			tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
> -					RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
> -			if (tmp != 2) {
> -				dev_dbg(&client->dev, "read error %d\n", tmp);
> -				err = -EIO;
> +			regmap_write(ds1307->regmap,
> +				     RX8025_REG_CTRL1 << 4 | 0x08,
> +				     ds1307->regs[0] | RX8025_BIT_2412);
> +
> +			err = regmap_bulk_read(ds1307->regmap,
> +					       RX8025_REG_CTRL1 << 4 | 0x08,
> +					       buf, 2);
> +			if (err) {
> +				dev_dbg(ds1307->dev, "read error %d\n", err);
>  				goto exit;
>  			}
>  
> @@ -1542,9 +1383,8 @@ static int ds1307_probe(struct i2c_client *client,
>  			if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
>  				hour += 12;
>  
> -			i2c_smbus_write_byte_data(client,
> -						  DS1307_REG_HOUR << 4 | 0x08,
> -						  hour);
> +			regmap_write(ds1307->regmap,
> +				     DS1307_REG_HOUR << 4 | 0x08, hour);
>  		}
>  		break;
>  	case ds_1388:
> @@ -1552,7 +1392,7 @@ static int ds1307_probe(struct i2c_client *client,
>  		break;
>  	case mcp794xx:
>  		rtc_ops = &mcp794xx_rtc_ops;
> -		if (ds1307->client->irq > 0 && chip->alarm) {
> +		if (ds1307->irq > 0 && chip->alarm) {
>  			irq_handler = mcp794xx_irq;
>  			want_irq = true;
>  		}
> @@ -1563,10 +1403,9 @@ static int ds1307_probe(struct i2c_client *client,
>  
>  read_rtc:
>  	/* read RTC registers */
> -	tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf);
> -	if (tmp != 8) {
> -		dev_dbg(&client->dev, "read error %d\n", tmp);
> -		err = -EIO;
> +	err = regmap_bulk_read(ds1307->regmap, ds1307->offset, buf, 8);
> +	if (err) {
> +		dev_dbg(ds1307->dev, "read error %d\n", err);
>  		goto exit;
>  	}
>  
> @@ -1581,56 +1420,55 @@ static int ds1307_probe(struct i2c_client *client,
>  	case m41t00:
>  		/* clock halted?  turn it on, so clock can tick. */
>  		if (tmp & DS1307_BIT_CH) {
> -			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
> -			dev_warn(&client->dev, "SET TIME!\n");
> +			regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
> +			dev_warn(ds1307->dev, "SET TIME!\n");
>  			goto read_rtc;
>  		}
>  		break;
>  	case ds_1338:
>  		/* clock halted?  turn it on, so clock can tick. */
>  		if (tmp & DS1307_BIT_CH)
> -			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
> +			regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
>  
>  		/* oscillator fault?  clear flag, and warn */
>  		if (ds1307->regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
> -			i2c_smbus_write_byte_data(client, DS1307_REG_CONTROL,
> -					ds1307->regs[DS1307_REG_CONTROL]
> -					& ~DS1338_BIT_OSF);
> -			dev_warn(&client->dev, "SET TIME!\n");
> +			regmap_write(ds1307->regmap, DS1307_REG_CONTROL,
> +					ds1307->regs[DS1307_REG_CONTROL] &
> +					~DS1338_BIT_OSF);
> +			dev_warn(ds1307->dev, "SET TIME!\n");
>  			goto read_rtc;
>  		}
>  		break;
>  	case ds_1340:
>  		/* clock halted?  turn it on, so clock can tick. */
>  		if (tmp & DS1340_BIT_nEOSC)
> -			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
> +			regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
>  
> -		tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
> -		if (tmp < 0) {
> -			dev_dbg(&client->dev, "read error %d\n", tmp);
> -			err = -EIO;
> +		err = regmap_read(ds1307->regmap, DS1340_REG_FLAG, &tmp);
> +		if (err) {
> +			dev_dbg(ds1307->dev, "read error %d\n", err);
>  			goto exit;
>  		}
>  
>  		/* oscillator fault?  clear flag, and warn */
>  		if (tmp & DS1340_BIT_OSF) {
> -			i2c_smbus_write_byte_data(client, DS1340_REG_FLAG, 0);
> -			dev_warn(&client->dev, "SET TIME!\n");
> +			regmap_write(ds1307->regmap, DS1340_REG_FLAG, 0);
> +			dev_warn(ds1307->dev, "SET TIME!\n");
>  		}
>  		break;
>  	case mcp794xx:
>  		/* make sure that the backup battery is enabled */
>  		if (!(ds1307->regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
> -			i2c_smbus_write_byte_data(client, DS1307_REG_WDAY,
> -					ds1307->regs[DS1307_REG_WDAY]
> -					| MCP794XX_BIT_VBATEN);
> +			regmap_write(ds1307->regmap, DS1307_REG_WDAY,
> +				     ds1307->regs[DS1307_REG_WDAY] |
> +				     MCP794XX_BIT_VBATEN);
>  		}
>  
>  		/* clock halted?  turn it on, so clock can tick. */
>  		if (!(tmp & MCP794XX_BIT_ST)) {
> -			i2c_smbus_write_byte_data(client, DS1307_REG_SECS,
> -					MCP794XX_BIT_ST);
> -			dev_warn(&client->dev, "SET TIME!\n");
> +			regmap_write(ds1307->regmap, DS1307_REG_SECS,
> +				     MCP794XX_BIT_ST);
> +			dev_warn(ds1307->dev, "SET TIME!\n");
>  			goto read_rtc;
>  		}
>  
> @@ -1663,16 +1501,15 @@ static int ds1307_probe(struct i2c_client *client,
>  			tmp = 0;
>  		if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
>  			tmp += 12;
> -		i2c_smbus_write_byte_data(client,
> -				ds1307->offset + DS1307_REG_HOUR,
> -				bin2bcd(tmp));
> +		regmap_write(ds1307->regmap, ds1307->offset + DS1307_REG_HOUR,
> +			     bin2bcd(tmp));
>  	}
>  
>  	/*
>  	 * Some IPs have weekday reset value = 0x1 which might not correct
>  	 * hence compute the wday using the current date/month/year values
>  	 */
> -	ds1307_get_time(&client->dev, &tm);
> +	ds1307_get_time(ds1307->dev, &tm);
>  	wday = tm.tm_wday;
>  	timestamp = rtc_tm_to_time64(&tm);
>  	rtc_time64_to_tm(timestamp, &tm);
> @@ -1683,51 +1520,53 @@ static int ds1307_probe(struct i2c_client *client,
>  	 * timestamp
>  	 */
>  	if (wday != tm.tm_wday) {
> -		wday = i2c_smbus_read_byte_data(client, MCP794XX_REG_WEEKDAY);
> +		regmap_read(ds1307->regmap, MCP794XX_REG_WEEKDAY, &wday);
>  		wday = wday & ~MCP794XX_REG_WEEKDAY_WDAY_MASK;
>  		wday = wday | (tm.tm_wday + 1);
> -		i2c_smbus_write_byte_data(client, MCP794XX_REG_WEEKDAY, wday);
> +		regmap_write(ds1307->regmap, MCP794XX_REG_WEEKDAY, wday);
>  	}
>  
>  	if (want_irq) {
> -		device_set_wakeup_capable(&client->dev, true);
> +		device_set_wakeup_capable(ds1307->dev, true);
>  		set_bit(HAS_ALARM, &ds1307->flags);
>  	}
> -	ds1307->rtc = devm_rtc_device_register(&client->dev, client->name,
> +	ds1307->rtc = devm_rtc_device_register(ds1307->dev, ds1307->name,
>  				rtc_ops, THIS_MODULE);
>  	if (IS_ERR(ds1307->rtc)) {
>  		return PTR_ERR(ds1307->rtc);
>  	}
>  
> -	if (ds1307_can_wakeup_device && ds1307->client->irq <= 0) {
> +	if (ds1307_can_wakeup_device && ds1307->irq <= 0) {
>  		/* Disable request for an IRQ */
>  		want_irq = false;
> -		dev_info(&client->dev, "'wakeup-source' is set, request for an IRQ is disabled!\n");
> +		dev_info(ds1307->dev,
> +			 "'wakeup-source' is set, request for an IRQ is disabled!\n");
>  		/* We cannot support UIE mode if we do not have an IRQ line */
>  		ds1307->rtc->uie_unsupported = 1;
>  	}
>  
>  	if (want_irq) {
> -		err = devm_request_threaded_irq(&client->dev,
> -						client->irq, NULL, irq_handler,
> +		err = devm_request_threaded_irq(ds1307->dev,
> +						ds1307->irq, NULL, irq_handler,
>  						IRQF_SHARED | IRQF_ONESHOT,
> -						ds1307->rtc->name, client);
> +						ds1307->rtc->name, ds1307);
>  		if (err) {
>  			client->irq = 0;
> -			device_set_wakeup_capable(&client->dev, false);
> +			device_set_wakeup_capable(ds1307->dev, false);
>  			clear_bit(HAS_ALARM, &ds1307->flags);
> -			dev_err(&client->dev, "unable to request IRQ!\n");
> +			dev_err(ds1307->dev, "unable to request IRQ!\n");
>  		} else
> -			dev_dbg(&client->dev, "got IRQ %d\n", client->irq);
> +			dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
>  	}
>  
>  	if (chip->nvram_size) {
>  
> -		ds1307->nvram = devm_kzalloc(&client->dev,
> +		ds1307->nvram = devm_kzalloc(ds1307->dev,
>  					sizeof(struct bin_attribute),
>  					GFP_KERNEL);
>  		if (!ds1307->nvram) {
> -			dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n");
> +			dev_err(ds1307->dev,
> +				"cannot allocate memory for nvram sysfs\n");
>  		} else {
>  
>  			ds1307->nvram->attr.name = "nvram";
> @@ -1740,15 +1579,15 @@ static int ds1307_probe(struct i2c_client *client,
>  			ds1307->nvram->size = chip->nvram_size;
>  			ds1307->nvram_offset = chip->nvram_offset;
>  
> -			err = sysfs_create_bin_file(&client->dev.kobj,
> +			err = sysfs_create_bin_file(&ds1307->dev->kobj,
>  						    ds1307->nvram);
>  			if (err) {
> -				dev_err(&client->dev,
> +				dev_err(ds1307->dev,
>  					"unable to create sysfs file: %s\n",
>  					ds1307->nvram->attr.name);
>  			} else {
>  				set_bit(HAS_NVRAM, &ds1307->flags);
> -				dev_info(&client->dev, "%zu bytes nvram\n",
> +				dev_info(ds1307->dev, "%zu bytes nvram\n",
>  					 ds1307->nvram->size);
>  			}
>  		}
> @@ -1768,7 +1607,7 @@ static int ds1307_remove(struct i2c_client *client)
>  	struct ds1307 *ds1307 = i2c_get_clientdata(client);
>  
>  	if (test_and_clear_bit(HAS_NVRAM, &ds1307->flags))
> -		sysfs_remove_bin_file(&client->dev.kobj, ds1307->nvram);
> +		sysfs_remove_bin_file(&ds1307->dev->kobj, ds1307->nvram);
>  
>  	return 0;
>  }
> -- 
> 2.12.0
> 
>
Alexandre Belloni May 26, 2017, 1:08 a.m.
On 10/03/2017 at 18:52:34 +0100, Heiner Kallweit wrote:
> This patch converts the ds1307 driver to using regmap. It's a rather
> big patch and I can test with DS3231 only. With this chip it's
> working fine.
> 
> I'd appreciate if people with other supported hardware could test as
> well.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> ---
> v2:
> - rebased on top of latest rtc tree
> ---
>  drivers/rtc/rtc-ds1307.c | 603 +++++++++++++++++------------------------------
>  1 file changed, 221 insertions(+), 382 deletions(-)
> 
Applied, thanks.

Patch hide | download patch | download mbox

diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index f085b487..1d0a1535 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -24,6 +24,7 @@ 
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
 #include <linux/clk-provider.h>
+#include <linux/regmap.h>
 
 /*
  * We can't determine type by probing, but if we expect pre-Linux code
@@ -118,12 +119,11 @@  struct ds1307 {
 	unsigned long		flags;
 #define HAS_NVRAM	0		/* bit 0 == sysfs file active */
 #define HAS_ALARM	1		/* bit 1 == irq claimed */
-	struct i2c_client	*client;
+	struct device		*dev;
+	struct regmap		*regmap;
+	const char		*name;
+	int			irq;
 	struct rtc_device	*rtc;
-	s32 (*read_block_data)(const struct i2c_client *client, u8 command,
-			       u8 length, u8 *values);
-	s32 (*write_block_data)(const struct i2c_client *client, u8 command,
-				u8 length, const u8 *values);
 #ifdef CONFIG_COMMON_CLK
 	struct clk_hw		clks[2];
 #endif
@@ -135,11 +135,11 @@  struct chip_desc {
 	u16			nvram_size;
 	u16			trickle_charger_reg;
 	u8			trickle_charger_setup;
-	u8			(*do_trickle_setup)(struct i2c_client *, uint32_t, bool);
+	u8			(*do_trickle_setup)(struct ds1307 *, uint32_t,
+						    bool);
 };
 
-static u8 do_trickle_setup_ds1339(struct i2c_client *,
-				  uint32_t ohms, bool diode);
+static u8 do_trickle_setup_ds1339(struct ds1307 *, uint32_t ohms, bool diode);
 
 static struct chip_desc chips[last_ds_type] = {
 	[ds_1307] = {
@@ -272,136 +272,6 @@  static const struct acpi_device_id ds1307_acpi_ids[] = {
 MODULE_DEVICE_TABLE(acpi, ds1307_acpi_ids);
 #endif
 
-/*----------------------------------------------------------------------*/
-
-#define BLOCK_DATA_MAX_TRIES 10
-
-static s32 ds1307_read_block_data_once(const struct i2c_client *client,
-				       u8 command, u8 length, u8 *values)
-{
-	s32 i, data;
-
-	for (i = 0; i < length; i++) {
-		data = i2c_smbus_read_byte_data(client, command + i);
-		if (data < 0)
-			return data;
-		values[i] = data;
-	}
-	return i;
-}
-
-static s32 ds1307_read_block_data(const struct i2c_client *client, u8 command,
-				  u8 length, u8 *values)
-{
-	u8 oldvalues[255];
-	s32 ret;
-	int tries = 0;
-
-	dev_dbg(&client->dev, "ds1307_read_block_data (length=%d)\n", length);
-	ret = ds1307_read_block_data_once(client, command, length, values);
-	if (ret < 0)
-		return ret;
-	do {
-		if (++tries > BLOCK_DATA_MAX_TRIES) {
-			dev_err(&client->dev,
-				"ds1307_read_block_data failed\n");
-			return -EIO;
-		}
-		memcpy(oldvalues, values, length);
-		ret = ds1307_read_block_data_once(client, command, length,
-						  values);
-		if (ret < 0)
-			return ret;
-	} while (memcmp(oldvalues, values, length));
-	return length;
-}
-
-static s32 ds1307_write_block_data(const struct i2c_client *client, u8 command,
-				   u8 length, const u8 *values)
-{
-	u8 currvalues[255];
-	int tries = 0;
-
-	dev_dbg(&client->dev, "ds1307_write_block_data (length=%d)\n", length);
-	do {
-		s32 i, ret;
-
-		if (++tries > BLOCK_DATA_MAX_TRIES) {
-			dev_err(&client->dev,
-				"ds1307_write_block_data failed\n");
-			return -EIO;
-		}
-		for (i = 0; i < length; i++) {
-			ret = i2c_smbus_write_byte_data(client, command + i,
-							values[i]);
-			if (ret < 0)
-				return ret;
-		}
-		ret = ds1307_read_block_data_once(client, command, length,
-						  currvalues);
-		if (ret < 0)
-			return ret;
-	} while (memcmp(currvalues, values, length));
-	return length;
-}
-
-/*----------------------------------------------------------------------*/
-
-/* These RTC devices are not designed to be connected to a SMbus adapter.
-   SMbus limits block operations length to 32 bytes, whereas it's not
-   limited on I2C buses. As a result, accesses may exceed 32 bytes;
-   in that case, split them into smaller blocks */
-
-static s32 ds1307_native_smbus_write_block_data(const struct i2c_client *client,
-				u8 command, u8 length, const u8 *values)
-{
-	u8 suboffset = 0;
-
-	if (length <= I2C_SMBUS_BLOCK_MAX) {
-		s32 retval = i2c_smbus_write_i2c_block_data(client,
-					command, length, values);
-		if (retval < 0)
-			return retval;
-		return length;
-	}
-
-	while (suboffset < length) {
-		s32 retval = i2c_smbus_write_i2c_block_data(client,
-				command + suboffset,
-				min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
-				values + suboffset);
-		if (retval < 0)
-			return retval;
-
-		suboffset += I2C_SMBUS_BLOCK_MAX;
-	}
-	return length;
-}
-
-static s32 ds1307_native_smbus_read_block_data(const struct i2c_client *client,
-				u8 command, u8 length, u8 *values)
-{
-	u8 suboffset = 0;
-
-	if (length <= I2C_SMBUS_BLOCK_MAX)
-		return i2c_smbus_read_i2c_block_data(client,
-					command, length, values);
-
-	while (suboffset < length) {
-		s32 retval = i2c_smbus_read_i2c_block_data(client,
-				command + suboffset,
-				min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
-				values + suboffset);
-		if (retval < 0)
-			return retval;
-
-		suboffset += I2C_SMBUS_BLOCK_MAX;
-	}
-	return length;
-}
-
-/*----------------------------------------------------------------------*/
-
 /*
  * The ds1337 and ds1339 both have two alarms, but we only use the first
  * one (with a "seconds" field).  For ds1337 we expect nINTA is our alarm
@@ -409,26 +279,25 @@  static s32 ds1307_native_smbus_read_block_data(const struct i2c_client *client,
  */
 static irqreturn_t ds1307_irq(int irq, void *dev_id)
 {
-	struct i2c_client	*client = dev_id;
-	struct ds1307		*ds1307 = i2c_get_clientdata(client);
+	struct ds1307		*ds1307 = dev_id;
 	struct mutex		*lock = &ds1307->rtc->ops_lock;
-	int			stat, control;
+	int			stat, control, ret;
 
 	mutex_lock(lock);
-	stat = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
-	if (stat < 0)
+	ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &stat);
+	if (ret)
 		goto out;
 
 	if (stat & DS1337_BIT_A1I) {
 		stat &= ~DS1337_BIT_A1I;
-		i2c_smbus_write_byte_data(client, DS1337_REG_STATUS, stat);
+		regmap_write(ds1307->regmap, DS1337_REG_STATUS, stat);
 
-		control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
-		if (control < 0)
+		ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
+		if (ret)
 			goto out;
 
 		control &= ~DS1337_BIT_A1IE;
-		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, control);
+		regmap_write(ds1307->regmap, DS1337_REG_CONTROL, control);
 
 		rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
 	}
@@ -444,14 +313,13 @@  static irqreturn_t ds1307_irq(int irq, void *dev_id)
 static int ds1307_get_time(struct device *dev, struct rtc_time *t)
 {
 	struct ds1307	*ds1307 = dev_get_drvdata(dev);
-	int		tmp;
+	int		tmp, ret;
 
 	/* read the RTC date and time registers all at once */
-	tmp = ds1307->read_block_data(ds1307->client,
-		ds1307->offset, 7, ds1307->regs);
-	if (tmp != 7) {
-		dev_err(dev, "%s error %d\n", "read", tmp);
-		return -EIO;
+	ret = regmap_bulk_read(ds1307->regmap, ds1307->offset, ds1307->regs, 7);
+	if (ret) {
+		dev_err(dev, "%s error %d\n", "read", ret);
+		return ret;
 	}
 
 	dev_dbg(dev, "%s: %7ph\n", "read", ds1307->regs);
@@ -565,9 +433,8 @@  static int ds1307_set_time(struct device *dev, struct rtc_time *t)
 
 	dev_dbg(dev, "%s: %7ph\n", "write", buf);
 
-	result = ds1307->write_block_data(ds1307->client,
-		ds1307->offset, 7, buf);
-	if (result < 0) {
+	result = regmap_bulk_write(ds1307->regmap, ds1307->offset, buf, 7);
+	if (result) {
 		dev_err(dev, "%s error %d\n", "write", result);
 		return result;
 	}
@@ -576,19 +443,18 @@  static int ds1307_set_time(struct device *dev, struct rtc_time *t)
 
 static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
 {
-	struct i2c_client       *client = to_i2c_client(dev);
-	struct ds1307		*ds1307 = i2c_get_clientdata(client);
+	struct ds1307		*ds1307 = dev_get_drvdata(dev);
 	int			ret;
 
 	if (!test_bit(HAS_ALARM, &ds1307->flags))
 		return -EINVAL;
 
 	/* read all ALARM1, ALARM2, and status registers at once */
-	ret = ds1307->read_block_data(client,
-			DS1339_REG_ALARM1_SECS, 9, ds1307->regs);
-	if (ret != 9) {
+	ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS,
+			       ds1307->regs, 9);
+	if (ret) {
 		dev_err(dev, "%s error %d\n", "alarm read", ret);
-		return -EIO;
+		return ret;
 	}
 
 	dev_dbg(dev, "%s: %4ph, %3ph, %2ph\n", "alarm read",
@@ -618,8 +484,7 @@  static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
 
 static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 {
-	struct i2c_client	*client = to_i2c_client(dev);
-	struct ds1307		*ds1307 = i2c_get_clientdata(client);
+	struct ds1307		*ds1307 = dev_get_drvdata(dev);
 	unsigned char		*buf = ds1307->regs;
 	u8			control, status;
 	int			ret;
@@ -634,11 +499,10 @@  static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 		t->enabled, t->pending);
 
 	/* read current status of both alarms and the chip */
-	ret = ds1307->read_block_data(client,
-			DS1339_REG_ALARM1_SECS, 9, buf);
-	if (ret != 9) {
+	ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
+	if (ret) {
 		dev_err(dev, "%s error %d\n", "alarm write", ret);
-		return -EIO;
+		return ret;
 	}
 	control = ds1307->regs[7];
 	status = ds1307->regs[8];
@@ -661,9 +525,8 @@  static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 	buf[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
 	buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
 
-	ret = ds1307->write_block_data(client,
-			DS1339_REG_ALARM1_SECS, 9, buf);
-	if (ret < 0) {
+	ret = regmap_bulk_write(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
+	if (ret) {
 		dev_err(dev, "can't set alarm time\n");
 		return ret;
 	}
@@ -672,7 +535,7 @@  static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 	if (t->enabled) {
 		dev_dbg(dev, "alarm IRQ armed\n");
 		buf[7] |= DS1337_BIT_A1IE;	/* only ALARM1 is used */
-		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, buf[7]);
+		regmap_write(ds1307->regmap, DS1337_REG_CONTROL, buf[7]);
 	}
 
 	return 0;
@@ -680,27 +543,22 @@  static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 
 static int ds1307_alarm_irq_enable(struct device *dev, unsigned int enabled)
 {
-	struct i2c_client	*client = to_i2c_client(dev);
-	struct ds1307		*ds1307 = i2c_get_clientdata(client);
-	int			ret;
+	struct ds1307		*ds1307 = dev_get_drvdata(dev);
+	int			control, ret;
 
 	if (!test_bit(HAS_ALARM, &ds1307->flags))
 		return -ENOTTY;
 
-	ret = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
-	if (ret < 0)
+	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
+	if (ret)
 		return ret;
 
 	if (enabled)
-		ret |= DS1337_BIT_A1IE;
+		control |= DS1337_BIT_A1IE;
 	else
-		ret &= ~DS1337_BIT_A1IE;
-
-	ret = i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, ret);
-	if (ret < 0)
-		return ret;
+		control &= ~DS1337_BIT_A1IE;
 
-	return 0;
+	return regmap_write(ds1307->regmap, DS1337_REG_CONTROL, control);
 }
 
 static const struct rtc_class_ops ds13xx_rtc_ops = {
@@ -737,31 +595,30 @@  static const struct rtc_class_ops ds13xx_rtc_ops = {
 
 static irqreturn_t mcp794xx_irq(int irq, void *dev_id)
 {
-	struct i2c_client       *client = dev_id;
-	struct ds1307           *ds1307 = i2c_get_clientdata(client);
+	struct ds1307           *ds1307 = dev_id;
 	struct mutex            *lock = &ds1307->rtc->ops_lock;
 	int reg, ret;
 
 	mutex_lock(lock);
 
 	/* Check and clear alarm 0 interrupt flag. */
-	reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_ALARM0_CTRL);
-	if (reg < 0)
+	ret = regmap_read(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, &reg);
+	if (ret)
 		goto out;
 	if (!(reg & MCP794XX_BIT_ALMX_IF))
 		goto out;
 	reg &= ~MCP794XX_BIT_ALMX_IF;
-	ret = i2c_smbus_write_byte_data(client, MCP794XX_REG_ALARM0_CTRL, reg);
-	if (ret < 0)
+	ret = regmap_write(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, reg);
+	if (ret)
 		goto out;
 
 	/* Disable alarm 0. */
-	reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_CONTROL);
-	if (reg < 0)
+	ret = regmap_read(ds1307->regmap, MCP794XX_REG_CONTROL, &reg);
+	if (ret)
 		goto out;
 	reg &= ~MCP794XX_BIT_ALM0_EN;
-	ret = i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, reg);
-	if (ret < 0)
+	ret = regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, reg);
+	if (ret)
 		goto out;
 
 	rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
@@ -774,8 +631,7 @@  static irqreturn_t mcp794xx_irq(int irq, void *dev_id)
 
 static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
 {
-	struct i2c_client *client = to_i2c_client(dev);
-	struct ds1307 *ds1307 = i2c_get_clientdata(client);
+	struct ds1307 *ds1307 = dev_get_drvdata(dev);
 	u8 *regs = ds1307->regs;
 	int ret;
 
@@ -783,8 +639,8 @@  static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
 		return -EINVAL;
 
 	/* Read control and alarm 0 registers. */
-	ret = ds1307->read_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
-	if (ret < 0)
+	ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
+	if (ret)
 		return ret;
 
 	t->enabled = !!(regs[0] & MCP794XX_BIT_ALM0_EN);
@@ -813,8 +669,7 @@  static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
 
 static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 {
-	struct i2c_client *client = to_i2c_client(dev);
-	struct ds1307 *ds1307 = i2c_get_clientdata(client);
+	struct ds1307 *ds1307 = dev_get_drvdata(dev);
 	unsigned char *regs = ds1307->regs;
 	int ret;
 
@@ -828,8 +683,8 @@  static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 		t->enabled, t->pending);
 
 	/* Read control and alarm 0 registers. */
-	ret = ds1307->read_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
-	if (ret < 0)
+	ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
+	if (ret)
 		return ret;
 
 	/* Set alarm 0, using 24-hour and day-of-month modes. */
@@ -847,35 +702,34 @@  static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 	/* Disable interrupt. We will not enable until completely programmed */
 	regs[0] &= ~MCP794XX_BIT_ALM0_EN;
 
-	ret = ds1307->write_block_data(client, MCP794XX_REG_CONTROL, 10, regs);
-	if (ret < 0)
+	ret = regmap_bulk_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
+	if (ret)
 		return ret;
 
 	if (!t->enabled)
 		return 0;
 	regs[0] |= MCP794XX_BIT_ALM0_EN;
-	return i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, regs[0]);
+	return regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs[0]);
 }
 
 static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled)
 {
-	struct i2c_client *client = to_i2c_client(dev);
-	struct ds1307 *ds1307 = i2c_get_clientdata(client);
-	int reg;
+	struct ds1307 *ds1307 = dev_get_drvdata(dev);
+	int reg, ret;
 
 	if (!test_bit(HAS_ALARM, &ds1307->flags))
 		return -EINVAL;
 
-	reg = i2c_smbus_read_byte_data(client, MCP794XX_REG_CONTROL);
-	if (reg < 0)
-		return reg;
+	ret = regmap_read(ds1307->regmap, MCP794XX_REG_CONTROL, &reg);
+	if (ret)
+		return ret;
 
 	if (enabled)
 		reg |= MCP794XX_BIT_ALM0_EN;
 	else
 		reg &= ~MCP794XX_BIT_ALM0_EN;
 
-	return i2c_smbus_write_byte_data(client, MCP794XX_REG_CONTROL, reg);
+	return regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, reg);
 }
 
 static const struct rtc_class_ops mcp794xx_rtc_ops = {
@@ -893,17 +747,15 @@  ds1307_nvram_read(struct file *filp, struct kobject *kobj,
 		struct bin_attribute *attr,
 		char *buf, loff_t off, size_t count)
 {
-	struct i2c_client	*client;
 	struct ds1307		*ds1307;
 	int			result;
 
-	client = kobj_to_i2c_client(kobj);
-	ds1307 = i2c_get_clientdata(client);
+	ds1307 = dev_get_drvdata(kobj_to_dev(kobj));
 
-	result = ds1307->read_block_data(client, ds1307->nvram_offset + off,
-								count, buf);
-	if (result < 0)
-		dev_err(&client->dev, "%s error %d\n", "nvram read", result);
+	result = regmap_bulk_read(ds1307->regmap, ds1307->nvram_offset + off,
+				  buf, count);
+	if (result)
+		dev_err(ds1307->dev, "%s error %d\n", "nvram read", result);
 	return result;
 }
 
@@ -912,17 +764,15 @@  ds1307_nvram_write(struct file *filp, struct kobject *kobj,
 		struct bin_attribute *attr,
 		char *buf, loff_t off, size_t count)
 {
-	struct i2c_client	*client;
 	struct ds1307		*ds1307;
 	int			result;
 
-	client = kobj_to_i2c_client(kobj);
-	ds1307 = i2c_get_clientdata(client);
+	ds1307 = dev_get_drvdata(kobj_to_dev(kobj));
 
-	result = ds1307->write_block_data(client, ds1307->nvram_offset + off,
-								count, buf);
-	if (result < 0) {
-		dev_err(&client->dev, "%s error %d\n", "nvram write", result);
+	result = regmap_bulk_write(ds1307->regmap, ds1307->nvram_offset + off,
+				   buf, count);
+	if (result) {
+		dev_err(ds1307->dev, "%s error %d\n", "nvram write", result);
 		return result;
 	}
 	return count;
@@ -931,7 +781,7 @@  ds1307_nvram_write(struct file *filp, struct kobject *kobj,
 
 /*----------------------------------------------------------------------*/
 
-static u8 do_trickle_setup_ds1339(struct i2c_client *client,
+static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307,
 				  uint32_t ohms, bool diode)
 {
 	u8 setup = (diode) ? DS1307_TRICKLE_CHARGER_DIODE :
@@ -948,14 +798,14 @@  static u8 do_trickle_setup_ds1339(struct i2c_client *client,
 		setup |= DS1307_TRICKLE_CHARGER_4K_OHM;
 		break;
 	default:
-		dev_warn(&client->dev,
+		dev_warn(ds1307->dev,
 			 "Unsupported ohm value %u in dt\n", ohms);
 		return 0;
 	}
 	return setup;
 }
 
-static void ds1307_trickle_init(struct i2c_client *client,
+static void ds1307_trickle_init(struct ds1307 *ds1307,
 				struct chip_desc *chip)
 {
 	uint32_t ohms = 0;
@@ -963,11 +813,12 @@  static void ds1307_trickle_init(struct i2c_client *client,
 
 	if (!chip->do_trickle_setup)
 		goto out;
-	if (device_property_read_u32(&client->dev, "trickle-resistor-ohms", &ohms))
+	if (device_property_read_u32(ds1307->dev, "trickle-resistor-ohms",
+				     &ohms))
 		goto out;
-	if (device_property_read_bool(&client->dev, "trickle-diode-disable"))
+	if (device_property_read_bool(ds1307->dev, "trickle-diode-disable"))
 		diode = false;
-	chip->trickle_charger_setup = chip->do_trickle_setup(client,
+	chip->trickle_charger_setup = chip->do_trickle_setup(ds1307,
 							     ohms, diode);
 out:
 	return;
@@ -994,13 +845,10 @@  static int ds3231_hwmon_read_temp(struct device *dev, s32 *mC)
 	s16 temp;
 	int ret;
 
-	ret = ds1307->read_block_data(ds1307->client, DS3231_REG_TEMPERATURE,
-					sizeof(temp_buf), temp_buf);
-	if (ret < 0)
+	ret = regmap_bulk_read(ds1307->regmap, DS3231_REG_TEMPERATURE,
+			       temp_buf, sizeof(temp_buf));
+	if (ret)
 		return ret;
-	if (ret != sizeof(temp_buf))
-		return -EIO;
-
 	/*
 	 * Temperature is represented as a 10-bit code with a resolution of
 	 * 0.25 degree celsius and encoded in two's complement format.
@@ -1040,12 +888,11 @@  static void ds1307_hwmon_register(struct ds1307 *ds1307)
 	if (ds1307->type != ds_3231)
 		return;
 
-	dev = devm_hwmon_device_register_with_groups(&ds1307->client->dev,
-						ds1307->client->name,
+	dev = devm_hwmon_device_register_with_groups(ds1307->dev, ds1307->name,
 						ds1307, ds3231_hwmon_groups);
 	if (IS_ERR(dev)) {
-		dev_warn(&ds1307->client->dev,
-			"unable to register hwmon device %ld\n", PTR_ERR(dev));
+		dev_warn(ds1307->dev, "unable to register hwmon device %ld\n",
+			 PTR_ERR(dev));
 	}
 }
 
@@ -1084,23 +931,20 @@  static int ds3231_clk_sqw_rates[] = {
 
 static int ds1337_write_control(struct ds1307 *ds1307, u8 mask, u8 value)
 {
-	struct i2c_client *client = ds1307->client;
 	struct mutex *lock = &ds1307->rtc->ops_lock;
 	int control;
 	int ret;
 
 	mutex_lock(lock);
 
-	control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
-	if (control < 0) {
-		ret = control;
+	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
+	if (ret)
 		goto out;
-	}
 
 	control &= ~mask;
 	control |= value;
 
-	ret = i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, control);
+	ret = regmap_write(ds1307->regmap, DS1337_REG_CONTROL, control);
 out:
 	mutex_unlock(lock);
 
@@ -1111,12 +955,12 @@  static unsigned long ds3231_clk_sqw_recalc_rate(struct clk_hw *hw,
 						unsigned long parent_rate)
 {
 	struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
-	int control;
+	int control, ret;
 	int rate_sel = 0;
 
-	control = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_CONTROL);
-	if (control < 0)
-		return control;
+	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
+	if (ret)
+		return ret;
 	if (control & DS1337_BIT_RS1)
 		rate_sel += 1;
 	if (control & DS1337_BIT_RS2)
@@ -1180,11 +1024,11 @@  static void ds3231_clk_sqw_unprepare(struct clk_hw *hw)
 static int ds3231_clk_sqw_is_prepared(struct clk_hw *hw)
 {
 	struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
-	int control;
+	int control, ret;
 
-	control = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_CONTROL);
-	if (control < 0)
-		return control;
+	ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
+	if (ret)
+		return ret;
 
 	return !(control & DS1337_BIT_INTCN);
 }
@@ -1206,25 +1050,22 @@  static unsigned long ds3231_clk_32khz_recalc_rate(struct clk_hw *hw,
 
 static int ds3231_clk_32khz_control(struct ds1307 *ds1307, bool enable)
 {
-	struct i2c_client *client = ds1307->client;
 	struct mutex *lock = &ds1307->rtc->ops_lock;
 	int status;
 	int ret;
 
 	mutex_lock(lock);
 
-	status = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
-	if (status < 0) {
-		ret = status;
+	ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &status);
+	if (ret)
 		goto out;
-	}
 
 	if (enable)
 		status |= DS3231_BIT_EN32KHZ;
 	else
 		status &= ~DS3231_BIT_EN32KHZ;
 
-	ret = i2c_smbus_write_byte_data(client, DS1337_REG_STATUS, status);
+	ret = regmap_write(ds1307->regmap, DS1337_REG_STATUS, status);
 out:
 	mutex_unlock(lock);
 
@@ -1248,11 +1089,11 @@  static void ds3231_clk_32khz_unprepare(struct clk_hw *hw)
 static int ds3231_clk_32khz_is_prepared(struct clk_hw *hw)
 {
 	struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
-	int status;
+	int status, ret;
 
-	status = i2c_smbus_read_byte_data(ds1307->client, DS1337_REG_STATUS);
-	if (status < 0)
-		return status;
+	ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &status);
+	if (ret)
+		return ret;
 
 	return !!(status & DS3231_BIT_EN32KHZ);
 }
@@ -1277,18 +1118,17 @@  static struct clk_init_data ds3231_clks_init[] = {
 
 static int ds3231_clks_register(struct ds1307 *ds1307)
 {
-	struct i2c_client *client = ds1307->client;
-	struct device_node *node = client->dev.of_node;
+	struct device_node *node = ds1307->dev->of_node;
 	struct clk_onecell_data	*onecell;
 	int i;
 
-	onecell = devm_kzalloc(&client->dev, sizeof(*onecell), GFP_KERNEL);
+	onecell = devm_kzalloc(ds1307->dev, sizeof(*onecell), GFP_KERNEL);
 	if (!onecell)
 		return -ENOMEM;
 
 	onecell->clk_num = ARRAY_SIZE(ds3231_clks_init);
-	onecell->clks = devm_kcalloc(&client->dev, onecell->clk_num,
-					sizeof(onecell->clks[0]), GFP_KERNEL);
+	onecell->clks = devm_kcalloc(ds1307->dev, onecell->clk_num,
+				     sizeof(onecell->clks[0]), GFP_KERNEL);
 	if (!onecell->clks)
 		return -ENOMEM;
 
@@ -1307,8 +1147,8 @@  static int ds3231_clks_register(struct ds1307 *ds1307)
 						&init.name);
 		ds1307->clks[i].init = &init;
 
-		onecell->clks[i] = devm_clk_register(&client->dev,
-							&ds1307->clks[i]);
+		onecell->clks[i] = devm_clk_register(ds1307->dev,
+						     &ds1307->clks[i]);
 		if (IS_ERR(onecell->clks[i]))
 			return PTR_ERR(onecell->clks[i]);
 	}
@@ -1330,8 +1170,8 @@  static void ds1307_clks_register(struct ds1307 *ds1307)
 
 	ret = ds3231_clks_register(ds1307);
 	if (ret) {
-		dev_warn(&ds1307->client->dev,
-			"unable to register clock device %d\n", ret);
+		dev_warn(ds1307->dev, "unable to register clock device %d\n",
+			 ret);
 	}
 }
 
@@ -1343,6 +1183,12 @@  static void ds1307_clks_register(struct ds1307 *ds1307)
 
 #endif /* CONFIG_COMMON_CLK */
 
+static const struct regmap_config regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.max_register = 0x12,
+};
+
 static int ds1307_probe(struct i2c_client *client,
 			const struct i2c_device_id *id)
 {
@@ -1350,7 +1196,6 @@  static int ds1307_probe(struct i2c_client *client,
 	int			err = -ENODEV;
 	int			tmp, wday;
 	struct chip_desc	*chip;
-	struct i2c_adapter	*adapter = to_i2c_adapter(client->dev.parent);
 	bool			want_irq = false;
 	bool			ds1307_can_wakeup_device = false;
 	unsigned char		*buf;
@@ -1367,17 +1212,22 @@  static int ds1307_probe(struct i2c_client *client,
 	};
 	const struct rtc_class_ops *rtc_ops = &ds13xx_rtc_ops;
 
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)
-	    && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK))
-		return -EIO;
-
 	ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
 	if (!ds1307)
 		return -ENOMEM;
 
-	i2c_set_clientdata(client, ds1307);
+	dev_set_drvdata(&client->dev, ds1307);
+	ds1307->dev = &client->dev;
+	ds1307->name = client->name;
+	ds1307->irq = client->irq;
+
+	ds1307->regmap = devm_regmap_init_i2c(client, &regmap_config);
+	if (IS_ERR(ds1307->regmap)) {
+		dev_err(ds1307->dev, "regmap allocation failed\n");
+		return PTR_ERR(ds1307->regmap);
+	}
 
-	ds1307->client	= client;
+	i2c_set_clientdata(client, ds1307);
 
 	if (client->dev.of_node) {
 		ds1307->type = (enum ds_type)
@@ -1390,7 +1240,7 @@  static int ds1307_probe(struct i2c_client *client,
 		const struct acpi_device_id *acpi_id;
 
 		acpi_id = acpi_match_device(ACPI_PTR(ds1307_acpi_ids),
-					    &client->dev);
+					    ds1307->dev);
 		if (!acpi_id)
 			return -ENODEV;
 		chip = &chips[acpi_id->driver_data];
@@ -1398,27 +1248,21 @@  static int ds1307_probe(struct i2c_client *client,
 	}
 
 	if (!pdata)
-		ds1307_trickle_init(client, chip);
+		ds1307_trickle_init(ds1307, chip);
 	else if (pdata->trickle_charger_setup)
 		chip->trickle_charger_setup = pdata->trickle_charger_setup;
 
 	if (chip->trickle_charger_setup && chip->trickle_charger_reg) {
-		dev_dbg(&client->dev, "writing trickle charger info 0x%x to 0x%x\n",
+		dev_dbg(ds1307->dev,
+			"writing trickle charger info 0x%x to 0x%x\n",
 		    DS13XX_TRICKLE_CHARGER_MAGIC | chip->trickle_charger_setup,
 		    chip->trickle_charger_reg);
-		i2c_smbus_write_byte_data(client, chip->trickle_charger_reg,
+		regmap_write(ds1307->regmap, chip->trickle_charger_reg,
 		    DS13XX_TRICKLE_CHARGER_MAGIC |
 		    chip->trickle_charger_setup);
 	}
 
 	buf = ds1307->regs;
-	if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) {
-		ds1307->read_block_data = ds1307_native_smbus_read_block_data;
-		ds1307->write_block_data = ds1307_native_smbus_write_block_data;
-	} else {
-		ds1307->read_block_data = ds1307_read_block_data;
-		ds1307->write_block_data = ds1307_write_block_data;
-	}
 
 #ifdef CONFIG_OF
 /*
@@ -1444,11 +1288,10 @@  static int ds1307_probe(struct i2c_client *client,
 	case ds_1339:
 	case ds_3231:
 		/* get registers that the "rtc" read below won't read... */
-		tmp = ds1307->read_block_data(ds1307->client,
-				DS1337_REG_CONTROL, 2, buf);
-		if (tmp != 2) {
-			dev_dbg(&client->dev, "read error %d\n", tmp);
-			err = -EIO;
+		err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
+				       buf, 2);
+		if (err) {
+			dev_dbg(ds1307->dev, "read error %d\n", err);
 			goto exit;
 		}
 
@@ -1462,8 +1305,8 @@  static int ds1307_probe(struct i2c_client *client,
 		 * For some variants, be sure alarms can trigger when we're
 		 * running on Vbackup (BBSQI/BBSQW)
 		 */
-		if (chip->alarm && (ds1307->client->irq > 0 ||
-						ds1307_can_wakeup_device)) {
+		if (chip->alarm && (ds1307->irq > 0 ||
+				    ds1307_can_wakeup_device)) {
 			ds1307->regs[0] |= DS1337_BIT_INTCN
 					| bbsqi_bitpos[ds1307->type];
 			ds1307->regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE);
@@ -1471,50 +1314,49 @@  static int ds1307_probe(struct i2c_client *client,
 			want_irq = true;
 		}
 
-		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL,
-							ds1307->regs[0]);
+		regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
+			     ds1307->regs[0]);
 
 		/* oscillator fault?  clear flag, and warn */
 		if (ds1307->regs[1] & DS1337_BIT_OSF) {
-			i2c_smbus_write_byte_data(client, DS1337_REG_STATUS,
-				ds1307->regs[1] & ~DS1337_BIT_OSF);
-			dev_warn(&client->dev, "SET TIME!\n");
+			regmap_write(ds1307->regmap, DS1337_REG_STATUS,
+				     ds1307->regs[1] & ~DS1337_BIT_OSF);
+			dev_warn(ds1307->dev, "SET TIME!\n");
 		}
 		break;
 
 	case rx_8025:
-		tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
-				RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
-		if (tmp != 2) {
-			dev_dbg(&client->dev, "read error %d\n", tmp);
-			err = -EIO;
+		err = regmap_bulk_read(ds1307->regmap,
+				       RX8025_REG_CTRL1 << 4 | 0x08, buf, 2);
+		if (err) {
+			dev_dbg(ds1307->dev, "read error %d\n", err);
 			goto exit;
 		}
 
 		/* oscillator off?  turn it on, so clock can tick. */
 		if (!(ds1307->regs[1] & RX8025_BIT_XST)) {
 			ds1307->regs[1] |= RX8025_BIT_XST;
-			i2c_smbus_write_byte_data(client,
-						  RX8025_REG_CTRL2 << 4 | 0x08,
-						  ds1307->regs[1]);
-			dev_warn(&client->dev,
+			regmap_write(ds1307->regmap,
+				     RX8025_REG_CTRL2 << 4 | 0x08,
+				     ds1307->regs[1]);
+			dev_warn(ds1307->dev,
 				 "oscillator stop detected - SET TIME!\n");
 		}
 
 		if (ds1307->regs[1] & RX8025_BIT_PON) {
 			ds1307->regs[1] &= ~RX8025_BIT_PON;
-			i2c_smbus_write_byte_data(client,
-						  RX8025_REG_CTRL2 << 4 | 0x08,
-						  ds1307->regs[1]);
-			dev_warn(&client->dev, "power-on detected\n");
+			regmap_write(ds1307->regmap,
+				     RX8025_REG_CTRL2 << 4 | 0x08,
+				     ds1307->regs[1]);
+			dev_warn(ds1307->dev, "power-on detected\n");
 		}
 
 		if (ds1307->regs[1] & RX8025_BIT_VDET) {
 			ds1307->regs[1] &= ~RX8025_BIT_VDET;
-			i2c_smbus_write_byte_data(client,
-						  RX8025_REG_CTRL2 << 4 | 0x08,
-						  ds1307->regs[1]);
-			dev_warn(&client->dev, "voltage drop detected\n");
+			regmap_write(ds1307->regmap,
+				     RX8025_REG_CTRL2 << 4 | 0x08,
+				     ds1307->regs[1]);
+			dev_warn(ds1307->dev, "voltage drop detected\n");
 		}
 
 		/* make sure we are running in 24hour mode */
@@ -1522,16 +1364,15 @@  static int ds1307_probe(struct i2c_client *client,
 			u8 hour;
 
 			/* switch to 24 hour mode */
-			i2c_smbus_write_byte_data(client,
-						  RX8025_REG_CTRL1 << 4 | 0x08,
-						  ds1307->regs[0] |
-						  RX8025_BIT_2412);
-
-			tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
-					RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
-			if (tmp != 2) {
-				dev_dbg(&client->dev, "read error %d\n", tmp);
-				err = -EIO;
+			regmap_write(ds1307->regmap,
+				     RX8025_REG_CTRL1 << 4 | 0x08,
+				     ds1307->regs[0] | RX8025_BIT_2412);
+
+			err = regmap_bulk_read(ds1307->regmap,
+					       RX8025_REG_CTRL1 << 4 | 0x08,
+					       buf, 2);
+			if (err) {
+				dev_dbg(ds1307->dev, "read error %d\n", err);
 				goto exit;
 			}
 
@@ -1542,9 +1383,8 @@  static int ds1307_probe(struct i2c_client *client,
 			if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
 				hour += 12;
 
-			i2c_smbus_write_byte_data(client,
-						  DS1307_REG_HOUR << 4 | 0x08,
-						  hour);
+			regmap_write(ds1307->regmap,
+				     DS1307_REG_HOUR << 4 | 0x08, hour);
 		}
 		break;
 	case ds_1388:
@@ -1552,7 +1392,7 @@  static int ds1307_probe(struct i2c_client *client,
 		break;
 	case mcp794xx:
 		rtc_ops = &mcp794xx_rtc_ops;
-		if (ds1307->client->irq > 0 && chip->alarm) {
+		if (ds1307->irq > 0 && chip->alarm) {
 			irq_handler = mcp794xx_irq;
 			want_irq = true;
 		}
@@ -1563,10 +1403,9 @@  static int ds1307_probe(struct i2c_client *client,
 
 read_rtc:
 	/* read RTC registers */
-	tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf);
-	if (tmp != 8) {
-		dev_dbg(&client->dev, "read error %d\n", tmp);
-		err = -EIO;
+	err = regmap_bulk_read(ds1307->regmap, ds1307->offset, buf, 8);
+	if (err) {
+		dev_dbg(ds1307->dev, "read error %d\n", err);
 		goto exit;
 	}
 
@@ -1581,56 +1420,55 @@  static int ds1307_probe(struct i2c_client *client,
 	case m41t00:
 		/* clock halted?  turn it on, so clock can tick. */
 		if (tmp & DS1307_BIT_CH) {
-			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
-			dev_warn(&client->dev, "SET TIME!\n");
+			regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
+			dev_warn(ds1307->dev, "SET TIME!\n");
 			goto read_rtc;
 		}
 		break;
 	case ds_1338:
 		/* clock halted?  turn it on, so clock can tick. */
 		if (tmp & DS1307_BIT_CH)
-			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
+			regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
 
 		/* oscillator fault?  clear flag, and warn */
 		if (ds1307->regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
-			i2c_smbus_write_byte_data(client, DS1307_REG_CONTROL,
-					ds1307->regs[DS1307_REG_CONTROL]
-					& ~DS1338_BIT_OSF);
-			dev_warn(&client->dev, "SET TIME!\n");
+			regmap_write(ds1307->regmap, DS1307_REG_CONTROL,
+					ds1307->regs[DS1307_REG_CONTROL] &
+					~DS1338_BIT_OSF);
+			dev_warn(ds1307->dev, "SET TIME!\n");
 			goto read_rtc;
 		}
 		break;
 	case ds_1340:
 		/* clock halted?  turn it on, so clock can tick. */
 		if (tmp & DS1340_BIT_nEOSC)
-			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
+			regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
 
-		tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
-		if (tmp < 0) {
-			dev_dbg(&client->dev, "read error %d\n", tmp);
-			err = -EIO;
+		err = regmap_read(ds1307->regmap, DS1340_REG_FLAG, &tmp);
+		if (err) {
+			dev_dbg(ds1307->dev, "read error %d\n", err);
 			goto exit;
 		}
 
 		/* oscillator fault?  clear flag, and warn */
 		if (tmp & DS1340_BIT_OSF) {
-			i2c_smbus_write_byte_data(client, DS1340_REG_FLAG, 0);
-			dev_warn(&client->dev, "SET TIME!\n");
+			regmap_write(ds1307->regmap, DS1340_REG_FLAG, 0);
+			dev_warn(ds1307->dev, "SET TIME!\n");
 		}
 		break;
 	case mcp794xx:
 		/* make sure that the backup battery is enabled */
 		if (!(ds1307->regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
-			i2c_smbus_write_byte_data(client, DS1307_REG_WDAY,
-					ds1307->regs[DS1307_REG_WDAY]
-					| MCP794XX_BIT_VBATEN);
+			regmap_write(ds1307->regmap, DS1307_REG_WDAY,
+				     ds1307->regs[DS1307_REG_WDAY] |
+				     MCP794XX_BIT_VBATEN);
 		}
 
 		/* clock halted?  turn it on, so clock can tick. */
 		if (!(tmp & MCP794XX_BIT_ST)) {
-			i2c_smbus_write_byte_data(client, DS1307_REG_SECS,
-					MCP794XX_BIT_ST);
-			dev_warn(&client->dev, "SET TIME!\n");
+			regmap_write(ds1307->regmap, DS1307_REG_SECS,
+				     MCP794XX_BIT_ST);
+			dev_warn(ds1307->dev, "SET TIME!\n");
 			goto read_rtc;
 		}
 
@@ -1663,16 +1501,15 @@  static int ds1307_probe(struct i2c_client *client,
 			tmp = 0;
 		if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
 			tmp += 12;
-		i2c_smbus_write_byte_data(client,
-				ds1307->offset + DS1307_REG_HOUR,
-				bin2bcd(tmp));
+		regmap_write(ds1307->regmap, ds1307->offset + DS1307_REG_HOUR,
+			     bin2bcd(tmp));
 	}
 
 	/*
 	 * Some IPs have weekday reset value = 0x1 which might not correct
 	 * hence compute the wday using the current date/month/year values
 	 */
-	ds1307_get_time(&client->dev, &tm);
+	ds1307_get_time(ds1307->dev, &tm);
 	wday = tm.tm_wday;
 	timestamp = rtc_tm_to_time64(&tm);
 	rtc_time64_to_tm(timestamp, &tm);
@@ -1683,51 +1520,53 @@  static int ds1307_probe(struct i2c_client *client,
 	 * timestamp
 	 */
 	if (wday != tm.tm_wday) {
-		wday = i2c_smbus_read_byte_data(client, MCP794XX_REG_WEEKDAY);
+		regmap_read(ds1307->regmap, MCP794XX_REG_WEEKDAY, &wday);
 		wday = wday & ~MCP794XX_REG_WEEKDAY_WDAY_MASK;
 		wday = wday | (tm.tm_wday + 1);
-		i2c_smbus_write_byte_data(client, MCP794XX_REG_WEEKDAY, wday);
+		regmap_write(ds1307->regmap, MCP794XX_REG_WEEKDAY, wday);
 	}
 
 	if (want_irq) {
-		device_set_wakeup_capable(&client->dev, true);
+		device_set_wakeup_capable(ds1307->dev, true);
 		set_bit(HAS_ALARM, &ds1307->flags);
 	}
-	ds1307->rtc = devm_rtc_device_register(&client->dev, client->name,
+	ds1307->rtc = devm_rtc_device_register(ds1307->dev, ds1307->name,
 				rtc_ops, THIS_MODULE);
 	if (IS_ERR(ds1307->rtc)) {
 		return PTR_ERR(ds1307->rtc);
 	}
 
-	if (ds1307_can_wakeup_device && ds1307->client->irq <= 0) {
+	if (ds1307_can_wakeup_device && ds1307->irq <= 0) {
 		/* Disable request for an IRQ */
 		want_irq = false;
-		dev_info(&client->dev, "'wakeup-source' is set, request for an IRQ is disabled!\n");
+		dev_info(ds1307->dev,
+			 "'wakeup-source' is set, request for an IRQ is disabled!\n");
 		/* We cannot support UIE mode if we do not have an IRQ line */
 		ds1307->rtc->uie_unsupported = 1;
 	}
 
 	if (want_irq) {
-		err = devm_request_threaded_irq(&client->dev,
-						client->irq, NULL, irq_handler,
+		err = devm_request_threaded_irq(ds1307->dev,
+						ds1307->irq, NULL, irq_handler,
 						IRQF_SHARED | IRQF_ONESHOT,
-						ds1307->rtc->name, client);
+						ds1307->rtc->name, ds1307);
 		if (err) {
 			client->irq = 0;
-			device_set_wakeup_capable(&client->dev, false);
+			device_set_wakeup_capable(ds1307->dev, false);
 			clear_bit(HAS_ALARM, &ds1307->flags);
-			dev_err(&client->dev, "unable to request IRQ!\n");
+			dev_err(ds1307->dev, "unable to request IRQ!\n");
 		} else
-			dev_dbg(&client->dev, "got IRQ %d\n", client->irq);
+			dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
 	}
 
 	if (chip->nvram_size) {
 
-		ds1307->nvram = devm_kzalloc(&client->dev,
+		ds1307->nvram = devm_kzalloc(ds1307->dev,
 					sizeof(struct bin_attribute),
 					GFP_KERNEL);
 		if (!ds1307->nvram) {
-			dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n");
+			dev_err(ds1307->dev,
+				"cannot allocate memory for nvram sysfs\n");
 		} else {
 
 			ds1307->nvram->attr.name = "nvram";
@@ -1740,15 +1579,15 @@  static int ds1307_probe(struct i2c_client *client,
 			ds1307->nvram->size = chip->nvram_size;
 			ds1307->nvram_offset = chip->nvram_offset;
 
-			err = sysfs_create_bin_file(&client->dev.kobj,
+			err = sysfs_create_bin_file(&ds1307->dev->kobj,
 						    ds1307->nvram);
 			if (err) {
-				dev_err(&client->dev,
+				dev_err(ds1307->dev,
 					"unable to create sysfs file: %s\n",
 					ds1307->nvram->attr.name);
 			} else {
 				set_bit(HAS_NVRAM, &ds1307->flags);
-				dev_info(&client->dev, "%zu bytes nvram\n",
+				dev_info(ds1307->dev, "%zu bytes nvram\n",
 					 ds1307->nvram->size);
 			}
 		}
@@ -1768,7 +1607,7 @@  static int ds1307_remove(struct i2c_client *client)
 	struct ds1307 *ds1307 = i2c_get_clientdata(client);
 
 	if (test_and_clear_bit(HAS_NVRAM, &ds1307->flags))
-		sysfs_remove_bin_file(&client->dev.kobj, ds1307->nvram);
+		sysfs_remove_bin_file(&ds1307->dev->kobj, ds1307->nvram);
 
 	return 0;
 }