Subject: [RFC PATCH 3/3] ARM: OMAP2+: Add command line parameter for debugSS module control

From: [email-masked] (Tony Lindgren)
Date: Mon, 8 Apr 2013 10:29:37 -0700

Hi,

* hvaibhav at ti.com <[email-masked]> [130304 03:40]:
> From: Vaibhav Hiremath <[email-masked]>
> 
> Currently there is no clean mechanism to control debugSS module and
> you have to always keep clocks enabled, either,
> 
>     - By enabling it during boot as part of clk_init function.
>     Or
>     - By having HWMOD_INIT_NO_IDLE flag in hwmod data.
> 
> Based on the discussion,
> http://www.mail-archive.com/linux-omap at vger.kernel.org/msg81771.html
> 
> This patch introduces new kernel parameter "omap_debugss_en",
> which will allow user to control debugSS module enable/disable
> part during boot-time.

I suggest you just make this part into a standard DT only
device driver. That way the command line parsing and clock
enabling can happen the normal way.

Is there any reason why this could not be a loadable module?

Regards,

Tony
 
> Signed-off-by: Vaibhav Hiremath <[email-masked]>
> Cc: Kevin Hilman <[email-masked]>
> Cc: Paul Walmsley <[email-masked]>
> Cc: Tony Lindgren <[email-masked]>
> ---
> Tested on
> 	- AM335x based EVM and BeagleBone platforms
> 
>  Documentation/kernel-parameters.txt |    3 +
>  arch/arm/mach-omap2/Makefile        |    2 +-
>  arch/arm/mach-omap2/debugss.c       |   80 +++++++++++++++++++++++++++++++++++
>  3 files changed, 84 insertions(+), 1 deletions(-)
>  create mode 100644 arch/arm/mach-omap2/debugss.c
> 
> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
> index 6c72381..bf1c822 100644
> --- a/Documentation/kernel-parameters.txt
> +++ b/Documentation/kernel-parameters.txt
> @@ -2051,6 +2051,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
>  			For example, to override I2C bus2:
>  			omap_mux=i2c2_scl.i2c2_scl=0x100,i2c2_sda.i2c2_sda=0x100
> 
> +	omap_debugss_en	[OMAP] Enable Debug Sub-System module required
> +			for JTAG debugging.
> +
>  	oprofile.timer=	[HW]
>  			Use timer interrupt instead of performance counters
> 
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index d1156cf..aaf5cc2 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -5,7 +5,7 @@
>  # Common support
>  obj-y := id.o io.o control.o mux.o devices.o fb.o serial.o gpmc.o timer.o pm.o \
>  	 common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \
> -	 omap_device.o sram.o
> +	 omap_device.o sram.o debugss.o
> 
>  omap-2-3-common				= irq.o
>  hwmod-common				= omap_hwmod.o \
> diff --git a/arch/arm/mach-omap2/debugss.c b/arch/arm/mach-omap2/debugss.c
> new file mode 100644
> index 0000000..b45bf2c
> --- /dev/null
> +++ b/arch/arm/mach-omap2/debugss.c
> @@ -0,0 +1,80 @@
> +/*
> + * debugss.c: Debug Sus-System related code goes in here
> + *
> + * Copyright (C) {2013} Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * This file is automatically generated from the AM33XX hardware databases.
> + * 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 the Free Software Foundation version 2.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether express or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/init.h>
> +#include <linux/err.h>
> +#include <linux/clk.h>
> +
> +#include "omap_hwmod.h"
> +
> +static bool is_debugss_en;
> +
> +/**
> + * omap_debugss_en - Enable debugss clock/module based on user config
> + *
> + * During kernel bootup, omap2 hwmod framework will disable all the
> + * unused/unclaimed modules, which in turn also disables debugss module.
> + * This breaks any further debugging capability provided by HW.
> + *
> + *
> + * Introduce early param which allows user to enable clock/module -
> + *
> + *   omap_debugss_en	(For all OMAP2 architectures)
> + *
> + * Please note that, with this command-line param, module always remain
> + * enabled.
> + */
> +static int __init omap_debugss_en(char *str)
> +{
> +	is_debugss_en = true;
> +	return 0;
> +}
> +early_param("omap_debugss_en", omap_debugss_en);
> +
> +static int __init _omap2_debugss_enable(void)
> +{
> +	const char oh_name[10] = "debugss";
> +	struct omap_hwmod *oh;
> +	int ret;
> +
> +	if (is_debugss_en) {
> +		struct omap_hwmod_opt_clk *oc;
> +		int i;
> +
> +		oh = omap_hwmod_lookup(oh_name);
> +		if (!oh) {
> +			pr_err("debugss device not found\n");
> +			return 0;
> +		}
> +
> +		/* Make sure that hwmod internal data structures are setup */
> +		ret = omap_hwmod_setup_one(oh_name);
> +		if (ret) {
> +			pr_err("failed to setup hwmod for %s\n", oh_name);
> +			return 0;
> +		}
> +		/* Enable optional clocks */
> +		for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)	{
> +			if (oc->_clk)
> +				clk_prepare_enable(oc->_clk);
> +		}
> +		/* Enable debugss clock/module  */
> +		omap_hwmod_enable(oh);
> +	}
> +
> +	return 0;
> +}
> +device_initcall(_omap2_debugss_enable);
> --
> 1.7.0.4
>