spi-mxs.c 16.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// SPDX-License-Identifier: GPL-2.0+
//
// Freescale MXS SPI master driver
//
// Copyright 2012 DENX Software Engineering, GmbH.
// Copyright 2012 Freescale Semiconductor, Inc.
// Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved.
//
// Rework and transition to new API by:
// Marek Vasut <marex@denx.de>
//
// Based on previous attempt by:
// Fabio Estevam <fabio.estevam@freescale.com>
//
// Based on code from U-Boot bootloader by:
// Marek Vasut <marex@denx.de>
//
// Based on spi-stmp.c, which is:
// Author: Dmitry Pervushin <dimka@embeddedalley.com>
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
#include <linux/highmem.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/completion.h>
#include <linux/gpio.h>
#include <linux/regulator/consumer.h>
37
#include <linux/pm_runtime.h>
38 39 40 41
#include <linux/module.h>
#include <linux/stmp_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/mxs-spi.h>
42
#include <trace/events/spi.h>
43 44 45

#define DRIVER_NAME		"mxs-spi"

46 47
/* Use 10S timeout for very long transfers, it should suffice. */
#define SSP_TIMEOUT		10000
48

49 50
#define SG_MAXLEN		0xff00

51 52 53 54 55 56 57
/*
 * Flags for txrx functions.  More efficient that using an argument register for
 * each one.
 */
#define TXRX_WRITE		(1<<0)	/* This is a write */
#define TXRX_DEASSERT_CS	(1<<1)	/* De-assert CS at end of txrx */

58 59
struct mxs_spi {
	struct mxs_ssp		ssp;
60
	struct completion	c;
61
	unsigned int		sck;	/* Rate requested (vs actual) */
62 63 64
};

static int mxs_spi_setup_transfer(struct spi_device *dev,
65
				  const struct spi_transfer *t)
