[PATCH v2] MAX8952 PMIC Driver Initial Release

Kyungmin Park kyungmin.park at samsung.com
Wed Sep 1 06:12:41 EDT 2010


On Wed, Sep 1, 2010 at 6:44 PM, Kukjin Kim <kgene.kim at samsung.com> wrote:
> Mark Brown wrote:
>>
>> On Wed, Sep 01, 2010 at 09:15:36AM +0900, Kukjin Kim wrote:
>>
>> > Seems almost same between the operation of max8649 and max8952 except
>> output
>> > voltage range.
>>
>> > How do you think that can support max8952 with small modifying max8649?
>>
>> Take a look at something like the WM831x drivers for how you can handle
>> multiple devices with one driver - you can register I2C IDs for multiple
>> devices and then select behaviour based on the name that was quoted.
>
> MM...but I'm not sure if I can submit other patch for max8952...
> Actually, Mr. Ham's max8952 code has been applied by Liam.
>
> Anyway, could you please see below patch?
> Basic functions are tested on the board...
>
>
> From: Changhwan Youn <chaos.youn at samsung.com>
> ---
> diff --git a/drivers/regulator/max8649.c b/drivers/regulator/max8649.c
> index 4520ace..a13bf1d 100644
> --- a/drivers/regulator/max8649.c
> +++ b/drivers/regulator/max8649.c
> @@ -22,6 +22,9 @@
>  #define MAX8649_DCDC_STEP      10000           /* uV */
>  #define MAX8649_VOL_MASK       0x3f
>
> +/* difference between voltages of max8649 and max8952 */
> +#define DIFF_DCDC_VOL          20000           /* uV */
> +
>  /* Registers */
>  #define MAX8649_MODE0          0x00
>  #define MAX8649_MODE1          0x01
> @@ -138,7 +141,12 @@ static inline int check_range(int min_uV, int max_uV)
>
>  static int max8649_list_voltage(struct regulator_dev *rdev, unsigned index)
>  {
> -       return (MAX8649_DCDC_VMIN + index * MAX8649_DCDC_STEP);
> +       struct max8649_regulator_info *info = rdev_get_drvdata(rdev);
> +       int ret = MAX8649_DCDC_VMIN + index * MAX8649_DCDC_STEP;
> +
> +       if (!strcmp(info->i2c->name, "max8952"))
> +               ret += DIFF_DCDC_VOL;
> +       return ret;
>  }
>
>  static int max8649_get_voltage(struct regulator_dev *rdev)
> @@ -160,6 +168,11 @@ static int max8649_set_voltage(struct regulator_dev
> *rdev,
>        struct max8649_regulator_info *info = rdev_get_drvdata(rdev);
>        unsigned char data, mask;
>
> +       if (!strcmp(info->i2c->name, "max8952")) {
> +               min_uV -= DIFF_DCDC_VOL;
> +               max_uV -= DIFF_DCDC_VOL;
> +       }
> +
>        if (check_range(min_uV, max_uV)) {
>                dev_err(info->dev, "invalid voltage range (%d, %d) uV\n",
>                        min_uV, max_uV);
> @@ -263,7 +276,6 @@ static struct regulator_ops max8649_dcdc_ops = {
>        .enable_time    = max8649_enable_time,
>        .set_mode       = max8649_set_mode,
>        .get_mode       = max8649_get_mode,
> -
>  };
>
>  static struct regulator_desc dcdc_desc = {
> @@ -311,13 +323,13 @@ static int __devinit max8649_regulator_probe(struct
> i2c_client *client,
>                break;
>        }
>
> -       ret = max8649_reg_read(info->i2c, MAX8649_CHIP_ID1);
> +       ret = max8649_reg_read(info->i2c, MAX8649_CHIP_ID2);
Why do you read the ID2? original code read the ID1. With this change
don't brake the max8649?
>        if (ret < 0) {
>                dev_err(info->dev, "Failed to detect ID of MAX8649:%d\n",
>                        ret);
>                goto out;
>        }
> -       dev_info(info->dev, "Detected MAX8649 (ID:%x)\n", ret);
> +       dev_info(info->dev, "Detected %s (ID:%x)\n", id->name, ret);
>
>        /* enable VID0 & VID1 */
>        max8649_set_bits(info->i2c, MAX8649_CONTROL, MAX8649_VID_MASK, 0);
> @@ -354,7 +366,7 @@ static int __devinit max8649_regulator_probe(struct
> i2c_client *client,
>                goto out;
>        }
>
> -       dev_info(info->dev, "Max8649 regulator device is detected.\n");
> +       dev_info(info->dev, "%s regulator device is detected.\n", id->name);
>        return 0;
>  out:
>        kfree(info);
> @@ -376,6 +388,7 @@ static int __devexit max8649_regulator_remove(struct
> i2c_client *client)
>
>  static const struct i2c_device_id max8649_id[] = {
>        { "max8649", 0 },
> +       { "max8952", 0 },
>        { }
>  };
>  MODULE_DEVICE_TABLE(i2c, max8649_id);
> --
> 1.6.2.5
>
>
> Thanks.
>
> Best regards,
> Kgene.
> --
> Kukjin Kim <kgene.kim at samsung.com>, Senior Engineer,
> SW Solution Development Team, Samsung Electronics Co., Ltd.
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



More information about the linux-arm-kernel mailing list