aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai2017-02-28 10:16:48 -0600
committerGreg Kroah-Hartman2017-03-11 23:37:25 -0600
commit70dbc00f7e112a3647233251777edc7129854746 (patch)
tree72eccb8d47e7b90958998db0817789e01475f8da /sound
parent9879f9d01a3c608f75596437f2c4ae4b218da9dd (diff)
downloadkernel-omap-70dbc00f7e112a3647233251777edc7129854746.tar.gz
kernel-omap-70dbc00f7e112a3647233251777edc7129854746.tar.xz
kernel-omap-70dbc00f7e112a3647233251777edc7129854746.zip
ALSA: ctxfi: Fallback DMA mask to 32bit
commit 15c75b09f8d190f89ab4db463b87d411ca349dfe upstream. Currently ctxfi driver tries to set only the 64bit DMA mask on 64bit architectures, and bails out if it fails. This causes a problem on some platforms since the 64bit DMA isn't always guaranteed. We should fall back to the default 32bit DMA when 64bit DMA fails. Fixes: 6d74b86d3c0f ("ALSA: ctxfi - Allow 64bit DMA") Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/ctxfi/cthw20k1.c19
-rw-r--r--sound/pci/ctxfi/cthw20k2.c19
2 files changed, 12 insertions, 26 deletions
diff --git a/sound/pci/ctxfi/cthw20k1.c b/sound/pci/ctxfi/cthw20k1.c
index 9667cbfb0ca2..ab4cdab5cfa5 100644
--- a/sound/pci/ctxfi/cthw20k1.c
+++ b/sound/pci/ctxfi/cthw20k1.c
@@ -27,12 +27,6 @@
27#include "cthw20k1.h" 27#include "cthw20k1.h"
28#include "ct20k1reg.h" 28#include "ct20k1reg.h"
29 29
30#if BITS_PER_LONG == 32
31#define CT_XFI_DMA_MASK DMA_BIT_MASK(32) /* 32 bit PTE */
32#else
33#define CT_XFI_DMA_MASK DMA_BIT_MASK(64) /* 64 bit PTE */
34#endif
35
36struct hw20k1 { 30struct hw20k1 {
37 struct hw hw; 31 struct hw hw;
38 spinlock_t reg_20k1_lock; 32 spinlock_t reg_20k1_lock;
@@ -1904,19 +1898,18 @@ static int hw_card_start(struct hw *hw)
1904{ 1898{
1905 int err; 1899 int err;
1906 struct pci_dev *pci = hw->pci; 1900 struct pci_dev *pci = hw->pci;
1901 const unsigned int dma_bits = BITS_PER_LONG;
1907 1902
1908 err = pci_enable_device(pci); 1903 err = pci_enable_device(pci);
1909 if (err < 0) 1904 if (err < 0)
1910 return err; 1905 return err;
1911 1906
1912 /* Set DMA transfer mask */ 1907 /* Set DMA transfer mask */
1913 if (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 || 1908 if (dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
1914 dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) { 1909 dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
1915 dev_err(hw->card->dev, 1910 } else {
1916 "architecture does not support PCI busmaster DMA with mask 0x%llx\n", 1911 dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
1917 CT_XFI_DMA_MASK); 1912 dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
1918 err = -ENXIO;
1919 goto error1;
1920 } 1913 }
1921 1914
1922 if (!hw->io_base) { 1915 if (!hw->io_base) {
diff --git a/sound/pci/ctxfi/cthw20k2.c b/sound/pci/ctxfi/cthw20k2.c
index 9dc2950e1ab7..d86678c2a957 100644
--- a/sound/pci/ctxfi/cthw20k2.c
+++ b/sound/pci/ctxfi/cthw20k2.c
@@ -26,12 +26,6 @@
26#include "cthw20k2.h" 26#include "cthw20k2.h"
27#include "ct20k2reg.h" 27#include "ct20k2reg.h"
28 28
29#if BITS_PER_LONG == 32
30#define CT_XFI_DMA_MASK DMA_BIT_MASK(32) /* 32 bit PTE */
31#else
32#define CT_XFI_DMA_MASK DMA_BIT_MASK(64) /* 64 bit PTE */
33#endif
34
35struct hw20k2 { 29struct hw20k2 {
36 struct hw hw; 30 struct hw hw;
37 /* for i2c */ 31 /* for i2c */
@@ -2029,19 +2023,18 @@ static int hw_card_start(struct hw *hw)
2029 int err = 0; 2023 int err = 0;
2030 struct pci_dev *pci = hw->pci; 2024 struct pci_dev *pci = hw->pci;
2031 unsigned int gctl; 2025 unsigned int gctl;
2026 const unsigned int dma_bits = BITS_PER_LONG;
2032 2027
2033 err = pci_enable_device(pci); 2028 err = pci_enable_device(pci);
2034 if (err < 0) 2029 if (err < 0)
2035 return err; 2030 return err;
2036 2031
2037 /* Set DMA transfer mask */ 2032 /* Set DMA transfer mask */
2038 if (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 || 2033 if (!dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
2039 dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) { 2034 dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
2040 dev_err(hw->card->dev, 2035 } else {
2041 "architecture does not support PCI busmaster DMA with mask 0x%llx\n", 2036 dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
2042 CT_XFI_DMA_MASK); 2037 dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
2043 err = -ENXIO;
2044 goto error1;
2045 } 2038 }
2046 2039
2047 if (!hw->io_base) { 2040 if (!hw->io_base) {