diff options
| -rw-r--r-- | sound/soc/sh/rcar/ssi.c | 52 |
1 files changed, 20 insertions, 32 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 7613256c9840..b71cf9d7dd3f 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c | |||
| @@ -101,31 +101,30 @@ struct rsnd_ssiu { | |||
| 101 | #define rsnd_ssi_to_ssiu(ssi)\ | 101 | #define rsnd_ssi_to_ssiu(ssi)\ |
| 102 | (((struct rsnd_ssiu *)((ssi) - rsnd_mod_id(&(ssi)->mod))) - 1) | 102 | (((struct rsnd_ssiu *)((ssi) - rsnd_mod_id(&(ssi)->mod))) - 1) |
| 103 | 103 | ||
| 104 | static void rsnd_ssi_mode_init(struct rsnd_priv *priv, | 104 | static void rsnd_ssi_mode_set(struct rsnd_priv *priv, |
| 105 | struct rsnd_ssiu *ssiu) | 105 | struct rsnd_dai *rdai, |
| 106 | struct rsnd_ssi *ssi) | ||
| 106 | { | 107 | { |
| 107 | struct device *dev = rsnd_priv_to_dev(priv); | 108 | struct device *dev = rsnd_priv_to_dev(priv); |
| 108 | struct rsnd_ssi *ssi; | ||
| 109 | struct rsnd_mod *scu; | 109 | struct rsnd_mod *scu; |
| 110 | struct rsnd_ssiu *ssiu = rsnd_ssi_to_ssiu(ssi); | ||
| 111 | int id = rsnd_mod_id(&ssi->mod); | ||
| 110 | u32 flags; | 112 | u32 flags; |
| 111 | u32 val; | 113 | u32 val; |
| 112 | int i; | 114 | |
| 115 | scu = rsnd_scu_mod_get(priv, rsnd_mod_id(&ssi->mod)); | ||
| 113 | 116 | ||
| 114 | /* | 117 | /* |
| 115 | * SSI_MODE0 | 118 | * SSI_MODE0 |
| 116 | */ | 119 | */ |
| 117 | ssiu->ssi_mode0 = 0; | 120 | |
| 118 | for_each_rsnd_ssi(ssi, priv, i) { | 121 | /* see also BUSIF_MODE */ |
| 119 | flags = rsnd_ssi_mode_flags(ssi); | 122 | if (rsnd_scu_hpbif_is_enable(scu)) { |
| 120 | scu = rsnd_scu_mod_get(priv, rsnd_mod_id(&ssi->mod)); | 123 | ssiu->ssi_mode0 &= ~(1 << id); |
| 121 | 124 | dev_dbg(dev, "SSI%d uses DEPENDENT mode\n", id); | |
| 122 | /* see also BUSIF_MODE */ | 125 | } else { |
| 123 | if (rsnd_scu_hpbif_is_enable(scu)) { | 126 | ssiu->ssi_mode0 |= (1 << id); |
| 124 | dev_dbg(dev, "SSI%d uses DEPENDENT mode\n", i); | 127 | dev_dbg(dev, "SSI%d uses INDEPENDENT mode\n", id); |
| 125 | } else { | ||
| 126 | ssiu->ssi_mode0 |= (1 << i); | ||
| 127 | dev_dbg(dev, "SSI%d uses INDEPENDENT mode\n", i); | ||
| 128 | } | ||
| 129 | } | 128 | } |
| 130 | 129 | ||
| 131 | /* | 130 | /* |
| @@ -134,7 +133,7 @@ static void rsnd_ssi_mode_init(struct rsnd_priv *priv, | |||
| 134 | #define ssi_parent_set(p, sync, adg, ext) \ | 133 | #define ssi_parent_set(p, sync, adg, ext) \ |
| 135 | do { \ | 134 | do { \ |
| 136 | ssi->parent = ssiu->ssi + p; \ | 135 | ssi->parent = ssiu->ssi + p; \ |
| 137 | if (flags & RSND_SSI_CLK_FROM_ADG) \ | 136 | if (rsnd_rdai_is_clk_master(rdai)) \ |
| 138 | val = adg; \ | 137 | val = adg; \ |
| 139 | else \ | 138 | else \ |
| 140 | val = ext; \ | 139 | val = ext; \ |
| @@ -142,15 +141,11 @@ static void rsnd_ssi_mode_init(struct rsnd_priv *priv, | |||
| 142 | val |= sync; \ | 141 | val |= sync; \ |
| 143 | } while (0) | 142 | } while (0) |
| 144 | 143 | ||
| 145 | ssiu->ssi_mode1 = 0; | 144 | flags = rsnd_ssi_mode_flags(ssi); |
| 146 | for_each_rsnd_ssi(ssi, priv, i) { | 145 | if (flags & RSND_SSI_CLK_PIN_SHARE) { |
| 147 | flags = rsnd_ssi_mode_flags(ssi); | ||
| 148 | |||
| 149 | if (!(flags & RSND_SSI_CLK_PIN_SHARE)) | ||
| 150 | continue; | ||
| 151 | 146 | ||
| 152 | val = 0; | 147 | val = 0; |
| 153 | switch (i) { | 148 | switch (id) { |
| 154 | case 1: | 149 | case 1: |
| 155 | ssi_parent_set(0, (1 << 4), (0x2 << 0), (0x1 << 0)); | 150 | ssi_parent_set(0, (1 << 4), (0x2 << 0), (0x1 << 0)); |
| 156 | break; | 151 | break; |
| @@ -167,11 +162,6 @@ static void rsnd_ssi_mode_init(struct rsnd_priv *priv, | |||
| 167 | 162 | ||
| 168 | ssiu->ssi_mode1 |= val; | 163 | ssiu->ssi_mode1 |= val; |
| 169 | } | 164 | } |
| 170 | } | ||
| 171 | |||
| 172 | static void rsnd_ssi_mode_set(struct rsnd_ssi *ssi) | ||
| 173 | { | ||
| 174 | struct rsnd_ssiu *ssiu = rsnd_ssi_to_ssiu(ssi); | ||
| 175 | 165 | ||
| 176 | rsnd_mod_write(&ssi->mod, SSI_MODE0, ssiu->ssi_mode0); | 166 | rsnd_mod_write(&ssi->mod, SSI_MODE0, ssiu->ssi_mode0); |
| 177 | rsnd_mod_write(&ssi->mod, SSI_MODE1, ssiu->ssi_mode1); | 167 | rsnd_mod_write(&ssi->mod, SSI_MODE1, ssiu->ssi_mode1); |
| @@ -381,7 +371,7 @@ static int rsnd_ssi_init(struct rsnd_mod *mod, | |||
| 381 | ssi->cr_own = cr; | 371 | ssi->cr_own = cr; |
| 382 | ssi->err = -1; /* ignore 1st error */ | 372 | ssi->err = -1; /* ignore 1st error */ |
| 383 | 373 | ||
| 384 | rsnd_ssi_mode_set(ssi); | 374 | rsnd_ssi_mode_set(priv, rdai, ssi); |
| 385 | 375 | ||
| 386 | dev_dbg(dev, "%s.%d init\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); | 376 | dev_dbg(dev, "%s.%d init\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); |
| 387 | 377 | ||
| @@ -708,8 +698,6 @@ int rsnd_ssi_probe(struct platform_device *pdev, | |||
| 708 | rsnd_mod_init(priv, &ssi->mod, ops, i); | 698 | rsnd_mod_init(priv, &ssi->mod, ops, i); |
| 709 | } | 699 | } |
| 710 | 700 | ||
| 711 | rsnd_ssi_mode_init(priv, ssiu); | ||
| 712 | |||
| 713 | dev_dbg(dev, "ssi probed\n"); | 701 | dev_dbg(dev, "ssi probed\n"); |
| 714 | 702 | ||
| 715 | return 0; | 703 | return 0; |
