/* * Copyright (C) 2009 Samsung Electronics Ltd. * Jaswinder Singh <jassi.brar@samsung.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */#include<linux/init.h>#include<linux/module.h>#include<linux/interrupt.h>#include<linux/delay.h>#include<linux/clk.h>#include<linux/dma-mapping.h>#include<linux/dmaengine.h>#include<linux/platform_device.h>#include<linux/pm_runtime.h>#include<linux/spi/spi.h>#include<linux/gpio.h>#include<linux/of.h>#include<linux/of_gpio.h>#include<linux/platform_data/spi-s3c64xx.h>#define MAX_SPI_PORTS 6#define S3C64XX_SPI_QUIRK_POLL (1 << 0)#define S3C64XX_SPI_QUIRK_CS_AUTO (1 << 1)#define AUTOSUSPEND_TIMEOUT 2000/* Registers and bit-fields */#define S3C64XX_SPI_CH_CFG 0x00#define S3C64XX_SPI_CLK_CFG 0x04#define S3C64XX_SPI_MODE_CFG 0x08#define S3C64XX_SPI_SLAVE_SEL 0x0C#define S3C64XX_SPI_INT_EN 0x10#define S3C64XX_SPI_STATUS 0x14#define S3C64XX_SPI_TX_DATA 0x18#define S3C64XX_SPI_RX_DATA 0x1C#define S3C64XX_SPI_PACKET_CNT 0x20#define S3C64XX_SPI_PENDING_CLR 0x24#define S3C64XX_SPI_SWAP_CFG 0x28#define S3C64XX_SPI_FB_CLK 0x2C#define S3C64XX_SPI_CH_HS_EN (1<<6) /* High Speed Enable */#define S3C64XX_SPI_CH_SW_RST (1<<5)#define S3C64XX_SPI_CH_SLAVE (1<<4)#define S3C64XX_SPI_CPOL_L (1<<3)#define S3C64XX_SPI_CPHA_B (1<<2)#define S3C64XX_SPI_CH_RXCH_ON (1<<1)#define S3C64XX_SPI_CH_TXCH_ON (1<<0)#define S3C64XX_SPI_CLKSEL_SRCMSK (3<<9)#define S3C64XX_SPI_CLKSEL_SRCSHFT 9#define S3C64XX_SPI_ENCLK_ENABLE (1<<8)#define S3C64XX_SPI_PSR_MASK 0xff#define S3C64XX_SPI_MODE_CH_TSZ_BYTE (0<<29)#define S3C64XX_SPI_MODE_CH_TSZ_HALFWORD (1<<29)#define S3C64XX_SPI_MODE_CH_TSZ_WORD (2<<29)#define S3C64XX_SPI_MODE_CH_TSZ_MASK (3<<29)#define S3C64XX_SPI_MODE_BUS_TSZ_BYTE (0<<17)#define S3C64XX_SPI_MODE_BUS_TSZ_HALFWORD (1<<17)#define S3C64XX_SPI_MODE_BUS_TSZ_WORD (2<<17)#define S3C64XX_SPI_MODE_BUS_TSZ_MASK (3<<17)#define S3C64XX_SPI_MODE_RXDMA_ON (1<<2)#define S3C64XX_SPI_MODE_TXDMA_ON (1<<1)#define S3C64XX_SPI_MODE_4BURST (1<<0)#define S3C64XX_SPI_SLAVE_AUTO (1<<1)#define S3C64XX_SPI_SLAVE_SIG_INACT (1<<0)#define S3C64XX_SPI_SLAVE_NSC_CNT_2 (2<<4)#define S3C64XX_SPI_INT_TRAILING_EN (1<<6)#define S3C64XX_SPI_INT_RX_OVERRUN_EN (1<<5)#define S3C64XX_SPI_INT_RX_UNDERRUN_EN (1<<4)#define S3C64XX_SPI_INT_TX_OVERRUN_EN (1<<3)#define S3C64XX_SPI_INT_TX_UNDERRUN_EN (1<<2)#define S3C64XX_SPI_INT_RX_FIFORDY_EN (1<<1)#define S3C64XX_SPI_INT_TX_FIFORDY_EN (1<<0)#define S3C64XX_SPI_ST_RX_OVERRUN_ERR (1<<5)#define S3C64XX_SPI_ST_RX_UNDERRUN_ERR (1<<4)#define S3C64XX_SPI_ST_TX_OVERRUN_ERR (1<<3)#define S3C64XX_SPI_ST_TX_UNDERRUN_ERR (1<<2)#define S3C64XX_SPI_ST_RX_FIFORDY (1<<1)#define S3C64XX_SPI_ST_TX_FIFORDY (1<<0)#define S3C