blob: 8f80f9302e79866fe8d9148a3cd57d1bf5b00ef2 [file] [log] [blame]
/*
* include/linux/amlogic/amlsd.h
*
* Copyright (C) 2016 Amlogic, Inc. All rights reserved.
*
* 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.
*
*/
#ifndef AMLSD_H
#define AMLSD_H
#include <linux/of_gpio.h>
/* ptm or pxp simulation */
/* #define CONFIG_MESON_CPU_EMULATOR */
/* #define SD_EMMC_DEBUG_BOARD */
/* hardcode clock, for debug or bringup */
/* #define SD_EMMC_CLK_CTRL (1) */
/* #define SD_EMMC_PIN_CTRL (1) */
#define AML_MMC_MAJOR_VERSION 3
#define AML_MMC_MINOR_VERSION 02
#define AML_MMC_VERSION \
((AML_MMC_MAJOR_VERSION << 8) | AML_MMC_MINOR_VERSION)
#define AML_MMC_VER_MESSAGE \
"2017-05-15: New Emmc Host Controller"
extern unsigned long sdhc_debug;
extern unsigned long sdio_debug;
extern unsigned int sd_emmc_debug;
extern const u8 tuning_blk_pattern_4bit[64];
extern const u8 tuning_blk_pattern_8bit[128];
#define DEBUG_SD_OF 0
#define MODULE_NAME "amlsd"
/* #define CARD_DETECT_IRQ 1 */
#define SD_EMMC_DEBUG_BOARD 1
#if 0
#define A0_GP_CFG0 (0xc8100240)
#define A0_GP_CFG2 (0xc8100248)
#define STORAGE_DEV_NOSET (0)
#define STORAGE_DEV_EMMC (1)
#define STORAGE_DEV_NAND (2)
#define STORAGE_DEV_SPI (3)
#define STORAGE_DEV_SDCARD (4)
#define STORAGE_DEV_USB (5)
#define LDO4DAC_REG_ADDR 0x4f
#define LDO4DAC_REG_1_8_V 0x24
#define LDO4DAC_REG_2_8_V 0x4c
#define LDO4DAC_REG_3_3_V 0x60
#endif
#define DETECT_CARD_IN 1
#define DETECT_CARD_OUT 2
#define DETECT_CARD_JTAG_IN 3
#define DETECT_CARD_JTAG_OUT 4
#define EMMC_DAT3_PINMUX_CLR 0
#define EMMC_DAT3_PINMUX_SET 1
#ifdef CONFIG_AMLOGIC_M8B_MMC
#define P_PERIPHS_PIN_MUX_2 (0xc1100000 + (0x202e << 2))
#define P_PREG_PAD_GPIO3_EN_N (0xc1100000 + (0x2015 << 2))
#define P_PREG_PAD_GPIO3_O (0xc1100000 + (0x2016 << 2))
#endif
#define CHECK_RET(ret) { \
if (ret) \
pr_info("[%s] gpio op failed(%d) at line %d\n",\
__func__, ret, __LINE__); \
}
#define SD_PARSE_U32_PROP_HEX(node, prop_name, prop, value) do { \
if (!of_property_read_u32(node, prop_name, &prop)) {\
value = prop;\
prop = 0;\
if (DEBUG_SD_OF) { \
pr_info("get property:%25s, value:0x%08x\n", \
prop_name, (unsigned int)value); \
} \
} \
} while (0)
#define SD_PARSE_U32_PROP_DEC(node, prop_name, prop, value) do { \
if (!of_property_read_u32(node, prop_name, &prop)) {\
value = prop;\
prop = 0;\
if (DEBUG_SD_OF) { \
pr_info("get property:%25s, value:%d\n", \
prop_name, (unsigned int)value); \
} \
} \
} while (0)
#define SD_PARSE_GPIO_NUM_PROP(node, prop_name, str, gpio_pin) {\
if (!of_property_read_string(node, prop_name, &str)) {\
gpio_pin = \
of_get_named_gpio(node, \
prop_name, 0);\
if (DEBUG_SD_OF) { \
pr_info("get property:%25s, str:%s\n",\
prop_name, str);\
} \
} \
}
#define SD_PARSE_STRING_PROP(node, prop_name, str, prop) {\
if (!of_property_read_string(node, prop_name, &str)) {\
strcpy(prop, str);\
if (DEBUG_SD_OF) {\
pr_info("get property:%25s, str:%s\n",\
prop_name, prop); \
} \
} \
}
#define SD_CAPS(a, b) { .caps = a, .name = b }
#define WAIT_UNTIL_REQ_DONE msecs_to_jiffies(10000)
struct sd_caps {
unsigned int caps;
const char *name;
};
void aml_mmc_ver_msg_show(void);
extern int sdio_reset_comm(struct mmc_card *card);
#if 0
extern int storage_flag;
extern void aml_debug_print_buf(char *buf, int size);
extern int aml_buf_verify(int *buf, int blocks, int lba);
extern void aml_sdhc_init_debugfs(struct mmc_host *mmc);
extern void aml_sdio_init_debugfs(struct mmc_host *mmc);
extern void aml_sd_emmc_init_debugfs(struct mmc_host *mmc);
extern void aml_sdio_print_reg(struct amlsd_host *host);
extern void aml_sd_emmc_print_reg(struct amlsd_host *host);
extern int add_part_table(struct mtd_partition *part, unsigned int nr_part);
extern int add_emmc_partition(struct gendisk *disk);
int amlsd_get_reg_base(struct platform_device *pdev,
struct amlsd_host *host);
/* int of_amlsd_detect(struct amlsd_platform* pdata); */
int aml_sd_uart_detect(struct amlsd_platform *pdata);
void aml_sd_uart_detect_clr(struct amlsd_platform *pdata);
void aml_sduart_pre(struct amlsd_platform *pdata);
/* is eMMC/tSD exist */
bool is_emmc_exist(struct amlsd_host *host);
void aml_devm_pinctrl_put(struct amlsd_host *host);
/* void of_init_pins (struct amlsd_platform* pdata); */
#ifdef CONFIG_MMC_AML_DEBUG
void aml_dbg_verify_pull_up(struct amlsd_platform *pdata);
int aml_dbg_verify_pinmux(struct amlsd_platform *pdata);
#endif
#endif
#ifdef CONFIG_AMLOGIC_M8B_MMC
void aml_sdhc_print_reg_(u32 *buf);
extern void aml_sdhc_print_reg(struct amlsd_host *host);
void aml_dbg_print_pinmux(void);
extern size_t aml_sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
void *buf, size_t buflen, int to_buffer);
#endif
#ifdef CARD_DETECT_IRQ
void of_amlsd_irq_init(struct amlsd_platform *pdata);
irqreturn_t aml_sd_irq_cd(int irq, void *dev_id);
irqreturn_t aml_irq_cd_thread(int irq, void *data);
#else
void meson_mmc_cd_detect(struct work_struct *work);
#endif
int amlsd_get_platform_data(struct platform_device *pdev,
struct amlsd_platform *pdata,
struct mmc_host *mmc, u32 index);
int of_amlsd_init(struct amlsd_platform *pdata);
void of_amlsd_pwr_prepare(struct amlsd_platform *pdata);
void of_amlsd_pwr_on(struct amlsd_platform *pdata);
void of_amlsd_pwr_off(struct amlsd_platform *pdata);
void of_amlsd_xfer_pre(struct amlsd_platform *pdata);
void of_amlsd_xfer_post(struct amlsd_platform *pdata);
/* chip select high */
void aml_cs_high(struct mmc_host *mmc);
/* chip select don't care */
void aml_cs_dont_care(struct mmc_host *mmc);
void aml_snprint (char **pp, int *left_size, const char *fmt, ...);
int of_amlsd_ro(struct amlsd_platform *pdata);
int aml_sd_voltage_switch(struct mmc_host *mmc, char signal_voltage);
int aml_signal_voltage_switch(struct mmc_host *mmc, struct mmc_ios *ios);
int aml_check_unsupport_cmd(struct mmc_host *mmc, struct mmc_request *mrq);
extern void aml_emmc_hw_reset(struct mmc_host *mmc);
#endif