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