18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * i2sbus driver -- private definitions 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#ifndef __I2SBUS_H 88c2ecf20Sopenharmony_ci#define __I2SBUS_H 98c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 108c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 118c2ecf20Sopenharmony_ci#include <linux/mutex.h> 128c2ecf20Sopenharmony_ci#include <linux/completion.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <sound/pcm.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <asm/prom.h> 178c2ecf20Sopenharmony_ci#include <asm/pmac_feature.h> 188c2ecf20Sopenharmony_ci#include <asm/dbdma.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include "interface.h" 218c2ecf20Sopenharmony_ci#include "../soundbus.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct i2sbus_control { 248c2ecf20Sopenharmony_ci struct list_head list; 258c2ecf20Sopenharmony_ci struct macio_chip *macio; 268c2ecf20Sopenharmony_ci}; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define MAX_DBDMA_COMMANDS 32 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistruct dbdma_command_mem { 318c2ecf20Sopenharmony_ci dma_addr_t bus_addr; 328c2ecf20Sopenharmony_ci dma_addr_t bus_cmd_start; 338c2ecf20Sopenharmony_ci struct dbdma_cmd *cmds; 348c2ecf20Sopenharmony_ci void *space; 358c2ecf20Sopenharmony_ci int size; 368c2ecf20Sopenharmony_ci u32 running:1; 378c2ecf20Sopenharmony_ci u32 stopping:1; 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistruct pcm_info { 418c2ecf20Sopenharmony_ci u32 created:1, /* has this direction been created with alsa? */ 428c2ecf20Sopenharmony_ci active:1; /* is this stream active? */ 438c2ecf20Sopenharmony_ci /* runtime information */ 448c2ecf20Sopenharmony_ci struct snd_pcm_substream *substream; 458c2ecf20Sopenharmony_ci int current_period; 468c2ecf20Sopenharmony_ci u32 frame_count; 478c2ecf20Sopenharmony_ci struct dbdma_command_mem dbdma_ring; 488c2ecf20Sopenharmony_ci volatile struct dbdma_regs __iomem *dbdma; 498c2ecf20Sopenharmony_ci struct completion *stop_completion; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cienum { 538c2ecf20Sopenharmony_ci aoa_resource_i2smmio = 0, 548c2ecf20Sopenharmony_ci aoa_resource_txdbdma, 558c2ecf20Sopenharmony_ci aoa_resource_rxdbdma, 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistruct i2sbus_dev { 598c2ecf20Sopenharmony_ci struct soundbus_dev sound; 608c2ecf20Sopenharmony_ci struct macio_dev *macio; 618c2ecf20Sopenharmony_ci struct i2sbus_control *control; 628c2ecf20Sopenharmony_ci volatile struct i2s_interface_regs __iomem *intfregs; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci struct resource resources[3]; 658c2ecf20Sopenharmony_ci struct resource *allocated_resource[3]; 668c2ecf20Sopenharmony_ci int interrupts[3]; 678c2ecf20Sopenharmony_ci char rnames[3][32]; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci /* info about currently active substreams */ 708c2ecf20Sopenharmony_ci struct pcm_info out, in; 718c2ecf20Sopenharmony_ci snd_pcm_format_t format; 728c2ecf20Sopenharmony_ci unsigned int rate; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci /* list for a single controller */ 758c2ecf20Sopenharmony_ci struct list_head item; 768c2ecf20Sopenharmony_ci /* number of bus on controller */ 778c2ecf20Sopenharmony_ci int bus_number; 788c2ecf20Sopenharmony_ci /* for use by control layer */ 798c2ecf20Sopenharmony_ci struct pmf_function *enable, 808c2ecf20Sopenharmony_ci *cell_enable, 818c2ecf20Sopenharmony_ci *cell_disable, 828c2ecf20Sopenharmony_ci *clock_enable, 838c2ecf20Sopenharmony_ci *clock_disable; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci /* locks */ 868c2ecf20Sopenharmony_ci /* spinlock for low-level interrupt locking */ 878c2ecf20Sopenharmony_ci spinlock_t low_lock; 888c2ecf20Sopenharmony_ci /* mutex for high-level consistency */ 898c2ecf20Sopenharmony_ci struct mutex lock; 908c2ecf20Sopenharmony_ci}; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci#define soundbus_dev_to_i2sbus_dev(sdev) \ 938c2ecf20Sopenharmony_ci container_of(sdev, struct i2sbus_dev, sound) 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci/* pcm specific functions */ 968c2ecf20Sopenharmony_ciextern int 978c2ecf20Sopenharmony_cii2sbus_attach_codec(struct soundbus_dev *dev, struct snd_card *card, 988c2ecf20Sopenharmony_ci struct codec_info *ci, void *data); 998c2ecf20Sopenharmony_ciextern void 1008c2ecf20Sopenharmony_cii2sbus_detach_codec(struct soundbus_dev *dev, void *data); 1018c2ecf20Sopenharmony_ciextern irqreturn_t 1028c2ecf20Sopenharmony_cii2sbus_tx_intr(int irq, void *devid); 1038c2ecf20Sopenharmony_ciextern irqreturn_t 1048c2ecf20Sopenharmony_cii2sbus_rx_intr(int irq, void *devid); 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ciextern void i2sbus_wait_for_stop_both(struct i2sbus_dev *i2sdev); 1078c2ecf20Sopenharmony_ciextern void i2sbus_pcm_prepare_both(struct i2sbus_dev *i2sdev); 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci/* control specific functions */ 1108c2ecf20Sopenharmony_ciextern int i2sbus_control_init(struct macio_dev* dev, 1118c2ecf20Sopenharmony_ci struct i2sbus_control **c); 1128c2ecf20Sopenharmony_ciextern void i2sbus_control_destroy(struct i2sbus_control *c); 1138c2ecf20Sopenharmony_ciextern int i2sbus_control_add_dev(struct i2sbus_control *c, 1148c2ecf20Sopenharmony_ci struct i2sbus_dev *i2sdev); 1158c2ecf20Sopenharmony_ciextern void i2sbus_control_remove_dev(struct i2sbus_control *c, 1168c2ecf20Sopenharmony_ci struct i2sbus_dev *i2sdev); 1178c2ecf20Sopenharmony_ciextern int i2sbus_control_enable(struct i2sbus_control *c, 1188c2ecf20Sopenharmony_ci struct i2sbus_dev *i2sdev); 1198c2ecf20Sopenharmony_ciextern int i2sbus_control_cell(struct i2sbus_control *c, 1208c2ecf20Sopenharmony_ci struct i2sbus_dev *i2sdev, 1218c2ecf20Sopenharmony_ci int enable); 1228c2ecf20Sopenharmony_ciextern int i2sbus_control_clock(struct i2sbus_control *c, 1238c2ecf20Sopenharmony_ci struct i2sbus_dev *i2sdev, 1248c2ecf20Sopenharmony_ci int enable); 1258c2ecf20Sopenharmony_ci#endif /* __I2SBUS_H */ 126