diff options
Diffstat (limited to 'sound/pci/oxygen/oxygen_io.c')
-rw-r--r-- | sound/pci/oxygen/oxygen_io.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c index 3126c4b403dd..c1eb923f2ac9 100644 --- a/sound/pci/oxygen/oxygen_io.c +++ b/sound/pci/oxygen/oxygen_io.c | |||
@@ -254,3 +254,34 @@ void oxygen_write_uart(struct oxygen *chip, u8 data) | |||
254 | _write_uart(chip, 0, data); | 254 | _write_uart(chip, 0, data); |
255 | } | 255 | } |
256 | EXPORT_SYMBOL(oxygen_write_uart); | 256 | EXPORT_SYMBOL(oxygen_write_uart); |
257 | |||
258 | u16 oxygen_read_eeprom(struct oxygen *chip, unsigned int index) | ||
259 | { | ||
260 | unsigned int timeout; | ||
261 | |||
262 | oxygen_write8(chip, OXYGEN_EEPROM_CONTROL, | ||
263 | index | OXYGEN_EEPROM_DIR_READ); | ||
264 | for (timeout = 0; timeout < 100; ++timeout) { | ||
265 | udelay(1); | ||
266 | if (!(oxygen_read8(chip, OXYGEN_EEPROM_STATUS) | ||
267 | & OXYGEN_EEPROM_BUSY)) | ||
268 | break; | ||
269 | } | ||
270 | return oxygen_read16(chip, OXYGEN_EEPROM_DATA); | ||
271 | } | ||
272 | |||
273 | void oxygen_write_eeprom(struct oxygen *chip, unsigned int index, u16 value) | ||
274 | { | ||
275 | unsigned int timeout; | ||
276 | |||
277 | oxygen_write16(chip, OXYGEN_EEPROM_DATA, value); | ||
278 | oxygen_write8(chip, OXYGEN_EEPROM_CONTROL, | ||
279 | index | OXYGEN_EEPROM_DIR_WRITE); | ||
280 | for (timeout = 0; timeout < 10; ++timeout) { | ||
281 | msleep(1); | ||
282 | if (!(oxygen_read8(chip, OXYGEN_EEPROM_STATUS) | ||
283 | & OXYGEN_EEPROM_BUSY)) | ||
284 | return; | ||
285 | } | ||
286 | snd_printk(KERN_ERR "EEPROM write timeout\n"); | ||
287 | } | ||