Pārlūkot izejas kodu

dma: tegra: fix interrupt name issue with apb dma.

When watching the interrupts through /proc/interrupts,
the name of the interrupts are blank or garbage. The
reason is the pointer passed for devname during irq
registration is stack and so it get changed after
dma registration completes.
Allocate the pointer as part of dma channel and pass
this pointer as the devname for irq registration to
avoid change of name.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reported-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
Laxman Dewangan 12 gadi atpakaļ
vecāks
revīzija
d0fc905429
1 mainītis faili ar 3 papildinājumiem un 3 dzēšanām
  1. 3 3
      drivers/dma/tegra20-apb-dma.c

+ 3 - 3
drivers/dma/tegra20-apb-dma.c

@@ -169,6 +169,7 @@ typedef void (*dma_isr_handler)(struct tegra_dma_channel *tdc,
 /* tegra_dma_channel: Channel specific information */
 /* tegra_dma_channel: Channel specific information */
 struct tegra_dma_channel {
 struct tegra_dma_channel {
 	struct dma_chan		dma_chan;
 	struct dma_chan		dma_chan;
+	char			name[30];
 	bool			config_init;
 	bool			config_init;
 	int			id;
 	int			id;
 	int			irq;
 	int			irq;
@@ -1282,7 +1283,6 @@ static int __devinit tegra_dma_probe(struct platform_device *pdev)
 	INIT_LIST_HEAD(&tdma->dma_dev.channels);
 	INIT_LIST_HEAD(&tdma->dma_dev.channels);
 	for (i = 0; i < cdata->nr_channels; i++) {
 	for (i = 0; i < cdata->nr_channels; i++) {
 		struct tegra_dma_channel *tdc = &tdma->channels[i];
 		struct tegra_dma_channel *tdc = &tdma->channels[i];
-		char irq_name[30];
 
 
 		tdc->chan_base_offset = TEGRA_APBDMA_CHANNEL_BASE_ADD_OFFSET +
 		tdc->chan_base_offset = TEGRA_APBDMA_CHANNEL_BASE_ADD_OFFSET +
 					i * TEGRA_APBDMA_CHANNEL_REGISTER_SIZE;
 					i * TEGRA_APBDMA_CHANNEL_REGISTER_SIZE;
@@ -1294,9 +1294,9 @@ static int __devinit tegra_dma_probe(struct platform_device *pdev)
 			goto err_irq;
 			goto err_irq;
 		}
 		}
 		tdc->irq = res->start;
 		tdc->irq = res->start;
-		snprintf(irq_name, sizeof(irq_name), "apbdma.%d", i);
+		snprintf(tdc->name, sizeof(tdc->name), "apbdma.%d", i);
 		ret = devm_request_irq(&pdev->dev, tdc->irq,
 		ret = devm_request_irq(&pdev->dev, tdc->irq,
-				tegra_dma_isr, 0, irq_name, tdc);
+				tegra_dma_isr, 0, tdc->name, tdc);
 		if (ret) {
 		if (ret) {
 			dev_err(&pdev->dev,
 			dev_err(&pdev->dev,
 				"request_irq failed with err %d channel %d\n",
 				"request_irq failed with err %d channel %d\n",