]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
power: avs: cpr: Use raw mem access for qfprom
authorGeorgi Djakov <georgi.djakov@linaro.org>
Sun, 14 Jun 2015 19:22:47 +0000 (22:22 +0300)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Mon, 14 Aug 2017 10:51:29 +0000 (12:51 +0200)
Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
drivers/power/avs/qcom-cpr.c

index 1169a02282df871b217e66730bee1467ea2ad556..bdd719bac08a64d44b35103a74d9c53a6f50fc3a 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 #include <linux/cpufreq.h>
-#include <linux/nvmem-consumer.h>
 #include <linux/bitops.h>
 #include <linux/regulator/qcom_smd-regulator.h>
 
@@ -1021,33 +1020,37 @@ unlock:
        return ret;
 }
 
-static u32
-cpr_read_efuse(struct nvmem_device *qfprom, const struct qfprom_offset *efuse)
+static u32 cpr_read_efuse(void __iomem *prom, const struct qfprom_offset *efuse)
 {
        u64 buffer = 0;
-       size_t bytes;
-       int ret;
+       u8 val;
+       int i, num_bytes;
+
+       num_bytes = DIV_ROUND_UP(efuse->width + efuse->shift, BITS_PER_BYTE);
 
-       bytes = DIV_ROUND_UP(efuse->width + efuse->shift, BITS_PER_BYTE);
-       ret = nvmem_device_read(qfprom, efuse->offset, bytes, &buffer);
+       for (i = 0; i < num_bytes; i++) {
+               val = readb_relaxed(prom + efuse->offset + i);
+               buffer |= val << (i * BITS_PER_BYTE);
+       }
 
        buffer >>= efuse->shift;
-       buffer &= GENMASK(efuse->width - 1, 0);
+       buffer &= BIT(efuse->width) - 1;
 
        return buffer;
 }
 
 static void
 cpr_populate_ring_osc_idx(const struct cpr_fuse *fuses, struct cpr_drv *drv,
-                         struct nvmem_device *qfprom)
+                         void __iomem *prom)
 {
        struct fuse_corner *fuse = drv->fuse_corners;
        struct fuse_corner *end = fuse + drv->num_fuse_corners;
 
        for (; fuse < end; fuse++, fuses++)
-               fuse->ring_osc_idx = cpr_read_efuse(qfprom, &fuses->ring_osc);
+               fuse->ring_osc_idx = cpr_read_efuse(prom, &fuses->ring_osc);
 }
 
+
 static const struct corner_adjustment *cpr_find_adjustment(u32 speed_bin,
                u32 pvs_version, u32 cpr_rev, const struct cpr_desc *desc,
                const struct cpr_drv *drv)
@@ -1083,7 +1086,7 @@ static const struct corner_adjustment *cpr_find_adjustment(u32 speed_bin,
 
 static void cpr_fuse_corner_init(struct cpr_drv *drv,
                        const struct cpr_desc *desc,
-                       struct nvmem_device *qfprom,
+                       void __iomem *qfprom,
                        const struct cpr_fuse *fuses, u32 speed,
                        const struct corner_adjustment *adjustments,
                        const struct acc_desc *acc_desc)
@@ -1350,7 +1353,7 @@ static struct corner_override *find_corner_override(const struct cpr_desc *desc,
 
 static void cpr_corner_init(struct cpr_drv *drv, const struct cpr_desc *desc,
                        const struct cpr_fuse *fuses, u32 speed_bin,
-                       u32 pvs_version, struct nvmem_device *qfprom,
+                       u32 pvs_version, void __iomem *qfprom,
                        const struct corner_adjustment *adjustments,
                        const struct corner_data **plan)
 {
@@ -1527,7 +1530,7 @@ static void cpr_corner_init(struct cpr_drv *drv, const struct cpr_desc *desc,
 }
 
 static const struct cpr_fuse *
-cpr_get_fuses(const struct cpr_desc *desc, struct nvmem_device *qfprom)
+cpr_get_fuses(const struct cpr_desc *desc, void __iomem *qfprom)
 {
        u32 expected = desc->cpr_fuses.redundant_value;
        const struct qfprom_offset *fuse = &desc->cpr_fuses.redundant;
@@ -1539,7 +1542,7 @@ cpr_get_fuses(const struct cpr_desc *desc, struct nvmem_device *qfprom)
 }
 
 static bool cpr_is_close_loop_disabled(struct cpr_drv *drv,
-               const struct cpr_desc *desc, struct nvmem_device *qfprom,
+               const struct cpr_desc *desc, void __iomem *qfprom,
                const struct cpr_fuse *fuses,
                const struct corner_adjustment *adj)
 {
@@ -1808,12 +1811,12 @@ static int cpr_probe(struct platform_device *pdev)
        const struct acc_desc *acc_desc;
        const struct of_device_id *match;
        struct device_node *np;
-       struct nvmem_device *qfprom;
+       void __iomem *qfprom;
        u32 cpr_rev = FUSE_REVISION_UNKNOWN;
        u32 speed_bin = SPEED_BIN_NONE;
        u32 pvs_version = 0;
 
-       np = of_parse_phandle(dev->of_node, "nvmem", 0);
+       np = of_parse_phandle(dev->of_node, "eeprom", 0);
        if (!np)
                return -ENODEV;
 
@@ -1822,9 +1825,10 @@ static int cpr_probe(struct platform_device *pdev)
                return -EINVAL;
        desc = match->data;
 
-       qfprom = nvmem_device_get(dev, "qfprom");
-       if (IS_ERR(qfprom))
-               return PTR_ERR(qfprom);
+       /* TODO: Get from eeprom API */
+       qfprom = devm_ioremap(dev, 0x58000, 0x7000);
+       if (!qfprom)
+               return -ENOMEM;
 
        len = sizeof(*drv) +
              sizeof(*drv->fuse_corners) * desc->num_fuse_corners +