Re: [v4, 1/6] soc: fsl: add GUTS driver for QorIQ platforms

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

 



On Mon, 2015-12-14 at 12:24 +0800, Yangbo Lu wrote:
> The global utilities block controls power management, I/O device
> enabling, power-onreset(POR) configuration monitoring, alternate
> function selection for multiplexed signals,and clock control.
> 
> This patch adds GUTS driver to manage and access global utilities
> block.
> 
> Signed-off-by: Yangbo Lu <yangbo.lu@xxxxxxxxxxxxx>
> ---
> Changes for v2:
> 	- None
> Changes for v3:
> 	- None
> Changes for v4:
> 	- Added this patch
> ---
>  drivers/soc/Kconfig      |   1 +
>  drivers/soc/Makefile     |   1 +
>  drivers/soc/fsl/Kconfig  |  19 ++++++++
>  drivers/soc/fsl/Makefile |   4 ++
>  drivers/soc/fsl/guts.c   | 112
> +++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/fsl/guts.h | 103 +++++++++++++++++++++++--------------------
>  6 files changed, 192 insertions(+), 48 deletions(-)
>  create mode 100644 drivers/soc/fsl/Kconfig
>  create mode 100644 drivers/soc/fsl/Makefile
>  create mode 100644 drivers/soc/fsl/guts.c
> 
> diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
> index 4e853ed..68b5b90 100644
> --- a/drivers/soc/Kconfig
> +++ b/drivers/soc/Kconfig
> @@ -7,5 +7,6 @@ source "drivers/soc/rockchip/Kconfig"
>  source "drivers/soc/sunxi/Kconfig"
>  source "drivers/soc/ti/Kconfig"
>  source "drivers/soc/versatile/Kconfig"
> +source "drivers/soc/fsl/Kconfig"
>  
>  endmenu
> diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
> index f2ba2e9..2747e58 100644
> --- a/drivers/soc/Makefile
> +++ b/drivers/soc/Makefile
> @@ -11,3 +11,4 @@ obj-$(CONFIG_ARCH_SUNXI)	+= sunxi/
>  obj-$(CONFIG_ARCH_TEGRA)	+= tegra/
>  obj-$(CONFIG_SOC_TI)		+= ti/
>  obj-$(CONFIG_PLAT_VERSATILE)	+= versatile/
> +obj-$(CONFIG_SOC_FSL)		+= fsl/
> diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig
> new file mode 100644
> index 0000000..09966f0
> --- /dev/null
> +++ b/drivers/soc/fsl/Kconfig
> @@ -0,0 +1,19 @@
> +#
> +# FSL SOC drivers
> +#
> +menuconfig SOC_FSL
> +	bool "Freescale SOC drivers support"
> +
> +if SOC_FSL
> +
> +config FSL_GUTS
> +	tristate "QorIQ Platforms GUTS Driver"
> +	help
> +	  Say y here to enable Freescale QorIQ platforms GUTS driver
> support.
> +	  The global utilities block controls power management, I/O device
> +	  enabling, power-onreset(POR) configuration monitoring, alternate
> +	  function selection for multiplexed signals,and clock control.
> +
> +	  If unsure, say N.

This doesn't do anything user-visible (so far, at least) so it should just be
selected by the drivers that need it.

> +/*
> + * Table for matching compatible strings, for device tree
> + * guts node, for Freescale QorIQ SOCs.
> + * "fsl,qoriq-device-config-2.0" corresponds to T4 & B4
> + * SOCs. For the older SOCs "fsl,qoriq-device-config-1.0"
> + * string would be used.
> + */
> +static const struct of_device_id guts_device_ids[] = {
> +	{ .compatible = "fsl,qoriq-device-config-1.0", },
> +	{ .compatible = "fsl,qoriq-device-config-2.0", },
> +	{}
> +};

What about pre-corenet chips, with compatibles such as "fsl,p2020-guts"?  What
compatible gets used on Layerscape chips?

> +
> +struct ccsr_guts __iomem *guts_regmap(void)
> +{
> +	struct device_node *guts_node;
> +	struct ccsr_guts __iomem *guts;
> +
> +	guts_node = of_find_matching_node(NULL, guts_device_ids);
> +	if (!guts_node)
> +		return NULL;
> +
> +	guts = of_iomap(guts_node, 0);
> +	if (!guts)
> +		return NULL;
> +
> +	of_node_put(guts_node);
> +	return guts;
> +}
> +EXPORT_SYMBOL_GPL(guts_regmap);

This should not be exported.  This should be a normal driver that gets probed
and does its own init.  Callers to this driver should -EPROBE_DEFER if it's
not available yet, and this driver should probably register itself in a
subsys_initcall() or even arch_initcall() to reduce the likelihood of that
(especially if -EPROBE_DEFER would have resulted in deferring another driver
to a phase later than it wanted to init in).


> +
> +u8 guts_get_reg8(void __iomem *reg)
> +{
> +	u8 val;
> +
> +	val = ioread8(reg);
> +	return val;
> +}
> +EXPORT_SYMBOL_GPL(guts_get_reg8);
> +
> +void guts_set_reg8(void __iomem *reg, u8 value)
> +{
> +	iowrite8(value, reg);
> +}
> +EXPORT_SYMBOL_GPL(guts_set_reg8);
> +
> +u32 guts_get_reg32(void __iomem *reg)
> +{
> +	struct device_node *guts_node;
> +	u32 val;
> +
> +	guts_node = of_find_matching_node(NULL, guts_device_ids);
> +	if (!guts_node)
> +		return 0;
> +
> +	if (of_property_read_bool(guts_node, "little-endian"))
> +		val = ioread32(reg);
> +	else
> +		val = ioread32be(reg);
> +
> +	return val;
> +}
> +EXPORT_SYMBOL_GPL(guts_get_reg32);
> +
> +void guts_set_reg32(void __iomem *reg, u32 value)
> +{
> +	struct device_node *guts_node;
> +
> +	guts_node = of_find_matching_node(NULL, guts_device_ids);
> +	if (!guts_node)
> +		return;
> +
> +	if (of_property_read_bool(guts_node, "little-endian"))
> +		iowrite32(value, reg);
> +	else
> +		iowrite32be(value, reg);
> +}
> +EXPORT_SYMBOL_GPL(guts_set_reg32);

No.  Export fsl_guts_get_svr().

Also, read the little-endian property once at driver init, not on each access.

> +static int __init guts_drv_init(void)
> +{
> +	pr_info("guts: Freescale QorIQ Platforms GUTS Driver\n");
> +	return 0;
> +}
> +module_init(guts_drv_init);
> +
> +static void __exit guts_drv_exit(void)
> +{
> +}
> +module_exit(guts_drv_exit);

Get rid of the print, especially since it prints regardless of whether the
hardware is present.

> +
> +MODULE_AUTHOR("Yangbo Lu <yangbo.lu@xxxxxxxxxxxxx>");
> +MODULE_DESCRIPTION("Freescale QorIQ Platforms GUTS Driver");
> +MODULE_LICENSE("GPL v2");

The copyright header says "v2 or later" so MODULE_LICENSE should be just
"GPL".

-Scott

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux