Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[RFC 1/4] power: asv: Add common ASV support for samsung SoCs

4 views
Skip to first unread message

Yadwinder Singh Brar

unread,
Sep 11, 2013, 7:20:01 AM9/11/13
to
This patch introduces a common ASV(Adaptive Supply Voltage) basic framework
for samsung SoCs. It provides common APIs (to be called by users to get ASV
values or init opp_table) and an interface for SoC specific drivers to
register ASV members(instances).

Signed-off-by: Yadwinder Singh Brar <yadi...@samsung.com>
---

Hopefully asv_get_volt() can go out in future, once all users start using OPP
library.

---
drivers/power/Kconfig | 1 +
drivers/power/Makefile | 1 +
drivers/power/asv/Kconfig | 11 ++
drivers/power/asv/Makefile | 1 +
drivers/power/asv/samsung-asv.c | 175 ++++++++++++++++++++++++++++++
include/linux/power/samsung-asv-driver.h | 61 +++++++++++
include/linux/power/samsung-asv.h | 37 +++++++
7 files changed, 287 insertions(+), 0 deletions(-)
create mode 100644 drivers/power/asv/Kconfig
create mode 100644 drivers/power/asv/Makefile
create mode 100644 drivers/power/asv/samsung-asv.c
create mode 100644 include/linux/power/samsung-asv-driver.h
create mode 100644 include/linux/power/samsung-asv.h

diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index 7b8979c..2e6b087 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -367,3 +367,4 @@ source "drivers/power/reset/Kconfig"
endif # POWER_SUPPLY

