[alsa-devel] [PATCH v2] snd-cs8427: separate HW initialization
Takashi Iwai
tiwai at suse.de
Thu Apr 3 15:00:56 CEST 2014
At Thu, 3 Apr 2014 14:49:46 +0200,
Ondrej Zary wrote:
>
> Separate HW initialization from device creation.
> This is needed for suspend/resume support.
>
> Signed-off-by: Ondrej Zary <linux at rainbow-software.org>
Thanks, applied.
Takashi
> ---
> include/sound/cs8427.h | 1 +
> sound/i2c/cs8427.c | 57 ++++++++++++++++++++++++++++++++----------------
> 2 files changed, 39 insertions(+), 19 deletions(-)
>
> diff --git a/include/sound/cs8427.h b/include/sound/cs8427.h
> index f862cff..0b6a187 100644
> --- a/include/sound/cs8427.h
> +++ b/include/sound/cs8427.h
> @@ -188,6 +188,7 @@
>
> struct snd_pcm_substream;
>
> +int snd_cs8427_init(struct snd_i2c_bus *bus, struct snd_i2c_device *device);
> int snd_cs8427_create(struct snd_i2c_bus *bus, unsigned char addr,
> unsigned int reset_timeout, struct snd_i2c_device **r_cs8427);
> int snd_cs8427_reg_write(struct snd_i2c_device *device, unsigned char reg,
> diff --git a/sound/i2c/cs8427.c b/sound/i2c/cs8427.c
> index 6c2dc38..7e21621 100644
> --- a/sound/i2c/cs8427.c
> +++ b/sound/i2c/cs8427.c
> @@ -150,10 +150,8 @@ static void snd_cs8427_free(struct snd_i2c_device *device)
> kfree(device->private_data);
> }
>
> -int snd_cs8427_create(struct snd_i2c_bus *bus,
> - unsigned char addr,
> - unsigned int reset_timeout,
> - struct snd_i2c_device **r_cs8427)
> +int snd_cs8427_init(struct snd_i2c_bus *bus,
> + struct snd_i2c_device *device)
> {
> static unsigned char initvals1[] = {
> CS8427_REG_CONTROL1 | CS8427_REG_AUTOINC,
> @@ -200,22 +198,10 @@ int snd_cs8427_create(struct snd_i2c_bus *bus,
> Inhibit E->F transfers. */
> CS8427_UD | CS8427_EFTUI | CS8427_DETUI,
> };
> + struct cs8427 *chip = device->private_data;
> int err;
> - struct cs8427 *chip;
> - struct snd_i2c_device *device;
> unsigned char buf[24];
>
> - if ((err = snd_i2c_device_create(bus, "CS8427",
> - CS8427_ADDR | (addr & 7),
> - &device)) < 0)
> - return err;
> - chip = device->private_data = kzalloc(sizeof(*chip), GFP_KERNEL);
> - if (chip == NULL) {
> - snd_i2c_device_free(device);
> - return -ENOMEM;
> - }
> - device->private_free = snd_cs8427_free;
> -
> snd_i2c_lock(bus);
> err = snd_cs8427_reg_read(device, CS8427_REG_ID_AND_VER);
> if (err != CS8427_VER8427A) {
> @@ -264,10 +250,44 @@ int snd_cs8427_create(struct snd_i2c_bus *bus,
> snd_i2c_unlock(bus);
>
> /* turn on run bit and rock'n'roll */
> + snd_cs8427_reset(device);
> +
> + return 0;
> +
> +__fail:
> + snd_i2c_unlock(bus);
> +
> + return err;
> +}
> +EXPORT_SYMBOL(snd_cs8427_init);
> +
> +int snd_cs8427_create(struct snd_i2c_bus *bus,
> + unsigned char addr,
> + unsigned int reset_timeout,
> + struct snd_i2c_device **r_cs8427)
> +{
> + int err;
> + struct cs8427 *chip;
> + struct snd_i2c_device *device;
> +
> + err = snd_i2c_device_create(bus, "CS8427", CS8427_ADDR | (addr & 7),
> + &device);
> + if (err < 0)
> + return err;
> + chip = device->private_data = kzalloc(sizeof(*chip), GFP_KERNEL);
> + if (chip == NULL) {
> + snd_i2c_device_free(device);
> + return -ENOMEM;
> + }
> + device->private_free = snd_cs8427_free;
> +
> if (reset_timeout < 1)
> reset_timeout = 1;
> chip->reset_timeout = reset_timeout;
> - snd_cs8427_reset(device);
> +
> + err = snd_cs8427_init(bus, device);
> + if (err)
> + goto __fail;
>
> #if 0 // it's nice for read tests
> {
> @@ -286,7 +306,6 @@ int snd_cs8427_create(struct snd_i2c_bus *bus,
> return 0;
>
> __fail:
> - snd_i2c_unlock(bus);
> snd_i2c_device_free(device);
> return err < 0 ? err : -EIO;
> }
> --
> Ondrej Zary
>
More information about the Alsa-devel
mailing list