66 67 68
{
	struct mxs_spi *spi = spi_master_get_devdata(dev->master);
	struct mxs_ssp *ssp = &spi->ssp;
69
	const unsigned int hz = min(dev->max_speed_hz, t->speed_hz);
70 71

	if (hz == 0) {
72
		dev_err(&dev->dev, "SPI clock rate of zero not allowed\n");
73 74 75
		return -EINVAL;
	}

76 77 78 79
	if (hz != spi->sck) {
		mxs_ssp_set_clk_rate(ssp, hz);
		/*
		 * Save requested rate, hz, rather than the actual rate,
80
		 * ssp->clk_rate.  Otherwise we would set the rate every transfer
81 82 83 84 85 86 87 88
		 * when the actual rate is not quite the same as requested rate.
		 */
		spi->sck = hz;
		/*
		 * Perhaps we should return an error if the actual clock is
		 * nowhere close to what was requested?
		 */
	}
89

T
Trent Piepho 已提交
90 91
	writel(BM_SSP_CTRL0_LOCK_CS,
		ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
92 93

	writel(BF_SSP_CTRL1_SSP_MODE(BV_SSP_CTRL1_SSP_MODE__SPI) |
94 95 96 97
	       BF_SSP_CTRL1_WORD_LENGTH(BV_SSP_CTRL1_WORD_LENGTH__EIGHT_BITS) |
	       ((dev->mode & SPI_CPOL) ? BM_SSP_CTRL1_POLARITY : 0) |
	       ((dev->mode & SPI_CPHA) ? BM_SSP_CTRL1_PHASE : 0),
	       ssp->base + HW_SSP_CTRL1(ssp));
98 99 100 101 102 103 104

	writel(0x0, ssp->base + HW_SSP_CMD0);
	writel(0x0, ssp->base + HW_SSP_CMD1);

	return 0;
}

105
static u32 mxs_spi_cs_to_reg(unsigned cs)
106
{
107
	u32 select = 0;
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

	/*
	 * i.MX28 Datasheet: 17.10.1: HW_SSP_CTRL0
	 *
	 * The bits BM_SSP_CTRL0_WAIT_FOR_CMD and BM_SSP_CTRL0_WAIT_FOR_IRQ
	 * in HW_SSP_CTRL0 register do have multiple usage, please refer to
	 * the datasheet for further details. In SPI mode, they are used to
	 * toggle the chip-select lines (nCS pins).
	 */
	if (cs & 1)
		select |= BM_SSP_CTRL0_WAIT_FOR_CMD;
	if (cs & 2)
		select |= BM_SSP_CTRL0_WAIT_FOR_IRQ;

	return select;
}

static int mxs_ssp_wait(struct mxs_spi *spi, int offset, int mask, bool set)
{
127
	const unsigned long timeout = jiffies + msecs_to_jiffies(SSP_TIMEOUT);
128
	struct mxs_ssp *ssp = &spi->ssp;
129
	u32 reg;
130

131
	do {
132 133
		reg = readl_relaxed(ssp->base + offset);

134 135
		if (!set)
			reg = ~reg;
136

137
		reg &= mask;
138

139 140 141
		if (reg == mask)
			return 0;
	} while (time_before(jiffies, timeout));
142

143
	return -ETIMEDOUT;
144 145
}

146 147 148
static void mxs_ssp_dma_irq_callback(void *param)
{
	struct mxs_spi *spi = param;
J
Jingoo Han 已提交
149

150 151 152 153 154 155
	complete(&spi->c);
}

static irqreturn_t mxs_ssp_irq_handler(int irq, void *dev_id)
{
	struct mxs_ssp *ssp = dev_id;
J
Jingoo Han 已提交
156

157 158 159 160 161 162 163
	dev_err(ssp->dev, "%s[%i] CTRL1=%08x STATUS=%08x\n",
		__func__, __LINE__,
		readl(ssp->base + HW_SSP_CTRL1(ssp)),
		readl(ssp->base + HW_SSP_STATUS(ssp)));
	return IRQ_HANDLED;
}

164
static int mxs_spi_txrx_dma(struct mxs_spi *spi,
165
			    unsigned char *buf, int len,
166
			    unsigned int flags)
167 168
{
	struct mxs_ssp *ssp = &spi->ssp;
169 170 171 172
	struct dma_async_tx_descriptor *desc = NULL;
	const bool vmalloced_buf = is_vmalloc_addr(buf);
	const int desc_len = vmalloced_buf ? PAGE_SIZE : SG_MAXLEN;
	const int sgs = DIV_ROUND_UP(len, desc_len);
173
	int sg_count;
174
	int min, ret;
175
	u32 ctrl0;
176 177
	struct page *vm_page;
	struct {
178
		u32			pio[4];
179 180 181 182
		struct scatterlist	sg;
	} *dma_xfer;

	if (!len)
183
		return -EINVAL;
184

J
Jingoo Han 已提交
185
	dma_xfer = kcalloc(sgs, sizeof(*dma_xfer), GFP_KERNEL);
186 187
	if (!dma_xfer)
		return -ENOMEM;
188

189
	reinit_completion(&spi->c);
190

191
	/* Chip select was already programmed into CTRL0 */
192
	ctrl0 = readl(ssp->base + HW_SSP_CTRL0);
193 194
	ctrl0 &= ~(BM_SSP_CTRL0_XFER_COUNT | BM_SSP_CTRL0_IGNORE_CRC |
		 BM_SSP_CTRL0_READ);
195
	ctrl0 |= BM_SSP_CTRL0_DATA_XFER;
196

197
	if (!(flags & TXRX_WRITE))
198
		ctrl0 |= BM_SSP_CTRL0_READ;
199 200

	/* Queue the DMA data transfer. */
201
	for (sg_count = 0; sg_count < sgs; sg_count++) {
202
		/* Prepare the transfer descriptor. */
203 204
		min = min(len, desc_len);

205 206 207 208 209
		/*
		 * De-assert CS on last segment if flag is set (i.e., no more
		 * transfers will follow)
		 */
		if ((sg_count + 1 == sgs) && (flags & TXRX_DEASSERT_CS))
210 211
			ctrl0 |= BM_SSP_CTRL0_IGNORE_CRC;

212 213
		if (ssp->devid == IMX23_SSP) {
			ctrl0 &= ~BM_SSP_CTRL0_XFER_COUNT;
214
			ctrl0 |= min;
215
		}
216 217 218 219 220 221 222 223 224 225

		dma_xfer[sg_count].pio[0] = ctrl0;
		dma_xfer[sg_count].pio[3] = min;

		if (vmalloced_buf) {
			vm_page = vmalloc_to_page(buf);
			if (!vm_page) {
				ret = -ENOMEM;
				goto err_vmalloc;
			}
226 227 228 229

			sg_init_table(&dma_xfer[sg_count].sg, 1);
			sg_set_page(&dma_xfer[sg_count].sg, vm_page,
				    min, offset_in_page(buf));
230
		} else {
231
			sg_init_one(&dma_xfer[sg_count].sg, buf, min);
232 233 234
		}

		ret = dma_map_sg(ssp->dev, &dma_xfer[sg_count].sg, 1,
235
			(flags & TXRX_WRITE) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254

		len -= min;
		buf += min;

		/* Queue the PIO register write transfer. */
		desc = dmaengine_prep_slave_sg(ssp->dmach,
				(struct scatterlist *)dma_xfer[sg_count].pio,
				(ssp->devid == IMX23_SSP) ? 1 : 4,
				DMA_TRANS_NONE,
				sg_count ? DMA_PREP_INTERRUPT : 0);
		if (!desc) {
			dev_err(ssp->dev,
				"Failed to get PIO reg. write descriptor.\n");
			ret = -EINVAL;
			goto err_mapped;
		}

		desc = dmaengine_prep_slave_sg(ssp->dmach,
				&dma_xfer[sg_count].sg, 1,
255
				(flags & TXRX_WRITE) ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
256 257 258 259 260 261 262 263
				DMA_PREP_INTERRUPT | DMA_CTRL_ACK);

		if (!desc) {
			dev_err(ssp->dev,
				"Failed to get DMA data write descriptor.\n");
			ret = -EINVAL;
			goto err_mapped;
		}
264 265 266 267 268 269 270 271 272 273 274 275 276
	}

	/*
	 * The last descriptor must have this callback,
	 * to finish the DMA transaction.
	 */
	desc->callback = mxs_ssp_dma_irq_callback;
	desc->callback_param = spi;

	/* Start the transfer. */
	dmaengine_submit(desc);
	dma_async_issue_pending(ssp->dmach);

277 278
	if (!wait_for_completion_timeout(&spi->c,
					 msecs_to_jiffies(SSP_TIMEOUT))) {
279 280
		dev_err(ssp->dev, "DMA transfer timeout\n");
		ret = -ETIMEDOUT;
281
		dmaengine_terminate_all(ssp->dmach);
282
		goto err_vmalloc;
283 284 285 286
	}

	ret = 0;

287 288 289 290
err_vmalloc:
	while (--sg_count >= 0) {
err_mapped:
		dma_unmap_sg(ssp->dev, &dma_xfer[sg_count].sg, 1,
291
			(flags & TXRX_WRITE) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
292 293
	}

294 295
	kfree(dma_xfer);

296 297 298
	return ret;
}

299
static int mxs_spi_txrx_pio(struct mxs_spi *spi,
300
			    unsigned char *buf, int len,
301
			    unsigned int flags)
302 303 304
{
	struct mxs_ssp *ssp = &spi->ssp;

305 306
	writel(BM_SSP_CTRL0_IGNORE_CRC,
	       ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
307 308

	while (len--) {
309
		if (len == 0 && (flags & TXRX_DEASSERT_CS))
310 311
			writel(BM_SSP_CTRL0_IGNORE_CRC,
			       ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
312 313 314 315 316 317 318 319 320 321

		if (ssp->devid == IMX23_SSP) {
			writel(BM_SSP_CTRL0_XFER_COUNT,
				ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
			writel(1,
				ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
		} else {
			writel(1, ssp->base + HW_SSP_XFER_SIZE);
		}

322
		if (flags & TXRX_WRITE)
323 324 325 326 327 328 329 330 331 332 333 334
			writel(BM_SSP_CTRL0_READ,
				ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
		else
			writel(BM_SSP_CTRL0_READ,
				ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);

		writel(BM_SSP_CTRL0_RUN,
				ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);

		if (mxs_ssp_wait(spi, HW_SSP_CTRL0, BM_SSP_CTRL0_RUN, 1))
			return -ETIMEDOUT;

335
		if (flags & TXRX_WRITE)
336 337 338 339 340
			writel(*buf, ssp->base + HW_SSP_DATA(ssp));

		writel(BM_SSP_CTRL0_DATA_XFER,
			     ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);

341
		if (!(flags & TXRX_WRITE)) {
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
			if (mxs_ssp_wait(spi, HW_SSP_STATUS(ssp),
						BM_SSP_STATUS_FIFO_EMPTY, 0))
				return -ETIMEDOUT;

			*buf = (readl(ssp->base + HW_SSP_DATA(ssp)) & 0xff);
		}

		if (mxs_ssp_wait(spi, HW_SSP_CTRL0, BM_SSP_CTRL0_RUN, 0))
			return -ETIMEDOUT;

		buf++;
	}

	if (len <= 0)
		return 0;

	return -ETIMEDOUT;
}

static int mxs_spi_transfer_one(struct spi_master *master,
				struct spi_message *m)
{
	struct mxs_spi *spi = spi_master_get_devdata(master);
	struct mxs_ssp *ssp = &spi->ssp;
366
	struct spi_transfer *t;
367
	unsigned int flag;
368 369
	int status = 0;

370 371 372 373 374
	/* Program CS register bits here, it will be used for all transfers. */
	writel(BM_SSP_CTRL0_WAIT_FOR_CMD | BM_SSP_CTRL0_WAIT_FOR_IRQ,
	       ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
	writel(mxs_spi_cs_to_reg(m->spi->chip_select),
	       ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
375

376
	list_for_each_entry(t, &m->transfers, transfer_list) {
377

378 379
		trace_spi_transfer_start(m, t);

380 381 382 383
		status = mxs_spi_setup_transfer(m->spi, t);
		if (status)
			break;

384 385 386
		/* De-assert on last transfer, inverted by cs_change flag */
		flag = (&t->transfer_list == m->transfers.prev) ^ t->cs_change ?
		       TXRX_DEASSERT_CS : 0;
387

388 389 390 391 392 393 394 395 396
		/*
		 * Small blocks can be transfered via PIO.
		 * Measured by empiric means:
		 *
		 * dd if=/dev/mtdblock0 of=/dev/null bs=1024k count=1
		 *
		 * DMA only: 2.164808 seconds, 473.0KB/s
		 * Combined: 1.676276 seconds, 610.9KB/s
		 */
397
		if (t->len < 32) {
398 399 400 401 402
			writel(BM_SSP_CTRL1_DMA_ENABLE,
				ssp->base + HW_SSP_CTRL1(ssp) +
				STMP_OFFSET_REG_CLR);

			if (t->tx_buf)
403
				status = mxs_spi_txrx_pio(spi,
404
						(void *)t->tx_buf,
405
						t->len, flag | TXRX_WRITE);
406
			if (t->rx_buf)
407
				status = mxs_spi_txrx_pio(spi,
408
						t->rx_buf, t->len,
409
						flag);
410 411 412 413 414 415
		} else {
			writel(BM_SSP_CTRL1_DMA_ENABLE,
				ssp->base + HW_SSP_CTRL1(ssp) +
				STMP_OFFSET_REG_SET);

			if (t->tx_buf)
416
				status = mxs_spi_txrx_dma(spi,
417
						(void *)t->tx_buf, t->len,
418
						flag | TXRX_WRITE);
419
			if (t->rx_buf)
420
				status = mxs_spi_txrx_dma(spi,
421
						t->rx_buf, t->len,
422
						flag);
423
		}
424

425 426
		trace_spi_transfer_stop(m, t);

427 428
		if (status) {
			stmp_reset_block(ssp->base);
429
			break;
430
		}
431

432
		m->actual_length += t->len;
433 434
	}

435
	m->status = status;
436 437 438 439 440
	spi_finalize_current_message(master);

	return status;
}

441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
static int mxs_spi_runtime_suspend(struct device *dev)
{
	struct spi_master *master = dev_get_drvdata(dev);
	struct mxs_spi *spi = spi_master_get_devdata(master);
	struct mxs_ssp *ssp = &spi->ssp;
	int ret;

	clk_disable_unprepare(ssp->clk);

	ret = pinctrl_pm_select_idle_state(dev);
	if (ret) {
		int ret2 = clk_prepare_enable(ssp->clk);

		if (ret2)
			dev_warn(dev, "Failed to reenable clock after failing pinctrl request (pinctrl: %d, clk: %d)\n",
				 ret, ret2);
	}

	return ret;
}

static int mxs_spi_runtime_resume(struct device *dev)
{
	struct spi_master *master = dev_get_drvdata(dev);
	struct mxs_spi *spi = spi_master_get_devdata(master);
	struct mxs_ssp *ssp = &spi->ssp;
	int ret;

	ret = pinctrl_pm_select_default_state(dev);
	if (ret)
		return ret;

	ret = clk_prepare_enable(ssp->clk);
	if (ret)
		pinctrl_pm_select_idle_state(dev);

	return ret;
}

static int __maybe_unused mxs_spi_suspend(struct device *dev)
{
	struct spi_master *master = dev_get_drvdata(dev);
	int ret;

	ret = spi_master_suspend(master);
	if (ret)
		return ret;

	if (!pm_runtime_suspended(dev))
		return mxs_spi_runtime_suspend(dev);
	else
		return 0;
}

static int __maybe_unused mxs_spi_resume(struct device *dev)
{
	struct spi_master *master = dev_get_drvdata(dev);
	int ret;

	if (!pm_runtime_suspended(dev))
		ret = mxs_spi_runtime_resume(dev);
	else
		ret = 0;
	if (ret)
		return ret;

	ret = spi_master_resume(master);
	if (ret < 0 && !pm_runtime_suspended(dev))
		mxs_spi_runtime_suspend(dev);

	return ret;
}

static const struct dev_pm_ops mxs_spi_pm = {
	SET_RUNTIME_PM_OPS(mxs_spi_runtime_suspend,
			   mxs_spi_runtime_resume, NULL)
	SET_SYSTEM_SLEEP_PM_OPS(mxs_spi_suspend, mxs_spi_resume)
};

520 521 522 523 524 525 526
static const struct of_device_id mxs_spi_dt_ids[] = {
	{ .compatible = "fsl,imx23-spi", .data = (void *) IMX23_SSP, },
	{ .compatible = "fsl,imx28-spi", .data = (void *) IMX28_SSP, },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mxs_spi_dt_ids);

527
static int mxs_spi_probe(struct platform_device *pdev)
528 529 530 531 532 533 534 535 536
{
	const struct of_device_id *of_id =
			of_match_device(mxs_spi_dt_ids, &pdev->dev);
	struct device_node *np = pdev->dev.of_node;
	struct spi_master *master;
	struct mxs_spi *spi;
	struct mxs_ssp *ssp;
	struct clk *clk;
	void __iomem *base;
537 538
	int devid, clk_freq;
	int ret = 0, irq_err;
539

540 541 542 543 544 545 546
	/*
	 * Default clock speed for the SPI core. 160MHz seems to
	 * work reasonably well with most SPI flashes, so use this
	 * as a default. Override with "clock-frequency" DT prop.
	 */
	const int clk_freq_default = 160000000;

547
	irq_err = platform_get_irq(pdev, 0);
548
	if (irq_err < 0)
549
		return irq_err;
550

551
	base = devm_platform_ioremap_resource(pdev, 0);
552 553
	if (IS_ERR(base))
		return PTR_ERR(base);
554 555 556 557 558

	clk = devm_clk_get(&pdev->dev, NULL);
	if (IS_ERR(clk))
		return PTR_ERR(clk);

559 560 561 562
	devid = (enum mxs_ssp_id) of_id->data;
	ret = of_property_read_u32(np, "clock-frequency",
				   &clk_freq);
	if (ret)
563
		clk_freq = clk_freq_default;
564 565 566 567 568

	master = spi_alloc_master(&pdev->dev, sizeof(*spi));
	if (!master)
		return -ENOMEM;

569 570
	platform_set_drvdata(pdev, master);

571
	master->transfer_one_message = mxs_spi_transfer_one;
572
	master->bits_per_word_mask = SPI_BPW_MASK(8);
573 574 575 576
	master->mode_bits = SPI_CPOL | SPI_CPHA;
	master->num_chipselect = 3;
	master->dev.of_node = np;
	master->flags = SPI_MASTER_HALF_DUPLEX;
577
	master->auto_runtime_pm = true;
578 579 580 581 582 583 584

	spi = spi_master_get_devdata(master);
	ssp = &spi->ssp;
	ssp->dev = &pdev->dev;
	ssp->clk = clk;
	ssp->base = base;
	ssp->devid = devid;
585

586 587
	init_completion(&spi->c);

588
	ret = devm_request_irq(&pdev->dev, irq_err, mxs_ssp_irq_handler, 0,
589
			       dev_name(&pdev->dev), ssp);
590 591 592
	if (ret)
		goto out_master_free;

593
	ssp->dmach = dma_request_slave_channel(&pdev->dev, "rx-tx");
594 595
	if (!ssp->dmach) {
		dev_err(ssp->dev, "Failed to request DMA\n");
596
		ret = -ENODEV;
597 598
		goto out_master_free;
	}
599

600 601 602 603 604 605 606 607 608 609 610 611 612 613
	pm_runtime_enable(ssp->dev);
	if (!pm_runtime_enabled(ssp->dev)) {
		ret = mxs_spi_runtime_resume(ssp->dev);
		if (ret < 0) {
			dev_err(ssp->dev, "runtime resume failed\n");
			goto out_dma_release;
		}
	}

	ret = pm_runtime_get_sync(ssp->dev);
	if (ret < 0) {
		dev_err(ssp->dev, "runtime_get_sync failed\n");
		goto out_pm_runtime_disable;
	}
614

615
	clk_set_rate(ssp->clk, clk_freq);
616

617 618
	ret = stmp_reset_block(ssp->base);
	if (ret)
619
		goto out_pm_runtime_put;
620

621
	ret = devm_spi_register_master(&pdev->dev, master);
622 623
	if (ret) {
		dev_err(&pdev->dev, "Cannot register SPI master, %d\n", ret);
624
		goto out_pm_runtime_put;
625 626
	}

627 628
	pm_runtime_put(ssp->dev);

629 630
	return 0;

631 632 633 634
out_pm_runtime_put:
	pm_runtime_put(ssp->dev);
out_pm_runtime_disable:
	pm_runtime_disable(ssp->dev);
635
out_dma_release:
636
	dma_release_channel(ssp->dmach);
637
out_master_free:
638 639 640 641
	spi_master_put(master);
	return ret;
}

642
static int mxs_spi_remove(struct platform_device *pdev)
643 644 645 646 647
{
	struct spi_master *master;
	struct mxs_spi *spi;
	struct mxs_ssp *ssp;

648
	master = platform_get_drvdata(pdev);
649 650 651
	spi = spi_master_get_devdata(master);
	ssp = &spi->ssp;

652 653 654 655
	pm_runtime_disable(&pdev->dev);
	if (!pm_runtime_status_suspended(&pdev->dev))
		mxs_spi_runtime_suspend(&pdev->dev);

656
	dma_release_channel(ssp->dmach);
657 658 659 660 661 662

	return 0;
}

static struct platform_driver mxs_spi_driver = {
	.probe	= mxs_spi_probe,
663
	.remove	= mxs_spi_remove,
664 665 666
	.driver	= {
		.name	= DRIVER_NAME,
		.of_match_table = mxs_spi_dt_ids,
667
		.pm = &mxs_spi_pm,
668 669 670 671 672 673 674 675 676
	},
};

module_platform_driver(mxs_spi_driver);

MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
MODULE_DESCRIPTION("MXS SPI master driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:mxs-spi");