0001
0002
0003
0004
0005
0006
0007 #ifndef __I2SBUS_H
0008 #define __I2SBUS_H
0009 #include <linux/interrupt.h>
0010 #include <linux/spinlock.h>
0011 #include <linux/mutex.h>
0012 #include <linux/completion.h>
0013
0014 #include <sound/pcm.h>
0015
0016 #include <asm/prom.h>
0017 #include <asm/pmac_feature.h>
0018 #include <asm/dbdma.h>
0019
0020 #include "interface.h"
0021 #include "../soundbus.h"
0022
0023 struct i2sbus_control {
0024 struct list_head list;
0025 struct macio_chip *macio;
0026 };
0027
0028 #define MAX_DBDMA_COMMANDS 32
0029
0030 struct dbdma_command_mem {
0031 dma_addr_t bus_addr;
0032 dma_addr_t bus_cmd_start;
0033 struct dbdma_cmd *cmds;
0034 void *space;
0035 int size;
0036 u32 running:1;
0037 u32 stopping:1;
0038 };
0039
0040 struct pcm_info {
0041 u32 created:1,
0042 active:1;
0043
0044 struct snd_pcm_substream *substream;
0045 int current_period;
0046 u32 frame_count;
0047 struct dbdma_command_mem dbdma_ring;
0048 volatile struct dbdma_regs __iomem *dbdma;
0049 struct completion *stop_completion;
0050 };
0051
0052 enum {
0053 aoa_resource_i2smmio = 0,
0054 aoa_resource_txdbdma,
0055 aoa_resource_rxdbdma,
0056 };
0057
0058 struct i2sbus_dev {
0059 struct soundbus_dev sound;
0060 struct macio_dev *macio;
0061 struct i2sbus_control *control;
0062 volatile struct i2s_interface_regs __iomem *intfregs;
0063
0064 struct resource resources[3];
0065 struct resource *allocated_resource[3];
0066 int interrupts[3];
0067 char rnames[3][32];
0068
0069
0070 struct pcm_info out, in;
0071 snd_pcm_format_t format;
0072 unsigned int rate;
0073
0074
0075 struct list_head item;
0076
0077 int bus_number;
0078
0079 struct pmf_function *enable,
0080 *cell_enable,
0081 *cell_disable,
0082 *clock_enable,
0083 *clock_disable;
0084
0085
0086
0087 spinlock_t low_lock;
0088
0089 struct mutex lock;
0090 };
0091
0092 #define soundbus_dev_to_i2sbus_dev(sdev) \
0093 container_of(sdev, struct i2sbus_dev, sound)
0094
0095
0096 extern int
0097 i2sbus_attach_codec(struct soundbus_dev *dev, struct snd_card *card,
0098 struct codec_info *ci, void *data);
0099 extern void
0100 i2sbus_detach_codec(struct soundbus_dev *dev, void *data);
0101 extern irqreturn_t
0102 i2sbus_tx_intr(int irq, void *devid);
0103 extern irqreturn_t
0104 i2sbus_rx_intr(int irq, void *devid);
0105
0106 extern void i2sbus_wait_for_stop_both(struct i2sbus_dev *i2sdev);
0107 extern void i2sbus_pcm_prepare_both(struct i2sbus_dev *i2sdev);
0108
0109
0110 extern int i2sbus_control_init(struct macio_dev* dev,
0111 struct i2sbus_control **c);
0112 extern void i2sbus_control_destroy(struct i2sbus_control *c);
0113 extern int i2sbus_control_add_dev(struct i2sbus_control *c,
0114 struct i2sbus_dev *i2sdev);
0115 extern void i2sbus_control_remove_dev(struct i2sbus_control *c,
0116 struct i2sbus_dev *i2sdev);
0117 extern int i2sbus_control_enable(struct i2sbus_control *c,
0118 struct i2sbus_dev *i2sdev);
0119 extern int i2sbus_control_cell(struct i2sbus_control *c,
0120 struct i2sbus_dev *i2sdev,
0121 int enable);
0122 extern int i2sbus_control_clock(struct i2sbus_control *c,
0123 struct i2sbus_dev *i2sdev,
0124 int enable);
0125 #endif