0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/input.h>
0011 #include <linux/spi/spi.h>
0012 #include <linux/device.h>
0013 #include <linux/init.h>
0014 #include <linux/delay.h>
0015 #include <linux/interrupt.h>
0016 #include <linux/irq.h>
0017 #include <linux/slab.h>
0018 #include <linux/gpio.h>
0019 #include <linux/sched.h>
0020 #include <linux/uaccess.h>
0021 #include <linux/regulator/consumer.h>
0022 #include <linux/pm_qos.h>
0023 #include <linux/sysfs.h>
0024 #include <linux/clk.h>
0025 #include <sound/core.h>
0026 #include <sound/pcm.h>
0027 #include <sound/pcm_params.h>
0028 #include <sound/soc.h>
0029 #include <sound/soc-dapm.h>
0030 #include <sound/initval.h>
0031 #include <sound/tlv.h>
0032
0033 #include "rt5514-spi.h"
0034
0035 #define DRV_NAME "rt5514-spi"
0036
0037 static struct spi_device *rt5514_spi;
0038
0039 struct rt5514_dsp {
0040 struct device *dev;
0041 struct delayed_work copy_work;
0042 struct mutex dma_lock;
0043 struct snd_pcm_substream *substream;
0044 unsigned int buf_base, buf_limit, buf_rp;
0045 size_t buf_size, get_size, dma_offset;
0046 };
0047
0048 static const struct snd_pcm_hardware rt5514_spi_pcm_hardware = {
0049 .info = SNDRV_PCM_INFO_MMAP |
0050 SNDRV_PCM_INFO_MMAP_VALID |
0051 SNDRV_PCM_INFO_INTERLEAVED,
0052 .formats = SNDRV_PCM_FMTBIT_S16_LE,
0053 .period_bytes_min = PAGE_SIZE,
0054 .period_bytes_max = 0x20000 / 8,
0055 .periods_min = 8,
0056 .periods_max = 8,
0057 .channels_min = 1,
0058 .channels_max = 1,
0059 .buffer_bytes_max = 0x20000,
0060 };
0061
0062 static struct snd_soc_dai_driver rt5514_spi_dai = {
0063 .name = "rt5514-dsp-cpu-dai",
0064 .id = 0,
0065 .capture = {
0066 .stream_name = "DSP Capture",
0067 .channels_min = 1,
0068 .channels_max = 1,
0069 .rates = SNDRV_PCM_RATE_16000,
0070 .formats = SNDRV_PCM_FMTBIT_S16_LE,
0071 },
0072 };
0073
0074 static void rt5514_spi_copy_work(struct work_struct *work)
0075 {
0076 struct rt5514_dsp *rt5514_dsp =
0077 container_of(work, struct rt5514_dsp, copy_work.work);
0078 struct snd_pcm_runtime *runtime;
0079 size_t period_bytes, truncated_bytes = 0;
0080 unsigned int cur_wp, remain_data;
0081 u8 buf[8];
0082
0083 mutex_lock(&rt5514_dsp->dma_lock);
0084 if (!rt5514_dsp->substream) {
0085 dev_err(rt5514_dsp->dev, "No pcm substream\n");
0086 goto done;
0087 }
0088
0089 runtime = rt5514_dsp->substream->runtime;
0090 period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream);
0091 if (!period_bytes) {
0092 schedule_delayed_work(&rt5514_dsp->copy_work, 5);
0093 goto done;
0094 }
0095
0096 if (rt5514_dsp->buf_size % period_bytes)
0097 rt5514_dsp->buf_size = (rt5514_dsp->buf_size / period_bytes) *
0098 period_bytes;
0099
0100 if (rt5514_dsp->get_size >= rt5514_dsp->buf_size) {
0101 rt5514_spi_burst_read(RT5514_BUFFER_VOICE_WP, (u8 *)&buf,
0102 sizeof(buf));
0103 cur_wp = buf[0] | buf[1] << 8 | buf[2] << 16 |
0104 buf[3] << 24;
0105
0106 if (cur_wp >= rt5514_dsp->buf_rp)
0107 remain_data = (cur_wp - rt5514_dsp->buf_rp);
0108 else
0109 remain_data =
0110 (rt5514_dsp->buf_limit - rt5514_dsp->buf_rp) +
0111 (cur_wp - rt5514_dsp->buf_base);
0112
0113 if (remain_data < period_bytes) {
0114 schedule_delayed_work(&rt5514_dsp->copy_work, 5);
0115 goto done;
0116 }
0117 }
0118
0119 if (rt5514_dsp->buf_rp + period_bytes <= rt5514_dsp->buf_limit) {
0120 rt5514_spi_burst_read(rt5514_dsp->buf_rp,
0121 runtime->dma_area + rt5514_dsp->dma_offset,
0122 period_bytes);
0123
0124 if (rt5514_dsp->buf_rp + period_bytes == rt5514_dsp->buf_limit)
0125 rt5514_dsp->buf_rp = rt5514_dsp->buf_base;
0126 else
0127 rt5514_dsp->buf_rp += period_bytes;
0128 } else {
0129 truncated_bytes = rt5514_dsp->buf_limit - rt5514_dsp->buf_rp;
0130 rt5514_spi_burst_read(rt5514_dsp->buf_rp,
0131 runtime->dma_area + rt5514_dsp->dma_offset,
0132 truncated_bytes);
0133
0134 rt5514_spi_burst_read(rt5514_dsp->buf_base,
0135 runtime->dma_area + rt5514_dsp->dma_offset +
0136 truncated_bytes, period_bytes - truncated_bytes);
0137
0138 rt5514_dsp->buf_rp = rt5514_dsp->buf_base + period_bytes -
0139 truncated_bytes;
0140 }
0141
0142 rt5514_dsp->get_size += period_bytes;
0143 rt5514_dsp->dma_offset += period_bytes;
0144 if (rt5514_dsp->dma_offset >= runtime->dma_bytes)
0145 rt5514_dsp->dma_offset = 0;
0146
0147 snd_pcm_period_elapsed(rt5514_dsp->substream);
0148
0149 schedule_delayed_work(&rt5514_dsp->copy_work, 5);
0150
0151 done:
0152 mutex_unlock(&rt5514_dsp->dma_lock);
0153 }
0154
0155 static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp)
0156 {
0157 u8 buf[8];
0158
0159 if (!rt5514_dsp->substream)
0160 return;
0161
0162 rt5514_dsp->get_size = 0;
0163
0164
0165
0166
0167
0168
0169 rt5514_spi_burst_read(RT5514_BUFFER_VOICE_BASE, (u8 *)&buf,
0170 sizeof(buf));
0171 rt5514_dsp->buf_base = buf[0] | buf[1] << 8 | buf[2] << 16 |
0172 buf[3] << 24;
0173
0174 rt5514_spi_burst_read(RT5514_BUFFER_VOICE_LIMIT, (u8 *)&buf,
0175 sizeof(buf));
0176 rt5514_dsp->buf_limit = buf[0] | buf[1] << 8 | buf[2] << 16 |
0177 buf[3] << 24;
0178
0179 rt5514_spi_burst_read(RT5514_BUFFER_VOICE_WP, (u8 *)&buf,
0180 sizeof(buf));
0181 rt5514_dsp->buf_rp = buf[0] | buf[1] << 8 | buf[2] << 16 |
0182 buf[3] << 24;
0183
0184 if (rt5514_dsp->buf_rp % 8)
0185 rt5514_dsp->buf_rp = (rt5514_dsp->buf_rp / 8) * 8;
0186
0187 rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base;
0188
0189 if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit &&
0190 rt5514_dsp->buf_rp && rt5514_dsp->buf_size)
0191 schedule_delayed_work(&rt5514_dsp->copy_work, 0);
0192 }
0193
0194 static irqreturn_t rt5514_spi_irq(int irq, void *data)
0195 {
0196 struct rt5514_dsp *rt5514_dsp = data;
0197
0198 rt5514_schedule_copy(rt5514_dsp);
0199
0200 return IRQ_HANDLED;
0201 }
0202
0203
0204 static int rt5514_spi_pcm_open(struct snd_soc_component *component,
0205 struct snd_pcm_substream *substream)
0206 {
0207 snd_soc_set_runtime_hwparams(substream, &rt5514_spi_pcm_hardware);
0208
0209 return 0;
0210 }
0211
0212 static int rt5514_spi_hw_params(struct snd_soc_component *component,
0213 struct snd_pcm_substream *substream,
0214 struct snd_pcm_hw_params *hw_params)
0215 {
0216 struct rt5514_dsp *rt5514_dsp =
0217 snd_soc_component_get_drvdata(component);
0218 u8 buf[8];
0219
0220 mutex_lock(&rt5514_dsp->dma_lock);
0221 rt5514_dsp->substream = substream;
0222 rt5514_dsp->dma_offset = 0;
0223
0224
0225 rt5514_spi_burst_read(RT5514_IRQ_CTRL, (u8 *)&buf, sizeof(buf));
0226 if (buf[0] & RT5514_IRQ_STATUS_BIT)
0227 rt5514_schedule_copy(rt5514_dsp);
0228
0229 mutex_unlock(&rt5514_dsp->dma_lock);
0230
0231 return 0;
0232 }
0233
0234 static int rt5514_spi_hw_free(struct snd_soc_component *component,
0235 struct snd_pcm_substream *substream)
0236 {
0237 struct rt5514_dsp *rt5514_dsp =
0238 snd_soc_component_get_drvdata(component);
0239
0240 mutex_lock(&rt5514_dsp->dma_lock);
0241 rt5514_dsp->substream = NULL;
0242 mutex_unlock(&rt5514_dsp->dma_lock);
0243
0244 cancel_delayed_work_sync(&rt5514_dsp->copy_work);
0245
0246 return 0;
0247 }
0248
0249 static snd_pcm_uframes_t rt5514_spi_pcm_pointer(
0250 struct snd_soc_component *component,
0251 struct snd_pcm_substream *substream)
0252 {
0253 struct snd_pcm_runtime *runtime = substream->runtime;
0254 struct rt5514_dsp *rt5514_dsp =
0255 snd_soc_component_get_drvdata(component);
0256
0257 return bytes_to_frames(runtime, rt5514_dsp->dma_offset);
0258 }
0259
0260
0261 static int rt5514_spi_pcm_probe(struct snd_soc_component *component)
0262 {
0263 struct rt5514_dsp *rt5514_dsp;
0264 int ret;
0265
0266 rt5514_dsp = devm_kzalloc(component->dev, sizeof(*rt5514_dsp),
0267 GFP_KERNEL);
0268 if (!rt5514_dsp)
0269 return -ENOMEM;
0270
0271 rt5514_dsp->dev = &rt5514_spi->dev;
0272 mutex_init(&rt5514_dsp->dma_lock);
0273 INIT_DELAYED_WORK(&rt5514_dsp->copy_work, rt5514_spi_copy_work);
0274 snd_soc_component_set_drvdata(component, rt5514_dsp);
0275
0276 if (rt5514_spi->irq) {
0277 ret = devm_request_threaded_irq(&rt5514_spi->dev,
0278 rt5514_spi->irq, NULL, rt5514_spi_irq,
0279 IRQF_TRIGGER_RISING | IRQF_ONESHOT, "rt5514-spi",
0280 rt5514_dsp);
0281 if (ret)
0282 dev_err(&rt5514_spi->dev,
0283 "%s Failed to reguest IRQ: %d\n", __func__,
0284 ret);
0285 else
0286 device_init_wakeup(rt5514_dsp->dev, true);
0287 }
0288
0289 return 0;
0290 }
0291
0292 static int rt5514_spi_pcm_new(struct snd_soc_component *component,
0293 struct snd_soc_pcm_runtime *rtd)
0294 {
0295 snd_pcm_set_managed_buffer_all(rtd->pcm, SNDRV_DMA_TYPE_VMALLOC,
0296 NULL, 0, 0);
0297 return 0;
0298 }
0299
0300 static const struct snd_soc_component_driver rt5514_spi_component = {
0301 .name = DRV_NAME,
0302 .probe = rt5514_spi_pcm_probe,
0303 .open = rt5514_spi_pcm_open,
0304 .hw_params = rt5514_spi_hw_params,
0305 .hw_free = rt5514_spi_hw_free,
0306 .pointer = rt5514_spi_pcm_pointer,
0307 .pcm_construct = rt5514_spi_pcm_new,
0308 };
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319 int rt5514_spi_burst_read(unsigned int addr, u8 *rxbuf, size_t len)
0320 {
0321 u8 spi_cmd = RT5514_SPI_CMD_BURST_READ;
0322 int status;
0323 u8 write_buf[8];
0324 unsigned int i, end, offset = 0;
0325
0326 struct spi_message message;
0327 struct spi_transfer x[3];
0328
0329 while (offset < len) {
0330 if (offset + RT5514_SPI_BUF_LEN <= len)
0331 end = RT5514_SPI_BUF_LEN;
0332 else
0333 end = len % RT5514_SPI_BUF_LEN;
0334
0335 write_buf[0] = spi_cmd;
0336 write_buf[1] = ((addr + offset) & 0xff000000) >> 24;
0337 write_buf[2] = ((addr + offset) & 0x00ff0000) >> 16;
0338 write_buf[3] = ((addr + offset) & 0x0000ff00) >> 8;
0339 write_buf[4] = ((addr + offset) & 0x000000ff) >> 0;
0340
0341 spi_message_init(&message);
0342 memset(x, 0, sizeof(x));
0343
0344 x[0].len = 5;
0345 x[0].tx_buf = write_buf;
0346 spi_message_add_tail(&x[0], &message);
0347
0348 x[1].len = 4;
0349 x[1].tx_buf = write_buf;
0350 spi_message_add_tail(&x[1], &message);
0351
0352 x[2].len = end;
0353 x[2].rx_buf = rxbuf + offset;
0354 spi_message_add_tail(&x[2], &message);
0355
0356 status = spi_sync(rt5514_spi, &message);
0357
0358 if (status)
0359 return false;
0360
0361 offset += RT5514_SPI_BUF_LEN;
0362 }
0363
0364 for (i = 0; i < len; i += 8) {
0365 write_buf[0] = rxbuf[i + 0];
0366 write_buf[1] = rxbuf[i + 1];
0367 write_buf[2] = rxbuf[i + 2];
0368 write_buf[3] = rxbuf[i + 3];
0369 write_buf[4] = rxbuf[i + 4];
0370 write_buf[5] = rxbuf[i + 5];
0371 write_buf[6] = rxbuf[i + 6];
0372 write_buf[7] = rxbuf[i + 7];
0373
0374 rxbuf[i + 0] = write_buf[7];
0375 rxbuf[i + 1] = write_buf[6];
0376 rxbuf[i + 2] = write_buf[5];
0377 rxbuf[i + 3] = write_buf[4];
0378 rxbuf[i + 4] = write_buf[3];
0379 rxbuf[i + 5] = write_buf[2];
0380 rxbuf[i + 6] = write_buf[1];
0381 rxbuf[i + 7] = write_buf[0];
0382 }
0383
0384 return true;
0385 }
0386 EXPORT_SYMBOL_GPL(rt5514_spi_burst_read);
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397 int rt5514_spi_burst_write(u32 addr, const u8 *txbuf, size_t len)
0398 {
0399 u8 spi_cmd = RT5514_SPI_CMD_BURST_WRITE;
0400 u8 *write_buf;
0401 unsigned int i, end, offset = 0;
0402
0403 write_buf = kmalloc(RT5514_SPI_BUF_LEN + 6, GFP_KERNEL);
0404
0405 if (write_buf == NULL)
0406 return -ENOMEM;
0407
0408 while (offset < len) {
0409 if (offset + RT5514_SPI_BUF_LEN <= len)
0410 end = RT5514_SPI_BUF_LEN;
0411 else
0412 end = len % RT5514_SPI_BUF_LEN;
0413
0414 write_buf[0] = spi_cmd;
0415 write_buf[1] = ((addr + offset) & 0xff000000) >> 24;
0416 write_buf[2] = ((addr + offset) & 0x00ff0000) >> 16;
0417 write_buf[3] = ((addr + offset) & 0x0000ff00) >> 8;
0418 write_buf[4] = ((addr + offset) & 0x000000ff) >> 0;
0419
0420 for (i = 0; i < end; i += 8) {
0421 write_buf[i + 12] = txbuf[offset + i + 0];
0422 write_buf[i + 11] = txbuf[offset + i + 1];
0423 write_buf[i + 10] = txbuf[offset + i + 2];
0424 write_buf[i + 9] = txbuf[offset + i + 3];
0425 write_buf[i + 8] = txbuf[offset + i + 4];
0426 write_buf[i + 7] = txbuf[offset + i + 5];
0427 write_buf[i + 6] = txbuf[offset + i + 6];
0428 write_buf[i + 5] = txbuf[offset + i + 7];
0429 }
0430
0431 write_buf[end + 5] = spi_cmd;
0432
0433 spi_write(rt5514_spi, write_buf, end + 6);
0434
0435 offset += RT5514_SPI_BUF_LEN;
0436 }
0437
0438 kfree(write_buf);
0439
0440 return 0;
0441 }
0442 EXPORT_SYMBOL_GPL(rt5514_spi_burst_write);
0443
0444 static int rt5514_spi_probe(struct spi_device *spi)
0445 {
0446 int ret;
0447
0448 rt5514_spi = spi;
0449
0450 ret = devm_snd_soc_register_component(&spi->dev,
0451 &rt5514_spi_component,
0452 &rt5514_spi_dai, 1);
0453 if (ret < 0) {
0454 dev_err(&spi->dev, "Failed to register component.\n");
0455 return ret;
0456 }
0457
0458 return 0;
0459 }
0460
0461 static int __maybe_unused rt5514_suspend(struct device *dev)
0462 {
0463 int irq = to_spi_device(dev)->irq;
0464
0465 if (device_may_wakeup(dev))
0466 enable_irq_wake(irq);
0467
0468 return 0;
0469 }
0470
0471 static int __maybe_unused rt5514_resume(struct device *dev)
0472 {
0473 struct rt5514_dsp *rt5514_dsp = dev_get_drvdata(dev);
0474 int irq = to_spi_device(dev)->irq;
0475 u8 buf[8];
0476
0477 if (device_may_wakeup(dev))
0478 disable_irq_wake(irq);
0479
0480 if (rt5514_dsp) {
0481 if (rt5514_dsp->substream) {
0482 rt5514_spi_burst_read(RT5514_IRQ_CTRL, (u8 *)&buf,
0483 sizeof(buf));
0484 if (buf[0] & RT5514_IRQ_STATUS_BIT)
0485 rt5514_schedule_copy(rt5514_dsp);
0486 }
0487 }
0488
0489 return 0;
0490 }
0491
0492 static const struct dev_pm_ops rt5514_pm_ops = {
0493 SET_SYSTEM_SLEEP_PM_OPS(rt5514_suspend, rt5514_resume)
0494 };
0495
0496 static const struct of_device_id rt5514_of_match[] = {
0497 { .compatible = "realtek,rt5514", },
0498 {},
0499 };
0500 MODULE_DEVICE_TABLE(of, rt5514_of_match);
0501
0502 static struct spi_driver rt5514_spi_driver = {
0503 .driver = {
0504 .name = "rt5514",
0505 .pm = &rt5514_pm_ops,
0506 .of_match_table = of_match_ptr(rt5514_of_match),
0507 },
0508 .probe = rt5514_spi_probe,
0509 };
0510 module_spi_driver(rt5514_spi_driver);
0511
0512 MODULE_DESCRIPTION("RT5514 SPI driver");
0513 MODULE_AUTHOR("Oder Chiou <oder_chiou@realtek.com>");
0514 MODULE_LICENSE("GPL v2");