cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clk-iproc-pll.c (22374B)


      1/*
      2 * Copyright (C) 2014 Broadcom Corporation
      3 *
      4 * This program is free software; you can redistribute it and/or
      5 * modify it under the terms of the GNU General Public License as
      6 * published by the Free Software Foundation version 2.
      7 *
      8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
      9 * kind, whether express or implied; without even the implied warranty
     10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11 * GNU General Public License for more details.
     12 */
     13
     14#include <linux/kernel.h>
     15#include <linux/err.h>
     16#include <linux/clk-provider.h>
     17#include <linux/io.h>
     18#include <linux/of.h>
     19#include <linux/clkdev.h>
     20#include <linux/of_address.h>
     21#include <linux/delay.h>
     22
     23#include "clk-iproc.h"
     24
     25#define PLL_VCO_HIGH_SHIFT 19
     26#define PLL_VCO_LOW_SHIFT  30
     27
     28/*
     29 * PLL MACRO_SELECT modes 0 to 5 choose pre-calculated PLL output frequencies
     30 * from a look-up table. Mode 7 allows user to manipulate PLL clock dividers
     31 */
     32#define PLL_USER_MODE 7
     33
     34/* number of delay loops waiting for PLL to lock */
     35#define LOCK_DELAY 100
     36
     37/* number of VCO frequency bands */
     38#define NUM_FREQ_BANDS 8
     39
     40#define NUM_KP_BANDS 3
     41enum kp_band {
     42	KP_BAND_MID = 0,
     43	KP_BAND_HIGH,
     44	KP_BAND_HIGH_HIGH
     45};
     46
     47static const unsigned int kp_table[NUM_KP_BANDS][NUM_FREQ_BANDS] = {
     48	{ 5, 6, 6, 7, 7, 8, 9, 10 },
     49	{ 4, 4, 5, 5, 6, 7, 8, 9  },
     50	{ 4, 5, 5, 6, 7, 8, 9, 10 },
     51};
     52
     53static const unsigned long ref_freq_table[NUM_FREQ_BANDS][2] = {
     54	{ 10000000,  12500000  },
     55	{ 12500000,  15000000  },
     56	{ 15000000,  20000000  },
     57	{ 20000000,  25000000  },
     58	{ 25000000,  50000000  },
     59	{ 50000000,  75000000  },
     60	{ 75000000,  100000000 },
     61	{ 100000000, 125000000 },
     62};
     63
     64enum vco_freq_range {
     65	VCO_LOW       = 700000000U,
     66	VCO_MID       = 1200000000U,
     67	VCO_HIGH      = 2200000000U,
     68	VCO_HIGH_HIGH = 3100000000U,
     69	VCO_MAX       = 4000000000U,
     70};
     71
     72struct iproc_pll {
     73	void __iomem *status_base;
     74	void __iomem *control_base;
     75	void __iomem *pwr_base;
     76	void __iomem *asiu_base;
     77
     78	const struct iproc_pll_ctrl *ctrl;
     79	const struct iproc_pll_vco_param *vco_param;
     80	unsigned int num_vco_entries;
     81};
     82
     83struct iproc_clk {
     84	struct clk_hw hw;
     85	struct iproc_pll *pll;
     86	const struct iproc_clk_ctrl *ctrl;
     87};
     88
     89#define to_iproc_clk(hw) container_of(hw, struct iproc_clk, hw)
     90
     91static int pll_calc_param(unsigned long target_rate,
     92			unsigned long parent_rate,
     93			struct iproc_pll_vco_param *vco_out)
     94{
     95	u64 ndiv_int, ndiv_frac, residual;
     96
     97	ndiv_int = target_rate / parent_rate;
     98
     99	if (!ndiv_int || (ndiv_int > 255))
    100		return -EINVAL;
    101
    102	residual = target_rate - (ndiv_int * parent_rate);
    103	residual <<= 20;
    104
    105	/*
    106	 * Add half of the divisor so the result will be rounded to closest
    107	 * instead of rounded down.
    108	 */
    109	residual += (parent_rate / 2);
    110	ndiv_frac = div64_u64((u64)residual, (u64)parent_rate);
    111
    112	vco_out->ndiv_int = ndiv_int;
    113	vco_out->ndiv_frac = ndiv_frac;
    114	vco_out->pdiv = 1;
    115
    116	vco_out->rate = vco_out->ndiv_int * parent_rate;
    117	residual = (u64)vco_out->ndiv_frac * (u64)parent_rate;
    118	residual >>= 20;
    119	vco_out->rate += residual;
    120
    121	return 0;
    122}
    123
    124/*
    125 * Based on the target frequency, find a match from the VCO frequency parameter
    126 * table and return its index
    127 */
    128static int pll_get_rate_index(struct iproc_pll *pll, unsigned int target_rate)
    129{
    130	int i;
    131
    132	for (i = 0; i < pll->num_vco_entries; i++)
    133		if (target_rate == pll->vco_param[i].rate)
    134			break;
    135
    136	if (i >= pll->num_vco_entries)
    137		return -EINVAL;
    138
    139	return i;
    140}
    141
    142static int get_kp(unsigned long ref_freq, enum kp_band kp_index)
    143{
    144	int i;
    145
    146	if (ref_freq < ref_freq_table[0][0])
    147		return -EINVAL;
    148
    149	for (i = 0; i < NUM_FREQ_BANDS; i++) {
    150		if (ref_freq >= ref_freq_table[i][0] &&
    151		    ref_freq < ref_freq_table[i][1])
    152			return kp_table[kp_index][i];
    153	}
    154	return -EINVAL;
    155}
    156
    157static int pll_wait_for_lock(struct iproc_pll *pll)
    158{
    159	int i;
    160	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    161
    162	for (i = 0; i < LOCK_DELAY; i++) {
    163		u32 val = readl(pll->status_base + ctrl->status.offset);
    164
    165		if (val & (1 << ctrl->status.shift))
    166			return 0;
    167		udelay(10);
    168	}
    169
    170	return -EIO;
    171}
    172
    173static void iproc_pll_write(const struct iproc_pll *pll, void __iomem *base,
    174			    const u32 offset, u32 val)
    175{
    176	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    177
    178	writel(val, base + offset);
    179
    180	if (unlikely(ctrl->flags & IPROC_CLK_NEEDS_READ_BACK &&
    181		     (base == pll->status_base || base == pll->control_base)))
    182		val = readl(base + offset);
    183}
    184
    185static void __pll_disable(struct iproc_pll *pll)
    186{
    187	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    188	u32 val;
    189
    190	if (ctrl->flags & IPROC_CLK_PLL_ASIU) {
    191		val = readl(pll->asiu_base + ctrl->asiu.offset);
    192		val &= ~(1 << ctrl->asiu.en_shift);
    193		iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val);
    194	}
    195
    196	if (ctrl->flags & IPROC_CLK_EMBED_PWRCTRL) {
    197		val = readl(pll->control_base + ctrl->aon.offset);
    198		val |= bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift;
    199		iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val);
    200	}
    201
    202	if (pll->pwr_base) {
    203		/* latch input value so core power can be shut down */
    204		val = readl(pll->pwr_base + ctrl->aon.offset);
    205		val |= 1 << ctrl->aon.iso_shift;
    206		iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
    207
    208		/* power down the core */
    209		val &= ~(bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift);
    210		iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
    211	}
    212}
    213
    214static int __pll_enable(struct iproc_pll *pll)
    215{
    216	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    217	u32 val;
    218
    219	if (ctrl->flags & IPROC_CLK_EMBED_PWRCTRL) {
    220		val = readl(pll->control_base + ctrl->aon.offset);
    221		val &= ~(bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift);
    222		iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val);
    223	}
    224
    225	if (pll->pwr_base) {
    226		/* power up the PLL and make sure it's not latched */
    227		val = readl(pll->pwr_base + ctrl->aon.offset);
    228		val |= bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift;
    229		val &= ~(1 << ctrl->aon.iso_shift);
    230		iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
    231	}
    232
    233	/* certain PLLs also need to be ungated from the ASIU top level */
    234	if (ctrl->flags & IPROC_CLK_PLL_ASIU) {
    235		val = readl(pll->asiu_base + ctrl->asiu.offset);
    236		val |= (1 << ctrl->asiu.en_shift);
    237		iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val);
    238	}
    239
    240	return 0;
    241}
    242
    243static void __pll_put_in_reset(struct iproc_pll *pll)
    244{
    245	u32 val;
    246	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    247	const struct iproc_pll_reset_ctrl *reset = &ctrl->reset;
    248
    249	val = readl(pll->control_base + reset->offset);
    250	if (ctrl->flags & IPROC_CLK_PLL_RESET_ACTIVE_LOW)
    251		val |= BIT(reset->reset_shift) | BIT(reset->p_reset_shift);
    252	else
    253		val &= ~(BIT(reset->reset_shift) | BIT(reset->p_reset_shift));
    254	iproc_pll_write(pll, pll->control_base, reset->offset, val);
    255}
    256
    257static void __pll_bring_out_reset(struct iproc_pll *pll, unsigned int kp,
    258				  unsigned int ka, unsigned int ki)
    259{
    260	u32 val;
    261	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    262	const struct iproc_pll_reset_ctrl *reset = &ctrl->reset;
    263	const struct iproc_pll_dig_filter_ctrl *dig_filter = &ctrl->dig_filter;
    264
    265	val = readl(pll->control_base + dig_filter->offset);
    266	val &= ~(bit_mask(dig_filter->ki_width) << dig_filter->ki_shift |
    267		bit_mask(dig_filter->kp_width) << dig_filter->kp_shift |
    268		bit_mask(dig_filter->ka_width) << dig_filter->ka_shift);
    269	val |= ki << dig_filter->ki_shift | kp << dig_filter->kp_shift |
    270	       ka << dig_filter->ka_shift;
    271	iproc_pll_write(pll, pll->control_base, dig_filter->offset, val);
    272
    273	val = readl(pll->control_base + reset->offset);
    274	if (ctrl->flags & IPROC_CLK_PLL_RESET_ACTIVE_LOW)
    275		val &= ~(BIT(reset->reset_shift) | BIT(reset->p_reset_shift));
    276	else
    277		val |= BIT(reset->reset_shift) | BIT(reset->p_reset_shift);
    278	iproc_pll_write(pll, pll->control_base, reset->offset, val);
    279}
    280
    281/*
    282 * Determines if the change to be applied to the PLL is minor (just an update
    283 * or the fractional divider). If so, then we can avoid going through a
    284 * disruptive reset and lock sequence.
    285 */
    286static bool pll_fractional_change_only(struct iproc_pll *pll,
    287				       struct iproc_pll_vco_param *vco)
    288{
    289	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    290	u32 val;
    291	u32 ndiv_int;
    292	unsigned int pdiv;
    293
    294	/* PLL needs to be locked */
    295	val = readl(pll->status_base + ctrl->status.offset);
    296	if ((val & (1 << ctrl->status.shift)) == 0)
    297		return false;
    298
    299	val = readl(pll->control_base + ctrl->ndiv_int.offset);
    300	ndiv_int = (val >> ctrl->ndiv_int.shift) &
    301		bit_mask(ctrl->ndiv_int.width);
    302
    303	if (ndiv_int != vco->ndiv_int)
    304		return false;
    305
    306	val = readl(pll->control_base + ctrl->pdiv.offset);
    307	pdiv = (val >> ctrl->pdiv.shift) & bit_mask(ctrl->pdiv.width);
    308
    309	if (pdiv != vco->pdiv)
    310		return false;
    311
    312	return true;
    313}
    314
    315static int pll_set_rate(struct iproc_clk *clk, struct iproc_pll_vco_param *vco,
    316			unsigned long parent_rate)
    317{
    318	struct iproc_pll *pll = clk->pll;
    319	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    320	int ka = 0, ki, kp, ret;
    321	unsigned long rate = vco->rate;
    322	u32 val;
    323	enum kp_band kp_index;
    324	unsigned long ref_freq;
    325	const char *clk_name = clk_hw_get_name(&clk->hw);
    326
    327	/*
    328	 * reference frequency = parent frequency / PDIV
    329	 * If PDIV = 0, then it becomes a multiplier (x2)
    330	 */
    331	if (vco->pdiv == 0)
    332		ref_freq = parent_rate * 2;
    333	else
    334		ref_freq = parent_rate / vco->pdiv;
    335
    336	/* determine Ki and Kp index based on target VCO frequency */
    337	if (rate >= VCO_LOW && rate < VCO_HIGH) {
    338		ki = 4;
    339		kp_index = KP_BAND_MID;
    340	} else if (rate >= VCO_HIGH && rate < VCO_HIGH_HIGH) {
    341		ki = 3;
    342		kp_index = KP_BAND_HIGH;
    343	} else if (rate >= VCO_HIGH_HIGH && rate < VCO_MAX) {
    344		ki = 3;
    345		kp_index = KP_BAND_HIGH_HIGH;
    346	} else {
    347		pr_err("%s: pll: %s has invalid rate: %lu\n", __func__,
    348				clk_name, rate);
    349		return -EINVAL;
    350	}
    351
    352	kp = get_kp(ref_freq, kp_index);
    353	if (kp < 0) {
    354		pr_err("%s: pll: %s has invalid kp\n", __func__, clk_name);
    355		return kp;
    356	}
    357
    358	ret = __pll_enable(pll);
    359	if (ret) {
    360		pr_err("%s: pll: %s fails to enable\n", __func__, clk_name);
    361		return ret;
    362	}
    363
    364	if (pll_fractional_change_only(clk->pll, vco)) {
    365		/* program fractional part of NDIV */
    366		if (ctrl->flags & IPROC_CLK_PLL_HAS_NDIV_FRAC) {
    367			val = readl(pll->control_base + ctrl->ndiv_frac.offset);
    368			val &= ~(bit_mask(ctrl->ndiv_frac.width) <<
    369				 ctrl->ndiv_frac.shift);
    370			val |= vco->ndiv_frac << ctrl->ndiv_frac.shift;
    371			iproc_pll_write(pll, pll->control_base,
    372					ctrl->ndiv_frac.offset, val);
    373			return 0;
    374		}
    375	}
    376
    377	/* put PLL in reset */
    378	__pll_put_in_reset(pll);
    379
    380	/* set PLL in user mode before modifying PLL controls */
    381	if (ctrl->flags & IPROC_CLK_PLL_USER_MODE_ON) {
    382		val = readl(pll->control_base + ctrl->macro_mode.offset);
    383		val &= ~(bit_mask(ctrl->macro_mode.width) <<
    384			ctrl->macro_mode.shift);
    385		val |= PLL_USER_MODE << ctrl->macro_mode.shift;
    386		iproc_pll_write(pll, pll->control_base,
    387			ctrl->macro_mode.offset, val);
    388	}
    389
    390	iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.u_offset, 0);
    391
    392	val = readl(pll->control_base + ctrl->vco_ctrl.l_offset);
    393
    394	if (rate >= VCO_LOW && rate < VCO_MID)
    395		val |= (1 << PLL_VCO_LOW_SHIFT);
    396
    397	if (rate < VCO_HIGH)
    398		val &= ~(1 << PLL_VCO_HIGH_SHIFT);
    399	else
    400		val |= (1 << PLL_VCO_HIGH_SHIFT);
    401
    402	iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.l_offset, val);
    403
    404	/* program integer part of NDIV */
    405	val = readl(pll->control_base + ctrl->ndiv_int.offset);
    406	val &= ~(bit_mask(ctrl->ndiv_int.width) << ctrl->ndiv_int.shift);
    407	val |= vco->ndiv_int << ctrl->ndiv_int.shift;
    408	iproc_pll_write(pll, pll->control_base, ctrl->ndiv_int.offset, val);
    409
    410	/* program fractional part of NDIV */
    411	if (ctrl->flags & IPROC_CLK_PLL_HAS_NDIV_FRAC) {
    412		val = readl(pll->control_base + ctrl->ndiv_frac.offset);
    413		val &= ~(bit_mask(ctrl->ndiv_frac.width) <<
    414			 ctrl->ndiv_frac.shift);
    415		val |= vco->ndiv_frac << ctrl->ndiv_frac.shift;
    416		iproc_pll_write(pll, pll->control_base, ctrl->ndiv_frac.offset,
    417				val);
    418	}
    419
    420	/* program PDIV */
    421	val = readl(pll->control_base + ctrl->pdiv.offset);
    422	val &= ~(bit_mask(ctrl->pdiv.width) << ctrl->pdiv.shift);
    423	val |= vco->pdiv << ctrl->pdiv.shift;
    424	iproc_pll_write(pll, pll->control_base, ctrl->pdiv.offset, val);
    425
    426	__pll_bring_out_reset(pll, kp, ka, ki);
    427
    428	ret = pll_wait_for_lock(pll);
    429	if (ret < 0) {
    430		pr_err("%s: pll: %s failed to lock\n", __func__, clk_name);
    431		return ret;
    432	}
    433
    434	return 0;
    435}
    436
    437static int iproc_pll_enable(struct clk_hw *hw)
    438{
    439	struct iproc_clk *clk = to_iproc_clk(hw);
    440	struct iproc_pll *pll = clk->pll;
    441
    442	return __pll_enable(pll);
    443}
    444
    445static void iproc_pll_disable(struct clk_hw *hw)
    446{
    447	struct iproc_clk *clk = to_iproc_clk(hw);
    448	struct iproc_pll *pll = clk->pll;
    449	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    450
    451	if (ctrl->flags & IPROC_CLK_AON)
    452		return;
    453
    454	__pll_disable(pll);
    455}
    456
    457static unsigned long iproc_pll_recalc_rate(struct clk_hw *hw,
    458					   unsigned long parent_rate)
    459{
    460	struct iproc_clk *clk = to_iproc_clk(hw);
    461	struct iproc_pll *pll = clk->pll;
    462	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    463	u32 val;
    464	u64 ndiv, ndiv_int, ndiv_frac;
    465	unsigned int pdiv;
    466	unsigned long rate;
    467
    468	if (parent_rate == 0)
    469		return 0;
    470
    471	/* PLL needs to be locked */
    472	val = readl(pll->status_base + ctrl->status.offset);
    473	if ((val & (1 << ctrl->status.shift)) == 0)
    474		return 0;
    475
    476	/*
    477	 * PLL output frequency =
    478	 *
    479	 * ((ndiv_int + ndiv_frac / 2^20) * (parent clock rate / pdiv)
    480	 */
    481	val = readl(pll->control_base + ctrl->ndiv_int.offset);
    482	ndiv_int = (val >> ctrl->ndiv_int.shift) &
    483		bit_mask(ctrl->ndiv_int.width);
    484	ndiv = ndiv_int << 20;
    485
    486	if (ctrl->flags & IPROC_CLK_PLL_HAS_NDIV_FRAC) {
    487		val = readl(pll->control_base + ctrl->ndiv_frac.offset);
    488		ndiv_frac = (val >> ctrl->ndiv_frac.shift) &
    489			bit_mask(ctrl->ndiv_frac.width);
    490		ndiv += ndiv_frac;
    491	}
    492
    493	val = readl(pll->control_base + ctrl->pdiv.offset);
    494	pdiv = (val >> ctrl->pdiv.shift) & bit_mask(ctrl->pdiv.width);
    495
    496	rate = (ndiv * parent_rate) >> 20;
    497
    498	if (pdiv == 0)
    499		rate *= 2;
    500	else
    501		rate /= pdiv;
    502
    503	return rate;
    504}
    505
    506static int iproc_pll_determine_rate(struct clk_hw *hw,
    507		struct clk_rate_request *req)
    508{
    509	unsigned int  i;
    510	struct iproc_clk *clk = to_iproc_clk(hw);
    511	struct iproc_pll *pll = clk->pll;
    512	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    513	unsigned long  diff, best_diff;
    514	unsigned int  best_idx = 0;
    515	int ret;
    516
    517	if (req->rate == 0 || req->best_parent_rate == 0)
    518		return -EINVAL;
    519
    520	if (ctrl->flags & IPROC_CLK_PLL_CALC_PARAM) {
    521		struct iproc_pll_vco_param vco_param;
    522
    523		ret = pll_calc_param(req->rate, req->best_parent_rate,
    524					&vco_param);
    525		if (ret)
    526			return ret;
    527
    528		req->rate = vco_param.rate;
    529		return 0;
    530	}
    531
    532	if (!pll->vco_param)
    533		return -EINVAL;
    534
    535	best_diff = ULONG_MAX;
    536	for (i = 0; i < pll->num_vco_entries; i++) {
    537		diff = abs(req->rate - pll->vco_param[i].rate);
    538		if (diff <= best_diff) {
    539			best_diff = diff;
    540			best_idx = i;
    541		}
    542		/* break now if perfect match */
    543		if (diff == 0)
    544			break;
    545	}
    546
    547	req->rate = pll->vco_param[best_idx].rate;
    548
    549	return 0;
    550}
    551
    552static int iproc_pll_set_rate(struct clk_hw *hw, unsigned long rate,
    553		unsigned long parent_rate)
    554{
    555	struct iproc_clk *clk = to_iproc_clk(hw);
    556	struct iproc_pll *pll = clk->pll;
    557	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    558	struct iproc_pll_vco_param vco_param;
    559	int rate_index, ret;
    560
    561	if (ctrl->flags & IPROC_CLK_PLL_CALC_PARAM) {
    562		ret = pll_calc_param(rate, parent_rate, &vco_param);
    563		if (ret)
    564			return ret;
    565	} else {
    566		rate_index = pll_get_rate_index(pll, rate);
    567		if (rate_index < 0)
    568			return rate_index;
    569
    570		vco_param = pll->vco_param[rate_index];
    571	}
    572
    573	ret = pll_set_rate(clk, &vco_param, parent_rate);
    574	return ret;
    575}
    576
    577static const struct clk_ops iproc_pll_ops = {
    578	.enable = iproc_pll_enable,
    579	.disable = iproc_pll_disable,
    580	.recalc_rate = iproc_pll_recalc_rate,
    581	.determine_rate = iproc_pll_determine_rate,
    582	.set_rate = iproc_pll_set_rate,
    583};
    584
    585static int iproc_clk_enable(struct clk_hw *hw)
    586{
    587	struct iproc_clk *clk = to_iproc_clk(hw);
    588	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
    589	struct iproc_pll *pll = clk->pll;
    590	u32 val;
    591
    592	/* channel enable is active low */
    593	val = readl(pll->control_base + ctrl->enable.offset);
    594	val &= ~(1 << ctrl->enable.enable_shift);
    595	iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
    596
    597	/* also make sure channel is not held */
    598	val = readl(pll->control_base + ctrl->enable.offset);
    599	val &= ~(1 << ctrl->enable.hold_shift);
    600	iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
    601
    602	return 0;
    603}
    604
    605static void iproc_clk_disable(struct clk_hw *hw)
    606{
    607	struct iproc_clk *clk = to_iproc_clk(hw);
    608	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
    609	struct iproc_pll *pll = clk->pll;
    610	u32 val;
    611
    612	if (ctrl->flags & IPROC_CLK_AON)
    613		return;
    614
    615	val = readl(pll->control_base + ctrl->enable.offset);
    616	val |= 1 << ctrl->enable.enable_shift;
    617	iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
    618}
    619
    620static unsigned long iproc_clk_recalc_rate(struct clk_hw *hw,
    621		unsigned long parent_rate)
    622{
    623	struct iproc_clk *clk = to_iproc_clk(hw);
    624	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
    625	struct iproc_pll *pll = clk->pll;
    626	u32 val;
    627	unsigned int mdiv;
    628	unsigned long rate;
    629
    630	if (parent_rate == 0)
    631		return 0;
    632
    633	val = readl(pll->control_base + ctrl->mdiv.offset);
    634	mdiv = (val >> ctrl->mdiv.shift) & bit_mask(ctrl->mdiv.width);
    635	if (mdiv == 0)
    636		mdiv = 256;
    637
    638	if (ctrl->flags & IPROC_CLK_MCLK_DIV_BY_2)
    639		rate = parent_rate / (mdiv * 2);
    640	else
    641		rate = parent_rate / mdiv;
    642
    643	return rate;
    644}
    645
    646static int iproc_clk_determine_rate(struct clk_hw *hw,
    647		struct clk_rate_request *req)
    648{
    649	unsigned int bestdiv;
    650
    651	if (req->rate == 0)
    652		return -EINVAL;
    653	if (req->rate == req->best_parent_rate)
    654		return 0;
    655
    656	bestdiv = DIV_ROUND_CLOSEST(req->best_parent_rate, req->rate);
    657	if (bestdiv < 2)
    658		req->rate = req->best_parent_rate;
    659
    660	if (bestdiv > 256)
    661		bestdiv = 256;
    662
    663	req->rate = req->best_parent_rate / bestdiv;
    664
    665	return 0;
    666}
    667
    668static int iproc_clk_set_rate(struct clk_hw *hw, unsigned long rate,
    669		unsigned long parent_rate)
    670{
    671	struct iproc_clk *clk = to_iproc_clk(hw);
    672	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
    673	struct iproc_pll *pll = clk->pll;
    674	u32 val;
    675	unsigned int div;
    676
    677	if (rate == 0 || parent_rate == 0)
    678		return -EINVAL;
    679
    680	div = DIV_ROUND_CLOSEST(parent_rate, rate);
    681	if (ctrl->flags & IPROC_CLK_MCLK_DIV_BY_2)
    682		div /=  2;
    683
    684	if (div > 256)
    685		return -EINVAL;
    686
    687	val = readl(pll->control_base + ctrl->mdiv.offset);
    688	if (div == 256) {
    689		val &= ~(bit_mask(ctrl->mdiv.width) << ctrl->mdiv.shift);
    690	} else {
    691		val &= ~(bit_mask(ctrl->mdiv.width) << ctrl->mdiv.shift);
    692		val |= div << ctrl->mdiv.shift;
    693	}
    694	iproc_pll_write(pll, pll->control_base, ctrl->mdiv.offset, val);
    695
    696	return 0;
    697}
    698
    699static const struct clk_ops iproc_clk_ops = {
    700	.enable = iproc_clk_enable,
    701	.disable = iproc_clk_disable,
    702	.recalc_rate = iproc_clk_recalc_rate,
    703	.determine_rate = iproc_clk_determine_rate,
    704	.set_rate = iproc_clk_set_rate,
    705};
    706
    707/*
    708 * Some PLLs require the PLL SW override bit to be set before changes can be
    709 * applied to the PLL
    710 */
    711static void iproc_pll_sw_cfg(struct iproc_pll *pll)
    712{
    713	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
    714
    715	if (ctrl->flags & IPROC_CLK_PLL_NEEDS_SW_CFG) {
    716		u32 val;
    717
    718		val = readl(pll->control_base + ctrl->sw_ctrl.offset);
    719		val |= BIT(ctrl->sw_ctrl.shift);
    720		iproc_pll_write(pll, pll->control_base, ctrl->sw_ctrl.offset,
    721				val);
    722	}
    723}
    724
    725void iproc_pll_clk_setup(struct device_node *node,
    726			 const struct iproc_pll_ctrl *pll_ctrl,
    727			 const struct iproc_pll_vco_param *vco,
    728			 unsigned int num_vco_entries,
    729			 const struct iproc_clk_ctrl *clk_ctrl,
    730			 unsigned int num_clks)
    731{
    732	int i, ret;
    733	struct iproc_pll *pll;
    734	struct iproc_clk *iclk;
    735	struct clk_init_data init;
    736	const char *parent_name;
    737	struct iproc_clk *iclk_array;
    738	struct clk_hw_onecell_data *clk_data;
    739
    740	if (WARN_ON(!pll_ctrl) || WARN_ON(!clk_ctrl))
    741		return;
    742
    743	pll = kzalloc(sizeof(*pll), GFP_KERNEL);
    744	if (WARN_ON(!pll))
    745		return;
    746
    747	clk_data = kzalloc(struct_size(clk_data, hws, num_clks), GFP_KERNEL);
    748	if (WARN_ON(!clk_data))
    749		goto err_clk_data;
    750	clk_data->num = num_clks;
    751
    752	iclk_array = kcalloc(num_clks, sizeof(struct iproc_clk), GFP_KERNEL);
    753	if (WARN_ON(!iclk_array))
    754		goto err_clks;
    755
    756	pll->control_base = of_iomap(node, 0);
    757	if (WARN_ON(!pll->control_base))
    758		goto err_pll_iomap;
    759
    760	/* Some SoCs do not require the pwr_base, thus failing is not fatal */
    761	pll->pwr_base = of_iomap(node, 1);
    762
    763	/* some PLLs require gating control at the top ASIU level */
    764	if (pll_ctrl->flags & IPROC_CLK_PLL_ASIU) {
    765		pll->asiu_base = of_iomap(node, 2);
    766		if (WARN_ON(!pll->asiu_base))
    767			goto err_asiu_iomap;
    768	}
    769
    770	if (pll_ctrl->flags & IPROC_CLK_PLL_SPLIT_STAT_CTRL) {
    771		/* Some SoCs have a split status/control.  If this does not
    772		 * exist, assume they are unified.
    773		 */
    774		pll->status_base = of_iomap(node, 2);
    775		if (!pll->status_base)
    776			goto err_status_iomap;
    777	} else
    778		pll->status_base = pll->control_base;
    779
    780	/* initialize and register the PLL itself */
    781	pll->ctrl = pll_ctrl;
    782
    783	iclk = &iclk_array[0];
    784	iclk->pll = pll;
    785
    786	init.name = node->name;
    787	init.ops = &iproc_pll_ops;
    788	init.flags = 0;
    789	parent_name = of_clk_get_parent_name(node, 0);
    790	init.parent_names = (parent_name ? &parent_name : NULL);
    791	init.num_parents = (parent_name ? 1 : 0);
    792	iclk->hw.init = &init;
    793
    794	if (vco) {
    795		pll->num_vco_entries = num_vco_entries;
    796		pll->vco_param = vco;
    797	}
    798
    799	iproc_pll_sw_cfg(pll);
    800
    801	ret = clk_hw_register(NULL, &iclk->hw);
    802	if (WARN_ON(ret))
    803		goto err_pll_register;
    804
    805	clk_data->hws[0] = &iclk->hw;
    806
    807	/* now initialize and register all leaf clocks */
    808	for (i = 1; i < num_clks; i++) {
    809		const char *clk_name;
    810
    811		memset(&init, 0, sizeof(init));
    812		parent_name = node->name;
    813
    814		ret = of_property_read_string_index(node, "clock-output-names",
    815						    i, &clk_name);
    816		if (WARN_ON(ret))
    817			goto err_clk_register;
    818
    819		iclk = &iclk_array[i];
    820		iclk->pll = pll;
    821		iclk->ctrl = &clk_ctrl[i];
    822
    823		init.name = clk_name;
    824		init.ops = &iproc_clk_ops;
    825		init.flags = 0;
    826		init.parent_names = (parent_name ? &parent_name : NULL);
    827		init.num_parents = (parent_name ? 1 : 0);
    828		iclk->hw.init = &init;
    829
    830		ret = clk_hw_register(NULL, &iclk->hw);
    831		if (WARN_ON(ret))
    832			goto err_clk_register;
    833
    834		clk_data->hws[i] = &iclk->hw;
    835	}
    836
    837	ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
    838	if (WARN_ON(ret))
    839		goto err_clk_register;
    840
    841	return;
    842
    843err_clk_register:
    844	while (--i >= 0)
    845		clk_hw_unregister(clk_data->hws[i]);
    846
    847err_pll_register:
    848	if (pll->status_base != pll->control_base)
    849		iounmap(pll->status_base);
    850
    851err_status_iomap:
    852	if (pll->asiu_base)
    853		iounmap(pll->asiu_base);
    854
    855err_asiu_iomap:
    856	if (pll->pwr_base)
    857		iounmap(pll->pwr_base);
    858
    859	iounmap(pll->control_base);
    860
    861err_pll_iomap:
    862	kfree(iclk_array);
    863
    864err_clks:
    865	kfree(clk_data);
    866
    867err_clk_data:
    868	kfree(pll);
    869}