[alsa-devel] [PATCH 2/2] opti93x: set MC indirect registers base from PnP data
Takashi Iwai
tiwai at suse.de
Mon Nov 30 11:20:14 CET 2009
At Sun, 29 Nov 2009 20:23:28 +0100,
Krzysztof Helt wrote:
>
> From: Krzysztof Helt <krzysztof.h1 at wp.pl>
>
> The PnP data on the OPTI931 and OPTI933 contains io port
> range for the MC indirect registers. Use the PnP range
> instead of hardwired value 0xE0E.
>
> Also, request region of MC indirect registers so it is
> marked as used to other drivers (this was missing previously).
I would create a function to call request_region()s for chip->res_mc_base
and chip->res_mc_indir and do initializations, instead of spreading each
request_region() in separate places.
thanks,
Takashi
>
> Signed-off-by: Krzysztof Helt <krzysztof.h1 at wp.pl>
> ---
> sound/isa/opti9xx/opti92x-ad1848.c | 53 +++++++++++++++++++++++++++++------
> 1 files changed, 44 insertions(+), 9 deletions(-)
>
> diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
> index 438c1da..07ab288 100644
> --- a/sound/isa/opti9xx/opti92x-ad1848.c
> +++ b/sound/isa/opti9xx/opti92x-ad1848.c
> @@ -135,6 +135,8 @@ struct snd_opti9xx {
> unsigned long mc_base_size;
> #ifdef OPTi93X
> unsigned long mc_indir_index;
> + unsigned long mc_indir_size;
> + struct resource *res_mc_indir;
> struct snd_wss *codec;
> #endif /* OPTi93X */
> unsigned long pwd_reg;
> @@ -245,7 +247,10 @@ static int __devinit snd_opti9xx_init(struct snd_opti9xx *chip,
> case OPTi9XX_HW_82C931:
> case OPTi9XX_HW_82C933:
> chip->mc_base = (hardware == OPTi9XX_HW_82C930) ? 0xf8f : 0xf8d;
> - chip->mc_indir_index = 0xe0e;
> + if (!chip->mc_indir_index) {
> + chip->mc_indir_index = 0xe0e;
> + chip->mc_indir_size = 2;
> + }
> chip->password = 0xe4;
> chip->pwd_reg = 0;
> break;
> @@ -579,10 +584,10 @@ static int __devinit snd_card_opti9xx_detect(struct snd_card *card,
> struct snd_opti9xx *chip)
> {
> int i, err;
> + unsigned char value;
>
> #ifndef OPTi93X
> for (i = OPTi9XX_HW_82C928; i < OPTi9XX_HW_82C930; i++) {
> - unsigned char value;
>
> if ((err = snd_opti9xx_init(chip, i)) < 0)
> return err;
> @@ -602,18 +607,26 @@ static int __devinit snd_card_opti9xx_detect(struct snd_card *card,
> #else /* OPTi93X */
> for (i = OPTi9XX_HW_82C931; i >= OPTi9XX_HW_82C930; i--) {
> unsigned long flags;
> - unsigned char value;
>
> - if ((err = snd_opti9xx_init(chip, i)) < 0)
> + err = snd_opti9xx_init(chip, i);
> + if (err < 0)
> return err;
>
> - if ((chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, "OPTi9xx MC")) == NULL)
> - continue;
> + chip->res_mc_base = request_region(chip->mc_base,
> + chip->mc_base_size,
> + "OPTi9xx MC");
> + if (chip->res_mc_base == NULL)
> + return -EBUSY;
> +
> + chip->res_mc_indir = request_region(chip->mc_indir_index,
> + chip->mc_indir_size,
> + "OPTi93x MC");
> + if (chip->res_mc_indir == NULL)
> + return -EBUSY;
>
> spin_lock_irqsave(&chip->lock, flags);
> outb(chip->password, chip->mc_base + chip->pwd_reg);
> - outb(((chip->mc_indir_index & (1 << 8)) >> 4) |
> - ((chip->mc_indir_index & 0xf0) >> 4), chip->mc_base);
> + outb(((chip->mc_indir_index & 0x1f0) >> 4), chip->mc_base);
> spin_unlock_irqrestore(&chip->lock, flags);
>
> value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(7));
> @@ -621,6 +634,8 @@ static int __devinit snd_card_opti9xx_detect(struct snd_card *card,
> if (snd_opti9xx_read(chip, OPTi9XX_MC_REG(7)) == 0xff - value)
> return 1;
>
> + release_and_free_resource(chip->res_mc_indir);
> + chip->res_mc_indir = NULL;
> release_and_free_resource(chip->res_mc_base);
> chip->res_mc_base = NULL;
> }
> @@ -654,6 +669,8 @@ static int __devinit snd_card_opti9xx_pnp(struct snd_opti9xx *chip,
> #ifdef OPTi93X
> port = pnp_port_start(pdev, 0) - 4;
> fm_port = pnp_port_start(pdev, 1) + 8;
> + chip->mc_indir_index = pnp_port_start(pdev, 3) + 2;
> + chip->mc_indir_size = pnp_port_len(pdev, 3) - 2;
> #else
> if (pid->driver_data != 0x0924)
> port = pnp_port_start(pdev, 1);
> @@ -684,7 +701,7 @@ static int __devinit snd_card_opti9xx_pnp(struct snd_opti9xx *chip,
> static void snd_card_opti9xx_free(struct snd_card *card)
> {
> struct snd_opti9xx *chip = card->private_data;
> -
> +
> if (chip) {
> #ifdef OPTi93X
> struct snd_wss *codec = chip->codec;
> @@ -692,6 +709,7 @@ static void snd_card_opti9xx_free(struct snd_card *card)
> disable_irq(chip->irq);
> free_irq(chip->irq, codec);
> }
> + release_and_free_resource(chip->res_mc_indir);
> #endif
> release_and_free_resource(chip->res_mc_base);
> }
> @@ -709,12 +727,29 @@ static int __devinit snd_opti9xx_probe(struct snd_card *card)
> struct snd_pcm *pcm;
> struct snd_rawmidi *rmidi;
> struct snd_hwdep *synth;
> +#ifdef OPTi93X
> + unsigned long flags;
> +#endif
>
> if (! chip->res_mc_base &&
> (chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size,
> "OPTi9xx MC")) == NULL)
> return -ENOMEM;
>
> +#ifdef OPTi93X
> + if (chip->res_mc_indir == NULL) {
> + chip->res_mc_indir = request_region(chip->mc_indir_index,
> + chip->mc_indir_size,
> + "OPTi93x MC");
> + if (chip->res_mc_indir == NULL)
> + return -ENOMEM;
> + }
> + /* store MC indirect range address */
> + spin_lock_irqsave(&chip->lock, flags);
> + outb(chip->password, chip->mc_base + chip->pwd_reg);
> + outb(((chip->mc_indir_index & 0x1f0) >> 4), chip->mc_base);
> + spin_unlock_irqrestore(&chip->lock, flags);
> +#endif
> chip->wss_base = port;
> chip->fm_port = fm_port;
> chip->mpu_port = mpu_port;
> --
> 1.6.4
>
>
> ----------------------------------------------------------------------
> Codziennie 11 tys. ofert pracy!
> Sprawdz: http://link.interia.pl/f2447
>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
More information about the Alsa-devel
mailing list