On 7/21/2023 1:44 PM, Johan Hovold wrote: > On Mon, Jul 03, 2023 at 12:29:41AM +0530, Krishna Kurapati PSSNV wrote: >> On 6/27/2023 8:01 PM, Johan Hovold wrote: >>> On Wed, Jun 21, 2023 at 10:06:24AM +0530, Krishna Kurapati wrote: > >>>> +static int dwc3_qcom_setup_mp_irq(struct platform_device *pdev) >>>> +{ >>>> + struct dwc3_qcom *qcom = platform_get_drvdata(pdev); >>>> + char irq_name[15]; >>>> + int irq; >>>> + int ret; >>>> + int i; >>>> + >>>> + for (i = 0; i < 4; i++) { >>> >>> DWC3_MAX_PORTS here too and similar below. >>> >>>> + if (qcom->dp_hs_phy_irq[i]) >>>> + continue; >>> >>> This is not very nice. You should try to integrate the current lookup >>> code as I told you to do with the PHY lookups. That is, use a single >>> loop for all HS/SS IRQs, and pick the legacy name if the number of ports >>> is 1. >>> >>> Of course, you added the xhci capability parsing to the core driver so >>> that information is not yet available, but you need it in the glue >>> driver also... >>> >>> As I mentioned earlier, you can infer the number of ports from the >>> interrupt names. Alternatively, you can infer it from the compatible >>> string. In any case, you should not need to ways to determine the same >>> information in the glue driver, then in the core part, and then yet >>> again in the xhci driver... > >> The reason why I didn't integrate this with the original function was >> the ACPI stuff. The MP devices have no ACPI variant. And I think for >> clarity sake its best to keep these two functions separated. > > No. The ACPI stuff may make this a little harder to implement, but > that's not a sufficient reason to not try to refactor things properly. > >>>> + >>>> + sprintf(irq_name, "dp%d_hs_phy_irq", i+1); >>> >>> Spaces around binary operators. Does not checkpatch warn about that? >>> >>>> + irq = dwc3_qcom_get_irq(pdev, irq_name, -1); >>>> + if (irq > 0) { >>>> + irq_set_status_flags(irq, IRQ_NOAUTOEN); >>>> + ret = devm_request_threaded_irq(qcom->dev, irq, NULL, >>>> + qcom_dwc3_resume_irq, >>>> + IRQF_TRIGGER_HIGH | IRQF_ONESHOT, >>>> + irq_name, qcom); >>>> + if (ret) { >>>> + dev_err(qcom->dev, "%s failed: %d\n", irq_name, ret); >>>> + return ret; >>>> + } >>>> + } >>>> + >>>> + qcom->dp_hs_phy_irq[i] = irq; >>>> + } >>>> + >>>> + for (i = 0; i < 4; i++) { >>>> + if (qcom->dm_hs_phy_irq[i]) >>>> + continue; >>>> + >>>> + sprintf(irq_name, "dm%d_hs_phy_irq", i+1); >>>> + irq = dwc3_qcom_get_irq(pdev, irq_name, -1); >>>> + if (irq > 0) { >>>> + irq_set_status_flags(irq, IRQ_NOAUTOEN); >>>> + ret = devm_request_threaded_irq(qcom->dev, irq, NULL, >>>> + qcom_dwc3_resume_irq, >>>> + IRQF_TRIGGER_HIGH | IRQF_ONESHOT, >>>> + irq_name, qcom); >>>> + if (ret) { >>>> + dev_err(qcom->dev, "%s failed: %d\n", irq_name, ret); >>>> + return ret; >>>> + } >>>> + } >>>> + >>>> + qcom->dm_hs_phy_irq[i] = irq; >>>> + } >>>> + >>>> + for (i = 0; i < 2; i++) { >>>> + if (qcom->ss_phy_irq[i]) >>>> + continue; >>>> + >>>> + sprintf(irq_name, "ss%d_phy_irq", i+1); >>>> + irq = dwc3_qcom_get_irq(pdev, irq_name, -1); >>>> + if (irq > 0) { >>>> + irq_set_status_flags(irq, IRQ_NOAUTOEN); >>>> + ret = devm_request_threaded_irq(qcom->dev, irq, NULL, >>>> + qcom_dwc3_resume_irq, >>>> + IRQF_TRIGGER_HIGH | IRQF_ONESHOT, >>>> + irq_name, qcom); >>>> + if (ret) { >>>> + dev_err(qcom->dev, "%s failed: %d\n", irq_name, ret); >>>> + return ret; >>>> + } >>>> + } >>>> + >>>> + qcom->ss_phy_irq[i] = irq; >>>> + } >>> >>> So the above should all be merged in either a single helper looking up >>> all the interrupts for a port and resused for the non-MP case. >>> >> I agree, Will merge all under some common helper function. > > Good. > > Johan Hi Johan, How about the implementation in the attached patches. This way we don't need to know if we are multiport capable or not. Regards, Krishna,