diff options
-rw-r--r-- | Documentation/sound/alsa/ALSA-Configuration.txt | 1 | ||||
-rw-r--r-- | include/sound/mpu401.h | 1 | ||||
-rw-r--r-- | sound/drivers/mpu401/mpu401.c | 12 | ||||
-rw-r--r-- | sound/drivers/mpu401/mpu401_uart.c | 18 |
4 files changed, 22 insertions, 10 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 73e9a174b642..24ea129969ae 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -1278,6 +1278,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
1278 | port - port number or -1 (disable) | 1278 | port - port number or -1 (disable) |
1279 | irq - IRQ number or -1 (disable) | 1279 | irq - IRQ number or -1 (disable) |
1280 | pnp - PnP detection - 0 = disable, 1 = enable (default) | 1280 | pnp - PnP detection - 0 = disable, 1 = enable (default) |
1281 | uart_enter - Issue UART_ENTER command at open - bool, default = on | ||
1281 | 1282 | ||
1282 | This module supports multiple devices and PnP. | 1283 | This module supports multiple devices and PnP. |
1283 | 1284 | ||
diff --git a/include/sound/mpu401.h b/include/sound/mpu401.h index 8c88267e9bea..d5c1396c4c9e 100644 --- a/include/sound/mpu401.h +++ b/include/sound/mpu401.h | |||
@@ -50,6 +50,7 @@ | |||
50 | #define MPU401_INFO_INTEGRATED (1 << 2) /* integrated h/w port */ | 50 | #define MPU401_INFO_INTEGRATED (1 << 2) /* integrated h/w port */ |
51 | #define MPU401_INFO_MMIO (1 << 3) /* MMIO access */ | 51 | #define MPU401_INFO_MMIO (1 << 3) /* MMIO access */ |
52 | #define MPU401_INFO_TX_IRQ (1 << 4) /* independent TX irq */ | 52 | #define MPU401_INFO_TX_IRQ (1 << 4) /* independent TX irq */ |
53 | #define MPU401_INFO_UART_ONLY (1 << 5) /* No ENTER_UART cmd needed */ | ||
53 | 54 | ||
54 | #define MPU401_MODE_BIT_INPUT 0 | 55 | #define MPU401_MODE_BIT_INPUT 0 |
55 | #define MPU401_MODE_BIT_OUTPUT 1 | 56 | #define MPU401_MODE_BIT_OUTPUT 1 |
diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c index 2de181ad0b05..1d563e515c17 100644 --- a/sound/drivers/mpu401/mpu401.c +++ b/sound/drivers/mpu401/mpu401.c | |||
@@ -42,6 +42,7 @@ static int pnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; | |||
42 | #endif | 42 | #endif |
43 | static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* MPU-401 port number */ | 43 | static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* MPU-401 port number */ |
44 | static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* MPU-401 IRQ */ | 44 | static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* MPU-401 IRQ */ |
45 | static int uart_enter[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; | ||
45 | 46 | ||
46 | module_param_array(index, int, NULL, 0444); | 47 | module_param_array(index, int, NULL, 0444); |
47 | MODULE_PARM_DESC(index, "Index value for MPU-401 device."); | 48 | MODULE_PARM_DESC(index, "Index value for MPU-401 device."); |
@@ -57,6 +58,8 @@ module_param_array(port, long, NULL, 0444); | |||
57 | MODULE_PARM_DESC(port, "Port # for MPU-401 device."); | 58 | MODULE_PARM_DESC(port, "Port # for MPU-401 device."); |
58 | module_param_array(irq, int, NULL, 0444); | 59 | module_param_array(irq, int, NULL, 0444); |
59 | MODULE_PARM_DESC(irq, "IRQ # for MPU-401 device."); | 60 | MODULE_PARM_DESC(irq, "IRQ # for MPU-401 device."); |
61 | module_param_array(uart_enter, bool, NULL, 0444); | ||
62 | MODULE_PARM_DESC(uart_enter, "Issue UART_ENTER command at open."); | ||
60 | 63 | ||
61 | static struct platform_device *platform_devices[SNDRV_CARDS]; | 64 | static struct platform_device *platform_devices[SNDRV_CARDS]; |
62 | static int pnp_registered; | 65 | static int pnp_registered; |
@@ -80,10 +83,11 @@ static int snd_mpu401_create(int dev, struct snd_card **rcard) | |||
80 | strcat(card->longname, "polled"); | 83 | strcat(card->longname, "polled"); |
81 | } | 84 | } |
82 | 85 | ||
83 | if ((err = snd_mpu401_uart_new(card, 0, | 86 | err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, port[dev], |
84 | MPU401_HW_MPU401, | 87 | uart_enter[dev] ? 0 : MPU401_INFO_UART_ONLY, |
85 | port[dev], 0, | 88 | irq[dev], irq[dev] >= 0 ? IRQF_DISABLED : 0, |
86 | irq[dev], irq[dev] >= 0 ? IRQF_DISABLED : 0, NULL)) < 0) { | 89 | NULL); |
90 | if (err < 0) { | ||
87 | printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]); | 91 | printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]); |
88 | goto _err; | 92 | goto _err; |
89 | } | 93 | } |
diff --git a/sound/drivers/mpu401/mpu401_uart.c b/sound/drivers/mpu401/mpu401_uart.c index 3daa9fa56c0b..85aedc348e2d 100644 --- a/sound/drivers/mpu401/mpu401_uart.c +++ b/sound/drivers/mpu401/mpu401_uart.c | |||
@@ -266,6 +266,16 @@ static int snd_mpu401_uart_cmd(struct snd_mpu401 * mpu, unsigned char cmd, | |||
266 | return 0; | 266 | return 0; |
267 | } | 267 | } |
268 | 268 | ||
269 | static int snd_mpu401_do_reset(struct snd_mpu401 *mpu) | ||
270 | { | ||
271 | if (snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1)) | ||
272 | return -EIO; | ||
273 | if (!(mpu->info_flags & MPU401_INFO_UART_ONLY) && | ||
274 | snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1)) | ||
275 | return -EIO; | ||
276 | return 0; | ||
277 | } | ||
278 | |||
269 | /* | 279 | /* |
270 | * input/output open/close - protected by open_mutex in rawmidi.c | 280 | * input/output open/close - protected by open_mutex in rawmidi.c |
271 | */ | 281 | */ |
@@ -278,9 +288,7 @@ static int snd_mpu401_uart_input_open(struct snd_rawmidi_substream *substream) | |||
278 | if (mpu->open_input && (err = mpu->open_input(mpu)) < 0) | 288 | if (mpu->open_input && (err = mpu->open_input(mpu)) < 0) |
279 | return err; | 289 | return err; |
280 | if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) { | 290 | if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) { |
281 | if (snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1)) | 291 | if (snd_mpu401_do_reset(mpu) < 0) |
282 | goto error_out; | ||
283 | if (snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1)) | ||
284 | goto error_out; | 292 | goto error_out; |
285 | } | 293 | } |
286 | mpu->substream_input = substream; | 294 | mpu->substream_input = substream; |
@@ -302,9 +310,7 @@ static int snd_mpu401_uart_output_open(struct snd_rawmidi_substream *substream) | |||
302 | if (mpu->open_output && (err = mpu->open_output(mpu)) < 0) | 310 | if (mpu->open_output && (err = mpu->open_output(mpu)) < 0) |
303 | return err; | 311 | return err; |
304 | if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) { | 312 | if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) { |
305 | if (snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1)) | 313 | if (snd_mpu401_do_reset(mpu) < 0) |
306 | goto error_out; | ||
307 | if (snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1)) | ||
308 | goto error_out; | 314 | goto error_out; |
309 | } | 315 | } |
310 | mpu->substream_output = substream; | 316 | mpu->substream_output = substream; |