/** * ipq806x_uart_init - initializes UART * * Initializes clocks, GPIO and UART controller. */ void uart_init(int idx) { /* Note int idx isn't used in this driver. */ void *dm_base; void *gsbi_base; dm_base = uart_board_param.uart_dm_base; if (read32(MSM_BOOT_UART_DM_CSR(dm_base)) == UART_DM_CLK_RX_TX_BIT_RATE) return; /* UART must have been already initialized. */ gsbi_base = uart_board_param.uart_gsbi_base; ipq_configure_gpio(uart_board_param.dbg_uart_gpio, NO_OF_DBG_UART_GPIOS); /* Configure the uart clock */ uart_clock_config(uart_board_param.uart_gsbi, uart_board_param.mnd_value.m_value, uart_board_param.mnd_value.n_value, uart_board_param.mnd_value.d_value, 0); write32(GSBI_CTRL_REG(gsbi_base), GSBI_PROTOCOL_CODE_I2C_UART << GSBI_CTRL_REG_PROTOCOL_CODE_S); write32(MSM_BOOT_UART_DM_CSR(dm_base), UART_DM_CLK_RX_TX_BIT_RATE); /* Intialize UART_DM */ msm_boot_uart_dm_init(dm_base); }
static void configure_uart_dm(uart_cfg_t *uart_cfg) { ipq_configure_gpio(uart_cfg->dbg_uart_gpio, NO_OF_DBG_UART_GPIOS); uart_clock_config(uart_cfg->base, uart_cfg->uart_mnd_value.m_value, uart_cfg->uart_mnd_value.n_value, uart_cfg->uart_mnd_value.d_value, gboard_param->clk_dummy); writel(GSBI_PROTOCOL_CODE_I2C_UART << GSBI_CTRL_REG_PROTOCOL_CODE_S, GSBI_CTRL_REG(uart_cfg->gsbi_base)); writel(UART_DM_CLK_RX_TX_BIT_RATE, MSM_BOOT_UART_DM_CSR(uart_cfg->uart_dm_base)); /* Intialize UART_DM */ msm_boot_uart_dm_init(uart_cfg->uart_dm_base); }
int qup_i2c_xfer(struct qup_i2c_dev *dev, struct i2c_msg msgs[], int num) { int ret; int rem = num; int err; if (dev->suspended) { return -EIO; } /* Set the GSBIn_QUP_APPS_CLK to 24MHz, then below figure out what speed to run I2C_MASTER_CORE at. */ #if !PERIPH_BLK_BLSP if (dev->clk_state == 0) { if (dev->clk_ctl == 0) { clock_config_i2c(dev->gsbi_number, dev->src_clk_freq); } } #endif /* Initialize QUP registers during first transfer */ if (dev->clk_ctl == 0) { int fs_div; int hs_div; unsigned fifo_reg; #if !PERIPH_BLK_BLSP /* Configure the GSBI Protocol Code for i2c */ writel((GSBI_PROTOCOL_CODE_I2C << GSBI_CTRL_REG_PROTOCOL_CODE_S), GSBI_CTRL_REG(dev->gsbi_base)); #endif fs_div = ((dev->src_clk_freq / dev->clk_freq) / 2) - 3; hs_div = 3; dev->clk_ctl = ((hs_div & 0x7) << 8) | (fs_div & 0xff); fifo_reg = readl(dev->qup_base + QUP_IO_MODE); if (fifo_reg & 0x3) dev->out_blk_sz = (fifo_reg & 0x3) * 16; else dev->out_blk_sz = 16; if (fifo_reg & 0x60) dev->in_blk_sz = ((fifo_reg & 0x60) >> 5) * 16; else
/* Defining functions that's exposed to outside world and in coformance to * existing uart implemention. These functions are being called to initialize * UART and print debug messages in bootloader. */ void uart_dm_init(uint8_t id, uint32_t gsbi_base, uint32_t uart_dm_base) { static uint8_t port = 0; char *data = "Android Bootloader - UART_DM Initialized!!!\n"; /* Configure the uart clock */ clock_config_uart_dm(id); dsb(); /* Configure GPIO to provide connectivity between UART block product ports and chip pads */ gpio_config_uart_dm(id); dsb(); /* Configure GSBI for UART_DM protocol. * I2C on 2 ports, UART (without HS flow control) on the other 2. * This is only on chips that have GSBI block */ if(gsbi_base) writel(GSBI_PROTOCOL_CODE_I2C_UART << GSBI_CTRL_REG_PROTOCOL_CODE_S, GSBI_CTRL_REG(gsbi_base)); dsb(); /* Configure clock selection register for tx and rx rates. * Selecting 115.2k for both RX and TX. */ writel(UART_DM_CLK_RX_TX_BIT_RATE, MSM_BOOT_UART_DM_CSR(uart_dm_base)); dsb(); /* Intialize UART_DM */ msm_boot_uart_dm_init(uart_dm_base); msm_boot_uart_dm_write(uart_dm_base, data, 44); ASSERT(port < ARRAY_SIZE(port_lookup)); port_lookup[port++] = uart_dm_base; /* Set UART init flag */ uart_init_flag = 1; }