Skip to content

Commit

Permalink
ASoC: fsi: PortA/B information was controlled by sh_fsi_port_info
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kuninori Morimoto authored and Mark Brown committed Feb 3, 2012
1 parent 97df818 commit fec691e
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 50 deletions.
30 changes: 11 additions & 19 deletions arch/arm/mach-shmobile/board-ap4evb.c
Original file line number Diff line number Diff line change
Expand Up @@ -745,26 +745,18 @@ static int fsi_hdmi_set_rate(struct device *dev, int rate, int enable)
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[] = {
Expand Down
18 changes: 8 additions & 10 deletions arch/arm/mach-shmobile/board-mackerel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -957,14 +953,16 @@ static int fsi_set_rate(struct device *dev, int is_porta, int rate, int enable)
}

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[] = {
Expand Down
4 changes: 3 additions & 1 deletion arch/sh/boards/mach-ecovec24/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand Down
4 changes: 3 additions & 1 deletion arch/sh/boards/mach-se/7724/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand Down
10 changes: 7 additions & 3 deletions include/sound/sh_fsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,14 @@
#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;
};

/*
Expand Down
32 changes: 16 additions & 16 deletions sound/soc/sh/fsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@

#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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
};

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down

0 comments on commit fec691e

Please sign in to comment.