2008-06-27 17:37:57 +08:00
|
|
|
#ifndef MFD_TMIO_H
|
|
|
|
#define MFD_TMIO_H
|
|
|
|
|
2012-02-10 05:57:09 +08:00
|
|
|
#include <linux/device.h>
|
2008-10-16 13:03:55 +08:00
|
|
|
#include <linux/fb.h>
|
2010-01-06 20:51:48 +08:00
|
|
|
#include <linux/io.h>
|
2012-02-10 05:57:09 +08:00
|
|
|
#include <linux/jiffies.h>
|
2014-09-09 14:45:25 +08:00
|
|
|
#include <linux/mmc/card.h>
|
2010-01-06 20:51:48 +08:00
|
|
|
#include <linux/platform_device.h>
|
2011-05-12 00:51:11 +08:00
|
|
|
#include <linux/pm_runtime.h>
|
2008-10-16 13:03:55 +08:00
|
|
|
|
2008-08-01 02:44:28 +08:00
|
|
|
#define tmio_ioread8(addr) readb(addr)
|
|
|
|
#define tmio_ioread16(addr) readw(addr)
|
|
|
|
#define tmio_ioread16_rep(r, b, l) readsw(r, b, l)
|
|
|
|
#define tmio_ioread32(addr) \
|
2017-06-17 00:11:03 +08:00
|
|
|
(((u32)readw((addr))) | (((u32)readw((addr) + 2)) << 16))
|
2008-08-01 02:44:28 +08:00
|
|
|
|
|
|
|
#define tmio_iowrite8(val, addr) writeb((val), (addr))
|
|
|
|
#define tmio_iowrite16(val, addr) writew((val), (addr))
|
|
|
|
#define tmio_iowrite16_rep(r, b, l) writesw(r, b, l)
|
|
|
|
#define tmio_iowrite32(val, addr) \
|
|
|
|
do { \
|
2017-06-17 00:11:03 +08:00
|
|
|
writew((val), (addr)); \
|
|
|
|
writew((val) >> 16, (addr) + 2); \
|
2008-08-01 02:44:28 +08:00
|
|
|
} while (0)
|
|
|
|
|
2010-01-06 20:51:48 +08:00
|
|
|
#define CNF_CMD 0x04
|
|
|
|
#define CNF_CTL_BASE 0x10
|
|
|
|
#define CNF_INT_PIN 0x3d
|
|
|
|
#define CNF_STOP_CLK_CTL 0x40
|
|
|
|
#define CNF_GCLK_CTL 0x41
|
|
|
|
#define CNF_SD_CLK_MODE 0x42
|
|
|
|
#define CNF_PIN_STATUS 0x44
|
|
|
|
#define CNF_PWR_CTL_1 0x48
|
|
|
|
#define CNF_PWR_CTL_2 0x49
|
|
|
|
#define CNF_PWR_CTL_3 0x4a
|
|
|
|
#define CNF_CARD_DETECT_MODE 0x4c
|
|
|
|
#define CNF_SD_SLOT 0x50
|
|
|
|
#define CNF_EXT_GCLK_CTL_1 0xf0
|
|
|
|
#define CNF_EXT_GCLK_CTL_2 0xf1
|
|
|
|
#define CNF_EXT_GCLK_CTL_3 0xf9
|
|
|
|
#define CNF_SD_LED_EN_1 0xfa
|
|
|
|
#define CNF_SD_LED_EN_2 0xfe
|
|
|
|
|
|
|
|
#define SDCREN 0x2 /* Enable access to MMC CTL regs. (flag in COMMAND_REG)*/
|
|
|
|
|
|
|
|
#define sd_config_write8(base, shift, reg, val) \
|
|
|
|
tmio_iowrite8((val), (base) + ((reg) << (shift)))
|
|
|
|
#define sd_config_write16(base, shift, reg, val) \
|
|
|
|
tmio_iowrite16((val), (base) + ((reg) << (shift)))
|
|
|
|
#define sd_config_write32(base, shift, reg, val) \
|
|
|
|
do { \
|
|
|
|
tmio_iowrite16((val), (base) + ((reg) << (shift))); \
|
|
|
|
tmio_iowrite16((val) >> 16, (base) + ((reg + 2) << (shift))); \
|
|
|
|
} while (0)
|
|
|
|
|
2010-05-20 02:36:02 +08:00
|
|
|
/* tmio MMC platform flags */
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_WRPROTECT_DISABLE BIT(0)
|
2010-08-30 18:50:19 +08:00
|
|
|
/*
|
|
|
|
* Some controllers can support a 2-byte block size when the bus width
|
|
|
|
* is configured in 4-bit mode.
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_BLKSZ_2BYTES BIT(1)
|
2010-12-29 06:22:31 +08:00
|
|
|
/*
|
|
|
|
* Some controllers can support SDIO IRQ signalling.
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_SDIO_IRQ BIT(2)
|
2016-01-19 19:28:31 +08:00
|
|
|
|
2017-05-28 17:30:47 +08:00
|
|
|
/* Some features are only available or tested on R-Car Gen2 or later */
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_MIN_RCAR2 BIT(3)
|
2016-01-19 19:28:31 +08:00
|
|
|
|
2011-06-21 07:00:10 +08:00
|
|
|
/*
|
|
|
|
* Some controllers require waiting for the SD bus to become
|
|
|
|
* idle before writing to some registers.
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_HAS_IDLE_WAIT BIT(4)
|
2012-02-10 05:57:09 +08:00
|
|
|
/*
|
|
|
|
* A GPIO is used for card hotplug detection. We need an extra flag for this,
|
|
|
|
* because 0 is a valid GPIO number too, and requiring users to specify
|
|
|
|
* cd_gpio < 0 to disable GPIO hotplug would break backwards compatibility.
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_USE_GPIO_CD BIT(5)
|
2010-05-20 02:36:02 +08:00
|
|
|
|
2013-11-20 16:31:06 +08:00
|
|
|
/*
|
|
|
|
* Some controllers doesn't have over 0x100 register.
|
|
|
|
* it is used to checking accessibility of
|
|
|
|
* CTL_SD_CARD_CLK_CTL / CTL_CLK_AND_WAIT_CTL
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_HAVE_HIGH_REG BIT(6)
|
2013-11-20 16:31:06 +08:00
|
|
|
|
2014-08-25 11:00:25 +08:00
|
|
|
/*
|
|
|
|
* Some controllers have CMD12 automatically
|
|
|
|
* issue/non-issue register
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_HAVE_CMD12_CTRL BIT(7)
|
2014-08-25 11:00:25 +08:00
|
|
|
|
2017-01-20 04:07:17 +08:00
|
|
|
/* Controller has some SDIO status bits which must be 1 */
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_SDIO_STATUS_SETBITS BIT(8)
|
2014-08-25 11:00:52 +08:00
|
|
|
|
2016-09-12 22:15:06 +08:00
|
|
|
/*
|
|
|
|
* Some controllers have a 32-bit wide data port register
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_32BIT_DATA_PORT BIT(9)
|
2016-09-12 22:15:06 +08:00
|
|
|
|
2014-08-25 11:03:00 +08:00
|
|
|
/*
|
|
|
|
* Some controllers allows to set SDx actual clock
|
|
|
|
*/
|
2017-06-17 00:11:03 +08:00
|
|
|
#define TMIO_MMC_CLK_ACTUAL BIT(10)
|
2014-08-25 11:03:00 +08:00
|
|
|
|
2010-01-06 20:51:48 +08:00
|
|
|
int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);
|
|
|
|
int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);
|
|
|
|
void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);
|
|
|
|
void tmio_core_mmc_clk_div(void __iomem *cnf, int shift, int state);
|
|
|
|
|
2013-04-26 23:47:17 +08:00
|
|
|
struct dma_chan;
|
|
|
|
|
2009-06-05 02:12:31 +08:00
|
|
|
/*
|
|
|
|
* data for the MMC controller
|
|
|
|
*/
|
|
|
|
struct tmio_mmc_data {
|
2015-02-24 10:06:43 +08:00
|
|
|
void *chan_priv_tx;
|
|
|
|
void *chan_priv_rx;
|
2010-02-17 15:38:14 +08:00
|
|
|
unsigned int hclk;
|
2010-02-17 15:37:55 +08:00
|
|
|
unsigned long capabilities;
|
2012-05-23 16:44:37 +08:00
|
|
|
unsigned long capabilities2;
|
2010-05-20 02:36:02 +08:00
|
|
|
unsigned long flags;
|
2010-05-20 02:37:25 +08:00
|
|
|
u32 ocr_mask; /* available voltages */
|
2012-02-10 05:57:09 +08:00
|
|
|
unsigned int cd_gpio;
|
2015-01-13 12:58:46 +08:00
|
|
|
int alignment_shift;
|
2015-01-13 12:58:56 +08:00
|
|
|
dma_addr_t dma_rx_offset;
|
2013-09-06 19:29:05 +08:00
|
|
|
void (*set_pwr)(struct platform_device *host, int state);
|
2010-01-06 20:51:48 +08:00
|
|
|
void (*set_clk_div)(struct platform_device *host, int state);
|
2009-06-05 02:12:31 +08:00
|
|
|
};
|
|
|
|
|
2008-06-27 17:37:57 +08:00
|
|
|
/*
|
|
|
|
* data for the NAND controller
|
|
|
|
*/
|
|
|
|
struct tmio_nand_data {
|
|
|
|
struct nand_bbt_descr *badblock_pattern;
|
|
|
|
struct mtd_partition *partition;
|
|
|
|
unsigned int num_partitions;
|
|
|
|
};
|
|
|
|
|
2008-10-16 13:03:55 +08:00
|
|
|
#define FBIO_TMIO_ACC_WRITE 0x7C639300
|
|
|
|
#define FBIO_TMIO_ACC_SYNC 0x7C639301
|
|
|
|
|
|
|
|
struct tmio_fb_data {
|
|
|
|
int (*lcd_set_power)(struct platform_device *fb_dev,
|
2017-06-17 00:11:03 +08:00
|
|
|
bool on);
|
2008-10-16 13:03:55 +08:00
|
|
|
int (*lcd_mode)(struct platform_device *fb_dev,
|
2017-06-17 00:11:03 +08:00
|
|
|
const struct fb_videomode *mode);
|
2008-10-16 13:03:55 +08:00
|
|
|
int num_modes;
|
|
|
|
struct fb_videomode *modes;
|
|
|
|
|
|
|
|
/* in mm: size of screen */
|
|
|
|
int height;
|
|
|
|
int width;
|
|
|
|
};
|
|
|
|
|
2008-06-27 17:37:57 +08:00
|
|
|
#endif
|