Path: blob/master/arch/cris/arch-v32/kernel/debugport.c
15125 views
/*1* Copyright (C) 2003, Axis Communications AB.2*/34#include <linux/console.h>5#include <linux/init.h>6#include <asm/system.h>7#include <hwregs/reg_rdwr.h>8#include <hwregs/reg_map.h>9#include <hwregs/ser_defs.h>10#include <hwregs/dma_defs.h>11#include <mach/pinmux.h>1213struct dbg_port14{15unsigned char nbr;16unsigned long instance;17unsigned int started;18unsigned long baudrate;19unsigned char parity;20unsigned int bits;21};2223struct dbg_port ports[] =24{25{260,27regi_ser0,280,29115200,30'N',31832},33{341,35regi_ser1,360,37115200,38'N',39840},41{422,43regi_ser2,440,45115200,46'N',47848},49{503,51regi_ser3,520,53115200,54'N',55856},57#if CONFIG_ETRAX_SERIAL_PORTS == 558{594,60regi_ser4,610,62115200,63'N',64865},66#endif67};68static struct dbg_port *port =69#if defined(CONFIG_ETRAX_DEBUG_PORT0)70&ports[0];71#elif defined(CONFIG_ETRAX_DEBUG_PORT1)72&ports[1];73#elif defined(CONFIG_ETRAX_DEBUG_PORT2)74&ports[2];75#elif defined(CONFIG_ETRAX_DEBUG_PORT3)76&ports[3];77#elif defined(CONFIG_ETRAX_DEBUG_PORT4)78&ports[4];79#else80NULL;81#endif8283#ifdef CONFIG_ETRAX_KGDB84static struct dbg_port *kgdb_port =85#if defined(CONFIG_ETRAX_KGDB_PORT0)86&ports[0];87#elif defined(CONFIG_ETRAX_KGDB_PORT1)88&ports[1];89#elif defined(CONFIG_ETRAX_KGDB_PORT2)90&ports[2];91#elif defined(CONFIG_ETRAX_KGDB_PORT3)92&ports[3];93#elif defined(CONFIG_ETRAX_KGDB_PORT4)94&ports[4];95#else96NULL;97#endif98#endif99100static void101start_port(struct dbg_port* p)102{103if (!p)104return;105106if (p->started)107return;108p->started = 1;109110if (p->nbr == 1)111crisv32_pinmux_alloc_fixed(pinmux_ser1);112else if (p->nbr == 2)113crisv32_pinmux_alloc_fixed(pinmux_ser2);114else if (p->nbr == 3)115crisv32_pinmux_alloc_fixed(pinmux_ser3);116#if CONFIG_ETRAX_SERIAL_PORTS == 5117else if (p->nbr == 4)118crisv32_pinmux_alloc_fixed(pinmux_ser4);119#endif120121/* Set up serial port registers */122reg_ser_rw_tr_ctrl tr_ctrl = {0};123reg_ser_rw_tr_dma_en tr_dma_en = {0};124125reg_ser_rw_rec_ctrl rec_ctrl = {0};126reg_ser_rw_tr_baud_div tr_baud_div = {0};127reg_ser_rw_rec_baud_div rec_baud_div = {0};128129tr_ctrl.base_freq = rec_ctrl.base_freq = regk_ser_f29_493;130tr_dma_en.en = rec_ctrl.dma_mode = regk_ser_no;131tr_baud_div.div = rec_baud_div.div = 29493000 / p->baudrate / 8;132tr_ctrl.en = rec_ctrl.en = 1;133134if (p->parity == 'O')135{136tr_ctrl.par_en = regk_ser_yes;137tr_ctrl.par = regk_ser_odd;138rec_ctrl.par_en = regk_ser_yes;139rec_ctrl.par = regk_ser_odd;140}141else if (p->parity == 'E')142{143tr_ctrl.par_en = regk_ser_yes;144tr_ctrl.par = regk_ser_even;145rec_ctrl.par_en = regk_ser_yes;146rec_ctrl.par = regk_ser_odd;147}148149if (p->bits == 7)150{151tr_ctrl.data_bits = regk_ser_bits7;152rec_ctrl.data_bits = regk_ser_bits7;153}154155REG_WR (ser, p->instance, rw_tr_baud_div, tr_baud_div);156REG_WR (ser, p->instance, rw_rec_baud_div, rec_baud_div);157REG_WR (ser, p->instance, rw_tr_dma_en, tr_dma_en);158REG_WR (ser, p->instance, rw_tr_ctrl, tr_ctrl);159REG_WR (ser, p->instance, rw_rec_ctrl, rec_ctrl);160}161162#ifdef CONFIG_ETRAX_KGDB163/* Use polling to get a single character from the kernel debug port */164int165getDebugChar(void)166{167reg_ser_rs_stat_din stat;168reg_ser_rw_ack_intr ack_intr = { 0 };169170do {171stat = REG_RD(ser, kgdb_port->instance, rs_stat_din);172} while (!stat.dav);173174/* Ack the data_avail interrupt. */175ack_intr.dav = 1;176REG_WR(ser, kgdb_port->instance, rw_ack_intr, ack_intr);177178return stat.data;179}180181/* Use polling to put a single character to the kernel debug port */182void183putDebugChar(int val)184{185reg_ser_r_stat_din stat;186do {187stat = REG_RD(ser, kgdb_port->instance, r_stat_din);188} while (!stat.tr_rdy);189REG_WR_INT(ser, kgdb_port->instance, rw_dout, val);190}191#endif /* CONFIG_ETRAX_KGDB */192193/* Register console for printk's, etc. */194int __init195init_etrax_debug(void)196{197start_port(port);198199#ifdef CONFIG_ETRAX_KGDB200start_port(kgdb_port);201#endif /* CONFIG_ETRAX_KGDB */202return 0;203}204205206