[U-Boot] serial_device member functions don't know their serial port

Simon Glass sjg at chromium.org
Fri May 13 02:35:39 CEST 2011


Hi,

I am taking a look at serial ports in U-Boot and it seems that the various
functions in 'struct serial_device' do not include a pointer to the device
they are talking about. Therefore for devices with multiple ports there is
no way for these functions to know what to do.

The workaround in drivers/serial/serial.c (at least for NS16550) seems to be
to declare stub functions which have the port number built in:

/* Multi serial device functions */
#define DECLARE_ESERIAL_FUNCTIONS(port) \
    int  eserial##port##_init (void) {\
int clock_divisor; \
clock_divisor = calc_divisor(serial_ports[port-1]); \
NS16550_init(serial_ports[port-1], clock_divisor); \
return(0);}\
    void eserial##port##_setbrg (void) {\
serial_setbrg_dev(port);}\
    int  eserial##port##_getc (void) {\
return serial_getc_dev(port);}\
    int  eserial##port##_tstc (void) {\
return serial_tstc_dev(port);}\
    void eserial##port##_putc (const char c) {\
serial_putc_dev(port, c);}\
    void eserial##port##_puts (const char *s) {\
serial_puts_dev(port, s);}

...
DECLARE_ESERIAL_FUNCTIONS(1);
struct serial_device eserial1_device =
INIT_ESERIAL_STRUCTURE(1,"eserial0","EUART1");
DECLARE_ESERIAL_FUNCTIONS(2);
struct serial_device eserial2_device =
INIT_ESERIAL_STRUCTURE(2,"eserial1","EUART2");

Would it not be better to pass the port number (or better the serial_device
*) to each of the functions putc(), puts(), etc? What am I missing here?

Regards,
Simon


More information about the U-Boot mailing list