public inbox for linux-iio@vger.kernel.org
 help / color / mirror / Atom feed
* [RESEND v4 08/15] iio: adc: aspeed: Use model_data to set clk scaler.
  2021-08-24  9:12 [RESEND v4 00/15] Add support for ast2600 ADC Billy Tsai
@ 2021-08-24  9:12 ` Billy Tsai
       [not found] ` <202108250006.17P06IgG097015@twspam01.aspeedtech.com>
  1 sibling, 0 replies; 3+ messages in thread
From: Billy Tsai @ 2021-08-24  9:12 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt, joel, andrew, p.zabel, lgirdwood,
	broonie, linux-iio, devicetree, linux-arm-kernel, linux-aspeed,
	linux-kernel
  Cc: BMC-SW

This patch use need_prescaler and scaler_bit_width to set the adc clock
scaler.

Signed-off-by: Billy Tsai <billy_tsai@aspeedtech.com>
---
 drivers/iio/adc/aspeed_adc.c | 39 +++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c
index 2d6215a91f99..52db38be9699 100644
--- a/drivers/iio/adc/aspeed_adc.c
+++ b/drivers/iio/adc/aspeed_adc.c
@@ -202,9 +202,10 @@ static int aspeed_adc_probe(struct platform_device *pdev)
 {
 	struct iio_dev *indio_dev;
 	struct aspeed_adc_data *data;
-	const char *clk_parent_name;
 	int ret;
 	u32 adc_engine_control_reg_val;
+	unsigned long scaler_flags = 0;
+	char clk_name[32], clk_parent_name[32];
 
 	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*data));
 	if (!indio_dev)
@@ -221,24 +222,28 @@ static int aspeed_adc_probe(struct platform_device *pdev)
 
 	/* Register ADC clock prescaler with source specified by device tree. */
 	spin_lock_init(&data->clk_lock);
-	clk_parent_name = of_clk_get_parent_name(pdev->dev.of_node, 0);
-
-	data->clk_prescaler = clk_hw_register_divider(
-				&pdev->dev, "prescaler", clk_parent_name, 0,
-				data->base + ASPEED_REG_CLOCK_CONTROL,
-				17, 15, 0, &data->clk_lock);
-	if (IS_ERR(data->clk_prescaler))
-		return PTR_ERR(data->clk_prescaler);
-
+	snprintf(clk_parent_name, 32, of_clk_get_parent_name(pdev->dev.of_node, 0));
+	if (data->model_data->need_prescaler) {
+		snprintf(clk_name, 32, "%s-prescaler",
+			 data->model_data->model_name);
+		data->clk_prescaler = clk_hw_register_divider(
+			&pdev->dev, clk_name, clk_parent_name, 0,
+			data->base + ASPEED_REG_CLOCK_CONTROL, 17, 15, 0,
+			&data->clk_lock);
+		if (IS_ERR(data->clk_prescaler))
+			return PTR_ERR(data->clk_prescaler);
+		snprintf(clk_parent_name, 32, clk_name);
+		scaler_flags = CLK_SET_RATE_PARENT;
+	}
 	/*
 	 * Register ADC clock scaler downstream from the prescaler. Allow rate
 	 * setting to adjust the prescaler as well.
 	 */
+	snprintf(clk_name, 32, "%s-scaler", data->model_data->model_name);
 	data->clk_scaler = clk_hw_register_divider(
-				&pdev->dev, "scaler", "prescaler",
-				CLK_SET_RATE_PARENT,
-				data->base + ASPEED_REG_CLOCK_CONTROL,
-				0, 10, 0, &data->clk_lock);
+		&pdev->dev, clk_name, clk_parent_name, scaler_flags,
+		data->base + ASPEED_REG_CLOCK_CONTROL, 0,
+		data->model_data->scaler_bit_width, 0, &data->clk_lock);
 	if (IS_ERR(data->clk_scaler)) {
 		ret = PTR_ERR(data->clk_scaler);
 		goto scaler_error;
@@ -310,7 +315,8 @@ static int aspeed_adc_probe(struct platform_device *pdev)
 reset_error:
 	clk_hw_unregister_divider(data->clk_scaler);
 scaler_error:
-	clk_hw_unregister_divider(data->clk_prescaler);
+	if (data->model_data->need_prescaler)
+		clk_hw_unregister_divider(data->clk_prescaler);
 	return ret;
 }
 
@@ -325,7 +331,8 @@ static int aspeed_adc_remove(struct platform_device *pdev)
 	clk_disable_unprepare(data->clk_scaler->clk);
 	reset_control_assert(data->rst);
 	clk_hw_unregister_divider(data->clk_scaler);
