Message ID | 20220519124235.21100-1-tangbin@cmss.chinamobile.com |
---|---|
State | New |
Headers | show |
Series | ASoC: stm32: sai: Use of_device_get_match_data() to simplify code | expand |
Hello Tang, Thanks for the patch. Unfortunately this patch introduces a regression. In the SAI driver of_device_id struct the data is a simple enum cast to void* pointer. static const struct of_device_id stm32_sai_sub_ids[] = { .data = (void *)STM_SAI_A_ID}, This data is an ID which can be set to 0x0. Here we have no way to know to discriminate between an error returned by of_device_get_match_data() or a data id set to 0x0. The current patch requires a change in the driver. Either changing STM_SAI_x_ID enums, or replacing data by a struct. For instance: struct stm32_sai_comp_data { unsigned int id; } struct stm32_sai_comp_data stm32_sai_comp_data_a = { .id = STM_SAI_A_ID; } struct of_device_id stm32_sai_sub_ids[] = { .data = &stm32_sai_comp_data_a}, } Regards Olivier On 5/19/22 14:42, Tang Bin wrote: > Retrieve of match data, it's better and cleaner to use > 'of_device_get_match_data' over 'of_match_device'. > > Signed-off-by: Tang Bin <tangbin@cmss.chinamobile.com> > --- > sound/soc/stm/stm32_sai_sub.c | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c > index dd636af81..d300605a2 100644 > --- a/sound/soc/stm/stm32_sai_sub.c > +++ b/sound/soc/stm/stm32_sai_sub.c > @@ -1500,7 +1500,6 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev, > static int stm32_sai_sub_probe(struct platform_device *pdev) > { > struct stm32_sai_sub_data *sai; > - const struct of_device_id *of_id; > const struct snd_dmaengine_pcm_config *conf = &stm32_sai_pcm_config; > int ret; > > @@ -1508,10 +1507,9 @@ static int stm32_sai_sub_probe(struct platform_device *pdev) > if (!sai) > return -ENOMEM; > > - of_id = of_match_device(stm32_sai_sub_ids, &pdev->dev); > - if (!of_id) > + sai->id = (uintptr_t)of_device_get_match_data(&pdev->dev); > + if (!sai->id) > return -EINVAL; > - sai->id = (uintptr_t)of_id->data; > > sai->pdev = pdev; > mutex_init(&sai->ctrl_lock);
On Mon, May 23, 2022 at 03:28:48PM +0200, Olivier MOYSAN wrote: > The current patch requires a change in the driver. > Either changing STM_SAI_x_ID enums, or replacing data by a struct. > For instance: > struct stm32_sai_comp_data { > unsigned int id; > } > struct stm32_sai_comp_data stm32_sai_comp_data_a = { > .id = STM_SAI_A_ID; > } > struct of_device_id stm32_sai_sub_ids[] = { > .data = &stm32_sai_comp_data_a}, > } Either approach works for me (or a revert for that matter).
Hi Mark & Olivier: On 2022/5/24 2:57, Mark Brown wrote: > On Mon, May 23, 2022 at 03:28:48PM +0200, Olivier MOYSAN wrote: > >> The current patch requires a change in the driver. >> Either changing STM_SAI_x_ID enums, or replacing data by a struct. >> For instance: >> struct stm32_sai_comp_data { >> unsigned int id; >> } >> struct stm32_sai_comp_data stm32_sai_comp_data_a = { >> .id = STM_SAI_A_ID; >> } >> struct of_device_id stm32_sai_sub_ids[] = { >> .data = &stm32_sai_comp_data_a}, >> } > Either approach works for me (or a revert for that matter). Thanks for your advice, I was thoughtless. I think change the date of STM_SAI_x_ID maybe simple. But if we don't change the id, what about add a "#define" like the line 47: #define STM_SAI_IS_SUB(x) ((x)->id == STM_SAI_A_ID || (x)->id == STM_SAI_B_ID) then in the judgement, wu use: sai->id = (uintptr_t)of_device_get_match_data(&pdev->dev); if (!STM_SAI_IS_SUB(sai)) return -EINVAL; if you think that's ok, I will send patch v2 for you . Thanks Tang Bin
Hi Tang, On 5/24/22 03:44, tangbin wrote: > Hi Mark & Olivier: > > On 2022/5/24 2:57, Mark Brown wrote: >> On Mon, May 23, 2022 at 03:28:48PM +0200, Olivier MOYSAN wrote: >> >>> The current patch requires a change in the driver. >>> Either changing STM_SAI_x_ID enums, or replacing data by a struct. >>> For instance: >>> struct stm32_sai_comp_data { >>> unsigned int id; >>> } >>> struct stm32_sai_comp_data stm32_sai_comp_data_a = { >>> .id = STM_SAI_A_ID; >>> } >>> struct of_device_id stm32_sai_sub_ids[] = { >>> .data = &stm32_sai_comp_data_a}, >>> } >> Either approach works for me (or a revert for that matter). > > Thanks for your advice, I was thoughtless. > > I think change the date of STM_SAI_x_ID maybe simple. But if we > don't change the id, > > what about add a "#define" like the line 47: > > #define STM_SAI_IS_SUB(x) ((x)->id == STM_SAI_A_ID || (x)->id == > STM_SAI_B_ID) > > then in the judgement, wu use: > > sai->id = (uintptr_t)of_device_get_match_data(&pdev->dev); > > if (!STM_SAI_IS_SUB(sai)) > > return -EINVAL; > > > if you think that's ok, I will send patch v2 for you . > If we allow null value in STM_SAI_IS_SUB(sai) check, we can miss real NULL pointer error from of_device_get_match_data(). The simplest way is to change STM_SAI_x_ID enums I think. But honnestly, I feel more comfortable to let the driver unchanged. BRs Olivier > Thanks > > Tang Bin > >
diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c index dd636af81..d300605a2 100644 --- a/sound/soc/stm/stm32_sai_sub.c +++ b/sound/soc/stm/stm32_sai_sub.c @@ -1500,7 +1500,6 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev, static int stm32_sai_sub_probe(struct platform_device *pdev) { struct stm32_sai_sub_data *sai; - const struct of_device_id *of_id; const struct snd_dmaengine_pcm_config *conf = &stm32_sai_pcm_config; int ret; @@ -1508,10 +1507,9 @@ static int stm32_sai_sub_probe(struct platform_device *pdev) if (!sai) return -ENOMEM; - of_id = of_match_device(stm32_sai_sub_ids, &pdev->dev); - if (!of_id) + sai->id = (uintptr_t)of_device_get_match_data(&pdev->dev); + if (!sai->id) return -EINVAL; - sai->id = (uintptr_t)of_id->data; sai->pdev = pdev; mutex_init(&sai->ctrl_lock);
Retrieve of match data, it's better and cleaner to use 'of_device_get_match_data' over 'of_match_device'. Signed-off-by: Tang Bin <tangbin@cmss.chinamobile.com> --- sound/soc/stm/stm32_sai_sub.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)