aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/oxygen/oxygen_io.c
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2008-05-13 03:20:51 -0400
committerJaroslav Kysela <perex@perex.cz>2008-05-19 07:19:16 -0400
commite58aee95806c9d2bbcfc84cb85ce958e360165ef (patch)
tree8385cb486591002e7a9ddefff9a9477b9f9bf679 /sound/pci/oxygen/oxygen_io.c
parentc13650079ba3bed1c0bdd9bf4a13274be7676ff6 (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.c22
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);
44void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value) 44void 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}
48EXPORT_SYMBOL(oxygen_write8); 49EXPORT_SYMBOL(oxygen_write8);
49 50
50void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value) 51void 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}
54EXPORT_SYMBOL(oxygen_write16); 56EXPORT_SYMBOL(oxygen_write16);
55 57
56void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value) 58void 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}
60EXPORT_SYMBOL(oxygen_write32); 63EXPORT_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}
68EXPORT_SYMBOL(oxygen_write8_masked); 74EXPORT_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}
76EXPORT_SYMBOL(oxygen_write16_masked); 85EXPORT_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}
84EXPORT_SYMBOL(oxygen_write32_masked); 96EXPORT_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}