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 <[email protected]>
> ---
> 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 <[email protected]>");
> +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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html