diff options
Diffstat (limited to 'sound')
47 files changed, 762 insertions, 3208 deletions
diff --git a/sound/aoa/codecs/onyx.c b/sound/aoa/codecs/onyx.c index 15500b9d2da..84bb07d39a7 100644 --- a/sound/aoa/codecs/onyx.c +++ b/sound/aoa/codecs/onyx.c @@ -47,7 +47,7 @@ MODULE_DESCRIPTION("pcm3052 (onyx) codec driver for snd-aoa"); struct onyx { /* cache registers 65 to 80, they are write-only! */ u8 cache[16]; - struct i2c_client i2c; + struct i2c_client *i2c; struct aoa_codec codec; u32 initialised:1, spdif_locked:1, @@ -72,7 +72,7 @@ static int onyx_read_register(struct onyx *onyx, u8 reg, u8 *value) *value = onyx->cache[reg-FIRSTREGISTER]; return 0; } - v = i2c_smbus_read_byte_data(&onyx->i2c, reg); + v = i2c_smbus_read_byte_data(onyx->i2c, reg); if (v < 0) return -1; *value = (u8)v; @@ -84,7 +84,7 @@ static int onyx_write_register(struct onyx *onyx, u8 reg, u8 value) { int result; - result = i2c_smbus_write_byte_data(&onyx->i2c, reg, value); + result = i2c_smbus_write_byte_data(onyx->i2c, reg, value); if (!result) onyx->cache[reg-FIRSTREGISTER] = value; return result; @@ -996,12 +996,45 @@ static void onyx_exit_codec(struct aoa_codec *codec) onyx->codec.soundbus_dev->detach_codec(onyx->codec.soundbus_dev, onyx); } -static struct i2c_driver onyx_driver; - static int onyx_create(struct i2c_adapter *adapter, struct device_node *node, int addr) { + struct i2c_board_info info; + struct i2c_client *client; + + memset(&info, 0, sizeof(struct i2c_board_info)); + strlcpy(info.type, "aoa_codec_onyx", I2C_NAME_SIZE); + info.addr = addr; + info.platform_data = node; + client = i2c_new_device(adapter, &info); + if (!client) + return -ENODEV; + + /* + * We know the driver is already loaded, so the device should be + * already bound. If not it means binding failed, which suggests + * the device doesn't really exist and should be deleted. + * Ideally this would be replaced by better checks _before_ + * instantiating the device. + */ + if (!client->driver) { + i2c_unregister_device(client); + return -ENODEV; + } + + /* + * Let i2c-core delete that device on driver removal. + * This is safe because i2c-core holds the core_lock mutex for us. + */ + list_add_tail(&client->detected, &client->driver->clients); + return 0; +} + +static int onyx_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct device_node *node = client->dev.platform_data; struct onyx *onyx; u8 dummy; @@ -1011,20 +1044,12 @@ static int onyx_create(struct i2c_adapter *adapter, return -ENOMEM; mutex_init(&onyx->mutex); - onyx->i2c.driver = &onyx_driver; - onyx->i2c.adapter = adapter; - onyx->i2c.addr = addr & 0x7f; - strlcpy(onyx->i2c.name, "onyx audio codec", I2C_NAME_SIZE); - - if (i2c_attach_client(&onyx->i2c)) { - printk(KERN_ERR PFX "failed to attach to i2c\n"); - goto fail; - } + onyx->i2c = client; + i2c_set_clientdata(client, onyx); /* we try to read from register ONYX_REG_CONTROL * to check if the codec is present */ if (onyx_read_register(onyx, ONYX_REG_CONTROL, &dummy) != 0) { - i2c_detach_client(&onyx->i2c); printk(KERN_ERR PFX "failed to read control register\n"); goto fail; } @@ -1036,14 +1061,14 @@ static int onyx_create(struct i2c_adapter *adapter, onyx->codec.node = of_node_get(node); if (aoa_codec_register(&onyx->codec)) { - i2c_detach_client(&onyx->i2c); goto fail; } printk(KERN_DEBUG PFX "created and attached onyx instance\n"); return 0; fail: + i2c_set_clientdata(client, NULL); kfree(onyx); - return -EINVAL; + return -ENODEV; } static int onyx_i2c_attach(struct i2c_adapter *adapter) @@ -1080,28 +1105,33 @@ static int onyx_i2c_attach(struct i2c_adapter *adapter) return onyx_create(adapter, NULL, 0x47); } -static int onyx_i2c_detach(struct i2c_client *client) +static int onyx_i2c_remove(struct i2c_client *client) { - struct onyx *onyx = container_of(client, struct onyx, i2c); - int err; + struct onyx *onyx = i2c_get_clientdata(client); - if ((err = i2c_detach_client(client))) - return err; aoa_codec_unregister(&onyx->codec); of_node_put(onyx->codec.node); if (onyx->codec_info) kfree(onyx->codec_info); + i2c_set_clientdata(client, onyx); kfree(onyx); return 0; } +static const struct i2c_device_id onyx_i2c_id[] = { + { "aoa_codec_onyx", 0 }, + { } +}; + static struct i2c_driver onyx_driver = { .driver = { .name = "aoa_codec_onyx", .owner = THIS_MODULE, }, .attach_adapter = onyx_i2c_attach, - .detach_client = onyx_i2c_detach, + .probe = onyx_i2c_probe, + .remove = onyx_i2c_remove, + .id_table = onyx_i2c_id, }; static int __init onyx_init(void) diff --git a/sound/aoa/codecs/tas.c b/sound/aoa/codecs/tas.c index 008e0f85097..f0ebc971c68 100644 --- a/sound/aoa/codecs/tas.c +++ b/sound/aoa/codecs/tas.c @@ -82,7 +82,7 @@ MODULE_DESCRIPTION("tas codec driver for snd-aoa"); struct tas { struct aoa_codec codec; - struct i2c_client i2c; + struct i2c_client *i2c; u32 mute_l:1, mute_r:1 , controls_created:1 , drc_enabled:1, @@ -108,9 +108,9 @@ static struct tas *codec_to_tas(struct aoa_codec *codec) static inline int tas_write_reg(struct tas *tas, u8 reg, u8 len, u8 *data) { if (len == 1) - return i2c_smbus_write_byte_data(&tas->i2c, reg, *data); + return i2c_smbus_write_byte_data(tas->i2c, reg, *data); else - return i2c_smbus_write_i2c_block_data(&tas->i2c, reg, len, data); + return i2c_smbus_write_i2c_block_data(tas->i2c, reg, len, data); } static void tas3004_set_drc(struct tas *tas) @@ -882,12 +882,34 @@ static void tas_exit_codec(struct aoa_codec *codec) } -static struct i2c_driver tas_driver; - static int tas_create(struct i2c_adapter *adapter, struct device_node *node, int addr) { + struct i2c_board_info info; + struct i2c_client *client; + + memset(&info, 0, sizeof(struct i2c_board_info)); + strlcpy(info.type, "aoa_codec_tas", I2C_NAME_SIZE); + info.addr = addr; + info.platform_data = node; + + client = i2c_new_device(adapter, &info); + if (!client) + return -ENODEV; + + /* + * Let i2c-core delete that device on driver removal. + * This is safe because i2c-core holds the core_lock mutex for us. + */ + list_add_tail(&client->detected, &client->driver->clients); + return 0; +} + +static int tas_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct device_node *node = client->dev.platform_data; struct tas *tas; tas = kzalloc(sizeof(struct tas), GFP_KERNEL); @@ -896,17 +918,11 @@ static int tas_create(struct i2c_adapter *adapter, return -ENOMEM; mutex_init(&tas->mtx); - tas->i2c.driver = &tas_driver; - tas->i2c.adapter = adapter; - tas->i2c.addr = addr; + tas->i2c = client; + i2c_set_clientdata(client, tas); + /* seems that half is a saner default */ tas->drc_range = TAS3004_DRC_MAX / 2; - strlcpy(tas->i2c.name, "tas audio codec", I2C_NAME_SIZE); - - if (i2c_attach_client(&tas->i2c)) { - printk(KERN_ERR PFX "failed to attach to i2c\n"); - goto fail; - } strlcpy(tas->codec.name, "tas", MAX_CODEC_NAME_LEN); tas->codec.owner = THIS_MODULE; @@ -915,14 +931,12 @@ static int tas_create(struct i2c_adapter *adapter, tas->codec.node = of_node_get(node); if (aoa_codec_register(&tas->codec)) { - goto detach; + goto fail; } printk(KERN_DEBUG "snd-aoa-codec-tas: tas found, addr 0x%02x on %s\n", - addr, node->full_name); + (unsigned int)client->addr, node->full_name); return 0; - detach: - i2c_detach_client(&tas->i2c); fail: mutex_destroy(&tas->mtx); kfree(tas); @@ -970,14 +984,11 @@ static int tas_i2c_attach(struct i2c_adapter *adapter) return -ENODEV; } -static int tas_i2c_detach(struct i2c_client *client) +static int tas_i2c_remove(struct i2c_client *client) { - struct tas *tas = container_of(client, struct tas, i2c); - int err; + struct tas *tas = i2c_get_clientdata(client); u8 tmp = TAS_ACR_ANALOG_PDOWN; - if ((err = i2c_detach_client(client))) - return err; aoa_codec_unregister(&tas->codec); of_node_put(tas->codec.node); @@ -989,13 +1000,20 @@ static int tas_i2c_detach(struct i2c_client *client) return 0; } +static const struct i2c_device_id tas_i2c_id[] = { + { "aoa_codec_tas", 0 }, + { } +}; + static struct i2c_driver tas_driver = { .driver = { .name = "aoa_codec_tas", .owner = THIS_MODULE, }, .attach_adapter = tas_i2c_attach, - .detach_client = tas_i2c_detach, + .probe = tas_i2c_probe, + .remove = tas_i2c_remove, + .id_table = tas_i2c_id, }; static int __init tas_init(void) diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c index 0afd1a8226f..a2c12d105c9 100644 --- a/sound/arm/pxa2xx-ac97-lib.c +++ b/sound/arm/pxa2xx-ac97-lib.c @@ -364,7 +364,7 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_resume); int __devinit pxa2xx_ac97_hw_probe(struct platform_device *dev) { int ret; - struct pxa2xx_ac97_platform_data *pdata = dev->dev.platform_data; + pxa2xx_audio_ops_t *pdata = dev->dev.platform_data; if (pdata) { switch (pdata->reset_gpio) { diff --git a/sound/core/control.c b/sound/core/control.c index 4b20fa2b7e6..17b8d47a5cd 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -723,14 +723,11 @@ static int snd_ctl_elem_read_user(struct snd_card *card, { struct snd_ctl_elem_value *control; int result; - - control = kmalloc(sizeof(*control), GFP_KERNEL); - if (control == NULL) - return -ENOMEM; - if (copy_from_user(control, _control, sizeof(*control))) { - kfree(control); - return -EFAULT; - } + + control = memdup_user(_control, sizeof(*control)); + if (IS_ERR(control)) + return PTR_ERR(control); + snd_power_lock(card); result = snd_power_wait(card, SNDRV_CTL_POWER_D0); if (result >= 0) @@ -784,13 +781,10 @@ static int snd_ctl_elem_write_user(struct snd_ctl_file *file, struct snd_card *card; int result; - control = kmalloc(sizeof(*control), GFP_KERNEL); - if (control == NULL) - return -ENOMEM; - if (copy_from_user(control, _control, sizeof(*control))) { - kfree(control); - return -EFAULT; - } + control = memdup_user(_control, sizeof(*control)); + if (IS_ERR(control)) + return PTR_ERR(control); + card = file->card; snd_power_lock(card); result = snd_power_wait(card, SNDRV_CTL_POWER_D0); @@ -916,13 +910,10 @@ static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kcontrol, if (op_flag > 0) { if (size > 1024 * 128) /* sane value */ return -EINVAL; - new_data = kmalloc(size, GFP_KERNEL); - if (new_data == NULL) - return -ENOMEM; - if (copy_from_user(new_data, tlv, size)) { - kfree(new_data); - return -EFAULT; - } + + new_data = memdup_user(tlv, size); + if (IS_ERR(new_data)) + return PTR_ERR(new_data); change = ue->tlv_data_size != size; if (!change) change = memcmp(ue->tlv_data, new_data, size); diff --git a/sound/core/jack.c b/sound/core/jack.c index c8254c667c6..d54d1a05fe6 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c @@ -35,6 +35,9 @@ static int snd_jack_dev_free(struct snd_device *device) { struct snd_jack *jack = device->device_data; + if (jack->private_free) + jack->private_free(jack); + /* If the input device is registered with the input subsystem * then we need to use a different deallocator. */ if (jack->registered) diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c index 36d7a599823..08bfed594a8 100644 --- a/sound/core/pcm_compat.c +++ b/sound/core/pcm_compat.c @@ -232,14 +232,11 @@ static int snd_pcm_ioctl_hw_params_compat(struct snd_pcm_substream *substream, if (! (runtime = substream->runtime)) return -ENOTTY; - data = kmalloc(sizeof(*data), GFP_KERNEL); - if (data == NULL) - return -ENOMEM; /* only fifo_size is different, so just copy all */ - if (copy_from_user(data, data32, sizeof(*data32))) { - err = -EFAULT; - goto error; - } + data = memdup_user(data32, sizeof(*data32)); + if (IS_ERR(data)) + return PTR_ERR(data); + if (refine) err = snd_pcm_hw_refine(substream, data); else diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index fbb2e391591..63d088f2265 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -209,9 +209,11 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; snd_pcm_uframes_t pos; - snd_pcm_uframes_t new_hw_ptr, hw_ptr_interrupt, hw_base; - snd_pcm_sframes_t delta; + snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_ptr_interrupt, hw_base; + snd_pcm_sframes_t hdelta, delta; + unsigned long jdelta; + old_hw_ptr = runtime->status->hw_ptr; pos = snd_pcm_update_hw_ptr_pos(substream, runtime); if (pos == SNDRV_PCM_POS_XRUN) { xrun(substream); @@ -247,7 +249,30 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream) new_hw_ptr = hw_base + pos; } } - if (delta > runtime->period_size) { + hdelta = new_hw_ptr - old_hw_ptr; + jdelta = jiffies - runtime->hw_ptr_jiffies; + if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) { + delta = jdelta / + (((runtime->period_size * HZ) / runtime->rate) + + HZ/100); + hw_ptr_error(substream, + "hw_ptr skipping! [Q] " + "(pos=%ld, delta=%ld, period=%ld, " + "jdelta=%lu/%lu/%lu)\n", + (long)pos, (long)hdelta, + (long)runtime->period_size, jdelta, + ((hdelta * HZ) / runtime->rate), delta); + hw_ptr_interrupt = runtime->hw_ptr_interrupt + + runtime->period_size * delta; + if (hw_ptr_interrupt >= runtime->boundary) + hw_ptr_interrupt -= runtime->boundary; + /* rebase to interrupt position */ + hw_base = new_hw_ptr = hw_ptr_interrupt; + /* align hw_base to buffer_size */ + hw_base -= hw_base % runtime->buffer_size; + delta = 0; + } + if (delta > runtime->period_size + runtime->period_size / 2) { hw_ptr_error(substream, "Lost interrupts? " "(stream=%i, delta=%ld, intr_ptr=%ld)\n", @@ -263,6 +288,7 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream) runtime->hw_ptr_base = hw_base; runtime->status->hw_ptr = new_hw_ptr; + runtime->hw_ptr_jiffies = jiffies; runtime->hw_ptr_interrupt = hw_ptr_interrupt; return snd_pcm_update_hw_ptr_post(substream, runtime); @@ -275,6 +301,7 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) snd_pcm_uframes_t pos; snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_base; snd_pcm_sframes_t delta; + unsigned long jdelta; old_hw_ptr = runtime->status->hw_ptr; pos = snd_pcm_update_hw_ptr_pos(substream, runtime); @@ -286,14 +313,15 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) new_hw_ptr = hw_base + pos; delta = new_hw_ptr - old_hw_ptr; + jdelta = jiffies - runtime->hw_ptr_jiffies; if (delta < 0) { delta += runtime->buffer_size; if (delta < 0) { hw_ptr_error(substream, "Unexpected hw_pointer value [2] " - "(stream=%i, pos=%ld, old_ptr=%ld)\n", + "(stream=%i, pos=%ld, old_ptr=%ld, jdelta=%li)\n", substream->stream, (long)pos, - (long)old_hw_ptr); + (long)old_hw_ptr, jdelta); return 0; } hw_base += runtime->buffer_size; @@ -301,12 +329,13 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) hw_base = 0; new_hw_ptr = hw_base + pos; } - if (delta > runtime->period_size && runtime->periods > 1) { + if (((delta * HZ) / runtime->rate) > jdelta + HZ/100) { hw_ptr_error(substream, "hw_ptr skipping! " - "(pos=%ld, delta=%ld, period=%ld)\n", + "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu)\n", (long)pos, (long)delta, - (long)runtime->period_size); + (long)runtime->period_size, jdelta, + ((delta * HZ) / runtime->rate)); return 0; } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && @@ -315,6 +344,7 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) runtime->hw_ptr_base = hw_base; runtime->status->hw_ptr = new_hw_ptr; + runtime->hw_ptr_jiffies = jiffies; return snd_pcm_update_hw_ptr_post(substream, runtime); } @@ -1441,6 +1471,7 @@ static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream, runtime->status->hw_ptr %= runtime->buffer_size; else runtime->status->hw_ptr = 0; + runtime->hw_ptr_jiffies = jiffies; snd_pcm_stream_unlock_irqrestore(substream, flags); return 0; } diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index a151fb01ba8..fc6f98e257d 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -327,21 +327,16 @@ static int snd_pcm_hw_refine_user(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params; int err; - params = kmalloc(sizeof(*params), GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto out; - } - if (copy_from_user(params, _params, sizeof(*params))) { - err = -EFAULT; - goto out; - } + params = memdup_user(_params, sizeof(*params)); + if (IS_ERR(params)) + return PTR_ERR(params); + err = snd_pcm_hw_refine(substream, params); if (copy_to_user(_params, params, sizeof(*params))) { if (!err) err = -EFAULT; } -out: + kfree(params); return err; } @@ -465,21 +460,16 @@ static int snd_pcm_hw_params_user(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params; int err; - params = kmalloc(sizeof(*params), GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto out; - } - if (copy_from_user(params, _params, sizeof(*params))) { - err = -EFAULT; - goto out; - } + params = memdup_user(_params, sizeof(*params)); + if (IS_ERR(params)) + return PTR_ERR(params); + err = snd_pcm_hw_params(substream, params); if (copy_to_user(_params, params, sizeof(*params))) { if (!err) err = -EFAULT; } -out: + kfree(params); return err; } @@ -2593,13 +2583,11 @@ static int snd_pcm_playback_ioctl1(struct file *file, return -EFAULT; if (copy_from_user(&xfern, _xfern, sizeof(xfern))) return -EFAULT; - bufs = kmalloc(sizeof(void *) * runtime->channels, GFP_KERNEL); - if (bufs == NULL) - return -ENOMEM; - if (copy_from_user(bufs, xfern.bufs, sizeof(void *) * runtime->channels)) { - kfree(bufs); - return -EFAULT; - } + + bufs = memdup_user(xfern.bufs, + sizeof(void *) * runtime->channels); + if (IS_ERR(bufs)) + return PTR_ERR(bufs); result = snd_pcm_lib_writev(substream, bufs, xfern.frames); kfree(bufs); __put_user(result, &_xfern->result); @@ -2675,13 +2663,11 @@ static int snd_pcm_capture_ioctl1(struct file *file, return -EFAULT; if (copy_from_user(&xfern, _xfern, sizeof(xfern))) return -EFAULT; - bufs = kmalloc(sizeof(void *) * runtime->channels, GFP_KERNEL); - if (bufs == NULL) - return -ENOMEM; - if (copy_from_user(bufs, xfern.bufs, sizeof(void *) * runtime->channels)) { - kfree(bufs); - return -EFAULT; - } + + bufs = memdup_user(xfern.bufs, + sizeof(void *) * runtime->channels); + if (IS_ERR(bufs)) + return PTR_ERR(bufs); result = snd_pcm_lib_readv(substream, bufs, xfern.frames); kfree(bufs); __put_user(result, &_xfern->result); @@ -3312,18 +3298,12 @@ static int snd_pcm_hw_refine_old_user(struct snd_pcm_substream *substream, int err; params = kmalloc(sizeof(*params), GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto out; - } - oparams = kmalloc(sizeof(*oparams), GFP_KERNEL); - if (!oparams) { - err = -ENOMEM; - goto out; - } + if (!params) + return -ENOMEM; - if (copy_from_user(oparams, _oparams, sizeof(*oparams))) { - err = -EFAULT; + oparams = memdup_user(_oparams, sizeof(*oparams)); + if (IS_ERR(oparams)) { + err = PTR_ERR(oparams); goto out; } snd_pcm_hw_convert_from_old_params(params, oparams); @@ -3333,9 +3313,10 @@ static int snd_pcm_hw_refine_old_user(struct snd_pcm_substream *substream, if (!err) err = -EFAULT; } + + kfree(oparams); out: kfree(params); - kfree(oparams); return err; } @@ -3347,17 +3328,12 @@ static int snd_pcm_hw_params_old_user(struct snd_pcm_substream *substream, int err; params = kmalloc(sizeof(*params), GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto out; - } - oparams = kmalloc(sizeof(*oparams), GFP_KERNEL); - if (!oparams) { - err = -ENOMEM; - goto out; - } - if (copy_from_user(oparams, _oparams, sizeof(*oparams))) { - err = -EFAULT; + if (!params) + return -ENOMEM; + + oparams = memdup_user(_oparams, sizeof(*oparams)); + if (IS_ERR(oparams)) { + err = PTR_ERR(oparams); goto out; } snd_pcm_hw_convert_from_old_params(params, oparams); @@ -3367,9 +3343,10 @@ static int snd_pcm_hw_params_old_user(struct snd_pcm_substream *substream, if (!err) err = -EFAULT; } + + kfree(oparams); out: kfree(params); - kfree(oparams); return err; } #endif /* CONFIG_SND_SUPPORT_OLD_API */ diff --git a/sound/core/seq/seq_compat.c b/sound/core/seq/seq_compat.c index 38693f47c26..c956fe46256 100644 --- a/sound/core/seq/seq_compat.c +++ b/sound/core/seq/seq_compat.c @@ -48,12 +48,11 @@ static int snd_seq_call_port_info_ioctl(struct snd_seq_client *client, unsigned struct snd_seq_port_info *data; mm_segment_t fs; - data = kmalloc(sizeof(*data), GFP_KERNEL); - if (! data) - return -ENOMEM; + data = memdup_user(data32, sizeof(*data32)); + if (IS_ERR(data)) + return PTR_ERR(data); - if (copy_from_user(data, data32, sizeof(*data32)) || - get_user(data->flags, &data32->flags) || + if (get_user(data->flags, &data32->flags) || get_user(data->time_queue, &data32->time_queue)) goto error; data->kernel = NULL; diff --git a/sound/core/timer.c b/sound/core/timer.c index 3f0050d0b71..8f8b17ac074 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -1395,13 +1395,10 @@ static int snd_timer_user_ginfo(struct file *file, struct list_head *p; int err = 0; - ginfo = kmalloc(sizeof(*ginfo), GFP_KERNEL); - if (! ginfo) - return -ENOMEM; - if (copy_from_user(ginfo, _ginfo, sizeof(*ginfo))) { - kfree(ginfo); - return -EFAULT; - } + ginfo = memdup_user(_ginfo, sizeof(*ginfo)); + if (IS_ERR(ginfo)) + return PTR_ERR(ginfo); + tid = ginfo->tid; memset(ginfo, 0, sizeof(*ginfo)); ginfo->tid = tid; diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig index c5c9a9218ff..c6942a4de99 100644 --- a/sound/isa/Kconfig +++ b/sound/isa/Kconfig @@ -395,16 +395,6 @@ config SND_WAVEFRONT To compile this driver as a module, choose M here: the module will be called snd-wavefront. -config SND_WAVEFRONT_FIRMWARE_IN_KERNEL - bool "In-kernel firmware for Wavefront" - depends on SND_WAVEFRONT - default y - help - Say Y here to include the static firmware for FX DSP built in - the kernel for the Wavefront driver. If you choose N here, - you need to install the firmware files from the - alsa-firmware package. - config SND_MSND_PINNACLE tristate "Turtle Beach MultiSound Pinnacle/Fiji driver" depends on X86 && EXPERIMENTAL diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c index 49037d074c7..bdc8dde4e4a 100644 --- a/sound/isa/sb/sb16_csp.c +++ b/sound/isa/sb/sb16_csp.c @@ -684,15 +684,16 @@ static int snd_sb_csp_load(struct snd_sb_csp * p, const unsigned char *buf, int static int snd_sb_csp_load_user(struct snd_sb_csp * p, const unsigned char __user *buf, int size, int load_flags) { - int err = -ENOMEM; - unsigned char *kbuf = kmalloc(size, GFP_KERNEL); - if (kbuf) { - if (copy_from_user(kbuf, buf, size)) - err = -EFAULT; - else - err = snd_sb_csp_load(p, kbuf, size, load_flags); - kfree(kbuf); - } + int err; + unsigned char *kbuf; + + kbuf = memdup_user(buf, size); + if (IS_ERR(kbuf)) + return PTR_ERR(kbuf); + + err = snd_sb_csp_load(p, kbuf, size, load_flags); + + kfree(kbuf); return err; } diff --git a/sound/isa/wavefront/wavefront_fx.c b/sound/isa/wavefront/wavefront_fx.c index dfc449a2194..2bb1cee0925 100644 --- a/sound/isa/wavefront/wavefront_fx.c +++ b/sound/isa/wavefront/wavefront_fx.c @@ -34,14 +34,6 @@ #define WAIT_IDLE 0xff -#ifdef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL -#include "yss225.c" -static const struct firmware yss225_registers_firmware = { - .data = (u8 *)yss225_registers, - .size = sizeof yss225_registers -}; -#endif - static int wavefront_fx_idle (snd_wavefront_t *dev) @@ -210,15 +202,11 @@ snd_wavefront_fx_ioctl (struct snd_hwdep *sdev, struct file *file, "> 512 bytes to FX\n"); return -EIO; } - page_data = kmalloc(r.data[2] * sizeof(short), GFP_KERNEL); - if (!page_data) - return -ENOMEM; - if (copy_from_user (page_data, - (unsigned char __user *) r.data[3], - r.data[2] * sizeof(short))) { - kfree(page_data); - return -EFAULT; - } + page_data = memdup_user((unsigned char __user *) + r.data[3], + r.data[2] * sizeof(short)); + if (IS_ERR(page_data)) + return PTR_ERR(page_data); pd = page_data; } @@ -260,16 +248,12 @@ snd_wavefront_fx_start (snd_wavefront_t *dev) if (dev->fx_initialized) return 0; -#ifdef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL - firmware = &yss225_registers_firmware; -#else err = request_firmware(&firmware, "yamaha/yss225_registers.bin", dev->card->dev); if (err < 0) { err = -1; goto out; } -#endif for (i = 0; i + 1 < firmware->size; i += 2) { if (firmware->data[i] >= 8 && firmware->data[i] < 16) { @@ -292,12 +276,8 @@ snd_wavefront_fx_start (snd_wavefront_t *dev) err = 0; out: -#ifndef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL release_firmware(firmware); -#endif return err; } -#ifndef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL MODULE_FIRMWARE("yamaha/yss225_registers.bin"); -#endif diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c index beb312cca75..5d4ff48c434 100644 --- a/sound/isa/wavefront/wavefront_synth.c +++ b/sound/isa/wavefront/wavefront_synth.c @@ -1664,12 +1664,11 @@ snd_wavefront_synth_ioctl (struct snd_hwdep *hw, struct file *file, break; case WFCTL_WFCMD: - wc = kmalloc(sizeof(*wc), GFP_KERNEL); - if (! wc) - return -ENOMEM; - if (copy_from_user (wc, argp, sizeof (*wc))) - err = -EFAULT; - else if (wavefront_synth_control (acard, wc) < 0) + wc = memdup_user(argp, sizeof(*wc)); + if (IS_ERR(wc)) + return PTR_ERR(wc); + + if (wavefront_synth_control (acard, wc) < 0) err = -EIO; else if (copy_to_user (argp, wc, sizeof (*wc))) err = -EFAULT; diff --git a/sound/isa/wavefront/yss225.c b/sound/isa/wavefront/yss225.c deleted file mode 100644 index 9f6be3ff8ec..00000000000 --- a/sound/isa/wavefront/yss225.c +++ /dev/null @@ -1,2739 +0,0 @@ -/* - * Copyright (c) 1998-2002 by Paul Davis <pbd@op.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* weird stuff, derived from port I/O tracing with dosemu */ - -static const struct { - unsigned char addr; - unsigned char data; -} yss225_registers[] __devinitdata = { -/* Set all bits for all channels on the MOD unit to zero */ -{ WAIT_IDLE }, { 0xe, 0x10 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x11 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x12 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x13 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x14 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x15 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x16 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x17 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x18 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x19 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x20 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x21 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x22 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x23 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x24 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x25 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x26 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x27 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x28 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x29 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x30 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x31 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x32 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x33 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x34 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x35 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x36 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x37 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x38 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x39 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x40 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x41 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x42 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x43 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x44 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x45 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x46 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x47 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x48 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x49 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x50 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x51 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x52 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x53 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x54 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x55 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x56 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x57 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x58 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x59 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x60 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x61 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x62 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x63 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x64 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x65 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x66 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x67 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x68 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x69 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x70 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x71 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x72 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x73 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x74 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x75 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x76 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x77 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x78 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x79 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x80 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x81 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x82 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x83 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x84 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x85 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x86 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x87 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x88 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x89 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x90 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x91 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x92 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x93 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x94 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x95 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x96 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x97 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x98 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x99 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xab }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xac }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xad }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xae }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xba }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xca }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xce }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xda }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xea }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xeb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xec }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xed }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xee }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xef }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xff }, { 0xf, 0x00 }, - -/* XXX But why do this twice? */ -{ WAIT_IDLE }, { 0xe, 0x10 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x11 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x12 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x13 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x14 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x15 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x16 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x17 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x18 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x19 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x20 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x21 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x22 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x23 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x24 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x25 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x26 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x27 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x28 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x29 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x30 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x31 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x32 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x33 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x34 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x35 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x36 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x37 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x38 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x39 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x40 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x41 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x42 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x43 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x44 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x45 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x46 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x47 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x48 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x49 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x50 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x51 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x52 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x53 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x54 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x55 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x56 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x57 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x58 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x59 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x60 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x61 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x62 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x63 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x64 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x65 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x66 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x67 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x68 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x69 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x70 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x71 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x72 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x73 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x74 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x75 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x76 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x77 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x78 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x79 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x80 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x81 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x82 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x83 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x84 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x85 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x86 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x87 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x88 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x89 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x90 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x91 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x92 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x93 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x94 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x95 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x96 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x97 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x98 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x99 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xab }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xac }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xad }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xae }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xba }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xca }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xce }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xda }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xea }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xeb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xec }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xed }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xee }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xef }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xff }, { 0xf, 0x00 }, - -/* mute on */ -{ WAIT_IDLE }, { 0x8, 0x02 }, - -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, - -/* either because of stupidity by TB's programmers, or because it - actually does something, rezero the MOD page. */ -{ WAIT_IDLE }, { 0xe, 0x10 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x11 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x12 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x13 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x14 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x15 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x16 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x17 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x18 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x19 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x20 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x21 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x22 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x23 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x24 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x25 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x26 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x27 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x28 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x29 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x30 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x31 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x32 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x33 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x34 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x35 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x36 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x37 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x38 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x39 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x40 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x41 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x42 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x43 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x44 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x45 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x46 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x47 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x48 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x49 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x50 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x51 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x52 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x53 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x54 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x55 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x56 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x57 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x58 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x59 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x60 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x61 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x62 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x63 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x64 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x65 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x66 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x67 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x68 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x69 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x70 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x71 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x72 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x73 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x74 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x75 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x76 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x77 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x78 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x79 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x80 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x81 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x82 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x83 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x84 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x85 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x86 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x87 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x88 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x89 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x90 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x91 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x92 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x93 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x94 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x95 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x96 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x97 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x98 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x99 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xab }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xac }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xad }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xae }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xba }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xca }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xce }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xda }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xea }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xeb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xec }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xed }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xee }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xef }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xff }, { 0xf, 0x00 }, - -/* load page zero */ -{ 0x9, 0x05 }, { 0xb, 0x00 }, { 0xa, 0x00 }, - -{ 0xd, 0x01 }, { 0xc, 0x7c }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1e }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xf5 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x11 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x32 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x13 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x14 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x18 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x10 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xd1 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xf2 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x13 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xf4 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xe0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x15 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x16 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x50 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x71 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x92 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xb3 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xd4 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xf5 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x70 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x11 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x16 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x10 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1d }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xdf }, { WAIT_IDLE }, - -/* Now load page one */ -{ 0x9, 0x05 }, { 0xb, 0x01 }, { 0xa, 0x00 }, - -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1f }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xd8 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x18 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xfa }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xfb }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xd7 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xf7 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1c }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x3c }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x3f }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xdf }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x5d }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x7d }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x9e }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xbe }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xdb }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xdb }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xe0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xfb }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xfb }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x02 }, { 0xa, 0x00 }, - -{ 0xc, 0xc4 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x25 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x06 }, { WAIT_IDLE }, -{ 0xc, 0xc4 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x25 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x04 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x04 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x03 }, { 0xa, 0x00 }, - -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x47 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x06 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x70 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x04 }, { 0xa, 0x00 }, - -{ 0xc, 0x63 }, { WAIT_IDLE }, -{ 0xc, 0x03 }, { WAIT_IDLE }, -{ 0xc, 0x26 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x2c }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x24 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x2e }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x21 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, - -/* Load memory area (page six) */ -{ 0x9, 0x01 }, { 0xb, 0x06 }, - -{ 0xa, 0x00 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x02 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x04 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x06 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x08 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x0a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x0c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x0e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x10 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x12 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x14 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x16 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x18 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x20 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x22 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x24 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x26 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x28 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x30 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x32 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x34 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x36 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x38 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x42 }, { 0xd, 0x03 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x44 }, { 0xd, 0x01 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x46 }, { 0xd, 0x0a }, { 0xc, 0x21 }, { WAIT_IDLE }, -{ 0xa, 0x48 }, { 0xd, 0x0d }, { 0xc, 0x23 }, { WAIT_IDLE }, -{ 0xa, 0x4a }, { 0xd, 0x23 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xa, 0x4c }, { 0xd, 0x37 }, { 0xc, 0x8f }, { WAIT_IDLE }, -{ 0xa, 0x4e }, { 0xd, 0x45 }, { 0xc, 0x77 }, { WAIT_IDLE }, -{ 0xa, 0x50 }, { 0xd, 0x52 }, { 0xc, 0xe2 }, { WAIT_IDLE }, -{ 0xa, 0x52 }, { 0xd, 0x1c }, { 0xc, 0x92 }, { WAIT_IDLE }, -{ 0xa, 0x54 }, { 0xd, 0x1c }, { 0xc, 0x52 }, { WAIT_IDLE }, -{ 0xa, 0x56 }, { 0xd, 0x07 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x58 }, { 0xd, 0x2f }, { 0xc, 0xc6 }, { WAIT_IDLE }, -{ 0xa, 0x5a }, { 0xd, 0x0b }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x5c }, { 0xd, 0x30 }, { 0xc, 0x06 }, { WAIT_IDLE }, -{ 0xa, 0x5e }, { 0xd, 0x17 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x60 }, { 0xd, 0x3d }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xa, 0x62 }, { 0xd, 0x29 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x64 }, { 0xd, 0x3e }, { 0xc, 0x41 }, { WAIT_IDLE }, -{ 0xa, 0x66 }, { 0xd, 0x39 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x68 }, { 0xd, 0x4c }, { 0xc, 0x48 }, { WAIT_IDLE }, -{ 0xa, 0x6a }, { 0xd, 0x49 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x6c }, { 0xd, 0x4c }, { 0xc, 0x6c }, { WAIT_IDLE }, -{ 0xa, 0x6e }, { 0xd, 0x11 }, { 0xc, 0xd2 }, { WAIT_IDLE }, -{ 0xa, 0x70 }, { 0xd, 0x16 }, { 0xc, 0x0c }, { WAIT_IDLE }, -{ 0xa, 0x72 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x74 }, { 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xa, 0x76 }, { 0xd, 0x0f }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x78 }, { 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xa, 0x7a }, { 0xd, 0x13 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x7c }, { 0xd, 0x80 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x7e }, { 0xd, 0x80 }, { 0xc, 0x80 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x07 }, { 0xa, 0x00 }, - -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xe9 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x8c }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x8c }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x1a }, { 0xc, 0x75 }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0x8b }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0xe9 }, { WAIT_IDLE }, -{ 0xd, 0x0b }, { 0xc, 0x16 }, { WAIT_IDLE }, -{ 0xd, 0x1a }, { 0xc, 0x38 }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0xc8 }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0x6f }, { WAIT_IDLE }, -{ 0xd, 0x0b }, { 0xc, 0x91 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x8f }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x7b }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x97 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x97 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x52 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0xf6 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0xf6 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -/* Now setup the MOD area. */ -{ 0xe, 0x01 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x08 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x09 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0a }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0b }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0c }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0d }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0e }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0f }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0xb0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb8 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb9 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xba }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbb }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbc }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbd }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbe }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbf }, { 0xf, 0x20 }, { WAIT_IDLE }, - -{ 0xe, 0xf0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf8 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf9 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfa }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfb }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfc }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfd }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfe }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xff }, { 0xf, 0x20 }, { WAIT_IDLE }, - -{ 0xe, 0x10 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x11 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x12 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x13 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x14 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x15 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x16 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x17 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x18 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x19 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1a }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1b }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1c }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1d }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1e }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x1f }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x20 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x21 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x22 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x23 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x24 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x25 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x26 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x27 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x28 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x29 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2a }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2b }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2c }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2d }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x2f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x30 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x31 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x32 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x33 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x34 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x35 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x36 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x37 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x38 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x39 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3f }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0x40 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x41 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x42 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x43 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x44 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x45 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x46 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x47 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x48 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x49 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4e }, { 0xf, 0x0e }, { WAIT_IDLE }, -{ 0xe, 0x4f }, { 0xf, 0x0e }, { WAIT_IDLE }, -{ 0xe, 0x50 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x51 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x52 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x53 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x54 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x55 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x56 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x57 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x58 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x59 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x60 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x61 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x62 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x63 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x64 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x65 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x66 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x67 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x68 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x69 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6c }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x6d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6e }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x6f }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x70 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x71 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x72 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x73 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x74 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x75 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x76 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x77 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x78 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x79 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7a }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7b }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7c }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7d }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7e }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7f }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x80 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x81 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x82 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x83 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x84 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x85 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x86 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x87 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x88 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x89 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x90 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x91 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x92 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x93 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x94 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x95 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x96 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x97 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x98 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x99 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xaa }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xab }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xac }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xad }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xae }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xaf }, { 0xf, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0xc0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xca }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcb }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcc }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcd }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xce }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcf }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xda }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xdb }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xdc }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xdd }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xde }, { 0xf, 0x10 }, { WAIT_IDLE }, -{ 0xe, 0xdf }, { 0xf, 0x10 }, { WAIT_IDLE }, -{ 0xe, 0xe0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xea }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xeb }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xec }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xed }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xee }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xef }, { 0xf, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0x01 }, { 0xf, 0x00 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x08 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x09 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0a }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0b }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0c }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0d }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0e }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0f }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, - -/* mute on */ -{ 0x8, 0x02 }, - -/* Now set the coefficients and so forth for the programs above */ -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x4b }, { 0xd, 0x03 }, { 0xc, 0x11 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x4d }, { 0xd, 0x01 }, { 0xc, 0x32 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x40 }, { 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x41 }, { 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x47 }, { 0xd, 0x01 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x4a }, { 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x00 }, { 0xd, 0x01 }, { 0xc, 0x1c }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x44 }, { 0xd, 0x01 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x42 }, { 0xd, 0x01 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x43 }, { 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x40 }, { 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x41 }, { 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x51 }, { 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x50 }, { 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4f }, { 0xd, 0x03 }, { 0xc, 0x81 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x53 }, { 0xd, 0x1a }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x54 }, { 0xd, 0x0d }, { 0xc, 0x8b }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x55 }, { 0xd, 0x04 }, { 0xc, 0xe9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x56 }, { 0xd, 0x0b }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x57 }, { 0xd, 0x1a }, { 0xc, 0x38 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x58 }, { 0xd, 0x0d }, { 0xc, 0xc9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x59 }, { 0xd, 0x04 }, { 0xc, 0x6f }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5a }, { 0xd, 0x0b }, { 0xc, 0x91 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x73 }, { 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x74 }, { 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x75 }, { 0xd, 0x04 }, { 0xc, 0xd9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x76 }, { 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x77 }, { 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x78 }, { 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x79 }, { 0xd, 0x04 }, { 0xc, 0xd9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7a }, { 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5e }, { 0xd, 0x03 }, { 0xc, 0x68 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5c }, { 0xd, 0x04 }, { 0xc, 0x31 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5d }, { 0xd, 0x04 }, { 0xc, 0x31 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x62 }, { 0xd, 0x03 }, { 0xc, 0x52 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x60 }, { 0xd, 0x04 }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x61 }, { 0xd, 0x04 }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x66 }, { 0xd, 0x03 }, { 0xc, 0x2e }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x64 }, { 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x65 }, { 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x6a }, { 0xd, 0x02 }, { 0xc, 0xf6 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x68 }, { 0xd, 0x05 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x69 }, { 0xd, 0x05 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x46 }, { 0xd, 0x0a }, { 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x48 }, { 0xd, 0x0d }, { 0xc, 0x24 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x6e }, { 0xd, 0x11 }, { 0xc, 0xd3 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x70 }, { 0xd, 0x15 }, { 0xc, 0xcb }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x52 }, { 0xd, 0x20 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x54 }, { 0xd, 0x20 }, { 0xc, 0x54 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x4a }, { 0xd, 0x27 }, { 0xc, 0x1d }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x58 }, { 0xd, 0x2f }, { 0xc, 0xc8 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x5c }, { 0xd, 0x30 }, { 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x4c }, { 0xd, 0x37 }, { 0xc, 0x90 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x60 }, { 0xd, 0x3d }, { 0xc, 0xdb }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x64 }, { 0xd, 0x3e }, { 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x4e }, { 0xd, 0x45 }, { 0xc, 0x78 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x68 }, { 0xd, 0x4c }, { 0xc, 0x48 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x6c }, { 0xd, 0x4c }, { 0xc, 0x6c }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x50 }, { 0xd, 0x52 }, { 0xc, 0xe2 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x42 }, { 0xd, 0x02 }, { 0xc, 0xba }, { WAIT_IDLE }, - -/* Some settings (?) */ -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x14 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x20 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x20 }, - -/* some more coefficients */ -{ WAIT_IDLE }, { 0xb, 0x06 }, { 0xa, 0x78 }, { 0xd, 0x00 }, { 0xc, 0x40 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x03 }, { 0xd, 0x0f }, { 0xc, 0xff }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x0b }, { 0xd, 0x0f }, { 0xc, 0xff }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x02 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x0a }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, - -/* Now, for some strange reason, lets reload every page - and all the coefficients over again. I have *NO* idea - why this is done. I do know that no sound is produced - is this phase is omitted. */ -{ 0x9, 0x05 }, { 0xb, 0x00 }, { 0xa, 0x10 }, - -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x01 }, { 0xa, 0x10 }, - -{ 0xd, 0x01 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xfa }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ WAIT_IDLE }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x02 }, { 0xa, 0x10 }, - -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x03 }, { 0xa, 0x10 }, - -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x04 }, { 0xa, 0x10 }, - -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, - -/* Page six v.2 */ -{ 0x9, 0x01 }, { 0xb, 0x06 }, - -{ 0xa, 0x10 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x12 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x14 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x16 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x18 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x20 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x22 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x24 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x26 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x28 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x30 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x32 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x34 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x36 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x38 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x07 }, { 0xa, 0x10 }, - -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0x01 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xb0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0x10 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x11 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x12 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x13 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x14 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x15 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x16 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x17 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x20 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x21 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x22 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x23 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x24 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x25 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x26 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x27 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x30 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x31 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x32 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x33 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x34 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x35 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x36 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x37 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x40 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x41 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x42 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x43 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x44 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x45 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x46 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x47 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x50 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x51 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x52 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x53 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x54 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x55 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x56 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x57 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x60 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x61 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x62 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x63 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x64 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x65 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x66 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x67 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x70 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x71 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x72 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x73 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x74 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x75 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x76 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x77 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x80 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x81 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x82 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x83 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x84 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x85 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x86 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x87 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x90 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x91 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x92 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x93 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x94 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x95 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x96 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x97 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, - -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x45 }, { 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x48 }, { 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7b }, { 0xd, 0x04 }, { 0xc, 0xcc }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7d }, { 0xd, 0x04 }, { 0xc, 0xcc }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0xff }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0xff }, - -/* mute off */ -{ 0x8, 0x00 }, { WAIT_IDLE } -}; diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index 97ee127ac33..78288dbfc17 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c @@ -2122,7 +2122,7 @@ int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, } /* nothing should be in powerdown mode */ snd_ac97_write_cache(ac97, AC97_GENERAL_PURPOSE, 0); - end_time = jiffies + msecs_to_jiffies(100); + end_time = jiffies + msecs_to_jiffies(120); do { if ((snd_ac97_read(ac97, AC97_POWERDOWN) & 0x0f) == 0x0f) goto __ready_ok; diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index 9ce8548c03e..71515ddb459 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c @@ -1393,6 +1393,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { .name = "HP nx6125", .type = AC97_TUNE_MUTE_LED }, + { + .subvendor = 0x103c, + .subdevice = 0x3091, + .name = "unknown HP", + .type = AC97_TUNE_MUTE_LED + }, { } /* terminator */ }; diff --git a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c index 191e1cd9997..4b302d86f5f 100644 --- a/sound/pci/emu10k1/emufx.c +++ b/sound/pci/emu10k1/emufx.c @@ -2493,24 +2493,17 @@ static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, un case SNDRV_EMU10K1_IOCTL_CODE_POKE: if (!capable(CAP_SYS_ADMIN)) return -EPERM; - icode = kmalloc(sizeof(*icode), GFP_KERNEL); - if (icode == NULL) - return -ENOMEM; - if (copy_from_user(icode, argp, sizeof(*icode))) { - kfree(icode); - return -EFAULT; - } + + icode = memdup_user(argp, sizeof(*icode)); + if (IS_ERR(icode)) + return PTR_ERR(icode); res = snd_emu10k1_icode_poke(emu, icode); kfree(icode); return res; case SNDRV_EMU10K1_IOCTL_CODE_PEEK: - icode = kmalloc(sizeof(*icode), GFP_KERNEL); - if (icode == NULL) - return -ENOMEM; - if (copy_from_user(icode, argp, sizeof(*icode))) { - kfree(icode); - return -EFAULT; - } + icode = memdup_user(argp, sizeof(*icode)); + if (IS_ERR(icode)) + return PTR_ERR(icode); res = snd_emu10k1_icode_peek(emu, icode); if (res == 0 && copy_to_user(argp, icode, sizeof(*icode))) { kfree(icode); @@ -2519,24 +2512,16 @@ static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, un kfree(icode); return res; case SNDRV_EMU10K1_IOCTL_PCM_POKE: - ipcm = kmalloc(sizeof(*ipcm), GFP_KERNEL); - if (ipcm == NULL) - return -ENOMEM; - if (copy_from_user(ipcm, argp, sizeof(*ipcm))) { - kfree(ipcm); - return -EFAULT; - } + ipcm = memdup_user(argp, sizeof(*ipcm)); + if (IS_ERR(ipcm)) + return PTR_ERR(ipcm); res = snd_emu10k1_ipcm_poke(emu, ipcm); kfree(ipcm); return res; case SNDRV_EMU10K1_IOCTL_PCM_PEEK: - ipcm = kzalloc(sizeof(*ipcm), GFP_KERNEL); - if (ipcm == NULL) - return -ENOMEM; - if (copy_from_user(ipcm, argp, sizeof(*ipcm))) { - kfree(ipcm); - return -EFAULT; - } + ipcm = memdup_user(argp, sizeof(*ipcm)); + if (IS_ERR(ipcm)) + return PTR_ERR(ipcm); res = snd_emu10k1_ipcm_peek(emu, ipcm); if (res == 0 && copy_to_user(argp, ipcm, sizeof(*ipcm))) { kfree(ipcm); diff --git a/sound/pci/emu10k1/io.c b/sound/pci/emu10k1/io.c index 4bfc31d1b28..c1a5aa15af8 100644 --- a/sound/pci/emu10k1/io.c +++ b/sound/pci/emu10k1/io.c @@ -490,7 +490,7 @@ void snd_emu10k1_wait(struct snd_emu10k1 *emu, unsigned int wait) if (newtime != curtime) break; } - if (count >= 16384) + if (count > 16384) break; curtime = newtime; } diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index a4e5e595211..8820faf6c9d 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -642,19 +642,21 @@ static int get_codec_name(struct hda_codec *codec) */ static void /*__devinit*/ setup_fg_nodes(struct hda_codec *codec) { - int i, total_nodes; + int i, total_nodes, function_id; hda_nid_t nid; total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); for (i = 0; i < total_nodes; i++, nid++) { - codec->function_id = snd_hda_param_read(codec, nid, + function_id = snd_hda_param_read(codec, nid, AC_PAR_FUNCTION_TYPE) & 0xff; - switch (codec->function_id) { + switch (function_id) { case AC_GRP_AUDIO_FUNCTION: codec->afg = nid; + codec->function_id = function_id; break; case AC_GRP_MODEM_FUNCTION: codec->mfg = nid; + codec->function_id = function_id; break; default: break; @@ -2250,7 +2252,11 @@ int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid, err = bus->ops.command(bus, res); if (!err) { struct hda_cache_head *c; - u32 key = build_cmd_cache_key(nid, verb); + u32 key; + /* parm may contain the verb stuff for get/set amp */ + verb = verb | (parm >> 8); + parm &= 0xff; + key = build_cmd_cache_key(nid, verb); c = get_alloc_hash(&codec->cmd_cache, key); if (c) c->val = parm; diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 30829ee920c..21e99cfa8c4 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -312,6 +312,8 @@ struct azx_dev { unsigned int period_bytes; /* size of the period in bytes */ unsigned int frags; /* number for period in the play buffer */ unsigned int fifo_size; /* FIFO size */ + unsigned long start_jiffies; /* start + minimum jiffies */ + unsigned long min_jiffies; /* minimum jiffies before position is valid */ void __iomem *sd_addr; /* stream descriptor pointer */ @@ -330,7 +332,7 @@ struct azx_dev { unsigned int opened :1; unsigned int running :1; unsigned int irq_pending :1; - unsigned int irq_ignore :1; + unsigned int start_flag: 1; /* stream full start flag */ /* * For VIA: * A flag to ensure DMA position is 0 @@ -975,7 +977,7 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) struct azx *chip = dev_id; struct azx_dev *azx_dev; u32 status; - int i; + int i, ok; spin_lock(&chip->reg_lock); @@ -991,18 +993,14 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); if (!azx_dev->substream || !azx_dev->running) continue; - /* ignore the first dummy IRQ (due to pos_adj) */ - if (azx_dev->irq_ignore) { - azx_dev->irq_ignore = 0; - continue; - } /* check whether this IRQ is really acceptable */ - if (azx_position_ok(chip, azx_dev)) { + ok = azx_position_ok(chip, azx_dev); + if (ok == 1) { azx_dev->irq_pending = 0; spin_unlock(&chip->reg_lock); snd_pcm_period_elapsed(azx_dev->substream); spin_lock(&chip->reg_lock); - } else if (chip->bus && chip->bus->workq) { + } else if (ok == 0 && chip->bus && chip->bus->workq) { /* bogus IRQ, process it later */ azx_dev->irq_pending = 1; queue_work(chip->bus->workq, @@ -1088,7 +1086,6 @@ static int azx_setup_periods(struct azx *chip, bdl = (u32 *)azx_dev->bdl.area; ofs = 0; azx_dev->frags = 0; - azx_dev->irq_ignore = 0; pos_adj = bdl_pos_adj[chip->dev_index]; if (pos_adj > 0) { struct snd_pcm_runtime *runtime = substream->runtime; @@ -1109,7 +1106,6 @@ static int azx_setup_periods(struct azx *chip, &bdl, ofs, pos_adj, 1); if (ofs < 0) goto error; - azx_dev->irq_ignore = 1; } } else pos_adj = 0; @@ -1155,6 +1151,9 @@ static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev) while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) && --timeout) ; + + /* reset first position - may not be synced with hw at this time */ + *azx_dev->posbuf = 0; } /* @@ -1409,7 +1408,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) snd_pcm_set_sync(substream); mutex_unlock(&chip->open_mutex); - azx_stream_reset(chip, azx_dev); return 0; } @@ -1474,6 +1472,7 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) unsigned int bufsize, period_bytes, format_val; int err; + azx_stream_reset(chip, azx_dev); format_val = snd_hda_calc_stream_format(runtime->rate, runtime->channels, runtime->format, @@ -1502,6 +1501,8 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) return err; } + azx_dev->min_jiffies = (runtime->period_size * HZ) / + (runtime->rate * 2); azx_setup_controller(chip, azx_dev); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1; @@ -1518,13 +1519,14 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) struct azx *chip = apcm->chip; struct azx_dev *azx_dev; struct snd_pcm_substream *s; - int start, nsync = 0, sbits = 0; + int rstart = 0, start, nsync = 0, sbits = 0; int nwait, timeout; switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + rstart = 1; case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_START: start = 1; break; case SNDRV_PCM_TRIGGER_PAUSE_PUSH: @@ -1554,6 +1556,10 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) if (s->pcm->card != substream->pcm->card) continue; azx_dev = get_azx_dev(s); + if (rstart) { + azx_dev->start_flag = 1; + azx_dev->start_jiffies = jiffies + azx_dev->min_jiffies; + } if (start) azx_stream_start(chip, azx_dev); else @@ -1703,6 +1709,11 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) { unsigned int pos; + if (azx_dev->start_flag && + time_before_eq(jiffies, azx_dev->start_jiffies)) + return -1; /* bogus (too early) interrupt */ + azx_dev->start_flag = 0; + pos = azx_get_position(chip, azx_dev); if (chip->position_fix == POS_FIX_AUTO) { if (!pos) { @@ -2260,11 +2271,11 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, gcap &= ~0x01; /* allow 64bit DMA address if supported by H/W */ - if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK)) - pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK); + if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) + pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); else { - pci_set_dma_mask(pci, DMA_32BIT_MASK); - pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK); + pci_set_dma_mask(pci, DMA_BIT_MASK(32)); + pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)); } /* read number of streams from GCAP register instead of using diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 38ad3f7b040..84cc49ca914 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -3817,6 +3817,49 @@ static struct hda_verb ad1884a_laptop_verbs[] = { { } /* end */ }; +static struct hda_verb ad1884a_mobile_verbs[] = { + /* DACs; unmute as default */ + {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ + {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ + /* Port-A (HP) mixer - route only from analog mixer */ + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + /* Port-A pin */ + {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + /* Port-A (HP) pin - always unmuted */ + {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + /* Port-B (mic jack) pin */ + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ + /* Port-C (int mic) pin */ + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ + /* Port-F (int speaker) mixer - route only from analog mixer */ + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + /* Port-F pin */ + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + /* Analog mixer; mute as default */ + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, + {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, + /* Analog Mix output amp */ + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + /* capture sources */ + /* {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0}, */ /* set via unsol */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + /* unsolicited event for pin-sense */ + {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, + {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, + { } /* end */ +}; + /* * Thinkpad X300 * 0x11 - HP @@ -3977,10 +4020,18 @@ static int patch_ad1884a(struct hda_codec *codec) spec->input_mux = &ad1884a_laptop_capture_source; codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; codec->patch_ops.init = ad1884a_hp_init; + /* set the upper-limit for mixer amp to 0dB for avoiding the + * possible damage by overloading + */ + snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT, + (0x17 << AC_AMPCAP_OFFSET_SHIFT) | + (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | + (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | + (1 << AC_AMPCAP_MUTE_SHIFT)); break; case AD1884A_MOBILE: spec->mixers[0] = ad1884a_mobile_mixers; - spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs; + spec->init_verbs[0] = ad1884a_mobile_verbs; spec->multiout.dig_out_nid = 0; codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; codec->patch_ops.init = ad1884a_hp_init; diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 1f2ad76ca94..56ce19e68cb 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -350,12 +350,20 @@ static int conexant_mux_enum_put(struct snd_kcontrol *kcontrol, } #ifdef CONFIG_SND_JACK +static void conexant_free_jack_priv(struct snd_jack *jack) +{ + struct conexant_jack *jacks = jack->private_data; + jacks->nid = 0; + jacks->jack = NULL; +} + static int conexant_add_jack(struct hda_codec *codec, hda_nid_t nid, int type) { struct conexant_spec *spec; struct conexant_jack *jack; const char *name; + int err; spec = codec->spec; snd_array_init(&spec->jacks, sizeof(*jack), 32); @@ -368,7 +376,12 @@ static int conexant_add_jack(struct hda_codec *codec, jack->nid = nid; jack->type = type; - return snd_jack_new(codec->bus->card, name, type, &jack->jack); + err = snd_jack_new(codec->bus->card, name, type, &jack->jack); + if (err < 0) + return err; + jack->jack->private_data = jack; + jack->jack->private_free = conexant_free_jack_priv; + return 0; } static void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid) @@ -455,8 +468,10 @@ static void conexant_free(struct hda_codec *codec) if (spec->jacks.list) { struct conexant_jack *jacks = spec->jacks.list; int i; - for (i = 0; i < spec->jacks.used; i++) - snd_device_free(codec->bus->card, &jacks[i].jack); + for (i = 0; i < spec->jacks.used; i++, jacks++) { + if (jacks->jack) + snd_device_free(codec->bus->card, jacks->jack); + } snd_array_free(&spec->jacks); } #endif diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index f35e58a2d92..b8a0d3e7927 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -188,6 +188,8 @@ enum { ALC663_ASUS_MODE4, ALC663_ASUS_MODE5, ALC663_ASUS_MODE6, + ALC272_DELL, + ALC272_DELL_ZM1, ALC662_AUTO, ALC662_MODEL_LAST, }; @@ -8742,10 +8744,9 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD), SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), - SND_PCI_QUIRK(0x1734, 0x1107, "FSC AMILO Xi2550", + SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx", ALC883_FUJITSU_PI2515), - SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515), - SND_PCI_QUIRK(0x1734, 0x113d, "Fujitsu AMILO Xa3530", + SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx", ALC888_FUJITSU_XA3530), SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), @@ -12977,10 +12978,17 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", ALC269_ASUS_EEEPC_P703), + SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_EEEPC_P703), + SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_EEEPC_P703), + SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_EEEPC_P703), + SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_EEEPC_P703), + SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_EEEPC_P703), + SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_EEEPC_P703), SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", ALC269_ASUS_EEEPC_P901), SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", ALC269_ASUS_EEEPC_P901), + SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_EEEPC_P901), SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), {} @@ -15211,12 +15219,23 @@ static hda_nid_t alc662_dac_nids[4] = { 0x02, 0x03, 0x04 }; +static hda_nid_t alc272_dac_nids[2] = { + 0x02, 0x03 +}; + static hda_nid_t alc662_adc_nids[1] = { /* ADC1-2 */ 0x09, }; +static hda_nid_t alc272_adc_nids[1] = { + /* ADC1-2 */ + 0x08, +}; + static hda_nid_t alc662_capsrc_nids[1] = { 0x22 }; +static hda_nid_t alc272_capsrc_nids[1] = { 0x23 }; + /* input MUX */ /* FIXME: should be a matrix-type input source selection */ @@ -15642,14 +15661,7 @@ static struct hda_verb alc662_init_verbs[] = { /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ /* Input mixer */ {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, /* always trun on EAPD */ {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, @@ -15844,12 +15856,48 @@ static struct hda_verb alc662_ecs_init_verbs[] = { {} }; +static struct hda_verb alc272_dell_zm1_init_verbs[] = { + {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, + {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, + {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, + {} +}; + +static struct hda_verb alc272_dell_init_verbs[] = { + {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, + {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, + {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, + {} +}; + static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), { } /* end */ }; +static struct snd_kcontrol_new alc272_auto_capture_mixer[] = { + HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), + { } /* end */ +}; + static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec) { unsigned int present; @@ -16361,6 +16409,8 @@ static const char *alc662_models[ALC662_MODEL_LAST] = { static struct snd_pci_quirk alc662_cfg_tbl[] = { SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS), + SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL), + SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1), SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3), SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3), @@ -16373,26 +16423,36 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6), SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6), SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2), + SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3), + SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA), + SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2), SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2), SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5), SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6), SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2), + SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2), SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2), SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA), /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/ SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3), SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3), + SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1), + SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1), + SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2), SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2), + SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3), + SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V), /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/ SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2), + SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA), SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4), SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG), @@ -16404,6 +16464,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", ALC662_3ST_6ch_DIG), SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), + SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0", ALC662_3ST_6ch_DIG), @@ -16641,6 +16702,36 @@ static struct alc_config_preset alc662_presets[] = { .unsol_event = alc663_mode6_unsol_event, .init_hook = alc663_mode6_inithook, }, + [ALC272_DELL] = { + .mixers = { alc663_m51va_mixer }, + .cap_mixer = alc272_auto_capture_mixer, + .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs }, + .num_dacs = ARRAY_SIZE(alc272_dac_nids), + .dac_nids = alc662_dac_nids, + .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), + .adc_nids = alc272_adc_nids, + .num_adc_nids = ARRAY_SIZE(alc272_adc_nids), + .capsrc_nids = alc272_capsrc_nids, + .channel_mode = alc662_3ST_2ch_modes, + .input_mux = &alc663_m51va_capture_source, + .unsol_event = alc663_m51va_unsol_event, + .init_hook = alc663_m51va_inithook, + }, + [ALC272_DELL_ZM1] = { + .mixers = { alc663_m51va_mixer }, + .cap_mixer = alc662_auto_capture_mixer, + .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs }, + .num_dacs = ARRAY_SIZE(alc272_dac_nids), + .dac_nids = alc662_dac_nids, + .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), + .adc_nids = alc662_adc_nids, + .num_adc_nids = ARRAY_SIZE(alc662_adc_nids), + .capsrc_nids = alc662_capsrc_nids, + .channel_mode = alc662_3ST_2ch_modes, + .input_mux = &alc663_m51va_capture_source, + .unsol_event = alc663_m51va_unsol_event, + .init_hook = alc663_m51va_inithook, + }, }; diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 61996a2f45d..917bc5d3ac2 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -3076,6 +3076,11 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs, unsigned int wid_caps; for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) { + if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) { + wid_caps = get_wcaps(codec, pins[i]); + if (wid_caps & AC_WCAP_UNSOL_CAP) + spec->hp_detect = 1; + } nid = dac_nids[i]; if (!nid) continue; @@ -3119,11 +3124,6 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs, err = create_controls_idx(codec, name, idx, nid, 3); if (err < 0) return err; - if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) { - wid_caps = get_wcaps(codec, pins[i]); - if (wid_caps & AC_WCAP_UNSOL_CAP) - spec->hp_detect = 1; - } } } return 0; @@ -3851,6 +3851,15 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask, AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ } +#ifdef CONFIG_SND_JACK +static void stac92xx_free_jack_priv(struct snd_jack *jack) +{ + struct sigmatel_jack *jacks = jack->private_data; + jacks->nid = 0; + jacks->jack = NULL; +} +#endif + static int stac92xx_add_jack(struct hda_codec *codec, hda_nid_t nid, int type) { @@ -3860,6 +3869,7 @@ static int stac92xx_add_jack(struct hda_codec *codec, int def_conf = snd_hda_codec_get_pincfg(codec, nid); int connectivity = get_defcfg_connect(def_conf); char name[32]; + int err; if (connectivity && connectivity != AC_JACK_PORT_FIXED) return 0; @@ -3876,10 +3886,15 @@ static int stac92xx_add_jack(struct hda_codec *codec, snd_hda_get_jack_connectivity(def_conf), snd_hda_get_jack_location(def_conf)); - return snd_jack_new(codec->bus->card, name, type, &jack->jack); -#else - return 0; + err = snd_jack_new(codec->bus->card, name, type, &jack->jack); + if (err < 0) { + jack->nid = 0; + return err; + } + jack->jack->private_data = jack; + jack->jack->private_free = stac92xx_free_jack_priv; #endif + return 0; } static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid, @@ -4138,8 +4153,10 @@ static void stac92xx_free_jacks(struct hda_codec *codec) if (!codec->bus->shutdown && spec->jacks.list) { struct sigmatel_jack *jacks = spec->jacks.list; int i; - for (i = 0; i < spec->jacks.used; i++) - snd_device_free(codec->bus->card, &jacks[i].jack); + for (i = 0; i < spec->jacks.used; i++, jacks++) { + if (jacks->jack) + snd_device_free(codec->bus->card, jacks->jack); + } } snd_array_free(&spec->jacks); #endif diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 57648810eaf..173bebf9f51 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c @@ -355,6 +355,9 @@ struct ichdev { unsigned int fragsize1; unsigned int position; unsigned int pos_shift; + unsigned int last_pos; + unsigned long last_pos_jiffies; + unsigned int jiffy_to_bytes; int frags; int lvi; int lvi_frag; @@ -838,7 +841,10 @@ static int snd_intel8x0_pcm_trigger(struct snd_pcm_substream *substream, int cmd ichdev->suspended = 0; /* fallthru */ case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: val = ICH_IOCE | ICH_STARTBM; + ichdev->last_pos = ichdev->position; + ichdev->last_pos_jiffies = jiffies; break; case SNDRV_PCM_TRIGGER_SUSPEND: ichdev->suspended = 1; @@ -849,9 +855,6 @@ static int snd_intel8x0_pcm_trigger(struct snd_pcm_substream *substream, int cmd case SNDRV_PCM_TRIGGER_PAUSE_PUSH: val = ICH_IOCE; break; - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - val = ICH_IOCE | ICH_STARTBM; - break; default: return -EINVAL; } @@ -1045,6 +1048,7 @@ static int snd_intel8x0_pcm_prepare(struct snd_pcm_substream *substream) ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1; } snd_intel8x0_setup_periods(chip, ichdev); + ichdev->jiffy_to_bytes = (runtime->rate * 4 * ichdev->pos_shift) / HZ; return 0; } @@ -1053,7 +1057,7 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs struct intel8x0 *chip = snd_pcm_substream_chip(substream); struct ichdev *ichdev = get_ichdev(substream); size_t ptr1, ptr; - int civ, timeout = 100; + int civ, timeout = 10; unsigned int position; spin_lock(&chip->reg_lock); @@ -1069,9 +1073,19 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) break; } while (timeout--); - ptr1 <<= ichdev->pos_shift; - ptr = ichdev->fragsize1 - ptr1; - ptr += position; + if (ptr1 != 0) { + ptr1 <<= ichdev->pos_shift; + ptr = ichdev->fragsize1 - ptr1; + ptr += position; + ichdev->last_pos = ptr; + ichdev->last_pos_jiffies = jiffies; + } else { + ptr1 = jiffies - ichdev->last_pos_jiffies; + if (ptr1) + ptr1 -= 1; + ptr = ichdev->last_pos + ptr1 * ichdev->jiffy_to_bytes; + ptr %= ichdev->size; + } spin_unlock(&chip->reg_lock); if (ptr >= ichdev->size) return 0; @@ -1840,6 +1854,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { }, { .subvendor = 0x1028, + .subdevice = 0x016a, + .name = "Dell Inspiron 8600", /* STAC9750/51 */ + .type = AC97_TUNE_HP_ONLY + }, + { + .subvendor = 0x1028, .subdevice = 0x0186, .name = "Dell Latitude D810", /* cf. Malone #41015 */ .type = AC97_TUNE_HP_MUTE_LED @@ -1882,12 +1902,6 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { }, { .subvendor = 0x103c, - .subdevice = 0x0934, - .name = "HP nx8220", - .type = AC97_TUNE_MUTE_LED - }, - { - .subvendor = 0x103c, .subdevice = 0x129d, .name = "HP xw8000", .type = AC97_TUNE_HP_ONLY @@ -2661,12 +2675,14 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) struct snd_pcm_substream *subs; struct ichdev *ichdev; unsigned long port; - unsigned long pos, t; - struct timeval start_time, stop_time; + unsigned long pos, pos1, t; + int civ, timeout = 1000, attempt = 1; + struct timespec start_time, stop_time; if (chip->ac97_bus->clock != 48000) return; /* specified in module option */ + __again: subs = chip->pcm[0]->streams[0].substream; if (! subs || subs->dma_buffer.bytes < INTEL8X0_TESTBUF_SIZE) { snd_printk(KERN_WARNING "no playback buffer allocated - aborting measure ac97 clock\n"); @@ -2674,7 +2690,7 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) } ichdev = &chip->ichd[ICHD_PCMOUT]; ichdev->physbuf = subs->dma_buffer.addr; - ichdev->size = chip->ichd[ICHD_PCMOUT].fragsize = INTEL8X0_TESTBUF_SIZE; + ichdev->size = ichdev->fragsize = INTEL8X0_TESTBUF_SIZE; ichdev->substream = NULL; /* don't process interrupts */ /* set rate */ @@ -2693,16 +2709,31 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) iputbyte(chip, port + ICH_REG_OFF_CR, ICH_IOCE); iputdword(chip, ICHREG(ALI_DMACR), 1 << ichdev->ali_slot); } - do_gettimeofday(&start_time); + do_posix_clock_monotonic_gettime(&start_time); spin_unlock_irq(&chip->reg_lock); msleep(50); spin_lock_irq(&chip->reg_lock); /* check the position */ - pos = ichdev->fragsize1; - pos -= igetword(chip, ichdev->reg_offset + ichdev->roff_picb) << ichdev->pos_shift; - pos += ichdev->position; + do { + civ = igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV); + pos1 = igetword(chip, ichdev->reg_offset + ichdev->roff_picb); + if (pos1 == 0) { + udelay(10); + continue; + } + if (civ == igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV) && + pos1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) + break; + } while (timeout--); + if (pos1 == 0) { /* oops, this value is not reliable */ + pos = 0; + } else { + pos = ichdev->fragsize1; + pos -= pos1 << ichdev->pos_shift; + pos += ichdev->position; + } chip->in_measurement = 0; - do_gettimeofday(&stop_time); + do_posix_clock_monotonic_gettime(&stop_time); /* stop */ if (chip->device_type == DEVICE_ALI) { iputdword(chip, ICHREG(ALI_DMACR), 1 << (ichdev->ali_slot + 16)); @@ -2717,22 +2748,42 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) iputbyte(chip, port + ICH_REG_OFF_CR, ICH_RESETREGS); spin_unlock_irq(&chip->reg_lock); + if (pos == 0) { + snd_printk(KERN_ERR "intel8x0: measure - unreliable DMA position..\n"); + __retry: + if (attempt < 3) { + msleep(300); + attempt++; + goto __again; + } + goto __end; + } + + pos /= 4; t = stop_time.tv_sec - start_time.tv_sec; t *= 1000000; - t += stop_time.tv_usec - start_time.tv_usec; - printk(KERN_INFO "%s: measured %lu usecs\n", __func__, t); + t += (stop_time.tv_nsec - start_time.tv_nsec) / 1000; + printk(KERN_INFO "%s: measured %lu usecs (%lu samples)\n", __func__, t, pos); if (t == 0) { - snd_printk(KERN_ERR "?? calculation error..\n"); - return; + snd_printk(KERN_ERR "intel8x0: ?? calculation error..\n"); + goto __retry; } - pos = (pos / 4) * 1000; + pos *= 1000; pos = (pos / t) * 1000 + ((pos % t) * 1000) / t; - if (pos < 40000 || pos >= 60000) + if (pos < 40000 || pos >= 60000) { /* abnormal value. hw problem? */ printk(KERN_INFO "intel8x0: measured clock %ld rejected\n", pos); + goto __retry; + } else if (pos > 40500 && pos < 41500) + /* first exception - 41000Hz reference clock */ + chip->ac97_bus->clock = 41000; + else if (pos > 43600 && pos < 44600) + /* second exception - 44100HZ reference clock */ + chip->ac97_bus->clock = 44100; else if (pos < 47500 || pos > 48500) /* not 48000Hz, tuning the clock.. */ chip->ac97_bus->clock = (chip->ac97_bus->clock * 48000) / pos; + __end: printk(KERN_INFO "intel8x0: clocking to %d\n", chip->ac97_bus->clock); snd_ac97_update_power(chip->ac97[0], AC97_PCM_FRONT_DAC_RATE, 0); } diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index 6ff99ed7751..a5afb2682e7 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c @@ -33,26 +33,25 @@ static struct pmac_keywest *keywest_ctx; -static int keywest_attach_adapter(struct i2c_adapter *adapter); -static int keywest_detach_client(struct i2c_client *client); - -struct i2c_driver keywest_driver = { - .driver = { - .name = "PMac Keywest Audio", - }, - .attach_adapter = &keywest_attach_adapter, - .detach_client = &keywest_detach_client, -}; - - #ifndef i2c_device_name #define i2c_device_name(x) ((x)->name) #endif +static int keywest_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + i2c_set_clientdata(client, keywest_ctx); + return 0; +} + +/* + * This is kind of a hack, best would be to turn powermac to fixed i2c + * bus numbers and declare the sound device as part of platform + * initialization + */ static int keywest_attach_adapter(struct i2c_adapter *adapter) { - int err; - struct i2c_client *new_client; + struct i2c_board_info info; if (! keywest_ctx) return -EINVAL; @@ -60,46 +59,47 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) if (strncmp(i2c_device_name(adapter), "mac-io", 6)) return 0; /* ignored */ - new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); - if (! new_client) - return -ENOMEM; - - new_client->addr = keywest_ctx->addr; - i2c_set_clientdata(new_client, keywest_ctx); - new_client->adapter = adapter; - new_client->driver = &keywest_driver; - new_client->flags = 0; - - strcpy(i2c_device_name(new_client), keywest_ctx->name); - keywest_ctx->client = new_client; + memset(&info, 0, sizeof(struct i2c_board_info)); + strlcpy(info.type, "keywest", I2C_NAME_SIZE); + info.addr = keywest_ctx->addr; + keywest_ctx->client = i2c_new_device(adapter, &info); - /* Tell the i2c layer a new client has arrived */ - if (i2c_attach_client(new_client)) { - snd_printk(KERN_ERR "tumbler: cannot attach i2c client\n"); - err = -ENODEV; - goto __err; - } - + /* + * Let i2c-core delete that device on driver removal. + * This is safe because i2c-core holds the core_lock mutex for us. + */ + list_add_tail(&keywest_ctx->client->detected, + &keywest_ctx->client->driver->clients); return 0; - - __err: - kfree(new_client); - keywest_ctx->client = NULL; - return err; } -static int keywest_detach_client(struct i2c_client *client) +static int keywest_remove(struct i2c_client *client) { + i2c_set_clientdata(client, NULL); if (! keywest_ctx) return 0; if (client == keywest_ctx->client) keywest_ctx->client = NULL; - i2c_detach_client(client); - kfree(client); return 0; } + +static const struct i2c_device_id keywest_i2c_id[] = { + { "keywest", 0 }, + { } +}; + +struct i2c_driver keywest_driver = { + .driver = { + .name = "PMac Keywest Audio", + }, + .attach_adapter = keywest_attach_adapter, + .probe = keywest_probe, + .remove = keywest_remove, + .id_table = keywest_i2c_id, +}; + /* exported */ void snd_pmac_keywest_cleanup(struct pmac_keywest *i2c) { diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index 030d2454725..f2653803ede 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -56,7 +56,6 @@ obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o obj-$(CONFIG_SND_SOC_WM8971) += snd-soc-wm8971.o obj-$(CONFIG_SND_SOC_WM8990) += snd-soc-wm8990.o -obj-$(CONFIG_SND_SOC_WM8991) += snd-soc-wm8991.o obj-$(CONFIG_SND_SOC_WM9705) += snd-soc-wm9705.o obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index 442ea6f160f..9f6be3d31ac 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -268,9 +268,11 @@ static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1); static int wm8580_out_vu(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - int reg = kcontrol->private_value & 0xff; - int reg2 = (kcontrol->private_value >> 24) & 0xff; + unsigned int reg = mc->reg; + unsigned int reg2 = mc->rreg; int ret; u16 val; @@ -292,15 +294,17 @@ static int wm8580_out_vu(struct snd_kcontrol *kcontrol, return 0; } -#define SOC_WM8580_OUT_DOUBLE_R_TLV(xname, reg_left, reg_right, shift, max, invert, tlv_array) \ +#define SOC_WM8580_OUT_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, \ + xinvert, tlv_array) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ SNDRV_CTL_ELEM_ACCESS_READWRITE, \ .tlv.p = (tlv_array), \ .info = snd_soc_info_volsw_2r, \ .get = snd_soc_get_volsw_2r, .put = wm8580_out_vu, \ - .private_value = (reg_left) | ((shift) << 8) | \ - ((max) << 12) | ((invert) << 20) | ((reg_right) << 24) } + .private_value = (unsigned long)&(struct soc_mixer_control) \ + {.reg = reg_left, .rreg = reg_right, .shift = xshift, \ + .max = xmax, .invert = xinvert} } static const struct snd_kcontrol_new wm8580_snd_controls[] = { SOC_WM8580_OUT_DOUBLE_R_TLV("DAC1 Playback Volume", @@ -522,7 +526,7 @@ static int wm8580_set_dai_pll(struct snd_soc_dai *codec_dai, reg = wm8580_read(codec, WM8580_PLLA4 + offset); reg &= ~0x3f; reg |= pll_div.prescale | pll_div.postscale << 1 | - pll_div.freqmode << 4; + pll_div.freqmode << 3; wm8580_write(codec, WM8580_PLLA4 + offset, reg); diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c index 6e23a81dba7..c2d1a7a18fa 100644 --- a/sound/soc/codecs/wm9705.c +++ b/sound/soc/codecs/wm9705.c @@ -318,7 +318,7 @@ static int wm9705_reset(struct snd_soc_codec *codec) } #ifdef CONFIG_PM -static int wm9705_soc_suspend(struct platform_device *pdev) +static int wm9705_soc_suspend(struct platform_device *pdev, pm_message_t msg) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec = socdev->card->codec; diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c index a6d1178ce12..91ef17992de 100644 --- a/sound/soc/omap/n810.c +++ b/sound/soc/omap/n810.c @@ -3,7 +3,7 @@ * * Copyright (C) 2008 Nokia Corporation * - * Contact: Jarkko Nikula <jarkko.nikula@nokia.com> + * Contact: Jarkko Nikula <jhnikula@gmail.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -417,6 +417,6 @@ static void __exit n810_soc_exit(void) module_init(n810_soc_init); module_exit(n810_soc_exit); -MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@nokia.com>"); +MODULE_AUTHOR("Jarkko Nikula <jhnikula@gmail.com>"); MODULE_DESCRIPTION("ALSA SoC Nokia N810"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 9c09b94f0cf..91261428384 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -3,7 +3,8 @@ * * Copyright (C) 2008 Nokia Corporation * - * Contact: Jarkko Nikula <jarkko.nikula@nokia.com> + * Contact: Jarkko Nikula <jhnikula@gmail.com> + * Peter Ujfalusi <peter.ujfalusi@nokia.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -283,7 +284,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, break; case SND_SOC_DAIFMT_DSP_B: regs->srgr2 |= FPER(wlen * channels - 1); - regs->srgr1 |= FWID(wlen * channels - 2); + regs->srgr1 |= FWID(0); break; } @@ -302,6 +303,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, { struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; + unsigned int temp_fmt = fmt; if (mcbsp_data->configured) return 0; @@ -328,6 +330,8 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, /* 0-bit data delay */ regs->rcr2 |= RDATDLY(0); regs->xcr2 |= XDATDLY(0); + /* Invert FS polarity configuration */ + temp_fmt ^= SND_SOC_DAIFMT_NB_IF; break; default: /* Unsupported data format */ @@ -351,7 +355,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, } /* Set bit clock (CLKX/CLKR) and FS polarities */ - switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + switch (temp_fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: /* * Normal BCLK + FS. @@ -529,6 +533,6 @@ static void __exit snd_omap_mcbsp_exit(void) } module_exit(snd_omap_mcbsp_exit); -MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@nokia.com>"); +MODULE_AUTHOR("Jarkko Nikula <jhnikula@gmail.com>"); MODULE_DESCRIPTION("OMAP I2S SoC Interface"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/omap/omap-mcbsp.h b/sound/soc/omap/omap-mcbsp.h index df7ad13ba73..c8147aace81 100644 --- a/sound/soc/omap/omap-mcbsp.h +++ b/sound/soc/omap/omap-mcbsp.h @@ -3,7 +3,8 @@ * * Copyright (C) 2008 Nokia Corporation * - * Contact: Jarkko Nikula <jarkko.nikula@nokia.com> + * Contact: Jarkko Nikula <jhnikula@gmail.com> + * Peter Ujfalusi <peter.ujfalusi@nokia.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index 1bdbb042718..07cf7f46b58 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c @@ -3,7 +3,8 @@ * * Copyright (C) 2008 Nokia Corporation * - * Contact: Jarkko Nikula <jarkko.nikula@nokia.com> + * Contact: Jarkko Nikula <jhnikula@gmail.com> + * Peter Ujfalusi <peter.ujfalusi@nokia.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -367,6 +368,6 @@ static void __exit omap_soc_platform_exit(void) } module_exit(omap_soc_platform_exit); -MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@nokia.com>"); +MODULE_AUTHOR("Jarkko Nikula <jhnikula@gmail.com>"); MODULE_DESCRIPTION("OMAP PCM DMA module"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/omap/omap-pcm.h b/sound/soc/omap/omap-pcm.h index e4369bdfd77..8d9d26916b0 100644 --- a/sound/soc/omap/omap-pcm.h +++ b/sound/soc/omap/omap-pcm.h @@ -3,7 +3,8 @@ * * Copyright (C) 2008 Nokia Corporation * - * Contact: Jarkko Nikula <jarkko.nikula@nokia.com> + * Contact: Jarkko Nikula <jhnikula@gmail.com> + * Peter Ujfalusi <peter.ujfalusi@nokia.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/sound/soc/omap/osk5912.c b/sound/soc/omap/osk5912.c index a952a4eb336..a4e149b7f0e 100644 --- a/sound/soc/omap/osk5912.c +++ b/sound/soc/omap/osk5912.c @@ -62,7 +62,7 @@ static int osk_hw_params(struct snd_pcm_substream *substream, /* Set codec DAI configuration */ err = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_DSP_B | - SND_SOC_DAIFMT_NB_IF | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); if (err < 0) { printk(KERN_ERR "can't set codec DAI configuration\n"); @@ -72,7 +72,7 @@ static int osk_hw_params(struct snd_pcm_substream *substream, /* Set cpu DAI configuration */ err = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_DSP_B | - SND_SOC_DAIFMT_NB_IF | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); if (err < 0) { printk(KERN_ERR "can't set cpu DAI configuration\n"); diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c index f7c4544f785..0625c342a1c 100644 --- a/sound/soc/pxa/magician.c +++ b/sound/soc/pxa/magician.c @@ -27,8 +27,6 @@ #include <sound/soc.h> #include <sound/soc-dapm.h> -#include <mach/pxa-regs.h> -#include <mach/hardware.h> #include <mach/magician.h> #include <asm/mach-types.h> #include "../codecs/uda1380.h" diff --git a/sound/soc/pxa/palm27x.c b/sound/soc/pxa/palm27x.c index 48a73f64500..44fcc4e01e0 100644 --- a/sound/soc/pxa/palm27x.c +++ b/sound/soc/pxa/palm27x.c @@ -200,7 +200,7 @@ static struct snd_soc_device palm27x_snd_devdata = { static struct platform_device *palm27x_snd_device; -static int __init palm27x_asoc_init(void) +static int palm27x_asoc_probe(struct platform_device *pdev) { int ret; @@ -208,6 +208,10 @@ static int __init palm27x_asoc_init(void) machine_is_palmld())) return -ENODEV; + if (pdev->dev.platform_data) + palm27x_ep_gpio = ((struct palm27x_asoc_info *) + (pdev->dev.platform_data))->jack_gpio; + ret = gpio_request(palm27x_ep_gpio, "Headphone Jack"); if (ret) return ret; @@ -245,16 +249,31 @@ err_alloc: return ret; } -static void __exit palm27x_asoc_exit(void) +static int __devexit palm27x_asoc_remove(struct platform_device *pdev) { free_irq(gpio_to_irq(palm27x_ep_gpio), NULL); gpio_free(palm27x_ep_gpio); platform_device_unregister(palm27x_snd_device); + return 0; } -void __init palm27x_asoc_set_pdata(struct palm27x_asoc_info *data) +static struct platform_driver palm27x_wm9712_driver = { + .probe = palm27x_asoc_probe, + .remove = __devexit_p(palm27x_asoc_remove), + .driver = { + .name = "palm27x-asoc", + .owner = THIS_MODULE, + }, +}; + +static int __init palm27x_asoc_init(void) +{ + return platform_driver_register(&palm27x_wm9712_driver); +} + +static void __exit palm27x_asoc_exit(void) { - palm27x_ep_gpio = data->jack_gpio; + platform_driver_unregister(&palm27x_wm9712_driver); } module_init(palm27x_asoc_init); diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index 308a657928d..286be31545d 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c @@ -280,12 +280,33 @@ static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai) * ssp_set_clkdiv - set SSP clock divider * @div: serial clock rate divider */ -static void ssp_set_scr(struct ssp_dev *dev, u32 div) +static void ssp_set_scr(struct ssp_device *ssp, u32 div) { - struct ssp_device *ssp = dev->ssp; - u32 sscr0 = ssp_read_reg(dev->ssp, SSCR0) & ~SSCR0_SCR; + u32 sscr0 = ssp_read_reg(ssp, SSCR0); + + if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) { + sscr0 &= ~0x0000ff00; + sscr0 |= ((div - 2)/2) << 8; /* 2..512 */ + } else { + sscr0 &= ~0x000fff00; + sscr0 |= (div - 1) << 8; /* 1..4096 */ + } + ssp_write_reg(ssp, SSCR0, sscr0); +} + +/** + * ssp_get_clkdiv - get SSP clock divider + */ +static u32 ssp_get_scr(struct ssp_device *ssp) +{ + u32 sscr0 = ssp_read_reg(ssp, SSCR0); + u32 div; - ssp_write_reg(ssp, SSCR0, (sscr0 | SSCR0_SerClkDiv(div))); + if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) + div = ((sscr0 >> 8) & 0xff) * 2 + 2; + else + div = ((sscr0 >> 8) & 0xfff) + 1; + return div; } /* @@ -326,7 +347,7 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai, break; case PXA_SSP_CLK_AUDIO: priv->sysclk = 0; - ssp_set_scr(&priv->dev, 1); + ssp_set_scr(ssp, 1); sscr0 |= SSCR0_ACS; break; default: @@ -387,7 +408,7 @@ static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, ssp_write_reg(ssp, SSACD, val); break; case PXA_SSP_DIV_SCR: - ssp_set_scr(&priv->dev, div); + ssp_set_scr(ssp, div); break; default: return -ENODEV; @@ -674,8 +695,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, case SND_SOC_DAIFMT_I2S: sspsp = ssp_read_reg(ssp, SSPSP); - if (((sscr0 & SSCR0_SCR) == SSCR0_SerClkDiv(4)) && - (width == 16)) { + if ((ssp_get_scr(ssp) == 4) && (width == 16)) { /* This is a special case where the bitclk is 64fs * and we're not dealing with 2*32 bits of audio * samples. @@ -806,6 +826,7 @@ static int pxa_ssp_probe(struct platform_device *pdev, goto err_priv; } + priv->dai_fmt = (unsigned int) -1; dai->private_data = priv; return 0; diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig index 2f3a21eee05..df494d1e346 100644 --- a/sound/soc/s3c24xx/Kconfig +++ b/sound/soc/s3c24xx/Kconfig @@ -1,10 +1,10 @@ config SND_S3C24XX_SOC tristate "SoC Audio for the Samsung S3CXXXX chips" - depends on ARCH_S3C2410 || ARCH_S3C64XX + depends on ARCH_S3C2410 help Say Y or M if you want to add support for codecs attached to - the S3C24XX and S3C64XX AC97, I2S or SSP interface. You will - also need to select the audio interfaces to support below. + the S3C24XX AC97 or I2S interfaces. You will also need to + select the audio interfaces to support below. config SND_S3C24XX_SOC_I2S tristate diff --git a/sound/soc/s3c24xx/jive_wm8750.c b/sound/soc/s3c24xx/jive_wm8750.c index 32063790d95..93e6c87b739 100644 --- a/sound/soc/s3c24xx/jive_wm8750.c +++ b/sound/soc/s3c24xx/jive_wm8750.c @@ -69,8 +69,8 @@ static int jive_hw_params(struct snd_pcm_substream *substream, break; } - s3c_i2sv2_calc_rate(&div, NULL, params_rate(params), - s3c2412_get_iisclk()); + s3c_i2sv2_iis_calc_rate(&div, NULL, params_rate(params), + s3c2412_get_iisclk()); /* set codec DAI configuration */ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | @@ -145,8 +145,9 @@ static struct snd_soc_dai_link jive_dai = { }; /* jive audio machine driver */ -static struct snd_soc_machine snd_soc_machine_jive = { +static struct snd_soc_card snd_soc_machine_jive = { .name = "Jive", + .platform = &s3c24xx_soc_platform, .dai_link = &jive_dai, .num_links = 1, }; @@ -157,9 +158,8 @@ static struct wm8750_setup_data jive_wm8750_setup = { /* jive audio subsystem */ static struct snd_soc_device jive_snd_devdata = { - .machine = &snd_soc_machine_jive, - .platform = &s3c24xx_soc_platform, - .codec_dev = &soc_codec_dev_wm8750_spi, + .card = &snd_soc_machine_jive, + .codec_dev = &soc_codec_dev_wm8750, .codec_data = &jive_wm8750_setup, }; diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c index 295a4c91026..ab680aac3fc 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.c +++ b/sound/soc/s3c24xx/s3c-i2s-v2.c @@ -473,9 +473,9 @@ static int s3c2412_i2s_set_clkdiv(struct snd_soc_dai *cpu_dai, /* default table of all avaialable root fs divisors */ static unsigned int iis_fs_tab[] = { 256, 512, 384, 768 }; -int s3c2412_iis_calc_rate(struct s3c_i2sv2_rate_calc *info, - unsigned int *fstab, - unsigned int rate, struct clk *clk) +int s3c_i2sv2_iis_calc_rate(struct s3c_i2sv2_rate_calc *info, + unsigned int *fstab, + unsigned int rate, struct clk *clk) { unsigned long clkrate = clk_get_rate(clk); unsigned int div; @@ -531,7 +531,7 @@ int s3c2412_iis_calc_rate(struct s3c_i2sv2_rate_calc *info, return 0; } -EXPORT_SYMBOL_GPL(s3c2412_iis_calc_rate); +EXPORT_SYMBOL_GPL(s3c_i2sv2_iis_calc_rate); int s3c_i2sv2_probe(struct platform_device *pdev, struct snd_soc_dai *dai, @@ -624,15 +624,18 @@ static int s3c2412_i2s_resume(struct snd_soc_dai *dai) int s3c_i2sv2_register_dai(struct snd_soc_dai *dai) { - dai->ops.trigger = s3c2412_i2s_trigger; - dai->ops.hw_params = s3c2412_i2s_hw_params; - dai->ops.set_fmt = s3c2412_i2s_set_fmt; - dai->ops.set_clkdiv = s3c2412_i2s_set_clkdiv; + struct snd_soc_dai_ops *ops = dai->ops; + + ops->trigger = s3c2412_i2s_trigger; + ops->hw_params = s3c2412_i2s_hw_params; + ops->set_fmt = s3c2412_i2s_set_fmt; + ops->set_clkdiv = s3c2412_i2s_set_clkdiv; dai->suspend = s3c2412_i2s_suspend; dai->resume = s3c2412_i2s_resume; return snd_soc_register_dai(dai); } - EXPORT_SYMBOL_GPL(s3c_i2sv2_register_dai); + +MODULE_LICENSE("GPL"); diff --git a/sound/soc/s3c24xx/s3c2412-i2s.c b/sound/soc/s3c24xx/s3c2412-i2s.c index 1ca3cdaa821..b7e0b3f0bfc 100644 --- a/sound/soc/s3c24xx/s3c2412-i2s.c +++ b/sound/soc/s3c24xx/s3c2412-i2s.c @@ -33,8 +33,8 @@ #include <plat/regs-s3c2412-iis.h> -#include <plat/regs-gpio.h> #include <plat/audio.h> +#include <mach/regs-gpio.h> #include <mach/dma.h> #include "s3c24xx-pcm.h" diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index 7d93fa705cc..8d13d933087 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -703,7 +703,7 @@ static int snd_cs4231_timer_stop(struct snd_timer *timer) return 0; } -static void __init snd_cs4231_init(struct snd_cs4231 *chip) +static void __devinit snd_cs4231_init(struct snd_cs4231 *chip) { unsigned long flags; @@ -1020,7 +1020,7 @@ static snd_pcm_uframes_t snd_cs4231_capture_pointer( return bytes_to_frames(substream->runtime, ptr); } -static int __init snd_cs4231_probe(struct snd_cs4231 *chip) +static int __devinit snd_cs4231_probe(struct snd_cs4231 *chip) { unsigned long flags; int i; @@ -1219,7 +1219,7 @@ static struct snd_pcm_ops snd_cs4231_capture_ops = { .pointer = snd_cs4231_capture_pointer, }; -static int __init snd_cs4231_pcm(struct snd_card *card) +static int __devinit snd_cs4231_pcm(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; struct snd_pcm *pcm; @@ -1248,7 +1248,7 @@ static int __init snd_cs4231_pcm(struct snd_card *card) return 0; } -static int __init snd_cs4231_timer(struct snd_card *card) +static int __devinit snd_cs4231_timer(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; struct snd_timer *timer; @@ -1499,7 +1499,7 @@ static int snd_cs4231_put_double(struct snd_kcontrol *kcontrol, .private_value = (left_reg) | ((right_reg) << 8) | ((shift_left) << 16) | \ ((shift_right) << 19) | ((mask) << 24) | ((invert) << 22) } -static struct snd_kcontrol_new snd_cs4231_controls[] __initdata = { +static struct snd_kcontrol_new snd_cs4231_controls[] __devinitdata = { CS4231_DOUBLE("PCM Playback Switch", 0, CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 7, 7, 1, 1), CS4231_DOUBLE("PCM Playback Volume", 0, CS4231_LEFT_OUTPUT, @@ -1538,7 +1538,7 @@ CS4231_SINGLE("Line Out Switch", 0, CS4231_PIN_CTRL, 6, 1, 1), CS4231_SINGLE("Headphone Out Switch", 0, CS4231_PIN_CTRL, 7, 1, 1) }; -static int __init snd_cs4231_mixer(struct snd_card *card) +static int __devinit snd_cs4231_mixer(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; int err, idx; @@ -1559,7 +1559,7 @@ static int __init snd_cs4231_mixer(struct snd_card *card) static int dev; -static int __init cs4231_attach_begin(struct snd_card **rcard) +static int __devinit cs4231_attach_begin(struct snd_card **rcard) { struct snd_card *card; struct snd_cs4231 *chip; @@ -1590,7 +1590,7 @@ static int __init cs4231_attach_begin(struct snd_card **rcard) return 0; } -static int __init cs4231_attach_finish(struct snd_card *card) +static int __devinit cs4231_attach_finish(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; int err; @@ -1794,9 +1794,9 @@ static struct snd_device_ops snd_cs4231_sbus_dev_ops = { .dev_free = snd_cs4231_sbus_dev_free, }; -static int __init snd_cs4231_sbus_create(struct snd_card *card, - struct of_device *op, - int dev) +static int __devinit snd_cs4231_sbus_create(struct snd_card *card, + struct of_device *op, + int dev) { struct snd_cs4231 *chip = card->private_data; int err; @@ -1960,9 +1960,9 @@ static struct snd_device_ops snd_cs4231_ebus_dev_ops = { .dev_free = snd_cs4231_ebus_dev_free, }; -static int __init snd_cs4231_ebus_create(struct snd_card *card, - struct of_device *op, - int dev) +static int __devinit snd_cs4231_ebus_create(struct snd_card *card, + struct of_device *op, + int dev) { struct snd_cs4231 *chip = card->private_data; int err; diff --git a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c index 98276aafefe..a5aae9d67f3 100644 --- a/sound/usb/usx2y/us122l.c +++ b/sound/usb/usx2y/us122l.c @@ -349,14 +349,10 @@ static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, if (cmd != SNDRV_USB_STREAM_IOCTL_SET_PARAMS) return -ENOTTY; - cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); - if (!cfg) - return -ENOMEM; + cfg = memdup_user((void *)arg, sizeof(*cfg)); + if (IS_ERR(cfg)) + return PTR_ERR(cfg); - if (copy_from_user(cfg, (void *)arg, sizeof(*cfg))) { - err = -EFAULT; - goto free; - } if (cfg->version != USB_STREAM_INTERFACE_VERSION) { err = -ENXIO; goto free; @@ -478,6 +474,14 @@ static bool us122l_create_card(struct snd_card *card) return true; } +static void snd_us122l_free(struct snd_card *card) +{ + struct us122l *us122l = US122L(card); + int index = us122l->chip.index; + if (index >= 0 && index < SNDRV_CARDS) + snd_us122l_card_used[index] = 0; +} + static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp) { int dev; @@ -494,7 +498,7 @@ static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp) if (err < 0) return err; snd_us122l_card_used[US122L(card)->chip.index = dev] = 1; - + card->private_free = snd_us122l_free; US122L(card)->chip.dev = device; US122L(card)->chip.card = card; mutex_init(&US122L(card)->mutex); @@ -588,7 +592,7 @@ static void snd_us122l_disconnect(struct usb_interface *intf) } usb_put_intf(intf); - usb_put_dev(US122L(card)->chip.dev); + usb_put_dev(us122l->chip.dev); while (atomic_read(&us122l->mmap_count)) msleep(500); diff --git a/sound/usb/usx2y/usX2Yhwdep.c b/sound/usb/usx2y/usX2Yhwdep.c index 4af8740db71..f3d8f71265d 100644 --- a/sound/usb/usx2y/usX2Yhwdep.c +++ b/sound/usb/usx2y/usX2Yhwdep.c @@ -203,13 +203,12 @@ static int snd_usX2Y_hwdep_dsp_load(struct snd_hwdep *hw, if (access_ok(VERIFY_READ, dsp->image, dsp->length)) { struct usb_device* dev = priv->chip.dev; - char *buf = kmalloc(dsp->length, GFP_KERNEL); - if (!buf) - return -ENOMEM; - if (copy_from_user(buf, dsp->image, dsp->length)) { - kfree(buf); - return -EFAULT; - } + char *buf; + + buf = memdup_user(dsp->image, dsp->length); + if (IS_ERR(buf)) + return PTR_ERR(buf); + err = usb_set_interface(dev, 0, 1); if (err) snd_printk(KERN_ERR "usb_set_interface error \n"); diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c index 24393dafcb6..12ae0340adc 100644 --- a/sound/usb/usx2y/usb_stream.c +++ b/sound/usb/usx2y/usb_stream.c @@ -33,32 +33,26 @@ static unsigned usb_stream_next_packet_size(struct usb_stream_kernel *sk) static void playback_prep_freqn(struct usb_stream_kernel *sk, struct urb *urb) { struct usb_stream *s = sk->s; - unsigned l = 0; - int pack; - - urb->iso_frame_desc[0].offset = 0; - urb->iso_frame_desc[0].length = usb_stream_next_packet_size(sk); - sk->out_phase = sk->out_phase_peeked; - urb->transfer_buffer_length = urb->iso_frame_desc[0].length; - - for (pack = 1; pack < sk->n_o_ps; pack++) { - l = usb_stream_next_packet_size(sk); - if (s->idle_outsize + urb->transfer_buffer_length + l > - s->period_size) + int pack, lb = 0; + + for (pack = 0; pack < sk->n_o_ps; pack++) { + int l = usb_stream_next_packet_size(sk); + if (s->idle_outsize + lb + l > s->period_size) goto check; sk->out_phase = sk->out_phase_peeked; - urb->iso_frame_desc[pack].offset = urb->transfer_buffer_length; + urb->iso_frame_desc[pack].offset = lb; urb->iso_frame_desc[pack].length = l; - urb->transfer_buffer_length += l; + lb += l; } - snd_printdd(KERN_DEBUG "%i\n", urb->transfer_buffer_length); + snd_printdd(KERN_DEBUG "%i\n", lb); check: urb->number_of_packets = pack; - s->idle_outsize += urb->transfer_buffer_length - s->period_size; + urb->transfer_buffer_length = lb; + s->idle_outsize += lb - s->period_size; snd_printdd(KERN_DEBUG "idle=%i ul=%i ps=%i\n", s->idle_outsize, - urb->transfer_buffer_length, s->period_size); + lb, s->period_size); } static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, @@ -282,21 +276,20 @@ static int usb_stream_prepare_playback(struct usb_stream_kernel *sk, struct usb_stream *s = sk->s; struct urb *io; struct usb_iso_packet_descriptor *id, *od; - int p, l = 0; + int p = 0, lb = 0, l = 0; io = sk->idle_outurb; od = io->iso_frame_desc; - io->transfer_buffer_length = 0; - for (p = 0; s->sync_packet < 0; ++p, ++s->sync_packet) { + for (; s->sync_packet < 0; ++p, ++s->sync_packet) { struct urb *ii = sk->completed_inurb; id = ii->iso_frame_desc + ii->number_of_packets + s->sync_packet; l = id->actual_length; od[p].length = l; - od[p].offset = io->transfer_buffer_length; - io->transfer_buffer_length += l; + od[p].offset = lb; + lb += l; } for (; @@ -304,38 +297,38 @@ static int usb_stream_prepare_playback(struct usb_stream_kernel *sk, ++p, ++s->sync_packet) { l = inurb->iso_frame_desc[s->sync_packet].actual_length; - if (s->idle_outsize + io->transfer_buffer_length + l > - s->period_size) + if (s->idle_outsize + lb + l > s->period_size) goto check_ok; od[p].length = l; - od[p].offset = io->transfer_buffer_length; - io->transfer_buffer_length += l; + od[p].offset = lb; + lb += l; } check_ok: s->sync_packet -= inurb->number_of_packets; - if (s->sync_packet < -2 || s->sync_packet > 0) { + if (unlikely(s->sync_packet < -2 || s->sync_packet > 0)) { snd_printk(KERN_WARNING "invalid sync_packet = %i;" " p=%i nop=%i %i %x %x %x > %x\n", s->sync_packet, p, inurb->number_of_packets, - s->idle_outsize + io->transfer_buffer_length + l, - s->idle_outsize, io->transfer_buffer_length, l, + s->idle_outsize + lb + l, + s->idle_outsize, lb, l, s->period_size); return -1; } - if (io->transfer_buffer_length % s->cfg.frame_size) { + if (unlikely(lb % s->cfg.frame_size)) { snd_printk(KERN_WARNING"invalid outsize = %i\n", - io->transfer_buffer_length); + lb); return -1; } - s->idle_outsize += io->transfer_buffer_length - s->period_size; + s->idle_outsize += lb - s->period_size; io->number_of_packets = p; - if (s->idle_outsize > 0) { - snd_printk(KERN_WARNING "idle=%i\n", s->idle_outsize); - return -1; - } - return 0; + io->transfer_buffer_length = lb; + if (s->idle_outsize <= 0) + return 0; + + snd_printk(KERN_WARNING "idle=%i\n", s->idle_outsize); + return -1; } static void prepare_inurb(int number_of_packets, struct urb *iu) |