Re: [RESEND, PATCH v13 11/12] soc: mediatek: cmdq: add cmdq_dev_get_client_reg function
From: Matthias Brugger <matthias.bgg@gmail.com>
Date: 2019-08-27 10:14:03
Also in:
linux-devicetree, linux-mediatek, lkml
On 27/08/2019 05:59, Bibby Hsieh wrote:
On Fri, 2019-08-23 at 16:21 +0200, Matthias Brugger wrote:quoted
On 20/08/2019 10:49, Bibby Hsieh wrote:quoted
GCE cannot know the register base address, this function can help cmdq client to get the cmdq_client_reg structure. Signed-off-by: Bibby Hsieh <redacted> Reviewed-by: CK Hu <redacted> --- drivers/soc/mediatek/mtk-cmdq-helper.c | 29 ++++++++++++++++++++++++++ include/linux/soc/mediatek/mtk-cmdq.h | 21 +++++++++++++++++++ 2 files changed, 50 insertions(+)diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c index c53f8476c68d..80f75a1075b4 100644 --- a/drivers/soc/mediatek/mtk-cmdq-helper.c +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c@@ -27,6 +27,35 @@ struct cmdq_instruction { u8 op; }; +int cmdq_dev_get_client_reg(struct device *dev, + struct cmdq_client_reg *client_reg, int idx) +{Can't we do/call this in cmdq_mbox_create parsing the number of gce-client-reg properties we have and allocating these using a pointer to cmdq_client_reg in cmdq_client? We will have to free the pointer then in cmdq_mbox_destroy. Regards, MatthiasI don't think we need to keep the cmdq_client_reg in cmdq_client structure. Because our client will have own data structure, they will copy the client_reg information into their own structure. In the design now, we do not allocate the cmdq_client_reg, client pass the cmdq_client_reg pointer into this API. Client will destroy the pointer after they get the information they want.
My point wasn't so much about the lifecycle of the object, but the fact that we add another call, which can be already full-filled by a necessary previous call to cmdq_mbox_create. So I would prefer to add the information gathering for cmdq_client_reg in this call, and let it live there for the time cmdq_client lives. In the end we are talking about 40 bits of memory. Regards, Matthias
Thanks for the comments so much. Bibbyquoted
quoted
+ struct of_phandle_args spec; + int err; + + if (!client_reg) + return -ENOENT; + + err = of_parse_phandle_with_fixed_args(dev->of_node, + "mediatek,gce-client-reg", + 3, idx, &spec); + if (err < 0) { + dev_err(dev, + "error %d can't parse gce-client-reg property (%d)", + err, idx); + + return err; + } + + client_reg->subsys = (u8)spec.args[0]; + client_reg->offset = (u16)spec.args[1]; + client_reg->size = (u16)spec.args[2]; + of_node_put(spec.np); + + return 0; +} +EXPORT_SYMBOL(cmdq_dev_get_client_reg); + static void cmdq_client_timeout(struct timer_list *t) { struct cmdq_client *client = from_timer(client, t, timer);diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h index a345870a6d10..02ddd60b212f 100644 --- a/include/linux/soc/mediatek/mtk-cmdq.h +++ b/include/linux/soc/mediatek/mtk-cmdq.h@@ -15,6 +15,12 @@ struct cmdq_pkt; +struct cmdq_client_reg { + u8 subsys; + u16 offset; + u16 size; +}; + struct cmdq_client { spinlock_t lock; u32 pkt_cnt;@@ -24,6 +30,21 @@ struct cmdq_client { u32 timeout_ms; /* in unit of microsecond */ }; +/** + * cmdq_dev_get_client_reg() - parse cmdq client reg from the device + * node of CMDQ client + * @dev: device of CMDQ mailbox client + * @client_reg: CMDQ client reg pointer + * @idx: the index of desired reg + * + * Return: 0 for success; else the error code is returned + * + * Help CMDQ client parsing the cmdq client reg + * from the device node of CMDQ client. + */ +int cmdq_dev_get_client_reg(struct device *dev, + struct cmdq_client_reg *client_reg, int idx); + /** * cmdq_mbox_create() - create CMDQ mailbox client and channel * @dev: device of CMDQ mailbox client
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel