|
14 | 14 |
|
15 | 15 | #define I2S_DEFAULT_FREQ (11289600) |
16 | 16 | #define I2S_DMA_BURST_SIZE (16) /* size * width: 16*4 = 64 bytes */ |
| 17 | +#define ROCKCHIP_I2S_RATES SNDRV_PCM_RATE_8000_192000 |
| 18 | +#define ROCKCHIP_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ |
| 19 | + SNDRV_PCM_FMTBIT_S20_3LE | \ |
| 20 | + SNDRV_PCM_FMTBIT_S24_LE | \ |
| 21 | + SNDRV_PCM_FORMAT_S32_LE) |
17 | 22 |
|
18 | 23 | /* I2S regname and offset */ |
19 | 24 | #define I2S_TXCR (0x0000) |
@@ -178,6 +183,107 @@ static const struct regmap_config rockchip_i2s_regmap_config = { |
178 | 183 | .cache_type = REGCACHE_FLAT, |
179 | 184 | }; |
180 | 185 |
|
| 186 | +/* value of /sys/kernel/debug/asoc/dais */ |
| 187 | +static const struct snd_soc_component_driver rockchip_i2s_component = { |
| 188 | + .name = "rockchip-i2s", |
| 189 | +}; |
| 190 | + |
| 191 | +static int rockchip_i2s_dai_probe(struct snd_soc_dai *dai) |
| 192 | +{ |
| 193 | + struct rk_i2s_dev *i2s = snd_soc_dai_get_drvdata(dai); |
| 194 | + |
| 195 | + dai->capture_dma_data = &i2s->capture_dma_data; |
| 196 | + dai->playback_dma_data = &i2s->playback_dma_data; |
| 197 | + |
| 198 | + return 0; |
| 199 | +} |
| 200 | + |
| 201 | +static int rockchip_i2s_trigger(struct snd_pcm_substream *substream, int cmd, |
| 202 | + struct snd_soc_dai *dai) |
| 203 | +{ |
| 204 | + printk("%s, %d\n", __FUNCTION__, __LINE__); |
| 205 | + return 0; |
| 206 | +} |
| 207 | + |
| 208 | +static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream, |
| 209 | + struct snd_pcm_hw_params *params, |
| 210 | + struct snd_soc_dai *dai) |
| 211 | +{ |
| 212 | + printk("%s, %d\n", __FUNCTION__, __LINE__); |
| 213 | + return 0; |
| 214 | +} |
| 215 | + |
| 216 | +static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai, |
| 217 | + unsigned int fmt) |
| 218 | +{ |
| 219 | + printk("%s, %d\n", __FUNCTION__, __LINE__); |
| 220 | + return 0; |
| 221 | +} |
| 222 | + |
| 223 | +static int rockchip_i2s_set_clkdiv(struct snd_soc_dai *cpu_dai, |
| 224 | + int div_id, int div) |
| 225 | +{ |
| 226 | + printk("%s, %d\n", __FUNCTION__, __LINE__); |
| 227 | + return 0; |
| 228 | +} |
| 229 | + |
| 230 | +static int rockchip_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, |
| 231 | + int clk_id, unsigned int freq, int dir) |
| 232 | +{ |
| 233 | + printk("%s, %d\n", __FUNCTION__, __LINE__); |
| 234 | + return 0; |
| 235 | +} |
| 236 | + |
| 237 | +static struct snd_soc_dai_ops rockchip_i2s_dai_ops = { |
| 238 | + .trigger = rockchip_i2s_trigger, |
| 239 | + .hw_params = rockchip_i2s_hw_params, |
| 240 | + .set_fmt = rockchip_i2s_set_fmt, |
| 241 | + .set_clkdiv = rockchip_i2s_set_clkdiv, |
| 242 | + .set_sysclk = rockchip_i2s_set_sysclk, |
| 243 | +}; |
| 244 | + |
| 245 | +/* 这里有两个dai driver, 根据dts里的i2s-id来选择 */ |
| 246 | +struct snd_soc_dai_driver rockchip_i2s_dai[] = { |
| 247 | + { |
| 248 | + .probe = rockchip_i2s_dai_probe, |
| 249 | + .name = "rockchip-i2s.0", |
| 250 | + .id = 0, |
| 251 | + .playback = { |
| 252 | + .channels_min = 2, |
| 253 | + .channels_max = 8, |
| 254 | + .rates = ROCKCHIP_I2S_RATES, |
| 255 | + .formats = ROCKCHIP_I2S_FORMATS, |
| 256 | + }, |
| 257 | + .capture = { |
| 258 | + .channels_min = 2, |
| 259 | + .channels_max = 2, |
| 260 | + .rates = ROCKCHIP_I2S_RATES, |
| 261 | + .formats = ROCKCHIP_I2S_FORMATS, |
| 262 | + }, |
| 263 | + .ops = &rockchip_i2s_dai_ops, |
| 264 | + .symmetric_rates = 1, |
| 265 | + }, |
| 266 | + { |
| 267 | + .probe = rockchip_i2s_dai_probe, |
| 268 | + .name = "rockchip-i2s.1", |
| 269 | + .id = 1, |
| 270 | + .playback = { |
| 271 | + .channels_min = 2, |
| 272 | + .channels_max = 2, |
| 273 | + .rates = ROCKCHIP_I2S_RATES, |
| 274 | + .formats = ROCKCHIP_I2S_FORMATS, |
| 275 | + }, |
| 276 | + .capture = { |
| 277 | + .channels_min = 2, |
| 278 | + .channels_max = 2, |
| 279 | + .rates = ROCKCHIP_I2S_RATES, |
| 280 | + .formats = ROCKCHIP_I2S_FORMATS, |
| 281 | + }, |
| 282 | + .ops = &rockchip_i2s_dai_ops, |
| 283 | + .symmetric_rates = 1, |
| 284 | + }, |
| 285 | +}; |
| 286 | + |
181 | 287 | static int rockchip_i2s_probe(struct platform_device *pdev) |
182 | 288 | { |
183 | 289 | struct rk_i2s_dev *i2s; |
@@ -243,6 +349,18 @@ static int rockchip_i2s_probe(struct platform_device *pdev) |
243 | 349 | i2s->dev = &pdev->dev; |
244 | 350 | dev_set_drvdata(&pdev->dev, i2s); |
245 | 351 |
|
| 352 | + /* |
| 353 | + * register component(dai) |
| 354 | + * 根据dts里i2s-id的值来选择注册哪个dai |
| 355 | + */ |
| 356 | + ret = snd_soc_register_component(&pdev->dev, &rockchip_i2s_component, |
| 357 | + &rockchip_i2s_dai[pdev->id], 1); |
| 358 | + |
| 359 | + if (ret) { |
| 360 | + dev_err(&pdev->dev, "Could not register DAI: %d\n", ret); |
| 361 | + ret = -ENOMEM; |
| 362 | + goto EXIT; |
| 363 | + } |
246 | 364 | printk("%s, %d\n", __FUNCTION__, __LINE__); |
247 | 365 |
|
248 | 366 | EXIT: |
|
0 commit comments