mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.2 KiB
125 lines
3.2 KiB
/* SPDX-License-Identifier: GPL-2.0-only */ |
|
/* |
|
* i2sbus driver -- private definitions |
|
* |
|
* Copyright 2006 Johannes Berg <[email protected]> |
|
*/ |
|
#ifndef __I2SBUS_H |
|
#define __I2SBUS_H |
|
#include <linux/interrupt.h> |
|
#include <linux/spinlock.h> |
|
#include <linux/mutex.h> |
|
#include <linux/completion.h> |
|
|
|
#include <sound/pcm.h> |
|
|
|
#include <asm/prom.h> |
|
#include <asm/pmac_feature.h> |
|
#include <asm/dbdma.h> |
|
|
|
#include "interface.h" |
|
#include "../soundbus.h" |
|
|
|
struct i2sbus_control { |
|
struct list_head list; |
|
struct macio_chip *macio; |
|
}; |
|
|
|
#define MAX_DBDMA_COMMANDS 32 |
|
|
|
struct dbdma_command_mem { |
|
dma_addr_t bus_addr; |
|
dma_addr_t bus_cmd_start; |
|
struct dbdma_cmd *cmds; |
|
void *space; |
|
int size; |
|
u32 running:1; |
|
u32 stopping:1; |
|
}; |
|
|
|
struct pcm_info { |
|
u32 created:1, /* has this direction been created with alsa? */ |
|
active:1; /* is this stream active? */ |
|
/* runtime information */ |
|
struct snd_pcm_substream *substream; |
|
int current_period; |
|
u32 frame_count; |
|
struct dbdma_command_mem dbdma_ring; |
|
volatile struct dbdma_regs __iomem *dbdma; |
|
struct completion *stop_completion; |
|
}; |
|
|
|
enum { |
|
aoa_resource_i2smmio = 0, |
|
aoa_resource_txdbdma, |
|
aoa_resource_rxdbdma, |
|
}; |
|
|
|
struct i2sbus_dev { |
|
struct soundbus_dev sound; |
|
struct macio_dev *macio; |
|
struct i2sbus_control *control; |
|
volatile struct i2s_interface_regs __iomem *intfregs; |
|
|
|
struct resource resources[3]; |
|
struct resource *allocated_resource[3]; |
|
int interrupts[3]; |
|
char rnames[3][32]; |
|
|
|
/* info about currently active substreams */ |
|
struct pcm_info out, in; |
|
snd_pcm_format_t format; |
|
unsigned int rate; |
|
|
|
/* list for a single controller */ |
|
struct list_head item; |
|
/* number of bus on controller */ |
|
int bus_number; |
|
/* for use by control layer */ |
|
struct pmf_function *enable, |
|
*cell_enable, |
|
*cell_disable, |
|
*clock_enable, |
|
*clock_disable; |
|
|
|
/* locks */ |
|
/* spinlock for low-level interrupt locking */ |
|
spinlock_t low_lock; |
|
/* mutex for high-level consistency */ |
|
struct mutex lock; |
|
}; |
|
|
|
#define soundbus_dev_to_i2sbus_dev(sdev) \ |
|
container_of(sdev, struct i2sbus_dev, sound) |
|
|
|
/* pcm specific functions */ |
|
extern int |
|
i2sbus_attach_codec(struct soundbus_dev *dev, struct snd_card *card, |
|
struct codec_info *ci, void *data); |
|
extern void |
|
i2sbus_detach_codec(struct soundbus_dev *dev, void *data); |
|
extern irqreturn_t |
|
i2sbus_tx_intr(int irq, void *devid); |
|
extern irqreturn_t |
|
i2sbus_rx_intr(int irq, void *devid); |
|
|
|
extern void i2sbus_wait_for_stop_both(struct i2sbus_dev *i2sdev); |
|
extern void i2sbus_pcm_prepare_both(struct i2sbus_dev *i2sdev); |
|
|
|
/* control specific functions */ |
|
extern int i2sbus_control_init(struct macio_dev* dev, |
|
struct i2sbus_control **c); |
|
extern void i2sbus_control_destroy(struct i2sbus_control *c); |
|
extern int i2sbus_control_add_dev(struct i2sbus_control *c, |
|
struct i2sbus_dev *i2sdev); |
|
extern void i2sbus_control_remove_dev(struct i2sbus_control *c, |
|
struct i2sbus_dev *i2sdev); |
|
extern int i2sbus_control_enable(struct i2sbus_control *c, |
|
struct i2sbus_dev *i2sdev); |
|
extern int i2sbus_control_cell(struct i2sbus_control *c, |
|
struct i2sbus_dev *i2sdev, |
|
int enable); |
|
extern int i2sbus_control_clock(struct i2sbus_control *c, |
|
struct i2sbus_dev *i2sdev, |
|
int enable); |
|
#endif /* __I2SBUS_H */
|
|
|