-	clk_hw_unregister_divider(data->clk_prescaler);
+	if (data->model_data->need_prescaler)
+		clk_hw_unregister_divider(data->clk_prescaler);
 
 	return 0;
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [RESEND v4 08/15] iio: adc: aspeed: Use model_data to set clk scaler.
       [not found] <202108250004.17P04ZJi095039@twspam01.aspeedtech.com>
@ 2021-08-25 11:52 ` kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-08-25 11:52 UTC (permalink / raw)
  To: Billy Tsai, jic23, lars, pmeerw, robh+dt, joel, andrew, p.zabel,
	lgirdwood, broonie, linux-iio
  Cc: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 6847 bytes --]

Hi Billy,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on iio/togreg]
[also build test WARNING on v5.14-rc7 next-20210824]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Billy-Tsai/Add-support-for-ast2600-ADC/20210825-082858
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
config: alpha-randconfig-r026-20210825 (attached as .config)
compiler: alpha-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/78a7c95363794cdf2453244b7e64b432d29d17f3
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Billy-Tsai/Add-support-for-ast2600-ADC/20210825-082858
        git checkout 78a7c95363794cdf2453244b7e64b432d29d17f3
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=alpha 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/iio/adc/aspeed_adc.c: In function 'aspeed_adc_probe':
>> drivers/iio/adc/aspeed_adc.c:225:9: warning: argument 3 null where non-null expected [-Wnonnull]
     225 |         snprintf(clk_parent_name, 32, of_clk_get_parent_name(pdev->dev.of_node, 0));
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from include/linux/clk.h:13,
                    from drivers/iio/adc/aspeed_adc.c:9:
   include/linux/kernel.h:204:5: note: in a call to function 'snprintf' declared 'nonnull'
     204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
         |     ^~~~~~~~


vim +225 drivers/iio/adc/aspeed_adc.c

   200	
   201	static int aspeed_adc_probe(struct platform_device *pdev)
   202	{
   203		struct iio_dev *indio_dev;
   204		struct aspeed_adc_data *data;
   205		int ret;
   206		u32 adc_engine_control_reg_val;
   207		unsigned long scaler_flags = 0;
   208		char clk_name[32], clk_parent_name[32];
   209	
   210		indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*data));
   211		if (!indio_dev)
   212			return -ENOMEM;
   213	
   214		data = iio_priv(indio_dev);
   215		data->dev = &pdev->dev;
   216		data->model_data = of_device_get_match_data(&pdev->dev);
   217		platform_set_drvdata(pdev, indio_dev);
   218	
   219		data->base = devm_platform_ioremap_resource(pdev, 0);
   220		if (IS_ERR(data->base))
   221			return PTR_ERR(data->base);
   222	
   223		/* Register ADC clock prescaler with source specified by device tree. */
   224		spin_lock_init(&data->clk_lock);
 > 225		snprintf(clk_parent_name, 32, of_clk_get_parent_name(pdev->dev.of_node, 0));
   226		if (data->model_data->need_prescaler) {
   227			snprintf(clk_name, 32, "%s-prescaler",
   228				 data->model_data->model_name);
   229			data->clk_prescaler = clk_hw_register_divider(
   230				&pdev->dev, clk_name, clk_parent_name, 0,
   231				data->base + ASPEED_REG_CLOCK_CONTROL, 17, 15, 0,
   232				&data->clk_lock);
   233			if (IS_ERR(data->clk_prescaler))
   234				return PTR_ERR(data->clk_prescaler);
   235			snprintf(clk_parent_name, 32, clk_name);
   236			scaler_flags = CLK_SET_RATE_PARENT;
   237		}
   238		/*
   239		 * Register ADC clock scaler downstream from the prescaler. Allow rate
   240		 * setting to adjust the prescaler as well.
   241		 */
   242		snprintf(clk_name, 32, "%s-scaler", data->model_data->model_name);
   243		data->clk_scaler = clk_hw_register_divider(
   244			&pdev->dev, clk_name, clk_parent_name, scaler_flags,
   245			data->base + ASPEED_REG_CLOCK_CONTROL, 0,
   246			data->model_data->scaler_bit_width, 0, &data->clk_lock);
   247		if (IS_ERR(data->clk_scaler)) {
   248			ret = PTR_ERR(data->clk_scaler);
   249			goto scaler_error;
   250		}
   251	
   252		data->rst = devm_reset_control_get_exclusive(&pdev->dev, NULL);
   253		if (IS_ERR(data->rst)) {
   254			dev_err(&pdev->dev,
   255				"invalid or missing reset controller device tree entry");
   256			ret = PTR_ERR(data->rst);
   257			goto reset_error;
   258		}
   259		reset_control_deassert(data->rst);
   260	
   261		ret = aspeed_adc_vref_config(indio_dev);
   262		if (ret)
   263			goto vref_config_error;
   264	
   265		if (data->model_data->wait_init_sequence) {
   266			/* Enable engine in normal mode. */
   267			writel(FIELD_PREP(ASPEED_ADC_OP_MODE,
   268					  ASPEED_ADC_OP_MODE_NORMAL) |
   269				       ASPEED_ADC_ENGINE_ENABLE,
   270			       data->base + ASPEED_REG_ENGINE_CONTROL);
   271	
   272			/* Wait for initial sequence complete. */
   273			ret = readl_poll_timeout(data->base + ASPEED_REG_ENGINE_CONTROL,
   274						 adc_engine_control_reg_val,
   275						 adc_engine_control_reg_val &
   276						 ASPEED_ADC_CTRL_INIT_RDY,
   277						 ASPEED_ADC_INIT_POLLING_TIME,
   278						 ASPEED_ADC_INIT_TIMEOUT);
   279			if (ret)
   280				goto poll_timeout_error;
   281		}
   282	
   283		/* Start all channels in normal mode. */
   284		ret = clk_prepare_enable(data->clk_scaler->clk);
   285		if (ret)
   286			goto clk_enable_error;
   287	
   288		adc_engine_control_reg_val =
   289			ASPEED_ADC_CTRL_CHANNEL |
   290			FIELD_PREP(ASPEED_ADC_OP_MODE, ASPEED_ADC_OP_MODE_NORMAL) |
   291			ASPEED_ADC_ENGINE_ENABLE;
   292		writel(adc_engine_control_reg_val,
   293		       data->base + ASPEED_REG_ENGINE_CONTROL);
   294	
   295		indio_dev->name = data->model_data->model_name;
   296		indio_dev->info = &aspeed_adc_iio_info;
   297		indio_dev->modes = INDIO_DIRECT_MODE;
   298		indio_dev->channels = aspeed_adc_iio_channels;
   299		indio_dev->num_channels = data->model_data->num_channels;
   300	
   301		ret = iio_device_register(indio_dev);
   302		if (ret)
   303			goto iio_register_error;
   304	
   305		return 0;
   306	
   307	iio_register_error:
   308		writel(FIELD_PREP(ASPEED_ADC_OP_MODE, ASPEED_ADC_OP_MODE_PWR_DOWN),
   309		       data->base + ASPEED_REG_ENGINE_CONTROL);
   310		clk_disable_unprepare(data->clk_scaler->clk);
   311	clk_enable_error:
   312	poll_timeout_error:
   313	vref_config_error:
   314		reset_control_assert(data->rst);
   315	reset_error:
   316		clk_hw_unregister_divider(data->clk_scaler);
   317	scaler_error:
   318		if (data->model_data->need_prescaler)
   319			clk_hw_unregister_divider(data->clk_prescaler);
   320		return ret;
   321	}
   322	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 27988 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [RESEND v4 08/15] iio: adc: aspeed: Use model_data to set clk scaler.
       [not found] ` <202108250006.17P06IgG097015@twspam01.aspeedtech.com>
