aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2012-08-03 11:26:09 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-08-17 17:52:51 -0400
commit829c1bf40b926a86e545733f6252262add3abe39 (patch)
tree8d94e9dc8ccc86a7f2cf9d1a72fae88efc9209c2 /drivers
parentf83b73806579c666fe6f1a4ed4800092c89e81db (diff)
mmc: spi: Pull out parts shared between MMC and SPI
Abstract out the common part of private data shared between MMC and SPI. These shall later allow to use common clock configuration function. Signed-off-by: Marek Vasut <marex@denx.de> Acked-by: Chris Ball <cjb@laptop.org> Acked-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/host/mxs-mmc.c107
1 files changed, 59 insertions, 48 deletions
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
index e80c2b6b2d7c..7b85e035a4cb 100644
--- a/drivers/mmc/host/mxs-mmc.c
+++ b/drivers/mmc/host/mxs-mmc.c
@@ -62,23 +62,20 @@
62#define MXS_MMC_DETECT_TIMEOUT (HZ/2) 62#define MXS_MMC_DETECT_TIMEOUT (HZ/2)
63 63
64struct mxs_mmc_host { 64struct mxs_mmc_host {
65 struct mxs_ssp ssp;
66
65 struct mmc_host *mmc; 67 struct mmc_host *mmc;
66 struct mmc_request *mrq; 68 struct mmc_request *mrq;
67 struct mmc_command *cmd; 69 struct mmc_command *cmd;
68 struct mmc_data *data; 70 struct mmc_data *data;
69 71
70 void __iomem *base;
71 int dma_channel; 72 int dma_channel;
72 struct clk *clk;
73 unsigned int clk_rate;
74
75 struct dma_chan *dmach; 73 struct dma_chan *dmach;
76 struct mxs_dma_data dma_data; 74 struct mxs_dma_data dma_data;
77 unsigned int dma_dir; 75 unsigned int dma_dir;
78 enum dma_transfer_direction slave_dirn; 76 enum dma_transfer_direction slave_dirn;
79 u32 ssp_pio_words[SSP_PIO_NUM]; 77 u32 ssp_pio_words[SSP_PIO_NUM];
80 78
81 enum mxs_ssp_id devid;
82 unsigned char bus_width; 79 unsigned char bus_width;
83 spinlock_t lock; 80 spinlock_t lock;
84 int sdio_irq_en; 81 int sdio_irq_en;
@@ -105,16 +102,18 @@ static int mxs_mmc_get_ro(struct mmc_host *mmc)
105static int mxs_mmc_get_cd(struct mmc_host *mmc) 102static int mxs_mmc_get_cd(struct mmc_host *mmc)
106{ 103{
107 struct mxs_mmc_host *host = mmc_priv(mmc); 104 struct mxs_mmc_host *host = mmc_priv(mmc);
105 struct mxs_ssp *ssp = &host->ssp;
108 106
109 return !(readl(host->base + HW_SSP_STATUS(host)) & 107 return !(readl(ssp->base + HW_SSP_STATUS(ssp)) &
110 BM_SSP_STATUS_CARD_DETECT); 108 BM_SSP_STATUS_CARD_DETECT);
111} 109}
112 110
113static void mxs_mmc_reset(struct mxs_mmc_host *host) 111static void mxs_mmc_reset(struct mxs_mmc_host *host)
114{ 112{
113 struct mxs_ssp *ssp = &host->ssp;
115 u32 ctrl0, ctrl1; 114 u32 ctrl0, ctrl1;
116 115
117 stmp_reset_block(host->base); 116 stmp_reset_block(ssp->base);
118 117
119 ctrl0 = BM_SSP_CTRL0_IGNORE_CRC; 118 ctrl0 = BM_SSP_CTRL0_IGNORE_CRC;
120 ctrl1 = BF_SSP(0x3, CTRL1_SSP_MODE) | 119 ctrl1 = BF_SSP(0x3, CTRL1_SSP_MODE) |
@@ -130,15 +129,15 @@ static void mxs_mmc_reset(struct mxs_mmc_host *host)
130 writel(BF_SSP(0xffff, TIMING_TIMEOUT) | 129 writel(BF_SSP(0xffff, TIMING_TIMEOUT) |
131 BF_SSP(2, TIMING_CLOCK_DIVIDE) | 130 BF_SSP(2, TIMING_CLOCK_DIVIDE) |
132 BF_SSP(0, TIMING_CLOCK_RATE), 131 BF_SSP(0, TIMING_CLOCK_RATE),
133 host->base + HW_SSP_TIMING(host)); 132 ssp->base + HW_SSP_TIMING(ssp));
134 133
135 if (host->sdio_irq_en) { 134 if (host->sdio_irq_en) {
136 ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK; 135 ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK;
137 ctrl1 |= BM_SSP_CTRL1_SDIO_IRQ_EN; 136 ctrl1 |= BM_SSP_CTRL1_SDIO_IRQ_EN;
138 } 137 }
139 138
140 writel(ctrl0, host->base + HW_SSP_CTRL0); 139 writel(ctrl0, ssp->base + HW_SSP_CTRL0);
141 writel(ctrl1, host->base + HW_SSP_CTRL1(host)); 140 writel(ctrl1, ssp->base + HW_SSP_CTRL1(ssp));
142} 141}
143 142
144static void mxs_mmc_start_cmd(struct mxs_mmc_host *host, 143static void mxs_mmc_start_cmd(struct mxs_mmc_host *host,
@@ -149,15 +148,16 @@ static void mxs_mmc_request_done(struct mxs_mmc_host *host)
149 struct mmc_command *cmd = host->cmd; 148 struct mmc_command *cmd = host->cmd;
150 struct mmc_data *data = host->data; 149 struct mmc_data *data = host->data;
151 struct mmc_request *mrq = host->mrq; 150 struct mmc_request *mrq = host->mrq;
151 struct mxs_ssp *ssp = &host->ssp;
152 152
153 if (mmc_resp_type(cmd) & MMC_RSP_PRESENT) { 153 if (mmc_resp_type(cmd) & MMC_RSP_PRESENT) {
154 if (mmc_resp_type(cmd) & MMC_RSP_136) { 154 if (mmc_resp_type(cmd) & MMC_RSP_136) {
155 cmd->resp[3] = readl(host->base + HW_SSP_SDRESP0(host)); 155 cmd->resp[3] = readl(ssp->base + HW_SSP_SDRESP0(ssp));
156 cmd->resp[2] = readl(host->base + HW_SSP_SDRESP1(host)); 156 cmd->resp[2] = readl(ssp->base + HW_SSP_SDRESP1(ssp));
157 cmd->resp[1] = readl(host->base + HW_SSP_SDRESP2(host)); 157 cmd->resp[1] = readl(ssp->base + HW_SSP_SDRESP2(ssp));
158 cmd->resp[0] = readl(host->base + HW_SSP_SDRESP3(host)); 158 cmd->resp[0] = readl(ssp->base + HW_SSP_SDRESP3(ssp));
159 } else { 159 } else {
160 cmd->resp[0] = readl(host->base + HW_SSP_SDRESP0(host)); 160 cmd->resp[0] = readl(ssp->base + HW_SSP_SDRESP0(ssp));
161 } 161 }
162 } 162 }
163 163
@@ -196,13 +196,14 @@ static irqreturn_t mxs_mmc_irq_handler(int irq, void *dev_id)
196 struct mxs_mmc_host *host = dev_id; 196 struct mxs_mmc_host *host = dev_id;
197 struct mmc_command *cmd = host->cmd; 197 struct mmc_command *cmd = host->cmd;
198 struct mmc_data *data = host->data; 198 struct mmc_data *data = host->data;
199 struct mxs_ssp *ssp = &host->ssp;
199 u32 stat; 200 u32 stat;
200 201
201 spin_lock(&host->lock); 202 spin_lock(&host->lock);
202 203
203 stat = readl(host->base + HW_SSP_CTRL1(host)); 204 stat = readl(ssp->base + HW_SSP_CTRL1(ssp));
204 writel(stat & MXS_MMC_IRQ_BITS, 205 writel(stat & MXS_MMC_IRQ_BITS,
205 host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_CLR); 206 ssp->base + HW_SSP_CTRL1(ssp) + STMP_OFFSET_REG_CLR);
206 207
207 if ((stat & BM_SSP_CTRL1_SDIO_IRQ) && (stat & BM_SSP_CTRL1_SDIO_IRQ_EN)) 208 if ((stat & BM_SSP_CTRL1_SDIO_IRQ) && (stat & BM_SSP_CTRL1_SDIO_IRQ_EN))
208 mmc_signal_sdio_irq(host->mmc); 209 mmc_signal_sdio_irq(host->mmc);
@@ -366,6 +367,8 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
366 unsigned int data_size = 0, log2_blksz; 367 unsigned int data_size = 0, log2_blksz;
367 unsigned int blocks = data->blocks; 368 unsigned int blocks = data->blocks;
368 369
370 struct mxs_ssp *ssp = &host->ssp;
371
369 u32 ignore_crc, get_resp, long_resp, read; 372 u32 ignore_crc, get_resp, long_resp, read;
370 u32 ctrl0, cmd0, cmd1, val; 373 u32 ctrl0, cmd0, cmd1, val;
371 374
@@ -408,15 +411,15 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
408 blocks = 1; 411 blocks = 1;
409 412
410 /* xfer count, block size and count need to be set differently */ 413 /* xfer count, block size and count need to be set differently */
411 if (ssp_is_old(host)) { 414 if (ssp_is_old(ssp)) {
412 ctrl0 |= BF_SSP(data_size, CTRL0_XFER_COUNT); 415 ctrl0 |= BF_SSP(data_size, CTRL0_XFER_COUNT);
413 cmd0 |= BF_SSP(log2_blksz, CMD0_BLOCK_SIZE) | 416 cmd0 |= BF_SSP(log2_blksz, CMD0_BLOCK_SIZE) |
414 BF_SSP(blocks - 1, CMD0_BLOCK_COUNT); 417 BF_SSP(blocks - 1, CMD0_BLOCK_COUNT);
415 } else { 418 } else {
416 writel(data_size, host->base + HW_SSP_XFER_SIZE); 419 writel(data_size, ssp->base + HW_SSP_XFER_SIZE);
417 writel(BF_SSP(log2_blksz, BLOCK_SIZE_BLOCK_SIZE) | 420 writel(BF_SSP(log2_blksz, BLOCK_SIZE_BLOCK_SIZE) |
418 BF_SSP(blocks - 1, BLOCK_SIZE_BLOCK_COUNT), 421 BF_SSP(blocks - 1, BLOCK_SIZE_BLOCK_COUNT),
419 host->base + HW_SSP_BLOCK_SIZE); 422 ssp->base + HW_SSP_BLOCK_SIZE);
420 } 423 }
421 424
422 if ((cmd->opcode == MMC_STOP_TRANSMISSION) || 425 if ((cmd->opcode == MMC_STOP_TRANSMISSION) ||
@@ -431,11 +434,11 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
431 } 434 }
432 435
433 /* set the timeout count */ 436 /* set the timeout count */
434 timeout = mxs_ns_to_ssp_ticks(host->clk_rate, data->timeout_ns); 437 timeout = mxs_ns_to_ssp_ticks(ssp->clk_rate, data->timeout_ns);
435 val = readl(host->base + HW_SSP_TIMING(host)); 438 val = readl(ssp->base + HW_SSP_TIMING(ssp));
436 val &= ~(BM_SSP_TIMING_TIMEOUT); 439 val &= ~(BM_SSP_TIMING_TIMEOUT);
437 val |= BF_SSP(timeout, TIMING_TIMEOUT); 440 val |= BF_SSP(timeout, TIMING_TIMEOUT);
438 writel(val, host->base + HW_SSP_TIMING(host)); 441 writel(val, ssp->base + HW_SSP_TIMING(ssp));
439 442
440 /* pio */ 443 /* pio */
441 host->ssp_pio_words[0] = ctrl0; 444 host->ssp_pio_words[0] = ctrl0;
@@ -500,11 +503,12 @@ static void mxs_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
500 503
501static void mxs_mmc_set_clk_rate(struct mxs_mmc_host *host, unsigned int rate) 504static void mxs_mmc_set_clk_rate(struct mxs_mmc_host *host, unsigned int rate)
502{ 505{
506 struct mxs_ssp *ssp = &host->ssp;
503 unsigned int ssp_clk, ssp_sck; 507 unsigned int ssp_clk, ssp_sck;
504 u32 clock_divide, clock_rate; 508 u32 clock_divide, clock_rate;
505 u32 val; 509 u32 val;
506 510
507 ssp_clk = clk_get_rate(host->clk); 511 ssp_clk = clk_get_rate(ssp->clk);
508 512
509 for (clock_divide = 2; clock_divide <= 254; clock_divide += 2) { 513 for (clock_divide = 2; clock_divide <= 254; clock_divide += 2) {
510 clock_rate = DIV_ROUND_UP(ssp_clk, rate * clock_divide); 514 clock_rate = DIV_ROUND_UP(ssp_clk, rate * clock_divide);
@@ -521,13 +525,13 @@ static void mxs_mmc_set_clk_rate(struct mxs_mmc_host *host, unsigned int rate)
521 525
522 ssp_sck = ssp_clk / clock_divide / (1 + clock_rate); 526 ssp_sck = ssp_clk / clock_divide / (1 + clock_rate);
523 527
524 val = readl(host->base + HW_SSP_TIMING(host)); 528 val = readl(ssp->base + HW_SSP_TIMING(ssp));
525 val &= ~(BM_SSP_TIMING_CLOCK_DIVIDE | BM_SSP_TIMING_CLOCK_RATE); 529 val &= ~(BM_SSP_TIMING_CLOCK_DIVIDE | BM_SSP_TIMING_CLOCK_RATE);
526 val |= BF_SSP(clock_divide, TIMING_CLOCK_DIVIDE); 530 val |= BF_SSP(clock_divide, TIMING_CLOCK_DIVIDE);
527 val |= BF_SSP(clock_rate, TIMING_CLOCK_RATE); 531 val |= BF_SSP(clock_rate, TIMING_CLOCK_RATE);
528 writel(val, host->base + HW_SSP_TIMING(host)); 532 writel(val, ssp->base + HW_SSP_TIMING(ssp));
529 533
530 host->clk_rate = ssp_sck; 534 ssp->clk_rate = ssp_sck;
531 535
532 dev_dbg(mmc_dev(host->mmc), 536 dev_dbg(mmc_dev(host->mmc),
533 "%s: clock_divide %d, clock_rate %d, ssp_clk %d, rate_actual %d, rate_requested %d\n", 537 "%s: clock_divide %d, clock_rate %d, ssp_clk %d, rate_actual %d, rate_requested %d\n",
@@ -552,6 +556,7 @@ static void mxs_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
552static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) 556static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
553{ 557{
554 struct mxs_mmc_host *host = mmc_priv(mmc); 558 struct mxs_mmc_host *host = mmc_priv(mmc);
559 struct mxs_ssp *ssp = &host->ssp;
555 unsigned long flags; 560 unsigned long flags;
556 561
557 spin_lock_irqsave(&host->lock, flags); 562 spin_lock_irqsave(&host->lock, flags);
@@ -560,19 +565,19 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
560 565
561 if (enable) { 566 if (enable) {
562 writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK, 567 writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK,
563 host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET); 568 ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
564 writel(BM_SSP_CTRL1_SDIO_IRQ_EN, 569 writel(BM_SSP_CTRL1_SDIO_IRQ_EN,
565 host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_SET); 570 ssp->base + HW_SSP_CTRL1(ssp) + STMP_OFFSET_REG_SET);
566 571
567 if (readl(host->base + HW_SSP_STATUS(host)) & 572 if (readl(ssp->base + HW_SSP_STATUS(ssp)) &
568 BM_SSP_STATUS_SDIO_IRQ) 573 BM_SSP_STATUS_SDIO_IRQ)
569 mmc_signal_sdio_irq(host->mmc); 574 mmc_signal_sdio_irq(host->mmc);
570 575
571 } else { 576 } else {
572 writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK, 577 writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK,
573 host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR); 578 ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
574 writel(BM_SSP_CTRL1_SDIO_IRQ_EN, 579 writel(BM_SSP_CTRL1_SDIO_IRQ_EN,
575 host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_CLR); 580 ssp->base + HW_SSP_CTRL1(ssp) + STMP_OFFSET_REG_CLR);
576 } 581 }
577 582
578 spin_unlock_irqrestore(&host->lock, flags); 583 spin_unlock_irqrestore(&host->lock, flags);
@@ -635,6 +640,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
635 dma_cap_mask_t mask; 640 dma_cap_mask_t mask;
636 struct regulator *reg_vmmc; 641 struct regulator *reg_vmmc;
637 enum of_gpio_flags flags; 642 enum of_gpio_flags flags;
643 struct mxs_ssp *ssp;
638 644
639 iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); 645 iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
640 dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0); 646 dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
@@ -648,14 +654,16 @@ static int mxs_mmc_probe(struct platform_device *pdev)
648 return -ENOMEM; 654 return -ENOMEM;
649 655
650 host = mmc_priv(mmc); 656 host = mmc_priv(mmc);
651 host->base = devm_request_and_ioremap(&pdev->dev, iores); 657 ssp = &host->ssp;
652 if (!host->base) { 658 ssp->dev = &pdev->dev;
659 ssp->base = devm_request_and_ioremap(&pdev->dev, iores);
660 if (!ssp->base) {
653 ret = -EADDRNOTAVAIL; 661 ret = -EADDRNOTAVAIL;
654 goto out_mmc_free; 662 goto out_mmc_free;
655 } 663 }
656 664
657 if (np) { 665 if (np) {
658 host->devid = (enum mxs_ssp_id) of_id->data; 666 ssp->devid = (enum mxs_ssp_id) of_id->data;
659 /* 667 /*
660 * TODO: This is a temporary solution and should be changed 668 * TODO: This is a temporary solution and should be changed
661 * to use generic DMA binding later when the helpers get in. 669 * to use generic DMA binding later when the helpers get in.
@@ -668,7 +676,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
668 goto out_mmc_free; 676 goto out_mmc_free;
669 } 677 }
670 } else { 678 } else {
671 host->devid = pdev->id_entry->driver_data; 679 ssp->devid = pdev->id_entry->driver_data;
672 host->dma_channel = dmares->start; 680 host->dma_channel = dmares->start;
673 } 681 }
674 682
@@ -691,12 +699,12 @@ static int mxs_mmc_probe(struct platform_device *pdev)
691 goto out_mmc_free; 699 goto out_mmc_free;
692 } 700 }
693 701
694 host->clk = clk_get(&pdev->dev, NULL); 702 ssp->clk = clk_get(&pdev->dev, NULL);
695 if (IS_ERR(host->clk)) { 703 if (IS_ERR(ssp->clk)) {
696 ret = PTR_ERR(host->clk); 704 ret = PTR_ERR(ssp->clk);
697 goto out_mmc_free; 705 goto out_mmc_free;
698 } 706 }
699 clk_prepare_enable(host->clk); 707 clk_prepare_enable(ssp->clk);
700 708
701 mxs_mmc_reset(host); 709 mxs_mmc_reset(host);
702 710
@@ -741,8 +749,8 @@ static int mxs_mmc_probe(struct platform_device *pdev)
741 749
742 mmc->max_segs = 52; 750 mmc->max_segs = 52;
743 mmc->max_blk_size = 1 << 0xf; 751 mmc->max_blk_size = 1 << 0xf;
744 mmc->max_blk_count = (ssp_is_old(host)) ? 0xff : 0xffffff; 752 mmc->max_blk_count = (ssp_is_old(ssp)) ? 0xff : 0xffffff;
745 mmc->max_req_size = (ssp_is_old(host)) ? 0xffff : 0xffffffff; 753 mmc->max_req_size = (ssp_is_old(ssp)) ? 0xffff : 0xffffffff;
746 mmc->max_seg_size = dma_get_max_seg_size(host->dmach->device->dev); 754 mmc->max_seg_size = dma_get_max_seg_size(host->dmach->device->dev);
747 755
748 platform_set_drvdata(pdev, mmc); 756 platform_set_drvdata(pdev, mmc);
@@ -766,8 +774,8 @@ out_free_dma:
766 if (host->dmach) 774 if (host->dmach)
767 dma_release_channel(host->dmach); 775 dma_release_channel(host->dmach);
768out_clk_put: 776out_clk_put:
769 clk_disable_unprepare(host->clk); 777 clk_disable_unprepare(ssp->clk);
770 clk_put(host->clk); 778 clk_put(ssp->clk);
771out_mmc_free: 779out_mmc_free:
772 mmc_free_host(mmc); 780 mmc_free_host(mmc);
773 return ret; 781 return ret;
@@ -777,6 +785,7 @@ static int mxs_mmc_remove(struct platform_device *pdev)
777{ 785{
778 struct mmc_host *mmc = platform_get_drvdata(pdev); 786 struct mmc_host *mmc = platform_get_drvdata(pdev);
779 struct mxs_mmc_host *host = mmc_priv(mmc); 787 struct mxs_mmc_host *host = mmc_priv(mmc);
788 struct mxs_ssp *ssp = &host->ssp;
780 789
781 mmc_remove_host(mmc); 790 mmc_remove_host(mmc);
782 791
@@ -785,8 +794,8 @@ static int mxs_mmc_remove(struct platform_device *pdev)
785 if (host->dmach) 794 if (host->dmach)
786 dma_release_channel(host->dmach); 795 dma_release_channel(host->dmach);
787 796
788 clk_disable_unprepare(host->clk); 797 clk_disable_unprepare(ssp->clk);
789 clk_put(host->clk); 798 clk_put(ssp->clk);
790 799
791 mmc_free_host(mmc); 800 mmc_free_host(mmc);
792 801
@@ -798,11 +807,12 @@ static int mxs_mmc_suspend(struct device *dev)
798{ 807{
799 struct mmc_host *mmc = dev_get_drvdata(dev); 808 struct mmc_host *mmc = dev_get_drvdata(dev);
800 struct mxs_mmc_host *host = mmc_priv(mmc); 809 struct mxs_mmc_host *host = mmc_priv(mmc);
810 struct mxs_ssp *ssp = &host->ssp;
801 int ret = 0; 811 int ret = 0;
802 812
803 ret = mmc_suspend_host(mmc); 813 ret = mmc_suspend_host(mmc);
804 814
805 clk_disable_unprepare(host->clk); 815 clk_disable_unprepare(ssp->clk);
806 816
807 return ret; 817 return ret;
808} 818}
@@ -811,9 +821,10 @@ static int mxs_mmc_resume(struct device *dev)
811{ 821{
812 struct mmc_host *mmc = dev_get_drvdata(dev); 822 struct mmc_host *mmc = dev_get_drvdata(dev);
813 struct mxs_mmc_host *host = mmc_priv(mmc); 823 struct mxs_mmc_host *host = mmc_priv(mmc);
824 struct mxs_ssp *ssp = &host->ssp;
814 int ret = 0; 825 int ret = 0;
815 826
816 clk_prepare_enable(host->clk); 827 clk_prepare_enable(ssp->clk);
817 828
818 ret = mmc_resume_host(mmc); 829 ret = mmc_resume_host(mmc);
819 830