linux/drivers/spi/spi-tegra20-sflash.c
<<
>>
Prefs
   1/*
   2 * SPI driver for Nvidia's Tegra20 Serial Flash Controller.
   3 *
   4 * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
   5 *
   6 * Author: Laxman Dewangan <ldewangan@nvidia.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms and conditions of the GNU General Public License,
  10 * version 2, as published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope it will be useful, but WITHOUT
  13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  15 * more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19 */
  20
  21#include <linux/clk.h>
  22#include <linux/completion.h>
  23#include <linux/delay.h>
  24#include <linux/err.h>
  25#include <linux/init.h>
  26#include <linux/interrupt.h>
  27#include <linux/io.h>
  28#include <linux/kernel.h>
  29#include <linux/kthread.h>
  30#include <linux/module.h>
  31#include <linux/platform_device.h>
  32#include <linux/pm_runtime.h>
  33#include <linux/of.h>
  34#include <linux/of_device.h>
  35#include <linux/spi/spi.h>
  36#include <linux/spi/spi-tegra.h>
  37#include <mach/clk.h>
  38
  39#define SPI_COMMAND                             0x000
  40#define SPI_GO                                  BIT(30)
  41#define SPI_M_S                                 BIT(28)
  42#define SPI_ACTIVE_SCLK_MASK                    (0x3 << 26)
  43#define SPI_ACTIVE_SCLK_DRIVE_LOW               (0 << 26)
  44#define SPI_ACTIVE_SCLK_DRIVE_HIGH              (1 << 26)
  45#define SPI_ACTIVE_SCLK_PULL_LOW                (2 << 26)
  46#define SPI_ACTIVE_SCLK_PULL_HIGH               (3 << 26)
  47
  48#define SPI_CK_SDA_FALLING                      (1 << 21)
  49#define SPI_CK_SDA_RISING                       (0 << 21)
  50#define SPI_CK_SDA_MASK                         (1 << 21)
  51#define SPI_ACTIVE_SDA                          (0x3 << 18)
  52#define SPI_ACTIVE_SDA_DRIVE_LOW                (0 << 18)
  53#define SPI_ACTIVE_SDA_DRIVE_HIGH               (1 << 18)
  54#define SPI_ACTIVE_SDA_PULL_LOW                 (2 << 18)
  55#define SPI_ACTIVE_SDA_PULL_HIGH                (3 << 18)
  56
  57#define SPI_CS_POL_INVERT                       BIT(16)
  58#define SPI_TX_EN                               BIT(15)
  59#define SPI_RX_EN                               BIT(14)
  60#define SPI_CS_VAL_HIGH                         BIT(13)
  61#define SPI_CS_VAL_LOW                          0x0
  62#define SPI_CS_SW                               BIT(12)
  63#define SPI_CS_HW                               0x0
  64#define SPI_CS_DELAY_MASK                       (7 << 9)
  65#define SPI_CS3_EN                              BIT(8)
  66#define SPI_CS2_EN                              BIT(7)
  67#define SPI_CS1_EN                              BIT(6)
  68#define SPI_CS0_EN                              BIT(5)
  69
  70#define SPI_CS_MASK                     (SPI_CS3_EN | SPI_CS2_EN |      \
  71                                        SPI_CS1_EN | SPI_CS0_EN)
  72#define SPI_BIT_LENGTH(x)               (((x) & 0x1f) << 0)
  73
  74#define SPI_MODES                       (SPI_ACTIVE_SCLK_MASK | SPI_CK_SDA_MASK)
  75
  76#define SPI_STATUS                      0x004
  77#define SPI_BSY                         BIT(31)
  78#define SPI_RDY                         BIT(30)
  79#define SPI_TXF_FLUSH                   BIT(29)
  80#define SPI_RXF_FLUSH                   BIT(28)
  81#define SPI_RX_UNF                      BIT(27)
  82#define SPI_TX_OVF                      BIT(26)
  83#define SPI_RXF_EMPTY                   BIT(25)
  84#define SPI_RXF_FULL                    BIT(24)
  85#define SPI_TXF_EMPTY                   BIT(23)
  86#define SPI_TXF_FULL                    BIT(22)
  87#define SPI_BLK_CNT(count)              (((count) & 0xffff) + 1)
  88
  89#define SPI_FIFO_ERROR                  (SPI_RX_UNF | SPI_TX_OVF)
  90#define SPI_FIFO_EMPTY                  (SPI_TX_EMPTY | SPI_RX_EMPTY)
  91
  92#define SPI_RX_CMP                      0x8
  93#define SPI_DMA_CTL                     0x0C
  94#define SPI_DMA_EN                      BIT(31)
  95#define SPI_IE_RXC                      BIT(27)
  96#define SPI_IE_TXC                      BIT(26)
  97#define SPI_PACKED                      BIT(20)
  98#define SPI_RX_TRIG_MASK                (0x3 << 18)
  99#define SPI_RX_TRIG_1W                  (0x0 << 18)
 100#define SPI_RX_TRIG_4W                  (0x1 << 18)
 101#define SPI_TX_TRIG_MASK                (0x3 << 16)
 102#define SPI_TX_TRIG_1W                  (0x0 << 16)
 103#define SPI_TX_TRIG_4W                  (0x1 << 16)
 104#define SPI_DMA_BLK_COUNT(count)        (((count) - 1) & 0xFFFF);
 105
 106#define SPI_TX_FIFO                     0x10
 107#define SPI_RX_FIFO                     0x20
 108
 109#define DATA_DIR_TX                     (1 << 0)
 110#define DATA_DIR_RX                     (1 << 1)
 111
 112#define MAX_CHIP_SELECT                 4
 113#define SPI_FIFO_DEPTH                  4
 114#define SPI_DMA_TIMEOUT               (msecs_to_jiffies(1000))
 115
 116struct tegra_sflash_data {
 117        struct device                           *dev;
 118        struct spi_master                       *master;
 119        spinlock_t                              lock;
 120
 121        struct clk                              *clk;
 122        void __iomem                            *base;
 123        unsigned                                irq;
 124        u32                                     spi_max_frequency;
 125        u32                                     cur_speed;
 126
 127        struct spi_device                       *cur_spi;
 128        unsigned                                cur_pos;
 129        unsigned                                cur_len;
 130        unsigned                                bytes_per_word;
 131        unsigned                                cur_direction;
 132        unsigned                                curr_xfer_words;
 133
 134        unsigned                                cur_rx_pos;
 135        unsigned                                cur_tx_pos;
 136
 137        u32                                     tx_status;
 138        u32                                     rx_status;
 139        u32                                     status_reg;
 140
 141        u32                                     def_command_reg;
 142        u32                                     command_reg;
 143        u32                                     dma_control_reg;
 144
 145        struct completion                       xfer_completion;
 146        struct spi_transfer                     *curr_xfer;
 147};
 148
 149static int tegra_sflash_runtime_suspend(struct device *dev);
 150static int tegra_sflash_runtime_resume(struct device *dev);
 151
 152static inline unsigned long tegra_sflash_readl(struct tegra_sflash_data *tsd,
 153                unsigned long reg)
 154{
 155        return readl(tsd->base + reg);
 156}
 157
 158static inline void tegra_sflash_writel(struct tegra_sflash_data *tsd,
 159                unsigned long val, unsigned long reg)
 160{
 161        writel(val, tsd->base + reg);
 162}
 163
 164static void tegra_sflash_clear_status(struct tegra_sflash_data *tsd)
 165{
 166        /* Write 1 to clear status register */
 167        tegra_sflash_writel(tsd, SPI_RDY | SPI_FIFO_ERROR, SPI_STATUS);
 168}
 169
 170static unsigned tegra_sflash_calculate_curr_xfer_param(
 171        struct spi_device *spi, struct tegra_sflash_data *tsd,
 172        struct spi_transfer *t)
 173{
 174        unsigned remain_len = t->len - tsd->cur_pos;
 175        unsigned max_word;
 176
 177        tsd->bytes_per_word = (t->bits_per_word - 1) / 8 + 1;
 178        max_word = remain_len / tsd->bytes_per_word;
 179        if (max_word > SPI_FIFO_DEPTH)
 180                max_word = SPI_FIFO_DEPTH;
 181        tsd->curr_xfer_words = max_word;
 182        return max_word;
 183}
 184
 185static unsigned tegra_sflash_fill_tx_fifo_from_client_txbuf(
 186        struct tegra_sflash_data *tsd, struct spi_transfer *t)
 187{
 188        unsigned nbytes;
 189        unsigned long status;
 190        unsigned max_n_32bit = tsd->curr_xfer_words;
 191        u8 *tx_buf = (u8 *)t->tx_buf + tsd->cur_tx_pos;
 192
 193        if (max_n_32bit > SPI_FIFO_DEPTH)
 194                max_n_32bit = SPI_FIFO_DEPTH;
 195        nbytes = max_n_32bit * tsd->bytes_per_word;
 196
 197        status = tegra_sflash_readl(tsd, SPI_STATUS);
 198        while (!(status & SPI_TXF_FULL)) {
 199                int i;
 200                unsigned int x = 0;
 201
 202                for (i = 0; nbytes && (i < tsd->bytes_per_word);
 203                                                        i++, nbytes--)
 204                                x |= ((*tx_buf++) << i*8);
 205                tegra_sflash_writel(tsd, x, SPI_TX_FIFO);
 206                if (!nbytes)
 207                        break;
 208
 209                status = tegra_sflash_readl(tsd, SPI_STATUS);
 210        }
 211        tsd->cur_tx_pos += max_n_32bit * tsd->bytes_per_word;
 212        return max_n_32bit;
 213}
 214
 215static int tegra_sflash_read_rx_fifo_to_client_rxbuf(
 216                struct tegra_sflash_data *tsd, struct spi_transfer *t)
 217{
 218        unsigned long status;
 219        unsigned int read_words = 0;
 220        u8 *rx_buf = (u8 *)t->rx_buf + tsd->cur_rx_pos;
 221
 222        status = tegra_sflash_readl(tsd, SPI_STATUS);
 223        while (!(status & SPI_RXF_EMPTY)) {
 224                int i;
 225                unsigned long x;
 226
 227                x = tegra_sflash_readl(tsd, SPI_RX_FIFO);
 228                for (i = 0; (i < tsd->bytes_per_word); i++)
 229                        *rx_buf++ = (x >> (i*8)) & 0xFF;
 230                read_words++;
 231                status = tegra_sflash_readl(tsd, SPI_STATUS);
 232        }
 233        tsd->cur_rx_pos += read_words * tsd->bytes_per_word;
 234        return 0;
 235}
 236
 237static int tegra_sflash_start_cpu_based_transfer(
 238                struct tegra_sflash_data *tsd, struct spi_transfer *t)
 239{
 240        unsigned long val = 0;
 241        unsigned cur_words;
 242
 243        if (tsd->cur_direction & DATA_DIR_TX)
 244                val |= SPI_IE_TXC;
 245
 246        if (tsd->cur_direction & DATA_DIR_RX)
 247                val |= SPI_IE_RXC;
 248
 249        tegra_sflash_writel(tsd, val, SPI_DMA_CTL);
 250        tsd->dma_control_reg = val;
 251
 252        if (tsd->cur_direction & DATA_DIR_TX)
 253                cur_words = tegra_sflash_fill_tx_fifo_from_client_txbuf(tsd, t);
 254        else
 255                cur_words = tsd->curr_xfer_words;
 256        val |= SPI_DMA_BLK_COUNT(cur_words);
 257        tegra_sflash_writel(tsd, val, SPI_DMA_CTL);
 258        tsd->dma_control_reg = val;
 259        val |= SPI_DMA_EN;
 260        tegra_sflash_writel(tsd, val, SPI_DMA_CTL);
 261        return 0;
 262}
 263
 264static int tegra_sflash_start_transfer_one(struct spi_device *spi,
 265                struct spi_transfer *t, bool is_first_of_msg,
 266                bool is_single_xfer)
 267{
 268        struct tegra_sflash_data *tsd = spi_master_get_devdata(spi->master);
 269        u32 speed;
 270        unsigned long command;
 271
 272        speed = t->speed_hz ? t->speed_hz : spi->max_speed_hz;
 273        if (!speed)
 274                speed = tsd->spi_max_frequency;
 275        if (speed != tsd->cur_speed) {
 276                clk_set_rate(tsd->clk, speed);
 277                tsd->cur_speed = speed;
 278        }
 279
 280        tsd->cur_spi = spi;
 281        tsd->cur_pos = 0;
 282        tsd->cur_rx_pos = 0;
 283        tsd->cur_tx_pos = 0;
 284        tsd->curr_xfer = t;
 285        tegra_sflash_calculate_curr_xfer_param(spi, tsd, t);
 286        if (is_first_of_msg) {
 287                command = tsd->def_command_reg;
 288                command |= SPI_BIT_LENGTH(t->bits_per_word - 1);
 289                command |= SPI_CS_VAL_HIGH;
 290
 291                command &= ~SPI_MODES;
 292                if (spi->mode & SPI_CPHA)
 293                        command |= SPI_CK_SDA_FALLING;
 294
 295                if (spi->mode & SPI_CPOL)
 296                        command |= SPI_ACTIVE_SCLK_DRIVE_HIGH;
 297                else
 298                        command |= SPI_ACTIVE_SCLK_DRIVE_LOW;
 299                command |= SPI_CS0_EN << spi->chip_select;
 300        } else {
 301                command = tsd->command_reg;
 302                command &= ~SPI_BIT_LENGTH(~0);
 303                command |= SPI_BIT_LENGTH(t->bits_per_word - 1);
 304                command &= ~(SPI_RX_EN | SPI_TX_EN);
 305        }
 306
 307        tsd->cur_direction = 0;
 308        if (t->rx_buf) {
 309                command |= SPI_RX_EN;
 310                tsd->cur_direction |= DATA_DIR_RX;
 311        }
 312        if (t->tx_buf) {
 313                command |= SPI_TX_EN;
 314                tsd->cur_direction |= DATA_DIR_TX;
 315        }
 316        tegra_sflash_writel(tsd, command, SPI_COMMAND);
 317        tsd->command_reg = command;
 318
 319        return  tegra_sflash_start_cpu_based_transfer(tsd, t);
 320}
 321
 322static int tegra_sflash_transfer_one_message(struct spi_master *master,
 323                        struct spi_message *msg)
 324{
 325        bool is_first_msg = true;
 326        int single_xfer;
 327        struct tegra_sflash_data *tsd = spi_master_get_devdata(master);
 328        struct spi_transfer *xfer;
 329        struct spi_device *spi = msg->spi;
 330        int ret;
 331
 332        ret = pm_runtime_get_sync(tsd->dev);
 333        if (ret < 0) {
 334                dev_err(tsd->dev, "pm_runtime_get() failed, err = %d\n", ret);
 335                return ret;
 336        }
 337
 338        msg->status = 0;
 339        msg->actual_length = 0;
 340        single_xfer = list_is_singular(&msg->transfers);
 341        list_for_each_entry(xfer, &msg->transfers, transfer_list) {
 342                INIT_COMPLETION(tsd->xfer_completion);
 343                ret = tegra_sflash_start_transfer_one(spi, xfer,
 344                                        is_first_msg, single_xfer);
 345                if (ret < 0) {
 346                        dev_err(tsd->dev,
 347                                "spi can not start transfer, err %d\n", ret);
 348                        goto exit;
 349                }
 350                is_first_msg = false;
 351                ret = wait_for_completion_timeout(&tsd->xfer_completion,
 352                                                SPI_DMA_TIMEOUT);
 353                if (WARN_ON(ret == 0)) {
 354                        dev_err(tsd->dev,
 355                                "spi trasfer timeout, err %d\n", ret);
 356                        ret = -EIO;
 357                        goto exit;
 358                }
 359
 360                if (tsd->tx_status ||  tsd->rx_status) {
 361                        dev_err(tsd->dev, "Error in Transfer\n");
 362                        ret = -EIO;
 363                        goto exit;
 364                }
 365                msg->actual_length += xfer->len;
 366                if (xfer->cs_change && xfer->delay_usecs) {
 367                        tegra_sflash_writel(tsd, tsd->def_command_reg,
 368                                        SPI_COMMAND);
 369                        udelay(xfer->delay_usecs);
 370                }
 371        }
 372        ret = 0;
 373exit:
 374        tegra_sflash_writel(tsd, tsd->def_command_reg, SPI_COMMAND);
 375        msg->status = ret;
 376        spi_finalize_current_message(master);
 377        pm_runtime_put(tsd->dev);
 378        return ret;
 379}
 380
 381static irqreturn_t handle_cpu_based_xfer(struct tegra_sflash_data *tsd)
 382{
 383        struct spi_transfer *t = tsd->curr_xfer;
 384        unsigned long flags;
 385
 386        spin_lock_irqsave(&tsd->lock, flags);
 387        if (tsd->tx_status || tsd->rx_status || (tsd->status_reg & SPI_BSY)) {
 388                dev_err(tsd->dev,
 389                        "CpuXfer ERROR bit set 0x%x\n", tsd->status_reg);
 390                dev_err(tsd->dev,
 391                        "CpuXfer 0x%08x:0x%08x\n", tsd->command_reg,
 392                                tsd->dma_control_reg);
 393                tegra_periph_reset_assert(tsd->clk);
 394                udelay(2);
 395                tegra_periph_reset_deassert(tsd->clk);
 396                complete(&tsd->xfer_completion);
 397                goto exit;
 398        }
 399
 400        if (tsd->cur_direction & DATA_DIR_RX)
 401                tegra_sflash_read_rx_fifo_to_client_rxbuf(tsd, t);
 402
 403        if (tsd->cur_direction & DATA_DIR_TX)
 404                tsd->cur_pos = tsd->cur_tx_pos;
 405        else
 406                tsd->cur_pos = tsd->cur_rx_pos;
 407
 408        if (tsd->cur_pos == t->len) {
 409                complete(&tsd->xfer_completion);
 410                goto exit;
 411        }
 412
 413        tegra_sflash_calculate_curr_xfer_param(tsd->cur_spi, tsd, t);
 414        tegra_sflash_start_cpu_based_transfer(tsd, t);
 415exit:
 416        spin_unlock_irqrestore(&tsd->lock, flags);
 417        return IRQ_HANDLED;
 418}
 419
 420static irqreturn_t tegra_sflash_isr(int irq, void *context_data)
 421{
 422        struct tegra_sflash_data *tsd = context_data;
 423
 424        tsd->status_reg = tegra_sflash_readl(tsd, SPI_STATUS);
 425        if (tsd->cur_direction & DATA_DIR_TX)
 426                tsd->tx_status = tsd->status_reg & SPI_TX_OVF;
 427
 428        if (tsd->cur_direction & DATA_DIR_RX)
 429                tsd->rx_status = tsd->status_reg & SPI_RX_UNF;
 430        tegra_sflash_clear_status(tsd);
 431
 432        return handle_cpu_based_xfer(tsd);
 433}
 434
 435static struct tegra_spi_platform_data *tegra_sflash_parse_dt(
 436                struct platform_device *pdev)
 437{
 438        struct tegra_spi_platform_data *pdata;
 439        struct device_node *np = pdev->dev.of_node;
 440        u32 max_freq;
 441
 442        pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
 443        if (!pdata) {
 444                dev_err(&pdev->dev, "Memory alloc for pdata failed\n");
 445                return NULL;
 446        }
 447
 448        if (!of_property_read_u32(np, "spi-max-frequency", &max_freq))
 449                pdata->spi_max_frequency = max_freq;
 450
 451        return pdata;
 452}
 453
 454static struct of_device_id tegra_sflash_of_match[] = {
 455        { .compatible = "nvidia,tegra20-sflash", },
 456        {}
 457};
 458MODULE_DEVICE_TABLE(of, tegra_sflash_of_match);
 459
 460static int tegra_sflash_probe(struct platform_device *pdev)
 461{
 462        struct spi_master       *master;
 463        struct tegra_sflash_data        *tsd;
 464        struct resource         *r;
 465        struct tegra_spi_platform_data *pdata = pdev->dev.platform_data;
 466        int ret;
 467        const struct of_device_id *match;
 468
 469        match = of_match_device(of_match_ptr(tegra_sflash_of_match),
 470                                        &pdev->dev);
 471        if (!match) {
 472                dev_err(&pdev->dev, "Error: No device match found\n");
 473                return -ENODEV;
 474        }
 475
 476        if (!pdata && pdev->dev.of_node)
 477                pdata = tegra_sflash_parse_dt(pdev);
 478
 479        if (!pdata) {
 480                dev_err(&pdev->dev, "No platform data, exiting\n");
 481                return -ENODEV;
 482        }
 483
 484        if (!pdata->spi_max_frequency)
 485                pdata->spi_max_frequency = 25000000; /* 25MHz */
 486
 487        master = spi_alloc_master(&pdev->dev, sizeof(*tsd));
 488        if (!master) {
 489                dev_err(&pdev->dev, "master allocation failed\n");
 490                return -ENOMEM;
 491        }
 492
 493        /* the spi->mode bits understood by this driver: */
 494        master->mode_bits = SPI_CPOL | SPI_CPHA;
 495        master->transfer_one_message = tegra_sflash_transfer_one_message;
 496        master->num_chipselect = MAX_CHIP_SELECT;
 497        master->bus_num = -1;
 498
 499        dev_set_drvdata(&pdev->dev, master);
 500        tsd = spi_master_get_devdata(master);
 501        tsd->master = master;
 502        tsd->dev = &pdev->dev;
 503        spin_lock_init(&tsd->lock);
 504
 505        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 506        if (!r) {
 507                dev_err(&pdev->dev, "No IO memory resource\n");
 508                ret = -ENODEV;
 509                goto exit_free_master;
 510        }
 511        tsd->base = devm_request_and_ioremap(&pdev->dev, r);
 512        if (!tsd->base) {
 513                dev_err(&pdev->dev,
 514                        "Cannot request memregion/iomap dma address\n");
 515                ret = -EADDRNOTAVAIL;
 516                goto exit_free_master;
 517        }
 518
 519        tsd->irq = platform_get_irq(pdev, 0);
 520        ret = request_irq(tsd->irq, tegra_sflash_isr, 0,
 521                        dev_name(&pdev->dev), tsd);
 522        if (ret < 0) {
 523                dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
 524                                        tsd->irq);
 525                goto exit_free_master;
 526        }
 527
 528        tsd->clk = devm_clk_get(&pdev->dev, "spi");
 529        if (IS_ERR(tsd->clk)) {
 530                dev_err(&pdev->dev, "can not get clock\n");
 531                ret = PTR_ERR(tsd->clk);
 532                goto exit_free_irq;
 533        }
 534
 535        tsd->spi_max_frequency = pdata->spi_max_frequency;
 536        init_completion(&tsd->xfer_completion);
 537        pm_runtime_enable(&pdev->dev);
 538        if (!pm_runtime_enabled(&pdev->dev)) {
 539                ret = tegra_sflash_runtime_resume(&pdev->dev);
 540                if (ret)
 541                        goto exit_pm_disable;
 542        }
 543
 544        ret = pm_runtime_get_sync(&pdev->dev);
 545        if (ret < 0) {
 546                dev_err(&pdev->dev, "pm runtime get failed, e = %d\n", ret);
 547                goto exit_pm_disable;
 548        }
 549
 550        /* Reset controller */
 551        tegra_periph_reset_assert(tsd->clk);
 552        udelay(2);
 553        tegra_periph_reset_deassert(tsd->clk);
 554
 555        tsd->def_command_reg  = SPI_M_S | SPI_CS_SW;
 556        tegra_sflash_writel(tsd, tsd->def_command_reg, SPI_COMMAND);
 557        pm_runtime_put(&pdev->dev);
 558
 559        master->dev.of_node = pdev->dev.of_node;
 560        ret = spi_register_master(master);
 561        if (ret < 0) {
 562                dev_err(&pdev->dev, "can not register to master err %d\n", ret);
 563                goto exit_pm_disable;
 564        }
 565        return ret;
 566
 567exit_pm_disable:
 568        pm_runtime_disable(&pdev->dev);
 569        if (!pm_runtime_status_suspended(&pdev->dev))
 570                tegra_sflash_runtime_suspend(&pdev->dev);
 571exit_free_irq:
 572        free_irq(tsd->irq, tsd);
 573exit_free_master:
 574        spi_master_put(master);
 575        return ret;
 576}
 577
 578static int tegra_sflash_remove(struct platform_device *pdev)
 579{
 580        struct spi_master *master = dev_get_drvdata(&pdev->dev);
 581        struct tegra_sflash_data        *tsd = spi_master_get_devdata(master);
 582
 583        free_irq(tsd->irq, tsd);
 584        spi_unregister_master(master);
 585
 586        pm_runtime_disable(&pdev->dev);
 587        if (!pm_runtime_status_suspended(&pdev->dev))
 588                tegra_sflash_runtime_suspend(&pdev->dev);
 589
 590        return 0;
 591}
 592
 593#ifdef CONFIG_PM_SLEEP
 594static int tegra_sflash_suspend(struct device *dev)
 595{
 596        struct spi_master *master = dev_get_drvdata(dev);
 597
 598        return spi_master_suspend(master);
 599}
 600
 601static int tegra_sflash_resume(struct device *dev)
 602{
 603        struct spi_master *master = dev_get_drvdata(dev);
 604        struct tegra_sflash_data *tsd = spi_master_get_devdata(master);
 605        int ret;
 606
 607        ret = pm_runtime_get_sync(dev);
 608        if (ret < 0) {
 609                dev_err(dev, "pm runtime failed, e = %d\n", ret);
 610                return ret;
 611        }
 612        tegra_sflash_writel(tsd, tsd->command_reg, SPI_COMMAND);
 613        pm_runtime_put(dev);
 614
 615        return spi_master_resume(master);
 616}
 617#endif
 618
 619static int tegra_sflash_runtime_suspend(struct device *dev)
 620{
 621        struct spi_master *master = dev_get_drvdata(dev);
 622        struct tegra_sflash_data *tsd = spi_master_get_devdata(master);
 623
 624        /* Flush all write which are in PPSB queue by reading back */
 625        tegra_sflash_readl(tsd, SPI_COMMAND);
 626
 627        clk_disable_unprepare(tsd->clk);
 628        return 0;
 629}
 630
 631static int tegra_sflash_runtime_resume(struct device *dev)
 632{
 633        struct spi_master *master = dev_get_drvdata(dev);
 634        struct tegra_sflash_data *tsd = spi_master_get_devdata(master);
 635        int ret;
 636
 637        ret = clk_prepare_enable(tsd->clk);
 638        if (ret < 0) {
 639                dev_err(tsd->dev, "clk_prepare failed: %d\n", ret);
 640                return ret;
 641        }
 642        return 0;
 643}
 644
 645static const struct dev_pm_ops slink_pm_ops = {
 646        SET_RUNTIME_PM_OPS(tegra_sflash_runtime_suspend,
 647                tegra_sflash_runtime_resume, NULL)
 648        SET_SYSTEM_SLEEP_PM_OPS(tegra_sflash_suspend, tegra_sflash_resume)
 649};
 650static struct platform_driver tegra_sflash_driver = {
 651        .driver = {
 652                .name           = "spi-tegra-sflash",
 653                .owner          = THIS_MODULE,
 654                .pm             = &slink_pm_ops,
 655                .of_match_table = of_match_ptr(tegra_sflash_of_match),
 656        },
 657        .probe =        tegra_sflash_probe,
 658        .remove =       tegra_sflash_remove,
 659};
 660module_platform_driver(tegra_sflash_driver);
 661
 662MODULE_ALIAS("platform:spi-tegra-sflash");
 663MODULE_DESCRIPTION("NVIDIA Tegra20 Serial Flash Controller Driver");
 664MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
 665MODULE_LICENSE("GPL v2");
 666
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.