alsa.audio: Furter work on skeleton
[AROS.git] / workbench / devs / AHI / Drivers / Envy24HT / Revo51.c
blobee2c88f53215b46fb0653e01f75e3a59c962f0f4
1 /*
2 Copyright © 2005-2013, Davy Wentzler. All rights reserved.
3 $Id$
4 */
6 #include <proto/exec.h>
7 #include <proto/expansion.h>
8 #include "misc.h"
9 #include "DriverData.h"
10 #include "regs.h"
11 #include "ak_codec.h"
12 #include "Revo51.h"
15 static void Revo51_Start(struct CardData *card)
17 unsigned char mask;
19 SaveGPIO(card->pci_dev, card);
23 static void Revo51_Stop(struct CardData *card)
25 RestoreGPIO(card->pci_dev, card);
30 // Set the direction of the CLK and SDA lines:
31 // For sending, use 1, 1
32 static void Revo51_SetDir_CLK_SDA(struct CardData *card, int clock, int data)
34 unsigned int mask = 0, val;
36 val = 0;
37 if (clock)
38 val = REVO51_I2C_CLOCK; /* write SCL */
39 if (data)
40 val |= REVO51_I2C_DATA; /* write SDA */
42 mask = REVO51_I2C_CLOCK | REVO51_I2C_DATA;
43 card->gpio_dir &= ~mask;
44 card->gpio_dir |= val;
45 SetGPIODir(card->pci_dev, card, card->gpio_dir);
46 SetGPIOMask(card, card->iobase, ~mask);
52 // Write data to the SDA line and clock to the SCL
53 static void Revo51_Write_CLK_SDA(struct CardData *card, int clk, int data)
55 unsigned int val = 0, mask = REVO51_I2C_CLOCK | REVO51_I2C_DATA;;
57 if (clk)
58 val |= REVO51_I2C_CLOCK;
59 if (data)
60 val |= REVO51_I2C_DATA;
62 card->gpio_dir |= mask;
63 SetGPIODir(card->pci_dev, card, card->gpio_dir);
64 SetGPIOMask(card, card->iobase, ~mask);
65 SetGPIOData(card, card->iobase, mask & val);
67 MicroDelay(5);
71 static int Revo51_GetDataBit(struct CardData *card, int ack)
73 int bit;
75 if (ack)
76 MicroDelay(5);
78 // get data bit from the GPIO pines
79 card->gpio_dir &= ~REVO51_I2C_DATA;
80 SetGPIODir(card->pci_dev, card, card->gpio_dir);
81 bit = GetGPIOData(card, card->iobase) & REVO51_I2C_DATA ? 1 : 0;
83 return bit;
87 static struct I2C_bit_ops Revo51_bit_ops = {
88 Revo51_Start,
89 Revo51_Stop,
90 Revo51_SetDir_CLK_SDA,
91 Revo51_Write_CLK_SDA,
92 Revo51_GetDataBit,
96 void Revo51_Init(struct CardData *card)
98 unsigned char bytes[4];
100 /* create i2c devices */
101 card->i2c = AllocI2C(0x40);
102 card->i2c->bit = &Revo51_bit_ops;
104 card->bit_ops = &Revo51_bit_ops;
106 //DEBUGPRINTF("Resetting PT2258\n");
108 // step 1: clear reg 0xC0
109 bytes[0] = 0xC0;
110 WriteBytesI2C(card, card->i2c, bytes, 1);
112 // unmute all channels
113 bytes[0] = REVO51_2258_UNMUTE;
114 WriteBytesI2C(card, card->i2c, bytes, 1);
116 // set all 6 channels to no attenuation (0dB)
117 bytes[0] = 0xD0;
118 bytes[1] = 0xE0;
119 WriteBytesI2C(card, card->i2c, bytes, 2);