Dne četrtek, 28. april 2022 ob 03:03:57 CEST je Samuel Holland napisal(a): > The IOMMU in the Allwinner D1 SoC does not have an external reset line. > > Only attempt to get the reset on hardware variants which should have one > according to the binding. And switch from the deprecated function to the > explicit "exclusive" variant. > > Signed-off-by: Samuel Holland <samuel@xxxxxxxxxxxx> Reviewed-by: Jernej Skrabec <jernej.skrabec@xxxxxxxxx> Best regards, Jernej > --- > > drivers/iommu/sun50i-iommu.c | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/drivers/iommu/sun50i-iommu.c b/drivers/iommu/sun50i-iommu.c > index c54ab477b8fd..ec07b60016d3 100644 > --- a/drivers/iommu/sun50i-iommu.c > +++ b/drivers/iommu/sun50i-iommu.c > @@ -92,6 +92,10 @@ > #define NUM_PT_ENTRIES 256 > #define PT_SIZE (NUM_PT_ENTRIES * PT_ENTRY_SIZE) > > +struct sun50i_iommu_variant { > + bool has_reset; > +}; > + > struct sun50i_iommu { > struct iommu_device iommu; > > @@ -905,9 +909,14 @@ static irqreturn_t sun50i_iommu_irq(int irq, void > *dev_id) > > static int sun50i_iommu_probe(struct platform_device *pdev) > { > + const struct sun50i_iommu_variant *variant; > struct sun50i_iommu *iommu; > int ret, irq; > > + variant = of_device_get_match_data(&pdev->dev); > + if (!variant) > + return -EINVAL; > + > iommu = devm_kzalloc(&pdev->dev, sizeof(*iommu), GFP_KERNEL); > if (!iommu) > return -ENOMEM; > @@ -947,7 +956,8 @@ static int sun50i_iommu_probe(struct platform_device > *pdev) goto err_free_group; > } > > - iommu->reset = devm_reset_control_get(&pdev->dev, NULL); > + if (variant->has_reset) > + iommu->reset = devm_reset_control_get_exclusive(&pdev- >dev, NULL); > if (IS_ERR(iommu->reset)) { > dev_err(&pdev->dev, "Couldn't get our reset line.\n"); > ret = PTR_ERR(iommu->reset); > @@ -987,8 +997,12 @@ static int sun50i_iommu_probe(struct platform_device > *pdev) return ret; > } > > +static const struct sun50i_iommu_variant sun50i_h6_iommu = { > + .has_reset = true, > +}; > + > static const struct of_device_id sun50i_iommu_dt[] = { > - { .compatible = "allwinner,sun50i-h6-iommu", }, > + { .compatible = "allwinner,sun50i-h6-iommu", .data = &sun50i_h6_iommu }, > { /* sentinel */ }, > }; > MODULE_DEVICE_TABLE(of, sun50i_iommu_dt);