blob: d32f8a9724d7a0904a15dfae27f16747bbb698cb [file] [log] [blame]
Johannes Bergf3d94782006-06-21 15:42:43 +02001/*
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 <asm/dbdma.h>
11#include <linux/interrupt.h>
12#include <sound/pcm.h>
13#include <linux/spinlock.h>
14#include <linux/mutex.h>
15#include <asm/prom.h>
16#include "i2sbus-interface.h"
17#include "i2sbus-control.h"
18#include "../soundbus.h"
19
20struct i2sbus_control {
21 volatile struct i2s_control_regs __iomem *controlregs;
22 struct resource rsrc;
23 struct list_head list;
24};
25
26#define MAX_DBDMA_COMMANDS 32
27
28struct dbdma_command_mem {
29 dma_addr_t bus_addr;
30 dma_addr_t bus_cmd_start;
31 struct dbdma_cmd *cmds;
32 void *space;
33 int size;
34 u32 running:1;
35};
36
37struct pcm_info {
38 u32 created:1, /* has this direction been created with alsa? */
39 active:1; /* is this stream active? */
40 /* runtime information */
41 struct snd_pcm_substream *substream;
42 int current_period;
43 u32 frame_count;
44 struct dbdma_command_mem dbdma_ring;
45 volatile struct dbdma_regs __iomem *dbdma;
46};
47
Benjamin Herrenschmidt389ba792006-07-10 04:44:34 -070048enum {
49 aoa_resource_i2smmio = 0,
50 aoa_resource_txdbdma,
51 aoa_resource_rxdbdma,
52};
53
Johannes Bergf3d94782006-06-21 15:42:43 +020054struct i2sbus_dev {
55 struct soundbus_dev sound;
56 struct macio_dev *macio;
57 struct i2sbus_control *control;
58 volatile struct i2s_interface_regs __iomem *intfregs;
59
60 struct resource resources[3];
61 struct resource *allocated_resource[3];
62 int interrupts[3];
63 char rnames[3][32];
64
65 /* info about currently active substreams */
66 struct pcm_info out, in;
67 snd_pcm_format_t format;
68 unsigned int rate;
69
70 /* list for a single controller */
71 struct list_head item;
72 /* number of bus on controller */
73 int bus_number;
74 /* for use by control layer */
75 struct pmf_function *enable,
76 *cell_enable,
77 *cell_disable,
78 *clock_enable,
79 *clock_disable;
80
81 /* locks */
82 /* spinlock for low-level interrupt locking */
83 spinlock_t low_lock;
84 /* mutex for high-level consistency */
85 struct mutex lock;
86};
87
88#define soundbus_dev_to_i2sbus_dev(sdev) \
89 container_of(sdev, struct i2sbus_dev, sound)
90
91/* pcm specific functions */
92extern int
93i2sbus_attach_codec(struct soundbus_dev *dev, struct snd_card *card,
94 struct codec_info *ci, void *data);
95extern void
96i2sbus_detach_codec(struct soundbus_dev *dev, void *data);
97extern irqreturn_t
98i2sbus_tx_intr(int irq, void *devid, struct pt_regs *regs);
99extern irqreturn_t
100i2sbus_rx_intr(int irq, void *devid, struct pt_regs *regs);
101
102/* control specific functions */
103extern int i2sbus_control_init(struct macio_dev* dev,
104 struct i2sbus_control **c);
105extern void i2sbus_control_destroy(struct i2sbus_control *c);
106extern int i2sbus_control_add_dev(struct i2sbus_control *c,
107 struct i2sbus_dev *i2sdev);
108extern void i2sbus_control_remove_dev(struct i2sbus_control *c,
109 struct i2sbus_dev *i2sdev);
110extern int i2sbus_control_enable(struct i2sbus_control *c,
111 struct i2sbus_dev *i2sdev);
112extern int i2sbus_control_cell(struct i2sbus_control *c,
113 struct i2sbus_dev *i2sdev,
114 int enable);
115extern int i2sbus_control_clock(struct i2sbus_control *c,
116 struct i2sbus_dev *i2sdev,
117 int enable);
118#endif /* __I2SBUS_H */