aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2007-02-22 10:07:21 -0500
committerJaroslav Kysela <perex@suse.cz>2007-05-11 10:55:43 -0400
commit8f7ba051d2abb3d3bde9b95e47246c60b704d2b4 (patch)
tree6b1fcd728b520ca24c99672c873ed17b43ac3b9f
parent76e630677419ecf2cf8c0b738536eee34dc048e6 (diff)
[ALSA] mpu401 - Add MPU401_INFO_UART_ONLY bitflag
Added MPU401_INFO_UART_ONLY bitflag to avoid issueing UART_ENTER command at opening streams. Some devices support only UART mode and give errors to UART_ENTER. A new module option, uart_enter, is added to snd-mpu401 driver. For UART-only devices, set uart_enter=0. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r--Documentation/sound/alsa/ALSA-Configuration.txt1
-rw-r--r--include/sound/mpu401.h1
-rw-r--r--sound/drivers/mpu401/mpu401.c12
-rw-r--r--sound/drivers/mpu401/mpu401_uart.c18
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
43static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* MPU-401 port number */ 43static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* MPU-401 port number */
44static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* MPU-401 IRQ */ 44static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* MPU-401 IRQ */
45static int uart_enter[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
45 46
46module_param_array(index, int, NULL, 0444); 47module_param_array(index, int, NULL, 0444);
47MODULE_PARM_DESC(index, "Index value for MPU-401 device."); 48MODULE_PARM_DESC(index, "Index value for MPU-401 device.");
@@ -57,6 +58,8 @@ module_param_array(port, long, NULL, 0444);
57MODULE_PARM_DESC(port, "Port # for MPU-401 device."); 58MODULE_PARM_DESC(port, "Port # for MPU-401 device.");
58module_param_array(irq, int, NULL, 0444); 59module_param_array(irq, int, NULL, 0444);
59MODULE_PARM_DESC(irq, "IRQ # for MPU-401 device."); 60MODULE_PARM_DESC(irq, "IRQ # for MPU-401 device.");
61module_param_array(uart_enter, bool, NULL, 0444);
62MODULE_PARM_DESC(uart_enter, "Issue UART_ENTER command at open.");
60 63
61static struct platform_device *platform_devices[SNDRV_CARDS]; 64static struct platform_device *platform_devices[SNDRV_CARDS];
62static int pnp_registered; 65static 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
269static 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;