source "drivers/power/avs/Kconfig"
+source "drivers/power/asv/Kconfig"
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 653bf6c..da93c46 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -51,6 +51,7 @@ obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o
obj-$(CONFIG_CHARGER_BQ2415X) += bq2415x_charger.o
obj-$(CONFIG_POWER_AVS) += avs/
+obj-$(CONFIG_POWER_ASV) += asv/
obj-$(CONFIG_CHARGER_SMB347) += smb347-charger.o
obj-$(CONFIG_CHARGER_TPS65090) += tps65090-charger.o
obj-$(CONFIG_POWER_RESET) += reset/
diff --git a/drivers/power/asv/Kconfig b/drivers/power/asv/Kconfig
new file mode 100644
index 0000000..7cd84bd
--- /dev/null
+++ b/drivers/power/asv/Kconfig
@@ -0,0 +1,11 @@
+menuconfig POWER_ASV
+ bool "Adaptive Supply Voltage support"
+ help
+ ASV is a technique used on samsung SoCs, which provides the
+ recommended supply voltage for some specific parts(like arm, mif etc)
+ of SoCs which supports dvfs. For a given operating frequency, the
+ voltage is recommended based on SoCs ASV group.
+ ASV group info is provided in the chip id info which depends on chip
+ manufacturing process.
+
+ Say Y here to enable Adaptive Supply voltage support.
diff --git a/drivers/power/asv/Makefile b/drivers/power/asv/Makefile
new file mode 100644
index 0000000..62921da
--- /dev/null
+++ b/drivers/power/asv/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_POWER_ASV) += asv.o
diff --git a/drivers/power/asv/asv.c b/drivers/power/asv/asv.c
new file mode 100644
index 0000000..61f4a83
--- /dev/null
+++ b/drivers/power/asv/asv.c
@@ -0,0 +1,175 @@
+/*
+ * ASV(Adaptive Supply Voltage) common core
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/io.h>
+#include <linux/opp.h>
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/power/asv-driver.h>
+
+static LIST_HEAD(asv_list);
+static DEFINE_MUTEX(asv_mutex);
+
+struct asv_member {
+ struct list_head node;
+ struct asv_info *asv_info;
+};
+
+static void add_asv_member(struct asv_member *asv_mem)
+{
+ mutex_lock(&asv_mutex);
+ list_add_tail(&asv_mem->node, &asv_list);
+ mutex_unlock(&asv_mutex);
+}
+
+static struct asv_member *asv_get_mem(enum asv_type_id asv_type)
+{
+ struct asv_member *asv_mem;
+ struct asv_info *asv_info;
+
+ list_for_each_entry(asv_mem, &asv_list, node) {
+ asv_info = asv_mem->asv_info;
+ if (asv_type == asv_info->type)
+ return asv_mem;
+ }
+
+ return NULL;
+}
+
+unsigned int asv_get_volt(enum asv_type_id target_type,
+ unsigned int target_freq)
+{
+ struct asv_member *asv_mem = asv_get_mem(target_type);
+ struct asv_freq_table *dvfs_table;
+ struct asv_info *asv_info;
+ unsigned int i;
+
+ if (!asv_mem)
+ return 0;
+
+ asv_info = asv_mem->asv_info;
+ dvfs_table = asv_info->dvfs_table;
+
+ for (i = 0; i < asv_info->nr_dvfs_level; i++) {
+ if (dvfs_table[i].freq == target_freq)
+ return dvfs_table[i].volt;
+ }
+
+ return 0;
+}
+
+int asv_init_opp_table(struct device *dev, enum asv_type_id target_type)
+{
+ struct asv_member *asv_mem = asv_get_mem(target_type);
+ struct asv_info *asv_info;
+ struct asv_freq_table *dvfs_table;
+ unsigned int i;
+
+ if (!asv_mem)
+ return -EINVAL;
+
+ asv_info = asv_mem->asv_info;
+ dvfs_table = asv_info->dvfs_table;
+
+ for (i = 0; i < asv_info->nr_dvfs_level; i++) {
+ if (opp_add(dev, dvfs_table[i].freq * 1000,
+ dvfs_table[i].volt)) {
+ dev_warn(dev, "%s: Failed to add OPP %d\n",
+ __func__, dvfs_table[i].freq);
+ continue;
+ }
+ }
+
+ return 0;
+}
+
+static struct asv_member *asv_init_member(struct asv_info *asv_info)
+{
+ struct asv_member *asv_mem;
+ int ret = 0;
+
+ if (!asv_info) {
+ pr_err("%s: No ASV info provided\n", __func__);
+ return NULL;
+ }
+
+ asv_mem = kzalloc(sizeof(struct asv_member), GFP_KERNEL);
+ if (!asv_mem) {
+ pr_err("%s: Allocation failed for member: %s\n", __func__,
+ asv_info->name);
+ return NULL;
+ }
+
+ asv_mem->asv_info = kmemdup(asv_info, sizeof(*asv_info), GFP_KERNEL);
+ if (!asv_mem->asv_info) {
+ pr_err("%s: Copying asv_info failed for member: %s\n",
+ __func__, asv_info->name);
+ return NULL;
+ }
+ asv_info = asv_mem->asv_info;
+
+ if (asv_info->ops->get_asv_group) {
+ ret = asv_info->ops->get_asv_group(asv_info);
+ if (ret) {
+ pr_err("%s: get_asv_group failed for %s : %d\n",
+ __func__, asv_info->name, ret);
+ goto err;
+ }
+ }
+
+ if (asv_info->ops->init_asv)
+ ret = asv_info->ops->init_asv(asv_info);
+ if (ret) {
+ pr_err("%s: asv_init failed for %s : %d\n", __func__,
+ asv_info->name, ret);
+ goto err;
+ }
+
+ /* In case of parsing table from DT, we may need to add flag to identify
+ DT supporting members and call init_asv_table from asv_init_opp_table(
+ after getting dev_node from dev,if required), instead of calling here.
+ */
+
+ if (asv_info->ops->init_asv_table) {
+ ret = asv_info->ops->init_asv_table(asv_info);
+ if (ret) {
+ pr_err("%s: init_asv_table failed for %s : %d\n",
+ __func__, asv_info->name, ret);
+ goto err;
+ }
+ }
+
+ if (!asv_info->nr_dvfs_level || !asv_info->dvfs_table) {
+ pr_err("%s: No dvfs_table for %s\n", __func__, asv_info->name);
+ goto err;
+ }
+
+ pr_info("%s: Registered asv member: %s with group: %d", __func__,
+ asv_info->name, asv_info->asv_grp);
+
+ return asv_mem;
+err:
+ kfree(asv_mem->asv_info);
+ kfree(asv_mem);
+ return NULL;
+}
+
+void register_asv_member(struct asv_info *list, unsigned int nr_member)
+{
+ struct asv_member *asv_mem;
+ int cnt;
+ for (cnt = 0; cnt < nr_member; cnt++) {
+ asv_mem = asv_init_member(&list[cnt]);
+
+ if (asv_mem)
+ add_asv_member(asv_mem);
+ }
+}
diff --git a/include/linux/power/asv-driver.h b/include/linux/power/asv-driver.h
new file mode 100644
index 0000000..faab388
--- /dev/null
+++ b/include/linux/power/asv-driver.h
@@ -0,0 +1,61 @@
+/*
+ * Adaptive Supply Voltage Driver Header File
+ *
+ * copyright (c) 2013 samsung electronics co., ltd.
+ * http://www.samsung.com/
+ *
+ * this program is free software; you can redistribute it and/or modify
+ * it under the terms of the gnu general public license version 2 as
+ * published by the free software foundation.
+*/
+
+#ifndef __ASV_D_H
+#define __ASV_D_H __FILE__
+
+#include <linux/power/asv.h>
+
+struct asv_freq_table {
+ unsigned int freq; /* KHz */
+ unsigned int volt; /* uV */
+};
+
+/* struct asv_info - information of ASV member for intialisation
+ *
+ * Each member to be registered should be described using this struct
+ * intialised with all required information for that member.
+ *
+ * @asv_type: Type to identify particular member.
+ * @name: Name to used for member.
+ * @asv_ops: Callbacks which can be used for SoC specific operations.
+ * @nr_dvfs_level: Number of dvfs levels supported by member.
+ * @dvfs_table: Table containing supported ASV freqs and corresponding volts.
+ * @asv_grp: ASV group of member.
+ */
+struct asv_info {
+ const char *name;
+ enum asv_type_id type;
+ struct asv_ops *ops;
+ unsigned int nr_dvfs_level;
+ struct asv_freq_table *dvfs_table;
+ unsigned int asv_grp;
+ unsigned int flags;
+};
+
+/* struct asv_ops - SoC specific operation for ASV members
+ * @get_asv_group - Calcuates and intializes asv_grp of asv_info.
+ * @init_asv - SoC specific intilisation(if anything required)based on asv_grp.
+ * @init_asv_table - Intializes linear array(dvfs_table) for corresponding
+ * asv_grp.
+ *
+ * All ops should return 0 on sucess.
+ */
+struct asv_ops {
+ int (*init_asv)(struct asv_info *);
+ int (*get_asv_group)(struct asv_info *);
+ int (*init_asv_table)(struct asv_info *);
+};
+
+/* function for registering ASV members */
+void register_asv_member(struct asv_info *list, unsigned int nr_member);
+
+#endif /* __ASV_D_H */
diff --git a/include/linux/power/asv.h b/include/linux/power/asv.h
new file mode 100644
index 0000000..9b187f7
--- /dev/null
+++ b/include/linux/power/asv.h
@@ -0,0 +1,37 @@
+/*
+ * Adaptive Supply Voltage Header File
+ *
+ * copyright (c) 2013 samsung electronics co., ltd.
+ * http://www.samsung.com/
+ *
+ * this program is free software; you can redistribute it and/or modify
+ * it under the terms of the gnu general public license version 2 as
+ * published by the free software foundation.
+*/
+
+#ifndef __ASV_H
+#define __ASV_H __FILE__
+
+enum asv_type_id {
+ ASV_ARM,
+ ASV_INT,
+ ASV_MIF,
+ ASV_G3D,
+};
+
+#ifdef CONFIG_POWER_ASV
+/* asv_get_volt - get the ASV for target_freq for particular target_type.
+ * returns 0 if target_freq is not supported
+ */
+extern unsigned int asv_get_volt(enum asv_type_id target_type,
+ unsigned int target_freq);
+extern int asv_init_opp_table(struct device *dev,
+ enum asv_type_id target_type);
+#else
+static inline unsigned int asv_get_volt(enum asv_type_id target_type,
+ unsigned int target_freq) { return 0; }
+static int asv_init_opp_table(struct device *dev, enum asv_type_id target_type)
+ { return 0; }
+
+#endif /* CONFIG_POWER_EXYNOS_AVS */
+#endif /* __ASV_H */
--
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Yadwinder Singh Brar

