Commit ff222b7e authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

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: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20200519111641.123211-5-o-takashi@sakamocchi.jpSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 61d79c70
...@@ -133,7 +133,6 @@ static int init_hw_info(struct snd_motu *motu, ...@@ -133,7 +133,6 @@ static int init_hw_info(struct snd_motu *motu,
static int pcm_open(struct snd_pcm_substream *substream) static int pcm_open(struct snd_pcm_substream *substream)
{ {
struct snd_motu *motu = substream->private_data; struct snd_motu *motu = substream->private_data;
const struct snd_motu_protocol *const protocol = motu->spec->protocol;
struct amdtp_domain *d = &motu->domain; struct amdtp_domain *d = &motu->domain;
enum snd_motu_clock_source src; enum snd_motu_clock_source src;
int err; int err;
...@@ -152,7 +151,7 @@ static int pcm_open(struct snd_pcm_substream *substream) ...@@ -152,7 +151,7 @@ static int pcm_open(struct snd_pcm_substream *substream)
if (err < 0) if (err < 0)
goto err_locked; goto err_locked;
err = protocol->get_clock_source(motu, &src); err = snd_motu_protocol_get_clock_source(motu, &src);
if (err < 0) if (err < 0)
goto err_locked; goto err_locked;
...@@ -166,7 +165,7 @@ static int pcm_open(struct snd_pcm_substream *substream) ...@@ -166,7 +165,7 @@ static int pcm_open(struct snd_pcm_substream *substream)
unsigned int frames_per_buffer = d->events_per_buffer; unsigned int frames_per_buffer = d->events_per_buffer;
unsigned int rate; unsigned int rate;
err = protocol->get_clock_rate(motu, &rate); err = snd_motu_protocol_get_clock_rate(motu, &rate);
if (err < 0) if (err < 0)
goto err_locked; goto err_locked;
......
...@@ -28,13 +28,12 @@ static void proc_read_clock(struct snd_info_entry *entry, ...@@ -28,13 +28,12 @@ static void proc_read_clock(struct snd_info_entry *entry,
{ {
struct snd_motu *motu = entry->private_data; struct snd_motu *motu = entry->private_data;
const struct snd_motu_protocol *const protocol = motu->spec->protocol;
unsigned int rate; unsigned int rate;
enum snd_motu_clock_source source; 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; return;
if (protocol->get_clock_source(motu, &source) < 0) if (snd_motu_protocol_get_clock_source(motu, &source) < 0)
return; return;
snd_iprintf(buffer, "Rate:\t%d\n", rate); snd_iprintf(buffer, "Rate:\t%d\n", rate);
...@@ -45,12 +44,11 @@ static void proc_read_format(struct snd_info_entry *entry, ...@@ -45,12 +44,11 @@ static void proc_read_format(struct snd_info_entry *entry,
struct snd_info_buffer *buffer) struct snd_info_buffer *buffer)
{ {
struct snd_motu *motu = entry->private_data; struct snd_motu *motu = entry->private_data;
const struct snd_motu_protocol *const protocol = motu->spec->protocol;
unsigned int mode; unsigned int mode;
struct snd_motu_packet_format *formats; struct snd_motu_packet_format *formats;
int i; int i;
if (protocol->cache_packet_formats(motu) < 0) if (snd_motu_protocol_cache_packet_formats(motu) < 0)
return; return;
snd_iprintf(buffer, "tx:\tmsg\tfixed\tdiffered\n"); snd_iprintf(buffer, "tx:\tmsg\tfixed\tdiffered\n");
......
...@@ -35,7 +35,8 @@ static int get_clock_rate(u32 data, unsigned int *rate) ...@@ -35,7 +35,8 @@ static int get_clock_rate(u32 data, unsigned int *rate)
return 0; 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; __be32 reg;
int err; int err;
...@@ -48,7 +49,8 @@ static int v2_get_clock_rate(struct snd_motu *motu, unsigned int *rate) ...@@ -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); 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; __be32 reg;
u32 data; u32 data;
...@@ -122,8 +124,8 @@ static int get_clock_source(struct snd_motu *motu, u32 data, ...@@ -122,8 +124,8 @@ static int get_clock_source(struct snd_motu *motu, u32 data,
return 0; return 0;
} }
static int v2_get_clock_source(struct snd_motu *motu, int snd_motu_protocol_v2_get_clock_source(struct snd_motu *motu,
enum snd_motu_clock_source *src) enum snd_motu_clock_source *src)
{ {
__be32 reg; __be32 reg;
int err; int err;
...@@ -136,7 +138,8 @@ static int v2_get_clock_source(struct snd_motu *motu, ...@@ -136,7 +138,8 @@ static int v2_get_clock_source(struct snd_motu *motu,
return get_clock_source(motu, be32_to_cpu(reg), src); 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; enum snd_motu_clock_source src;
__be32 reg; __be32 reg;
...@@ -265,7 +268,7 @@ static void calculate_differed_part(struct snd_motu_packet_format *formats, ...@@ -265,7 +268,7 @@ static void calculate_differed_part(struct snd_motu_packet_format *formats,
formats->differed_part_pcm_chunks[1] = pcm_chunks[1]; 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; __be32 reg;
u32 data; u32 data;
...@@ -294,11 +297,6 @@ static int v2_cache_packet_formats(struct snd_motu *motu) ...@@ -294,11 +297,6 @@ static int v2_cache_packet_formats(struct snd_motu *motu)
} }
static const struct snd_motu_protocol snd_motu_protocol_v2 = { 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 = { const struct snd_motu_spec snd_motu_spec_828mk2 = {
......
...@@ -24,7 +24,8 @@ ...@@ -24,7 +24,8 @@
#define V3_NO_ADAT_OPT_OUT_IFACE_A 0x00040000 #define V3_NO_ADAT_OPT_OUT_IFACE_A 0x00040000
#define V3_NO_ADAT_OPT_OUT_IFACE_B 0x00400000 #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; __be32 reg;
u32 data; u32 data;
...@@ -45,7 +46,8 @@ static int v3_get_clock_rate(struct snd_motu *motu, unsigned int *rate) ...@@ -45,7 +46,8 @@ static int v3_get_clock_rate(struct snd_motu *motu, unsigned int *rate)
return 0; 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; __be32 reg;
u32 data; u32 data;
...@@ -85,8 +87,8 @@ static int v3_set_clock_rate(struct snd_motu *motu, unsigned int rate) ...@@ -85,8 +87,8 @@ static int v3_set_clock_rate(struct snd_motu *motu, unsigned int rate)
return 0; return 0;
} }
static int v3_get_clock_source(struct snd_motu *motu, int snd_motu_protocol_v3_get_clock_source(struct snd_motu *motu,
enum snd_motu_clock_source *src) enum snd_motu_clock_source *src)
{ {
__be32 reg; __be32 reg;
u32 data; u32 data;
...@@ -133,7 +135,8 @@ static int v3_get_clock_source(struct snd_motu *motu, ...@@ -133,7 +135,8 @@ static int v3_get_clock_source(struct snd_motu *motu,
return 0; 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; __be32 reg;
u32 data; u32 data;
...@@ -275,7 +278,7 @@ static void calculate_differed_part(struct snd_motu_packet_format *formats, ...@@ -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; __be32 reg;
u32 data; u32 data;
...@@ -308,11 +311,6 @@ static int v3_cache_packet_formats(struct snd_motu *motu) ...@@ -308,11 +311,6 @@ static int v3_cache_packet_formats(struct snd_motu *motu)
} }
static const struct snd_motu_protocol snd_motu_protocol_v3 = { 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 = { const struct snd_motu_spec snd_motu_spec_828mk3 = {
......
...@@ -88,7 +88,7 @@ static void finish_session(struct snd_motu *motu) ...@@ -88,7 +88,7 @@ static void finish_session(struct snd_motu *motu)
u32 data; u32 data;
int err; int err;
err = motu->spec->protocol->switch_fetching_mode(motu, false); err = snd_motu_protocol_switch_fetching_mode(motu, false);
if (err < 0) if (err < 0)
return; return;
...@@ -110,7 +110,7 @@ int snd_motu_stream_cache_packet_formats(struct snd_motu *motu) ...@@ -110,7 +110,7 @@ int snd_motu_stream_cache_packet_formats(struct snd_motu *motu)
{ {
int err; int err;
err = motu->spec->protocol->cache_packet_formats(motu); err = snd_motu_protocol_cache_packet_formats(motu);
if (err < 0) if (err < 0)
return err; return err;
...@@ -140,7 +140,7 @@ int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate, ...@@ -140,7 +140,7 @@ int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate,
unsigned int curr_rate; unsigned int curr_rate;
int err; 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) if (err < 0)
return err; return err;
if (rate == 0) if (rate == 0)
...@@ -153,7 +153,7 @@ int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate, ...@@ -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->tx_resources);
fw_iso_resources_free(&motu->rx_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) { if (err < 0) {
dev_err(&motu->unit->device, dev_err(&motu->unit->device,
"fail to set sampling rate: %d\n", err); "fail to set sampling rate: %d\n", err);
...@@ -272,7 +272,7 @@ int snd_motu_stream_start_duplex(struct snd_motu *motu) ...@@ -272,7 +272,7 @@ int snd_motu_stream_start_duplex(struct snd_motu *motu)
goto stop_streams; goto stop_streams;
} }
err = motu->spec->protocol->switch_fetching_mode(motu, true); err = snd_motu_protocol_switch_fetching_mode(motu, true);
if (err < 0) { if (err < 0) {
dev_err(&motu->unit->device, dev_err(&motu->unit->device,
"fail to enable frame fetching: %d\n", err); "fail to enable frame fetching: %d\n", err);
......
...@@ -179,4 +179,79 @@ int snd_motu_create_pcm_devices(struct snd_motu *motu); ...@@ -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_midi_devices(struct snd_motu *motu);
int snd_motu_create_hwdep_device(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 #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment