[U-Boot] [PATCH 04/14] soc: ti: pruss: add a misc driver for PRUSS in TI SoCs
Andreas Dannenberg
dannenberg at ti.com
Tue Aug 6 15:50:51 UTC 2019
On Tue, Aug 06, 2019 at 04:08:34PM +0530, Keerthy wrote:
> The Programmable Real-Time Unit - Industrial Communication
> Subsystem (PRU-ICSS) is present of various TI SoCs such as
> AM335x or AM437x or the AM654x family. Each SoC can have
> one or more PRUSS instances that may or may not be identical.
>
> The PRUSS consists of dual 32-bit RISC cores called the
> Programmable Real-Time Units (PRUs), some shared, data and
> instruction memories, some internal peripheral modules, and
> an interrupt controller. The programmable nature of the PRUs
> provide flexibility to implement custom peripheral interfaces,
> fast real-time responses, or specialized data handling.
>
> Add support for pruss driver. Currently am654x family
> is supported.
>
> Signed-off-by: Keerthy <j-keerthy at ti.com>
> ---
> drivers/soc/ti/Kconfig | 13 ++++
> drivers/soc/ti/Makefile | 1 +
> drivers/soc/ti/pruss.c | 128 ++++++++++++++++++++++++++++++++++++++++
> include/ti-pruss.h | 12 ++++
> 4 files changed, 154 insertions(+)
> create mode 100644 drivers/soc/ti/pruss.c
> create mode 100644 include/ti-pruss.h
>
> diff --git a/drivers/soc/ti/Kconfig b/drivers/soc/ti/Kconfig
> index e4f8834448..179b73a541 100644
> --- a/drivers/soc/ti/Kconfig
> +++ b/drivers/soc/ti/Kconfig
> @@ -23,4 +23,17 @@ config TI_KEYSTONE_SERDES
> SerDes driver for Keystone SoC used for ethernet support on TI
> K2 platforms.
>
> +config TI_PRUSS
> + bool "Support for TI's K3 based Pruss driver"
> + depends on DM
> + depends on ARCH_K3
> + depends on OF_CONTROL
> + depends on SYSCON
> + help
> +
Usually there is no blank line below 'help', the next line should follow
immediately to better indicate those things belong together.
> + Support for TI PRU-ICSSG subsystem.
> +
> + Currently supported on AM65xx SoCs Say Y here to support the
First sentence is missing the period ('.')
> + Programmable Realtime Unit (PRU).
> +
> endif # SOC_TI
> diff --git a/drivers/soc/ti/Makefile b/drivers/soc/ti/Makefile
> index 4ec04ee125..34f80aad29 100644
> --- a/drivers/soc/ti/Makefile
> +++ b/drivers/soc/ti/Makefile
> @@ -2,3 +2,4 @@
>
> obj-$(CONFIG_TI_K3_NAVSS_RINGACC) += k3-navss-ringacc.o
> obj-$(CONFIG_TI_KEYSTONE_SERDES) += keystone_serdes.o
> +obj-$(CONFIG_TI_PRUSS) += pruss.o
> diff --git a/drivers/soc/ti/pruss.c b/drivers/soc/ti/pruss.c
> new file mode 100644
> index 0000000000..03ddaaa539
> --- /dev/null
> +++ b/drivers/soc/ti/pruss.c
> @@ -0,0 +1,128 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * PRU-ICSS platform driver for various TI SoCs
> + *
> + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
> + * Keerthy <j-keerthy at ti.com>
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <dm/of_access.h>
> +#include <errno.h>
> +#include <clk.h>
> +#include <reset.h>
> +#include <regmap.h>
> +#include <syscon.h>
> +#include <asm/io.h>
> +#include <power-domain.h>
> +#include <ti-pruss.h>
> +
> +#define PRUSS_CFG_IEPCLK 0x30
> +#define ICSSG_CFG_CORE_SYNC 0x3c
> +
> +/* PRUSS_IEPCLK register bits */
> +#define PRUSS_IEPCLK_IEP_OCP_CLK_EN BIT(0)
> +
> +/* ICSSG CORE_SYNC register bits */
> +#define ICSSG_CORE_VBUSP_SYNC_EN BIT(0)
> +
> +/**
> + * enum pruss_mem - PRUSS memory range identifiers
> + */
> +enum pruss_mem {
> + PRUSS_MEM_DRAM0 = 0,
> + PRUSS_MEM_DRAM1,
> + PRUSS_MEM_SHRD_RAM2,
> + PRUSS_MEM_MAX,
> +};
> +
> +int pruss_request_shrmem_region(struct udevice *dev, phys_addr_t *loc)
> +{
> + struct pruss *priv;
> +
> + priv = dev_get_priv(dev);
> + if (!priv || !priv->pruss_shrdram2)
> + return -EINVAL;
> +
> + *loc = priv->pruss_shrdram2;
> +
> + return 0;
> +}
> +
> +static int pruss_bind(struct udevice *dev)
> +{
> + return dm_scan_fdt_dev(dev);
> +}
> +
> +/**
> + * pruss_probe() - Basic probe
> + * @dev: corresponding k3 device
> + *
> + * Return: 0 if all goes good, else appropriate error message.
> + */
> +static int pruss_probe(struct udevice *dev)
> +{
> + struct pruss *priv;
> + int ret, idx;
> + ofnode sub_node, node, memories;
> + struct regmap *regmap_cfg;
> + struct udevice *syscon;
> +
> + priv = dev_get_priv(dev);
> + node = dev_ofnode(dev);
> + sub_node = ofnode_find_subnode(node, "cfg");
> + memories = ofnode_find_subnode(node, "memories");
> +
> + idx = ofnode_stringlist_search(memories, "reg-names", "dram0");
> + priv->pruss_dram0 = ofnode_get_addr_size_index(memories, idx,
> + (u64 *)&priv->pruss_dram0sz);
> + idx = ofnode_stringlist_search(memories, "reg-names", "dram1");
> + priv->pruss_dram1 = ofnode_get_addr_size_index(memories, idx,
> + (u64 *)&priv->pruss_dram1sz);
> + idx = ofnode_stringlist_search(memories, "reg-names", "shrdram2");
> + priv->pruss_shrdram2 = ofnode_get_addr_size_index(memories, idx,
> + (u64 *)&priv->pruss_shrdram2sz);
> +
> + ret = uclass_get_device_by_ofnode(UCLASS_SYSCON, sub_node,
> + &syscon);
> +
> + regmap_cfg = syscon_get_regmap(syscon);
> +
> + /*
> + * The CORE block uses two multiplexers to allow software to
> + * select one of three source clocks (ICSSGn_CORE_CLK, ICSSGn_ICLK or
> + * ICSSGn_IEP_CLK) for the final clock source of the CORE block.
> + * The user needs to configure ICSSG_CORE_SYNC_REG[0] CORE_VBUSP_SYNC_EN
> + * bit & ICSSG_IEPCLK_REG[0] IEP_OCP_CLK_EN bit in order to select the
> + * clock source to the CORE block.
> + */
> + ret = regmap_update_bits(regmap_cfg, ICSSG_CFG_CORE_SYNC,
> + ICSSG_CORE_VBUSP_SYNC_EN,
> + ICSSG_CORE_VBUSP_SYNC_EN);
> + if (ret)
> + return ret;
> + ret = regmap_update_bits(regmap_cfg, PRUSS_CFG_IEPCLK,
> + PRUSS_IEPCLK_IEP_OCP_CLK_EN,
> + PRUSS_IEPCLK_IEP_OCP_CLK_EN);
> + if (ret)
> + return ret;
> +
> + dev_dbg(dev, "pruss successfully probed %s\n", dev->name);
> +
> + return 0;
> +}
> +
> +static const struct udevice_id pruss_ids[] = {
> + { .compatible = "ti,am654-icssg"},
There should be a space prior to the closing curly brace.
> + {}
> +};
> +
> +U_BOOT_DRIVER(pruss) = {
> + .name = "pruss",
> + .of_match = pruss_ids,
> + .id = UCLASS_MISC,
> + .bind = pruss_bind,
> + .probe = pruss_probe,
> + .priv_auto_alloc_size = sizeof(struct pruss),
> +};
> diff --git a/include/ti-pruss.h b/include/ti-pruss.h
> new file mode 100644
> index 0000000000..547ec5ee33
> --- /dev/null
> +++ b/include/ti-pruss.h
> @@ -0,0 +1,12 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
How about adding some include guards (#ifndef...) to the header file?
--
Andreas Dannenberg
Texas Instruments Inc
> +struct pruss {
> + phys_addr_t pruss_dram0;
> + phys_addr_t pruss_dram1;
> + phys_addr_t pruss_shrdram2;
> + phys_size_t pruss_dram0sz;
> + phys_size_t pruss_dram1sz;
> + phys_size_t pruss_shrdram2sz;
> +};
> +
> +int pruss_request_shrmem_region(struct udevice *dev, phys_addr_t *loc);
> --
> 2.17.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
More information about the U-Boot
mailing list