예제 #1
0
/* This function is used by UARTS, or anything else that uses a 16x
 * oversampled clock.
 */
void
cpm_setbrg(uint brg, uint rate)
{
	volatile uint	*bp;

	/* This is good enough to get SMCs running.....
	*/
	if (brg < 4) {
		bp = cpm2_map_size(im_brgc1, 16);
	} else {
		bp = cpm2_map_size(im_brgc5, 16);
		brg -= 4;
	}
	bp += brg;
	*bp = ((BRG_UART_CLK / rate) << 1) | CPM_BRG_EN;

	cpm2_unmap(bp);
}
예제 #2
0
파일: cpm2.c 프로젝트: sserg31/sca3_main
/* This function is used by UARTS, or anything else that uses a 16x
 * oversampled clock.
 */
void
cpm_setbrg(uint brg, uint rate)
{
    u32 __iomem *bp;

    /* This is good enough to get SMCs running.....
    */
    if (brg < 4) {
        bp = cpm2_map_size(im_brgc1, 16);
    } else {
        bp = cpm2_map_size(im_brgc5, 16);
        brg -= 4;
    }
    bp += brg;
    out_be32(bp, (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN);

    cpm2_unmap(bp);
}
예제 #3
0
/* This function is used to set high speed synchronous baud rate
 * clocks.
 */
void
cpm2_fastbrg(uint brg, uint rate, int div16)
{
	volatile uint	*bp;

	if (brg < 4) {
		bp = cpm2_map_size(im_brgc1, 16);
	}
	else {
		bp = cpm2_map_size(im_brgc5, 16);
		brg -= 4;
	}
	bp += brg;
	*bp = ((BRG_INT_CLK / rate) << 1) | CPM_BRG_EN;
	if (div16)
		*bp |= CPM_BRG_DIV16;

	cpm2_unmap(bp);
}
예제 #4
0
파일: cpm2.c 프로젝트: sserg31/sca3_main
/* This function is used to set high speed synchronous baud rate
 * clocks.
 */
void
cpm2_fastbrg(uint brg, uint rate, int div16)
{
    u32 __iomem *bp;
    u32 val;

    if (brg < 4) {
        bp = cpm2_map_size(im_brgc1, 16);
    } else {
        bp = cpm2_map_size(im_brgc5, 16);
        brg -= 4;
    }
    bp += brg;
    val = ((BRG_INT_CLK / rate) << 1) | CPM_BRG_EN;
    if (div16)
        val |= CPM_BRG_DIV16;

    out_be32(bp, val);
    cpm2_unmap(bp);
}
예제 #5
0
void __cpm2_setbrg(uint brg, uint rate, uint clk, int div16, int src)
{
	u32 __iomem *bp;
	u32 val;

	if (brg < 4) {
		bp = cpm2_map_size(im_brgc1, 16);
	} else {
		bp = cpm2_map_size(im_brgc5, 16);
		brg -= 4;
	}
	bp += brg;
	
	val = (((clk * 2 / rate) - 1) & ~1) | CPM_BRG_EN | src;
	if (div16)
		val |= CPM_BRG_DIV16;

	out_be32(bp, val);
	cpm2_unmap(bp);
}
예제 #6
0
파일: cpm2.c 프로젝트: jakev/CobraDroidBeta
/* Set a baud rate generator.  This needs lots of work.  There are
 * eight BRGs, which can be connected to the CPM channels or output
 * as clocks.  The BRGs are in two different block of internal
 * memory mapped space.
 * The baud rate clock is the system clock divided by something.
 * It was set up long ago during the initial boot phase and is
 * is given to us.
 * Baud rate clocks are zero-based in the driver code (as that maps
 * to port numbers).  Documentation uses 1-based numbering.
 */
void __cpm2_setbrg(uint brg, uint rate, uint clk, int div16, int src)
{
	u32 __iomem *bp;
	u32 val;

	/* This is good enough to get SMCs running.....
	*/
	if (brg < 4) {
		bp = cpm2_map_size(im_brgc1, 16);
	} else {
		bp = cpm2_map_size(im_brgc5, 16);
		brg -= 4;
	}
	bp += brg;
	val = (((clk / rate) - 1) << 1) | CPM_BRG_EN | src;
	if (div16)
		val |= CPM_BRG_DIV16;

	out_be32(bp, val);
	cpm2_unmap(bp);
}
예제 #7
0
파일: cpm_uart_cpm2.c 프로젝트: 274914765/C
/* Setup any dynamic params in the uart desc */
int cpm_uart_init_portdesc(void)
{
#if defined(CONFIG_SERIAL_CPM_SMC1) || defined(CONFIG_SERIAL_CPM_SMC2)
    u16 *addr;
#endif
    pr_debug("CPM uart[-]:init portdesc\n");

    cpm_uart_nr = 0;
#ifdef CONFIG_SERIAL_CPM_SMC1
    cpm_uart_ports[UART_SMC1].smcp = (smc_t *) cpm2_map(im_smc[0]);
    cpm_uart_ports[UART_SMC1].port.mapbase =
        (unsigned long)cpm_uart_ports[UART_SMC1].smcp;

    cpm_uart_ports[UART_SMC1].smcup =
        (smc_uart_t *) cpm2_map_size(im_dprambase[PROFF_SMC1], PROFF_SMC_SIZE);
    addr = (u16 *)cpm2_map_size(im_dprambase[PROFF_SMC1_BASE], 2);
    *addr = PROFF_SMC1;
    cpm2_unmap(addr);

    cpm_uart_ports[UART_SMC1].smcp->smc_smcm |= (SMCM_RX | SMCM_TX);
    cpm_uart_ports[UART_SMC1].smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
    cpm_uart_ports[UART_SMC1].port.uartclk = uart_clock();
    cpm_uart_port_map[cpm_uart_nr++] = UART_SMC1;
#endif

#ifdef CONFIG_SERIAL_CPM_SMC2
    cpm_uart_ports[UART_SMC2].smcp = (smc_t *) cpm2_map(im_smc[1]);
    cpm_uart_ports[UART_SMC2].port.mapbase =
        (unsigned long)cpm_uart_ports[UART_SMC2].smcp;

    cpm_uart_ports[UART_SMC2].smcup =
        (smc_uart_t *) cpm2_map_size(im_dprambase[PROFF_SMC2], PROFF_SMC_SIZE);
    addr = (u16 *)cpm2_map_size(im_dprambase[PROFF_SMC2_BASE], 2);
    *addr = PROFF_SMC2;
    cpm2_unmap(addr);

    cpm_uart_ports[UART_SMC2].smcp->smc_smcm |= (SMCM_RX | SMCM_TX);
    cpm_uart_ports[UART_SMC2].smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
    cpm_uart_ports[UART_SMC2].port.uartclk = uart_clock();
    cpm_uart_port_map[cpm_uart_nr++] = UART_SMC2;
#endif

#ifdef CONFIG_SERIAL_CPM_SCC1
    cpm_uart_ports[UART_SCC1].sccp = (scc_t *) cpm2_map(im_scc[0]);
    cpm_uart_ports[UART_SCC1].port.mapbase =
        (unsigned long)cpm_uart_ports[UART_SCC1].sccp;
    cpm_uart_ports[UART_SCC1].sccup =
        (scc_uart_t *) cpm2_map_size(im_dprambase[PROFF_SCC1], PROFF_SCC_SIZE);

    cpm_uart_ports[UART_SCC1].sccp->scc_sccm &=
        ~(UART_SCCM_TX | UART_SCCM_RX);
    cpm_uart_ports[UART_SCC1].sccp->scc_gsmrl &=
        ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
    cpm_uart_ports[UART_SCC1].port.uartclk = uart_clock();
    cpm_uart_port_map[cpm_uart_nr++] = UART_SCC1;
#endif

#ifdef CONFIG_SERIAL_CPM_SCC2
    cpm_uart_ports[UART_SCC2].sccp = (scc_t *) cpm2_map(im_scc[1]);
    cpm_uart_ports[UART_SCC2].port.mapbase =
        (unsigned long)cpm_uart_ports[UART_SCC2].sccp;
    cpm_uart_ports[UART_SCC2].sccup =
        (scc_uart_t *) cpm2_map_size(im_dprambase[PROFF_SCC2], PROFF_SCC_SIZE);

    cpm_uart_ports[UART_SCC2].sccp->scc_sccm &=
        ~(UART_SCCM_TX | UART_SCCM_RX);
    cpm_uart_ports[UART_SCC2].sccp->scc_gsmrl &=
        ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
    cpm_uart_ports[UART_SCC2].port.uartclk = uart_clock();
    cpm_uart_port_map[cpm_uart_nr++] = UART_SCC2;
#endif

#ifdef CONFIG_SERIAL_CPM_SCC3
    cpm_uart_ports[UART_SCC3].sccp = (scc_t *) cpm2_map(im_scc[2]);
    cpm_uart_ports[UART_SCC3].port.mapbase =
        (unsigned long)cpm_uart_ports[UART_SCC3].sccp;
    cpm_uart_ports[UART_SCC3].sccup =
        (scc_uart_t *) cpm2_map_size(im_dprambase[PROFF_SCC3], PROFF_SCC_SIZE);

    cpm_uart_ports[UART_SCC3].sccp->scc_sccm &=
        ~(UART_SCCM_TX | UART_SCCM_RX);
    cpm_uart_ports[UART_SCC3].sccp->scc_gsmrl &=
        ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
    cpm_uart_ports[UART_SCC3].port.uartclk = uart_clock();
    cpm_uart_port_map[cpm_uart_nr++] = UART_SCC3;
#endif

#ifdef CONFIG_SERIAL_CPM_SCC4
    cpm_uart_ports[UART_SCC4].sccp = (scc_t *) cpm2_map(im_scc[3]);
    cpm_uart_ports[UART_SCC4].port.mapbase =
        (unsigned long)cpm_uart_ports[UART_SCC4].sccp;
    cpm_uart_ports[UART_SCC4].sccup =
        (scc_uart_t *) cpm2_map_size(im_dprambase[PROFF_SCC4], PROFF_SCC_SIZE);

    cpm_uart_ports[UART_SCC4].sccp->scc_sccm &=
        ~(UART_SCCM_TX | UART_SCCM_RX);
    cpm_uart_ports[UART_SCC4].sccp->scc_gsmrl &=
        ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
    cpm_uart_ports[UART_SCC4].port.uartclk = uart_clock();
    cpm_uart_port_map[cpm_uart_nr++] = UART_SCC4;
#endif

    return 0;
}