]> xenbits.xensource.com Git - people/aperard/linux-chromebook.git/commitdiff
CHROMIUM: mfd/max77686: enable low-jitter mode
authorWill Drewry <wad@chromium.org>
Fri, 16 Nov 2012 02:13:39 +0000 (20:13 -0600)
committerGerrit <chrome-bot@google.com>
Fri, 16 Nov 2012 23:53:41 +0000 (15:53 -0800)
This change adds three valid device-tree configured settings
for the max77686 "low jitter" mode:
* max77686,enable-low-jitter
* max77686,disable-low-jitter
* (no entry)

With either entry, the third bit of the 32KHZ register
is updated.

Low jitter mode is desirable on some platforms with components that are
sensitive to the clock signal.  The clock sometimes appears to stutter when
being updated.  For most uses, this is inconsequential, but if the RTC is
supplying a signal to more sensitive hardware, it can cause undesirable
results.

BUG=chrome-os-partner:15785
TEST=It boots :) semenzato@ has confirmed that if the register is set, the errors do not reproduce with the scope.

To check the register state:
  $ i2cget -f -y 0 0x9 0x7f
  0x0f

Reported-by: Luigi Semenzato <semenzato@chromium.org>
Suggested-by: Luigi Semenzato <semenzato@chromium.org>
Signed-off-by: Will Drewry <wad@chromium.org>
Change-Id: Ib40d1d0728535b10c8438eaa6eacd74fb83cb697
Reviewed-on: https://gerrit.chromium.org/gerrit/38180
Reviewed-by: Doug Anderson <dianders@chromium.org>
Commit-Ready: Will Drewry <wad@chromium.org>
Tested-by: Will Drewry <wad@chromium.org>
Reviewed-by: Olof Johansson <olofj@chromium.org>
drivers/mfd/max77686.c
include/linux/mfd/max77686-private.h
include/linux/mfd/max77686.h

index 01e6941a91022411a3c2405cbd6d0fb52aa76b2d..ee84b913d3a70aba91f5cc1d86282ebc08394b8e 100644 (file)
@@ -137,6 +137,13 @@ static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
                return ERR_PTR(-ENOMEM);
        }
 
+       if (of_get_property(dev->of_node, "max77686,enable-low-jitter", NULL))
+               pd->low_jitter = MAX77686_PROP_LOW_JITTER_ON;
+       else if (of_get_property(dev->of_node, "max77686,disable-low-jitter",
+                                NULL))
+               pd->low_jitter = MAX77686_PROP_LOW_JITTER_OFF;
+       dbg_info(dev, "low-jitter property: %u\n", pd->low_jitter);
+
        return pd;
 }
 #else
@@ -147,6 +154,21 @@ static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
 }
 #endif
 
+static int max77686_set_low_jitter(struct max77686_dev *max77686)
+{
+       int ret;
+       u8 jitter = 0;
+
+       if (max77686->pdata->low_jitter == MAX77686_PROP_LOW_JITTER_DFL)
+               return 0;
+       if (max77686->pdata->low_jitter == MAX77686_PROP_LOW_JITTER_ON)
+               jitter = LOW_JITTER_MASK;
+
+       ret = max77686_update_reg(max77686->i2c, MAX77686_REG_32KHZ_, jitter,
+                                 LOW_JITTER_MASK);
+       return ret;
+}
+
 static inline int max77686_i2c_get_driver_data(struct i2c_client *i2c,
                                               const struct i2c_device_id *id)
 {
@@ -221,6 +243,12 @@ static int __devinit max77686_i2c_probe(struct i2c_client *i2c,
        } else
                dev_info(max77686->dev, "device found\n");
 
+       if (max77686_set_low_jitter(max77686) < 0) {
+               dev_err(max77686->dev, "failed to configure low-jitter\n");
+               ret = -EIO;
+               goto err_mfd;
+       }
+
        return ret;
 
  err_mfd:
index 560d0afaa12f2c7fb9657f30a29d2ac34ad14a16..c3764d100a46844e73a4d7fb13e8247f80ef9afa 100644 (file)
@@ -26,6 +26,7 @@
 
 #define MAX77686_REG_INVALID           (0xff)
 #define RAMP_MASK                      0xC0
+#define LOW_JITTER_MASK                        (1 << 3)
 
 enum max77686_pmic_reg {
        MAX77686_REG_DEVICE_ID          = 0x00,
index b59aaad19b184cdb6b862df35d5b891effbf1caf..3d63d4c1e64c09d85c3190d2aa5c3f9f93468295 100644 (file)
@@ -88,12 +88,22 @@ struct max77686_regulator_data {
        unsigned int reg_op_mode;
 };
 
+enum max77686_prop_low_jitter {
+       MAX77686_PROP_LOW_JITTER_DFL    = 0x00,  /* use hw default */
+       MAX77686_PROP_LOW_JITTER_OFF    = 0x01,
+       MAX77686_PROP_LOW_JITTER_ON     = 0x02,
+       MAX77686_PROP_LOW_JITTER_END
+};
+
 struct max77686_platform_data {
        u8 ramp_delay;
        struct max77686_regulator_data *regulators;
        int num_regulators;
        struct max77686_opmode_data *opmode_data;
 
+       /* low jitter property selection from the device tree */
+       u32 low_jitter;
+
        /*
         * GPIO-DVS feature is not enabled with the current version of
         * MAX77686 driver. Buck2/3/4_voltages[0] is used as the default