162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * i2sbus driver -- private definitions
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#ifndef __I2SBUS_H
862306a36Sopenharmony_ci#define __I2SBUS_H
962306a36Sopenharmony_ci#include <linux/interrupt.h>
1062306a36Sopenharmony_ci#include <linux/spinlock.h>
1162306a36Sopenharmony_ci#include <linux/mutex.h>
1262306a36Sopenharmony_ci#include <linux/completion.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <sound/pcm.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <asm/prom.h>
1762306a36Sopenharmony_ci#include <asm/pmac_feature.h>
1862306a36Sopenharmony_ci#include <asm/dbdma.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "interface.h"
2162306a36Sopenharmony_ci#include "../soundbus.h"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct i2sbus_control {
2462306a36Sopenharmony_ci	struct list_head list;
2562306a36Sopenharmony_ci	struct macio_chip *macio;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define MAX_DBDMA_COMMANDS	32
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct dbdma_command_mem {
3162306a36Sopenharmony_ci	dma_addr_t bus_addr;
3262306a36Sopenharmony_ci	dma_addr_t bus_cmd_start;
3362306a36Sopenharmony_ci	struct dbdma_cmd *cmds;
3462306a36Sopenharmony_ci	void *space;
3562306a36Sopenharmony_ci	int size;
3662306a36Sopenharmony_ci	u32 running:1;
3762306a36Sopenharmony_ci	u32 stopping:1;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct pcm_info {
4162306a36Sopenharmony_ci	u32 created:1, /* has this direction been created with alsa? */
4262306a36Sopenharmony_ci	    active:1;  /* is this stream active? */
4362306a36Sopenharmony_ci	/* runtime information */
4462306a36Sopenharmony_ci	struct snd_pcm_substream *substream;
4562306a36Sopenharmony_ci	int current_period;
4662306a36Sopenharmony_ci	u32 frame_count;
4762306a36Sopenharmony_ci	struct dbdma_command_mem dbdma_ring;
4862306a36Sopenharmony_ci	volatile struct dbdma_regs __iomem *dbdma;
4962306a36Sopenharmony_ci	struct completion *stop_completion;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cienum {
5362306a36Sopenharmony_ci	aoa_resource_i2smmio = 0,
5462306a36Sopenharmony_ci	aoa_resource_txdbdma,
5562306a36Sopenharmony_ci	aoa_resource_rxdbdma,
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistruct i2sbus_dev {
5962306a36Sopenharmony_ci	struct soundbus_dev sound;
6062306a36Sopenharmony_ci	struct macio_dev *macio;
6162306a36Sopenharmony_ci	struct i2sbus_control *control;
6262306a36Sopenharmony_ci	volatile struct i2s_interface_regs __iomem *intfregs;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	struct resource resources[3];
6562306a36Sopenharmony_ci	struct resource *allocated_resource[3];
6662306a36Sopenharmony_ci	int interrupts[3];
6762306a36Sopenharmony_ci	char rnames[3][32];
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	/* info about currently active substreams */
7062306a36Sopenharmony_ci	struct pcm_info out, in;
7162306a36Sopenharmony_ci	snd_pcm_format_t format;
7262306a36Sopenharmony_ci	unsigned int rate;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	/* list for a single controller */
7562306a36Sopenharmony_ci	struct list_head item;
7662306a36Sopenharmony_ci	/* number of bus on controller */
7762306a36Sopenharmony_ci	int bus_number;
7862306a36Sopenharmony_ci	/* for use by control layer */
7962306a36Sopenharmony_ci	struct pmf_function *enable,
8062306a36Sopenharmony_ci			    *cell_enable,
8162306a36Sopenharmony_ci			    *cell_disable,
8262306a36Sopenharmony_ci			    *clock_enable,
8362306a36Sopenharmony_ci			    *clock_disable;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	/* locks */
8662306a36Sopenharmony_ci	/* spinlock for low-level interrupt locking */
8762306a36Sopenharmony_ci	spinlock_t low_lock;
8862306a36Sopenharmony_ci	/* mutex for high-level consistency */
8962306a36Sopenharmony_ci	struct mutex lock;
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define soundbus_dev_to_i2sbus_dev(sdev) \
9362306a36Sopenharmony_ci		container_of(sdev, struct i2sbus_dev, sound)
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/* pcm specific functions */
9662306a36Sopenharmony_ciextern int
9762306a36Sopenharmony_cii2sbus_attach_codec(struct soundbus_dev *dev, struct snd_card *card,
9862306a36Sopenharmony_ci		    struct codec_info *ci, void *data);
9962306a36Sopenharmony_ciextern void
10062306a36Sopenharmony_cii2sbus_detach_codec(struct soundbus_dev *dev, void *data);
10162306a36Sopenharmony_ciextern irqreturn_t
10262306a36Sopenharmony_cii2sbus_tx_intr(int irq, void *devid);
10362306a36Sopenharmony_ciextern irqreturn_t
10462306a36Sopenharmony_cii2sbus_rx_intr(int irq, void *devid);
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ciextern void i2sbus_wait_for_stop_both(struct i2sbus_dev *i2sdev);
10762306a36Sopenharmony_ciextern void i2sbus_pcm_prepare_both(struct i2sbus_dev *i2sdev);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* control specific functions */
11062306a36Sopenharmony_ciextern int i2sbus_control_init(struct macio_dev* dev,
11162306a36Sopenharmony_ci			       struct i2sbus_control **c);
11262306a36Sopenharmony_ciextern void i2sbus_control_destroy(struct i2sbus_control *c);
11362306a36Sopenharmony_ciextern int i2sbus_control_add_dev(struct i2sbus_control *c,
11462306a36Sopenharmony_ci				  struct i2sbus_dev *i2sdev);
11562306a36Sopenharmony_ciextern void i2sbus_control_remove_dev(struct i2sbus_control *c,
11662306a36Sopenharmony_ci				      struct i2sbus_dev *i2sdev);
11762306a36Sopenharmony_ciextern int i2sbus_control_enable(struct i2sbus_control *c,
11862306a36Sopenharmony_ci				 struct i2sbus_dev *i2sdev);
11962306a36Sopenharmony_ciextern int i2sbus_control_cell(struct i2sbus_control *c,
12062306a36Sopenharmony_ci			       struct i2sbus_dev *i2sdev,
12162306a36Sopenharmony_ci			       int enable);
12262306a36Sopenharmony_ciextern int i2sbus_control_clock(struct i2sbus_control *c,
12362306a36Sopenharmony_ci				struct i2sbus_dev *i2sdev,
12462306a36Sopenharmony_ci				int enable);
12562306a36Sopenharmony_ci#endif /* __I2SBUS_H */
126