Merge branch 'drivers-platform' into release
[linux-2.6] / sound / aoa / soundbus / i2sbus / i2sbus.h
1 /*
2  * i2sbus driver -- private definitions
3  *
4  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
5  *
6  * GPL v2, can be found in COPYING.
7  */
8 #ifndef __I2SBUS_H
9 #define __I2SBUS_H
10 #include <linux/interrupt.h>
11 #include <linux/spinlock.h>
12 #include <linux/mutex.h>
13 #include <linux/completion.h>
14
15 #include <sound/pcm.h>
16
17 #include <asm/prom.h>
18 #include <asm/pmac_feature.h>
19 #include <asm/dbdma.h>
20
21 #include "interface.h"
22 #include "../soundbus.h"
23
24 struct i2sbus_control {
25         struct list_head list;
26         struct macio_chip *macio;
27 };
28
29 #define MAX_DBDMA_COMMANDS      32
30
31 struct dbdma_command_mem {
32         dma_addr_t bus_addr;
33         dma_addr_t bus_cmd_start;
34         struct dbdma_cmd *cmds;
35         void *space;
36         int size;
37         u32 running:1;
38         u32 stopping:1;
39 };
40
41 struct pcm_info {
42         u32 created:1, /* has this direction been created with alsa? */
43             active:1;  /* is this stream active? */
44         /* runtime information */
45         struct snd_pcm_substream *substream;
46         int current_period;
47         u32 frame_count;
48         struct dbdma_command_mem dbdma_ring;
49         volatile struct dbdma_regs __iomem *dbdma;
50         struct completion *stop_completion;
51 };
52
53 enum {
54         aoa_resource_i2smmio = 0,
55         aoa_resource_txdbdma,
56         aoa_resource_rxdbdma,
57 };
58
59 struct i2sbus_dev {
60         struct soundbus_dev sound;
61         struct macio_dev *macio;
62         struct i2sbus_control *control;
63         volatile struct i2s_interface_regs __iomem *intfregs;
64
65         struct resource resources[3];
66         struct resource *allocated_resource[3];
67         int interrupts[3];
68         char rnames[3][32];
69
70         /* info about currently active substreams */
71         struct pcm_info out, in;
72         snd_pcm_format_t format;
73         unsigned int rate;
74
75         /* list for a single controller */
76         struct list_head item;
77         /* number of bus on controller */
78         int bus_number;
79         /* for use by control layer */
80         struct pmf_function *enable,
81                             *cell_enable,
82                             *cell_disable,
83                             *clock_enable,
84                             *clock_disable;
85
86         /* locks */
87         /* spinlock for low-level interrupt locking */
88         spinlock_t low_lock;
89         /* mutex for high-level consistency */
90         struct mutex lock;
91 };
92
93 #define soundbus_dev_to_i2sbus_dev(sdev) \
94                 container_of(sdev, struct i2sbus_dev, sound)
95
96 /* pcm specific functions */
97 extern int
98 i2sbus_attach_codec(struct soundbus_dev *dev, struct snd_card *card,
99                     struct codec_info *ci, void *data);
100 extern void
101 i2sbus_detach_codec(struct soundbus_dev *dev, void *data);
102 extern irqreturn_t
103 i2sbus_tx_intr(int irq, void *devid);
104 extern irqreturn_t
105 i2sbus_rx_intr(int irq, void *devid);
106
107 extern void i2sbus_wait_for_stop_both(struct i2sbus_dev *i2sdev);
108 extern void i2sbus_pcm_prepare_both(struct i2sbus_dev *i2sdev);
109
110 /* control specific functions */
111 extern int i2sbus_control_init(struct macio_dev* dev,
112                                struct i2sbus_control **c);
113 extern void i2sbus_control_destroy(struct i2sbus_control *c);
114 extern int i2sbus_control_add_dev(struct i2sbus_control *c,
115                                   struct i2sbus_dev *i2sdev);
116 extern void i2sbus_control_remove_dev(struct i2sbus_control *c,
117                                       struct i2sbus_dev *i2sdev);
118 extern int i2sbus_control_enable(struct i2sbus_control *c,
119                                  struct i2sbus_dev *i2sdev);
120 extern int i2sbus_control_cell(struct i2sbus_control *c,
121                                struct i2sbus_dev *i2sdev,
122                                int enable);
123 extern int i2sbus_control_clock(struct i2sbus_control *c,
124                                 struct i2sbus_dev *i2sdev,
125                                 int enable);
126 #endif /* __I2SBUS_H */