Re: [PATCH 07/11] clk: renesas: rcar-gen3: Add support for RCKSEL clock selection

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 11, 2018 at 04:20:56PM +0200, Geert Uytterhoeven wrote:
> Add a clock type and macro for defining clocks where the parent and
> divider are selected based on the value of the RCKCR.CKSEL bit.
> 
> Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
> ---
>  drivers/clk/renesas/rcar-gen3-cpg.c | 23 ++++++++++++++++++++---
>  drivers/clk/renesas/rcar-gen3-cpg.h |  8 +++++++-
>  2 files changed, 27 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/clk/renesas/rcar-gen3-cpg.c b/drivers/clk/renesas/rcar-gen3-cpg.c
> index 7533a51c679bfd54..19a77822757d29de 100644
> --- a/drivers/clk/renesas/rcar-gen3-cpg.c
> +++ b/drivers/clk/renesas/rcar-gen3-cpg.c
> @@ -1,7 +1,7 @@
>  /*
>   * R-Car Gen3 Clock Pulse Generator
>   *
> - * Copyright (C) 2015-2016 Glider bvba
> + * Copyright (C) 2015-2018 Glider bvba
>   *
>   * Based on clk-rcar-gen3.c
>   *
> @@ -31,6 +31,8 @@
>  #define CPG_PLL2CR		0x002c
>  #define CPG_PLL4CR		0x01f4
>  
> +#define CPG_RCKCR_CKSEL	BIT(15)	/* RCLK Clock Source Select */
> +
>  struct cpg_simple_notifier {
>  	struct notifier_block nb;
>  	void __iomem *reg;
> @@ -444,7 +446,7 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
>  	unsigned int div = 1;
>  	u32 value;
>  
> -	parent = clks[core->parent & 0xffff];	/* CLK_TYPE_PE uses high bits */
> +	parent = clks[core->parent & 0xffff];	/* some types use high bits */
>  	if (IS_ERR(parent))
>  		return ERR_CAST(parent);
>  
> @@ -524,7 +526,7 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
>  
>  			if (clk_get_rate(clks[cpg_clk_extalr])) {
>  				parent = clks[cpg_clk_extalr];
> -				value |= BIT(15);
> +				value |= CPG_RCKCR_CKSEL;
>  			}
>  
>  			writel(value, csn->reg);
> @@ -570,6 +572,21 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
>  		div = cpg_pll_config->osc_prediv * core->div;
>  		break;
>  
> +	case CLK_TYPE_GEN3_RCKSEL:
> +		/*
> +		 * Clock selectable between two parents and two fixed dividers
> +		 * using RCKCR.CKSEL
> +		 */
> +		if (readl(base + CPG_RCKCR) & CPG_RCKCR_CKSEL) {
> +			div = core->div & 0xffff;
> +		} else {
> +			parent = clks[core->parent >> 16];
> +			if (IS_ERR(parent))
> +				return ERR_CAST(parent);
> +			div = core->div >> 16;
> +		}
> +		break;
> +
>  	default:
>  		return ERR_PTR(-EINVAL);
>  	}
> diff --git a/drivers/clk/renesas/rcar-gen3-cpg.h b/drivers/clk/renesas/rcar-gen3-cpg.h
> index d7d84d9e4a1c9c8b..214df713ce719991 100644
> --- a/drivers/clk/renesas/rcar-gen3-cpg.h
> +++ b/drivers/clk/renesas/rcar-gen3-cpg.h
> @@ -1,7 +1,7 @@
>  /*
>   * R-Car Gen3 Clock Pulse Generator
>   *
> - * Copyright (C) 2015-2016 Glider bvba
> + * Copyright (C) 2015-2018 Glider bvba
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License as published by
> @@ -24,6 +24,7 @@ enum rcar_gen3_clk_types {
>  	CLK_TYPE_GEN3_Z,
>  	CLK_TYPE_GEN3_Z2,
>  	CLK_TYPE_GEN3_OSC,	/* OSC EXTAL predivider and fixed divider */
> +	CLK_TYPE_GEN3_RCKSEL,	/* Select parent/divider using RCKCR.CKSEL */
>  };
>  
>  #define DEF_GEN3_SD(_name, _id, _parent, _offset)	\
> @@ -37,6 +38,11 @@ enum rcar_gen3_clk_types {
>  #define DEF_GEN3_OSC(_name, _id, _parent, _div)		\
>  	DEF_BASE(_name, _id, CLK_TYPE_GEN3_OSC, _parent, .div = _div)
>  
> +#define DEF_GEN3_RCKSEL(_name, _id, _parent0, _div0, _parent1, _div1) \
> +	DEF_BASE(_name, _id, CLK_TYPE_GEN3_RCKSEL,	\
> +		 (_parent0) << 16 | (_parent1),	.div = (_div0) << 16 | (_div1))
> +
> +

There seems to be an extra blank line here.

>  struct rcar_gen3_cpg_pll_config {
>  	u8 extal_div;
>  	u8 pll1_mult;
> -- 
> 2.17.1
> 



[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux