diff options
Diffstat (limited to 'arch/arm/mach-exynos/board-c1ctc-modems.c')
-rw-r--r-- | arch/arm/mach-exynos/board-c1ctc-modems.c | 1712 |
1 files changed, 0 insertions, 1712 deletions
diff --git a/arch/arm/mach-exynos/board-c1ctc-modems.c b/arch/arm/mach-exynos/board-c1ctc-modems.c deleted file mode 100644 index 85e35f5..0000000 --- a/arch/arm/mach-exynos/board-c1ctc-modems.c +++ /dev/null @@ -1,1712 +0,0 @@ -/* linux/arch/arm/mach-xxxx/board-c1ctc-modems.c - * Copyright (C) 2010 Samsung Electronics. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * 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/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/gpio.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/regulator/consumer.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/delay.h> -#include <linux/clk.h> -#include <linux/vmalloc.h> -#include <linux/if_arp.h> - -/* inlcude platform specific file */ -#include <linux/platform_data/modem.h> -#include <mach/sec_modem.h> -#include <mach/gpio.h> -#include <mach/gpio-exynos4.h> -#include <plat/gpio-cfg.h> -#include <mach/regs-mem.h> -#include <plat/regs-srom.h> - -#ifdef CONFIG_USBHUB_USB3503 -#include <linux/i2c.h> -#include <linux/i2c-gpio.h> -#include <linux/platform_data/usb3503.h> -#endif -#include <plat/devs.h> -#include <plat/ehci.h> - - -#define SROM_CS0_BASE 0x04000000 -#define SROM_WIDTH 0x01000000 -#define SROM_NUM_ADDR_BITS 14 - -/* - * For SROMC Configuration: - * SROMC_ADDR_BYTE enable for byte access - */ -#define SROMC_DATA_16 0x1 -#define SROMC_ADDR_BYTE 0x2 -#define SROMC_WAIT_EN 0x4 -#define SROMC_BYTE_EN 0x8 -#define SROMC_MASK 0xF - -/* Memory attributes */ -enum sromc_attr { - MEM_DATA_BUS_16BIT = 0x00000001, - MEM_BYTE_ADDRESSABLE = 0x00000002, - MEM_WAIT_EN = 0x00000004, - MEM_BYTE_EN = 0x00000008, - -}; - -/* DPRAM configuration */ -struct sromc_cfg { - enum sromc_attr attr; - unsigned size; - unsigned csn; /* CSn # */ - unsigned addr; /* Start address (physical) */ - unsigned end; /* End address (physical) */ -}; - -/* DPRAM access timing configuration */ -struct sromc_access_cfg { - u32 tacs; /* Address set-up before CSn */ - u32 tcos; /* Chip selection set-up before OEn */ - u32 tacc; /* Access cycle */ - u32 tcoh; /* Chip selection hold on OEn */ - u32 tcah; /* Address holding time after CSn */ - u32 tacp; /* Page mode access cycle at Page mode */ - u32 pmc; /* Page Mode config */ -}; - -/* For MDM6600 EDPRAM (External DPRAM) */ -#define MSM_EDPRAM_SIZE 0x4000 /* 16 KB */ - - -#define INT_MASK_REQ_ACK_F 0x0020 -#define INT_MASK_REQ_ACK_R 0x0010 -#define INT_MASK_RES_ACK_F 0x0008 -#define INT_MASK_RES_ACK_R 0x0004 -#define INT_MASK_SEND_F 0x0002 -#define INT_MASK_SEND_R 0x0001 - -#define INT_MASK_REQ_ACK_RFS 0x0400 /* Request RES_ACK_RFS */ -#define INT_MASK_RES_ACK_RFS 0x0200 /* Response of REQ_ACK_RFS */ -#define INT_MASK_SEND_RFS 0x0100 /* Indicate sending RFS data */ - - -/* Function prototypes */ -static void config_dpram_port_gpio(void); -static void init_sromc(void); -static void setup_sromc(unsigned csn, struct sromc_cfg *cfg, - struct sromc_access_cfg *acc_cfg); -static void setup_dpram_speed(unsigned csn, struct sromc_access_cfg *acc_cfg); -static int __init init_modem(void); - -#ifdef CONFIG_USBHUB_USB3503 -static int host_port_enable(int port, int enable); -#else -static int host_port_enable(int port, int enable) -{ - return s5p_ehci_port_control(&s5p_device_ehci, port, enable); -} -#endif - -static struct sromc_cfg msm_edpram_cfg = { - .attr = (MEM_DATA_BUS_16BIT | MEM_WAIT_EN | MEM_BYTE_EN), - .size = MSM_EDPRAM_SIZE, -}; - -static struct sromc_access_cfg msm_edpram_access_cfg[] = { - [DPRAM_SPEED_LOW] = { - .tacs = 0x2 << 28, - .tcos = 0x2 << 24, - .tacc = 0x3 << 16, - .tcoh = 0x2 << 12, - .tcah = 0x2 << 8, - .tacp = 0x2 << 4, - .pmc = 0x0 << 0, - }, -}; - -/* - magic_code + - access_enable + - fmt_tx_head + fmt_tx_tail + fmt_tx_buff + - raw_tx_head + raw_tx_tail + raw_tx_buff + - fmt_rx_head + fmt_rx_tail + fmt_rx_buff + - raw_rx_head + raw_rx_tail + raw_rx_buff + - padding + - mbx_cp2ap + - mbx_ap2cp - = 2 + - 2 + - 2 + 2 + 2044 + - 2 + 2 + 6128 + - 2 + 2 + 2044 + - 2 + 2 + 6128 + - 16 + - 2 + - 2 - = 16384 -*/ - -#define MSM_DP_FMT_TX_BUFF_SZ 2044 -#define MSM_DP_RAW_TX_BUFF_SZ 6128 -#define MSM_DP_FMT_RX_BUFF_SZ 2044 -#define MSM_DP_RAW_RX_BUFF_SZ 6128 - -#define MAX_MSM_EDPRAM_IPC_DEV 2 /* FMT, RAW */ - -struct msm_edpram_ipc_cfg { - u16 magic; - u16 access; - - u16 fmt_tx_head; - u16 fmt_tx_tail; - u8 fmt_tx_buff[MSM_DP_FMT_TX_BUFF_SZ]; - - u16 raw_tx_head; - u16 raw_tx_tail; - u8 raw_tx_buff[MSM_DP_RAW_TX_BUFF_SZ]; - - u16 fmt_rx_head; - u16 fmt_rx_tail; - u8 fmt_rx_buff[MSM_DP_FMT_RX_BUFF_SZ]; - - u16 raw_rx_head; - u16 raw_rx_tail; - u8 raw_rx_buff[MSM_DP_RAW_RX_BUFF_SZ]; - - u8 padding[16]; - u16 mbx_ap2cp; - u16 mbx_cp2ap; -}; - -struct msm_edpram_circ { - u16 __iomem *head; - u16 __iomem *tail; - u8 __iomem *buff; - u32 size; -}; - -struct msm_edpram_ipc_device { - char name[16]; - int id; - - struct msm_edpram_circ txq; - struct msm_edpram_circ rxq; - - u16 mask_req_ack; - u16 mask_res_ack; - u16 mask_send; -}; - -struct msm_edpram_ipc_map { - u16 __iomem *magic; - u16 __iomem *access; - - struct msm_edpram_ipc_device dev[MAX_MSM_EDPRAM_IPC_DEV]; - - u16 __iomem *mbx_ap2cp; - u16 __iomem *mbx_cp2ap; -}; - - -struct msm_edpram_boot_map { - u8 __iomem *buff; - u16 __iomem *frame_size; - u16 __iomem *tag; - u16 __iomem *count; -}; - -static struct msm_edpram_ipc_map msm_ipc_map; - -struct _param_nv { - unsigned char *addr; - unsigned int size; - unsigned int count; - unsigned int tag; -}; - - -#if (MSM_EDPRAM_SIZE == 0x4000) -/* ------------------- -Buffer : 15KByte ------------------- -Reserved: 1014Byte ------------------- -SIZE: 2Byte ------------------- -TAG: 2Byte ------------------- -COUNT: 2Byte ------------------- -AP -> CP Intr : 2Byte ------------------- -CP -> AP Intr : 2Byte ------------------- -*/ -#define DP_BOOT_CLEAR_OFFSET 4 -#define DP_BOOT_RSRVD_OFFSET 0x3C00 -#define DP_BOOT_SIZE_OFFSET 0x3FF6 -#define DP_BOOT_TAG_OFFSET 0x3FF8 -#define DP_BOOT_COUNT_OFFSET 0x3FFA - - -#define DP_BOOT_FRAME_SIZE_LIMIT 0x3C00 /* 15KB = 15360byte = 0x3C00 */ -#else -/* ------------------- -Buffer : 31KByte ------------------- -Reserved: 1014Byte ------------------- -SIZE: 2Byte ------------------- -TAG: 2Byte ------------------- -COUNT: 2Byte ------------------- -AP -> CP Intr : 2Byte ------------------- -CP -> AP Intr : 2Byte ------------------- -*/ -#define DP_BOOT_CLEAR_OFFSET 4 -#define DP_BOOT_RSRVD_OFFSET 0x7C00 -#define DP_BOOT_SIZE_OFFSET 0x7FF6 -#define DP_BOOT_TAG_OFFSET 0x7FF8 -#define DP_BOOT_COUNT_OFFSET 0x7FFA - - -#define DP_BOOT_FRAME_SIZE_LIMIT 0x7C00 /* 31KB = 31744byte = 0x7C00 */ -#endif - -struct _param_check { - unsigned int total_size; - unsigned int rest_size; - unsigned int send_size; - unsigned int copy_start; - unsigned int copy_complete; - unsigned int boot_complete; -}; - -static struct _param_nv *data_param; -static struct _param_check check_param; - -static unsigned int boot_start_complete; -static struct msm_edpram_boot_map msm_edpram_bt_map; -static struct msm_edpram_ipc_map msm_ipc_map; - -static void msm_edpram_reset(void); -static void msm_edpram_clr_intr(void); -static u16 msm_edpram_recv_intr(void); -static void msm_edpram_send_intr(u16 irq_mask); -static u16 msm_edpram_recv_msg(void); -static void msm_edpram_send_msg(u16 msg); - -static u16 msm_edpram_get_magic(void); -static void msm_edpram_set_magic(u16 value); -static u16 msm_edpram_get_access(void); -static void msm_edpram_set_access(u16 value); - -static u32 msm_edpram_get_tx_head(int dev_id); -static u32 msm_edpram_get_tx_tail(int dev_id); -static void msm_edpram_set_tx_head(int dev_id, u32 head); -static void msm_edpram_set_tx_tail(int dev_id, u32 tail); -static u8 __iomem *msm_edpram_get_tx_buff(int dev_id); -static u32 msm_edpram_get_tx_buff_size(int dev_id); - -static u32 msm_edpram_get_rx_head(int dev_id); -static u32 msm_edpram_get_rx_tail(int dev_id); -static void msm_edpram_set_rx_head(int dev_id, u32 head); -static void msm_edpram_set_rx_tail(int dev_id, u32 tail); -static u8 __iomem *msm_edpram_get_rx_buff(int dev_id); -static u32 msm_edpram_get_rx_buff_size(int dev_id); - -static u16 msm_edpram_get_mask_req_ack(int dev_id); -static u16 msm_edpram_get_mask_res_ack(int dev_id); -static u16 msm_edpram_get_mask_send(int dev_id); - -static void msm_log_disp(struct modemlink_dpram_control *dpctl); -static int msm_uload_step1(struct modemlink_dpram_control *dpctl); -static int msm_uload_step2(void *arg, struct modemlink_dpram_control *dpctl); -static int msm_dload_prep(struct modemlink_dpram_control *dpctl); -static int msm_dload(void *arg, struct modemlink_dpram_control *dpctl); -static int msm_nv_load(void *arg, struct modemlink_dpram_control *dpctl); -static int msm_boot_start(struct modemlink_dpram_control *dpctl); -static int msm_boot_start_post_proc(void); -static void msm_boot_start_handler(struct modemlink_dpram_control *dpctl); -static void msm_dload_handler(struct modemlink_dpram_control *dpctl, u16 cmd); -static void msm_bt_map_init(struct modemlink_dpram_control *dpctl); -static void msm_load_init(struct modemlink_dpram_control *dpctl); - -static struct modemlink_dpram_control msm_edpram_ctrl = { - .reset = msm_edpram_reset, - - .clear_intr = msm_edpram_clr_intr, - .recv_intr = msm_edpram_recv_intr, - .send_intr = msm_edpram_send_intr, - .recv_msg = msm_edpram_recv_msg, - .send_msg = msm_edpram_send_msg, - - .get_magic = msm_edpram_get_magic, - .set_magic = msm_edpram_set_magic, - .get_access = msm_edpram_get_access, - .set_access = msm_edpram_set_access, - - .get_tx_head = msm_edpram_get_tx_head, - .get_tx_tail = msm_edpram_get_tx_tail, - .set_tx_head = msm_edpram_set_tx_head, - .set_tx_tail = msm_edpram_set_tx_tail, - .get_tx_buff = msm_edpram_get_tx_buff, - .get_tx_buff_size = msm_edpram_get_tx_buff_size, - - .get_rx_head = msm_edpram_get_rx_head, - .get_rx_tail = msm_edpram_get_rx_tail, - .set_rx_head = msm_edpram_set_rx_head, - .set_rx_tail = msm_edpram_set_rx_tail, - .get_rx_buff = msm_edpram_get_rx_buff, - .get_rx_buff_size = msm_edpram_get_rx_buff_size, - - .get_mask_req_ack = msm_edpram_get_mask_req_ack, - .get_mask_res_ack = msm_edpram_get_mask_res_ack, - .get_mask_send = msm_edpram_get_mask_send, - - .log_disp = msm_log_disp, - .cpupload_step1 = msm_uload_step1, - .cpupload_step2 = msm_uload_step2, - .cpimage_load = msm_dload, - .nvdata_load = msm_nv_load, - .phone_boot_start = msm_boot_start, - .dload_cmd_hdlr = msm_dload_handler, - .bt_map_init = msm_bt_map_init, - .load_init = msm_load_init, - .cpimage_load_prepare = msm_dload_prep, - .phone_boot_start_post_process = msm_boot_start_post_proc, - .phone_boot_start_handler = msm_boot_start_handler, - - .dp_base = NULL, - .dp_size = 0, - .dp_type = EXT_DPRAM, - - .dpram_irq = MSM_DPRAM_INT_IRQ, - .dpram_irq_flags = IRQF_TRIGGER_FALLING, - .dpram_irq_name = "MDM6600_EDPRAM_IRQ", - .dpram_wlock_name = "MDM6600_EDPRAM_WLOCK", - - .max_ipc_dev = IPC_RFS, -}; - -/* -** CDMA target platform data -*/ -static struct modem_io_t cdma_io_devices[] = { - [0] = { - .name = "cdma_boot0", - .id = 0x1, - .format = IPC_BOOT, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [1] = { - .name = "cdma_ipc0", - .id = 0x1, - .format = IPC_FMT, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [2] = { - .name = "cdma_multipdp", - .id = 0x1, - .format = IPC_MULTI_RAW, - .io_type = IODEV_DUMMY, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [3] = { - .name = "cdma_CSD", - .id = (1|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [4] = { - .name = "cdma_FOTA", - .id = (2|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [5] = { - .name = "cdma_GPS", - .id = (5|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [6] = { - .name = "cdma_XTRA", - .id = (6|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [7] = { - .name = "cdma_CDMA", - .id = (7|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [8] = { - .name = "cdma_EFS", - .id = (8|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [9] = { - .name = "cdma_TRFB", - .id = (9|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [10] = { - .name = "rmnet0", - .id = 0x2A, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [11] = { - .name = "rmnet1", - .id = 0x2B, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [12] = { - .name = "rmnet2", - .id = 0x2C, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [13] = { - .name = "rmnet3", - .id = 0x2D, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [14] = { - .name = "cdma_SMD", - .id = (25|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [15] = { - .name = "cdma_VTVD", - .id = (26|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [16] = { - .name = "cdma_VTAD", - .id = (27|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [17] = { - .name = "cdma_VTCTRL", - .id = (28|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [18] = { - .name = "cdma_VTENT", - .id = (29|0x20), - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [19] = { - .name = "cdma_ramdump0", - .id = 0x1, - .format = IPC_RAMDUMP, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, -}; - -static struct modem_data cdma_modem_data = { - .name = "mdm6600", - - .gpio_cp_on = GPIO_CP_MSM_PWRON, - .gpio_cp_off = 0, - .gpio_reset_req_n = GPIO_CP_MSM_PMU_RST, - .gpio_cp_reset = GPIO_CP_MSM_RST, - .gpio_pda_active = GPIO_PDA_ACTIVE, - .gpio_phone_active = GPIO_MSM_PHONE_ACTIVE, - .gpio_flm_uart_sel = GPIO_BOOT_SW_SEL, - - .gpio_cp_dump_int = 0, - .gpio_cp_warm_reset = 0, - - .use_handover = false, - - .modem_net = CDMA_NETWORK, - .modem_type = QC_MDM6600, - .link_types = LINKTYPE(LINKDEV_DPRAM), - .link_name = "mdm6600_edpram", - .dpram_ctl = &msm_edpram_ctrl, - - .num_iodevs = ARRAY_SIZE(cdma_io_devices), - .iodevs = cdma_io_devices, -}; - -static struct resource cdma_modem_res[] = { - [0] = { - .name = "cp_active_irq", - .start = MSM_PHONE_ACTIVE_IRQ, - .end = MSM_PHONE_ACTIVE_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device cdma_modem = { - .name = "modem_if", - .id = 2, - .num_resources = ARRAY_SIZE(cdma_modem_res), - .resource = cdma_modem_res, - .dev = { - .platform_data = &cdma_modem_data, - }, -}; - -static void msm_edpram_reset(void) -{ - return; -} - -static void msm_edpram_clr_intr(void) -{ - ioread16(msm_ipc_map.mbx_cp2ap); -} - -static u16 msm_edpram_recv_intr(void) -{ - return ioread16(msm_ipc_map.mbx_cp2ap); -} - -static void msm_edpram_send_intr(u16 irq_mask) -{ - iowrite16(irq_mask, msm_ipc_map.mbx_ap2cp); -} - -static u16 msm_edpram_recv_msg(void) -{ - return ioread16(msm_ipc_map.mbx_cp2ap); -} - -static void msm_edpram_send_msg(u16 msg) -{ - iowrite16(msg, msm_ipc_map.mbx_ap2cp); -} - -static u16 msm_edpram_get_magic(void) -{ - return ioread16(msm_ipc_map.magic); -} - -static void msm_edpram_set_magic(u16 value) -{ - iowrite16(value, msm_ipc_map.magic); -} - -static u16 msm_edpram_get_access(void) -{ - return ioread16(msm_ipc_map.access); -} - -static void msm_edpram_set_access(u16 value) -{ - iowrite16(value, msm_ipc_map.access); -} - -static u32 msm_edpram_get_tx_head(int dev_id) -{ - return ioread16(msm_ipc_map.dev[dev_id].txq.head); -} - -static u32 msm_edpram_get_tx_tail(int dev_id) -{ - return ioread16(msm_ipc_map.dev[dev_id].txq.tail); -} - -static void msm_edpram_set_tx_head(int dev_id, u32 head) -{ - iowrite16((u16)head, msm_ipc_map.dev[dev_id].txq.head); -} - -static void msm_edpram_set_tx_tail(int dev_id, u32 tail) -{ - iowrite16((u16)tail, msm_ipc_map.dev[dev_id].txq.tail); -} - -static u8 __iomem *msm_edpram_get_tx_buff(int dev_id) -{ - return msm_ipc_map.dev[dev_id].txq.buff; -} - -static u32 msm_edpram_get_tx_buff_size(int dev_id) -{ - return msm_ipc_map.dev[dev_id].txq.size; -} - -static u32 msm_edpram_get_rx_head(int dev_id) -{ - return ioread16(msm_ipc_map.dev[dev_id].rxq.head); -} - -static u32 msm_edpram_get_rx_tail(int dev_id) -{ - return ioread16(msm_ipc_map.dev[dev_id].rxq.tail); -} - -static void msm_edpram_set_rx_head(int dev_id, u32 head) -{ - return iowrite16((u16)head, msm_ipc_map.dev[dev_id].rxq.head); -} - -static void msm_edpram_set_rx_tail(int dev_id, u32 tail) -{ - return iowrite16((u16)tail, msm_ipc_map.dev[dev_id].rxq.tail); -} - -static u8 __iomem *msm_edpram_get_rx_buff(int dev_id) -{ - return msm_ipc_map.dev[dev_id].rxq.buff; -} - -static u32 msm_edpram_get_rx_buff_size(int dev_id) -{ - return msm_ipc_map.dev[dev_id].rxq.size; -} - -static u16 msm_edpram_get_mask_req_ack(int dev_id) -{ - return msm_ipc_map.dev[dev_id].mask_req_ack; -} - -static u16 msm_edpram_get_mask_res_ack(int dev_id) -{ - return msm_ipc_map.dev[dev_id].mask_res_ack; -} - -static u16 msm_edpram_get_mask_send(int dev_id) -{ - return msm_ipc_map.dev[dev_id].mask_send; -} - -static void msm_log_disp(struct modemlink_dpram_control *dpctl) -{ - static unsigned char buf[151]; - u8 __iomem *tmp_buff = NULL; - - tmp_buff = dpctl->get_rx_buff(IPC_FMT); - memcpy(buf, tmp_buff, (sizeof(buf)-1)); - - pr_info("[LNK] | PHONE ERR MSG\t| CDMA Crash\n"); - pr_info("[LNK] | PHONE ERR MSG\t| %s\n", buf); -} - -static int msm_data_upload(struct _param_nv *param, - struct modemlink_dpram_control *dpctl) -{ - int retval = 0; - u16 in_interrupt = 0; - int count = 0; - - while (1) { - if (!gpio_get_value(GPIO_MSM_DPRAM_INT)) { - in_interrupt = dpctl->recv_msg(); - if (in_interrupt == 0xDBAB) { - break; - } else { - pr_err("[LNK][intr]:0x%08x\n", in_interrupt); - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - msleep_interruptible(1); - count++; - if (count > 200) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - - param->size = ioread16(msm_edpram_bt_map.frame_size); - memcpy(param->addr, msm_edpram_bt_map.buff, param->size); - param->tag = ioread16(msm_edpram_bt_map.tag); - param->count = ioread16(msm_edpram_bt_map.count); - - dpctl->clear_intr(); - dpctl->send_msg(0xDB12); - - return retval; - -} - -static int msm_data_load(struct _param_nv *param, - struct modemlink_dpram_control *dpctl) -{ - int retval = 0; - - if (param->size <= DP_BOOT_FRAME_SIZE_LIMIT) { - memcpy(msm_edpram_bt_map.buff, param->addr, param->size); - iowrite16(param->size, msm_edpram_bt_map.frame_size); - iowrite16(param->tag, msm_edpram_bt_map.tag); - iowrite16(param->count, msm_edpram_bt_map.count); - - dpctl->clear_intr(); - dpctl->send_msg(0xDB12); - - } else { - pr_err("[LNK/E]<%s> size:0x%x\n", __func__, param->size); - } - - return retval; -} - -static int msm_uload_step1(struct modemlink_dpram_control *dpctl) -{ - int retval = 0; - int count = 0; - u16 in_interrupt = 0, out_interrupt = 0; - - pr_info("[LNK] +---------------------------------------------+\n"); - pr_info("[LNK] | UPLOAD PHONE SDRAM |\n"); - pr_info("[LNK] +---------------------------------------------+\n"); - - while (1) { - if (!gpio_get_value(GPIO_MSM_DPRAM_INT)) { - in_interrupt = dpctl->recv_msg(); - pr_info("[LNK] [in_interrupt] 0x%04x\n", in_interrupt); - if (in_interrupt == 0x1234) { - break; - } else { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - msleep_interruptible(1); - count++; - if (count > 200) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - in_interrupt = dpctl->recv_msg(); - if (in_interrupt == 0x1234) { - pr_info("[LNK] [in_interrupt]: 0x%04x\n", - in_interrupt); - break; - } - return -1; - } - } - out_interrupt = 0xDEAD; - dpctl->send_msg(out_interrupt); - - return retval; -} - -static int msm_uload_step2(void *arg, - struct modemlink_dpram_control *dpctl) -{ - int retval = 0; - struct _param_nv param; - - retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); - if (retval < 0) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - - retval = msm_data_upload(¶m, dpctl); - if (retval < 0) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - - if (!(param.count % 500)) - pr_info("[LNK] [param->count]:%d\n", param.count); - - if (param.tag == 4) { - dpctl->clear_intr(); - enable_irq(msm_edpram_ctrl.dpram_irq); - pr_info("[LNK] [param->tag]:%d\n", param.tag); - } - - retval = copy_to_user((unsigned long *)arg, ¶m, sizeof(param)); - if (retval < 0) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - - return retval; -} - -static int msm_dload_prep(struct modemlink_dpram_control *dpctl) -{ - int retval = 0; - int count = 0; - - while (1) { - if (check_param.copy_start) { - check_param.copy_start = 0; - break; - } - msleep_interruptible(10); - count++; - if (count > 200) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - - return retval; -} - -static int msm_dload(void *arg, struct modemlink_dpram_control *dpctl) -{ - int retval = 0; - int count = 0; - unsigned char *img = NULL; - struct _param_nv param; - - retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); - if (retval < 0) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - - img = vmalloc(param.size); - if (img == NULL) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - memset(img, 0, param.size); - memcpy(img, param.addr, param.size); - - data_param = kzalloc(sizeof(struct _param_nv), GFP_KERNEL); - if (data_param == NULL) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - vfree(img); - return -1; - } - - check_param.total_size = param.size; - check_param.rest_size = param.size; - check_param.send_size = 0; - check_param.copy_complete = 0; - - data_param->addr = img; - data_param->size = DP_BOOT_FRAME_SIZE_LIMIT; - data_param->count = param.count; - - data_param->tag = 0x0001; - - if (check_param.rest_size < DP_BOOT_FRAME_SIZE_LIMIT) - data_param->size = check_param.rest_size; - - retval = msm_data_load(data_param, dpctl); - - while (1) { - if (check_param.copy_complete) { - check_param.copy_complete = 0; - - vfree(img); - kfree(data_param); - - break; - } - msleep_interruptible(10); - count++; - if (count > 1000) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - vfree(img); - kfree(data_param); - return -1; - } - } - - return retval; - -} - -static int msm_nv_load(void *arg, struct modemlink_dpram_control *dpctl) -{ - int retval = 0; - int count = 0; - unsigned char *img = NULL; - struct _param_nv param; - - retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); - if (retval < 0) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - - img = vmalloc(param.size); - if (img == NULL) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - memset(img, 0, param.size); - memcpy(img, param.addr, param.size); - - data_param = kzalloc(sizeof(struct _param_nv), GFP_KERNEL); - if (data_param == NULL) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - vfree(img); - return -1; - } - - check_param.total_size = param.size; - check_param.rest_size = param.size; - check_param.send_size = 0; - check_param.copy_complete = 0; - - data_param->addr = img; - data_param->size = DP_BOOT_FRAME_SIZE_LIMIT; - data_param->count = 1; - data_param->tag = 0x0002; - - if (check_param.rest_size < DP_BOOT_FRAME_SIZE_LIMIT) - data_param->size = check_param.rest_size; - - retval = msm_data_load(data_param, dpctl); - - while (1) { - if (check_param.copy_complete) { - check_param.copy_complete = 0; - - vfree(img); - kfree(data_param); - - break; - } - msleep_interruptible(10); - count++; - if (count > 200) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - vfree(img); - kfree(data_param); - return -1; - } - } - - return retval; - -} - -static int msm_boot_start(struct modemlink_dpram_control *dpctl) -{ - - u16 out_interrupt = 0; - int count = 0; - - /* Send interrupt -> '0x4567' */ - out_interrupt = 0x4567; - dpctl->send_msg(out_interrupt); - - while (1) { - if (check_param.boot_complete) { - check_param.boot_complete = 0; - break; - } - msleep_interruptible(10); - count++; - if (count > 200) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - - return 0; -} - -static struct modemlink_dpram_control *tasklet_dpctl; - -static void interruptable_load_tasklet_handler(unsigned long data); - -static DECLARE_TASKLET(interruptable_load_tasklet, - interruptable_load_tasklet_handler, (unsigned long) &tasklet_dpctl); - -static void interruptable_load_tasklet_handler(unsigned long data) -{ - struct modemlink_dpram_control *dpctl = - (struct modemlink_dpram_control *) - (*((struct modemlink_dpram_control **) data)); - - if (data_param == NULL) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return; - } - - check_param.send_size += data_param->size; - check_param.rest_size -= data_param->size; - data_param->addr += data_param->size; - - if (check_param.send_size < check_param.total_size) { - - if (check_param.rest_size < DP_BOOT_FRAME_SIZE_LIMIT) - data_param->size = check_param.rest_size; - - - data_param->count += 1; - - msm_data_load(data_param, dpctl); - } else { - data_param->tag = 0; - check_param.copy_complete = 1; - } - -} - -static int msm_boot_start_post_proc(void) -{ - int count = 0; - - while (1) { - if (boot_start_complete) { - boot_start_complete = 0; - break; - } - msleep_interruptible(10); - count++; - if (count > 200) { - pr_err("[LNK/E]<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - - return 0; -} - -static void msm_boot_start_handler(struct modemlink_dpram_control *dpctl) -{ - boot_start_complete = 1; - - /* Send INIT_END code to CP */ - pr_info("[LNK] <%s> Send 0x11C2 (INIT_END)\n", __func__); - - /* - * INT_MASK_VALID|INT_MASK_CMD|INT_MASK_CP_AIRPLANE_BOOT| - * INT_MASK_CP_AP_ANDROID|INT_MASK_CMD_INIT_END - */ - dpctl->send_intr((0x0080|0x0040|0x1000|0x0100|0x0002)); -} - -static void msm_dload_handler(struct modemlink_dpram_control *dpctl, u16 cmd) -{ - switch (cmd) { - case 0x1234: - check_param.copy_start = 1; - break; - - case 0xDBAB: - tasklet_schedule(&interruptable_load_tasklet); - break; - - case 0xABCD: - check_param.boot_complete = 1; - break; - - default: - pr_err("[LNK/Err] <%s> Unknown command.. %x\n", __func__, cmd); - } -} - -static void msm_bt_map_init(struct modemlink_dpram_control *dpctl) -{ - msm_edpram_bt_map.buff = (u8 *)(dpctl->dp_base); - msm_edpram_bt_map.frame_size = - (u16 *)(dpctl->dp_base + DP_BOOT_SIZE_OFFSET); - msm_edpram_bt_map.tag = - (u16 *)(dpctl->dp_base + DP_BOOT_TAG_OFFSET); - msm_edpram_bt_map.count = - (u16 *)(dpctl->dp_base + DP_BOOT_COUNT_OFFSET); -} - - -static void msm_load_init(struct modemlink_dpram_control *dpctl) -{ - tasklet_dpctl = dpctl; - if (tasklet_dpctl == NULL) - pr_err("[LNK/Err] failed tasklet_dpctl remap\n"); - - check_param.total_size = 0; - check_param.rest_size = 0; - check_param.send_size = 0; - check_param.copy_start = 0; - check_param.copy_complete = 0; - check_param.boot_complete = 0; - - dpctl->clear_intr(); -} - -static void config_cdma_modem_gpio(void) -{ - int err; - unsigned gpio_cp_on = cdma_modem_data.gpio_cp_on; - unsigned gpio_cp_off = cdma_modem_data.gpio_cp_off; - unsigned gpio_rst_req_n = cdma_modem_data.gpio_reset_req_n; - unsigned gpio_cp_rst = cdma_modem_data.gpio_cp_reset; - unsigned gpio_pda_active = cdma_modem_data.gpio_pda_active; - unsigned gpio_phone_active = cdma_modem_data.gpio_phone_active; - unsigned gpio_flm_uart_sel = cdma_modem_data.gpio_flm_uart_sel; - - pr_info("[MODEMS] <%s>\n", __func__); - - if (gpio_pda_active) { - err = gpio_request(gpio_pda_active, "PDA_ACTIVE"); - if (err) { - pr_err("fail to request gpio %s\n", "PDA_ACTIVE"); - } else { - gpio_direction_output(gpio_pda_active, 1); - s3c_gpio_setpull(gpio_pda_active, S3C_GPIO_PULL_NONE); - gpio_set_value(gpio_pda_active, 0); - } - } - - if (gpio_phone_active) { - err = gpio_request(gpio_phone_active, "MSM_ACTIVE"); - if (err) { - pr_err("fail to request gpio %s\n", "MSM_ACTIVE"); - } else { - s3c_gpio_cfgpin(gpio_phone_active, S3C_GPIO_SFN(0xF)); - s3c_gpio_setpull(gpio_phone_active, S3C_GPIO_PULL_NONE); - irq_set_irq_type(gpio_phone_active, IRQ_TYPE_EDGE_BOTH); - } - } - - if (gpio_flm_uart_sel) { - err = gpio_request(gpio_flm_uart_sel, "BOOT_SW_SEL"); - if (err) { - pr_err("fail to request gpio %s\n", "BOOT_SW_SEL"); - } else { - gpio_direction_output(gpio_flm_uart_sel, 1); - s3c_gpio_setpull(gpio_flm_uart_sel, S3C_GPIO_PULL_NONE); - gpio_set_value(gpio_flm_uart_sel, 1); - } - } - - if (gpio_cp_on) { - err = gpio_request(gpio_cp_on, "MSM_ON"); - if (err) { - pr_err("fail to request gpio %s\n", "MSM_ON"); - } else { - gpio_direction_output(gpio_cp_on, 1); - s3c_gpio_setpull(gpio_cp_on, S3C_GPIO_PULL_NONE); - gpio_set_value(gpio_cp_on, 0); - } - } - - if (gpio_cp_off) { - err = gpio_request(gpio_cp_off, "MSM_OFF"); - if (err) { - pr_err("fail to request gpio %s\n", "MSM_OFF"); - } else { - gpio_direction_output(gpio_cp_off, 1); - s3c_gpio_setpull(gpio_cp_off, S3C_GPIO_PULL_NONE); - gpio_set_value(gpio_cp_off, 1); - } - } - - if (gpio_rst_req_n) { - err = gpio_request(gpio_rst_req_n, "MSM_RST_REQ"); - if (err) { - pr_err("fail to request gpio %s\n", "MSM_RST_REQ"); - } else { - gpio_direction_output(gpio_rst_req_n, 1); - s3c_gpio_setpull(gpio_rst_req_n, S3C_GPIO_PULL_NONE); - } - gpio_set_value(gpio_rst_req_n, 0); - } - - if (gpio_cp_rst) { - err = gpio_request(gpio_cp_rst, "MSM_RST"); - if (err) { - pr_err("fail to request gpio %s\n", "MSM_RST"); - } else { - gpio_direction_output(gpio_cp_rst, 1); - s3c_gpio_setpull(gpio_cp_rst, S3C_GPIO_PULL_NONE); - } - gpio_set_value(gpio_cp_rst, 0); - } -} - -static u8 *msm_edpram_remap_mem_region(struct sromc_cfg *cfg) -{ - int dp_addr = 0; - int dp_size = 0; - u8 __iomem *dp_base = NULL; - struct msm_edpram_ipc_cfg *ipc_map = NULL; - struct msm_edpram_ipc_device *dev = NULL; - - dp_addr = cfg->addr; - dp_size = cfg->size; - dp_base = (u8 *)ioremap_nocache(dp_addr, dp_size); - if (!dp_base) { - pr_err("[MDM] <%s> dpram base ioremap fail\n", __func__); - return NULL; - } - pr_info("[MDM] <%s> DPRAM VA=0x%08X\n", __func__, (int)dp_base); - - msm_edpram_ctrl.dp_base = (u8 __iomem *)dp_base; - msm_edpram_ctrl.dp_size = dp_size; - - /* Map for IPC */ - ipc_map = (struct msm_edpram_ipc_cfg *)dp_base; - - /* Magic code and access enable fields */ - msm_ipc_map.magic = (u16 __iomem *)&ipc_map->magic; - msm_ipc_map.access = (u16 __iomem *)&ipc_map->access; - - /* FMT */ - dev = &msm_ipc_map.dev[IPC_FMT]; - - strcpy(dev->name, "FMT"); - dev->id = IPC_FMT; - - dev->txq.head = (u16 __iomem *)&ipc_map->fmt_tx_head; - dev->txq.tail = (u16 __iomem *)&ipc_map->fmt_tx_tail; - dev->txq.buff = (u8 __iomem *)&ipc_map->fmt_tx_buff[0]; - dev->txq.size = MSM_DP_FMT_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&ipc_map->fmt_rx_head; - dev->rxq.tail = (u16 __iomem *)&ipc_map->fmt_rx_tail; - dev->rxq.buff = (u8 __iomem *)&ipc_map->fmt_rx_buff[0]; - dev->rxq.size = MSM_DP_FMT_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_F; - dev->mask_res_ack = INT_MASK_RES_ACK_F; - dev->mask_send = INT_MASK_SEND_F; - - /* RAW */ - dev = &msm_ipc_map.dev[IPC_RAW]; - - strcpy(dev->name, "RAW"); - dev->id = IPC_RAW; - - dev->txq.head = (u16 __iomem *)&ipc_map->raw_tx_head; - dev->txq.tail = (u16 __iomem *)&ipc_map->raw_tx_tail; - dev->txq.buff = (u8 __iomem *)&ipc_map->raw_tx_buff[0]; - dev->txq.size = MSM_DP_RAW_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&ipc_map->raw_rx_head; - dev->rxq.tail = (u16 __iomem *)&ipc_map->raw_rx_tail; - dev->rxq.buff = (u8 __iomem *)&ipc_map->raw_rx_buff[0]; - dev->rxq.size = MSM_DP_RAW_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_R; - dev->mask_res_ack = INT_MASK_RES_ACK_R; - dev->mask_send = INT_MASK_SEND_R; - -#if 0 - /* RFS */ - dev = &msm_ipc_map.dev[IPC_RFS]; - - strcpy(dev->name, "RFS"); - dev->id = IPC_RFS; - - dev->txq.head = (u16 __iomem *)&ipc_map->rfs_tx_head; - dev->txq.tail = (u16 __iomem *)&ipc_map->rfs_tx_tail; - dev->txq.buff = (u8 __iomem *)&ipc_map->rfs_tx_buff[0]; - dev->txq.size = MSM_DP_RFS_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&ipc_map->rfs_rx_head; - dev->rxq.tail = (u16 __iomem *)&ipc_map->rfs_rx_tail; - dev->rxq.buff = (u8 __iomem *)&ipc_map->rfs_rx_buff[0]; - dev->rxq.size = MSM_DP_RFS_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_RFS; - dev->mask_res_ack = INT_MASK_RES_ACK_RFS; - dev->mask_send = INT_MASK_SEND_RFS; -#endif - - /* Mailboxes */ - msm_ipc_map.mbx_ap2cp = (u16 __iomem *)&ipc_map->mbx_ap2cp; - msm_ipc_map.mbx_cp2ap = (u16 __iomem *)&ipc_map->mbx_cp2ap; - - return dp_base; -} - -/** - * DPRAM GPIO settings - * - * SROM_NUM_ADDR_BITS value indicate the address line number or - * the mux/demux dpram type. if you want to set mux mode, define the - * SROM_NUM_ADDR_BITS to zero. - * - * for CMC22x - * CMC22x has 16KB + a SFR register address. - * It used 14 bits (13bits for 16KB word address and 1 bit for SFR - * register) - */ -static void config_dpram_port_gpio(void) -{ - int addr_bits = SROM_NUM_ADDR_BITS; - - pr_info("[MDM] <%s> address line = %d bits\n", __func__, addr_bits); - - /* - ** Config DPRAM address/data GPIO pins - */ - - /* Set GPIO for dpram address */ - switch (addr_bits) { - case 0: - break; - - case 13 ... 14: - s3c_gpio_cfgrange_nopull(EXYNOS4_GPY3(0), EXYNOS4_GPIO_Y3_NR, - S3C_GPIO_SFN(2)); - s3c_gpio_cfgrange_nopull(EXYNOS4_GPY4(0), - addr_bits - EXYNOS4_GPIO_Y3_NR, S3C_GPIO_SFN(2)); - pr_info("[MDM] <%s> last data gpio EXYNOS4_GPY4(0) ~ %d\n", - __func__, addr_bits - EXYNOS4_GPIO_Y3_NR); - break; - - default: - pr_err("[MDM/E] <%s> Invalid addr_bits!!!\n", __func__); - return; - } - - /* Set GPIO for dpram data - 16bit */ - s3c_gpio_cfgrange_nopull(EXYNOS4_GPY5(0), 8, S3C_GPIO_SFN(2)); - s3c_gpio_cfgrange_nopull(EXYNOS4_GPY6(0), 8, S3C_GPIO_SFN(2)); - - /* Setup SROMC CSn pins */ - s3c_gpio_cfgpin(GPIO_DPRAM_CSN0, S3C_GPIO_SFN(2)); - - /* Config OEn, WEn */ - s3c_gpio_cfgrange_nopull(GPIO_DPRAM_REN, 2, S3C_GPIO_SFN(2)); - - /* Config LBn, UBn */ - s3c_gpio_cfgrange_nopull(GPIO_DPRAM_LBN, 2, S3C_GPIO_SFN(2)); - - /* Config BUSY */ - s3c_gpio_cfgpin(GPIO_DPRAM_BUSY, S3C_GPIO_SFN(2)); -} - -static void init_sromc(void) -{ - struct clk *clk = NULL; - - /* SROMC clk enable */ - clk = clk_get(NULL, "sromc"); - if (!clk) { - pr_err("[MDM/E] <%s> SROMC clock gate fail\n", __func__); - return; - } - clk_enable(clk); -} - -static void setup_sromc -( - unsigned csn, - struct sromc_cfg *cfg, - struct sromc_access_cfg *acc_cfg -) -{ - unsigned bw = 0; - unsigned bc = 0; - void __iomem *bank_sfr = S5P_SROM_BC0 + (4 * csn); - - pr_err("[MDM] <%s> SROMC settings for CS%d...\n", __func__, csn); - - bw = __raw_readl(S5P_SROM_BW); - bc = __raw_readl(bank_sfr); - pr_err("[MDM] <%s> Old SROMC settings = BW(0x%08X), BC%d(0x%08X)\n", - __func__, bw, csn, bc); - - /* Set the BW control field for the CSn */ - bw &= ~(SROMC_MASK << (csn * 4)); - - if (cfg->attr | MEM_DATA_BUS_16BIT) - bw |= (SROMC_DATA_16 << (csn * 4)); - - if (cfg->attr | MEM_WAIT_EN) - bw |= (SROMC_WAIT_EN << (csn * 4)); - - if (cfg->attr | MEM_BYTE_EN) - bw |= (SROMC_BYTE_EN << (csn * 4)); - - writel(bw, S5P_SROM_BW); - - /* Set SROMC memory access timing for the CSn */ - bc = acc_cfg->tacs | acc_cfg->tcos | acc_cfg->tacc | - acc_cfg->tcoh | acc_cfg->tcah | acc_cfg->tacp | acc_cfg->pmc; - - writel(bc, bank_sfr); - - /* Verify SROMC settings */ - bw = __raw_readl(S5P_SROM_BW); - bc = __raw_readl(bank_sfr); - pr_err("[MDM] <%s> New SROMC settings = BW(0x%08X), BC%d(0x%08X)\n", - __func__, bw, csn, bc); -} - -static void setup_dpram_speed(unsigned csn, struct sromc_access_cfg *acc_cfg) -{ - void __iomem *bank_sfr = S5P_SROM_BC0 + (4 * csn); - unsigned bc = 0; - - bc = __raw_readl(bank_sfr); - pr_info("[MDM] <%s> Old CS%d setting = 0x%08X\n", __func__, csn, bc); - - /* SROMC memory access timing setting */ - bc = acc_cfg->tacs | acc_cfg->tcos | acc_cfg->tacc | - acc_cfg->tcoh | acc_cfg->tcah | acc_cfg->tacp | acc_cfg->pmc; - writel(bc, bank_sfr); - - bc = __raw_readl(bank_sfr); - pr_err("[MDM] <%s> New CS%d setting = 0x%08X\n", __func__, csn, bc); -} - -static int __init init_modem(void) -{ - struct sromc_cfg *cfg = NULL; - struct sromc_access_cfg *acc_cfg = NULL; - - msm_edpram_cfg.csn = 0; - msm_edpram_cfg.addr = SROM_CS0_BASE + (SROM_WIDTH * msm_edpram_cfg.csn); - msm_edpram_cfg.end = msm_edpram_cfg.addr + msm_edpram_cfg.size - 1; - - config_dpram_port_gpio(); - config_cdma_modem_gpio(); - - init_sromc(); - cfg = &msm_edpram_cfg; - acc_cfg = &msm_edpram_access_cfg[DPRAM_SPEED_LOW]; - setup_sromc(cfg->csn, cfg, acc_cfg); - - if (!msm_edpram_remap_mem_region(&msm_edpram_cfg)) - return -1; - platform_device_register(&cdma_modem); - - return 0; -} -late_initcall(init_modem); -/*device_initcall(init_modem);*/ - -#ifdef CONFIG_USBHUB_USB3503 -static int (*usbhub_set_mode)(struct usb3503_hubctl *, int); -static struct usb3503_hubctl *usbhub_ctl; - -void set_host_states(struct platform_device *pdev, int type) -{ -} - -static int usb3503_hub_handler(void (*set_mode)(void), void *ctl) -{ - if (!set_mode || !ctl) - return -EINVAL; - - usbhub_set_mode = (int (*)(struct usb3503_hubctl *, int))set_mode; - usbhub_ctl = (struct usb3503_hubctl *)ctl; - - pr_info("[MDM] <%s> set_mode(%pF)\n", __func__, set_mode); - - return 0; -} - -static int usb3503_hw_config(void) -{ - int err; - - err = gpio_request(GPIO_USB_HUB_CONNECT, "HUB_CONNECT"); - if (err) { - pr_err("fail to request gpio %s\n", "HUB_CONNECT"); - } else { - gpio_direction_output(GPIO_USB_HUB_CONNECT, 0); - s3c_gpio_setpull(GPIO_USB_HUB_CONNECT, S3C_GPIO_PULL_NONE); - } - s5p_gpio_set_drvstr(GPIO_USB_HUB_CONNECT, S5P_GPIO_DRVSTR_LV1); - - err = gpio_request(GPIO_USB_BOOT_EN, "USB_BOOT_EN"); - if (err) { - pr_err("fail to request gpio %s\n", "USB_BOOT_EN"); - } else { - gpio_direction_output(GPIO_USB_BOOT_EN, 1); - s3c_gpio_setpull(GPIO_USB_BOOT_EN, S3C_GPIO_PULL_NONE); - } - msleep(100); - - err = gpio_request(GPIO_USB_HUB_RST, "HUB_RST"); - if (err) { - pr_err("fail to request gpio %s\n", "HUB_RST"); - } else { - gpio_direction_output(GPIO_USB_HUB_RST, 0); - s3c_gpio_setpull(GPIO_USB_HUB_RST, S3C_GPIO_PULL_NONE); - } - s5p_gpio_set_drvstr(GPIO_USB_HUB_RST, S5P_GPIO_DRVSTR_LV1); - /* need to check drvstr 1 or 2 */ - - /* for USB3503 26Mhz Reference clock setting */ - err = gpio_request(GPIO_USB_HUB_INT, "HUB_INT"); - if (err) { - pr_err("fail to request gpio %s\n", "HUB_INT"); - } else { - gpio_direction_output(GPIO_USB_HUB_INT, 1); - s3c_gpio_setpull(GPIO_USB_HUB_INT, S3C_GPIO_PULL_NONE); - } - - return 0; -} - -static int usb3503_reset_n(int val) -{ - gpio_set_value(GPIO_USB_HUB_RST, 0); - msleep(20); - pr_info("[MDM] <%s> val = %d\n", __func__, - gpio_get_value(GPIO_USB_HUB_RST)); - gpio_set_value(GPIO_USB_HUB_RST, !!val); - - pr_info("[MDM] <%s> val = %d\n", __func__, - gpio_get_value(GPIO_USB_HUB_RST)); - - udelay(5); /* need it ?*/ - return 0; -} - -static struct usb3503_platform_data usb3503_pdata = { - .initial_mode = USB3503_MODE_STANDBY, - .reset_n = usb3503_reset_n, - .register_hub_handler = usb3503_hub_handler, - .port_enable = host_port_enable, -}; - -static struct i2c_board_info i2c_devs20_emul[] __initdata = { - { - I2C_BOARD_INFO(USB3503_I2C_NAME, 0x08), - .platform_data = &usb3503_pdata, - }, -}; - -/* I2C20_EMUL */ -static struct i2c_gpio_platform_data i2c20_platdata = { - .sda_pin = GPIO_USB_HUB_SDA, - .scl_pin = GPIO_USB_HUB_SCL, - /*FIXME: need to timming tunning... */ - .udelay = 20, -}; - -static struct platform_device s3c_device_i2c20 = { - .name = "i2c-gpio", - .id = 20, - .dev.platform_data = &i2c20_platdata, -}; - -static int __init init_usbhub(void) -{ - usb3503_hw_config(); - i2c_register_board_info(20, i2c_devs20_emul, - ARRAY_SIZE(i2c_devs20_emul)); - - platform_device_register(&s3c_device_i2c20); - return 0; -} - -device_initcall(init_usbhub); - -static int host_port_enable(int port, int enable) -{ - int err, retry = 30; - - pr_info("[MDM] <%s> port(%d) control(%d)\n", __func__, port, enable); - - if (enable) { - err = usbhub_set_mode(usbhub_ctl, USB3503_MODE_HUB); - if (err < 0) { - pr_err("[MDM] <%s> hub on fail\n", __func__); - goto exit; - } - err = s5p_ehci_port_control(&s5p_device_ehci, port, 1); - if (err < 0) { - pr_err("[MDM] <%s> port(%d) enable fail\n", __func__, - port); - goto exit; - } -#ifdef CONFIG_LTE_MODEM_CMC221 - msleep(20); - err = gpio_direction_output(umts_modem_data.gpio_slave_wakeup, - 1); - pr_err("[MDM] <%s> slave wakeup err(%d), en(%d), level(%d)\n", - __func__, err, 1, - gpio_get_value(umts_modem_data.gpio_slave_wakeup)); - - while (!gpio_get_value(umts_modem_data.gpio_slave_wakeup) - && retry--) - msleep(20); - pr_err("[MDM] <%s> Host wakeup (%d) retry(%d)\n", __func__, - gpio_get_value(umts_modem_data.gpio_host_wakeup), - retry); - err = gpio_direction_output(umts_modem_data.gpio_slave_wakeup, - 0); - pr_err("[MDM] <%s> slave wakeup err(%d), en(%d), level(%d)\n", - __func__, err, 0, - gpio_get_value(umts_modem_data.gpio_slave_wakeup)); -#endif - } else { - err = s5p_ehci_port_control(&s5p_device_ehci, port, 0); - if (err < 0) { - pr_err("[MDM] <%s> port(%d) enable fail\n", __func__, - port); - goto exit; - } - err = usbhub_set_mode(usbhub_ctl, USB3503_MODE_STANDBY); - if (err < 0) { - pr_err("[MDM] <%s> hub off fail\n", __func__); - goto exit; - } - } - -#ifdef CONFIG_LTE_MODEM_CMC221 - err = gpio_direction_output(umts_modem_data.gpio_host_active, enable); - pr_info("[MDM] <%s> active state err(%d), en(%d), level(%d)\n", - __func__, err, enable, - gpio_get_value(umts_modem_data.gpio_host_active)); -#endif - -exit: - return err; -} -#else -void set_host_states(struct platform_device *pdev, int type) -{ - if (active_ctl.gpio_initialized) { - pr_err(" [MODEM_IF] Active States =%d, %s\n", type, pdev->name); - gpio_direction_output(modem_link_pm_data.gpio_link_active, - type); - } else - active_ctl.gpio_request_host_active = 1; -} -#endif - |