Merge tag 'block-6.1-2022-12-02' of git://git.kernel.dk/linux
[platform/kernel/linux-starfive.git] / drivers / rtc / rtc-ti-k3.c
index 7a0f181..ba23163 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/sys_soc.h>
 #include <linux/property.h>
 #include <linux/regmap.h>
 #include <linux/rtc.h>
 #define K3RTC_MIN_OFFSET               (-277761)
 #define K3RTC_MAX_OFFSET               (277778)
 
-/**
- * struct ti_k3_rtc_soc_data - Private of compatible data for ti-k3-rtc
- * @unlock_irq_erratum:        Has erratum for unlock infinite IRQs (erratum i2327)
- */
-struct ti_k3_rtc_soc_data {
-       const bool unlock_irq_erratum;
-};
-
 static const struct regmap_config ti_k3_rtc_regmap_config = {
        .name = "peripheral-registers",
        .reg_bits = 32,
@@ -118,7 +111,6 @@ static const struct reg_field ti_rtc_reg_fields[] = {
  * @rtc_dev:           rtc device
  * @regmap:            rtc mmio regmap
  * @r_fields:          rtc register fields
- * @soc:               SoC compatible match data
  */
 struct ti_k3_rtc {
        unsigned int irq;
@@ -127,7 +119,6 @@ struct ti_k3_rtc {
        struct rtc_device *rtc_dev;
        struct regmap *regmap;
        struct regmap_field *r_fields[K3_RTC_MAX_FIELDS];
-       const struct ti_k3_rtc_soc_data *soc;
 };
 
 static int k3rtc_field_read(struct ti_k3_rtc *priv, enum ti_k3_rtc_fields f)
@@ -190,11 +181,22 @@ static int k3rtc_unlock_rtc(struct ti_k3_rtc *priv)
 
        /* Skip fence since we are going to check the unlock bit as fence */
        ret = regmap_field_read_poll_timeout(priv->r_fields[K3RTC_UNLOCK], ret,
-                                            !ret, 2, priv->sync_timeout_us);
+                                            ret, 2, priv->sync_timeout_us);
 
        return ret;
 }
 
+/*
+ * This is the list of SoCs affected by TI's i2327 errata causing the RTC
+ * state-machine to break if not unlocked fast enough during boot. These
+ * SoCs must have the bootloader unlock this device very early in the
+ * boot-flow before we (Linux) can use this device.
+ */
+static const struct soc_device_attribute has_erratum_i2327[] = {
+       { .family = "AM62X", .revision = "SR1.0" },
+       { /* sentinel */ }
+};
+
 static int k3rtc_configure(struct device *dev)
 {
        int ret;
@@ -208,7 +210,7 @@ static int k3rtc_configure(struct device *dev)
         *
         * In such occurrence, it is assumed that the RTC module is unusable
         */
-       if (priv->soc->unlock_irq_erratum) {
+       if (soc_device_match(has_erratum_i2327)) {
                ret = k3rtc_check_unlocked(priv);
                /* If there is an error OR if we are locked, return error */
                if (ret) {
@@ -513,21 +515,12 @@ static struct nvmem_config ti_k3_rtc_nvmem_config = {
 
 static int k3rtc_get_32kclk(struct device *dev, struct ti_k3_rtc *priv)
 {
-       int ret;
        struct clk *clk;
 
-       clk = devm_clk_get(dev, "osc32k");
+       clk = devm_clk_get_enabled(dev, "osc32k");
        if (IS_ERR(clk))
                return PTR_ERR(clk);
 
-       ret = clk_prepare_enable(clk);
-       if (ret)
-               return ret;
-
-       ret = devm_add_action_or_reset(dev, (void (*)(void *))clk_disable_unprepare, clk);
-       if (ret)
-               return ret;
-
        priv->rate_32k = clk_get_rate(clk);
 
        /* Make sure we are exact 32k clock. Else, try to compensate delay */
@@ -542,24 +535,19 @@ static int k3rtc_get_32kclk(struct device *dev, struct ti_k3_rtc *priv)
         */
        priv->sync_timeout_us = (u32)(DIV_ROUND_UP_ULL(1000000, priv->rate_32k) * 4);
 
-       return ret;
+       return 0;
 }
 
 static int k3rtc_get_vbusclk(struct device *dev, struct ti_k3_rtc *priv)
 {
-       int ret;
        struct clk *clk;
 
        /* Note: VBUS isn't a context clock, it is needed for hardware operation */
-       clk = devm_clk_get(dev, "vbus");
+       clk = devm_clk_get_enabled(dev, "vbus");
        if (IS_ERR(clk))
                return PTR_ERR(clk);
 
-       ret = clk_prepare_enable(clk);
-       if (ret)
-               return ret;
-
-       return devm_add_action_or_reset(dev, (void (*)(void *))clk_disable_unprepare, clk);
+       return 0;
 }
 
 static int ti_k3_rtc_probe(struct platform_device *pdev)
@@ -602,8 +590,6 @@ static int ti_k3_rtc_probe(struct platform_device *pdev)
        if (IS_ERR(priv->rtc_dev))
                return PTR_ERR(priv->rtc_dev);
 
-       priv->soc = of_device_get_match_data(dev);
-
        priv->rtc_dev->ops = &ti_k3_rtc_ops;
        priv->rtc_dev->range_max = (1ULL << 48) - 1;    /* 48Bit seconds */
        ti_k3_rtc_nvmem_config.priv = priv;
@@ -635,12 +621,8 @@ static int ti_k3_rtc_probe(struct platform_device *pdev)
        return devm_rtc_nvmem_register(priv->rtc_dev, &ti_k3_rtc_nvmem_config);
 }
 
-static const struct ti_k3_rtc_soc_data ti_k3_am62_data = {
-       .unlock_irq_erratum = true,
-};
-
 static const struct of_device_id ti_k3_rtc_of_match_table[] = {
-       {.compatible = "ti,am62-rtc", .data = &ti_k3_am62_data},
+       {.compatible = "ti,am62-rtc" },
        {}
 };
 MODULE_DEVICE_TABLE(of, ti_k3_rtc_of_match_table);