162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci#ifndef __SOUND_SEQ_DEVICE_H
362306a36Sopenharmony_ci#define __SOUND_SEQ_DEVICE_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci *  ALSA sequencer device management
762306a36Sopenharmony_ci *  Copyright (c) 1999 by Takashi Iwai <tiwai@suse.de>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/*
1162306a36Sopenharmony_ci * registered device information
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct snd_seq_device {
1562306a36Sopenharmony_ci	/* device info */
1662306a36Sopenharmony_ci	struct snd_card *card;	/* sound card */
1762306a36Sopenharmony_ci	int device;		/* device number */
1862306a36Sopenharmony_ci	const char *id;		/* driver id */
1962306a36Sopenharmony_ci	char name[80];		/* device name */
2062306a36Sopenharmony_ci	int argsize;		/* size of the argument */
2162306a36Sopenharmony_ci	void *driver_data;	/* private data for driver */
2262306a36Sopenharmony_ci	void *private_data;	/* private data for the caller */
2362306a36Sopenharmony_ci	void (*private_free)(struct snd_seq_device *device);
2462306a36Sopenharmony_ci	struct device dev;
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define to_seq_dev(_dev) \
2862306a36Sopenharmony_ci	container_of(_dev, struct snd_seq_device, dev)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* sequencer driver */
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* driver operators
3362306a36Sopenharmony_ci * probe:
3462306a36Sopenharmony_ci *	Initialize the device with given parameters.
3562306a36Sopenharmony_ci *	Typically,
3662306a36Sopenharmony_ci *		1. call snd_hwdep_new
3762306a36Sopenharmony_ci *		2. allocate private data and initialize it
3862306a36Sopenharmony_ci *		3. call snd_hwdep_register
3962306a36Sopenharmony_ci *		4. store the instance to dev->driver_data pointer.
4062306a36Sopenharmony_ci *
4162306a36Sopenharmony_ci * remove:
4262306a36Sopenharmony_ci *	Release the private data.
4362306a36Sopenharmony_ci *	Typically, call snd_device_free(dev->card, dev->driver_data)
4462306a36Sopenharmony_ci */
4562306a36Sopenharmony_cistruct snd_seq_driver {
4662306a36Sopenharmony_ci	struct device_driver driver;
4762306a36Sopenharmony_ci	char *id;
4862306a36Sopenharmony_ci	int argsize;
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define to_seq_drv(_drv) \
5262306a36Sopenharmony_ci	container_of(_drv, struct snd_seq_driver, driver)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/*
5562306a36Sopenharmony_ci * prototypes
5662306a36Sopenharmony_ci */
5762306a36Sopenharmony_ci#ifdef CONFIG_MODULES
5862306a36Sopenharmony_civoid snd_seq_device_load_drivers(void);
5962306a36Sopenharmony_ci#else
6062306a36Sopenharmony_ci#define snd_seq_device_load_drivers()
6162306a36Sopenharmony_ci#endif
6262306a36Sopenharmony_ciint snd_seq_device_new(struct snd_card *card, int device, const char *id,
6362306a36Sopenharmony_ci		       int argsize, struct snd_seq_device **result);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define SNDRV_SEQ_DEVICE_ARGPTR(dev) (void *)((char *)(dev) + sizeof(struct snd_seq_device))
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciint __must_check __snd_seq_driver_register(struct snd_seq_driver *drv,
6862306a36Sopenharmony_ci					   struct module *mod);
6962306a36Sopenharmony_ci#define snd_seq_driver_register(drv) \
7062306a36Sopenharmony_ci	__snd_seq_driver_register(drv, THIS_MODULE)
7162306a36Sopenharmony_civoid snd_seq_driver_unregister(struct snd_seq_driver *drv);
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define module_snd_seq_driver(drv) \
7462306a36Sopenharmony_ci	module_driver(drv, snd_seq_driver_register, snd_seq_driver_unregister)
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/*
7762306a36Sopenharmony_ci * id strings for generic devices
7862306a36Sopenharmony_ci */
7962306a36Sopenharmony_ci#define SNDRV_SEQ_DEV_ID_MIDISYNTH	"seq-midi"
8062306a36Sopenharmony_ci#define SNDRV_SEQ_DEV_ID_OPL3		"opl3-synth"
8162306a36Sopenharmony_ci#define SNDRV_SEQ_DEV_ID_UMP		"seq-ump-client"
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#endif /* __SOUND_SEQ_DEVICE_H */
84