[alsa-devel] [RFC] ymfpci - re-enable legacy audio after suspend resume
Since the Legacy Audio Control register is reset to default after suspend resume cycle
need to enable the Legacy Audio Control Bit in order to use OPL3 FM Synth
however it is still need to use sbiload instrument loader to reload the instruments
At Thu, 8 Mar 2012 12:12:33 +0800, Raymond Yau wrote:
Since the Legacy Audio Control register is reset to default after suspend resume cycle
need to enable the Legacy Audio Control Bit in order to use OPL3 FM Synth
however it is still need to use sbiload instrument loader to reload the instruments
Isn't it better to save and restore these PCI registers like below? It still doesn't solve the lost instrument problem, though.
Takashi
--- diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h index 444cd6b..1e35b16 100644 --- a/include/sound/ymfpci.h +++ b/include/sound/ymfpci.h @@ -366,6 +366,8 @@ struct snd_ymfpci { #ifdef CONFIG_PM u32 *saved_regs; u32 saved_ydsxgr_mode; + u16 saved_saved_dsxg_legacy; + u16 saved_saved_dsxg_elegacy; #endif };
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 12a9a2b..a8159b81 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c @@ -2317,6 +2317,10 @@ int snd_ymfpci_suspend(struct pci_dev *pci, pm_message_t state) for (i = 0; i < YDSXGR_NUM_SAVED_REGS; i++) chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]); chip->saved_ydsxgr_mode = snd_ymfpci_readl(chip, YDSXGR_MODE); + pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY, + &chip->saved_dsxg_legacy); + pci_read_config_word(chip->pci, PCIR_DSXG_ELEGACY, + &chip->saved_dsxg_elegacy); snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0); snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0); snd_ymfpci_disable_dsp(chip); @@ -2351,6 +2355,11 @@ int snd_ymfpci_resume(struct pci_dev *pci)
snd_ac97_resume(chip->ac97);
+ pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY, + chip->saved_dsxg_legacy); + pci_write_config_word(chip->pci, PCIR_DSXG_ELEGACY, + chip->saved_dsxg_elegacy); + /* start hw again */ if (chip->start_count > 0) { spin_lock_irq(&chip->reg_lock);
2012/3/8, Takashi Iwai tiwai@suse.de:
At Thu, 8 Mar 2012 12:12:33 +0800, Raymond Yau wrote:
Since the Legacy Audio Control register is reset to default after suspend resume cycle
need to enable the Legacy Audio Control Bit in order to use OPL3 FM Synth
however it is still need to use sbiload instrument loader to reload the instruments
Isn't it better to save and restore these PCI registers like below? It still doesn't solve the lost instrument problem, though.
I only use std.o3 and drums.o3
It seem that the playback of midi using aplaymidi can resume playback after suspend with my ymf724f
so it seem that there is no need to reload the instrument with your patch
diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h index 444cd6b..1e35b16 100644 --- a/include/sound/ymfpci.h +++ b/include/sound/ymfpci.h @@ -366,6 +366,8 @@ struct snd_ymfpci { #ifdef CONFIG_PM u32 *saved_regs; u32 saved_ydsxgr_mode;
- u16 saved_saved_dsxg_legacy;
- u16 saved_saved_dsxg_elegacy;
Should be saved_dsxg_legacy and save_dsxg_elegacy. How can this change back port to 2.6 kernel ?
#endif };
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 12a9a2b..a8159b81 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c @@ -2317,6 +2317,10 @@ int snd_ymfpci_suspend(struct pci_dev *pci, pm_message_t state) for (i = 0; i < YDSXGR_NUM_SAVED_REGS; i++) chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]); chip->saved_ydsxgr_mode = snd_ymfpci_readl(chip, YDSXGR_MODE);
- pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY,
&chip->saved_dsxg_legacy);
- pci_read_config_word(chip->pci, PCIR_DSXG_ELEGACY,
snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0); snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0); snd_ymfpci_disable_dsp(chip);&chip->saved_dsxg_elegacy);
@@ -2351,6 +2355,11 @@ int snd_ymfpci_resume(struct pci_dev *pci)
snd_ac97_resume(chip->ac97);
- pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY,
chip->saved_dsxg_legacy);
- pci_write_config_word(chip->pci, PCIR_DSXG_ELEGACY,
chip->saved_dsxg_elegacy);
- /* start hw again */ if (chip->start_count > 0) { spin_lock_irq(&chip->reg_lock);
At Fri, 9 Mar 2012 07:28:26 +0800, Raymond Yau wrote:
2012/3/8, Takashi Iwai tiwai@suse.de:
At Thu, 8 Mar 2012 12:12:33 +0800, Raymond Yau wrote:
Since the Legacy Audio Control register is reset to default after suspend resume cycle
need to enable the Legacy Audio Control Bit in order to use OPL3 FM Synth
however it is still need to use sbiload instrument loader to reload the instruments
Isn't it better to save and restore these PCI registers like below? It still doesn't solve the lost instrument problem, though.
I only use std.o3 and drums.o3
It seem that the playback of midi using aplaymidi can resume playback after suspend with my ymf724f
so it seem that there is no need to reload the instrument with your patch
diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h index 444cd6b..1e35b16 100644 --- a/include/sound/ymfpci.h +++ b/include/sound/ymfpci.h @@ -366,6 +366,8 @@ struct snd_ymfpci { #ifdef CONFIG_PM u32 *saved_regs; u32 saved_ydsxgr_mode;
- u16 saved_saved_dsxg_legacy;
- u16 saved_saved_dsxg_elegacy;
Should be saved_dsxg_legacy and save_dsxg_elegacy.
Err, of course.
How can this change back port to 2.6 kernel ?
I guess the patch can be applied as is. There have been no big changes in that driver since ages.
Takashi
#endif };
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 12a9a2b..a8159b81 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c @@ -2317,6 +2317,10 @@ int snd_ymfpci_suspend(struct pci_dev *pci, pm_message_t state) for (i = 0; i < YDSXGR_NUM_SAVED_REGS; i++) chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]); chip->saved_ydsxgr_mode = snd_ymfpci_readl(chip, YDSXGR_MODE);
- pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY,
&chip->saved_dsxg_legacy);
- pci_read_config_word(chip->pci, PCIR_DSXG_ELEGACY,
snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0); snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0); snd_ymfpci_disable_dsp(chip);&chip->saved_dsxg_elegacy);
@@ -2351,6 +2355,11 @@ int snd_ymfpci_resume(struct pci_dev *pci)
snd_ac97_resume(chip->ac97);
- pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY,
chip->saved_dsxg_legacy);
- pci_write_config_word(chip->pci, PCIR_DSXG_ELEGACY,
chip->saved_dsxg_elegacy);
- /* start hw again */ if (chip->start_count > 0) { spin_lock_irq(&chip->reg_lock);
2012/3/9 Takashi Iwai tiwai@suse.de:
At Fri, 9 Mar 2012 07:28:26 +0800, Raymond Yau wrote:
2012/3/8, Takashi Iwai tiwai@suse.de:
At Thu, 8 Mar 2012 12:12:33 +0800, Raymond Yau wrote:
Since the Legacy Audio Control register is reset to default after suspend resume cycle
need to enable the Legacy Audio Control Bit in order to use OPL3 FM Synth
however it is still need to use sbiload instrument loader to reload the instruments
Isn't it better to save and restore these PCI registers like below? It still doesn't solve the lost instrument problem, though.
I only use std.o3 and drums.o3
It seem that the playback of midi using aplaymidi can resume playback after suspend with my ymf724f
so it seem that there is no need to reload the instrument with your patch
diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h index 444cd6b..1e35b16 100644 --- a/include/sound/ymfpci.h +++ b/include/sound/ymfpci.h @@ -366,6 +366,8 @@ struct snd_ymfpci { #ifdef CONFIG_PM u32 *saved_regs; u32 saved_ydsxgr_mode;
- u16 saved_saved_dsxg_legacy;
- u16 saved_saved_dsxg_elegacy;
Should be saved_dsxg_legacy and save_dsxg_elegacy.
Err, of course.
How can this change back port to 2.6 kernel ?
I guess the patch can be applied as is. There have been no big changes in that driver since ages.
This patch may be useless when oss is disabled in kernel 3.x
aplaymidi -l open /dev/snd/seq failed: No such file or directory
it only happen with snd-ymfpci when there oss is disabled
I can still use wavetable synth of snd-emu10k1 after I replaced ymf724f with ct4760p
At Sun, 11 Mar 2012 07:37:30 +0800, Raymond Yau wrote:
2012/3/9 Takashi Iwai tiwai@suse.de:
At Fri, 9 Mar 2012 07:28:26 +0800, Raymond Yau wrote:
2012/3/8, Takashi Iwai tiwai@suse.de:
At Thu, 8 Mar 2012 12:12:33 +0800, Raymond Yau wrote:
Since the Legacy Audio Control register is reset to default after suspend resume cycle
need to enable the Legacy Audio Control Bit in order to use OPL3 FM Synth
however it is still need to use sbiload instrument loader to reload the instruments
Isn't it better to save and restore these PCI registers like below? It still doesn't solve the lost instrument problem, though.
I only use std.o3 and drums.o3
It seem that the playback of midi using aplaymidi can resume playback after suspend with my ymf724f
so it seem that there is no need to reload the instrument with your patch
diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h index 444cd6b..1e35b16 100644 --- a/include/sound/ymfpci.h +++ b/include/sound/ymfpci.h @@ -366,6 +366,8 @@ struct snd_ymfpci { #ifdef CONFIG_PM u32 *saved_regs; u32 saved_ydsxgr_mode;
- u16 saved_saved_dsxg_legacy;
- u16 saved_saved_dsxg_elegacy;
Should be saved_dsxg_legacy and save_dsxg_elegacy.
Err, of course.
How can this change back port to 2.6 kernel ?
I guess the patch can be applied as is. There have been no big changes in that driver since ages.
This patch may be useless when oss is disabled in kernel 3.x
aplaymidi -l open /dev/snd/seq failed: No such file or directory
it only happen with snd-ymfpci when there oss is disabled
This is a different problem. Please don't mix up.
Is CONFIG_SND_OPL3_LIB_SEQ=y in your kernel config?
Takashi
2012/3/12, Takashi Iwai tiwai@suse.de:
At Sun, 11 Mar 2012 07:37:30 +0800, Raymond Yau wrote:
2012/3/9 Takashi Iwai tiwai@suse.de:
At Fri, 9 Mar 2012 07:28:26 +0800, Raymond Yau wrote:
2012/3/8, Takashi Iwai tiwai@suse.de:
At Thu, 8 Mar 2012 12:12:33 +0800, Raymond Yau wrote:
Since the Legacy Audio Control register is reset to default after suspend resume cycle
need to enable the Legacy Audio Control Bit in order to use OPL3 FM Synth
however it is still need to use sbiload instrument loader to reload the instruments
Isn't it better to save and restore these PCI registers like below? It still doesn't solve the lost instrument problem, though.
I only use std.o3 and drums.o3
It seem that the playback of midi using aplaymidi can resume playback after suspend with my ymf724f
so it seem that there is no need to reload the instrument with your patch
diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h index 444cd6b..1e35b16 100644 --- a/include/sound/ymfpci.h +++ b/include/sound/ymfpci.h @@ -366,6 +366,8 @@ struct snd_ymfpci { #ifdef CONFIG_PM u32 *saved_regs; u32 saved_ydsxgr_mode;
- u16 saved_saved_dsxg_legacy;
- u16 saved_saved_dsxg_elegacy;
Should be saved_dsxg_legacy and save_dsxg_elegacy.
Err, of course.
How can this change back port to 2.6 kernel ?
I guess the patch can be applied as is. There have been no big changes in that driver since ages.
This patch may be useless when oss is disabled in kernel 3.x
aplaymidi -l open /dev/snd/seq failed: No such file or directory
it only happen with snd-ymfpci when there oss is disabled
This is a different problem. Please don't mix up.
Is CONFIG_SND_OPL3_LIB_SEQ=y in your kernel config?
Takashi
config1.h:#define CONFIG_SND_OPL3_LIB_SEQ_MODULE 1 linux/autoconf.h:#define CONFIG_SND_OPL3_LIB_SEQ_MODULE 1
http://thread.gmane.org/gmane.linux.alsa.devel/6363
may be specific to ymf724f which cannot enable mpu401_uart
The alsa driver does not support auto detect for fm_port and mpu_port for ymf724f
I have to specify fm_port=388 in /etc/modprobe.conf
fm_res f514d440 ctrl 2 mpu_res 00000000 ctrl2 800
but request_region() alway return zero for mpu_port 0x300, 0x330, 0x332 or 0x334
with oss enabled , there is no mpu401 at port 16:0
Port Client name Port name 17:0 OPL3 FM synth OPL3 FM Port
At Tue, 13 Mar 2012 19:34:41 +0800, Raymond Yau wrote:
2012/3/12, Takashi Iwai tiwai@suse.de:
At Sun, 11 Mar 2012 07:37:30 +0800, Raymond Yau wrote:
2012/3/9 Takashi Iwai tiwai@suse.de:
At Fri, 9 Mar 2012 07:28:26 +0800, Raymond Yau wrote:
2012/3/8, Takashi Iwai tiwai@suse.de:
At Thu, 8 Mar 2012 12:12:33 +0800, Raymond Yau wrote: > > Since the Legacy Audio Control register is reset to default after > suspend resume cycle > > need to enable the Legacy Audio Control Bit in order to use OPL3 FM > Synth > > however it is still need to use sbiload instrument loader to reload > the instruments
Isn't it better to save and restore these PCI registers like below? It still doesn't solve the lost instrument problem, though.
I only use std.o3 and drums.o3
It seem that the playback of midi using aplaymidi can resume playback after suspend with my ymf724f
so it seem that there is no need to reload the instrument with your patch
diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h index 444cd6b..1e35b16 100644 --- a/include/sound/ymfpci.h +++ b/include/sound/ymfpci.h @@ -366,6 +366,8 @@ struct snd_ymfpci { #ifdef CONFIG_PM u32 *saved_regs; u32 saved_ydsxgr_mode;
- u16 saved_saved_dsxg_legacy;
- u16 saved_saved_dsxg_elegacy;
Should be saved_dsxg_legacy and save_dsxg_elegacy.
Err, of course.
How can this change back port to 2.6 kernel ?
I guess the patch can be applied as is. There have been no big changes in that driver since ages.
This patch may be useless when oss is disabled in kernel 3.x
aplaymidi -l open /dev/snd/seq failed: No such file or directory
it only happen with snd-ymfpci when there oss is disabled
This is a different problem. Please don't mix up.
Is CONFIG_SND_OPL3_LIB_SEQ=y in your kernel config?
Takashi
config1.h:#define CONFIG_SND_OPL3_LIB_SEQ_MODULE 1 linux/autoconf.h:#define CONFIG_SND_OPL3_LIB_SEQ_MODULE 1
This sounds irrelevant from the probing problem.
may be specific to ymf724f which cannot enable mpu401_uart
The alsa driver does not support auto detect for fm_port and mpu_port for ymf724f
I have to specify fm_port=388 in /etc/modprobe.conf
fm_res f514d440 ctrl 2 mpu_res 00000000 ctrl2 800
but request_region() alway return zero for mpu_port 0x300, 0x330, 0x332 or 0x334
Did you check /proc/ioports?
with oss enabled , there is no mpu401 at port 16:0
Port Client name Port name 17:0 OPL3 FM synth OPL3 FM Port
I'm confused. When OSS is enabled, port 16:0 isn't availale. When OSS is disabled, port 16:0 is available?
Takashi
2012/3/13, Takashi Iwai tiwai@suse.de:
At Tue, 13 Mar 2012 19:34:41 +0800, Raymond Yau wrote:
2012/3/12, Takashi Iwai tiwai@suse.de:
At Sun, 11 Mar 2012 07:37:30 +0800, Raymond Yau wrote:
2012/3/9 Takashi Iwai tiwai@suse.de:
At Fri, 9 Mar 2012 07:28:26 +0800, Raymond Yau wrote:
2012/3/8, Takashi Iwai tiwai@suse.de: > At Thu, 8 Mar 2012 12:12:33 +0800, > Raymond Yau wrote: >> >> Since the Legacy Audio Control register is reset to default after >> suspend resume cycle >> >> need to enable the Legacy Audio Control Bit in order to use OPL3 >> FM >> Synth >> >> however it is still need to use sbiload instrument loader to >> reload >> the instruments > > Isn't it better to save and restore these PCI registers like > below? > It still doesn't solve the lost instrument problem, though. >
I only use std.o3 and drums.o3
It seem that the playback of midi using aplaymidi can resume playback after suspend with my ymf724f
so it seem that there is no need to reload the instrument with your patch
> > --- > diff --git a/include/sound/ymfpci.h b/include/sound/ymfpci.h > index 444cd6b..1e35b16 100644 > --- a/include/sound/ymfpci.h > +++ b/include/sound/ymfpci.h > @@ -366,6 +366,8 @@ struct snd_ymfpci { > #ifdef CONFIG_PM > u32 *saved_regs; > u32 saved_ydsxgr_mode; > + u16 saved_saved_dsxg_legacy; > + u16 saved_saved_dsxg_elegacy;
Should be saved_dsxg_legacy and save_dsxg_elegacy.
Err, of course.
How can this change back port to 2.6 kernel ?
I guess the patch can be applied as is. There have been no big changes in that driver since ages.
This patch may be useless when oss is disabled in kernel 3.x
aplaymidi -l open /dev/snd/seq failed: No such file or directory
it only happen with snd-ymfpci when there oss is disabled
This is a different problem. Please don't mix up.
Is CONFIG_SND_OPL3_LIB_SEQ=y in your kernel config?
Takashi
config1.h:#define CONFIG_SND_OPL3_LIB_SEQ_MODULE 1 linux/autoconf.h:#define CONFIG_SND_OPL3_LIB_SEQ_MODULE 1
This sounds irrelevant from the probing problem.
seem fix by modprobe snd_seq
I know understand why this solve the problem
Neither mpu401 nor gameport are available in linux or windows for ymf724f
but opl3 fm can be used
does it need IRQ 9 or 16 bit io address for legacy port for mpu401 and gameport ?
cat /proc/ioports 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-0060 : keyboard 0064-0064 : keyboard 0070-0071 : rtc0 0080-008f : dma page reg 00a0-00a1 : pic2 00c0-00df : dma2 00f0-00ff : fpu 0290-0297 : pnp 00:07 0388-038b : YMFPCI OPL3 03c0-03df : vga+ 03f8-03ff : serial 0400-041f : 0000:00:1f.3 0400-041f : i801_smbus 0480-04bf : 0000:00:1f.0 0480-04bf : pnp 00:08 04d0-04d1 : pnp 00:08 0800-087f : 0000:00:1f.0 0800-087f : pnp 00:08 0800-0803 : ACPI PM1a_EVT_BLK 0804-0805 : ACPI PM1a_CNT_BLK 0808-080b : ACPI PM_TMR 0810-0815 : ACPI CPU throttle 0828-082f : ACPI GPE0_BLK 0860-087f : iTCO_wdt 0cf8-0cff : PCI conf1 a000-afff : PCI Bus 0000:02 a400-a40f : 0000:02:00.1 a400-a40f : pata_jmicron a480-a483 : 0000:02:00.1 a480-a483 : pata_jmicron a800-a807 : 0000:02:00.1 a800-a807 : pata_jmicron a880-a883 : 0000:02:00.1 a880-a883 : pata_jmicron ac00-ac07 : 0000:02:00.1 ac00-ac07 : pata_jmicron b000-bfff : PCI Bus 0000:04 b800-b8ff : 0000:04:04.0 b800-b8ff : skge bc00-bc7f : 0000:04:03.0 c480-c48f : 0000:00:1f.5 c480-c48f : ata_piix c800-c80f : 0000:00:1f.5 c800-c80f : ata_piix c880-c883 : 0000:00:1f.5 c880-c883 : ata_piix cc00-cc07 : 0000:00:1f.5 cc00-cc07 : ata_piix d000-d003 : 0000:00:1f.5 d000-d003 : ata_piix d080-d087 : 0000:00:1f.5 d080-d087 : ata_piix d400-d41f : 0000:00:1d.0 d400-d41f : uhci_hcd d480-d49f : 0000:00:1d.1 d480-d49f : uhci_hcd d800-d81f : 0000:00:1d.2 d800-d81f : uhci_hcd d880-d89f : 0000:00:1a.0 d880-d89f : uhci_hcd dc00-dc1f : 0000:00:1a.1 dc00-dc1f : uhci_hcd e000-e00f : 0000:00:1f.2 e000-e00f : ata_piix e080-e08f : 0000:00:1f.2 e080-e08f : ata_piix e400-e403 : 0000:00:1f.2 e400-e403 : ata_piix e480-e487 : 0000:00:1f.2 e480-e487 : ata_piix e800-e803 : 0000:00:1f.2 e800-e803 : ata_piix e880-e887 : 0000:00:1f.2 e880-e887 : ata_piix ec00-ec07 : 0000:00:02.0
cat /proc/interrupts CPU0 CPU1 0: 155 0 IO-APIC-edge timer 1: 8496 0 IO-APIC-edge i8042 4: 2 0 IO-APIC-edge 8: 20 0 IO-APIC-edge rtc0 9: 0 0 IO-APIC-fasteoi acpi 12: 145521 0 IO-APIC-edge i8042 16: 1 187746 IO-APIC-fasteoi ahci, uhci_hcd:usb3, i915@pci:000 0:00:02.0 17: 73909 0 IO-APIC-fasteoi uhci_hcd:usb4, pata_jmicron 18: 0 0 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb7 19: 5239 156519 IO-APIC-fasteoi ata_piix, ata_piix, uhci_hcd:usb6 , eth0 21: 112 0 IO-APIC-fasteoi firewire_ohci 22: 532 1 IO-APIC-fasteoi snd_hda_intel 23: 35 0 IO-APIC-fasteoi ehci_hcd:usb2, uhci_hcd:usb5, snd _ymfpci NMI: 0 0 Non-maskable interrupts LOC: 1107924 1273516 Local timer interrupts RES: 31414 34972 Rescheduling interrupts CAL: 1537 2019 function call interrupts TLB: 5824 55363 TLB shootdowns TRM: 0 0 Thermal event interrupts SPU: 0 0 Spurious interrupts ERR: 0 MIS: 0
participants (2)
-
Raymond Yau
-
Takashi Iwai