/* 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; }