unread,
Sep 11, 2013, 7:20:02 AM9/11/13
to
Since ASV is not a hardware controller so we cann't add device tree node for
it. This patch registers a static platform device exynos ASV.

Signed-off-by: Yadwinder Singh Brar <yadi...@samsung.com>
---
arch/arm/mach-exynos/mach-exynos5-dt.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c
index f874b77..5ce58e1 100644
--- a/arch/arm/mach-exynos/mach-exynos5-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos5-dt.c
@@ -28,6 +28,7 @@ static void __init exynos5_dt_machine_init(void)
struct device_node *i2c_np;
const char *i2c_compat = "samsung,s3c2440-i2c";
unsigned int tmp;
+ struct platform_device_info devinfo = { .name = "exynos-asv", };

/*
* Exynos5's legacy i2c controller and new high speed i2c
@@ -48,6 +49,8 @@ static void __init exynos5_dt_machine_init(void)
}

of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+
+ platform_device_register_full(&devinfo);
}

static char const *exynos5_dt_compat[] __initdata = {

Yadwinder Singh Brar

unread,
Sep 11, 2013, 7:20:03 AM9/11/13
to
This patch adds basic support (only for ARM ASV) for exynos5250 chips which
have fused ASV group.

Signed-off-by: Yadwinder Singh Brar <yadi...@samsung.com>
---
drivers/power/asv/Makefile | 2 +-
drivers/power/asv/exynos-asv.c | 9 +++
drivers/power/asv/exynos-asv.h | 1 +
drivers/power/asv/exynos5250-asv.c | 141 ++++++++++++++++++++++++++++++++++++
4 files changed, 152 insertions(+), 1 deletions(-)
create mode 100644 drivers/power/asv/exynos5250-asv.c

diff --git a/drivers/power/asv/Makefile b/drivers/power/asv/Makefile
index 9a94868..a471c8e 100644
--- a/drivers/power/asv/Makefile
+++ b/drivers/power/asv/Makefile
@@ -1,2 +1,2 @@
obj-$(CONFIG_POWER_ASV) += asv.o
-obj-$(CONFIG_POWER_EXYNOS_ASV) += exynos-asv.o
+obj-$(CONFIG_POWER_EXYNOS_ASV) += exynos-asv.o exynos5250-asv.o
diff --git a/drivers/power/asv/exynos-asv.c b/drivers/power/asv/exynos-asv.c
index d3f43a4..7449b55 100644
--- a/drivers/power/asv/exynos-asv.c
+++ b/drivers/power/asv/exynos-asv.c
@@ -46,9 +46,18 @@ static int exynos_asv_probe(struct platform_device *pdev)
exynos_asv_info->base = base;

/* call SoC specific intialisation routine */
+ if (of_machine_is_compatible("samsung,exynos5250")) {
+ ret = exynos5250_asv_init(exynos_asv_info);
+ if (ret) {
+ pr_err("%s: exynos5250_asv_init failed : %d\n",
+ __func__, ret);
+ goto err;
+ }
+ }

register_asv_member(exynos_asv_info->asv_list, exynos_asv_info->nr_mem);

+err:
iounmap(base);
err_map:
of_node_put(chip_id);
diff --git a/drivers/power/asv/exynos-asv.h b/drivers/power/asv/exynos-asv.h
index 89a1ae8..a31becb 100644
--- a/drivers/power/asv/exynos-asv.h
+++ b/drivers/power/asv/exynos-asv.h
@@ -18,4 +18,5 @@ struct exynos_asv_common {
void __iomem *base;
};

