Message ID | 20240415-pinctrl-scmi-v10-0-59c6e7a586ee@nxp.com |
---|---|
Headers | show |
Series | firmware: arm_scmi: Add SCMI v3.2 pincontrol protocol basic support | expand |
I'm trying to re-base AKASHI Takahiro's gpio driver on top of your scmi pinctrl driver. https://lore.kernel.org/all/20231005025843.508689-1-takahiro.akashi@linaro.org/ I need to do something like this below to save the gpio information. So now, great, I have the information but I'm not sure how to export it from the scmi pinctrl driver to the gpio driver... (This is a probably a stupid question but I am real newbie with regards to gpio). The other thing is that the SCMI spec says: 4.11.2.7 PINCTRL_SETTINGS_GET This command can be used by an agent to get the pin or group configuration, and the function selected to be enabled. It can also be used to read the value of a pin when it is set to GPIO mode. What does that mean? Is that right, or is it something left over from a previous revision of the spec. regards, dan carpenter diff --git a/drivers/firmware/arm_scmi/pinctrl.c b/drivers/firmware/arm_scmi/pinctrl.c index a2a7f880d6a3..f803be8a223f 100644 --- a/drivers/firmware/arm_scmi/pinctrl.c +++ b/drivers/firmware/arm_scmi/pinctrl.c @@ -26,6 +26,7 @@ #define GET_PINS_NR(x) le32_get_bits((x), GENMASK(15, 0)) #define GET_FUNCTIONS_NR(x) le32_get_bits((x), GENMASK(15, 0)) +#define IS_GPIO_FUNC(x) le32_get_bits((x), BIT(17)) #define EXT_NAME_FLAG(x) le32_get_bits((x), BIT(31)) #define NUM_ELEMS(x) le32_get_bits((x), GENMASK(15, 0)) @@ -107,6 +108,7 @@ struct scmi_group_info { struct scmi_function_info { char name[SCMI_MAX_STR_SIZE]; bool present; + bool gpio; u32 *groups; u32 nr_groups; }; @@ -189,7 +191,7 @@ static int scmi_pinctrl_validate_id(const struct scmi_protocol_handle *ph, static int scmi_pinctrl_attributes(const struct scmi_protocol_handle *ph, enum scmi_pinctrl_selector_type type, - u32 selector, char *name, + u32 selector, char *name, bool *gpio, u32 *n_elems) { int ret; @@ -216,17 +218,20 @@ static int scmi_pinctrl_attributes(const struct scmi_protocol_handle *ph, tx->flags = cpu_to_le32(type); ret = ph->xops->do_xfer(ph, t); - if (!ret) { - if (n_elems) - *n_elems = NUM_ELEMS(rx->attributes); + if (ret) + goto xfer_put; - strscpy(name, rx->name, SCMI_SHORT_NAME_MAX_SIZE); + if (n_elems) + *n_elems = NUM_ELEMS(rx->attributes); - ext_name_flag = !!EXT_NAME_FLAG(rx->attributes); - } + if (type == FUNCTION_TYPE && gpio) + *gpio = !!IS_GPIO_FUNC(rx->attributes); - ph->xops->xfer_put(ph, t); + strscpy(name, rx->name, SCMI_SHORT_NAME_MAX_SIZE); + ext_name_flag = !!EXT_NAME_FLAG(rx->attributes); +xfer_put: + ph->xops->xfer_put(ph, t); if (ret) return ret; /* @@ -602,7 +607,7 @@ static int scmi_pinctrl_get_group_info(const struct scmi_protocol_handle *ph, int ret; ret = scmi_pinctrl_attributes(ph, GROUP_TYPE, selector, group->name, - &group->nr_pins); + NULL, &group->nr_pins); if (ret) return ret; @@ -687,7 +692,7 @@ static int scmi_pinctrl_get_function_info(const struct scmi_protocol_handle *ph, int ret; ret = scmi_pinctrl_attributes(ph, FUNCTION_TYPE, selector, func->name, - &func->nr_groups); + &func->gpio, &func->nr_groups); if (ret) return ret; @@ -778,7 +783,8 @@ static int scmi_pinctrl_get_pin_info(const struct scmi_protocol_handle *ph, if (!pin) return -EINVAL; - ret = scmi_pinctrl_attributes(ph, PIN_TYPE, selector, pin->name, NULL); + ret = scmi_pinctrl_attributes(ph, PIN_TYPE, selector, pin->name, NULL, + NULL); if (ret) return ret;
Hi Dan, > Subject: Re: [PATCH v10 0/4] firmware: arm_scmi: Add SCMI v3.2 pincontrol > protocol basic support > > I'm trying to re-base AKASHI Takahiro's gpio driver on top of your scmi pinctrl > driver. > https://lore.ke/ > rnel.org%2Fall%2F20231005025843.508689-1- > takahiro.akashi%40linaro.org%2F&data=05%7C02%7Cpeng.fan%40nxp.com% > 7C342dd6eb0463456d0d6608dc5e41de1c%7C686ea1d3bc2b4c6fa92cd99c5 > c301635%7C0%7C0%7C638488884186606528%7CUnknown%7CTWFpbGZs > b3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn > 0%3D%7C0%7C%7C%7C&sdata=DMJZ2uwuJigkEnEcY7JdBw6DMPjHxcUvvh7 > 2fsaep50%3D&reserved=0 > I need to do something like this below to save the gpio information. > > So now, great, I have the information but I'm not sure how to export it from > the scmi pinctrl driver to the gpio driver... (This is a probably a stupid > question but I am real newbie with regards to gpio). > > The other thing is that the SCMI spec says: > > 4.11.2.7 > PINCTRL_SETTINGS_GET > > This command can be used by an agent to get the pin or group > configuration, and the function selected to be enabled. It can also > be used to read the value of a pin when it is set to GPIO mode. > > What does that mean? Is that right, or is it something left over from a > previous revision of the spec. > > regards, > dan carpenter > > diff --git a/drivers/firmware/arm_scmi/pinctrl.c > b/drivers/firmware/arm_scmi/pinctrl.c Just a short question, you will make this a standalone patch part of your gpio pinctrl patchset, right? Or you wanna include this change in my v11 patch? I hope v11 + imx oem patches could land in 6.10, so I would not expect big changes to v11. Thanks, Peng. > index a2a7f880d6a3..f803be8a223f 100644 > --- a/drivers/firmware/arm_scmi/pinctrl.c > +++ b/drivers/firmware/arm_scmi/pinctrl.c > @@ -26,6 +26,7 @@ > #define GET_PINS_NR(x) le32_get_bits((x), GENMASK(15, 0)) > #define GET_FUNCTIONS_NR(x) le32_get_bits((x), GENMASK(15, 0)) > > +#define IS_GPIO_FUNC(x) le32_get_bits((x), BIT(17)) > #define EXT_NAME_FLAG(x) le32_get_bits((x), BIT(31)) > #define NUM_ELEMS(x) le32_get_bits((x), GENMASK(15, 0)) > > @@ -107,6 +108,7 @@ struct scmi_group_info { struct scmi_function_info { > char name[SCMI_MAX_STR_SIZE]; > bool present; > + bool gpio; > u32 *groups; > u32 nr_groups; > }; > @@ -189,7 +191,7 @@ static int scmi_pinctrl_validate_id(const struct > scmi_protocol_handle *ph, > > static int scmi_pinctrl_attributes(const struct scmi_protocol_handle *ph, > enum scmi_pinctrl_selector_type type, > - u32 selector, char *name, > + u32 selector, char *name, bool *gpio, > u32 *n_elems) > { > int ret; > @@ -216,17 +218,20 @@ static int scmi_pinctrl_attributes(const struct > scmi_protocol_handle *ph, > tx->flags = cpu_to_le32(type); > > ret = ph->xops->do_xfer(ph, t); > - if (!ret) { > - if (n_elems) > - *n_elems = NUM_ELEMS(rx->attributes); > + if (ret) > + goto xfer_put; > > - strscpy(name, rx->name, SCMI_SHORT_NAME_MAX_SIZE); > + if (n_elems) > + *n_elems = NUM_ELEMS(rx->attributes); > > - ext_name_flag = !!EXT_NAME_FLAG(rx->attributes); > - } > + if (type == FUNCTION_TYPE && gpio) > + *gpio = !!IS_GPIO_FUNC(rx->attributes); > > - ph->xops->xfer_put(ph, t); > + strscpy(name, rx->name, SCMI_SHORT_NAME_MAX_SIZE); > + ext_name_flag = !!EXT_NAME_FLAG(rx->attributes); > > +xfer_put: > + ph->xops->xfer_put(ph, t); > if (ret) > return ret; > /* > @@ -602,7 +607,7 @@ static int scmi_pinctrl_get_group_info(const struct > scmi_protocol_handle *ph, > int ret; > > ret = scmi_pinctrl_attributes(ph, GROUP_TYPE, selector, group- > >name, > - &group->nr_pins); > + NULL, &group->nr_pins); > if (ret) > return ret; > > @@ -687,7 +692,7 @@ static int scmi_pinctrl_get_function_info(const struct > scmi_protocol_handle *ph, > int ret; > > ret = scmi_pinctrl_attributes(ph, FUNCTION_TYPE, selector, func- > >name, > - &func->nr_groups); > + &func->gpio, &func->nr_groups); > if (ret) > return ret; > > @@ -778,7 +783,8 @@ static int scmi_pinctrl_get_pin_info(const struct > scmi_protocol_handle *ph, > if (!pin) > return -EINVAL; > > - ret = scmi_pinctrl_attributes(ph, PIN_TYPE, selector, pin->name, > NULL); > + ret = scmi_pinctrl_attributes(ph, PIN_TYPE, selector, pin->name, > NULL, > + NULL); > if (ret) > return ret; >
On Wed, Apr 17, 2024 at 12:15:57PM +0000, Peng Fan wrote: > Hi Dan, > > Just a short question, you will make this a standalone > patch part of your gpio pinctrl patchset, right? > > Or you wanna include this change in my v11 patch? > > I hope v11 + imx oem patches could land in 6.10, I haven't looked at i.MX OEM patches even once so far. IIRC it is all in the pinctrl driver and you may not need my review/ack. But let us get this series in first. This series looks good overall. Since it has pinctrl driver, I need Linus to ack/agree to pick the whole series up or I can ack them so that Linus can take the whole series. Either way it is fine for me. Thanks for all your efforts in pursuing this. -- Regards, Sudeep