lkml.org 
[lkml]   [2021]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V4 5/8] remoteproc: imx_rproc: initial support for mutilple start/stop method
    Date
    From: Peng Fan <peng.fan@nxp.com>

    Add three methods IMX_RPROC_NONE(no need start/stop), IMX_RPROC_MMIO
    (start/stop through mmio) and IMX_RPROC_SMC(start/stop through ARM SMCCC).

    The current SoCs supported are all using IMX_RPROC_MMIO, add a restrict
    in imx_rproc_detect_mode that only SoCs using IMX_RPROC_MMIO needs syscon
    regmap to access registers.

    Signed-off-by: Peng Fan <peng.fan@nxp.com>
    ---
    drivers/remoteproc/imx_rproc.c | 51 +++++++++++++++++++++++++++++-------------
    1 file changed, 35 insertions(+), 16 deletions(-)

    diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
    index 06dac92..2b633fd 100644
    --- a/drivers/remoteproc/imx_rproc.c
    +++ b/drivers/remoteproc/imx_rproc.c
    @@ -74,6 +74,15 @@ struct imx_rproc_att {
    int flags;
    };

    +/* Remote core start/stop method */
    +enum imx_rproc_method {
    + IMX_RPROC_NONE,
    + /* Through syscon regmap */
    + IMX_RPROC_MMIO,
    + /* Through ARM SMCCC */
    + IMX_RPROC_SMC,
    +};
    +
    struct imx_rproc_dcfg {
    u32 src_reg;
    u32 src_mask;
    @@ -81,6 +90,7 @@ struct imx_rproc_dcfg {
    u32 src_stop;
    const struct imx_rproc_att *att;
    size_t att_size;
    + enum imx_rproc_method method;
    };

    struct imx_rproc {
    @@ -183,6 +193,7 @@ static const struct imx_rproc_dcfg imx_rproc_cfg_imx8mq = {
    .src_stop = IMX7D_M4_STOP,
    .att = imx_rproc_att_imx8mq,
    .att_size = ARRAY_SIZE(imx_rproc_att_imx8mq),
    + .method = IMX_RPROC_MMIO,
    };

    static const struct imx_rproc_dcfg imx_rproc_cfg_imx7d = {
    @@ -192,6 +203,7 @@ static const struct imx_rproc_dcfg imx_rproc_cfg_imx7d = {
    .src_stop = IMX7D_M4_STOP,
    .att = imx_rproc_att_imx7d,
    .att_size = ARRAY_SIZE(imx_rproc_att_imx7d),
    + .method = IMX_RPROC_MMIO,
    };

    static const struct imx_rproc_dcfg imx_rproc_cfg_imx6sx = {
    @@ -201,6 +213,7 @@ static const struct imx_rproc_dcfg imx_rproc_cfg_imx6sx = {
    .src_stop = IMX6SX_M4_STOP,
    .att = imx_rproc_att_imx6sx,
    .att_size = ARRAY_SIZE(imx_rproc_att_imx6sx),
    + .method = IMX_RPROC_MMIO,
    };

    static int imx_rproc_start(struct rproc *rproc)
    @@ -560,19 +573,35 @@ static void imx_rproc_free_mbox(struct rproc *rproc)

    static int imx_rproc_detect_mode(struct imx_rproc *priv)
    {
    + struct regmap_config config = { .name = "imx-rproc" };
    const struct imx_rproc_dcfg *dcfg = priv->dcfg;
    struct device *dev = priv->dev;
    + struct regmap *regmap;
    int ret;
    u32 val;

    - ret = regmap_read(priv->regmap, dcfg->src_reg, &val);
    - if (ret) {
    - dev_err(dev, "Failed to read src\n");
    - return ret;
    + if (dcfg->method != IMX_RPROC_MMIO)
    + return 0;
    +
    + regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon");
    + if (IS_ERR(regmap)) {
    + dev_err(dev, "failed to find syscon\n");
    + return PTR_ERR(regmap);
    }

    - if (!(val & dcfg->src_stop))
    - priv->rproc->state = RPROC_DETACHED;
    + priv->regmap = regmap;
    + regmap_attach_dev(dev, regmap, &config);
    +
    + if (regmap) {
    + ret = regmap_read(regmap, dcfg->src_reg, &val);
    + if (ret) {
    + dev_err(dev, "Failed to read src\n");
    + return ret;
    + }
    +
    + if (!(val & dcfg->src_stop))
    + priv->rproc->state = RPROC_DETACHED;
    + }

    return 0;
    }
    @@ -583,18 +612,9 @@ static int imx_rproc_probe(struct platform_device *pdev)
    struct device_node *np = dev->of_node;
    struct imx_rproc *priv;
    struct rproc *rproc;
    - struct regmap_config config = { .name = "imx-rproc" };
    const struct imx_rproc_dcfg *dcfg;
    - struct regmap *regmap;
    int ret;

    - regmap = syscon_regmap_lookup_by_phandle(np, "syscon");
    - if (IS_ERR(regmap)) {
    - dev_err(dev, "failed to find syscon\n");
    - return PTR_ERR(regmap);
    - }
    - regmap_attach_dev(dev, regmap, &config);
    -
    /* set some other name then imx */
    rproc = rproc_alloc(dev, "imx-rproc", &imx_rproc_ops,
    NULL, sizeof(*priv));
    @@ -609,7 +629,6 @@ static int imx_rproc_probe(struct platform_device *pdev)

    priv = rproc->priv;
    priv->rproc = rproc;
    - priv->regmap = regmap;
    priv->dcfg = dcfg;
    priv->dev = dev;

    --
    2.7.4
    \
     
     \ /
      Last update: 2021-04-15 15:44    [W:3.369 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site