diff options
author | Georgi Djakov <georgi.djakov@linaro.org> | 2015-06-14 22:22:47 +0300 |
---|---|---|
committer | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2015-09-01 09:22:23 +0100 |
commit | 170c38c27883881db7a0e534e1e295a2f8d26a3f (patch) | |
tree | 62f29f872e4128184fc8f8a0e288eb8793d24c12 | |
parent | 259d2dac9e4530d5fe6727514915d7c9d332f9f7 (diff) | |
download | linux-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.c | 42 |
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 + |