/* Enable clock source without taking the lock. */
static int local_src_enable_nolock(int src)
{
	int rc = 0;

	if (!src_votes[src]) {
		if (soc_clk_sources[src].par != SRC_NONE)
			rc = local_src_enable_nolock(soc_clk_sources[src].par);
			if (rc)
				goto err_par;
		/* Perform source-specific enable operations. */
		if (soc_clk_sources[src].enable_func)
			rc = soc_clk_sources[src].enable_func(src, 1);
			if (rc)
				goto err_enable;
	}
	src_votes[src]++;

	return rc;

err_enable:
	if (soc_clk_sources[src].par != SRC_NONE)
		local_src_disable_nolock(soc_clk_sources[src].par);
err_par:
	return rc;
}
/* Enable clock source. */
int local_src_enable(int src)
{
	int rc = 0;
	unsigned long flags;

	if (src == SRC_NONE)
		return rc;

	spin_lock_irqsave(&src_vote_lock, flags);
	rc = local_src_enable_nolock(src);
	spin_unlock_irqrestore(&src_vote_lock, flags);

	return rc;
}
/* Enable clock source. */
int local_src_enable(int src)
{
	int rc = 0;
	unsigned long flags;

	if (src == SRC_NONE)
		return 0;
	if (src < 0 || src >= MAX_SOURCES)
		return -EINVAL;

	spin_lock_irqsave(&src_vote_lock, flags);
	rc = local_src_enable_nolock(src);
	spin_unlock_irqrestore(&src_vote_lock, flags);

	return rc;
}