Loading arch/arm64/boot/dts/qcom/sm8150.dtsi +3 −0 Original line number Diff line number Diff line Loading @@ -1906,6 +1906,9 @@ qcom,llcc-perfmon { compatible = "qcom,llcc-perfmon"; clocks = <&clock_aop QDSS_CLK>; clock-names = "qdss_clk"; }; qcom,llcc-erp { Loading drivers/soc/qcom/llcc_perfmon.c +22 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <linux/regmap.h> #include <linux/soc/qcom/llcc-qcom.h> #include <linux/module.h> #include <linux/clk.h> #include "llcc_events.h" #include "llcc_perfmon.h" Loading Loading @@ -79,6 +80,7 @@ struct event_port_ops { * @mutex: mutex to protect this structure * @hrtimer: hrtimer instance for timer functionality * @expires: timer expire time in nano seconds * @clk: clock node to enable qdss */ struct llcc_perfmon_private { struct regmap *llcc_map; Loading @@ -94,6 +96,7 @@ struct llcc_perfmon_private { struct mutex mutex; struct hrtimer hrtimer; ktime_t expires; struct clk *clock; }; static inline void llcc_bcast_write(struct llcc_perfmon_private *llcc_priv, Loading Loading @@ -519,14 +522,24 @@ static ssize_t perfmon_start_store(struct device *dev, struct llcc_perfmon_private *llcc_priv = dev_get_drvdata(dev); uint32_t val = 0, mask; unsigned long start; int ret; if (kstrtoul(buf, 10, &start)) return -EINVAL; mutex_lock(&llcc_priv->mutex); if (start) { if (!llcc_priv->configured_counters) if (!llcc_priv->configured_counters) { pr_err("start failed. perfmon not configured\n"); mutex_unlock(&llcc_priv->mutex); return -EINVAL; } ret = clk_prepare_enable(llcc_priv->clock); if (ret) { mutex_unlock(&llcc_priv->mutex); return -EINVAL; } val = MANUAL_MODE | MONITOR_EN; if (llcc_priv->expires) { Loading @@ -550,6 +563,8 @@ static ssize_t perfmon_start_store(struct device *dev, mask = PERFMON_MODE_MONITOR_MODE_MASK | PERFMON_MODE_MONITOR_EN_MASK; llcc_bcast_modify(llcc_priv, PERFMON_MODE, val, mask); if (!start) clk_disable_unprepare(llcc_priv->clock); mutex_unlock(&llcc_priv->mutex); return count; Loading Loading @@ -1153,6 +1168,12 @@ static int llcc_perfmon_probe(struct platform_device *pdev) return result; } llcc_priv->clock = devm_clk_get(&pdev->dev, "qdss_clk"); if (IS_ERR(llcc_priv->clock)) { pr_err("failed to get clock node\n"); return PTR_ERR(llcc_priv->clock); } result = sysfs_create_group(&pdev->dev.kobj, &llcc_perfmon_group); if (result) { pr_err("Unable to create sysfs version group\n"); Loading Loading
arch/arm64/boot/dts/qcom/sm8150.dtsi +3 −0 Original line number Diff line number Diff line Loading @@ -1906,6 +1906,9 @@ qcom,llcc-perfmon { compatible = "qcom,llcc-perfmon"; clocks = <&clock_aop QDSS_CLK>; clock-names = "qdss_clk"; }; qcom,llcc-erp { Loading
drivers/soc/qcom/llcc_perfmon.c +22 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <linux/regmap.h> #include <linux/soc/qcom/llcc-qcom.h> #include <linux/module.h> #include <linux/clk.h> #include "llcc_events.h" #include "llcc_perfmon.h" Loading Loading @@ -79,6 +80,7 @@ struct event_port_ops { * @mutex: mutex to protect this structure * @hrtimer: hrtimer instance for timer functionality * @expires: timer expire time in nano seconds * @clk: clock node to enable qdss */ struct llcc_perfmon_private { struct regmap *llcc_map; Loading @@ -94,6 +96,7 @@ struct llcc_perfmon_private { struct mutex mutex; struct hrtimer hrtimer; ktime_t expires; struct clk *clock; }; static inline void llcc_bcast_write(struct llcc_perfmon_private *llcc_priv, Loading Loading @@ -519,14 +522,24 @@ static ssize_t perfmon_start_store(struct device *dev, struct llcc_perfmon_private *llcc_priv = dev_get_drvdata(dev); uint32_t val = 0, mask; unsigned long start; int ret; if (kstrtoul(buf, 10, &start)) return -EINVAL; mutex_lock(&llcc_priv->mutex); if (start) { if (!llcc_priv->configured_counters) if (!llcc_priv->configured_counters) { pr_err("start failed. perfmon not configured\n"); mutex_unlock(&llcc_priv->mutex); return -EINVAL; } ret = clk_prepare_enable(llcc_priv->clock); if (ret) { mutex_unlock(&llcc_priv->mutex); return -EINVAL; } val = MANUAL_MODE | MONITOR_EN; if (llcc_priv->expires) { Loading @@ -550,6 +563,8 @@ static ssize_t perfmon_start_store(struct device *dev, mask = PERFMON_MODE_MONITOR_MODE_MASK | PERFMON_MODE_MONITOR_EN_MASK; llcc_bcast_modify(llcc_priv, PERFMON_MODE, val, mask); if (!start) clk_disable_unprepare(llcc_priv->clock); mutex_unlock(&llcc_priv->mutex); return count; Loading Loading @@ -1153,6 +1168,12 @@ static int llcc_perfmon_probe(struct platform_device *pdev) return result; } llcc_priv->clock = devm_clk_get(&pdev->dev, "qdss_clk"); if (IS_ERR(llcc_priv->clock)) { pr_err("failed to get clock node\n"); return PTR_ERR(llcc_priv->clock); } result = sysfs_create_group(&pdev->dev.kobj, &llcc_perfmon_group); if (result) { pr_err("Unable to create sysfs version group\n"); Loading