@ 2021-08-29 15:20   ` Jonathan Cameron
  0 siblings, 0 replies; 3+ messages in thread
From: Jonathan Cameron @ 2021-08-29 15:20 UTC (permalink / raw)
  To: Billy Tsai
  Cc: lars, pmeerw, robh+dt, joel, andrew, p.zabel, lgirdwood, broonie,
	linux-iio, devicetree, linux-arm-kernel, linux-aspeed,
	linux-kernel, BMC-SW

On Tue, 24 Aug 2021 17:12:36 +0800
Billy Tsai <billy_tsai@aspeedtech.com> wrote:

> This patch use need_prescaler and scaler_bit_width to set the adc clock
> scaler.
> 
> Signed-off-by: Billy Tsai <billy_tsai@aspeedtech.com>
Hi Billy,

One minor comment inline.

Thanks,

Jonathan

> ---
>  drivers/iio/adc/aspeed_adc.c | 39 +++++++++++++++++++++---------------
>  1 file changed, 23 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c
> index 2d6215a91f99..52db38be9699 100644
> --- a/drivers/iio/adc/aspeed_adc.c
> +++ b/drivers/iio/adc/aspeed_adc.c
> @@ -202,9 +202,10 @@ static int aspeed_adc_probe(struct platform_device *pdev)
>  {
>  	struct iio_dev *indio_dev;
>  	struct aspeed_adc_data *data;
> -	const char *clk_parent_name;
>  	int ret;
>  	u32 adc_engine_control_reg_val;
> +	unsigned long scaler_flags = 0;
> +	char clk_name[32], clk_parent_name[32];
>  
>  	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*data));
>  	if (!indio_dev)
> @@ -221,24 +222,28 @@ static int aspeed_adc_probe(struct platform_device *pdev)
>  
>  	/* Register ADC clock prescaler with source specified by device tree. */
>  	spin_lock_init(&data->clk_lock);
> -	clk_parent_name = of_clk_get_parent_name(pdev->dev.of_node, 0);
> -
> -	data->clk_prescaler = clk_hw_register_divider(
> -				&pdev->dev, "prescaler", clk_parent_name, 0,
> -				data->base + ASPEED_REG_CLOCK_CONTROL,
> -				17, 15, 0, &data->clk_lock);
> -	if (IS_ERR(data->clk_prescaler))
> -		return PTR_ERR(data->clk_prescaler);
> -
> +	snprintf(clk_parent_name, 32, of_clk_get_parent_name(pdev->dev.of_node, 0));

ARRAY_SIZE(clk_parent_name) instead of 32.
Same for other places this pattern occurs.


> +	if (data->model_data->need_prescaler) {
> +		snprintf(clk_name, 32, "%s-prescaler",
> +			 data->model_data->model_name);
> +		data->clk_prescaler = clk_hw_register_divider(
> +			&pdev->dev, clk_name, clk_parent_name, 0,
> +			data->base + ASPEED_REG_CLOCK_CONTROL, 17, 15, 0,
> +			&data->clk_lock);
> +		if (IS_ERR(data->clk_prescaler))
> +			return PTR_ERR(data->clk_prescaler);
> +		snprintf(clk_parent_name, 32, clk_name);
> +		scaler_flags = CLK_SET_RATE_PARENT;
> +	}
>  	/*
>  	 * Register ADC clock scaler downstream from the prescaler. Allow rate
>  	 * setting to adjust the prescaler as well.
>  	 */
> +	snprintf(clk_name, 32, "%s-scaler", data->model_data->model_name);
>  	data->clk_scaler = clk_hw_register_divider(
> -				&pdev->dev, "scaler", "prescaler",
> -				CLK_SET_RATE_PARENT,
> -				data->base + ASPEED_REG_CLOCK_CONTROL,
> -				0, 10, 0, &data->clk_lock);
> +		&pdev->dev, clk_name, clk_parent_name, scaler_flags,
> +		data->base + ASPEED_REG_CLOCK_CONTROL, 0,
> +		data->model_data->scaler_bit_width, 0, &data->clk_lock);
>  	if (IS_ERR(data->clk_scaler)) {
>  		ret = PTR_ERR(data->clk_scaler);
>  		goto scaler_error;
> @@ -310,7 +315,8 @@ static int aspeed_adc_probe(struct platform_device *pdev)
>  reset_error:
>  	clk_hw_unregister_divider(data->clk_scaler);
>  scaler_error:
> -	clk_hw_unregister_divider(data->clk_prescaler);
> +	if (data->model_data->need_prescaler)
> +		clk_hw_unregister_divider(data->clk_prescaler);
>  	return ret;
>  }
>  
> @@ -325,7 +331,8 @@ static int aspeed_adc_remove(struct platform_device *pdev)
>  	clk_disable_unprepare(data->clk_scaler->clk);
>  	reset_control_assert(data->rst);
>  	clk_hw_unregister_divider(data->clk_scaler);
> -	clk_hw_unregister_divider(data->clk_prescaler);
> +	if (data->model_data->need_prescaler)
> +		clk_hw_unregister_divider(data->clk_prescaler);
>  
>  	return 0;
>  }


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-08-29 15:17 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <202108250004.17P04ZJi095039@twspam01.aspeedtech.com>
2021-08-25 11:52 ` [RESEND v4 08/15] iio: adc: aspeed: Use model_data to set clk scaler kernel test robot
2021-08-24  9:12 [RESEND v4 00/15] Add support for ast2600 ADC Billy Tsai
2021-08-24  9:12 ` [RESEND v4 08/15] iio: adc: aspeed: Use model_data to set clk scaler Billy Tsai
     [not found] ` <202108250006.17P06IgG097015@twspam01.aspeedtech.com>
2021-08-29 15:20   ` Jonathan Cameron

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox