mirror of https://gitee.com/openkylin/linux.git
ALSA: firewire-motu: add wrapper functions for protocol-dependent operations
This commit adds helper functions which wraps function call for each protocol. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Link: https://lore.kernel.org/r/20200519111641.123211-5-o-takashi@sakamocchi.jp Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
61d79c70c9
commit
ff222b7e45
|
@ -133,7 +133,6 @@ static int init_hw_info(struct snd_motu *motu,
|
|||
static int pcm_open(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_motu *motu = substream->private_data;
|
||||
const struct snd_motu_protocol *const protocol = motu->spec->protocol;
|
||||
struct amdtp_domain *d = &motu->domain;
|
||||
enum snd_motu_clock_source src;
|
||||
int err;
|
||||
|
@ -152,7 +151,7 @@ static int pcm_open(struct snd_pcm_substream *substream)
|
|||
if (err < 0)
|
||||
goto err_locked;
|
||||
|
||||
err = protocol->get_clock_source(motu, &src);
|
||||
err = snd_motu_protocol_get_clock_source(motu, &src);
|
||||
if (err < 0)
|
||||
goto err_locked;
|
||||
|
||||
|
@ -166,7 +165,7 @@ static int pcm_open(struct snd_pcm_substream *substream)
|
|||
unsigned int frames_per_buffer = d->events_per_buffer;
|
||||
unsigned int rate;
|
||||
|
||||
err = protocol->get_clock_rate(motu, &rate);
|
||||
err = snd_motu_protocol_get_clock_rate(motu, &rate);
|
||||
if (err < 0)
|
||||
goto err_locked;
|
||||
|
||||
|
|
|
@ -28,13 +28,12 @@ static void proc_read_clock(struct snd_info_entry *entry,
|
|||
{
|
||||
|
||||
struct snd_motu *motu = entry->private_data;
|
||||
const struct snd_motu_protocol *const protocol = motu->spec->protocol;
|
||||
unsigned int rate;
|
||||
enum snd_motu_clock_source source;
|
||||
|
||||
if (protocol->get_clock_rate(motu, &rate) < 0)
|
||||
if (snd_motu_protocol_get_clock_rate(motu, &rate) < 0)
|
||||
return;
|
||||
if (protocol->get_clock_source(motu, &source) < 0)
|
||||
if (snd_motu_protocol_get_clock_source(motu, &source) < 0)
|
||||
return;
|
||||
|
||||
snd_iprintf(buffer, "Rate:\t%d\n", rate);
|
||||
|
@ -45,12 +44,11 @@ static void proc_read_format(struct snd_info_entry *entry,
|
|||
struct snd_info_buffer *buffer)
|
||||
{
|
||||
struct snd_motu *motu = entry->private_data;
|
||||
const struct snd_motu_protocol *const protocol = motu->spec->protocol;
|
||||
unsigned int mode;
|
||||
struct snd_motu_packet_format *formats;
|
||||
int i;
|
||||
|
||||
if (protocol->cache_packet_formats(motu) < 0)
|
||||
if (snd_motu_protocol_cache_packet_formats(motu) < 0)
|
||||
return;
|
||||
|
||||
snd_iprintf(buffer, "tx:\tmsg\tfixed\tdiffered\n");
|
||||
|
|
|
@ -35,7 +35,8 @@ static int get_clock_rate(u32 data, unsigned int *rate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int v2_get_clock_rate(struct snd_motu *motu, unsigned int *rate)
|
||||
int snd_motu_protocol_v2_get_clock_rate(struct snd_motu *motu,
|
||||
unsigned int *rate)
|
||||
{
|
||||
__be32 reg;
|
||||
int err;
|
||||
|
@ -48,7 +49,8 @@ static int v2_get_clock_rate(struct snd_motu *motu, unsigned int *rate)
|
|||
return get_clock_rate(be32_to_cpu(reg), rate);
|
||||
}
|
||||
|
||||
static int v2_set_clock_rate(struct snd_motu *motu, unsigned int rate)
|
||||
int snd_motu_protocol_v2_set_clock_rate(struct snd_motu *motu,
|
||||
unsigned int rate)
|
||||
{
|
||||
__be32 reg;
|
||||
u32 data;
|
||||
|
@ -122,8 +124,8 @@ static int get_clock_source(struct snd_motu *motu, u32 data,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int v2_get_clock_source(struct snd_motu *motu,
|
||||
enum snd_motu_clock_source *src)
|
||||
int snd_motu_protocol_v2_get_clock_source(struct snd_motu *motu,
|
||||
enum snd_motu_clock_source *src)
|
||||
{
|
||||
__be32 reg;
|
||||
int err;
|
||||
|
@ -136,7 +138,8 @@ static int v2_get_clock_source(struct snd_motu *motu,
|
|||
return get_clock_source(motu, be32_to_cpu(reg), src);
|
||||
}
|
||||
|
||||
static int v2_switch_fetching_mode(struct snd_motu *motu, bool enable)
|
||||
int snd_motu_protocol_v2_switch_fetching_mode(struct snd_motu *motu,
|
||||
bool enable)
|
||||
{
|
||||
enum snd_motu_clock_source src;
|
||||
__be32 reg;
|
||||
|
@ -265,7 +268,7 @@ static void calculate_differed_part(struct snd_motu_packet_format *formats,
|
|||
formats->differed_part_pcm_chunks[1] = pcm_chunks[1];
|
||||
}
|
||||
|
||||
static int v2_cache_packet_formats(struct snd_motu *motu)
|
||||
int snd_motu_protocol_v2_cache_packet_formats(struct snd_motu *motu)
|
||||
{
|
||||
__be32 reg;
|
||||
u32 data;
|
||||
|
@ -294,11 +297,6 @@ static int v2_cache_packet_formats(struct snd_motu *motu)
|
|||
}
|
||||
|
||||
static const struct snd_motu_protocol snd_motu_protocol_v2 = {
|
||||
.get_clock_rate = v2_get_clock_rate,
|
||||
.set_clock_rate = v2_set_clock_rate,
|
||||
.get_clock_source = v2_get_clock_source,
|
||||
.switch_fetching_mode = v2_switch_fetching_mode,
|
||||
.cache_packet_formats = v2_cache_packet_formats,
|
||||
};
|
||||
|
||||
const struct snd_motu_spec snd_motu_spec_828mk2 = {
|
||||
|
|
|
@ -24,7 +24,8 @@
|
|||
#define V3_NO_ADAT_OPT_OUT_IFACE_A 0x00040000
|
||||
#define V3_NO_ADAT_OPT_OUT_IFACE_B 0x00400000
|
||||
|
||||
static int v3_get_clock_rate(struct snd_motu *motu, unsigned int *rate)
|
||||
int snd_motu_protocol_v3_get_clock_rate(struct snd_motu *motu,
|
||||
unsigned int *rate)
|
||||
{
|
||||
__be32 reg;
|
||||
u32 data;
|
||||
|
@ -45,7 +46,8 @@ static int v3_get_clock_rate(struct snd_motu *motu, unsigned int *rate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int v3_set_clock_rate(struct snd_motu *motu, unsigned int rate)
|
||||
int snd_motu_protocol_v3_set_clock_rate(struct snd_motu *motu,
|
||||
unsigned int rate)
|
||||
{
|
||||
__be32 reg;
|
||||
u32 data;
|
||||
|
@ -85,8 +87,8 @@ static int v3_set_clock_rate(struct snd_motu *motu, unsigned int rate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int v3_get_clock_source(struct snd_motu *motu,
|
||||
enum snd_motu_clock_source *src)
|
||||
int snd_motu_protocol_v3_get_clock_source(struct snd_motu *motu,
|
||||
enum snd_motu_clock_source *src)
|
||||
{
|
||||
__be32 reg;
|
||||
u32 data;
|
||||
|
@ -133,7 +135,8 @@ static int v3_get_clock_source(struct snd_motu *motu,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int v3_switch_fetching_mode(struct snd_motu *motu, bool enable)
|
||||
int snd_motu_protocol_v3_switch_fetching_mode(struct snd_motu *motu,
|
||||
bool enable)
|
||||
{
|
||||
__be32 reg;
|
||||
u32 data;
|
||||
|
@ -275,7 +278,7 @@ static void calculate_differed_part(struct snd_motu_packet_format *formats,
|
|||
}
|
||||
}
|
||||
|
||||
static int v3_cache_packet_formats(struct snd_motu *motu)
|
||||
int snd_motu_protocol_v3_cache_packet_formats(struct snd_motu *motu)
|
||||
{
|
||||
__be32 reg;
|
||||
u32 data;
|
||||
|
@ -308,11 +311,6 @@ static int v3_cache_packet_formats(struct snd_motu *motu)
|
|||
}
|
||||
|
||||
static const struct snd_motu_protocol snd_motu_protocol_v3 = {
|
||||
.get_clock_rate = v3_get_clock_rate,
|
||||
.set_clock_rate = v3_set_clock_rate,
|
||||
.get_clock_source = v3_get_clock_source,
|
||||
.switch_fetching_mode = v3_switch_fetching_mode,
|
||||
.cache_packet_formats = v3_cache_packet_formats,
|
||||
};
|
||||
|
||||
const struct snd_motu_spec snd_motu_spec_828mk3 = {
|
||||
|
|
|
@ -88,7 +88,7 @@ static void finish_session(struct snd_motu *motu)
|
|||
u32 data;
|
||||
int err;
|
||||
|
||||
err = motu->spec->protocol->switch_fetching_mode(motu, false);
|
||||
err = snd_motu_protocol_switch_fetching_mode(motu, false);
|
||||
if (err < 0)
|
||||
return;
|
||||
|
||||
|
@ -110,7 +110,7 @@ int snd_motu_stream_cache_packet_formats(struct snd_motu *motu)
|
|||
{
|
||||
int err;
|
||||
|
||||
err = motu->spec->protocol->cache_packet_formats(motu);
|
||||
err = snd_motu_protocol_cache_packet_formats(motu);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
@ -140,7 +140,7 @@ int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate,
|
|||
unsigned int curr_rate;
|
||||
int err;
|
||||
|
||||
err = motu->spec->protocol->get_clock_rate(motu, &curr_rate);
|
||||
err = snd_motu_protocol_get_clock_rate(motu, &curr_rate);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (rate == 0)
|
||||
|
@ -153,7 +153,7 @@ int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate,
|
|||
fw_iso_resources_free(&motu->tx_resources);
|
||||
fw_iso_resources_free(&motu->rx_resources);
|
||||
|
||||
err = motu->spec->protocol->set_clock_rate(motu, rate);
|
||||
err = snd_motu_protocol_set_clock_rate(motu, rate);
|
||||
if (err < 0) {
|
||||
dev_err(&motu->unit->device,
|
||||
"fail to set sampling rate: %d\n", err);
|
||||
|
@ -272,7 +272,7 @@ int snd_motu_stream_start_duplex(struct snd_motu *motu)
|
|||
goto stop_streams;
|
||||
}
|
||||
|
||||
err = motu->spec->protocol->switch_fetching_mode(motu, true);
|
||||
err = snd_motu_protocol_switch_fetching_mode(motu, true);
|
||||
if (err < 0) {
|
||||
dev_err(&motu->unit->device,
|
||||
"fail to enable frame fetching: %d\n", err);
|
||||
|
|
|
@ -179,4 +179,79 @@ int snd_motu_create_pcm_devices(struct snd_motu *motu);
|
|||
int snd_motu_create_midi_devices(struct snd_motu *motu);
|
||||
|
||||
int snd_motu_create_hwdep_device(struct snd_motu *motu);
|
||||
|
||||
int snd_motu_protocol_v2_get_clock_rate(struct snd_motu *motu,
|
||||
unsigned int *rate);
|
||||
int snd_motu_protocol_v2_set_clock_rate(struct snd_motu *motu,
|
||||
unsigned int rate);
|
||||
int snd_motu_protocol_v2_get_clock_source(struct snd_motu *motu,
|
||||
enum snd_motu_clock_source *src);
|
||||
int snd_motu_protocol_v2_switch_fetching_mode(struct snd_motu *motu,
|
||||
bool enable);
|
||||
int snd_motu_protocol_v2_cache_packet_formats(struct snd_motu *motu);
|
||||
|
||||
int snd_motu_protocol_v3_get_clock_rate(struct snd_motu *motu,
|
||||
unsigned int *rate);
|
||||
int snd_motu_protocol_v3_set_clock_rate(struct snd_motu *motu,
|
||||
unsigned int rate);
|
||||
int snd_motu_protocol_v3_get_clock_source(struct snd_motu *motu,
|
||||
enum snd_motu_clock_source *src);
|
||||
int snd_motu_protocol_v3_switch_fetching_mode(struct snd_motu *motu,
|
||||
bool enable);
|
||||
int snd_motu_protocol_v3_cache_packet_formats(struct snd_motu *motu);
|
||||
|
||||
static inline int snd_motu_protocol_get_clock_rate(struct snd_motu *motu,
|
||||
unsigned int *rate)
|
||||
{
|
||||
if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
|
||||
return snd_motu_protocol_v2_get_clock_rate(motu, rate);
|
||||
else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
|
||||
return snd_motu_protocol_v3_get_clock_rate(motu, rate);
|
||||
else
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int snd_motu_protocol_set_clock_rate(struct snd_motu *motu,
|
||||
unsigned int rate)
|
||||
{
|
||||
if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
|
||||
return snd_motu_protocol_v2_set_clock_rate(motu, rate);
|
||||
else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
|
||||
return snd_motu_protocol_v3_set_clock_rate(motu, rate);
|
||||
else
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int snd_motu_protocol_get_clock_source(struct snd_motu *motu,
|
||||
enum snd_motu_clock_source *source)
|
||||
{
|
||||
if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
|
||||
return snd_motu_protocol_v2_get_clock_source(motu, source);
|
||||
else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
|
||||
return snd_motu_protocol_v3_get_clock_source(motu, source);
|
||||
else
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int snd_motu_protocol_switch_fetching_mode(struct snd_motu *motu,
|
||||
bool enable)
|
||||
{
|
||||
if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
|
||||
return snd_motu_protocol_v2_switch_fetching_mode(motu, enable);
|
||||
else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
|
||||
return snd_motu_protocol_v3_switch_fetching_mode(motu, enable);
|
||||
else
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int snd_motu_protocol_cache_packet_formats(struct snd_motu *motu)
|
||||
{
|
||||
if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
|
||||
return snd_motu_protocol_v2_cache_packet_formats(motu);
|
||||
else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
|
||||
return snd_motu_protocol_v3_cache_packet_formats(motu);
|
||||
else
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue