summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorgi Djakov <georgi.djakov@linaro.org>2015-06-14 22:22:47 +0300
committerSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2015-09-01 09:22:23 +0100
commit170c38c27883881db7a0e534e1e295a2f8d26a3f (patch)
tree62f29f872e4128184fc8f8a0e288eb8793d24c12
parent259d2dac9e4530d5fe6727514915d7c9d332f9f7 (diff)
downloadlinux-170c38c27883881db7a0e534e1e295a2f8d26a3f.tar.gz
power: avs: cpr: Use raw mem access for qfprom
Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
-rw-r--r--drivers/power/avs/qcom-cpr.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/drivers/power/avs/qcom-cpr.c b/drivers/power/avs/qcom-cpr.c
index 1169a02282df..bdd719bac08a 100644
--- a/drivers/power/avs/qcom-cpr.c
+++ b/drivers/power/avs/qcom-cpr.c
@@ -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 +