+extern int exynos5250_asv_init(struct exynos_asv_common *exynos_info);
#endif /* __EXYNOS_ASV_D_H */
diff --git a/drivers/power/asv/exynos5250-asv.c b/drivers/power/asv/exynos5250-asv.c
new file mode 100644
index 0000000..293b3f1
--- /dev/null
+++ b/drivers/power/asv/exynos5250-asv.c
@@ -0,0 +1,141 @@
+/* exynos5250 - ASV(Adaptive Supply Voltage)
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/power/asv-driver.h>
+#include "exynos-asv.h"
+
+#define FUSED_SG_OFFSET 3
+#define ORIG_SG_OFFSET 17
+#define ORIG_SG_MASK 0xF
+#define MOD_SG_OFFSET 21
+#define MOD_SG_MASK 0x7
+
+#define ARM_LEVEL_NR 16
+#define ARM_GRP_NR 12
+
+#define CHIP_ID_OFFSET 0x4
+
+struct exynos5250_asv_info {
+ unsigned int package_id;
+ /* we may need more info as global data */
+};
+
+static struct exynos5250_asv_info asv_group __initdata;
+
+static unsigned int asv_voltage[ARM_LEVEL_NR][ARM_GRP_NR + 1] __initdata = {
+ { 1700000, 1300000, 1275000, 1275000, 1262500, 1250000, 1225000,
+ 1212500, 1200000, 1187500, 1175000, 1150000, 1125000 }, /* L0 */
+ { 1600000, 1250000, 1225000, 1225000, 1212500, 1200000, 1187500,
+ 1175000, 1162500, 1150000, 1137500, 1112500, 1100000 }, /* L1 */
+ { 1500000, 1225000, 1187500, 1175000, 1162500, 1150000, 1137500,
+ 1125000, 1112500, 1100000, 1087500, 1075000, 1062500 }, /* L2 */
+ { 1400000, 1200000, 1125000, 1125000, 1125000, 1112500, 1100000,
+ 1087500, 1075000, 1062500, 1050000, 1037500, 1025000 }, /* L3 */
+ { 1300000, 1150000, 1100000, 1100000, 1100000, 1087500, 1075000,
+ 1062500, 1050000, 1037500, 1025000, 1012500, 1000000 }, /* L4 */
+ { 1200000, 1125000, 1075000, 1075000, 1062500, 1050000, 1037500,
+ 1025000, 1012500, 1000000, 987500, 975000, 975000 }, /* L5 */
+ { 1100000, 1100000, 1050000, 1050000, 1037500, 1025000, 1012500,
+ 1000000, 987500, 975000, 962500, 950000, 925000 }, /* L6 */
+ { 1000000, 1075000, 1037500, 1037500, 1012500, 1000000, 987500,
+ 975000, 962500, 950000, 937500, 925000, 912500 }, /* L7 */
+ { 900000, 1050000, 1025000, 1012500, 987500, 975000, 962500,
+ 950000, 937500, 925000, 912500, 912500, 900000 }, /* L8 */
+ { 800000, 1025000, 1000000, 987500, 975000, 962500, 950000,
+ 937500, 925000, 912500, 900000, 900000, 900000 }, /* L9 */
+ { 700000, 1012500, 975000, 962500, 950000, 937500, 925000,
+ 912500, 900000, 900000, 900000, 900000, 900000 }, /* L10 */
+ { 600000, 1000000, 962500, 950000, 937500, 925000, 912500,
+ 900000, 900000, 900000, 900000, 900000, 900000 }, /* L11 */
+ { 500000, 975000, 950000, 937500, 925000, 912500, 900000,
+ 900000, 900000, 900000, 900000, 900000, 887500 }, /* L12 */
+ { 400000, 950000, 937500, 925000, 912500, 900000, 900000,
+ 900000, 900000, 900000, 900000, 887500, 887500 }, /* L13 */
+ { 300000, 937500, 925000, 912500, 900000, 900000, 900000,
+ 900000, 900000, 900000, 887500, 887500, 875000 }, /* L14 */
+ { 200000, 925000, 912500, 900000, 900000, 900000, 900000,
+ 900000, 900000, 887500, 887500, 875000, 875000 }, /* L15 */
+};
+
+static int __init exynos5250_get_asv_group(struct asv_info *asv_info)
+{
+ int exynos_asv_grp;
+ u32 exynos_orig_sp;
+ u32 exynos_mod_sp;
+ u32 package_id = asv_group.package_id;
+
+ /* If ASV group is fused then retrieve it */
+ if ((package_id >> FUSED_SG_OFFSET) & 0x1) {
+ exynos_orig_sp = (package_id >> ORIG_SG_OFFSET) & ORIG_SG_MASK;
+ exynos_mod_sp = (package_id >> MOD_SG_OFFSET) & MOD_SG_MASK;
+
+ exynos_asv_grp = exynos_orig_sp - exynos_mod_sp;
+ if (exynos_asv_grp < 0) {
+ pr_warn("%s: Invalid ASV group: %d\n", __func__,
+ exynos_asv_grp);
+ exynos_asv_grp = 0; /* go for default */
+ }
+ } else {
+ pr_warn("%s: ASV group not fused for : %s\n", __func__,
+ asv_info->name);
+ exynos_asv_grp = 0; /* go for default */
+ }
+
+ asv_info->asv_grp = exynos_asv_grp;
+ return 0;
+}
+
+static int __init exynos5250_init_arm_asv_table(struct asv_info *asv_info)
+{
+ struct asv_freq_table *dvfs_table;
+ int i, asv_grp = asv_info->asv_grp;
+
+ dvfs_table = kzalloc(sizeof(struct asv_freq_table) * ARM_LEVEL_NR,
+ GFP_KERNEL);
+ if (!dvfs_table)
+ return -ENOMEM;
+
+ for (i = 0; i < ARM_LEVEL_NR; i++) {
+ dvfs_table[i].freq = asv_voltage[i][0];
+ dvfs_table[i].volt = asv_voltage[i][asv_grp + 1];
+ }
+
+ asv_info->dvfs_table = dvfs_table;
+ return 0;
+}
+
+/* TODO: Implement .init_asv callback to set ABB value */
+
+static struct asv_ops exynos5250_arm_asv_ops __initdata = {
+ .get_asv_group = exynos5250_get_asv_group,
+ .init_asv_table = exynos5250_init_arm_asv_table,
+};
+
+static struct asv_info exynos5250_asv_member[] __initdata = {
+ {
+ .type = ASV_ARM,
+ .name = "VDD_ARM",
+ .ops = &exynos5250_arm_asv_ops,
+ .nr_dvfs_level = ARM_LEVEL_NR,
+ },
+};
+
+int __init exynos5250_asv_init(struct exynos_asv_common *exynos_info)
+{
+ asv_group.package_id = readl(exynos_info->base + CHIP_ID_OFFSET);
+
+ exynos_info->asv_list = exynos5250_asv_member;
+ exynos_info->nr_mem = ARRAY_SIZE(exynos5250_asv_member);
+
+ return 0;
+}

