]> git.sur5r.net Git - u-boot/blobdiff - drivers/spmi/spmi-msm.c
sf: add Gigadevice gd25q16c entry
[u-boot] / drivers / spmi / spmi-msm.c
index 48bc15759645835760ee7730e0e458372aae9201..6f1114699e5143482a62f6ec7dea0386cc28ecf4 100644 (file)
@@ -1,11 +1,10 @@
+// SPDX-License-Identifier: BSD-3-Clause
 /*
  * Qualcomm SPMI bus driver
  *
  * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
  *
  * Loosely based on Little Kernel driver
- *
- * SPDX-License-Identifier:    BSD-3-Clause
  */
 
 #include <common.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/* PMIC Arbiter configuration registers */
+#define PMIC_ARB_VERSION               0x0000
+#define PMIC_ARB_VERSION_V2_MIN                0x20010000
+
 #define ARB_CHANNEL_OFFSET(n)          (0x4 * (n))
 #define SPMI_CH_OFFSET(chnl)           ((chnl) * 0x8000)
 
@@ -147,25 +150,29 @@ static int msm_spmi_probe(struct udevice *dev)
 {
        struct udevice *parent = dev->parent;
        struct msm_spmi_priv *priv = dev_get_priv(dev);
+       int node = dev_of_offset(dev);
+       u32 hw_ver;
+       bool is_v1;
        int i;
 
-       priv->arb_chnl = dev_get_addr(dev);
+       priv->arb_chnl = devfdt_get_addr(dev);
        priv->spmi_core = fdtdec_get_addr_size_auto_parent(gd->fdt_blob,
-                                                          parent->of_offset,
-                                                          dev->of_offset,
-                                                          "reg", 1, NULL,
-                                                          false);
+                       dev_of_offset(parent), node, "reg", 1, NULL, false);
        priv->spmi_obs = fdtdec_get_addr_size_auto_parent(gd->fdt_blob,
-                                                         parent->of_offset,
-                                                         dev->of_offset, "reg",
-                                                         2, NULL, false);
+                       dev_of_offset(parent), node, "reg", 2, NULL, false);
+
+       hw_ver = readl(priv->arb_chnl + PMIC_ARB_VERSION - 0x800);
+       is_v1  = (hw_ver < PMIC_ARB_VERSION_V2_MIN);
+
+       dev_dbg(dev, "PMIC Arb Version-%d (0x%x)\n", (is_v1 ? 1 : 2), hw_ver);
+
        if (priv->arb_chnl == FDT_ADDR_T_NONE ||
            priv->spmi_core == FDT_ADDR_T_NONE ||
            priv->spmi_obs == FDT_ADDR_T_NONE)
                return -EINVAL;
 
        /* Scan peripherals connected to each SPMI channel */
-       for (i = 0; i < SPMI_MAX_CHANNELS ; i++) {
+       for (i = 0; i < SPMI_MAX_PERIPH ; i++) {
                uint32_t periph = readl(priv->arb_chnl + ARB_CHANNEL_OFFSET(i));
                uint8_t slave_id = (periph & 0xf0000) >> 16;
                uint8_t pid = (periph & 0xff00) >> 8;