Commit 4d6da823 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Stephen Boyd
Browse files

clk: mmp: Switch to use struct u32_fract instead of custom one



The struct mmp_clk_factor_tbl repeats the generic struct u32_fract.
Kill the custom one and use the generic one instead.

Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: default avatarDuje Mihanović <duje.mihanovic@skole.hr>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarStephen Boyd <sboyd@kernel.org>
Signed-off-by: default avatarDuje Mihanović <duje.mihanovic@skole.hr>
Link: https://lore.kernel.org/r/20241104-pxa1908-lkml-v13-1-e050609b8d6c@skole.hr


Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 9852d85e
Loading
Loading
Loading
Loading
+28 −29
Original line number Diff line number Diff line
@@ -26,14 +26,15 @@ static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate,
{
	struct mmp_clk_factor *factor = to_clk_factor(hw);
	u64 rate = 0, prev_rate;
	struct u32_fract *d;
	int i;

	for (i = 0; i < factor->ftbl_cnt; i++) {
		prev_rate = rate;
		rate = *prate;
		rate *= factor->ftbl[i].den;
		do_div(rate, factor->ftbl[i].num * factor->masks->factor);
		d = &factor->ftbl[i];

		prev_rate = rate;
		rate = (u64)(*prate) * d->denominator;
		do_div(rate, d->numerator * factor->masks->factor);
		if (rate > drate)
			break;
	}
@@ -52,23 +53,22 @@ static unsigned long clk_factor_recalc_rate(struct clk_hw *hw,
{
	struct mmp_clk_factor *factor = to_clk_factor(hw);
	struct mmp_clk_factor_masks *masks = factor->masks;
	unsigned int val, num, den;
	struct u32_fract d;
	unsigned int val;
	u64 rate;

	val = readl_relaxed(factor->base);

	/* calculate numerator */
	num = (val >> masks->num_shift) & masks->num_mask;
	d.numerator = (val >> masks->num_shift) & masks->num_mask;

	/* calculate denominator */
	den = (val >> masks->den_shift) & masks->den_mask;

	if (!den)
	d.denominator = (val >> masks->den_shift) & masks->den_mask;
	if (!d.denominator)
		return 0;

	rate = parent_rate;
	rate *= den;
	do_div(rate, num * factor->masks->factor);
	rate = (u64)parent_rate * d.denominator;
	do_div(rate, d.numerator * factor->masks->factor);

	return rate;
}
@@ -82,18 +82,18 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate,
	int i;
	unsigned long val;
	unsigned long flags = 0;
	struct u32_fract *d;
	u64 rate = 0;

	for (i = 0; i < factor->ftbl_cnt; i++) {
		rate = prate;
		rate *= factor->ftbl[i].den;
		do_div(rate, factor->ftbl[i].num * factor->masks->factor);
		d = &factor->ftbl[i];

		rate = (u64)prate * d->denominator;
		do_div(rate, d->numerator * factor->masks->factor);
		if (rate > drate)
			break;
	}
	if (i > 0)
		i--;
	d = i ? &factor->ftbl[i - 1] : &factor->ftbl[0];

	if (factor->lock)
		spin_lock_irqsave(factor->lock, flags);
@@ -101,10 +101,10 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate,
	val = readl_relaxed(factor->base);

	val &= ~(masks->num_mask << masks->num_shift);
	val |= (factor->ftbl[i].num & masks->num_mask) << masks->num_shift;
	val |= (d->numerator & masks->num_mask) << masks->num_shift;

	val &= ~(masks->den_mask << masks->den_shift);
	val |= (factor->ftbl[i].den & masks->den_mask) << masks->den_shift;
	val |= (d->denominator & masks->den_mask) << masks->den_shift;

	writel_relaxed(val, factor->base);

@@ -118,7 +118,8 @@ static int clk_factor_init(struct clk_hw *hw)
{
	struct mmp_clk_factor *factor = to_clk_factor(hw);
	struct mmp_clk_factor_masks *masks = factor->masks;
	u32 val, num, den;
	struct u32_fract d;
	u32 val;
	int i;
	unsigned long flags = 0;

@@ -128,23 +129,22 @@ static int clk_factor_init(struct clk_hw *hw)
	val = readl(factor->base);

	/* calculate numerator */
	num = (val >> masks->num_shift) & masks->num_mask;
	d.numerator = (val >> masks->num_shift) & masks->num_mask;

	/* calculate denominator */
	den = (val >> masks->den_shift) & masks->den_mask;
	d.denominator = (val >> masks->den_shift) & masks->den_mask;

	for (i = 0; i < factor->ftbl_cnt; i++)
		if (den == factor->ftbl[i].den && num == factor->ftbl[i].num)
		if (d.denominator == factor->ftbl[i].denominator &&
		    d.numerator == factor->ftbl[i].numerator)
			break;

	if (i >= factor->ftbl_cnt) {
		val &= ~(masks->num_mask << masks->num_shift);
		val |= (factor->ftbl[0].num & masks->num_mask) <<
			masks->num_shift;
		val |= (factor->ftbl[0].numerator & masks->num_mask) << masks->num_shift;

		val &= ~(masks->den_mask << masks->den_shift);
		val |= (factor->ftbl[0].den & masks->den_mask) <<
			masks->den_shift;
		val |= (factor->ftbl[0].denominator & masks->den_mask) << masks->den_shift;
	}

	if (!(val & masks->enable_mask) || i >= factor->ftbl_cnt) {
@@ -168,8 +168,7 @@ static const struct clk_ops clk_factor_ops = {
struct clk *mmp_clk_register_factor(const char *name, const char *parent_name,
		unsigned long flags, void __iomem *base,
		struct mmp_clk_factor_masks *masks,
		struct mmp_clk_factor_tbl *ftbl,
		unsigned int ftbl_cnt, spinlock_t *lock)
		struct u32_fract *ftbl, unsigned int ftbl_cnt, spinlock_t *lock)
{
	struct mmp_clk_factor *factor;
	struct clk_init_data init;
+13 −13
Original line number Diff line number Diff line
@@ -143,9 +143,9 @@ static struct mmp_clk_factor_masks uart_factor_masks = {
	.den_shift = 0,
};

static struct mmp_clk_factor_tbl uart_factor_tbl[] = {
	{.num = 8125, .den = 1536},	/*14.745MHZ */
	{.num = 3521, .den = 689},	/*19.23MHZ */
static struct u32_fract uart_factor_tbl[] = {
	{ .numerator = 8125, .denominator = 1536 },	/* 14.745MHZ */
	{ .numerator = 3521, .denominator =  689 },	/* 19.23MHZ */
};

static struct mmp_clk_factor_masks i2s_factor_masks = {
@@ -157,16 +157,16 @@ static struct mmp_clk_factor_masks i2s_factor_masks = {
	.enable_mask = 0xd0000000,
};

static struct mmp_clk_factor_tbl i2s_factor_tbl[] = {
	{.num = 24868, .den =  511},	/*  2.0480 MHz */
	{.num = 28003, .den =  793},	/*  2.8224 MHz */
	{.num = 24941, .den = 1025},	/*  4.0960 MHz */
	{.num = 28003, .den = 1586},	/*  5.6448 MHz */
	{.num = 31158, .den = 2561},	/*  8.1920 MHz */
	{.num = 16288, .den = 1845},	/* 11.2896 MHz */
	{.num = 20772, .den = 2561},	/* 12.2880 MHz */
	{.num =  8144, .den = 1845},	/* 22.5792 MHz */
	{.num = 10386, .den = 2561},	/* 24.5760 MHz */
static struct u32_fract i2s_factor_tbl[] = {
	{ .numerator = 24868, .denominator =  511 },	/*  2.0480 MHz */
	{ .numerator = 28003, .denominator =  793 },	/*  2.8224 MHz */
	{ .numerator = 24941, .denominator = 1025 },	/*  4.0960 MHz */
	{ .numerator = 28003, .denominator = 1586 },	/*  5.6448 MHz */
	{ .numerator = 31158, .denominator = 2561 },	/*  8.1920 MHz */
	{ .numerator = 16288, .denominator = 1845 },	/* 11.2896 MHz */
	{ .numerator = 20772, .denominator = 2561 },	/* 12.2880 MHz */
	{ .numerator =  8144, .denominator = 1845 },	/* 22.5792 MHz */
	{ .numerator = 10386, .denominator = 2561 },	/* 24.5760 MHz */
};

static DEFINE_SPINLOCK(acgr_lock);
+2 −2
Original line number Diff line number Diff line
@@ -106,8 +106,8 @@ static struct mmp_clk_factor_masks uart_factor_masks = {
	.den_shift = 0,
};

static struct mmp_clk_factor_tbl uart_factor_tbl[] = {
	{.num = 8125, .den = 1536},	/*14.745MHZ */
static struct u32_fract uart_factor_tbl[] = {
	{ .numerator = 8125, .denominator = 1536 },	/* 14.745MHZ */
};

static void pxa168_pll_init(struct pxa168_clk_unit *pxa_unit)
+3 −3
Original line number Diff line number Diff line
@@ -61,9 +61,9 @@ static struct mmp_clk_factor_masks uart_factor_masks = {
	.den_shift = 0,
};

static struct mmp_clk_factor_tbl uart_factor_tbl[] = {
	{.num = 832, .den = 234},	/*58.5MHZ */
	{.num = 1, .den = 1},		/*26MHZ */
static struct u32_fract uart_factor_tbl[] = {
	{ .numerator = 832, .denominator = 234 },	/* 58.5MHZ */
	{ .numerator =   1, .denominator =   1 },	/* 26MHZ */
};

static void pxa1928_pll_init(struct pxa1928_clk_unit *pxa_unit)
+2 −2
Original line number Diff line number Diff line
@@ -86,8 +86,8 @@ static struct mmp_clk_factor_masks uart_factor_masks = {
	.den_shift = 0,
};

static struct mmp_clk_factor_tbl uart_factor_tbl[] = {
	{.num = 8125, .den = 1536},	/*14.745MHZ */
static struct u32_fract uart_factor_tbl[] = {
	{ .numerator = 8125, .denominator = 1536 },	/* 14.745MHZ */
};

static void pxa910_pll_init(struct pxa910_clk_unit *pxa_unit)
Loading