Add support for the Cyrix/NatSemi Geode SC5530 chips. This driver is ported from oss/kahlua.c and is made up of two patches.
Patch 1/2 adds some stuff to the SB layer to allow for some hardware quirks and is to be applied to alsa-kernel. Patch 2/2 adds the actual driver code to be applied to alsa-driver. Patch 2 depends on patch 1.
Signed off by: Ash Willis ashwillis@programmer.net
---
summary: Add SB_HW_CS5530 to the SB code
diff -r 45179b325c8e -r b8441e56e853 include/sb.h --- a/include/sb.h Wed May 23 16:27:32 2007 +0200 +++ b/include/sb.h Thu May 24 03:09:49 2007 +0100 @@ -38,6 +38,7 @@ enum sb_hw_type { SB_HW_ALS100, /* Avance Logic ALS100 chip */ SB_HW_ALS4000, /* Avance Logic ALS4000 chip */ SB_HW_DT019X, /* Diamond Tech. DT-019X / Avance Logic ALS-007 */ + SB_HW_CS5530, /* Cyrix/NatSemi 5530 VSA1 */ };
#define SB_OPEN_PCM 0x01 diff -r 45179b325c8e -r b8441e56e853 isa/sb/sb16_main.c --- a/isa/sb/sb16_main.c Wed May 23 16:27:32 2007 +0200 +++ b/isa/sb/sb16_main.c Thu May 24 03:09:49 2007 +0100 @@ -563,6 +563,11 @@ static int snd_sb16_playback_open(struct __open_ok: if (chip->hardware == SB_HW_ALS100) runtime->hw.rate_max = 48000; + if (chip->hardware == SB_HW_CS5530) { + runtime->hw.buffer_bytes_max = 32 * 1024; + runtime->hw.periods_min = 2; + runtime->hw.rate_min = 44100; + } if (chip->mode & SB_RATE_LOCK) runtime->hw.rate_min = runtime->hw.rate_max = chip->locked_rate; chip->playback_substream = substream; @@ -633,6 +638,11 @@ static int snd_sb16_capture_open(struct __open_ok: if (chip->hardware == SB_HW_ALS100) runtime->hw.rate_max = 48000; + if (chip->hardware == SB_HW_CS5530) { + runtime->hw.buffer_bytes_max = 32 * 1024; + runtime->hw.periods_min = 2; + runtime->hw.rate_min = 44100; + } if (chip->mode & SB_RATE_LOCK) runtime->hw.rate_min = runtime->hw.rate_max = chip->locked_rate; chip->capture_substream = substream; diff -r 45179b325c8e -r b8441e56e853 isa/sb/sb_common.c --- a/isa/sb/sb_common.c Wed May 23 16:27:32 2007 +0200 +++ b/isa/sb/sb_common.c Thu May 24 03:09:49 2007 +0100 @@ -128,7 +128,7 @@ static int snd_sbdsp_probe(struct snd_sb minor = version & 0xff; snd_printdd("SB [0x%lx]: DSP chip found, version = %i.%i\n", chip->port, major, minor); - + switch (chip->hardware) { case SB_HW_AUTO: switch (major) { @@ -167,6 +167,9 @@ static int snd_sbdsp_probe(struct snd_sb break; case SB_HW_DT019X: str = "(DT019X/ALS007)"; + break; + case SB_HW_CS5530: + str = "16 (CS5530)"; break; default: return -ENODEV; diff -r 45179b325c8e -r b8441e56e853 isa/sb/sb_mixer.c --- a/isa/sb/sb_mixer.c Wed May 23 16:27:32 2007 +0200 +++ b/isa/sb/sb_mixer.c Thu May 24 03:09:49 2007 +0100 @@ -821,6 +821,7 @@ int snd_sbmixer_new(struct snd_sb *chip) break; case SB_HW_16: case SB_HW_ALS100: + case SB_HW_CS5530: if ((err = snd_sbmixer_init(chip, snd_sb16_controls, ARRAY_SIZE(snd_sb16_controls), @@ -950,6 +951,7 @@ void snd_sbmixer_suspend(struct snd_sb * break; case SB_HW_16: case SB_HW_ALS100: + case SB_HW_CS5530: save_mixer(chip, sb16_saved_regs, ARRAY_SIZE(sb16_saved_regs)); break; case SB_HW_ALS4000: @@ -975,6 +977,7 @@ void snd_sbmixer_resume(struct snd_sb *c break; case SB_HW_16: case SB_HW_ALS100: + case SB_HW_CS5530: restore_mixer(chip, sb16_saved_regs, ARRAY_SIZE(sb16_saved_regs)); break; case SB_HW_ALS4000:
=