|  | @@ -414,3 +414,101 @@ int omap3_noncore_dpll_enable(struct clk_hw *hw)
 | 
	
		
			
				|  |  |  		r = clkdm_clk_enable(clk->clkdm, hw->clk);
 | 
	
		
			
				|  |  |  		if (r) {
 | 
	
		
			
				|  |  |  			WARN(1,
 | 
	
		
			
				|  |  | +			     "%s: could not enable %s's clockdomain %s: %d\n",
 | 
	
		
			
				|  |  | +			     __func__, __clk_get_name(hw->clk),
 | 
	
		
			
				|  |  | +			     clk->clkdm->name, r);
 | 
	
		
			
				|  |  | +			return r;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	parent = __clk_get_parent(hw->clk);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (__clk_get_rate(hw->clk) == __clk_get_rate(dd->clk_bypass)) {
 | 
	
		
			
				|  |  | +		WARN_ON(parent != dd->clk_bypass);
 | 
	
		
			
				|  |  | +		r = _omap3_noncore_dpll_bypass(clk);
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		WARN_ON(parent != dd->clk_ref);
 | 
	
		
			
				|  |  | +		r = _omap3_noncore_dpll_lock(clk);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return r;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * omap3_noncore_dpll_disable - instruct a DPLL to enter low-power stop
 | 
	
		
			
				|  |  | + * @clk: pointer to a DPLL struct clk
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Instructs a non-CORE DPLL to enter low-power stop.  This function is
 | 
	
		
			
				|  |  | + * intended for use in struct clkops.  No return value.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +void omap3_noncore_dpll_disable(struct clk_hw *hw)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	struct clk_hw_omap *clk = to_clk_hw_omap(hw);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_omap3_noncore_dpll_stop(clk);
 | 
	
		
			
				|  |  | +	if (clk->clkdm)
 | 
	
		
			
				|  |  | +		clkdm_clk_disable(clk->clkdm, hw->clk);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Non-CORE DPLL rate set code */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * omap3_noncore_dpll_set_rate - set non-core DPLL rate
 | 
	
		
			
				|  |  | + * @clk: struct clk * of DPLL to set
 | 
	
		
			
				|  |  | + * @rate: rounded target rate
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Set the DPLL CLKOUT to the target rate.  If the DPLL can enter
 | 
	
		
			
				|  |  | + * low-power bypass, and the target rate is the bypass source clock
 | 
	
		
			
				|  |  | + * rate, then configure the DPLL for bypass.  Otherwise, round the
 | 
	
		
			
				|  |  | + * target rate if it hasn't been done already, then program and lock
 | 
	
		
			
				|  |  | + * the DPLL.  Returns -EINVAL upon error, or 0 upon success.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
 | 
	
		
			
				|  |  | +					unsigned long parent_rate)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	struct clk_hw_omap *clk = to_clk_hw_omap(hw);
 | 
	
		
			
				|  |  | +	struct clk *new_parent = NULL;
 | 
	
		
			
				|  |  | +	u16 freqsel = 0;
 | 
	
		
			
				|  |  | +	struct dpll_data *dd;
 | 
	
		
			
				|  |  | +	int ret;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!hw || !rate)
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	dd = clk->dpll_data;
 | 
	
		
			
				|  |  | +	if (!dd)
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	__clk_prepare(dd->clk_bypass);
 | 
	
		
			
				|  |  | +	clk_enable(dd->clk_bypass);
 | 
	
		
			
				|  |  | +	__clk_prepare(dd->clk_ref);
 | 
	
		
			
				|  |  | +	clk_enable(dd->clk_ref);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (__clk_get_rate(dd->clk_bypass) == rate &&
 | 
	
		
			
				|  |  | +	    (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) {
 | 
	
		
			
				|  |  | +		pr_debug("%s: %s: set rate: entering bypass.\n",
 | 
	
		
			
				|  |  | +			 __func__, __clk_get_name(hw->clk));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		ret = _omap3_noncore_dpll_bypass(clk);
 | 
	
		
			
				|  |  | +		if (!ret)
 | 
	
		
			
				|  |  | +			new_parent = dd->clk_bypass;
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		if (dd->last_rounded_rate != rate)
 | 
	
		
			
				|  |  | +			rate = __clk_round_rate(hw->clk, rate);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (dd->last_rounded_rate == 0)
 | 
	
		
			
				|  |  | +			return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		/* No freqsel on OMAP4 and OMAP3630 */
 | 
	
		
			
				|  |  | +		if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
 | 
	
		
			
				|  |  | +			freqsel = _omap3_dpll_compute_freqsel(clk,
 | 
	
		
			
				|  |  | +						dd->last_rounded_n);
 | 
	
		
			
				|  |  | +			WARN_ON(!freqsel);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		pr_debug("%s: %s: set rate: locking rate to %lu.\n",
 | 
	
		
			
				|  |  | +			 __func__, __clk_get_name(hw->clk), rate);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		ret = omap3_noncore_dpll_program(clk, freqsel);
 | 
	
		
			
				|  |  | +		if (!ret)
 |