1*3558fe90SMaxime Ripard /* 2*3558fe90SMaxime Ripard * Copyright (C) 2012 - 2014 Allwinner Tech 3*3558fe90SMaxime Ripard * Pan Nan <pannan@allwinnertech.com> 4*3558fe90SMaxime Ripard * 5*3558fe90SMaxime Ripard * Copyright (C) 2014 Maxime Ripard 6*3558fe90SMaxime Ripard * Maxime Ripard <maxime.ripard@free-electrons.com> 7*3558fe90SMaxime Ripard * 8*3558fe90SMaxime Ripard * This program is free software; you can redistribute it and/or 9*3558fe90SMaxime Ripard * modify it under the terms of the GNU General Public License as 10*3558fe90SMaxime Ripard * published by the Free Software Foundation; either version 2 of 11*3558fe90SMaxime Ripard * the License, or (at your option) any later version. 12*3558fe90SMaxime Ripard */ 13*3558fe90SMaxime Ripard 14*3558fe90SMaxime Ripard #include <linux/clk.h> 15*3558fe90SMaxime Ripard #include <linux/delay.h> 16*3558fe90SMaxime Ripard #include <linux/device.h> 17*3558fe90SMaxime Ripard #include <linux/interrupt.h> 18*3558fe90SMaxime Ripard #include <linux/io.h> 19*3558fe90SMaxime Ripard #include <linux/module.h> 20*3558fe90SMaxime Ripard #include <linux/platform_device.h> 21*3558fe90SMaxime Ripard #include <linux/pm_runtime.h> 22*3558fe90SMaxime Ripard #include <linux/reset.h> 23*3558fe90SMaxime Ripard #include <linux/workqueue.h> 24*3558fe90SMaxime Ripard 25*3558fe90SMaxime Ripard #include <linux/spi/spi.h> 26*3558fe90SMaxime Ripard 27*3558fe90SMaxime Ripard #define SUN6I_FIFO_DEPTH 128 28*3558fe90SMaxime Ripard 29*3558fe90SMaxime Ripard #define SUN6I_GBL_CTL_REG 0x04 30*3558fe90SMaxime Ripard #define SUN6I_GBL_CTL_BUS_ENABLE BIT(0) 31*3558fe90SMaxime Ripard #define SUN6I_GBL_CTL_MASTER BIT(1) 32*3558fe90SMaxime Ripard #define SUN6I_GBL_CTL_TP BIT(7) 33*3558fe90SMaxime Ripard #define SUN6I_GBL_CTL_RST BIT(31) 34*3558fe90SMaxime Ripard 35*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_REG 0x08 36*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_CPHA BIT(0) 37*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_CPOL BIT(1) 38*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_SPOL BIT(2) 39*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_CS_MASK 0x3 40*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_CS(cs) (((cs) & SUN6I_TFR_CTL_CS_MASK) << 4) 41*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_CS_MANUAL BIT(6) 42*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_CS_LEVEL BIT(7) 43*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_DHB BIT(8) 44*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_FBS BIT(12) 45*3558fe90SMaxime Ripard #define SUN6I_TFR_CTL_XCH BIT(31) 46*3558fe90SMaxime Ripard 47*3558fe90SMaxime Ripard #define SUN6I_INT_CTL_REG 0x10 48*3558fe90SMaxime Ripard #define SUN6I_INT_CTL_RF_OVF BIT(8) 49*3558fe90SMaxime Ripard #define SUN6I_INT_CTL_TC BIT(12) 50*3558fe90SMaxime Ripard 51*3558fe90SMaxime Ripard #define SUN6I_INT_STA_REG 0x14 52*3558fe90SMaxime Ripard 53*3558fe90SMaxime Ripard #define SUN6I_FIFO_CTL_REG 0x18 54*3558fe90SMaxime Ripard #define SUN6I_FIFO_CTL_RF_RST BIT(15) 55*3558fe90SMaxime Ripard #define SUN6I_FIFO_CTL_TF_RST BIT(31) 56*3558fe90SMaxime Ripard 57*3558fe90SMaxime Ripard #define SUN6I_FIFO_STA_REG 0x1c 58*3558fe90SMaxime Ripard #define SUN6I_FIFO_STA_RF_CNT_MASK 0x7f 59*3558fe90SMaxime Ripard #define SUN6I_FIFO_STA_RF_CNT_BITS 0 60*3558fe90SMaxime Ripard #define SUN6I_FIFO_STA_TF_CNT_MASK 0x7f 61*3558fe90SMaxime Ripard #define SUN6I_FIFO_STA_TF_CNT_BITS 16 62*3558fe90SMaxime Ripard 63*3558fe90SMaxime Ripard #define SUN6I_CLK_CTL_REG 0x24 64*3558fe90SMaxime Ripard #define SUN6I_CLK_CTL_CDR2_MASK 0xff 65*3558fe90SMaxime Ripard #define SUN6I_CLK_CTL_CDR2(div) (((div) & SUN6I_CLK_CTL_CDR2_MASK) << 0) 66*3558fe90SMaxime Ripard #define SUN6I_CLK_CTL_CDR1_MASK 0xf 67*3558fe90SMaxime Ripard #define SUN6I_CLK_CTL_CDR1(div) (((div) & SUN6I_CLK_CTL_CDR1_MASK) << 8) 68*3558fe90SMaxime Ripard #define SUN6I_CLK_CTL_DRS BIT(12) 69*3558fe90SMaxime Ripard 70*3558fe90SMaxime Ripard #define SUN6I_BURST_CNT_REG 0x30 71*3558fe90SMaxime Ripard #define SUN6I_BURST_CNT(cnt) ((cnt) & 0xffffff) 72*3558fe90SMaxime Ripard 73*3558fe90SMaxime Ripard #define SUN6I_XMIT_CNT_REG 0x34 74*3558fe90SMaxime Ripard #define SUN6I_XMIT_CNT(cnt) ((cnt) & 0xffffff) 75*3558fe90SMaxime Ripard 76*3558fe90SMaxime Ripard #define SUN6I_BURST_CTL_CNT_REG 0x38 77*3558fe90SMaxime Ripard #define SUN6I_BURST_CTL_CNT_STC(cnt) ((cnt) & 0xffffff) 78*3558fe90SMaxime Ripard 79*3558fe90SMaxime Ripard #define SUN6I_TXDATA_REG 0x200 80*3558fe90SMaxime Ripard #define SUN6I_RXDATA_REG 0x300 81*3558fe90SMaxime Ripard 82*3558fe90SMaxime Ripard struct sun6i_spi { 83*3558fe90SMaxime Ripard struct spi_master *master; 84*3558fe90SMaxime Ripard void __iomem *base_addr; 85*3558fe90SMaxime Ripard struct clk *hclk; 86*3558fe90SMaxime Ripard struct clk *mclk; 87*3558fe90SMaxime Ripard struct reset_control *rstc; 88*3558fe90SMaxime Ripard 89*3558fe90SMaxime Ripard struct completion done; 90*3558fe90SMaxime Ripard 91*3558fe90SMaxime Ripard const u8 *tx_buf; 92*3558fe90SMaxime Ripard u8 *rx_buf; 93*3558fe90SMaxime Ripard int len; 94*3558fe90SMaxime Ripard }; 95*3558fe90SMaxime Ripard 96*3558fe90SMaxime Ripard static inline u32 sun6i_spi_read(struct sun6i_spi *sspi, u32 reg) 97*3558fe90SMaxime Ripard { 98*3558fe90SMaxime Ripard return readl(sspi->base_addr + reg); 99*3558fe90SMaxime Ripard } 100*3558fe90SMaxime Ripard 101*3558fe90SMaxime Ripard static inline void sun6i_spi_write(struct sun6i_spi *sspi, u32 reg, u32 value) 102*3558fe90SMaxime Ripard { 103*3558fe90SMaxime Ripard writel(value, sspi->base_addr + reg); 104*3558fe90SMaxime Ripard } 105*3558fe90SMaxime Ripard 106*3558fe90SMaxime Ripard static inline void sun6i_spi_drain_fifo(struct sun6i_spi *sspi, int len) 107*3558fe90SMaxime Ripard { 108*3558fe90SMaxime Ripard u32 reg, cnt; 109*3558fe90SMaxime Ripard u8 byte; 110*3558fe90SMaxime Ripard 111*3558fe90SMaxime Ripard /* See how much data is available */ 112*3558fe90SMaxime Ripard reg = sun6i_spi_read(sspi, SUN6I_FIFO_STA_REG); 113*3558fe90SMaxime Ripard reg &= SUN6I_FIFO_STA_RF_CNT_MASK; 114*3558fe90SMaxime Ripard cnt = reg >> SUN6I_FIFO_STA_RF_CNT_BITS; 115*3558fe90SMaxime Ripard 116*3558fe90SMaxime Ripard if (len > cnt) 117*3558fe90SMaxime Ripard len = cnt; 118*3558fe90SMaxime Ripard 119*3558fe90SMaxime Ripard while (len--) { 120*3558fe90SMaxime Ripard byte = readb(sspi->base_addr + SUN6I_RXDATA_REG); 121*3558fe90SMaxime Ripard if (sspi->rx_buf) 122*3558fe90SMaxime Ripard *sspi->rx_buf++ = byte; 123*3558fe90SMaxime Ripard } 124*3558fe90SMaxime Ripard } 125*3558fe90SMaxime Ripard 126*3558fe90SMaxime Ripard static inline void sun6i_spi_fill_fifo(struct sun6i_spi *sspi, int len) 127*3558fe90SMaxime Ripard { 128*3558fe90SMaxime Ripard u8 byte; 129*3558fe90SMaxime Ripard 130*3558fe90SMaxime Ripard if (len > sspi->len) 131*3558fe90SMaxime Ripard len = sspi->len; 132*3558fe90SMaxime Ripard 133*3558fe90SMaxime Ripard while (len--) { 134*3558fe90SMaxime Ripard byte = sspi->tx_buf ? *sspi->tx_buf++ : 0; 135*3558fe90SMaxime Ripard writeb(byte, sspi->base_addr + SUN6I_TXDATA_REG); 136*3558fe90SMaxime Ripard sspi->len--; 137*3558fe90SMaxime Ripard } 138*3558fe90SMaxime Ripard } 139*3558fe90SMaxime Ripard 140*3558fe90SMaxime Ripard static void sun6i_spi_set_cs(struct spi_device *spi, bool enable) 141*3558fe90SMaxime Ripard { 142*3558fe90SMaxime Ripard struct sun6i_spi *sspi = spi_master_get_devdata(spi->master); 143*3558fe90SMaxime Ripard u32 reg; 144*3558fe90SMaxime Ripard 145*3558fe90SMaxime Ripard reg = sun6i_spi_read(sspi, SUN6I_TFR_CTL_REG); 146*3558fe90SMaxime Ripard reg &= ~SUN6I_TFR_CTL_CS_MASK; 147*3558fe90SMaxime Ripard reg |= SUN6I_TFR_CTL_CS(spi->chip_select); 148*3558fe90SMaxime Ripard 149*3558fe90SMaxime Ripard if (enable) 150*3558fe90SMaxime Ripard reg |= SUN6I_TFR_CTL_CS_LEVEL; 151*3558fe90SMaxime Ripard else 152*3558fe90SMaxime Ripard reg &= ~SUN6I_TFR_CTL_CS_LEVEL; 153*3558fe90SMaxime Ripard 154*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg); 155*3558fe90SMaxime Ripard } 156*3558fe90SMaxime Ripard 157*3558fe90SMaxime Ripard 158*3558fe90SMaxime Ripard static int sun6i_spi_transfer_one(struct spi_master *master, 159*3558fe90SMaxime Ripard struct spi_device *spi, 160*3558fe90SMaxime Ripard struct spi_transfer *tfr) 161*3558fe90SMaxime Ripard { 162*3558fe90SMaxime Ripard struct sun6i_spi *sspi = spi_master_get_devdata(master); 163*3558fe90SMaxime Ripard unsigned int mclk_rate, div, timeout; 164*3558fe90SMaxime Ripard unsigned int tx_len = 0; 165*3558fe90SMaxime Ripard int ret = 0; 166*3558fe90SMaxime Ripard u32 reg; 167*3558fe90SMaxime Ripard 168*3558fe90SMaxime Ripard /* We don't support transfer larger than the FIFO */ 169*3558fe90SMaxime Ripard if (tfr->len > SUN6I_FIFO_DEPTH) 170*3558fe90SMaxime Ripard return -EINVAL; 171*3558fe90SMaxime Ripard 172*3558fe90SMaxime Ripard reinit_completion(&sspi->done); 173*3558fe90SMaxime Ripard sspi->tx_buf = tfr->tx_buf; 174*3558fe90SMaxime Ripard sspi->rx_buf = tfr->rx_buf; 175*3558fe90SMaxime Ripard sspi->len = tfr->len; 176*3558fe90SMaxime Ripard 177*3558fe90SMaxime Ripard /* Clear pending interrupts */ 178*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_INT_STA_REG, ~0); 179*3558fe90SMaxime Ripard 180*3558fe90SMaxime Ripard /* Reset FIFO */ 181*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_FIFO_CTL_REG, 182*3558fe90SMaxime Ripard SUN6I_FIFO_CTL_RF_RST | SUN6I_FIFO_CTL_TF_RST); 183*3558fe90SMaxime Ripard 184*3558fe90SMaxime Ripard /* 185*3558fe90SMaxime Ripard * Setup the transfer control register: Chip Select, 186*3558fe90SMaxime Ripard * polarities, etc. 187*3558fe90SMaxime Ripard */ 188*3558fe90SMaxime Ripard reg = sun6i_spi_read(sspi, SUN6I_TFR_CTL_REG); 189*3558fe90SMaxime Ripard 190*3558fe90SMaxime Ripard if (spi->mode & SPI_CPOL) 191*3558fe90SMaxime Ripard reg |= SUN6I_TFR_CTL_CPOL; 192*3558fe90SMaxime Ripard else 193*3558fe90SMaxime Ripard reg &= ~SUN6I_TFR_CTL_CPOL; 194*3558fe90SMaxime Ripard 195*3558fe90SMaxime Ripard if (spi->mode & SPI_CPHA) 196*3558fe90SMaxime Ripard reg |= SUN6I_TFR_CTL_CPHA; 197*3558fe90SMaxime Ripard else 198*3558fe90SMaxime Ripard reg &= ~SUN6I_TFR_CTL_CPHA; 199*3558fe90SMaxime Ripard 200*3558fe90SMaxime Ripard if (spi->mode & SPI_LSB_FIRST) 201*3558fe90SMaxime Ripard reg |= SUN6I_TFR_CTL_FBS; 202*3558fe90SMaxime Ripard else 203*3558fe90SMaxime Ripard reg &= ~SUN6I_TFR_CTL_FBS; 204*3558fe90SMaxime Ripard 205*3558fe90SMaxime Ripard /* 206*3558fe90SMaxime Ripard * If it's a TX only transfer, we don't want to fill the RX 207*3558fe90SMaxime Ripard * FIFO with bogus data 208*3558fe90SMaxime Ripard */ 209*3558fe90SMaxime Ripard if (sspi->rx_buf) 210*3558fe90SMaxime Ripard reg &= ~SUN6I_TFR_CTL_DHB; 211*3558fe90SMaxime Ripard else 212*3558fe90SMaxime Ripard reg |= SUN6I_TFR_CTL_DHB; 213*3558fe90SMaxime Ripard 214*3558fe90SMaxime Ripard /* We want to control the chip select manually */ 215*3558fe90SMaxime Ripard reg |= SUN6I_TFR_CTL_CS_MANUAL; 216*3558fe90SMaxime Ripard 217*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg); 218*3558fe90SMaxime Ripard 219*3558fe90SMaxime Ripard /* Ensure that we have a parent clock fast enough */ 220*3558fe90SMaxime Ripard mclk_rate = clk_get_rate(sspi->mclk); 221*3558fe90SMaxime Ripard if (mclk_rate < (2 * spi->max_speed_hz)) { 222*3558fe90SMaxime Ripard clk_set_rate(sspi->mclk, 2 * spi->max_speed_hz); 223*3558fe90SMaxime Ripard mclk_rate = clk_get_rate(sspi->mclk); 224*3558fe90SMaxime Ripard } 225*3558fe90SMaxime Ripard 226*3558fe90SMaxime Ripard /* 227*3558fe90SMaxime Ripard * Setup clock divider. 228*3558fe90SMaxime Ripard * 229*3558fe90SMaxime Ripard * We have two choices there. Either we can use the clock 230*3558fe90SMaxime Ripard * divide rate 1, which is calculated thanks to this formula: 231*3558fe90SMaxime Ripard * SPI_CLK = MOD_CLK / (2 ^ cdr) 232*3558fe90SMaxime Ripard * Or we can use CDR2, which is calculated with the formula: 233*3558fe90SMaxime Ripard * SPI_CLK = MOD_CLK / (2 * (cdr + 1)) 234*3558fe90SMaxime Ripard * Wether we use the former or the latter is set through the 235*3558fe90SMaxime Ripard * DRS bit. 236*3558fe90SMaxime Ripard * 237*3558fe90SMaxime Ripard * First try CDR2, and if we can't reach the expected 238*3558fe90SMaxime Ripard * frequency, fall back to CDR1. 239*3558fe90SMaxime Ripard */ 240*3558fe90SMaxime Ripard div = mclk_rate / (2 * spi->max_speed_hz); 241*3558fe90SMaxime Ripard if (div <= (SUN6I_CLK_CTL_CDR2_MASK + 1)) { 242*3558fe90SMaxime Ripard if (div > 0) 243*3558fe90SMaxime Ripard div--; 244*3558fe90SMaxime Ripard 245*3558fe90SMaxime Ripard reg = SUN6I_CLK_CTL_CDR2(div) | SUN6I_CLK_CTL_DRS; 246*3558fe90SMaxime Ripard } else { 247*3558fe90SMaxime Ripard div = ilog2(mclk_rate) - ilog2(spi->max_speed_hz); 248*3558fe90SMaxime Ripard reg = SUN6I_CLK_CTL_CDR1(div); 249*3558fe90SMaxime Ripard } 250*3558fe90SMaxime Ripard 251*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_CLK_CTL_REG, reg); 252*3558fe90SMaxime Ripard 253*3558fe90SMaxime Ripard /* Setup the transfer now... */ 254*3558fe90SMaxime Ripard if (sspi->tx_buf) 255*3558fe90SMaxime Ripard tx_len = tfr->len; 256*3558fe90SMaxime Ripard 257*3558fe90SMaxime Ripard /* Setup the counters */ 258*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_BURST_CNT_REG, SUN6I_BURST_CNT(tfr->len)); 259*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_XMIT_CNT_REG, SUN6I_XMIT_CNT(tx_len)); 260*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_BURST_CTL_CNT_REG, 261*3558fe90SMaxime Ripard SUN6I_BURST_CTL_CNT_STC(tx_len)); 262*3558fe90SMaxime Ripard 263*3558fe90SMaxime Ripard /* Fill the TX FIFO */ 264*3558fe90SMaxime Ripard sun6i_spi_fill_fifo(sspi, SUN6I_FIFO_DEPTH); 265*3558fe90SMaxime Ripard 266*3558fe90SMaxime Ripard /* Enable the interrupts */ 267*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_INT_CTL_REG, SUN6I_INT_CTL_TC); 268*3558fe90SMaxime Ripard 269*3558fe90SMaxime Ripard /* Start the transfer */ 270*3558fe90SMaxime Ripard reg = sun6i_spi_read(sspi, SUN6I_TFR_CTL_REG); 271*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg | SUN6I_TFR_CTL_XCH); 272*3558fe90SMaxime Ripard 273*3558fe90SMaxime Ripard timeout = wait_for_completion_timeout(&sspi->done, 274*3558fe90SMaxime Ripard msecs_to_jiffies(1000)); 275*3558fe90SMaxime Ripard if (!timeout) { 276*3558fe90SMaxime Ripard ret = -ETIMEDOUT; 277*3558fe90SMaxime Ripard goto out; 278*3558fe90SMaxime Ripard } 279*3558fe90SMaxime Ripard 280*3558fe90SMaxime Ripard sun6i_spi_drain_fifo(sspi, SUN6I_FIFO_DEPTH); 281*3558fe90SMaxime Ripard 282*3558fe90SMaxime Ripard out: 283*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_INT_CTL_REG, 0); 284*3558fe90SMaxime Ripard 285*3558fe90SMaxime Ripard return ret; 286*3558fe90SMaxime Ripard } 287*3558fe90SMaxime Ripard 288*3558fe90SMaxime Ripard static irqreturn_t sun6i_spi_handler(int irq, void *dev_id) 289*3558fe90SMaxime Ripard { 290*3558fe90SMaxime Ripard struct sun6i_spi *sspi = dev_id; 291*3558fe90SMaxime Ripard u32 status = sun6i_spi_read(sspi, SUN6I_INT_STA_REG); 292*3558fe90SMaxime Ripard 293*3558fe90SMaxime Ripard /* Transfer complete */ 294*3558fe90SMaxime Ripard if (status & SUN6I_INT_CTL_TC) { 295*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_INT_STA_REG, SUN6I_INT_CTL_TC); 296*3558fe90SMaxime Ripard complete(&sspi->done); 297*3558fe90SMaxime Ripard return IRQ_HANDLED; 298*3558fe90SMaxime Ripard } 299*3558fe90SMaxime Ripard 300*3558fe90SMaxime Ripard return IRQ_NONE; 301*3558fe90SMaxime Ripard } 302*3558fe90SMaxime Ripard 303*3558fe90SMaxime Ripard static int sun6i_spi_runtime_resume(struct device *dev) 304*3558fe90SMaxime Ripard { 305*3558fe90SMaxime Ripard struct spi_master *master = dev_get_drvdata(dev); 306*3558fe90SMaxime Ripard struct sun6i_spi *sspi = spi_master_get_devdata(master); 307*3558fe90SMaxime Ripard int ret; 308*3558fe90SMaxime Ripard 309*3558fe90SMaxime Ripard ret = clk_prepare_enable(sspi->hclk); 310*3558fe90SMaxime Ripard if (ret) { 311*3558fe90SMaxime Ripard dev_err(dev, "Couldn't enable AHB clock\n"); 312*3558fe90SMaxime Ripard goto out; 313*3558fe90SMaxime Ripard } 314*3558fe90SMaxime Ripard 315*3558fe90SMaxime Ripard ret = clk_prepare_enable(sspi->mclk); 316*3558fe90SMaxime Ripard if (ret) { 317*3558fe90SMaxime Ripard dev_err(dev, "Couldn't enable module clock\n"); 318*3558fe90SMaxime Ripard goto err; 319*3558fe90SMaxime Ripard } 320*3558fe90SMaxime Ripard 321*3558fe90SMaxime Ripard ret = reset_control_deassert(sspi->rstc); 322*3558fe90SMaxime Ripard if (ret) { 323*3558fe90SMaxime Ripard dev_err(dev, "Couldn't deassert the device from reset\n"); 324*3558fe90SMaxime Ripard goto err2; 325*3558fe90SMaxime Ripard } 326*3558fe90SMaxime Ripard 327*3558fe90SMaxime Ripard sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG, 328*3558fe90SMaxime Ripard SUN6I_GBL_CTL_BUS_ENABLE | SUN6I_GBL_CTL_MASTER | SUN6I_GBL_CTL_TP); 329*3558fe90SMaxime Ripard 330*3558fe90SMaxime Ripard return 0; 331*3558fe90SMaxime Ripard 332*3558fe90SMaxime Ripard err2: 333*3558fe90SMaxime Ripard clk_disable_unprepare(sspi->mclk); 334*3558fe90SMaxime Ripard err: 335*3558fe90SMaxime Ripard clk_disable_unprepare(sspi->hclk); 336*3558fe90SMaxime Ripard out: 337*3558fe90SMaxime Ripard return ret; 338*3558fe90SMaxime Ripard } 339*3558fe90SMaxime Ripard 340*3558fe90SMaxime Ripard static int sun6i_spi_runtime_suspend(struct device *dev) 341*3558fe90SMaxime Ripard { 342*3558fe90SMaxime Ripard struct spi_master *master = dev_get_drvdata(dev); 343*3558fe90SMaxime Ripard struct sun6i_spi *sspi = spi_master_get_devdata(master); 344*3558fe90SMaxime Ripard 345*3558fe90SMaxime Ripard reset_control_assert(sspi->rstc); 346*3558fe90SMaxime Ripard clk_disable_unprepare(sspi->mclk); 347*3558fe90SMaxime Ripard clk_disable_unprepare(sspi->hclk); 348*3558fe90SMaxime Ripard 349*3558fe90SMaxime Ripard return 0; 350*3558fe90SMaxime Ripard } 351*3558fe90SMaxime Ripard 352*3558fe90SMaxime Ripard static int sun6i_spi_probe(struct platform_device *pdev) 353*3558fe90SMaxime Ripard { 354*3558fe90SMaxime Ripard struct spi_master *master; 355*3558fe90SMaxime Ripard struct sun6i_spi *sspi; 356*3558fe90SMaxime Ripard struct resource *res; 357*3558fe90SMaxime Ripard int ret = 0, irq; 358*3558fe90SMaxime Ripard 359*3558fe90SMaxime Ripard master = spi_alloc_master(&pdev->dev, sizeof(struct sun6i_spi)); 360*3558fe90SMaxime Ripard if (!master) { 361*3558fe90SMaxime Ripard dev_err(&pdev->dev, "Unable to allocate SPI Master\n"); 362*3558fe90SMaxime Ripard return -ENOMEM; 363*3558fe90SMaxime Ripard } 364*3558fe90SMaxime Ripard 365*3558fe90SMaxime Ripard platform_set_drvdata(pdev, master); 366*3558fe90SMaxime Ripard sspi = spi_master_get_devdata(master); 367*3558fe90SMaxime Ripard 368*3558fe90SMaxime Ripard res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 369*3558fe90SMaxime Ripard sspi->base_addr = devm_ioremap_resource(&pdev->dev, res); 370*3558fe90SMaxime Ripard if (IS_ERR(sspi->base_addr)) { 371*3558fe90SMaxime Ripard ret = PTR_ERR(sspi->base_addr); 372*3558fe90SMaxime Ripard goto err_free_master; 373*3558fe90SMaxime Ripard } 374*3558fe90SMaxime Ripard 375*3558fe90SMaxime Ripard irq = platform_get_irq(pdev, 0); 376*3558fe90SMaxime Ripard if (irq < 0) { 377*3558fe90SMaxime Ripard dev_err(&pdev->dev, "No spi IRQ specified\n"); 378*3558fe90SMaxime Ripard ret = -ENXIO; 379*3558fe90SMaxime Ripard goto err_free_master; 380*3558fe90SMaxime Ripard } 381*3558fe90SMaxime Ripard 382*3558fe90SMaxime Ripard ret = devm_request_irq(&pdev->dev, irq, sun6i_spi_handler, 383*3558fe90SMaxime Ripard 0, "sun6i-spi", sspi); 384*3558fe90SMaxime Ripard if (ret) { 385*3558fe90SMaxime Ripard dev_err(&pdev->dev, "Cannot request IRQ\n"); 386*3558fe90SMaxime Ripard goto err_free_master; 387*3558fe90SMaxime Ripard } 388*3558fe90SMaxime Ripard 389*3558fe90SMaxime Ripard sspi->master = master; 390*3558fe90SMaxime Ripard master->set_cs = sun6i_spi_set_cs; 391*3558fe90SMaxime Ripard master->transfer_one = sun6i_spi_transfer_one; 392*3558fe90SMaxime Ripard master->num_chipselect = 4; 393*3558fe90SMaxime Ripard master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LSB_FIRST; 394*3558fe90SMaxime Ripard master->dev.of_node = pdev->dev.of_node; 395*3558fe90SMaxime Ripard master->auto_runtime_pm = true; 396*3558fe90SMaxime Ripard 397*3558fe90SMaxime Ripard sspi->hclk = devm_clk_get(&pdev->dev, "ahb"); 398*3558fe90SMaxime Ripard if (IS_ERR(sspi->hclk)) { 399*3558fe90SMaxime Ripard dev_err(&pdev->dev, "Unable to acquire AHB clock\n"); 400*3558fe90SMaxime Ripard ret = PTR_ERR(sspi->hclk); 401*3558fe90SMaxime Ripard goto err_free_master; 402*3558fe90SMaxime Ripard } 403*3558fe90SMaxime Ripard 404*3558fe90SMaxime Ripard sspi->mclk = devm_clk_get(&pdev->dev, "mod"); 405*3558fe90SMaxime Ripard if (IS_ERR(sspi->mclk)) { 406*3558fe90SMaxime Ripard dev_err(&pdev->dev, "Unable to acquire module clock\n"); 407*3558fe90SMaxime Ripard ret = PTR_ERR(sspi->mclk); 408*3558fe90SMaxime Ripard goto err_free_master; 409*3558fe90SMaxime Ripard } 410*3558fe90SMaxime Ripard 411*3558fe90SMaxime Ripard init_completion(&sspi->done); 412*3558fe90SMaxime Ripard 413*3558fe90SMaxime Ripard sspi->rstc = devm_reset_control_get(&pdev->dev, NULL); 414*3558fe90SMaxime Ripard if (IS_ERR(sspi->rstc)) { 415*3558fe90SMaxime Ripard dev_err(&pdev->dev, "Couldn't get reset controller\n"); 416*3558fe90SMaxime Ripard ret = PTR_ERR(sspi->rstc); 417*3558fe90SMaxime Ripard goto err_free_master; 418*3558fe90SMaxime Ripard } 419*3558fe90SMaxime Ripard 420*3558fe90SMaxime Ripard /* 421*3558fe90SMaxime Ripard * This wake-up/shutdown pattern is to be able to have the 422*3558fe90SMaxime Ripard * device woken up, even if runtime_pm is disabled 423*3558fe90SMaxime Ripard */ 424*3558fe90SMaxime Ripard ret = sun6i_spi_runtime_resume(&pdev->dev); 425*3558fe90SMaxime Ripard if (ret) { 426*3558fe90SMaxime Ripard dev_err(&pdev->dev, "Couldn't resume the device\n"); 427*3558fe90SMaxime Ripard goto err_free_master; 428*3558fe90SMaxime Ripard } 429*3558fe90SMaxime Ripard 430*3558fe90SMaxime Ripard pm_runtime_set_active(&pdev->dev); 431*3558fe90SMaxime Ripard pm_runtime_enable(&pdev->dev); 432*3558fe90SMaxime Ripard pm_runtime_idle(&pdev->dev); 433*3558fe90SMaxime Ripard 434*3558fe90SMaxime Ripard ret = devm_spi_register_master(&pdev->dev, master); 435*3558fe90SMaxime Ripard if (ret) { 436*3558fe90SMaxime Ripard dev_err(&pdev->dev, "cannot register SPI master\n"); 437*3558fe90SMaxime Ripard goto err_pm_disable; 438*3558fe90SMaxime Ripard } 439*3558fe90SMaxime Ripard 440*3558fe90SMaxime Ripard return 0; 441*3558fe90SMaxime Ripard 442*3558fe90SMaxime Ripard err_pm_disable: 443*3558fe90SMaxime Ripard pm_runtime_disable(&pdev->dev); 444*3558fe90SMaxime Ripard sun6i_spi_runtime_suspend(&pdev->dev); 445*3558fe90SMaxime Ripard err_free_master: 446*3558fe90SMaxime Ripard spi_master_put(master); 447*3558fe90SMaxime Ripard return ret; 448*3558fe90SMaxime Ripard } 449*3558fe90SMaxime Ripard 450*3558fe90SMaxime Ripard static int sun6i_spi_remove(struct platform_device *pdev) 451*3558fe90SMaxime Ripard { 452*3558fe90SMaxime Ripard pm_runtime_disable(&pdev->dev); 453*3558fe90SMaxime Ripard 454*3558fe90SMaxime Ripard return 0; 455*3558fe90SMaxime Ripard } 456*3558fe90SMaxime Ripard 457*3558fe90SMaxime Ripard static const struct of_device_id sun6i_spi_match[] = { 458*3558fe90SMaxime Ripard { .compatible = "allwinner,sun6i-a31-spi", }, 459*3558fe90SMaxime Ripard {} 460*3558fe90SMaxime Ripard }; 461*3558fe90SMaxime Ripard MODULE_DEVICE_TABLE(of, sun6i_spi_match); 462*3558fe90SMaxime Ripard 463*3558fe90SMaxime Ripard static const struct dev_pm_ops sun6i_spi_pm_ops = { 464*3558fe90SMaxime Ripard .runtime_resume = sun6i_spi_runtime_resume, 465*3558fe90SMaxime Ripard .runtime_suspend = sun6i_spi_runtime_suspend, 466*3558fe90SMaxime Ripard }; 467*3558fe90SMaxime Ripard 468*3558fe90SMaxime Ripard static struct platform_driver sun6i_spi_driver = { 469*3558fe90SMaxime Ripard .probe = sun6i_spi_probe, 470*3558fe90SMaxime Ripard .remove = sun6i_spi_remove, 471*3558fe90SMaxime Ripard .driver = { 472*3558fe90SMaxime Ripard .name = "sun6i-spi", 473*3558fe90SMaxime Ripard .owner = THIS_MODULE, 474*3558fe90SMaxime Ripard .of_match_table = sun6i_spi_match, 475*3558fe90SMaxime Ripard .pm = &sun6i_spi_pm_ops, 476*3558fe90SMaxime Ripard }, 477*3558fe90SMaxime Ripard }; 478*3558fe90SMaxime Ripard module_platform_driver(sun6i_spi_driver); 479*3558fe90SMaxime Ripard 480*3558fe90SMaxime Ripard MODULE_AUTHOR("Pan Nan <pannan@allwinnertech.com>"); 481*3558fe90SMaxime Ripard MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>"); 482*3558fe90SMaxime Ripard MODULE_DESCRIPTION("Allwinner A31 SPI controller driver"); 483*3558fe90SMaxime Ripard MODULE_LICENSE("GPL"); 484