Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dmaengine: apple-admac: Trigger shared reset

If a reset domain is attached to the device, obtain a shared reference
to it and trigger it. Typically on a chip the ADMAC controller will
share a reset domain with the MCA peripheral.

Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
Link: https://lore.kernel.org/r/20220918095845.68860-5-povik+lin@cutebit.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Martin Povišer and committed by
Vinod Koul
6aed75d7 07243159

+19 -3
+19 -3
drivers/dma/apple-admac.c
··· 12 12 #include <linux/module.h> 13 13 #include <linux/of_device.h> 14 14 #include <linux/of_dma.h> 15 - #include <linux/interrupt.h> 15 + #include <linux/reset.h> 16 16 #include <linux/spinlock.h> 17 + #include <linux/interrupt.h> 17 18 18 19 #include "dmaengine.h" 19 20 ··· 96 95 struct dma_device dma; 97 96 struct device *dev; 98 97 __iomem void *base; 98 + struct reset_control *rstc; 99 99 100 100 int irq; 101 101 int irq_index; ··· 734 732 return dev_err_probe(&pdev->dev, PTR_ERR(ad->base), 735 733 "unable to obtain MMIO resource\n"); 736 734 735 + ad->rstc = devm_reset_control_get_optional_shared(&pdev->dev, NULL); 736 + if (IS_ERR(ad->rstc)) 737 + return PTR_ERR(ad->rstc); 738 + 737 739 dma = &ad->dma; 738 740 739 741 dma_cap_set(DMA_PRIVATE, dma->cap_mask); ··· 776 770 tasklet_setup(&adchan->tasklet, admac_chan_tasklet); 777 771 } 778 772 779 - err = request_irq(irq, admac_interrupt, 0, dev_name(&pdev->dev), ad); 773 + err = reset_control_reset(ad->rstc); 780 774 if (err) 781 775 return dev_err_probe(&pdev->dev, err, 782 - "unable to register interrupt\n"); 776 + "unable to trigger reset\n"); 777 + 778 + err = request_irq(irq, admac_interrupt, 0, dev_name(&pdev->dev), ad); 779 + if (err) { 780 + dev_err_probe(&pdev->dev, err, 781 + "unable to register interrupt\n"); 782 + goto free_reset; 783 + } 783 784 784 785 err = dma_async_device_register(&ad->dma); 785 786 if (err) { ··· 805 792 806 793 free_irq: 807 794 free_irq(ad->irq, ad); 795 + free_reset: 796 + reset_control_rearm(ad->rstc); 808 797 return err; 809 798 } 810 799 ··· 817 802 of_dma_controller_free(pdev->dev.of_node); 818 803 dma_async_device_unregister(&ad->dma); 819 804 free_irq(ad->irq, ad); 805 + reset_control_rearm(ad->rstc); 820 806 821 807 return 0; 822 808 }