Loading drivers/soc/qcom/llcc_perfmon.c +19 −0 Original line number Original line Diff line number Diff line Loading @@ -69,6 +69,7 @@ struct event_port_ops { * @expires: timer expire time in nano seconds * @expires: timer expire time in nano seconds * @num_mc: number of MCS * @num_mc: number of MCS * @version: Version information of llcc block * @version: Version information of llcc block * @clk: clock node to enable qdss */ */ struct llcc_perfmon_private { struct llcc_perfmon_private { struct regmap *llcc_map; struct regmap *llcc_map; Loading @@ -86,6 +87,7 @@ struct llcc_perfmon_private { ktime_t expires; ktime_t expires; unsigned int num_mc; unsigned int num_mc; unsigned int version; unsigned int version; struct clk *clock; }; }; static inline void llcc_bcast_write(struct llcc_perfmon_private *llcc_priv, static inline void llcc_bcast_write(struct llcc_perfmon_private *llcc_priv, Loading Loading @@ -500,6 +502,7 @@ static ssize_t perfmon_start_store(struct device *dev, struct llcc_perfmon_private *llcc_priv = dev_get_drvdata(dev); struct llcc_perfmon_private *llcc_priv = dev_get_drvdata(dev); uint32_t val = 0, mask_val; uint32_t val = 0, mask_val; unsigned long start; unsigned long start; int ret; if (kstrtoul(buf, 0, &start)) if (kstrtoul(buf, 0, &start)) return -EINVAL; return -EINVAL; Loading @@ -512,6 +515,12 @@ static ssize_t perfmon_start_store(struct device *dev, return -EINVAL; return -EINVAL; } } ret = clk_prepare_enable(llcc_priv->clock); if (ret) { mutex_unlock(&llcc_priv->mutex); return -EINVAL; } val = MANUAL_MODE | MONITOR_EN; val = MANUAL_MODE | MONITOR_EN; if (llcc_priv->expires) { if (llcc_priv->expires) { if (hrtimer_is_queued(&llcc_priv->hrtimer)) if (hrtimer_is_queued(&llcc_priv->hrtimer)) Loading @@ -534,6 +543,10 @@ static ssize_t perfmon_start_store(struct device *dev, mask_val = PERFMON_MODE_MONITOR_MODE_MASK | mask_val = PERFMON_MODE_MONITOR_MODE_MASK | PERFMON_MODE_MONITOR_EN_MASK; PERFMON_MODE_MONITOR_EN_MASK; llcc_bcast_modify(llcc_priv, PERFMON_MODE, val, mask_val); llcc_bcast_modify(llcc_priv, PERFMON_MODE, val, mask_val); if (!start) clk_disable_unprepare(llcc_priv->clock); mutex_unlock(&llcc_priv->mutex); mutex_unlock(&llcc_priv->mutex); return count; return count; } } Loading Loading @@ -1269,6 +1282,12 @@ static int llcc_perfmon_probe(struct platform_device *pdev) else if (val == LLCC_VERSION_2) else if (val == LLCC_VERSION_2) llcc_priv->version = REV_2; llcc_priv->version = REV_2; llcc_priv->clock = devm_clk_get(pdev->dev.parent, "qdss_clk"); if (IS_ERR_OR_NULL(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); result = sysfs_create_group(&pdev->dev.kobj, &llcc_perfmon_group); if (result) { if (result) { pr_err("Unable to create sysfs group\n"); pr_err("Unable to create sysfs group\n"); Loading Loading
drivers/soc/qcom/llcc_perfmon.c +19 −0 Original line number Original line Diff line number Diff line Loading @@ -69,6 +69,7 @@ struct event_port_ops { * @expires: timer expire time in nano seconds * @expires: timer expire time in nano seconds * @num_mc: number of MCS * @num_mc: number of MCS * @version: Version information of llcc block * @version: Version information of llcc block * @clk: clock node to enable qdss */ */ struct llcc_perfmon_private { struct llcc_perfmon_private { struct regmap *llcc_map; struct regmap *llcc_map; Loading @@ -86,6 +87,7 @@ struct llcc_perfmon_private { ktime_t expires; ktime_t expires; unsigned int num_mc; unsigned int num_mc; unsigned int version; unsigned int version; struct clk *clock; }; }; static inline void llcc_bcast_write(struct llcc_perfmon_private *llcc_priv, static inline void llcc_bcast_write(struct llcc_perfmon_private *llcc_priv, Loading Loading @@ -500,6 +502,7 @@ static ssize_t perfmon_start_store(struct device *dev, struct llcc_perfmon_private *llcc_priv = dev_get_drvdata(dev); struct llcc_perfmon_private *llcc_priv = dev_get_drvdata(dev); uint32_t val = 0, mask_val; uint32_t val = 0, mask_val; unsigned long start; unsigned long start; int ret; if (kstrtoul(buf, 0, &start)) if (kstrtoul(buf, 0, &start)) return -EINVAL; return -EINVAL; Loading @@ -512,6 +515,12 @@ static ssize_t perfmon_start_store(struct device *dev, return -EINVAL; return -EINVAL; } } ret = clk_prepare_enable(llcc_priv->clock); if (ret) { mutex_unlock(&llcc_priv->mutex); return -EINVAL; } val = MANUAL_MODE | MONITOR_EN; val = MANUAL_MODE | MONITOR_EN; if (llcc_priv->expires) { if (llcc_priv->expires) { if (hrtimer_is_queued(&llcc_priv->hrtimer)) if (hrtimer_is_queued(&llcc_priv->hrtimer)) Loading @@ -534,6 +543,10 @@ static ssize_t perfmon_start_store(struct device *dev, mask_val = PERFMON_MODE_MONITOR_MODE_MASK | mask_val = PERFMON_MODE_MONITOR_MODE_MASK | PERFMON_MODE_MONITOR_EN_MASK; PERFMON_MODE_MONITOR_EN_MASK; llcc_bcast_modify(llcc_priv, PERFMON_MODE, val, mask_val); llcc_bcast_modify(llcc_priv, PERFMON_MODE, val, mask_val); if (!start) clk_disable_unprepare(llcc_priv->clock); mutex_unlock(&llcc_priv->mutex); mutex_unlock(&llcc_priv->mutex); return count; return count; } } Loading Loading @@ -1269,6 +1282,12 @@ static int llcc_perfmon_probe(struct platform_device *pdev) else if (val == LLCC_VERSION_2) else if (val == LLCC_VERSION_2) llcc_priv->version = REV_2; llcc_priv->version = REV_2; llcc_priv->clock = devm_clk_get(pdev->dev.parent, "qdss_clk"); if (IS_ERR_OR_NULL(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); result = sysfs_create_group(&pdev->dev.kobj, &llcc_perfmon_group); if (result) { if (result) { pr_err("Unable to create sysfs group\n"); pr_err("Unable to create sysfs group\n"); Loading