All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee.jones@linaro.org>
To: Grigoryev Denis <grigoryev@fastwel.ru>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
	"broonie@kernel.org" <broonie@kernel.org>,
	"lgirdwood@gmail.com" <lgirdwood@gmail.com>
Subject: Re: [PATCH] mfd: tps6105x: Use i2c regmap to access registers
Date: Mon, 5 Oct 2015 10:42:50 +0100	[thread overview]
Message-ID: <20151005094250.GH3243@x1> (raw)
In-Reply-To: <1E0B3F54A97F2C4591427D8CCF3028AD691D8F2E@SPB-PRIMARY-1.spb.prosoft.ru>

On Fri, 02 Oct 2015, Grigoryev Denis wrote:

> This patch modifies tps6105x and associated function driver to use regmap
> instead of operating directly on i2c.
> 
> Signed-off-by: Denis Grigoryev <grigoryev@fastwel.ru>
> ---
>  drivers/mfd/tps6105x.c                 | 78 ++++++----------------------------
>  drivers/regulator/tps6105x-regulator.c | 16 +++----
>  include/linux/mfd/tps6105x.h           | 10 ++---
>  3 files changed, 24 insertions(+), 80 deletions(-)

Applied, thanks.

> diff --git a/drivers/mfd/tps6105x.c b/drivers/mfd/tps6105x.c
> index 182ebe0..51c5495 100644
> --- a/drivers/mfd/tps6105x.c
> +++ b/drivers/mfd/tps6105x.c
> @@ -16,7 +16,7 @@
>  #include <linux/module.h>
>  #include <linux/init.h>
>  #include <linux/i2c.h>
> -#include <linux/mutex.h>
> +#include <linux/regmap.h>
>  #include <linux/gpio.h>
>  #include <linux/spinlock.h>
>  #include <linux/slab.h>
> @@ -25,73 +25,18 @@
>  #include <linux/mfd/core.h>
>  #include <linux/mfd/tps6105x.h>
>  
> -int tps6105x_set(struct tps6105x *tps6105x, u8 reg, u8 value)
> -{
> -	int ret;
> -
> -	ret = mutex_lock_interruptible(&tps6105x->lock);
> -	if (ret)
> -		return ret;
> -	ret = i2c_smbus_write_byte_data(tps6105x->client, reg, value);
> -	mutex_unlock(&tps6105x->lock);
> -	if (ret < 0)
> -		return ret;
> -
> -	return 0;
> -}
> -EXPORT_SYMBOL(tps6105x_set);
> -
> -int tps6105x_get(struct tps6105x *tps6105x, u8 reg, u8 *buf)
> -{
> -	int ret;
> -
> -	ret = mutex_lock_interruptible(&tps6105x->lock);
> -	if (ret)
> -		return ret;
> -	ret = i2c_smbus_read_byte_data(tps6105x->client, reg);
> -	mutex_unlock(&tps6105x->lock);
> -	if (ret < 0)
> -		return ret;
> -
> -	*buf = ret;
> -	return 0;
> -}
> -EXPORT_SYMBOL(tps6105x_get);
> -
> -/*
> - * Masks off the bits in the mask and sets the bits in the bitvalues
> - * parameter in one atomic operation
> - */
> -int tps6105x_mask_and_set(struct tps6105x *tps6105x, u8 reg,
> -			  u8 bitmask, u8 bitvalues)
> -{
> -	int ret;
> -	u8 regval;
> -
> -	ret = mutex_lock_interruptible(&tps6105x->lock);
> -	if (ret)
> -		return ret;
> -	ret = i2c_smbus_read_byte_data(tps6105x->client, reg);
> -	if (ret < 0)
> -		goto fail;
> -	regval = ret;
> -	regval = (~bitmask & regval) | (bitmask & bitvalues);
> -	ret = i2c_smbus_write_byte_data(tps6105x->client, reg, regval);
> -fail:
> -	mutex_unlock(&tps6105x->lock);
> -	if (ret < 0)
> -		return ret;
> -
> -	return 0;
> -}
> -EXPORT_SYMBOL(tps6105x_mask_and_set);
> +static struct regmap_config tps6105x_regmap_config = {
> +	.reg_bits = 8,
> +	.val_bits = 8,
> +	.max_register = TPS6105X_REG_3,
> +};
>  
>  static int tps6105x_startup(struct tps6105x *tps6105x)
>  {
>  	int ret;
> -	u8 regval;
> +	unsigned int regval;
>  
> -	ret = tps6105x_get(tps6105x, TPS6105X_REG_0, &regval);
> +	ret = regmap_read(tps6105x->regmap, TPS6105X_REG_0, &regval);
>  	if (ret)
>  		return ret;
>  	switch (regval >> TPS6105X_REG0_MODE_SHIFT) {
> @@ -165,10 +110,13 @@ static int tps6105x_probe(struct i2c_client *client,
>  	if (!tps6105x)
>  		return -ENOMEM;
>  
> +	tps6105x->regmap = devm_regmap_init_i2c(client, &tps6105x_regmap_config);
> +	if (IS_ERR(tps6105x->regmap))
> +		return PTR_ERR(tps6105x->regmap);
> +
>  	i2c_set_clientdata(client, tps6105x);
>  	tps6105x->client = client;
>  	tps6105x->pdata = pdata;
> -	mutex_init(&tps6105x->lock);
>  
>  	ret = tps6105x_startup(tps6105x);
>  	if (ret) {
> @@ -212,7 +160,7 @@ static int tps6105x_remove(struct i2c_client *client)
>  	mfd_remove_devices(&client->dev);
>  
>  	/* Put chip in shutdown mode */
> -	tps6105x_mask_and_set(tps6105x, TPS6105X_REG_0,
> +	regmap_update_bits(tps6105x->regmap, TPS6105X_REG_0,
>  		TPS6105X_REG0_MODE_MASK,
>  		TPS6105X_MODE_SHUTDOWN << TPS6105X_REG0_MODE_SHIFT);
>  
> diff --git a/drivers/regulator/tps6105x-regulator.c b/drivers/regulator/tps6105x-regulator.c
> index 3510b3e..ddc4f10 100644
> --- a/drivers/regulator/tps6105x-regulator.c
> +++ b/drivers/regulator/tps6105x-regulator.c
> @@ -14,7 +14,7 @@
>  #include <linux/kernel.h>
>  #include <linux/init.h>
>  #include <linux/err.h>
> -#include <linux/i2c.h>
> +#include <linux/regmap.h>
>  #include <linux/platform_device.h>
>  #include <linux/regulator/driver.h>
>  #include <linux/mfd/core.h>
> @@ -33,7 +33,7 @@ static int tps6105x_regulator_enable(struct regulator_dev *rdev)
>  	int ret;
>  
>  	/* Activate voltage mode */
> -	ret = tps6105x_mask_and_set(tps6105x, TPS6105X_REG_0,
> +	ret = regmap_update_bits(tps6105x->regmap, TPS6105X_REG_0,
>  		TPS6105X_REG0_MODE_MASK,
>  		TPS6105X_REG0_MODE_VOLTAGE << TPS6105X_REG0_MODE_SHIFT);
>  	if (ret)
> @@ -48,7 +48,7 @@ static int tps6105x_regulator_disable(struct regulator_dev *rdev)
>  	int ret;
>  
>  	/* Set into shutdown mode */
> -	ret = tps6105x_mask_and_set(tps6105x, TPS6105X_REG_0,
> +	ret = regmap_update_bits(tps6105x->regmap, TPS6105X_REG_0,
>  		TPS6105X_REG0_MODE_MASK,
>  		TPS6105X_REG0_MODE_SHUTDOWN << TPS6105X_REG0_MODE_SHIFT);
>  	if (ret)
> @@ -60,10 +60,10 @@ static int tps6105x_regulator_disable(struct regulator_dev *rdev)
>  static int tps6105x_regulator_is_enabled(struct regulator_dev *rdev)
>  {
>  	struct tps6105x *tps6105x = rdev_get_drvdata(rdev);
> -	u8 regval;
> +	unsigned int regval;
>  	int ret;
>  
> -	ret = tps6105x_get(tps6105x, TPS6105X_REG_0, &regval);
> +	ret = regmap_read(tps6105x->regmap, TPS6105X_REG_0, &regval);
>  	if (ret)
>  		return ret;
>  	regval &= TPS6105X_REG0_MODE_MASK;
> @@ -78,10 +78,10 @@ static int tps6105x_regulator_is_enabled(struct regulator_dev *rdev)
>  static int tps6105x_regulator_get_voltage_sel(struct regulator_dev *rdev)
>  {
>  	struct tps6105x *tps6105x = rdev_get_drvdata(rdev);
> -	u8 regval;
> +	unsigned int regval;
>  	int ret;
>  
> -	ret = tps6105x_get(tps6105x, TPS6105X_REG_0, &regval);
> +	ret = regmap_read(tps6105x->regmap, TPS6105X_REG_0, &regval);
>  	if (ret)
>  		return ret;
>  
> @@ -96,7 +96,7 @@ static int tps6105x_regulator_set_voltage_sel(struct regulator_dev *rdev,
>  	struct tps6105x *tps6105x = rdev_get_drvdata(rdev);
>  	int ret;
>  
> -	ret = tps6105x_mask_and_set(tps6105x, TPS6105X_REG_0,
> +	ret = regmap_update_bits(tps6105x->regmap, TPS6105X_REG_0,
>  				    TPS6105X_REG0_VOLTAGE_MASK,
>  				    selector << TPS6105X_REG0_VOLTAGE_SHIFT);
>  	if (ret)
> diff --git a/include/linux/mfd/tps6105x.h b/include/linux/mfd/tps6105x.h
> index 386743d..8bc5118 100644
> --- a/include/linux/mfd/tps6105x.h
> +++ b/include/linux/mfd/tps6105x.h
> @@ -10,6 +10,7 @@
>  #define MFD_TPS6105X_H
>  
>  #include <linux/i2c.h>
> +#include <linux/regmap.h>
>  #include <linux/regulator/machine.h>
>  
>  /*
> @@ -82,20 +83,15 @@ struct tps6105x_platform_data {
>  
>  /**
>   * struct tps6105x - state holder for the TPS6105x drivers
> - * @mutex: mutex to serialize I2C accesses
>   * @i2c_client: corresponding I2C client
>   * @regulator: regulator device if used in voltage mode
> + * @regmap: used for i2c communcation on accessing registers
>   */
>  struct tps6105x {
>  	struct tps6105x_platform_data *pdata;
> -	struct mutex		lock;
>  	struct i2c_client	*client;
>  	struct regulator_dev	*regulator;
> +	struct regmap		*regmap;
>  };
>  
> -extern int tps6105x_set(struct tps6105x *tps6105x, u8 reg, u8 value);
> -extern int tps6105x_get(struct tps6105x *tps6105x, u8 reg, u8 *buf);
> -extern int tps6105x_mask_and_set(struct tps6105x *tps6105x, u8 reg,
> -				 u8 bitmask, u8 bitvalues);
> -
>  #endif

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

  parent reply	other threads:[~2015-10-05  9:42 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-02 16:14 [PATCH] mfd: tps6105x: Use i2c regmap to access registers Grigoryev Denis
2015-10-02 17:36 ` Mark Brown
2015-10-05  9:42 ` Lee Jones [this message]
2015-10-05  9:43 ` [GIT PULL] Immutable branch between MFD and Regulator for v4.3 Lee Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151005094250.GH3243@x1 \
    --to=lee.jones@linaro.org \
    --cc=broonie@kernel.org \
    --cc=grigoryev@fastwel.ru \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.