Yadwinder Singh Brar

unread,
Sep 11, 2013, 7:20:03 AM9/11/13
to
This patch adds a common platform driver to register ASV members for exynos
SoCs.

Signed-off-by: Yadwinder Singh Brar <yadi...@samsung.com>
---
drivers/power/asv/Kconfig | 13 +++++++
drivers/power/asv/Makefile | 1 +
drivers/power/asv/exynos-asv.c | 72 ++++++++++++++++++++++++++++++++++++++++
drivers/power/asv/exynos-asv.h | 21 +++++++++++
4 files changed, 107 insertions(+), 0 deletions(-)
create mode 100644 drivers/power/asv/exynos-asv.c
create mode 100644 drivers/power/asv/exynos-asv.h

diff --git a/drivers/power/asv/Kconfig b/drivers/power/asv/Kconfig
index 7cd84bd..6104b09 100644
--- a/drivers/power/asv/Kconfig
+++ b/drivers/power/asv/Kconfig
@@ -9,3 +9,16 @@ menuconfig POWER_ASV
manufacturing process.

Say Y here to enable Adaptive Supply voltage support.
+
+if POWER_ASV
+
+config POWER_EXYNOS_ASV
+ bool "Adaptive Supply Voltage for Exynos"
+ help
+ Exynos supports ASV depending upon the ASV group fused on chip.
+ Users can request ASV specific to a frequency for a particular member
+ from corresponding DVFS driver.
+
+ Say Y here to enable Exynos Adaptive Voltage Scaling.
+
+endif
diff --git a/drivers/power/asv/Makefile b/drivers/power/asv/Makefile
index 62921da..9a94868 100644
--- a/drivers/power/asv/Makefile
+++ b/drivers/power/asv/Makefile
@@ -1 +1,2 @@
obj-$(CONFIG_POWER_ASV) += asv.o
+obj-$(CONFIG_POWER_EXYNOS_ASV) += exynos-asv.o
diff --git a/drivers/power/asv/exynos-asv.c b/drivers/power/asv/exynos-asv.c
new file mode 100644
index 0000000..d3f43a4
--- /dev/null
+++ b/drivers/power/asv/exynos-asv.c
@@ -0,0 +1,72 @@
+/* Common Exynos ASV(Adaptive Supply Voltage) driver
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/of_address.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/power/asv-driver.h>
+#include "exynos-asv.h"
+
+static int exynos_asv_probe(struct platform_device *pdev)
+{
+ struct device_node *chip_id;
+ struct exynos_asv_common *exynos_asv_info;
+ void __iomem *base;
+ int ret = 0;
+
+ exynos_asv_info = kzalloc(sizeof(struct exynos_asv_common), GFP_KERNEL);
+ if (!exynos_asv_info)
+ return -ENOMEM;
+
+ chip_id = of_find_compatible_node(NULL, NULL,
+ "samsung,exynos4210-chipid");
+ if (!chip_id) {
+ pr_err("%s: unable to find chipid\n", __func__);
+ ret = -ENODEV;
+ goto err_node;
+ }
+
+ base = of_iomap(chip_id, 0);
+ if (!base) {
+ pr_err("%s: unable to map chip_id register\n", __func__);
+ ret = -ENOMEM;
+ goto err_map;
+ }
+
+ exynos_asv_info->base = base;
+
+ /* call SoC specific intialisation routine */
+
+ register_asv_member(exynos_asv_info->asv_list, exynos_asv_info->nr_mem);
+
+ iounmap(base);
+err_map:
+ of_node_put(chip_id);
+err_node:
+ kfree(exynos_asv_info);
+
+ return ret;
+}
+
+static struct platform_driver exynos_asv_platdrv = {
+ .driver = {
+ .name = "exynos-asv",
+ .owner = THIS_MODULE,
+ },
+ .probe = exynos_asv_probe,
+};
+module_platform_driver(exynos_asv_platdrv);
+
+MODULE_AUTHOR("Yadwinder Singh Brar<yadi...@samsung.com>");
+MODULE_DESCRIPTION("Common Exynos ASV driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/power/asv/exynos-asv.h b/drivers/power/asv/exynos-asv.h
new file mode 100644
index 0000000..89a1ae8
--- /dev/null
+++ b/drivers/power/asv/exynos-asv.h
@@ -0,0 +1,21 @@
+/*
+ * Exynos - Adaptive Supply Voltage Driver Header File
+ *
+ * copyright (c) 2013 samsung electronics co., ltd.
+ * this program is free software; you can redistribute it and/or modify
+ * it under the terms of the gnu general public license version 2 as
+ * published by the free software foundation.
+*/
+
+#ifndef __EXYNOS_ASV_D_H
+#define __EXYNOS_ASV_D_H __FILE__
+
+struct exynos_asv_common {
+ struct asv_info *asv_list;
+ unsigned int nr_mem;
+ void __iomem *base;
+};
+
+#endif /* __EXYNOS_ASV_D_H */

Yadwinder Singh Brar

unread,
Sep 11, 2013, 7:20:03 AM9/11/13
to
This series is to add basic common infrastructure for ASV.
Basically ASV is a technique used on samsung SoCs, which provides the
recommended supply voltage for dvfs of arm, mif etc. For a given operating
frequency, the voltage is recommended based on SoC's ASV group.
ASV group gets fussed on SoCs during process of mass production.

This series includes:
- basic common infrastructue for ASV. It provides common APIs for user drivers
like cpufreq & devfreq and and an interface for SoC specific drivers to
register ASV members(instances)
- a common platform driver to register ASV members for exynos SoCs
- an example providing minimal support (only for ARM ASV) for exynos5250 chips

Its just basic skelton which I wanted to get it reviewed or discussed in
early stage, before going ahead on further development based on it.
Presently example is based on static ASV table provided in SoC specific file,
which I expects to go into DT. But exactly how and where needs to be discussed,
may be in next revisions once we get through the basic skelton.
Also the location of driver in kernel may also seem odd to someone and
many more things :).

