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