Re: [PATCH v10 4/5] iommu/arm-smmu: Add the device_link between masters and smmu
Hi Vivek, On Wed, Mar 14, 2018 at 5:14 PM, Vivek Gautamwrote: > From: Sricharan R > > Finally add the device link between the master device and > smmu, so that the smmu gets runtime enabled/disabled only when the > master needs it. This is done from add_device callback which gets > called once when the master is added to the smmu. > > Signed-off-by: Sricharan R > Signed-off-by: Vivek Gautam > Reviewed-by: Tomasz Figa > --- > > Changes since v9: > - Using device_link_del_dev() to delete the device link, instead of >doing it in two steps - device_link_find() to first find the link, and >then calling device_link_del(). > > drivers/iommu/arm-smmu.c | 24 > 1 file changed, 24 insertions(+) > > diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c > index 56a04ae80bf3..4cf270ffd449 100644 > --- a/drivers/iommu/arm-smmu.c > +++ b/drivers/iommu/arm-smmu.c > @@ -1460,10 +1460,31 @@ static int arm_smmu_add_device(struct device *dev) > > iommu_device_link(>iommu, dev); > > + if (pm_runtime_enabled(smmu->dev)) { > + struct device_link *link; > + > + /* > +* Establish the link between smmu and master, so that the > +* smmu gets runtime enabled/disabled as per the master's > +* needs. > +*/ > + link = device_link_add(dev, smmu->dev, DL_FLAG_PM_RUNTIME); > + if (!link) { > + dev_warn(smmu->dev, > +"Unable to add link to the consumer %s\n", > +dev_name(dev)); > + ret = -ENODEV; > + goto out_unlink; > + } > + } If it's an error, we should use dev_err(). Also, as per Robin's comment for v9 could we make it as follows? if (pm_runtime_enabled(smmu->dev) && !device_link_add(dev, smmu->dev, DL_FLAG_PM_RUNTIME)) { dev_err(smmu->dev, "Unable to add link to the consumer %s\n", dev_name(dev)); ret = -ENODEV; goto out_unlink; } Best regards, Tomasz ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
[PATCH v10 4/5] iommu/arm-smmu: Add the device_link between masters and smmu
From: Sricharan RFinally add the device link between the master device and smmu, so that the smmu gets runtime enabled/disabled only when the master needs it. This is done from add_device callback which gets called once when the master is added to the smmu. Signed-off-by: Sricharan R Signed-off-by: Vivek Gautam Reviewed-by: Tomasz Figa --- Changes since v9: - Using device_link_del_dev() to delete the device link, instead of doing it in two steps - device_link_find() to first find the link, and then calling device_link_del(). drivers/iommu/arm-smmu.c | 24 1 file changed, 24 insertions(+) diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 56a04ae80bf3..4cf270ffd449 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -1460,10 +1460,31 @@ static int arm_smmu_add_device(struct device *dev) iommu_device_link(>iommu, dev); + if (pm_runtime_enabled(smmu->dev)) { + struct device_link *link; + + /* +* Establish the link between smmu and master, so that the +* smmu gets runtime enabled/disabled as per the master's +* needs. +*/ + link = device_link_add(dev, smmu->dev, DL_FLAG_PM_RUNTIME); + if (!link) { + dev_warn(smmu->dev, +"Unable to add link to the consumer %s\n", +dev_name(dev)); + ret = -ENODEV; + goto out_unlink; + } + } + arm_smmu_rpm_put(smmu); return 0; +out_unlink: + iommu_device_unlink(>iommu, dev); + arm_smmu_master_free_smes(fwspec); out_rpm_put: arm_smmu_rpm_put(smmu); out_cfg_free: @@ -1486,6 +1507,9 @@ static void arm_smmu_remove_device(struct device *dev) cfg = fwspec->iommu_priv; smmu = cfg->smmu; + if (pm_runtime_enabled(smmu->dev)) + device_link_del_dev(dev, smmu->dev); + ret = arm_smmu_rpm_get(smmu); if (ret < 0) return; -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu