ASoC: fsi: PortA/B information was controlled by sh_fsi_port_info
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 3 Feb 2012 08:58:48 +0000 (00:58 -0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 3 Feb 2012 11:55:40 +0000 (11:55 +0000)
Current FSI got each PortA/B parameter by porta_flags/portb_flags from platform.
And .set_rate function was shared for PortA/B.
This structure was not readable and not flexible.
This patch adds sh_fsi_port_info, and its own settings was added on each platform.
it is preparation for DMAEngine support

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
arch/arm/mach-shmobile/board-ap4evb.c
arch/arm/mach-shmobile/board-mackerel.c
arch/sh/boards/mach-ecovec24/setup.c
arch/sh/boards/mach-se/7724/setup.c
include/sound/sh_fsi.h
sound/soc/sh/fsi.c

index aab0a349f759baaa6469373270539cab35b9cee4..2ac08b29e2784153394b5a24b0a69175e2418a6d 100644 (file)
@@ -745,26 +745,18 @@ fsi_set_rate_end:
        return ret;
 }
 
-static int fsi_set_rate(struct device *dev, int is_porta, int rate, int enable)
-{
-       int ret;
-
-       if (is_porta)
-               ret = fsi_ak4642_set_rate(dev, rate, enable);
-       else
-               ret = fsi_hdmi_set_rate(dev, rate, enable);
-
-       return ret;
-}
-
 static struct sh_fsi_platform_info fsi_info = {
-       .porta_flags = SH_FSI_BRS_INV,
-
-       .portb_flags = SH_FSI_BRS_INV |
-                      SH_FSI_BRM_INV |
-                      SH_FSI_LRS_INV |
-                      SH_FSI_FMT_SPDIF,
-       .set_rate = fsi_set_rate,
+       .port_a = {
+               .flags          = SH_FSI_BRS_INV,
+               .set_rate       = fsi_ak4642_set_rate,
+       },
+       .port_b = {
+               .flags          = SH_FSI_BRS_INV |
+                                 SH_FSI_BRM_INV |
+                                 SH_FSI_LRS_INV |
+                                 SH_FSI_FMT_SPDIF,
+               .set_rate       = fsi_hdmi_set_rate,
+       },
 };
 
 static struct resource fsi_resources[] = {
index 9b42fbd10f8edf2873dbfba0bf6399305c8603db..28d6d1f9dad4bf69f9280586faf7335d6c14fd36 100644 (file)
@@ -901,7 +901,7 @@ static int __fsi_set_round_rate(struct clk *clk, long rate, int enable)
        return clk_enable(clk);
 }
 
-static int fsi_set_rate(struct device *dev, int is_porta, int rate, int enable)
+static int fsi_b_set_rate(struct device *dev, int rate, int enable)
 {
        struct clk *fsib_clk;
        struct clk *fdiv_clk = &sh7372_fsidivb_clk;
@@ -910,10 +910,6 @@ static int fsi_set_rate(struct device *dev, int is_porta, int rate, int enable)
        int ackmd_bpfmd;
        int ret;
 
-       /* FSIA is slave mode. nothing to do here */
-       if (is_porta)
-               return 0;
-
        /* clock start */
        switch (rate) {
        case 44100:
@@ -957,14 +953,16 @@ fsi_set_rate_end:
 }
 
 static struct sh_fsi_platform_info fsi_info = {
-       .porta_flags =  SH_FSI_BRS_INV,
-
-       .portb_flags =  SH_FSI_BRS_INV  |
+       .port_a = {
+               .flags = SH_FSI_BRS_INV,
+       },
+       .port_b = {
+               .flags = SH_FSI_BRS_INV |
                        SH_FSI_BRM_INV  |
                        SH_FSI_LRS_INV  |
                        SH_FSI_FMT_SPDIF,
-
-       .set_rate = fsi_set_rate,
+               .set_rate = fsi_b_set_rate,
+       }
 };
 
 static struct resource fsi_resources[] = {
index 033ef2ba621f008c5c92ac0dace7808a5b21035b..1e146fcdb8a0e6a619b39a29de1dad6fd811468f 100644 (file)
@@ -767,7 +767,9 @@ static struct platform_device camera_devices[] = {
 
 /* FSI */
 static struct sh_fsi_platform_info fsi_info = {
-       .portb_flags = SH_FSI_BRS_INV,
+       .port_b = {
+               .flags = SH_FSI_BRS_INV,
+       },
 };
 
 static struct resource fsi_resources[] = {
index 036fe1adaef17b4367259a71d59e3ba642f9f64a..1fc5d47a5687024a1048fd93d8d7c552a56bb4a4 100644 (file)
@@ -277,7 +277,9 @@ static struct platform_device ceu1_device = {
 /* FSI */
 /* change J20, J21, J22 pin to 1-2 connection to use slave mode */
 static struct sh_fsi_platform_info fsi_info = {
-       .porta_flags = SH_FSI_BRS_INV,
+       .port_a = {
+               .flags = SH_FSI_BRS_INV,
+       },
 };
 
 static struct resource fsi_resources[] = {
index 9b1aacaa82fedd0fcb63365fae33237627c496c9..78cd77aff1f4c6a9195496d4e57a3e55ec6c1496 100644 (file)
 #define SH_FSI_BPFMD_32                (5 << 4)
 #define SH_FSI_BPFMD_16                (6 << 4)
 
+struct sh_fsi_port_info {
+       unsigned long flags;
+       int (*set_rate)(struct device *dev, int rate, int enable);
+};
+
 struct sh_fsi_platform_info {
-       unsigned long porta_flags;
-       unsigned long portb_flags;
-       int (*set_rate)(struct device *dev, int is_porta, int rate, int enable);
+       struct sh_fsi_port_info port_a;
+       struct sh_fsi_port_info port_b;
 };
 
 /*
index 1e10184af89a3921ce62b2ca9c52407b60556fde..75d0cda4bad4cead65eebde99bcb21adc89aa486 100644 (file)
 
 #define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
 
-typedef int (*set_rate_func)(struct device *dev, int is_porta, int rate, int enable);
+typedef int (*set_rate_func)(struct device *dev, int rate, int enable);
 
 /*
  * FSI driver use below type name for variable
@@ -185,6 +185,7 @@ struct fsi_stream {
 struct fsi_priv {
        void __iomem *base;
        struct fsi_master *master;
+       struct sh_fsi_port_info *info;
 
        struct fsi_stream playback;
        struct fsi_stream capture;
@@ -227,7 +228,6 @@ struct fsi_master {
        struct fsi_priv fsia;
        struct fsi_priv fsib;
        struct fsi_core *core;
-       struct sh_fsi_platform_info *info;
        spinlock_t lock;
 };
 
@@ -346,24 +346,20 @@ static struct fsi_priv *fsi_get_priv(struct snd_pcm_substream *substream)
        return fsi_get_priv_frm_dai(fsi_get_dai(substream));
 }
 
-static set_rate_func fsi_get_info_set_rate(struct fsi_master *master)
+static set_rate_func fsi_get_info_set_rate(struct fsi_priv *fsi)
 {
-       if (!master->info)
+       if (!fsi->info)
                return NULL;
 
-       return master->info->set_rate;
+       return fsi->info->set_rate;
 }
 
 static u32 fsi_get_info_flags(struct fsi_priv *fsi)
 {
-       int is_porta = fsi_is_port_a(fsi);
-       struct fsi_master *master = fsi_get_master(fsi);
-
-       if (!master->info)
+       if (!fsi->info)
                return 0;
 
-       return is_porta ? master->info->porta_flags :
-               master->info->portb_flags;
+       return fsi->info->flags;
 }
 
 static u32 fsi_get_port_shift(struct fsi_priv *fsi, struct fsi_stream *io)
@@ -628,11 +624,14 @@ static int fsi_set_master_clk(struct device *dev, struct fsi_priv *fsi,
                              long rate, int enable)
 {
        struct fsi_master *master = fsi_get_master(fsi);
-       set_rate_func set_rate = fsi_get_info_set_rate(master);
+       set_rate_func set_rate = fsi_get_info_set_rate(fsi);
        int fsi_ver = master->core->ver;
        int ret;
 
-       ret = set_rate(dev, fsi_is_port_a(fsi), rate, enable);
+       if (!set_rate)
+               return 0;
+
+       ret = set_rate(dev, rate, enable);
        if (ret < 0) /* error */
                return ret;
 
@@ -1093,8 +1092,7 @@ static int fsi_set_fmt_spdif(struct fsi_priv *fsi)
 static int fsi_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 {
        struct fsi_priv *fsi = fsi_get_priv_frm_dai(dai);
-       struct fsi_master *master = fsi_get_master(fsi);
-       set_rate_func set_rate = fsi_get_info_set_rate(master);
+       set_rate_func set_rate = fsi_get_info_set_rate(fsi);
        u32 flags = fsi_get_info_flags(fsi);
        int ret;
 
@@ -1312,6 +1310,7 @@ static int fsi_probe(struct platform_device *pdev)
 {
        struct fsi_master *master;
        const struct platform_device_id *id_entry;
+       struct sh_fsi_platform_info *info = pdev->dev.platform_data;
        struct resource *res;
        unsigned int irq;
        int ret;
@@ -1346,13 +1345,13 @@ static int fsi_probe(struct platform_device *pdev)
 
        /* master setting */
        master->irq             = irq;
-       master->info            = pdev->dev.platform_data;
        master->core            = (struct fsi_core *)id_entry->driver_data;
        spin_lock_init(&master->lock);
 
        /* FSI A setting */
        master->fsia.base       = master->base;
        master->fsia.master     = master;
+       master->fsia.info       = &info->port_a;
        fsi_handler_init(&master->fsia);
        ret = fsi_stream_probe(&master->fsia);
        if (ret < 0) {
@@ -1363,6 +1362,7 @@ static int fsi_probe(struct platform_device *pdev)
        /* FSI B setting */
        master->fsib.base       = master->base + 0x40;
        master->fsib.master     = master;
+       master->fsib.info       = &info->port_b;
        fsi_handler_init(&master->fsib);
        ret = fsi_stream_probe(&master->fsib);
        if (ret < 0) {