Merge tag 'idmapped-mounts-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / clk / clk-si570.c
index 34b2560..eea5012 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright (C) 2010, 2011 Ericsson AB.
  * Copyright (C) 2011 Guenter Roeck.
- * Copyright (C) 2011 - 2013 Xilinx Inc.
+ * Copyright (C) 2011 - 2021 Xilinx Inc.
  *
  * Author: Guenter Roeck <guenter.roeck@ericsson.com>
  *        Sören Brinkmann <soren.brinkmann@xilinx.com>
@@ -123,14 +123,18 @@ static int si570_get_divs(struct clk_si570 *data, u64 *rfreq,
  * si570_get_defaults() - Get default values
  * @data:      Driver data structure
  * @fout:      Factory frequency output
+ * @skip_recall:       If true, don't recall NVM into RAM
  * Returns 0 on success, negative errno otherwise.
  */
-static int si570_get_defaults(struct clk_si570 *data, u64 fout)
+static int si570_get_defaults(struct clk_si570 *data, u64 fout,
+                             bool skip_recall)
 {
        int err;
        u64 fdco;
 
-       regmap_write(data->regmap, SI570_REG_CONTROL, SI570_CNTRL_RECALL);
+       if (!skip_recall)
+               regmap_write(data->regmap, SI570_REG_CONTROL,
+                            SI570_CNTRL_RECALL);
 
        err = si570_get_divs(data, &data->rfreq, &data->n1, &data->hs_div);
        if (err)
@@ -400,6 +404,7 @@ static int si570_probe(struct i2c_client *client,
        struct clk_si570 *data;
        struct clk_init_data init;
        u32 initial_fout, factory_fout, stability;
+       bool skip_recall;
        int err;
        enum clk_si570_variant variant = id->driver_data;
 
@@ -441,6 +446,9 @@ static int si570_probe(struct i2c_client *client,
                return err;
        }
 
+       skip_recall = of_property_read_bool(client->dev.of_node,
+                                           "silabs,skip-recall");
+
        data->regmap = devm_regmap_init_i2c(client, &si570_regmap_config);
        if (IS_ERR(data->regmap)) {
                dev_err(&client->dev, "failed to allocate register map\n");
@@ -448,7 +456,7 @@ static int si570_probe(struct i2c_client *client,
        }
 
        i2c_set_clientdata(client, data);
-       err = si570_get_defaults(data, factory_fout);
+       err = si570_get_defaults(data, factory_fout, skip_recall);
        if (err)
                return err;