Looking for your valuable reviews and suggestions.

Thanks

Yadwinder Singh Brar (4):
power: asv: Add common ASV support for samsung SoCs
power: asv: Add a common asv driver for exynos SoCs.
power: asv: Add support for exynos5250
arm: exynos5: Register static platform device for ASV.

arch/arm/mach-exynos/mach-exynos5-dt.c | 3 +
drivers/power/Kconfig | 1 +
drivers/power/Makefile | 1 +
drivers/power/asv/Kconfig | 24 ++++
drivers/power/asv/Makefile | 2 +
drivers/power/asv/exynos-asv.c | 81 ++++++++++++++
drivers/power/asv/exynos-asv.h | 22 ++++
drivers/power/asv/exynos5250-asv.c | 141 ++++++++++++++++++++++++
drivers/power/asv/samsung-asv.c | 175 ++++++++++++++++++++++++++++++
include/linux/power/samsung-asv-driver.h | 61 +++++++++++
include/linux/power/samsung-asv.h | 37 +++++++
11 files changed, 548 insertions(+), 0 deletions(-)
create mode 100644 drivers/power/asv/Kconfig
create mode 100644 drivers/power/asv/Makefile
create mode 100644 drivers/power/asv/exynos-asv.c
create mode 100644 drivers/power/asv/exynos-asv.h
create mode 100644 drivers/power/asv/exynos5250-asv.c
create mode 100644 drivers/power/asv/samsung-asv.c
create mode 100644 include/linux/power/samsung-asv-driver.h
create mode 100644 include/linux/power/samsung-asv.h

Yadwinder Singh Brar

unread,
Nov 11, 2013, 9:30:02 AM11/11/13
to
gentle ping for suggestions/reviews ..
> _______________________________________________
> linux-arm-kernel mailing list
> linux-ar...@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

MyungJoo Ham

unread,
Nov 12, 2013, 9:40:02 PM11/12/13
to
On Mon, Nov 11, 2013 at 11:27 PM, Yadwinder Singh Brar
<yadi....@gmail.com> wrote:
> gentle ping for suggestions/reviews ..
>
>
> On Wed, Sep 11, 2013 at 8:14 PM, Yadwinder Singh Brar
> <yadi...@samsung.com> wrote:
>> This series is to add basic common infrastructure for ASV.
>> Basically ASV is a technique used on samsung SoCs, which provides the
>> recommended supply voltage for dvfs of arm, mif etc. For a given operating
>> frequency, the voltage is recommended based on SoC's ASV group.
>> ASV group gets fussed on SoCs during process of mass production.

ASV is an instance of AVS. Please recondier and try to reuse
what's already there (drivers/power/avs)

Quote from drivers/power/avs/Kconfig:
"At a given operating point the voltage is adapted depending on
static factors (chip manufacturing process) and dynamic factors
(temperature depending performance)."
It seems that the current ASV is subset of AVS.
Although the current implementation of AVS does not provide significant
infrastructure to its sisters, we may start by sharing the directory.


Added Jean Pihet, who has submitted AVS (TI).

Cheers,
MyungJoo.
MyungJoo Ham, Ph.D.
System S/W Lab, S/W Center, Samsung Electronics

Yadwinder Singh Brar

unread,
Nov 14, 2013, 9:10:02 AM11/14/13
to
Hi MyungJoo,

Thanks for your review.

On Wed, Nov 13, 2013 at 11:33 AM, MyungJoo Ham <myungj...@samsung.com> wrote:
> On Mon, Nov 11, 2013 at 11:27 PM, Yadwinder Singh Brar
> <yadi....@gmail.com> wrote:
>> gentle ping for suggestions/reviews ..
>>
>>
>> On Wed, Sep 11, 2013 at 8:14 PM, Yadwinder Singh Brar
>> <yadi...@samsung.com> wrote:
>>> This series is to add basic common infrastructure for ASV.
>>> Basically ASV is a technique used on samsung SoCs, which provides the
>>> recommended supply voltage for dvfs of arm, mif etc. For a given operating
>>> frequency, the voltage is recommended based on SoC's ASV group.
>>> ASV group gets fussed on SoCs during process of mass production.
>
> ASV is an instance of AVS. Please recondier and try to reuse
> what's already there (drivers/power/avs)
>
> Quote from drivers/power/avs/Kconfig:
> "At a given operating point the voltage is adapted depending on
> static factors (chip manufacturing process) and dynamic factors
> (temperature depending performance)."
> It seems that the current ASV is subset of AVS.

