ALSA: firewire-motu: add wrapper functions for protocol-dependent operations
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 19 May 2020 11:16:31 +0000 (20:16 +0900)
committerTakashi Iwai <tiwai@suse.de>
Fri, 22 May 2020 14:52:12 +0000 (16:52 +0200)
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>
sound/firewire/motu/motu-pcm.c
sound/firewire/motu/motu-proc.c
sound/firewire/motu/motu-protocol-v2.c
sound/firewire/motu/motu-protocol-v3.c
sound/firewire/motu/motu-stream.c
sound/firewire/motu/motu.h

index 2d41a1a..b24bb87 100644 (file)
@@ -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;
 
index 187f6ab..71d0260 100644 (file)
@@ -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");
index 2cd710a..26534ed 100644 (file)
@@ -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 = {
index 548c977..d8b42d2 100644 (file)
@@ -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 = {
index 11a2b8b..87a8d90 100644 (file)
@@ -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);
index 9db6920..d598416 100644 (file)
@@ -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