Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28e22431 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drver:soc:llcc_perfmon: qdss clk node control"

parents 2273336b c3aaf706
Loading
Loading
Loading
Loading
+19 −0
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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,
@@ -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;
@@ -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))
@@ -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;
}
}
@@ -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");