diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2008-05-13 03:20:51 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-05-19 07:19:16 -0400 |
commit | e58aee95806c9d2bbcfc84cb85ce958e360165ef (patch) | |
tree | 8385cb486591002e7a9ddefff9a9477b9f9bf679 /sound/pci/oxygen/oxygen_io.c | |
parent | c13650079ba3bed1c0bdd9bf4a13274be7676ff6 (diff) |
[ALSA] oxygen: save register writes
Save the written values of all CMI8788 and AC97 registers and of some of
the DAC/ADC registers so that it is possible to restore the register
state later.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/oxygen/oxygen_io.c')
-rw-r--r-- | sound/pci/oxygen/oxygen_io.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c index 5569606ee87f..83f135f80df4 100644 --- a/sound/pci/oxygen/oxygen_io.c +++ b/sound/pci/oxygen/oxygen_io.c | |||
@@ -44,18 +44,21 @@ EXPORT_SYMBOL(oxygen_read32); | |||
44 | void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value) | 44 | void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value) |
45 | { | 45 | { |
46 | outb(value, chip->addr + reg); | 46 | outb(value, chip->addr + reg); |
47 | chip->saved_registers._8[reg] = value; | ||
47 | } | 48 | } |
48 | EXPORT_SYMBOL(oxygen_write8); | 49 | EXPORT_SYMBOL(oxygen_write8); |
49 | 50 | ||
50 | void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value) | 51 | void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value) |
51 | { | 52 | { |
52 | outw(value, chip->addr + reg); | 53 | outw(value, chip->addr + reg); |
54 | chip->saved_registers._16[reg / 2] = cpu_to_le16(value); | ||
53 | } | 55 | } |
54 | EXPORT_SYMBOL(oxygen_write16); | 56 | EXPORT_SYMBOL(oxygen_write16); |
55 | 57 | ||
56 | void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value) | 58 | void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value) |
57 | { | 59 | { |
58 | outl(value, chip->addr + reg); | 60 | outl(value, chip->addr + reg); |
61 | chip->saved_registers._32[reg / 4] = cpu_to_le32(value); | ||
59 | } | 62 | } |
60 | EXPORT_SYMBOL(oxygen_write32); | 63 | EXPORT_SYMBOL(oxygen_write32); |
61 | 64 | ||
@@ -63,7 +66,10 @@ void oxygen_write8_masked(struct oxygen *chip, unsigned int reg, | |||
63 | u8 value, u8 mask) | 66 | u8 value, u8 mask) |
64 | { | 67 | { |
65 | u8 tmp = inb(chip->addr + reg); | 68 | u8 tmp = inb(chip->addr + reg); |
66 | outb((tmp & ~mask) | (value & mask), chip->addr + reg); | 69 | tmp &= ~mask; |
70 | tmp |= value & mask; | ||
71 | outb(tmp, chip->addr + reg); | ||
72 | chip->saved_registers._8[reg] = tmp; | ||
67 | } | 73 | } |
68 | EXPORT_SYMBOL(oxygen_write8_masked); | 74 | EXPORT_SYMBOL(oxygen_write8_masked); |
69 | 75 | ||
@@ -71,7 +77,10 @@ void oxygen_write16_masked(struct oxygen *chip, unsigned int reg, | |||
71 | u16 value, u16 mask) | 77 | u16 value, u16 mask) |
72 | { | 78 | { |
73 | u16 tmp = inw(chip->addr + reg); | 79 | u16 tmp = inw(chip->addr + reg); |
74 | outw((tmp & ~mask) | (value & mask), chip->addr + reg); | 80 | tmp &= ~mask; |
81 | tmp |= value & mask; | ||
82 | outw(tmp, chip->addr + reg); | ||
83 | chip->saved_registers._16[reg / 2] = cpu_to_le16(tmp); | ||
75 | } | 84 | } |
76 | EXPORT_SYMBOL(oxygen_write16_masked); | 85 | EXPORT_SYMBOL(oxygen_write16_masked); |
77 | 86 | ||
@@ -79,7 +88,10 @@ void oxygen_write32_masked(struct oxygen *chip, unsigned int reg, | |||
79 | u32 value, u32 mask) | 88 | u32 value, u32 mask) |
80 | { | 89 | { |
81 | u32 tmp = inl(chip->addr + reg); | 90 | u32 tmp = inl(chip->addr + reg); |
82 | outl((tmp & ~mask) | (value & mask), chip->addr + reg); | 91 | tmp &= ~mask; |
92 | tmp |= value & mask; | ||
93 | outl(tmp, chip->addr + reg); | ||
94 | chip->saved_registers._32[reg / 4] = cpu_to_le32(tmp); | ||
83 | } | 95 | } |
84 | EXPORT_SYMBOL(oxygen_write32_masked); | 96 | EXPORT_SYMBOL(oxygen_write32_masked); |
85 | 97 | ||
@@ -128,8 +140,10 @@ void oxygen_write_ac97(struct oxygen *chip, unsigned int codec, | |||
128 | oxygen_write32(chip, OXYGEN_AC97_REGS, reg); | 140 | oxygen_write32(chip, OXYGEN_AC97_REGS, reg); |
129 | /* require two "completed" writes, just to be sure */ | 141 | /* require two "completed" writes, just to be sure */ |
130 | if (oxygen_ac97_wait(chip, OXYGEN_AC97_INT_WRITE_DONE) >= 0 && | 142 | if (oxygen_ac97_wait(chip, OXYGEN_AC97_INT_WRITE_DONE) >= 0 && |
131 | ++succeeded >= 2) | 143 | ++succeeded >= 2) { |
144 | chip->saved_ac97_registers[codec][index / 2] = data; | ||
132 | return; | 145 | return; |
146 | } | ||
133 | } | 147 | } |
134 | snd_printk(KERN_ERR "AC'97 write timeout\n"); | 148 | snd_printk(KERN_ERR "AC'97 write timeout\n"); |
135 | } | 149 | } |