Yes, both seems to be for similar purpose but still significantly
different from each other. I would like to describe/differentiate it
little bit here
for explanation for others, that it is AVS(adaptive voltage scaling) which
seems to be an IP/module doing adaptive voltage scaling where as
ours is ASV(Adaptive scaling voltage), it provides only (adaptive) voltage
for scaling to other drivers.

> Although the current implementation of AVS does not provide significant
> infrastructure to its sisters, we may start by sharing the directory.
>

Yes, we can just share directory only right now, other then that i
didn't see any thing can be common.
Firstly i had put in that directory itself, later being doubtful i
moved it to new directory but we can share directory.
Any ideas/comments from others ?

Regards,
Yadwinder

Tomasz Figa

unread,
Nov 14, 2013, 10:10:02 AM11/14/13
to
Hi Yadwinder,

On Monday 11 of November 2013 23:27:08 Yadwinder Singh Brar wrote:
> gentle ping for suggestions/reviews ..

Hmm, I must have somehow missed this series when you orignally sent it.
Can I ask you to resend it, as I don't have it in my e-mail client archive
any longer?

While at it, I would also ask you to add my private e-mail address
(this one) and linux-pm mailing list to Cc list.

Thanks in advance.

Best regards,
Tomasz

Yadwinder Singh Brar

unread,
Nov 14, 2013, 6:20:02 PM11/14/13
to
[adding Sachin]

Hi Tomasz,

On Fri, Nov 15, 2013 at 12:06 AM, Tomasz Figa <tomas...@gmail.com> wrote:
> Hi Yadwinder,
>
> On Monday 11 of November 2013 23:27:08 Yadwinder Singh Brar wrote:
>> gentle ping for suggestions/reviews ..
>
> Hmm, I must have somehow missed this series when you orignally sent it.
> Can I ask you to resend it, as I don't have it in my e-mail client archive
> any longer?
>
> While at it, I would also ask you to add my private e-mail address
> (this one) and linux-pm mailing list to Cc list.
>

hmm, I am on travel still for few more days, so it may be difficult for me
to resend it quickly. But I think Sachin may help me here.
Sachin can you please rebase and repost it ?

Regards,
Yadwinder

Tomasz Figa

unread,
Nov 14, 2013, 7:10:01 PM11/14/13
to
On Friday 15 of November 2013 08:15:52 Yadwinder Singh Brar wrote:
> [adding Sachin]
>
> Hi Tomasz,
>
> On Fri, Nov 15, 2013 at 12:06 AM, Tomasz Figa <tomas...@gmail.com> wrote:
> > Hi Yadwinder,
> >
> > On Monday 11 of November 2013 23:27:08 Yadwinder Singh Brar wrote:
> >> gentle ping for suggestions/reviews ..
> >
> > Hmm, I must have somehow missed this series when you orignally sent it.
> > Can I ask you to resend it, as I don't have it in my e-mail client archive
> > any longer?
> >
> > While at it, I would also ask you to add my private e-mail address
> > (this one) and linux-pm mailing list to Cc list.
> >
>
> hmm, I am on travel still for few more days, so it may be difficult for me
> to resend it quickly. But I think Sachin may help me here.
> Sachin can you please rebase and repost it ?

OK. No need to hurry. I will look at the patches on some ML archives
and then only post my comments once you resend the series.

Best regards,
Tomasz

Sachin Kamat

unread,
Nov 15, 2013, 6:50:02 AM11/15/13
to
Original cover letter from Yadwinder:
This series is to add basic common infrastructure for ASV.
Basically ASV is a technique used on samsung SoCs, which provides the
recommended supply voltage for dvfs of arm, mif etc. For a given operating
frequency, the voltage is recommended based on SoC's ASV group.
ASV group gets fussed on SoCs during process of mass production.

This series includes:
- basic common infrastructue for ASV. It provides common APIs for user drivers
like cpufreq & devfreq and and an interface for SoC specific drivers to
register ASV members(instances)
- a common platform driver to register ASV members for exynos SoCs
- an example providing minimal support (only for ARM ASV) for exynos5250 chips

Its just basic skelton which I wanted to get it reviewed or discussed in
early stage, before going ahead on further development based on it.
Presently example is based on static ASV table provided in SoC specific file,
which I expects to go into DT. But exactly how and where needs to be discussed,
may be in next revisions once we get through the basic skelton.
Also the location of driver in kernel may also seem odd to someone and
many more things :).

Looking for your valuable reviews and suggestions.

Changes since v1:
* Rebased onto the latest linux-next
* Used devm* and *opp APIs
* Code cleanup and some fixes
* Updated kernel doc and Kconfig text

Yadwinder Singh Brar (4):
power: asv: Add common ASV support for Samsung SoCs
power: asv: Add a common ASV driver for Exynos SoCs.
power: asv: Add support for Exynos5250
ARM: SAMSUNG: Register static platform device for ASV for Exynos5

