aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/omap/mcbsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/omap/mcbsp.c')
-rw-r--r--sound/soc/omap/mcbsp.c284
1 files changed, 38 insertions, 246 deletions
diff --git a/sound/soc/omap/mcbsp.c b/sound/soc/omap/mcbsp.c
index 20d46bf3626b..be92a28e19ed 100644
--- a/sound/soc/omap/mcbsp.c
+++ b/sound/soc/omap/mcbsp.c
@@ -30,12 +30,6 @@
30 30
31#include "mcbsp.h" 31#include "mcbsp.h"
32 32
33struct omap_mcbsp **mcbsp_ptr;
34int omap_mcbsp_count;
35
36#define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count)
37#define id_to_mcbsp_ptr(id) mcbsp_ptr[id];
38
39static void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) 33static void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
40{ 34{
41 void __iomem *addr = mcbsp->io_base + reg * mcbsp->pdata->reg_step; 35 void __iomem *addr = mcbsp->io_base + reg * mcbsp->pdata->reg_step;
@@ -84,10 +78,8 @@ static int omap_mcbsp_st_read(struct omap_mcbsp *mcbsp, u16 reg)
84#define MCBSP_ST_WRITE(mcbsp, reg, val) \ 78#define MCBSP_ST_WRITE(mcbsp, reg, val) \
85 omap_mcbsp_st_write(mcbsp, OMAP_ST_REG_##reg, val) 79 omap_mcbsp_st_write(mcbsp, OMAP_ST_REG_##reg, val)
86 80
87static void omap_mcbsp_dump_reg(u8 id) 81static void omap_mcbsp_dump_reg(struct omap_mcbsp *mcbsp)
88{ 82{
89 struct omap_mcbsp *mcbsp = id_to_mcbsp_ptr(id);
90
91 dev_dbg(mcbsp->dev, "**** McBSP%d regs ****\n", mcbsp->id); 83 dev_dbg(mcbsp->dev, "**** McBSP%d regs ****\n", mcbsp->id);
92 dev_dbg(mcbsp->dev, "DRR2: 0x%04x\n", 84 dev_dbg(mcbsp->dev, "DRR2: 0x%04x\n",
93 MCBSP_READ(mcbsp, DRR2)); 85 MCBSP_READ(mcbsp, DRR2));
@@ -160,16 +152,9 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id)
160 * You either call this function or set the McBSP registers 152 * You either call this function or set the McBSP registers
161 * by yourself before calling omap_mcbsp_start(). 153 * by yourself before calling omap_mcbsp_start().
162 */ 154 */
163void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config) 155void omap_mcbsp_config(struct omap_mcbsp *mcbsp,
156 const struct omap_mcbsp_reg_cfg *config)
164{ 157{
165 struct omap_mcbsp *mcbsp;
166
167 if (!omap_mcbsp_check_valid_id(id)) {
168 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
169 return;
170 }
171 mcbsp = id_to_mcbsp_ptr(id);
172
173 dev_dbg(mcbsp->dev, "Configuring McBSP%d phys_base: 0x%08lx\n", 158 dev_dbg(mcbsp->dev, "Configuring McBSP%d phys_base: 0x%08lx\n",
174 mcbsp->id, mcbsp->phys_base); 159 mcbsp->id, mcbsp->phys_base);
175 160
@@ -190,7 +175,6 @@ void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config)
190 MCBSP_WRITE(mcbsp, RCCR, config->rccr); 175 MCBSP_WRITE(mcbsp, RCCR, config->rccr);
191 } 176 }
192} 177}
193EXPORT_SYMBOL(omap_mcbsp_config);
194 178
195/** 179/**
196 * omap_mcbsp_dma_params - returns the dma channel number 180 * omap_mcbsp_dma_params - returns the dma channel number
@@ -200,22 +184,13 @@ EXPORT_SYMBOL(omap_mcbsp_config);
200 * Returns the dma channel number for the rx channel or tx channel 184 * Returns the dma channel number for the rx channel or tx channel
201 * based on the value of @stream for the requested mcbsp given by @id 185 * based on the value of @stream for the requested mcbsp given by @id
202 */ 186 */
203int omap_mcbsp_dma_ch_params(unsigned int id, unsigned int stream) 187int omap_mcbsp_dma_ch_params(struct omap_mcbsp *mcbsp, unsigned int stream)
204{ 188{
205 struct omap_mcbsp *mcbsp;
206
207 if (!omap_mcbsp_check_valid_id(id)) {
208 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
209 return -ENODEV;
210 }
211 mcbsp = id_to_mcbsp_ptr(id);
212
213 if (stream) 189 if (stream)
214 return mcbsp->dma_rx_sync; 190 return mcbsp->dma_rx_sync;
215 else 191 else
216 return mcbsp->dma_tx_sync; 192 return mcbsp->dma_tx_sync;
217} 193}
218EXPORT_SYMBOL(omap_mcbsp_dma_ch_params);
219 194
220/** 195/**
221 * omap_mcbsp_dma_reg_params - returns the address of mcbsp data register 196 * omap_mcbsp_dma_reg_params - returns the address of mcbsp data register
@@ -226,17 +201,10 @@ EXPORT_SYMBOL(omap_mcbsp_dma_ch_params);
226 * to be used by DMA for transferring/receiving data based on the value of 201 * to be used by DMA for transferring/receiving data based on the value of
227 * @stream for the requested mcbsp given by @id 202 * @stream for the requested mcbsp given by @id
228 */ 203 */
229int omap_mcbsp_dma_reg_params(unsigned int id, unsigned int stream) 204int omap_mcbsp_dma_reg_params(struct omap_mcbsp *mcbsp, unsigned int stream)
230{ 205{
231 struct omap_mcbsp *mcbsp;
232 int data_reg; 206 int data_reg;
233 207
234 if (!omap_mcbsp_check_valid_id(id)) {
235 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
236 return -ENODEV;
237 }
238 mcbsp = id_to_mcbsp_ptr(id);
239
240 if (mcbsp->pdata->reg_size == 2) { 208 if (mcbsp->pdata->reg_size == 2) {
241 if (stream) 209 if (stream)
242 data_reg = OMAP_MCBSP_REG_DRR1; 210 data_reg = OMAP_MCBSP_REG_DRR1;
@@ -251,7 +219,6 @@ int omap_mcbsp_dma_reg_params(unsigned int id, unsigned int stream)
251 219
252 return mcbsp->phys_dma_base + data_reg * mcbsp->pdata->reg_step; 220 return mcbsp->phys_dma_base + data_reg * mcbsp->pdata->reg_step;
253} 221}
254EXPORT_SYMBOL(omap_mcbsp_dma_reg_params);
255 222
256static void omap_st_on(struct omap_mcbsp *mcbsp) 223static void omap_st_on(struct omap_mcbsp *mcbsp)
257{ 224{
@@ -320,18 +287,11 @@ static void omap_st_chgain(struct omap_mcbsp *mcbsp)
320 ST_CH1GAIN(st_data->ch1gain)); 287 ST_CH1GAIN(st_data->ch1gain));
321} 288}
322 289
323int omap_st_set_chgain(unsigned int id, int channel, s16 chgain) 290int omap_st_set_chgain(struct omap_mcbsp *mcbsp, int channel, s16 chgain)
324{ 291{
325 struct omap_mcbsp *mcbsp;
326 struct omap_mcbsp_st_data *st_data; 292 struct omap_mcbsp_st_data *st_data;
327 int ret = 0; 293 int ret = 0;
328 294
329 if (!omap_mcbsp_check_valid_id(id)) {
330 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
331 return -ENODEV;
332 }
333
334 mcbsp = id_to_mcbsp_ptr(id);
335 st_data = mcbsp->st_data; 295 st_data = mcbsp->st_data;
336 296
337 if (!st_data) 297 if (!st_data)
@@ -351,20 +311,12 @@ int omap_st_set_chgain(unsigned int id, int channel, s16 chgain)
351 311
352 return ret; 312 return ret;
353} 313}
354EXPORT_SYMBOL(omap_st_set_chgain);
355 314
356int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain) 315int omap_st_get_chgain(struct omap_mcbsp *mcbsp, int channel, s16 *chgain)
357{ 316{
358 struct omap_mcbsp *mcbsp;
359 struct omap_mcbsp_st_data *st_data; 317 struct omap_mcbsp_st_data *st_data;
360 int ret = 0; 318 int ret = 0;
361 319
362 if (!omap_mcbsp_check_valid_id(id)) {
363 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
364 return -ENODEV;
365 }
366
367 mcbsp = id_to_mcbsp_ptr(id);
368 st_data = mcbsp->st_data; 320 st_data = mcbsp->st_data;
369 321
370 if (!st_data) 322 if (!st_data)
@@ -381,7 +333,6 @@ int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain)
381 333
382 return ret; 334 return ret;
383} 335}
384EXPORT_SYMBOL(omap_st_get_chgain);
385 336
386static int omap_st_start(struct omap_mcbsp *mcbsp) 337static int omap_st_start(struct omap_mcbsp *mcbsp)
387{ 338{
@@ -400,17 +351,10 @@ static int omap_st_start(struct omap_mcbsp *mcbsp)
400 return 0; 351 return 0;
401} 352}
402 353
403int omap_st_enable(unsigned int id) 354int omap_st_enable(struct omap_mcbsp *mcbsp)
404{ 355{
405 struct omap_mcbsp *mcbsp;
406 struct omap_mcbsp_st_data *st_data; 356 struct omap_mcbsp_st_data *st_data;
407 357
408 if (!omap_mcbsp_check_valid_id(id)) {
409 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
410 return -ENODEV;
411 }
412
413 mcbsp = id_to_mcbsp_ptr(id);
414 st_data = mcbsp->st_data; 358 st_data = mcbsp->st_data;
415 359
416 if (!st_data) 360 if (!st_data)
@@ -423,7 +367,6 @@ int omap_st_enable(unsigned int id)
423 367
424 return 0; 368 return 0;
425} 369}
426EXPORT_SYMBOL(omap_st_enable);
427 370
428static int omap_st_stop(struct omap_mcbsp *mcbsp) 371static int omap_st_stop(struct omap_mcbsp *mcbsp)
429{ 372{
@@ -439,18 +382,11 @@ static int omap_st_stop(struct omap_mcbsp *mcbsp)
439 return 0; 382 return 0;
440} 383}
441 384
442int omap_st_disable(unsigned int id) 385int omap_st_disable(struct omap_mcbsp *mcbsp)
443{ 386{
444 struct omap_mcbsp *mcbsp;
445 struct omap_mcbsp_st_data *st_data; 387 struct omap_mcbsp_st_data *st_data;
446 int ret = 0; 388 int ret = 0;
447 389
448 if (!omap_mcbsp_check_valid_id(id)) {
449 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
450 return -ENODEV;
451 }
452
453 mcbsp = id_to_mcbsp_ptr(id);
454 st_data = mcbsp->st_data; 390 st_data = mcbsp->st_data;
455 391
456 if (!st_data) 392 if (!st_data)
@@ -463,19 +399,11 @@ int omap_st_disable(unsigned int id)
463 399
464 return ret; 400 return ret;
465} 401}
466EXPORT_SYMBOL(omap_st_disable);
467 402
468int omap_st_is_enabled(unsigned int id) 403int omap_st_is_enabled(struct omap_mcbsp *mcbsp)
469{ 404{
470 struct omap_mcbsp *mcbsp;
471 struct omap_mcbsp_st_data *st_data; 405 struct omap_mcbsp_st_data *st_data;
472 406
473 if (!omap_mcbsp_check_valid_id(id)) {
474 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
475 return -ENODEV;
476 }
477
478 mcbsp = id_to_mcbsp_ptr(id);
479 st_data = mcbsp->st_data; 407 st_data = mcbsp->st_data;
480 408
481 if (!st_data) 409 if (!st_data)
@@ -484,115 +412,65 @@ int omap_st_is_enabled(unsigned int id)
484 412
485 return st_data->enabled; 413 return st_data->enabled;
486} 414}
487EXPORT_SYMBOL(omap_st_is_enabled);
488 415
489/* 416/*
490 * omap_mcbsp_set_rx_threshold configures the transmit threshold in words. 417 * omap_mcbsp_set_rx_threshold configures the transmit threshold in words.
491 * The threshold parameter is 1 based, and it is converted (threshold - 1) 418 * The threshold parameter is 1 based, and it is converted (threshold - 1)
492 * for the THRSH2 register. 419 * for the THRSH2 register.
493 */ 420 */
494void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold) 421void omap_mcbsp_set_tx_threshold(struct omap_mcbsp *mcbsp, u16 threshold)
495{ 422{
496 struct omap_mcbsp *mcbsp;
497
498 if (!omap_mcbsp_check_valid_id(id)) {
499 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
500 return;
501 }
502 mcbsp = id_to_mcbsp_ptr(id);
503 if (mcbsp->pdata->buffer_size == 0) 423 if (mcbsp->pdata->buffer_size == 0)
504 return; 424 return;
505 425
506 if (threshold && threshold <= mcbsp->max_tx_thres) 426 if (threshold && threshold <= mcbsp->max_tx_thres)
507 MCBSP_WRITE(mcbsp, THRSH2, threshold - 1); 427 MCBSP_WRITE(mcbsp, THRSH2, threshold - 1);
508} 428}
509EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold);
510 429
511/* 430/*
512 * omap_mcbsp_set_rx_threshold configures the receive threshold in words. 431 * omap_mcbsp_set_rx_threshold configures the receive threshold in words.
513 * The threshold parameter is 1 based, and it is converted (threshold - 1) 432 * The threshold parameter is 1 based, and it is converted (threshold - 1)
514 * for the THRSH1 register. 433 * for the THRSH1 register.
515 */ 434 */
516void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold) 435void omap_mcbsp_set_rx_threshold(struct omap_mcbsp *mcbsp, u16 threshold)
517{ 436{
518 struct omap_mcbsp *mcbsp;
519
520 if (!omap_mcbsp_check_valid_id(id)) {
521 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
522 return;
523 }
524 mcbsp = id_to_mcbsp_ptr(id);
525 if (mcbsp->pdata->buffer_size == 0) 437 if (mcbsp->pdata->buffer_size == 0)
526 return; 438 return;
527 439
528 if (threshold && threshold <= mcbsp->max_rx_thres) 440 if (threshold && threshold <= mcbsp->max_rx_thres)
529 MCBSP_WRITE(mcbsp, THRSH1, threshold - 1); 441 MCBSP_WRITE(mcbsp, THRSH1, threshold - 1);
530} 442}
531EXPORT_SYMBOL(omap_mcbsp_set_rx_threshold);
532 443
533/* 444/*
534 * omap_mcbsp_get_max_tx_thres just return the current configured 445 * omap_mcbsp_get_max_tx_thres just return the current configured
535 * maximum threshold for transmission 446 * maximum threshold for transmission
536 */ 447 */
537u16 omap_mcbsp_get_max_tx_threshold(unsigned int id) 448u16 omap_mcbsp_get_max_tx_threshold(struct omap_mcbsp *mcbsp)
538{ 449{
539 struct omap_mcbsp *mcbsp;
540
541 if (!omap_mcbsp_check_valid_id(id)) {
542 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
543 return -ENODEV;
544 }
545 mcbsp = id_to_mcbsp_ptr(id);
546
547 return mcbsp->max_tx_thres; 450 return mcbsp->max_tx_thres;
548} 451}
549EXPORT_SYMBOL(omap_mcbsp_get_max_tx_threshold);
550 452
551/* 453/*
552 * omap_mcbsp_get_max_rx_thres just return the current configured 454 * omap_mcbsp_get_max_rx_thres just return the current configured
553 * maximum threshold for reception 455 * maximum threshold for reception
554 */ 456 */
555u16 omap_mcbsp_get_max_rx_threshold(unsigned int id) 457u16 omap_mcbsp_get_max_rx_threshold(struct omap_mcbsp *mcbsp)
556{ 458{
557 struct omap_mcbsp *mcbsp;
558
559 if (!omap_mcbsp_check_valid_id(id)) {
560 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
561 return -ENODEV;
562 }
563 mcbsp = id_to_mcbsp_ptr(id);
564
565 return mcbsp->max_rx_thres; 459 return mcbsp->max_rx_thres;
566} 460}
567EXPORT_SYMBOL(omap_mcbsp_get_max_rx_threshold);
568 461
569u16 omap_mcbsp_get_fifo_size(unsigned int id) 462u16 omap_mcbsp_get_fifo_size(struct omap_mcbsp *mcbsp)
570{ 463{
571 struct omap_mcbsp *mcbsp;
572
573 if (!omap_mcbsp_check_valid_id(id)) {
574 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
575 return -ENODEV;
576 }
577 mcbsp = id_to_mcbsp_ptr(id);
578
579 return mcbsp->pdata->buffer_size; 464 return mcbsp->pdata->buffer_size;
580} 465}
581EXPORT_SYMBOL(omap_mcbsp_get_fifo_size);
582 466
583/* 467/*
584 * omap_mcbsp_get_tx_delay returns the number of used slots in the McBSP FIFO 468 * omap_mcbsp_get_tx_delay returns the number of used slots in the McBSP FIFO
585 */ 469 */
586u16 omap_mcbsp_get_tx_delay(unsigned int id) 470u16 omap_mcbsp_get_tx_delay(struct omap_mcbsp *mcbsp)
587{ 471{
588 struct omap_mcbsp *mcbsp;
589 u16 buffstat; 472 u16 buffstat;
590 473
591 if (!omap_mcbsp_check_valid_id(id)) {
592 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
593 return -ENODEV;
594 }
595 mcbsp = id_to_mcbsp_ptr(id);
596 if (mcbsp->pdata->buffer_size == 0) 474 if (mcbsp->pdata->buffer_size == 0)
597 return 0; 475 return 0;
598 476
@@ -602,22 +480,15 @@ u16 omap_mcbsp_get_tx_delay(unsigned int id)
602 /* Number of slots are different in McBSP ports */ 480 /* Number of slots are different in McBSP ports */
603 return mcbsp->pdata->buffer_size - buffstat; 481 return mcbsp->pdata->buffer_size - buffstat;
604} 482}
605EXPORT_SYMBOL(omap_mcbsp_get_tx_delay);
606 483
607/* 484/*
608 * omap_mcbsp_get_rx_delay returns the number of free slots in the McBSP FIFO 485 * omap_mcbsp_get_rx_delay returns the number of free slots in the McBSP FIFO
609 * to reach the threshold value (when the DMA will be triggered to read it) 486 * to reach the threshold value (when the DMA will be triggered to read it)
610 */ 487 */
611u16 omap_mcbsp_get_rx_delay(unsigned int id) 488u16 omap_mcbsp_get_rx_delay(struct omap_mcbsp *mcbsp)
612{ 489{
613 struct omap_mcbsp *mcbsp;
614 u16 buffstat, threshold; 490 u16 buffstat, threshold;
615 491
616 if (!omap_mcbsp_check_valid_id(id)) {
617 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
618 return -ENODEV;
619 }
620 mcbsp = id_to_mcbsp_ptr(id);
621 if (mcbsp->pdata->buffer_size == 0) 492 if (mcbsp->pdata->buffer_size == 0)
622 return 0; 493 return 0;
623 494
@@ -632,41 +503,25 @@ u16 omap_mcbsp_get_rx_delay(unsigned int id)
632 else 503 else
633 return threshold - buffstat; 504 return threshold - buffstat;
634} 505}
635EXPORT_SYMBOL(omap_mcbsp_get_rx_delay);
636 506
637/* 507/*
638 * omap_mcbsp_get_dma_op_mode just return the current configured 508 * omap_mcbsp_get_dma_op_mode just return the current configured
639 * operating mode for the mcbsp channel 509 * operating mode for the mcbsp channel
640 */ 510 */
641int omap_mcbsp_get_dma_op_mode(unsigned int id) 511int omap_mcbsp_get_dma_op_mode(struct omap_mcbsp *mcbsp)
642{ 512{
643 struct omap_mcbsp *mcbsp;
644 int dma_op_mode; 513 int dma_op_mode;
645 514
646 if (!omap_mcbsp_check_valid_id(id)) {
647 printk(KERN_ERR "%s: Invalid id (%u)\n", __func__, id + 1);
648 return -ENODEV;
649 }
650 mcbsp = id_to_mcbsp_ptr(id);
651
652 dma_op_mode = mcbsp->dma_op_mode; 515 dma_op_mode = mcbsp->dma_op_mode;
653 516
654 return dma_op_mode; 517 return dma_op_mode;
655} 518}
656EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode);
657 519
658int omap_mcbsp_request(unsigned int id) 520int omap_mcbsp_request(struct omap_mcbsp *mcbsp)
659{ 521{
660 struct omap_mcbsp *mcbsp;
661 void *reg_cache; 522 void *reg_cache;
662 int err; 523 int err;
663 524
664 if (!omap_mcbsp_check_valid_id(id)) {
665 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
666 return -ENODEV;
667 }
668 mcbsp = id_to_mcbsp_ptr(id);
669
670 reg_cache = kzalloc(mcbsp->reg_cache_size, GFP_KERNEL); 525 reg_cache = kzalloc(mcbsp->reg_cache_size, GFP_KERNEL);
671 if (!reg_cache) { 526 if (!reg_cache) {
672 return -ENOMEM; 527 return -ENOMEM;
@@ -685,9 +540,7 @@ int omap_mcbsp_request(unsigned int id)
685 spin_unlock(&mcbsp->lock); 540 spin_unlock(&mcbsp->lock);
686 541
687 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request) 542 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
688 mcbsp->pdata->ops->request(id); 543 mcbsp->pdata->ops->request(mcbsp->id - 1);
689
690 pm_runtime_get_sync(mcbsp->dev);
691 544
692 /* Enable wakeup behavior */ 545 /* Enable wakeup behavior */
693 if (mcbsp->pdata->has_wakeup) 546 if (mcbsp->pdata->has_wakeup)
@@ -726,14 +579,12 @@ err_free_irq:
726 free_irq(mcbsp->tx_irq, (void *)mcbsp); 579 free_irq(mcbsp->tx_irq, (void *)mcbsp);
727err_clk_disable: 580err_clk_disable:
728 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) 581 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
729 mcbsp->pdata->ops->free(id); 582 mcbsp->pdata->ops->free(mcbsp->id - 1);
730 583
731 /* Disable wakeup behavior */ 584 /* Disable wakeup behavior */
732 if (mcbsp->pdata->has_wakeup) 585 if (mcbsp->pdata->has_wakeup)
733 MCBSP_WRITE(mcbsp, WAKEUPEN, 0); 586 MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
734 587
735 pm_runtime_put_sync(mcbsp->dev);
736
737 spin_lock(&mcbsp->lock); 588 spin_lock(&mcbsp->lock);
738 mcbsp->free = true; 589 mcbsp->free = true;
739 mcbsp->reg_cache = NULL; 590 mcbsp->reg_cache = NULL;
@@ -743,28 +594,18 @@ err_kfree:
743 594
744 return err; 595 return err;
745} 596}
746EXPORT_SYMBOL(omap_mcbsp_request);
747 597
748void omap_mcbsp_free(unsigned int id) 598void omap_mcbsp_free(struct omap_mcbsp *mcbsp)
749{ 599{
750 struct omap_mcbsp *mcbsp;
751 void *reg_cache; 600 void *reg_cache;
752 601
753 if (!omap_mcbsp_check_valid_id(id)) {
754 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
755 return;
756 }
757 mcbsp = id_to_mcbsp_ptr(id);
758
759 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) 602 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
760 mcbsp->pdata->ops->free(id); 603 mcbsp->pdata->ops->free(mcbsp->id - 1);
761 604
762 /* Disable wakeup behavior */ 605 /* Disable wakeup behavior */
763 if (mcbsp->pdata->has_wakeup) 606 if (mcbsp->pdata->has_wakeup)
764 MCBSP_WRITE(mcbsp, WAKEUPEN, 0); 607 MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
765 608
766 pm_runtime_put_sync(mcbsp->dev);
767
768 if (mcbsp->rx_irq) 609 if (mcbsp->rx_irq)
769 free_irq(mcbsp->rx_irq, (void *)mcbsp); 610 free_irq(mcbsp->rx_irq, (void *)mcbsp);
770 free_irq(mcbsp->tx_irq, (void *)mcbsp); 611 free_irq(mcbsp->tx_irq, (void *)mcbsp);
@@ -782,25 +623,17 @@ void omap_mcbsp_free(unsigned int id)
782 if (reg_cache) 623 if (reg_cache)
783 kfree(reg_cache); 624 kfree(reg_cache);
784} 625}
785EXPORT_SYMBOL(omap_mcbsp_free);
786 626
787/* 627/*
788 * Here we start the McBSP, by enabling transmitter, receiver or both. 628 * Here we start the McBSP, by enabling transmitter, receiver or both.
789 * If no transmitter or receiver is active prior calling, then sample-rate 629 * If no transmitter or receiver is active prior calling, then sample-rate
790 * generator and frame sync are started. 630 * generator and frame sync are started.
791 */ 631 */
792void omap_mcbsp_start(unsigned int id, int tx, int rx) 632void omap_mcbsp_start(struct omap_mcbsp *mcbsp, int tx, int rx)
793{ 633{
794 struct omap_mcbsp *mcbsp;
795 int enable_srg = 0; 634 int enable_srg = 0;
796 u16 w; 635 u16 w;
797 636
798 if (!omap_mcbsp_check_valid_id(id)) {
799 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
800 return;
801 }
802 mcbsp = id_to_mcbsp_ptr(id);
803
804 if (mcbsp->st_data) 637 if (mcbsp->st_data)
805 omap_st_start(mcbsp); 638 omap_st_start(mcbsp);
806 639
@@ -850,23 +683,14 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx)
850 } 683 }
851 684
852 /* Dump McBSP Regs */ 685 /* Dump McBSP Regs */
853 omap_mcbsp_dump_reg(id); 686 omap_mcbsp_dump_reg(mcbsp);
854} 687}
855EXPORT_SYMBOL(omap_mcbsp_start);
856 688
857void omap_mcbsp_stop(unsigned int id, int tx, int rx) 689void omap_mcbsp_stop(struct omap_mcbsp *mcbsp, int tx, int rx)
858{ 690{
859 struct omap_mcbsp *mcbsp;
860 int idle; 691 int idle;
861 u16 w; 692 u16 w;
862 693
863 if (!omap_mcbsp_check_valid_id(id)) {
864 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
865 return;
866 }
867
868 mcbsp = id_to_mcbsp_ptr(id);
869
870 /* Reset transmitter */ 694 /* Reset transmitter */
871 tx &= 1; 695 tx &= 1;
872 if (mcbsp->pdata->has_ccr) { 696 if (mcbsp->pdata->has_ccr) {
@@ -899,19 +723,11 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx)
899 if (mcbsp->st_data) 723 if (mcbsp->st_data)
900 omap_st_stop(mcbsp); 724 omap_st_stop(mcbsp);
901} 725}
902EXPORT_SYMBOL(omap_mcbsp_stop);
903 726
904int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id) 727int omap2_mcbsp_set_clks_src(struct omap_mcbsp *mcbsp, u8 fck_src_id)
905{ 728{
906 struct omap_mcbsp *mcbsp;
907 const char *src; 729 const char *src;
908 730
909 if (!omap_mcbsp_check_valid_id(id)) {
910 pr_err("%s: Invalid id (%d)\n", __func__, id + 1);
911 return -EINVAL;
912 }
913 mcbsp = id_to_mcbsp_ptr(id);
914
915 if (fck_src_id == MCBSP_CLKS_PAD_SRC) 731 if (fck_src_id == MCBSP_CLKS_PAD_SRC)
916 src = "clks_ext"; 732 src = "clks_ext";
917 else if (fck_src_id == MCBSP_CLKS_PRCM_SRC) 733 else if (fck_src_id == MCBSP_CLKS_PRCM_SRC)
@@ -924,13 +740,14 @@ int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
924 else 740 else
925 return -EINVAL; 741 return -EINVAL;
926} 742}
927EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
928 743
929void omap2_mcbsp1_mux_clkr_src(u8 mux) 744void omap2_mcbsp1_mux_clkr_src(struct omap_mcbsp *mcbsp, u8 mux)
930{ 745{
931 struct omap_mcbsp *mcbsp;
932 const char *src; 746 const char *src;
933 747
748 if (mcbsp->id != 1)
749 return;
750
934 if (mux == CLKR_SRC_CLKR) 751 if (mux == CLKR_SRC_CLKR)
935 src = "clkr"; 752 src = "clkr";
936 else if (mux == CLKR_SRC_CLKX) 753 else if (mux == CLKR_SRC_CLKX)
@@ -938,17 +755,17 @@ void omap2_mcbsp1_mux_clkr_src(u8 mux)
938 else 755 else
939 return; 756 return;
940 757
941 mcbsp = id_to_mcbsp_ptr(0);
942 if (mcbsp->pdata->mux_signal) 758 if (mcbsp->pdata->mux_signal)
943 mcbsp->pdata->mux_signal(mcbsp->dev, "clkr", src); 759 mcbsp->pdata->mux_signal(mcbsp->dev, "clkr", src);
944} 760}
945EXPORT_SYMBOL(omap2_mcbsp1_mux_clkr_src);
946 761
947void omap2_mcbsp1_mux_fsr_src(u8 mux) 762void omap2_mcbsp1_mux_fsr_src(struct omap_mcbsp *mcbsp, u8 mux)
948{ 763{
949 struct omap_mcbsp *mcbsp;
950 const char *src; 764 const char *src;
951 765
766 if (mcbsp->id != 1)
767 return;
768
952 if (mux == FSR_SRC_FSR) 769 if (mux == FSR_SRC_FSR)
953 src = "fsr"; 770 src = "fsr";
954 else if (mux == FSR_SRC_FSX) 771 else if (mux == FSR_SRC_FSX)
@@ -956,11 +773,9 @@ void omap2_mcbsp1_mux_fsr_src(u8 mux)
956 else 773 else
957 return; 774 return;
958 775
959 mcbsp = id_to_mcbsp_ptr(0);
960 if (mcbsp->pdata->mux_signal) 776 if (mcbsp->pdata->mux_signal)
961 mcbsp->pdata->mux_signal(mcbsp->dev, "fsr", src); 777 mcbsp->pdata->mux_signal(mcbsp->dev, "fsr", src);
962} 778}
963EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src);
964 779
965#define max_thres(m) (mcbsp->pdata->buffer_size) 780#define max_thres(m) (mcbsp->pdata->buffer_size)
966#define valid_threshold(m, val) ((val) <= max_thres(m)) 781#define valid_threshold(m, val) ((val) <= max_thres(m))
@@ -1177,11 +992,10 @@ static void __devexit omap_st_remove(struct omap_mcbsp *mcbsp)
1177 * McBSP1 and McBSP3 are directly mapped on 1610 and 1510. 992 * McBSP1 and McBSP3 are directly mapped on 1610 and 1510.
1178 * 730 has only 2 McBSP, and both of them are MPU peripherals. 993 * 730 has only 2 McBSP, and both of them are MPU peripherals.
1179 */ 994 */
1180static int __devinit omap_mcbsp_probe(struct platform_device *pdev) 995int __devinit omap_mcbsp_probe(struct platform_device *pdev)
1181{ 996{
1182 struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data; 997 struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data;
1183 struct omap_mcbsp *mcbsp; 998 struct omap_mcbsp *mcbsp;
1184 int id = pdev->id - 1;
1185 struct resource *res; 999 struct resource *res;
1186 int ret = 0; 1000 int ret = 0;
1187 1001
@@ -1194,12 +1008,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
1194 1008
1195 dev_dbg(&pdev->dev, "Initializing OMAP McBSP (%d).\n", pdev->id); 1009 dev_dbg(&pdev->dev, "Initializing OMAP McBSP (%d).\n", pdev->id);
1196 1010
1197 if (id >= omap_mcbsp_count) {
1198 dev_err(&pdev->dev, "Invalid McBSP device id (%d)\n", id);
1199 ret = -EINVAL;
1200 goto exit;
1201 }
1202
1203 mcbsp = kzalloc(sizeof(struct omap_mcbsp), GFP_KERNEL); 1011 mcbsp = kzalloc(sizeof(struct omap_mcbsp), GFP_KERNEL);
1204 if (!mcbsp) { 1012 if (!mcbsp) {
1205 ret = -ENOMEM; 1013 ret = -ENOMEM;
@@ -1207,7 +1015,7 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
1207 } 1015 }
1208 1016
1209 spin_lock_init(&mcbsp->lock); 1017 spin_lock_init(&mcbsp->lock);
1210 mcbsp->id = id + 1; 1018 mcbsp->id = pdev->id;
1211 mcbsp->free = true; 1019 mcbsp->free = true;
1212 1020
1213 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu"); 1021 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
@@ -1268,7 +1076,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
1268 1076
1269 mcbsp->pdata = pdata; 1077 mcbsp->pdata = pdata;
1270 mcbsp->dev = &pdev->dev; 1078 mcbsp->dev = &pdev->dev;
1271 mcbsp_ptr[id] = mcbsp;
1272 platform_set_drvdata(pdev, mcbsp); 1079 platform_set_drvdata(pdev, mcbsp);
1273 pm_runtime_enable(mcbsp->dev); 1080 pm_runtime_enable(mcbsp->dev);
1274 1081
@@ -1323,7 +1130,7 @@ exit:
1323 return ret; 1130 return ret;
1324} 1131}
1325 1132
1326static int __devexit omap_mcbsp_remove(struct platform_device *pdev) 1133int __devexit omap_mcbsp_remove(struct platform_device *pdev)
1327{ 1134{
1328 struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev); 1135 struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
1329 1136
@@ -1349,18 +1156,3 @@ static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
1349 1156
1350 return 0; 1157 return 0;
1351} 1158}
1352
1353static struct platform_driver omap_mcbsp_driver = {
1354 .probe = omap_mcbsp_probe,
1355 .remove = __devexit_p(omap_mcbsp_remove),
1356 .driver = {
1357 .name = "omap-mcbsp",
1358 },
1359};
1360
1361module_platform_driver(omap_mcbsp_driver);
1362
1363MODULE_AUTHOR("Samuel Ortiz <samuel.ortiz@nokia.com>");
1364MODULE_DESCRIPTION("OMAP McBSP core driver");
1365MODULE_LICENSE("GPL");
1366MODULE_ALIAS("platform:omap-mcbsp");