0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/bitops.h>
0012 #include <linux/clk.h>
0013 #include <linux/completion.h>
0014 #include <linux/dma-mapping.h>
0015 #include <linux/iopoll.h>
0016 #include <linux/mm.h>
0017 #include <linux/module.h>
0018 #include <linux/of.h>
0019 #include <linux/platform_device.h>
0020 #include <linux/slab.h>
0021 #include <linux/interrupt.h>
0022 #include <linux/spi/spi-mem.h>
0023
0024
0025 #define SFC_CTRL 0x0
0026 #define SFC_CTRL_PHASE_SEL_NEGETIVE BIT(1)
0027 #define SFC_CTRL_CMD_BITS_SHIFT 8
0028 #define SFC_CTRL_ADDR_BITS_SHIFT 10
0029 #define SFC_CTRL_DATA_BITS_SHIFT 12
0030
0031
0032 #define SFC_IMR 0x4
0033 #define SFC_IMR_RX_FULL BIT(0)
0034 #define SFC_IMR_RX_UFLOW BIT(1)
0035 #define SFC_IMR_TX_OFLOW BIT(2)
0036 #define SFC_IMR_TX_EMPTY BIT(3)
0037 #define SFC_IMR_TRAN_FINISH BIT(4)
0038 #define SFC_IMR_BUS_ERR BIT(5)
0039 #define SFC_IMR_NSPI_ERR BIT(6)
0040 #define SFC_IMR_DMA BIT(7)
0041
0042
0043 #define SFC_ICLR 0x8
0044 #define SFC_ICLR_RX_FULL BIT(0)
0045 #define SFC_ICLR_RX_UFLOW BIT(1)
0046 #define SFC_ICLR_TX_OFLOW BIT(2)
0047 #define SFC_ICLR_TX_EMPTY BIT(3)
0048 #define SFC_ICLR_TRAN_FINISH BIT(4)
0049 #define SFC_ICLR_BUS_ERR BIT(5)
0050 #define SFC_ICLR_NSPI_ERR BIT(6)
0051 #define SFC_ICLR_DMA BIT(7)
0052
0053
0054 #define SFC_FTLR 0xc
0055 #define SFC_FTLR_TX_SHIFT 0
0056 #define SFC_FTLR_TX_MASK 0x1f
0057 #define SFC_FTLR_RX_SHIFT 8
0058 #define SFC_FTLR_RX_MASK 0x1f
0059
0060
0061 #define SFC_RCVR 0x10
0062 #define SFC_RCVR_RESET BIT(0)
0063
0064
0065 #define SFC_AX 0x14
0066
0067
0068 #define SFC_ABIT 0x18
0069
0070
0071 #define SFC_ISR 0x1c
0072 #define SFC_ISR_RX_FULL_SHIFT BIT(0)
0073 #define SFC_ISR_RX_UFLOW_SHIFT BIT(1)
0074 #define SFC_ISR_TX_OFLOW_SHIFT BIT(2)
0075 #define SFC_ISR_TX_EMPTY_SHIFT BIT(3)
0076 #define SFC_ISR_TX_FINISH_SHIFT BIT(4)
0077 #define SFC_ISR_BUS_ERR_SHIFT BIT(5)
0078 #define SFC_ISR_NSPI_ERR_SHIFT BIT(6)
0079 #define SFC_ISR_DMA_SHIFT BIT(7)
0080
0081
0082 #define SFC_FSR 0x20
0083 #define SFC_FSR_TX_IS_FULL BIT(0)
0084 #define SFC_FSR_TX_IS_EMPTY BIT(1)
0085 #define SFC_FSR_RX_IS_EMPTY BIT(2)
0086 #define SFC_FSR_RX_IS_FULL BIT(3)
0087 #define SFC_FSR_TXLV_MASK GENMASK(12, 8)
0088 #define SFC_FSR_TXLV_SHIFT 8
0089 #define SFC_FSR_RXLV_MASK GENMASK(20, 16)
0090 #define SFC_FSR_RXLV_SHIFT 16
0091
0092
0093 #define SFC_SR 0x24
0094 #define SFC_SR_IS_IDLE 0x0
0095 #define SFC_SR_IS_BUSY 0x1
0096
0097
0098 #define SFC_RISR 0x28
0099 #define SFC_RISR_RX_FULL BIT(0)
0100 #define SFC_RISR_RX_UNDERFLOW BIT(1)
0101 #define SFC_RISR_TX_OVERFLOW BIT(2)
0102 #define SFC_RISR_TX_EMPTY BIT(3)
0103 #define SFC_RISR_TRAN_FINISH BIT(4)
0104 #define SFC_RISR_BUS_ERR BIT(5)
0105 #define SFC_RISR_NSPI_ERR BIT(6)
0106 #define SFC_RISR_DMA BIT(7)
0107
0108
0109 #define SFC_VER 0x2C
0110 #define SFC_VER_3 0x3
0111 #define SFC_VER_4 0x4
0112 #define SFC_VER_5 0x5
0113
0114
0115 #define SFC_DLL_CTRL0 0x3C
0116 #define SFC_DLL_CTRL0_SCLK_SMP_DLL BIT(15)
0117 #define SFC_DLL_CTRL0_DLL_MAX_VER4 0xFFU
0118 #define SFC_DLL_CTRL0_DLL_MAX_VER5 0x1FFU
0119
0120
0121 #define SFC_DMA_TRIGGER 0x80
0122 #define SFC_DMA_TRIGGER_START 1
0123
0124
0125 #define SFC_DMA_ADDR 0x84
0126
0127
0128 #define SFC_LEN_CTRL 0x88
0129 #define SFC_LEN_CTRL_TRB_SEL 1
0130 #define SFC_LEN_EXT 0x8C
0131
0132
0133 #define SFC_CMD 0x100
0134 #define SFC_CMD_IDX_SHIFT 0
0135 #define SFC_CMD_DUMMY_SHIFT 8
0136 #define SFC_CMD_DIR_SHIFT 12
0137 #define SFC_CMD_DIR_RD 0
0138 #define SFC_CMD_DIR_WR 1
0139 #define SFC_CMD_ADDR_SHIFT 14
0140 #define SFC_CMD_ADDR_0BITS 0
0141 #define SFC_CMD_ADDR_24BITS 1
0142 #define SFC_CMD_ADDR_32BITS 2
0143 #define SFC_CMD_ADDR_XBITS 3
0144 #define SFC_CMD_TRAN_BYTES_SHIFT 16
0145 #define SFC_CMD_CS_SHIFT 30
0146
0147
0148 #define SFC_ADDR 0x104
0149
0150
0151 #define SFC_DATA 0x108
0152
0153
0154
0155
0156
0157 #define SFC_MAX_CHIPSELECT_NUM 4
0158
0159
0160
0161
0162 #define SFC_MAX_IOSIZE_VER3 (512 * 31)
0163
0164
0165 #define SFC_DMA_TRANS_THRETHOLD (0x40)
0166
0167
0168
0169
0170 #define SFC_MAX_SPEED (150 * 1000 * 1000)
0171
0172 struct rockchip_sfc {
0173 struct device *dev;
0174 void __iomem *regbase;
0175 struct clk *hclk;
0176 struct clk *clk;
0177 u32 frequency;
0178
0179 void *buffer;
0180 dma_addr_t dma_buffer;
0181 struct completion cp;
0182 bool use_dma;
0183 u32 max_iosize;
0184 u16 version;
0185 };
0186
0187 static int rockchip_sfc_reset(struct rockchip_sfc *sfc)
0188 {
0189 int err;
0190 u32 status;
0191
0192 writel_relaxed(SFC_RCVR_RESET, sfc->regbase + SFC_RCVR);
0193
0194 err = readl_poll_timeout(sfc->regbase + SFC_RCVR, status,
0195 !(status & SFC_RCVR_RESET), 20,
0196 jiffies_to_usecs(HZ));
0197 if (err)
0198 dev_err(sfc->dev, "SFC reset never finished\n");
0199
0200
0201 writel_relaxed(0xFFFFFFFF, sfc->regbase + SFC_ICLR);
0202
0203 dev_dbg(sfc->dev, "reset\n");
0204
0205 return err;
0206 }
0207
0208 static u16 rockchip_sfc_get_version(struct rockchip_sfc *sfc)
0209 {
0210 return (u16)(readl(sfc->regbase + SFC_VER) & 0xffff);
0211 }
0212
0213 static u32 rockchip_sfc_get_max_iosize(struct rockchip_sfc *sfc)
0214 {
0215 return SFC_MAX_IOSIZE_VER3;
0216 }
0217
0218 static void rockchip_sfc_irq_unmask(struct rockchip_sfc *sfc, u32 mask)
0219 {
0220 u32 reg;
0221
0222
0223 reg = readl(sfc->regbase + SFC_IMR);
0224 reg &= ~mask;
0225 writel(reg, sfc->regbase + SFC_IMR);
0226 }
0227
0228 static void rockchip_sfc_irq_mask(struct rockchip_sfc *sfc, u32 mask)
0229 {
0230 u32 reg;
0231
0232
0233 reg = readl(sfc->regbase + SFC_IMR);
0234 reg |= mask;
0235 writel(reg, sfc->regbase + SFC_IMR);
0236 }
0237
0238 static int rockchip_sfc_init(struct rockchip_sfc *sfc)
0239 {
0240 writel(0, sfc->regbase + SFC_CTRL);
0241 writel(0xFFFFFFFF, sfc->regbase + SFC_ICLR);
0242 rockchip_sfc_irq_mask(sfc, 0xFFFFFFFF);
0243 if (rockchip_sfc_get_version(sfc) >= SFC_VER_4)
0244 writel(SFC_LEN_CTRL_TRB_SEL, sfc->regbase + SFC_LEN_CTRL);
0245
0246 return 0;
0247 }
0248
0249 static int rockchip_sfc_wait_txfifo_ready(struct rockchip_sfc *sfc, u32 timeout_us)
0250 {
0251 int ret = 0;
0252 u32 status;
0253
0254 ret = readl_poll_timeout(sfc->regbase + SFC_FSR, status,
0255 status & SFC_FSR_TXLV_MASK, 0,
0256 timeout_us);
0257 if (ret) {
0258 dev_dbg(sfc->dev, "sfc wait tx fifo timeout\n");
0259
0260 return -ETIMEDOUT;
0261 }
0262
0263 return (status & SFC_FSR_TXLV_MASK) >> SFC_FSR_TXLV_SHIFT;
0264 }
0265
0266 static int rockchip_sfc_wait_rxfifo_ready(struct rockchip_sfc *sfc, u32 timeout_us)
0267 {
0268 int ret = 0;
0269 u32 status;
0270
0271 ret = readl_poll_timeout(sfc->regbase + SFC_FSR, status,
0272 status & SFC_FSR_RXLV_MASK, 0,
0273 timeout_us);
0274 if (ret) {
0275 dev_dbg(sfc->dev, "sfc wait rx fifo timeout\n");
0276
0277 return -ETIMEDOUT;
0278 }
0279
0280 return (status & SFC_FSR_RXLV_MASK) >> SFC_FSR_RXLV_SHIFT;
0281 }
0282
0283 static void rockchip_sfc_adjust_op_work(struct spi_mem_op *op)
0284 {
0285 if (unlikely(op->dummy.nbytes && !op->addr.nbytes)) {
0286
0287
0288
0289
0290 op->addr.nbytes = op->dummy.nbytes;
0291 op->addr.buswidth = op->dummy.buswidth;
0292 op->addr.val = 0xFFFFFFFFF;
0293
0294 op->dummy.nbytes = 0;
0295 }
0296 }
0297
0298 static int rockchip_sfc_xfer_setup(struct rockchip_sfc *sfc,
0299 struct spi_mem *mem,
0300 const struct spi_mem_op *op,
0301 u32 len)
0302 {
0303 u32 ctrl = 0, cmd = 0;
0304
0305
0306 cmd = op->cmd.opcode;
0307 ctrl |= ((op->cmd.buswidth >> 1) << SFC_CTRL_CMD_BITS_SHIFT);
0308
0309
0310 if (op->addr.nbytes) {
0311 if (op->addr.nbytes == 4) {
0312 cmd |= SFC_CMD_ADDR_32BITS << SFC_CMD_ADDR_SHIFT;
0313 } else if (op->addr.nbytes == 3) {
0314 cmd |= SFC_CMD_ADDR_24BITS << SFC_CMD_ADDR_SHIFT;
0315 } else {
0316 cmd |= SFC_CMD_ADDR_XBITS << SFC_CMD_ADDR_SHIFT;
0317 writel(op->addr.nbytes * 8 - 1, sfc->regbase + SFC_ABIT);
0318 }
0319
0320 ctrl |= ((op->addr.buswidth >> 1) << SFC_CTRL_ADDR_BITS_SHIFT);
0321 }
0322
0323
0324 if (op->dummy.nbytes) {
0325 if (op->dummy.buswidth == 4)
0326 cmd |= op->dummy.nbytes * 2 << SFC_CMD_DUMMY_SHIFT;
0327 else if (op->dummy.buswidth == 2)
0328 cmd |= op->dummy.nbytes * 4 << SFC_CMD_DUMMY_SHIFT;
0329 else
0330 cmd |= op->dummy.nbytes * 8 << SFC_CMD_DUMMY_SHIFT;
0331 }
0332
0333
0334 if (sfc->version >= SFC_VER_4)
0335 writel(len, sfc->regbase + SFC_LEN_EXT);
0336 else
0337 cmd |= len << SFC_CMD_TRAN_BYTES_SHIFT;
0338 if (len) {
0339 if (op->data.dir == SPI_MEM_DATA_OUT)
0340 cmd |= SFC_CMD_DIR_WR << SFC_CMD_DIR_SHIFT;
0341
0342 ctrl |= ((op->data.buswidth >> 1) << SFC_CTRL_DATA_BITS_SHIFT);
0343 }
0344 if (!len && op->addr.nbytes)
0345 cmd |= SFC_CMD_DIR_WR << SFC_CMD_DIR_SHIFT;
0346
0347
0348 ctrl |= SFC_CTRL_PHASE_SEL_NEGETIVE;
0349 cmd |= mem->spi->chip_select << SFC_CMD_CS_SHIFT;
0350
0351 dev_dbg(sfc->dev, "sfc addr.nbytes=%x(x%d) dummy.nbytes=%x(x%d)\n",
0352 op->addr.nbytes, op->addr.buswidth,
0353 op->dummy.nbytes, op->dummy.buswidth);
0354 dev_dbg(sfc->dev, "sfc ctrl=%x cmd=%x addr=%llx len=%x\n",
0355 ctrl, cmd, op->addr.val, len);
0356
0357 writel(ctrl, sfc->regbase + SFC_CTRL);
0358 writel(cmd, sfc->regbase + SFC_CMD);
0359 if (op->addr.nbytes)
0360 writel(op->addr.val, sfc->regbase + SFC_ADDR);
0361
0362 return 0;
0363 }
0364
0365 static int rockchip_sfc_write_fifo(struct rockchip_sfc *sfc, const u8 *buf, int len)
0366 {
0367 u8 bytes = len & 0x3;
0368 u32 dwords;
0369 int tx_level;
0370 u32 write_words;
0371 u32 tmp = 0;
0372
0373 dwords = len >> 2;
0374 while (dwords) {
0375 tx_level = rockchip_sfc_wait_txfifo_ready(sfc, 1000);
0376 if (tx_level < 0)
0377 return tx_level;
0378 write_words = min_t(u32, tx_level, dwords);
0379 iowrite32_rep(sfc->regbase + SFC_DATA, buf, write_words);
0380 buf += write_words << 2;
0381 dwords -= write_words;
0382 }
0383
0384
0385 if (bytes) {
0386 tx_level = rockchip_sfc_wait_txfifo_ready(sfc, 1000);
0387 if (tx_level < 0)
0388 return tx_level;
0389 memcpy(&tmp, buf, bytes);
0390 writel(tmp, sfc->regbase + SFC_DATA);
0391 }
0392
0393 return len;
0394 }
0395
0396 static int rockchip_sfc_read_fifo(struct rockchip_sfc *sfc, u8 *buf, int len)
0397 {
0398 u8 bytes = len & 0x3;
0399 u32 dwords;
0400 u8 read_words;
0401 int rx_level;
0402 int tmp;
0403
0404
0405 dwords = len >> 2;
0406 while (dwords) {
0407 rx_level = rockchip_sfc_wait_rxfifo_ready(sfc, 1000);
0408 if (rx_level < 0)
0409 return rx_level;
0410 read_words = min_t(u32, rx_level, dwords);
0411 ioread32_rep(sfc->regbase + SFC_DATA, buf, read_words);
0412 buf += read_words << 2;
0413 dwords -= read_words;
0414 }
0415
0416
0417 if (bytes) {
0418 rx_level = rockchip_sfc_wait_rxfifo_ready(sfc, 1000);
0419 if (rx_level < 0)
0420 return rx_level;
0421 tmp = readl(sfc->regbase + SFC_DATA);
0422 memcpy(buf, &tmp, bytes);
0423 }
0424
0425 return len;
0426 }
0427
0428 static int rockchip_sfc_fifo_transfer_dma(struct rockchip_sfc *sfc, dma_addr_t dma_buf, size_t len)
0429 {
0430 writel(0xFFFFFFFF, sfc->regbase + SFC_ICLR);
0431 writel((u32)dma_buf, sfc->regbase + SFC_DMA_ADDR);
0432 writel(SFC_DMA_TRIGGER_START, sfc->regbase + SFC_DMA_TRIGGER);
0433
0434 return len;
0435 }
0436
0437 static int rockchip_sfc_xfer_data_poll(struct rockchip_sfc *sfc,
0438 const struct spi_mem_op *op, u32 len)
0439 {
0440 dev_dbg(sfc->dev, "sfc xfer_poll len=%x\n", len);
0441
0442 if (op->data.dir == SPI_MEM_DATA_OUT)
0443 return rockchip_sfc_write_fifo(sfc, op->data.buf.out, len);
0444 else
0445 return rockchip_sfc_read_fifo(sfc, op->data.buf.in, len);
0446 }
0447
0448 static int rockchip_sfc_xfer_data_dma(struct rockchip_sfc *sfc,
0449 const struct spi_mem_op *op, u32 len)
0450 {
0451 int ret;
0452
0453 dev_dbg(sfc->dev, "sfc xfer_dma len=%x\n", len);
0454
0455 if (op->data.dir == SPI_MEM_DATA_OUT)
0456 memcpy(sfc->buffer, op->data.buf.out, len);
0457
0458 ret = rockchip_sfc_fifo_transfer_dma(sfc, sfc->dma_buffer, len);
0459 if (!wait_for_completion_timeout(&sfc->cp, msecs_to_jiffies(2000))) {
0460 dev_err(sfc->dev, "DMA wait for transfer finish timeout\n");
0461 ret = -ETIMEDOUT;
0462 }
0463 rockchip_sfc_irq_mask(sfc, SFC_IMR_DMA);
0464 if (op->data.dir == SPI_MEM_DATA_IN)
0465 memcpy(op->data.buf.in, sfc->buffer, len);
0466
0467 return ret;
0468 }
0469
0470 static int rockchip_sfc_xfer_done(struct rockchip_sfc *sfc, u32 timeout_us)
0471 {
0472 int ret = 0;
0473 u32 status;
0474
0475 ret = readl_poll_timeout(sfc->regbase + SFC_SR, status,
0476 !(status & SFC_SR_IS_BUSY),
0477 20, timeout_us);
0478 if (ret) {
0479 dev_err(sfc->dev, "wait sfc idle timeout\n");
0480 rockchip_sfc_reset(sfc);
0481
0482 ret = -EIO;
0483 }
0484
0485 return ret;
0486 }
0487
0488 static int rockchip_sfc_exec_mem_op(struct spi_mem *mem, const struct spi_mem_op *op)
0489 {
0490 struct rockchip_sfc *sfc = spi_master_get_devdata(mem->spi->master);
0491 u32 len = op->data.nbytes;
0492 int ret;
0493
0494 if (unlikely(mem->spi->max_speed_hz != sfc->frequency)) {
0495 ret = clk_set_rate(sfc->clk, mem->spi->max_speed_hz);
0496 if (ret)
0497 return ret;
0498 sfc->frequency = mem->spi->max_speed_hz;
0499 dev_dbg(sfc->dev, "set_freq=%dHz real_freq=%ldHz\n",
0500 sfc->frequency, clk_get_rate(sfc->clk));
0501 }
0502
0503 rockchip_sfc_adjust_op_work((struct spi_mem_op *)op);
0504 rockchip_sfc_xfer_setup(sfc, mem, op, len);
0505 if (len) {
0506 if (likely(sfc->use_dma) && len >= SFC_DMA_TRANS_THRETHOLD) {
0507 init_completion(&sfc->cp);
0508 rockchip_sfc_irq_unmask(sfc, SFC_IMR_DMA);
0509 ret = rockchip_sfc_xfer_data_dma(sfc, op, len);
0510 } else {
0511 ret = rockchip_sfc_xfer_data_poll(sfc, op, len);
0512 }
0513
0514 if (ret != len) {
0515 dev_err(sfc->dev, "xfer data failed ret %d dir %d\n", ret, op->data.dir);
0516
0517 return -EIO;
0518 }
0519 }
0520
0521 return rockchip_sfc_xfer_done(sfc, 100000);
0522 }
0523
0524 static int rockchip_sfc_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
0525 {
0526 struct rockchip_sfc *sfc = spi_master_get_devdata(mem->spi->master);
0527
0528 op->data.nbytes = min(op->data.nbytes, sfc->max_iosize);
0529
0530 return 0;
0531 }
0532
0533 static const struct spi_controller_mem_ops rockchip_sfc_mem_ops = {
0534 .exec_op = rockchip_sfc_exec_mem_op,
0535 .adjust_op_size = rockchip_sfc_adjust_op_size,
0536 };
0537
0538 static irqreturn_t rockchip_sfc_irq_handler(int irq, void *dev_id)
0539 {
0540 struct rockchip_sfc *sfc = dev_id;
0541 u32 reg;
0542
0543 reg = readl(sfc->regbase + SFC_RISR);
0544
0545
0546 writel_relaxed(reg, sfc->regbase + SFC_ICLR);
0547
0548 if (reg & SFC_RISR_DMA) {
0549 complete(&sfc->cp);
0550
0551 return IRQ_HANDLED;
0552 }
0553
0554 return IRQ_NONE;
0555 }
0556
0557 static int rockchip_sfc_probe(struct platform_device *pdev)
0558 {
0559 struct device *dev = &pdev->dev;
0560 struct spi_master *master;
0561 struct resource *res;
0562 struct rockchip_sfc *sfc;
0563 int ret;
0564
0565 master = devm_spi_alloc_master(&pdev->dev, sizeof(*sfc));
0566 if (!master)
0567 return -ENOMEM;
0568
0569 master->flags = SPI_MASTER_HALF_DUPLEX;
0570 master->mem_ops = &rockchip_sfc_mem_ops;
0571 master->dev.of_node = pdev->dev.of_node;
0572 master->mode_bits = SPI_TX_QUAD | SPI_TX_DUAL | SPI_RX_QUAD | SPI_RX_DUAL;
0573 master->max_speed_hz = SFC_MAX_SPEED;
0574 master->num_chipselect = SFC_MAX_CHIPSELECT_NUM;
0575
0576 sfc = spi_master_get_devdata(master);
0577 sfc->dev = dev;
0578
0579 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0580 sfc->regbase = devm_ioremap_resource(dev, res);
0581 if (IS_ERR(sfc->regbase))
0582 return PTR_ERR(sfc->regbase);
0583
0584 sfc->clk = devm_clk_get(&pdev->dev, "clk_sfc");
0585 if (IS_ERR(sfc->clk)) {
0586 dev_err(&pdev->dev, "Failed to get sfc interface clk\n");
0587 return PTR_ERR(sfc->clk);
0588 }
0589
0590 sfc->hclk = devm_clk_get(&pdev->dev, "hclk_sfc");
0591 if (IS_ERR(sfc->hclk)) {
0592 dev_err(&pdev->dev, "Failed to get sfc ahb clk\n");
0593 return PTR_ERR(sfc->hclk);
0594 }
0595
0596 sfc->use_dma = !of_property_read_bool(sfc->dev->of_node,
0597 "rockchip,sfc-no-dma");
0598
0599 if (sfc->use_dma) {
0600 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
0601 if (ret) {
0602 dev_warn(dev, "Unable to set dma mask\n");
0603 return ret;
0604 }
0605
0606 sfc->buffer = dmam_alloc_coherent(dev, SFC_MAX_IOSIZE_VER3,
0607 &sfc->dma_buffer,
0608 GFP_KERNEL);
0609 if (!sfc->buffer)
0610 return -ENOMEM;
0611 }
0612
0613 ret = clk_prepare_enable(sfc->hclk);
0614 if (ret) {
0615 dev_err(&pdev->dev, "Failed to enable ahb clk\n");
0616 goto err_hclk;
0617 }
0618
0619 ret = clk_prepare_enable(sfc->clk);
0620 if (ret) {
0621 dev_err(&pdev->dev, "Failed to enable interface clk\n");
0622 goto err_clk;
0623 }
0624
0625
0626 ret = platform_get_irq(pdev, 0);
0627 if (ret < 0)
0628 goto err_irq;
0629
0630 ret = devm_request_irq(dev, ret, rockchip_sfc_irq_handler,
0631 0, pdev->name, sfc);
0632 if (ret) {
0633 dev_err(dev, "Failed to request irq\n");
0634
0635 return ret;
0636 }
0637
0638 ret = rockchip_sfc_init(sfc);
0639 if (ret)
0640 goto err_irq;
0641
0642 sfc->max_iosize = rockchip_sfc_get_max_iosize(sfc);
0643 sfc->version = rockchip_sfc_get_version(sfc);
0644
0645 ret = spi_register_master(master);
0646 if (ret)
0647 goto err_irq;
0648
0649 return 0;
0650
0651 err_irq:
0652 clk_disable_unprepare(sfc->clk);
0653 err_clk:
0654 clk_disable_unprepare(sfc->hclk);
0655 err_hclk:
0656 return ret;
0657 }
0658
0659 static int rockchip_sfc_remove(struct platform_device *pdev)
0660 {
0661 struct spi_master *master = platform_get_drvdata(pdev);
0662 struct rockchip_sfc *sfc = platform_get_drvdata(pdev);
0663
0664 spi_unregister_master(master);
0665
0666 clk_disable_unprepare(sfc->clk);
0667 clk_disable_unprepare(sfc->hclk);
0668
0669 return 0;
0670 }
0671
0672 static const struct of_device_id rockchip_sfc_dt_ids[] = {
0673 { .compatible = "rockchip,sfc"},
0674 { }
0675 };
0676 MODULE_DEVICE_TABLE(of, rockchip_sfc_dt_ids);
0677
0678 static struct platform_driver rockchip_sfc_driver = {
0679 .driver = {
0680 .name = "rockchip-sfc",
0681 .of_match_table = rockchip_sfc_dt_ids,
0682 },
0683 .probe = rockchip_sfc_probe,
0684 .remove = rockchip_sfc_remove,
0685 };
0686 module_platform_driver(rockchip_sfc_driver);
0687
0688 MODULE_LICENSE("GPL v2");
0689 MODULE_DESCRIPTION("Rockchip Serial Flash Controller Driver");
0690 MODULE_AUTHOR("Shawn Lin <shawn.lin@rock-chips.com>");
0691 MODULE_AUTHOR("Chris Morgan <macromorgan@hotmail.com>");
0692 MODULE_AUTHOR("Jon Lin <Jon.lin@rock-chips.com>");