arch/arm/mach-exynos/mach-exynos5-dt.c | 2 +
drivers/power/Kconfig | 1 +
drivers/power/Makefile | 1 +
drivers/power/asv/Kconfig | 23 +++++
drivers/power/asv/Makefile | 2 +
drivers/power/asv/asv.c | 176 ++++++++++++++++++++++++++++++++
drivers/power/asv/exynos-asv.c | 78 ++++++++++++++
drivers/power/asv/exynos-asv.h | 22 ++++
drivers/power/asv/exynos5250-asv.c | 139 +++++++++++++++++++++++++
include/linux/power/asv-driver.h | 62 +++++++++++
include/linux/power/asv.h | 37 +++++++
11 files changed, 543 insertions(+)
create mode 100644 drivers/power/asv/Kconfig
create mode 100644 drivers/power/asv/Makefile
create mode 100644 drivers/power/asv/asv.c
create mode 100644 drivers/power/asv/exynos-asv.c
create mode 100644 drivers/power/asv/exynos-asv.h
create mode 100644 drivers/power/asv/exynos5250-asv.c
create mode 100644 include/linux/power/asv-driver.h
create mode 100644 include/linux/power/asv.h

--
1.7.9.5

Sachin Kamat

unread,
Nov 17, 2013, 11:10:01 PM11/17/13
to
Hi MyungJoo,

On 18 November 2013 08:07, MyungJoo Ham <myungj...@samsung.com> wrote:
>
> 2013. 11. 15. 오후 8:44에 "Sachin Kamat" <sachin...@linaro.org>님이 작성:
>
>
>>
>> Original cover letter from Yadwinder:
>> This series is to add basic common infrastructure for ASV.
>> Basically ASV is a technique used on samsung SoCs, which provides the
>> recommended supply voltage for dvfs of arm, mif etc. For a given operating
>> frequency, the voltage is recommended based on SoC's ASV group.
>> ASV group gets fussed on SoCs during process of mass production.
>>
>> This series includes:
>> - basic common infrastructue for ASV. It provides common APIs for user
>> drivers
>> like cpufreq & devfreq and and an interface for SoC specific drivers to
>> register ASV members(instances)
>> - a common platform driver to register ASV members for exynos SoCs
>> - an example providing minimal support (only for ARM ASV) for exynos5250
>> chips
>>
>> Its just basic skelton which I wanted to get it reviewed or discussed in
>> early stage, before going ahead on further development based on it.
>> Presently example is based on static ASV table provided in SoC specific
>> file,
>> which I expects to go into DT. But exactly how and where needs to be
>> discussed,
>> may be in next revisions once we get through the basic skelton.
>> Also the location of driver in kernel may also seem odd to someone and
>> many more things :).
>>
>> Looking for your valuable reviews and suggestions.
>
> Hi,
>
> As I have commented on the previous thread of Yadwinder, please share the
> directory woth AVS, which is conceptually a superset of ASV.
>
> Ultimately, it would be best if you can supply an infra that can be shared
> with the current AVS, which does not have any currently.
>

Yadwinder has already replied to your suggestion about his concerns. Please
share your comments.

--
With warm regards,
Sachin

Abhilash Kesavan

unread,
Dec 3, 2013, 9:50:01 AM12/3/13
to
Hi Yadwinder and Sachin,

On Mon, Nov 18, 2013 at 9:37 AM, Sachin Kamat <sachin...@linaro.org> wrote:
> Hi MyungJoo,
>
> On 18 November 2013 08:07, MyungJoo Ham <myungj...@samsung.com> wrote:
>>
>> 2013. 11. 15. 占쏙옙占쏙옙 8:44占쏙옙 "Sachin Kamat" <sachin...@linaro.org>占쏙옙占쏙옙 占쌜쇽옙:
CC'ing Doug and Andrew who have also worked on ASV.

I tested these patches on a 5250 Chromebook after modifying the
cpufreq code and a few other changes for booting the board. The driver
is retrieving the ASV fused group correctly. The behavior on an
unfused SMDK5250 is also fine.
I have a few minor comments on the patches.

Thanks
Abhilash

Sachin Kamat

unread,
Dec 4, 2013, 1:10:03 AM12/4/13
to
Hi Abhilash,

On 3 December 2013 20:16, Abhilash Kesavan <kesavan....@gmail.com> wrote:
> Hi Yadwinder and Sachin,

> CC'ing Doug and Andrew who have also worked on ASV.
>
> I tested these patches on a 5250 Chromebook after modifying the
> cpufreq code and a few other changes for booting the board. The driver
> is retrieving the ASV fused group correctly. The behavior on an
> unfused SMDK5250 is also fine.
> I have a few minor comments on the patches.
>

Thank you for testing and reviewing the patchset.
Will incorporate your comments in the next version.

--
With warm regards,
Sachin

Kevin Hilman

unread,
Jan 13, 2015, 11:20:05 AM1/13/15
to
On Tue, Dec 3, 2013 at 10:00 PM, Sachin Kamat <sachin...@linaro.org> wrote:
> Hi Abhilash,
>
> On 3 December 2013 20:16, Abhilash Kesavan <kesavan....@gmail.com> wrote:
>> Hi Yadwinder and Sachin,
>
>> CC'ing Doug and Andrew who have also worked on ASV.
>>
>> I tested these patches on a 5250 Chromebook after modifying the
>> cpufreq code and a few other changes for booting the board. The driver
>> is retrieving the ASV fused group correctly. The behavior on an
>> unfused SMDK5250 is also fine.
>> I have a few minor comments on the patches.
>>
>
> Thank you for testing and reviewing the patchset.
> Will incorporate your comments in the next version.

Has there been an updated version of this series posted? I can't
seem to find one.

Kevin
0 new messages